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

    [C] aiuto, ricerca su file

    allora, sto tentando di fare una pila di iscritti a vari corsi in una scuola. Inserendo il corso, mi deve stampare tutti gli iscritti a quel corso, peccato che non funzioni
    Posto solo la parte importante e non tutto il sorgente, perchè è lunghetto
    codice:
    int ric_cor( const lista_ptr pila) { 
    lista_ptr temp;
    	char corso_ric[SIZE];  
    
    	printf ("Inserisci corso : "); 
    	scanf ("%s", corso_ric); 
    	
    	temp = cerca_rice(pila, corso_ric); 
    
    	if  ( temp == NULL) { 
    	       	printf("Persona non presente\n");
    	       return FALSE; 
            }	       
    	else { 
             visualizza(temp);
            return TRUE; 
    	}
    }
    
    
    
    lista_ptr  cerca_rice ( const  lista_ptr pila ,  char * corso_ric) { 
    
    while (pila != NULL) { 
              if ( strncmp(pila->persona.corso, corso_ric, SIZE) == 0){ 
              return  pila;
               }
              else cerca_rice(pila->next, corso_ric);
    
    } 
    printf(" elemento non presente\n"); // se siamo arrivati qui non c'è l'elemento nella lista 
    }
    
    void visualizza(const lista_ptr pila)
    {
         printf("\n------------------------");
         printf (" \nNome: %s\n", pila->persona.nome);
    		printf(" Cognome: %s\n", pila->persona.cognome);
    		printf(" Indirizzo: %s\n", pila->persona.indirizzo);
            printf(" Corso: %s\n", pila->persona.corso);
            printf("------------------------\n");
            visualizza(pila->next); //se inserisco questa istruzione, windows crasha, se non la inserisco, non mi stampa nulla
            
    }
    Avrei anche un altro problemino, ma quello spero di risolverlo da solo

  2. #2
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    abbax il problema che proponi in questo modo è un po' troppo astratto... tra l'altro non hai nemmeno ben specificato dov'è che hai l'errore. Da quello che leggo come commento, l'errore dovrebbe essere qui

    codice:
    void visualizza(const lista_ptr pila)
    {
         printf("\n------------------------");
         printf (" \nNome: %s\n", pila->persona.nome);
    		printf(" Cognome: %s\n", pila->persona.cognome);
    		printf(" Indirizzo: %s\n", pila->persona.indirizzo);
            printf(" Corso: %s\n", pila->persona.corso);
            printf("------------------------\n");
            visualizza(pila->next); //se inserisco questa istruzione, windows crasha, se non la inserisco, non mi stampa nulla       
    }
    e mi chiedevo se è l'unico. In ogni caso, questo credo proprio che sia dovuto al fatto che quella che hai scritto è una funzione che ricorre all'infinito perché non c'è alcun caso base. Quello che vorresti fare tu (a quanto ho capito!) è stampare tutta la lista, ma alla funzione gli devi dire che la chiamata ricorsiva la deve fare fintanto che il campo next del nodo n-esimo della lista non è NULL... altrimenti quando dovrebbe fermarsi?

    direi di aggiustare così, tanto per cominciare

    codice:
    void visualizza(const lista_ptr pila)
    {
       if ( pila ) {/* se pila non è nullo */
          printf("\n------------------------");
          printf (" \nNome: %s\n", pila->persona.nome);
          printf(" Cognome: %s\n", pila->persona.cognome);
          printf(" Indirizzo: %s\n", pila->persona.indirizzo);
          printf(" Corso: %s\n", pila->persona.corso);
          printf("------------------------\n");
          visualizza(pila->next);
       }
    }
    every day above ground is a good one

  3. #3
    Utente di HTML.it L'avatar di abbax
    Registrato dal
    Feb 2009
    Messaggi
    227
    ti ringrazio per la risposta.

    non vorrei stampare tutta la lista ma solo gli iscritti al corso... ora faccio un esempio, altimenti potrei mandarti una mail con il sorgente allegato (se vuoi... per questo te lo chiedo) perchè qui non lo posso postare, è di 600 righe circa.

    Allora, precedentemente c'è una funzione inserisci dove chiede nome cognome corso indirizzo e roba varia.
    Praticamente con la postata vorrei fare una ricerca per corso (chequindi deve arrivare in fondo al file e non fermarsi al primo risultato) e stampare tutti gli allievi trovati... quindi effettivamente ho sbagliato perchè la stampa è ricorsiva... fino all'infinito... come fare allora?

  4. #4
    Utente di HTML.it L'avatar di abbax
    Registrato dal
    Feb 2009
    Messaggi
    227
    allora... ho modificato un po' ed adesso non c'è male.
    Il problema è che se inserisco un elemento, chiudo l'eseguibile e lo riapro, se faccio la stampa me lo stampa doppio... poi dovrei fare la ricerca per corso, la quale non mi riesce... ora posto tutto il codice, la ricerca per corso è tra commenti perchè almeno è possibile provare il resto del programma, dato che in essa ci sono problemi di compilazione, anche se non capisco cosa

    codice:
    #include <stdio.h> 
    #include <stdlib.h>  
    #include <malloc.h>
    #include <string.h>
    
    #define FILE_NAME "lista.txt" 
    
    #define TRUE 1
    #define FALSE 0 
    #define SIZE 32
    #define CORSO 10
    #define MESE 12
    
     
    
    //struttura che descrive l'allievo
    struct strut_persona { 
    
    	char nome[SIZE]; 
        char cognome[SIZE]; 
    	char indirizzo[SIZE];
    	char corso[CORSO];
    	char numtel[CORSO];
    	char mese[MESE];
        char  anno[4];
    }; 
    //struttura base della lista
    struct lista { 
    
    	struct strut_persona  persona; 
    	struct lista * next; 
    };
    
    typedef  struct lista * lista_ptr; 
    
    
    FILE * file; 
    
    //dichiarazioni di funzioni
    int menu(); 
    int inserisci_persona( lista_ptr * ); 
    int elimina_persona( lista_ptr * ); 
    int  cerca( const lista_ptr ); 
    lista_ptr cerca_ric ( const lista_ptr ,  char *, char *); 
    int salva ( const lista_ptr  ); 
    int carica(  lista_ptr * ); 
    void stampa( const struct lista * ); 
    void visualizza(const lista_ptr);
    //int cerca_corso ( const lista_ptr, char *);
    
    
    int  main() { 
    
    
    	lista_ptr pila =NULL;	 
    	int scelta; 
    
    
    	carica(&pila);
    
    
    	while(1) {
    
    	scelta = menu(); 
    
    	switch(scelta) { 
    
    		case 1: 
    			inserisci_persona(&pila);
    			fflush(stdin);
    			getchar();
    			break; 
    		case 2: 
    			elimina_persona( &pila);
    			fflush(stdin);
    			getchar();
    			break; 
    		case 3: 
    			cerca( pila);
    			fflush(stdin);
                getchar(); 
    			break; 
    		case 4: 
    			stampa( pila);
                fflush(stdin); 
    			getchar();
    			break;
            /*case 5:
                 cerca_corso(pila);     
                 fflush(stdin);
                getchar(); 
    			break; */
            case 6: 
    			exit(0); 
    		default : 
    			printf("Scelta errata!!!\n\n");
                fflush(stdin); 
    			getchar();
    			break; 
    	} 
    	
    	}
    
    	return 0; 
    }
    //legge la lista gia salvata precedentemente
    int carica ( lista_ptr * pila) { 
    
    	struct strut_persona nuovo;  
    	lista_ptr temp= NULL ; 
    	file = fopen(FILE_NAME, "r");  
    	
    	/*if ( file == NULL) { 
    	       file = fopen(FILE_NAME, "w+"); 
    		fseek(file, 0, SEEK_END); 
    	}*/
    
        if(file!=NULL)
        {
    	while(!feof(file)){ 
    	    temp = ( struct lista *)malloc(sizeof(struct lista));
    		fread ( &nuovo, sizeof(struct strut_persona), 1 , file); 
    		strncpy(temp->persona.cognome,  nuovo.cognome,SIZE); 
    		strncpy(temp->persona.nome,nuovo.nome, SIZE); 	
         strncpy(temp->persona.indirizzo, nuovo.indirizzo, SIZE);
         strncpy(temp->persona.numtel, nuovo.numtel, CORSO);
         strncpy(temp->persona.corso, nuovo.corso, CORSO);
         strncpy(temp->persona.mese, nuovo.mese, MESE);
         strncpy(temp->persona.anno, nuovo.anno, 4);	
    		temp->next = *pila;
    	        *pila = temp; }fclose(file);
        }
        //else
        //printf("File non esistente");
    	
    	 
    
    	return TRUE; 
    
    }
        
        
        
        
        
        
    
    //visualizza il menu
    int  menu() { 
    
    	int scelta; 
    
        printf("\n\n----------MENU--------- \n"); 
    	printf("\nInserisci : \n"); 
    	printf("1 : per inserire persona\n"); 
    	printf("2 : per eliminare persona\n"); 
    	printf("3 : per cercare una persona\n");
    	printf("4 : stampa\n"); 
    	printf("5 : exit\n"); 
        	printf("Inserire numero della scelta: "); 	
    
    	scanf("%d", &scelta); 
    
    	return scelta; 
    }
    
    //inserisce un allievo nella lista
    int inserisci_persona( lista_ptr  *pila) { 
    
    
    	char static nome[SIZE]; 
        char static cognome[SIZE]; 
    	char static indirizzo[SIZE];
    	char static corso[CORSO];
    	char static numtel[CORSO];
    	char static mese[MESE];  
        char static anno[4];
        
        
    
    	printf("Inserisci Nome : "); 
    	scanf("%s",nome); 
    	printf("Inserisci Cognome : "); 
    	scanf("%s",cognome);
    	 printf("Inserisci Indirizzo : "); 
    	scanf("%s",indirizzo);
    	printf("Numero telefono: ");
        scanf("%s",numtel);
        printf("Corso: ");
        scanf("%s",corso);
        
        
        printf("Mese ultimo pagamento: ");
        scanf("%s",mese);
        printf("Anno ultimo pagamento: ");
        scanf("%s",anno);
        
    	// inserimento nella lista o meglio nella pila 
    	
    	if ( *pila == NULL) {
    
    		*pila = (  struct lista * ) malloc( sizeof(struct lista )); 
    		strncpy((*pila)->persona.nome, nome, SIZE);
    		strncpy( (*pila)->persona.cognome, cognome, SIZE);
         	strncpy( (*pila)->persona.indirizzo, indirizzo, SIZE);
    		strncpy( (*pila)->persona.numtel, numtel, CORSO);
    		strncpy( (*pila)->persona.corso, corso, CORSO);
    		strncpy( (*pila)->persona.mese, mese, MESE);
    		strncpy( (*pila)->persona.anno, anno, 4);
    		(*pila)->next = NULL; 
    	} 
    
    	else { 
    		struct lista static *nuovo; 
    		nuovo  = (  struct lista *  ) malloc( sizeof(struct lista )); 
    		strncpy(nuovo->persona.nome, nome, SIZE);
    		strncpy(nuovo->persona.cognome,cognome, SIZE);
    		strncpy(nuovo->persona.indirizzo, indirizzo, SIZE);
            strncpy(nuovo->persona.numtel, numtel, CORSO);
    		strncpy(nuovo->persona.corso, corso, CORSO);
    		strncpy(nuovo->persona.mese, mese, MESE);
    		strncpy( (*pila)->persona.anno, anno, 4);
    		nuovo->next = *pila; 
    		*pila = nuovo; 
    
    	}
    
    	salva(*pila); 
        
    	return TRUE; 
    
    }
    
    
    //stampa la lista degli allievi con indirizzo numtel e corso
    
    void stampa(  const  struct lista * pila ) { 
    
    	
    	while ( pila != NULL)
    	{
     
             
    		printf (" Nome: %s\n", pila->persona.nome);
    		printf(" Cognome: %s\n", pila->persona.cognome);
    		printf(" Indirizzo: %s\n", pila->persona.indirizzo);
            printf(" Corso: %s\n", pila->persona.corso);
            printf(" Numero di telefono: %s\n", pila->persona.numtel);
            pila=pila->next;
             
    	}
       
        
    }
    
    //elimina allievo	
    
    int elimina_persona( lista_ptr * pila) { 
    
    
    	char nome[SIZE];
        char cognome[SIZE]; 
    	lista_ptr temp  = NULL , temp_pre = NULL  ; 
    
    	printf ("Inserisci nome della persona da eliminare : "); 
    	scanf ("%s", nome);
        printf ("Inserisci cognome della persona da eliminare : "); 
    	scanf ("%s", cognome); 
    
    	
    		if ( (*pila == NULL) ) printf("elemento non presente "); 
    
    		// nel caso sia in testa 
    
    		if ( strcmp( (*pila)->persona.nome, nome) == 0 && strcmp( (*pila)->persona.cognome, cognome) == 0 ) { 
    		temp = *pila; 
           		(*pila) =  (*pila)->next; 
    		free(temp);
    
    		return TRUE; 	
    		}
    	
    		
    		temp = *pila; // variabile di appoggio per scorrere la lista 
    
    		while (  temp  != NULL)  {  
    			
    			if ( strcmp( (*pila)->persona.nome, nome) == 0 && strcmp( (*pila)->persona.cognome, cognome) == 0 ) {  
    				temp_pre->next = temp->next; 
    				free(temp); 
    
    				return TRUE; 
    			}	
    
    			temp_pre = temp; 
    			temp = temp->next;
    
    		} 
    
    	salva(*pila); 
    
    	return FALSE;
    }
    
    
    //richiede dati della persona da cercare e lancia la ricerca nella lista
    int cerca ( const lista_ptr pila) { 
    
    	char nome[SIZE],cognome[SIZE]; 
    	lista_ptr risultato; 
    
    	printf ("Inserisci nome : "); 
    	scanf ("%s", nome); 
    	printf ("Inserisci cognome : "); 
    	scanf ("%s", cognome);
    
    	risultato = cerca_ric(pila, nome, cognome); 
    
    	if  ( risultato == NULL) { 
    	       	printf("Persona non presente\n");
    	       return FALSE; 
            }	       
    	else { 
             visualizza(risultato); 
    		return TRUE; 
    	}
    }	
    //visualizza la persona trovata
    void visualizza(const lista_ptr pila)
    {
         printf("\n------------------------");
         printf (" \nNome: %s\n", pila->persona.nome);
    		printf(" Cognome: %s\n", pila->persona.cognome);
    		printf(" Indirizzo: %s\n", pila->persona.indirizzo);
            printf(" Corso: %s\n", pila->persona.corso);
            printf("------------------------\n");
            
    }
    //scorre la lista e cerca allievi prendendo in entrata nom e cognome dalla funz. prec.
    lista_ptr  cerca_ric ( const  lista_ptr pila ,  char * nome, char * cognome) { 
    	
    	if ( pila == NULL) return 0; 
    	if (  strcmp (pila->persona.nome, nome) == 0 && strcmp (pila->persona.cognome, cognome) == 0 ) return pila; 
    	else cerca_ric(pila->next, nome, cognome); 
    
    }
    
    
       
    
    
    
    
    
    
    
    //salva la lista su file
    int salva ( const lista_ptr pila ) { 
    
    	lista_ptr temp = pila ; 
    	struct strut_persona app; 
    	file = fopen ( FILE_NAME,"w+");
    	
    
    	while (temp != NULL) { 
    	 strncpy(app.nome, temp->persona.nome, SIZE); 
     	 strncpy(app.cognome, temp->persona.cognome, SIZE); 
     	 strncpy(app.indirizzo, temp->persona.indirizzo, SIZE);
         strncpy(app.numtel, temp->persona.numtel, CORSO);
         strncpy(app.corso, temp->persona.corso, CORSO);
         strncpy(app.mese, temp->persona.mese, MESE);
         strncpy(app.anno, temp->persona.anno, 4);
    	fwrite( &app, sizeof(struct strut_persona), 1, file); 
    	temp= temp->next; 
    	} 
    
    	fclose(file);
    	return TRUE; 
    }
    
    //CERCA PER CORSO
    
    /*int cerca_corso ( const  lista_ptr pila, char * corso) { 
    
    	char corso[SIZE]; 
    
    
    	printf ("Inserisci corso : "); 
    	scanf ("%s", corso); 
    
    
    	while ( pila != NULL)
    	{
    	if ( strcmp (pila->persona.corso, corso) == 0){
    	    printf (" Nome: %s\n", pila->persona.nome);
    		printf(" Cognome: %s\n", pila->persona.cognome);
    		printf(" Indirizzo: %s\n", pila->persona.indirizzo);
            printf(" Corso: %s\n", pila->persona.corso);
            printf(" Numero di telefono: %s\n", pila->persona.numtel);
            pila=pila->next;}
         
    	else  pila=pila->next; 
    
    
    }	*/

  5. #5
    Utente di HTML.it L'avatar di abbax
    Registrato dal
    Feb 2009
    Messaggi
    227
    ops... m'è venuto un post doppio

  6. #6
    Utente di HTML.it L'avatar di abbax
    Registrato dal
    Feb 2009
    Messaggi
    227
    mando un altro mess, sennò non entrava quello che volevo scrivere... il codice è finito lì comunque.
    Allora: non credo ci sia bisogno di guardare il cerca per nome, l'eliminazione e la stampa 8non credo ci siano errori lì)... il problema credo sia nella funzione carica... o la salva... ma non so quale.
    Quella tra commenti giù in fondo è la ricerca per corso che dovrebbe fare questo:

    inserire un corso (ad esempio chitarra) e come
    risultato dovrei avere i dati di tutti i frequentanti al corso di chitarra.
    Ad esempio se scivo

    Nome: Antonio
    Cognome: Verdi
    Corso: chitarra
    Nome: Giuseppe
    Cognome: Rossi Non ho scritto tutti i dati... manca numero, indirizzo eccetera
    Corso: sassofono
    Nome: Mario
    Cognome: Rossi
    Corso: chitarra
    Mandando la ricerca per corso e scrivendo chitarra dovrebbe restituire
    Antonio verdi e Mario Rossi e tutti gli altri dati che sono stati immessi.

    Vi prego, sono nelle vostre mani...

  7. #7
    Utente di HTML.it L'avatar di abbax
    Registrato dal
    Feb 2009
    Messaggi
    227
    vabè... nessuno mi ha risposto, fortunatamente ho finito da solo... adesso faccio una domanda semplice a cui vi prego di rispondere: su 2 xp il programma va a meraviglia... su un vista crasha in una funzione... qualcuno sa dirmi perchè?

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Nessuno ti rispondera' a questa domanda ... di quale funzione stai parlando? Con quale codice?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  9. #9
    Utente di HTML.it L'avatar di abbax
    Registrato dal
    Feb 2009
    Messaggi
    227
    è una che sopra non c'è... eccola qui

    codice:
    int cerca_corso(const lista_ptr pila){
        
        char corso[SIZE]; 
        lista_ptr p=NULL; 
       
        int i=0;
        printf ("Inserisci corso : "); 
    	scanf ("%s", corso);
    	
        if(pila==NULL){
        printf("\nNessun iscritto alla scuola!!!");
        return 0;  }
    
    	else{
            for(p=pila;p!=NULL;p=p->next)
            {
              if(strcmp(p->persona.corso, corso)==0) { 
                   visualizza(p);              
        i++;}
    }}
        if(i==0)
                  printf("\n\nNon ci sono iscritti al corso %s", corso);
                  else
                  printf("\n\nIscritti al corso di %s: %d",corso,i);
                  return TRUE;
                  }

  10. #10
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Io riesco a compilare e ad eseguire senza problemi anche su Slackware... magie di Vista o di abbax?
    every day above ground is a good one

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 © 2025 vBulletin Solutions, Inc. All rights reserved.