Pagina 1 di 4 1 2 3 ... ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 36
  1. #1
    Utente di HTML.it L'avatar di abbax
    Registrato dal
    Feb 2009
    Messaggi
    227

    [C] Stampa elementi con determinate caratteristiche

    Salve a tutti, ho un problemino.
    Sto cercando di fare un database di una scuola di musica (linguaggio c).
    Nel menù ci deve essere una funzione che consenta di inserire uno strumento e che restituisca tutti gli iscritti a quel determinato strumento.
    Esempio:
    Pincopallino - Clarinetto
    Tizio - Flauto
    Caio - Clarinetto
    Mario - Sassofono

    Inserendo clarinetto la funzione deve restituire Pincopallino e Caio.
    Altra cosa: la gestione è con salvataggio e lettura su file.
    Ho iniziato a fare il codice ma mi sono bloccato miseramente perchè non saprei come andare avanti.
    Il poco che ho fatto (di questa funzione):
    codice:
    struct pers {
           char nome[DIM],cognome[DIM], cors[DIM];
           char ind[31];
           char numTel[MAX_TEL];
           };
    ....
    ....
    ....
    ....
    /*5.Cerca per corso, 
    stampa tutti gli iscritti che frequentano un determinato corso*/
    int cerCor(void){
        char pausa;
        char cors[DIM];
        int n;
    printf("\n\n------RICERCA PER CORSO------");
    fp= fopen("lista.txt", "r");
    printf("\n Inserire corso");
    gets(cors);
    for (;;){
    n = fread(&lista, sizeof(struct pers), 1, fp);
    //praticamente l'ho letto e basta
    grazie in anticipo.

  2. #2
    Utente di HTML.it L'avatar di abbax
    Registrato dal
    Feb 2009
    Messaggi
    227
    Scusate... nello stesso programma ho un altro problema. Quando inserisco un nuovo iscritto non mi fa mettere il nome.
    ho
    nome:
    cognome:
    Mi salta direttamente al cognome... perchè?
    codice:
    int insPer (void)
    {
        struct pagamenti *p;
        int invio;
        printf("\n\n------INSERIMENTO PERSONA------");
        fp = fopen("lista.txt", "a+");
        printf("\n\n\t\t---------INSERIMENTO---------");
        printf("\n\n\t Nome:  ");
        gets(lista.nome);
        printf("\n\t Cognome:  ");
        gets (lista.cognome);
        printf("\n\t Indirizzo: ");
        gets(lista.ind);
        printf("\n\t Numero telefono: ");
        gets(lista.numTel);
        printf("\n \t Corso: %s", lista.cors);
        gets(lista.cors);
        scanf("%c",&invio);
        fwrite(&lista, sizeof(struct pers), 1, fp);

  3. #3
    Utente di HTML.it L'avatar di abbax
    Registrato dal
    Feb 2009
    Messaggi
    227
    niente niente?

  4. #4
    Utente di HTML.it L'avatar di abbax
    Registrato dal
    Feb 2009
    Messaggi
    227
    l'inserimento l'ho risolto... l'altro no
    ma non c'è nessuno che sa fare questo? almeno una rispostina... non credevo fosse una cosa tanto infattibile

  5. #5
    Utente di HTML.it L'avatar di abbax
    Registrato dal
    Feb 2009
    Messaggi
    227
    Ho fatto una ricerca per nome... però non funziona, visualizza sempre il primo contatto:
    codice:
    //2. ricerca per nome
    
    int cerNom(void)
    {
         char nome[DIM],cognome[DIM],pausa;
         long pos;
         
         printf("\n\t\t\t-------CERCA--------");
         printf("\n\tNome: ");
          scanf("%s",&lista.nome);
         printf("\n\tCognome: ");
          scanf("%s",&lista.cognome);
         scanf("%c", &pausa);
         
         pos==cerPer(cognome, nome);
         if(pos==-1){
                     printf("\nLa persona cercata non è nella scuola");
                     scanf("%c", &pausa);
                     //return(0);
                     }
         else{
        
         printf("\n----------------------------");
         printf("\nCognome: %s",lista.cognome);
         printf("\nNome: %s",lista.nome);
         printf("\nIndirizzo: %s",lista.ind);
         printf("\nNumero di telefono: %s",lista.numTel);
         printf("\n----------------------------");
              scanf("%c",&pausa);
              }}
    
    //scansione elenco per cercare nomi
    long cerPer(char *cg, char *nm)
    {
        int n;
        long pos;
        
        fp= fopen("lista.txt","r");
        
        for( ; ; ){
             n=fread(&lista, sizeof(struct pers), 1,fp);
             if(n==0){
                      fclose(fp);
                      pos=-1;
                      return(pos);
                      }
             else{
                  if(strcmp(cg, lista.cognome))
                     if(strcmp(nm, lista.nome))
                                   pos=ftell(fp);
                                   fclose(fp);
                                   return(pos-sizeof(struct pers));
                                   }
                                   }
                                   }
    Dove sbaglio?

  6. #6
    Cerca di ridurre ai minimi termini il tuo problema e di postare codice compilabile. In questo modo la probabilità che qualcuno si prenda la briga di provare ad aiutarti potrebbe aumentare ;-)

  7. #7
    Utente di HTML.it L'avatar di abbax
    Registrato dal
    Feb 2009
    Messaggi
    227
    Il problema è solo la ricerca adesso... solo che l'ho fatta lunghetta perchè non saprei altri modi per farla... quindi è già ridotto ai minimi termini. Per il compilabile... bè, lo potrei fare, ma sarebbe pure più lungo e tanto non funzionerebbe (nella ricerca), comunque eccolo qua:

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    #define DIM 15
    #define MAX_CORS 10
    #define MAX_TEL 10
    #define MESI 12
    #define OUT 100
    
    
    
    /*struct ind {
           char via[DIM];
           int num;
           };*/
     
    
    struct pers {
           char nome[DIM], cognome[DIM], corso[DIM];
           char ind[31];
           char numTel[MAX_TEL];
           char mese;
           int giorno, anno;
           };
    
    FILE *fp;
    struct pers lista;
    
    //Funzioni utilizzate
    int menu(void);
    int insPer(void);
    int cerNom(void);
    long cerPer(char *cg, char *nm);
    int visEl (void);
    void eliPer(long pos);
    void canPer (void);
    
    //Main, stampa il menu e lancia la funzione scelta
    
    main(){
         int scelta = 0;
         while (scelta!=OUT){
               switch(scelta){
                              case 0:
                              scelta=menu();
                              if (scelta==0)
                              scelta = OUT;
                              break;
                 case 1:
                      insPer();
                      scelta = 0;
                      break;
                 case 2:
                      cerNom();
                      scelta = 0;
                      break;
                              }
    }
    }
    
    
    // funzione che visualizza menu
    int menu(void)
    {
        int scelta, vero=1;
        char invio;
        while(vero){
                    printf("\n\n\t\t---------MENU---------");
                    printf("\n\t1. inserisci persona");
                    printf("\t\t2. cerca per nome");
                 
                    do{
                     printf("\n\n\tscegli opzione: ");
                     scanf("%d", &scelta);    }
                     
                     while(scelta>2 || scelta<0);
                      return(scelta);
                                 }
           return (0);
    }
                    
    //1. inserimento persona con salvataggio su file
    int insPer (void)
    {
        struct pagamenti *p;
        int invio;
        printf("\n\n------INSERIMENTO PERSONA------");
        fp = fopen("lista.txt", "a+");
        printf("\n\n\t\t---------INSERIMENTO---------");
        printf("\n");
        printf("\n\t Nome:  ");
        scanf("%s",&lista.nome);
        fflush(stdin);
        printf("\n\t Cognome:  ");
        scanf("%s",&lista.cognome);
        fflush(stdin);
        printf("\n\t Indirizzo: ");
        scanf("%s",&lista.ind);
        fflush(stdin);
        printf("\n\t Numero telefono: ");
        scanf("%s",&lista.numTel);
        fflush(stdin);
        printf("\n \t Corso: ");
        scanf("%s",&lista.corso);
        fflush(stdin);
        printf("\n\tGiorno ultimo pagamento: ");
        scanf("%d",&lista.giorno);
        printf("\n\tMese ultimo pagamento: ");
        scanf("%s",&lista.mese);
        printf("\n\tAnno ultimo pagamento: ");
        scanf("%d", &lista.anno);
        fwrite(&lista, sizeof(struct pers), 1, fp);
        fclose(fp);
    } 
    //2. ricerca per nome
    
    int cerNom(void)
    {
         char nome[DIM],cognome[DIM],pausa;
         long pos;
         
         printf("\n\t\t\t-------CERCA--------");
         printf("\n\tNome: ");
          scanf("%s",&lista.nome);
         printf("\n\tCognome: ");
          scanf("%s",&lista.cognome);
         scanf("%c", &pausa);
         
         pos==cerPer(cognome, nome);
         if(pos==-1){
                     printf("\nLa persona cercata non è nella scuola");
                     scanf("%c", &pausa);
                     //return(0);
                     }
         else{
        
         printf("\n----------------------------");
         printf("\nCognome: %s",lista.cognome);
         printf("\nNome: %s",lista.nome);
         printf("\nIndirizzo: %s",lista.ind);
         printf("\nNumero di telefono: %s",lista.numTel);
         printf("\nUltimo pagamento il : %d di %s del %d",lista.giorno, lista.mese, lista.anno);
         printf("\n----------------------------");
              scanf("%c",&pausa);
            //  return(0);
              }}
    //scansione elenco per cercare nomi
    long cerPer(char *cg, char *nm)
    {
        int n;
        long pos;
        
        fp= fopen("lista.txt","r");
        
        for( ; ; ){
             n=fread(&lista, sizeof(struct pers), 1,fp);
             if(n==0){
                      fclose(fp);
                      pos=-1;
                      return(pos);
                      }
             else{
                  if(strcmp(cg, lista.cognome))
                     if(strcmp(nm, lista.nome))
                                   pos=ftell(fp);
                                   fclose(fp);
                                   return(pos-sizeof(struct pers));
                                   }
                                   }
                                   }

  8. #8
    Utente di HTML.it L'avatar di abbax
    Registrato dal
    Feb 2009
    Messaggi
    227
    aga mi sono accorto che nella ricerca c'era qualche errorino, l'ho corretto ma il risultato non cambia... ora mi da pure errore

  9. #9
    forse non ho capito bene!

    Tu mantieni le persone registrate su un file, e la ricerca consiste nel vedere se le persone sono registrate e a che corso appartengono , e i criteri di ricerca sono o il nome o il corso giusto???

    Se è cosi devi caricare tutto il file in memoria, ( quindi nella tua lista), e poi devi applicare un algoritmo di ricerca , che nel caso della lista e quello di ricerca lineare, che è abbastanza scarso come prestazioni in quanto sei obbligato a scorrere tutta la lista !!!

    Io ti consiglio di usare come struttura dati un albero binario di ricerca in modo tale da poter usare l'algoritmo di ricerca binaria!

  10. #10
    Utente di HTML.it L'avatar di abbax
    Registrato dal
    Feb 2009
    Messaggi
    227
    praticamente scrivo nome e cognome e lui mi deve visualizzare tutti i dati dell'iscritto con questo nome e cognome.
    Gli alberibinari non so cosa siano... nel programma che ho postato io che errori ci sono? perchè windows mi fa chiudere l'applicazione? perchè mi visualizza sempre il primo e basta?

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.