Lettura da file con allocazione in una lista

di il
36 risposte

36 Risposte - Pagina 3

  • Re: Lettura da file con allocazione in una lista

    Prova un pò.
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    
    struct articolo
    { 
    	char nome[20];
        int q;
    	struct articolo *next;
    }; 
    
    typedef struct articolo nodo;
    
    
    char menu();
    nodo *cons(nodo *start);
    void stampa(nodo *start);
    
    int main(int argc, char **argv)
    {
    	char sc = '\0';
    
    	nodo *start = NULL; 
    
    	while(sc!='q')
    	{
    		sc=menu();
    		switch(sc)
    		{
    			case 'a': start=cons(start);   break;
    			case 'd': break;
    			case 's': stampa(start);    break;
    			case 't': break;
    			case 'p': break;
    			case 'i': break;
    			case 'l': break;
    			case 'w': break;
    		}
    	}
    	return 0;
    }
    
    
    
    char menu()
    {
    	char sc = '\0';
        printf("A)dd, D)elete, S)tampa, T)rova, P)relievo, I)nserisci, L)oad, W)rite, Q)uit.\n"); 
    	scanf(" %c", &sc); 
    	return sc;
    }
    
    nodo *cons(nodo *start)
    {
    	char nom_prod[20]; 
    	int quant;  
    	nodo *nuovo;
        
    	printf("Inserisci nome articolo:\t");
    	scanf(" %s", nom_prod);
    
    
    	nuovo=(nodo *)malloc(sizeof(nodo));
    	if(nuovo != NULL)
    	{
    		nuovo->next=start;
    
    		printf("Inserisci la quantità: ");
    		scanf(" %d", &quant);
    
    		strcpy(nuovo->nome,nom_prod);
    		nuovo->q=quant;
    		return nuovo;
    	}
    	return start;
    }
    
    void stampa(nodo *start)
    {
    	while(start!=NULL)
        {
           printf("%s - %d\n", start->nome, start->q); 
    	   start=start->next;
    	} 
    }
    
  • Re: Lettura da file con allocazione in una lista

    skynet ha scritto:


    prova un pò.
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    
    struct articolo
    { 
    	char nome[20];
        int q;
    	struct articolo *next;
    }; 
    
    typedef struct articolo nodo;
    
    
    char menu();
    nodo *cons(nodo *start);
    void stampa(nodo *start);
    
    int main(int argc, char **argv)
    {
    	char sc = '\0';
    
    	nodo *start = NULL; 
    
    	while(sc!='q')
    	{
    		sc=menu();
    		switch(sc)
    		{
    			case 'a': start=cons(start);   break;
    			case 'd': break;
    			case 's': stampa(start);    break;
    			case 't': break;
    			case 'p': break;
    			case 'i': break;
    			case 'l': break;
    			case 'w': break;
    		}
    	}
    	return 0;
    }
    
    
    
    char menu()
    {
    	char sc = '\0';
        printf("A)dd, D)elete, S)tampa, T)rova, P)relievo, I)nserisci, L)oad, W)rite, Q)uit.\n"); 
    	scanf(" %c", &sc); 
    	return sc;
    }
    
    nodo *cons(nodo *start)
    {
    	char nom_prod[20]; 
    	int quant;  
    	nodo *nuovo;
        
    	printf("Inserisci nome articolo:\t");
    	scanf(" %s", nom_prod);
    
    
    	nuovo=(nodo *)malloc(sizeof(nodo));
    	if(nuovo != NULL)
    	{
    		nuovo->next=start;
    
    		printf("Inserisci la quantità: ");
    		scanf(" %d", &quant);
    
    		strcpy(nuovo->nome,nom_prod);
    		nuovo->q=quant;
    		return nuovo;
    	}
    	return start;
    }
    
    void stampa(nodo *start)
    {
    	while(start!=NULL)
        {
           printf("%s - %d\n", start->nome, start->q); 
    	   start=start->next;
    	} 
    }
    
    E' perfettissimo!!!!!!! Sei un genio!!!!!
    Potresti farmi anche le altre funzioni??? Così mi baso sul tuo e posso crearne un altro e togliermi tutti i dubbi che ho.
    Ah, ci sarebbe pure che dopo ogni operazione, il programma aggiorna i valori del numero di tipi di ricambi e il numero complessivo di pezzi.
    Es.: tipi di ricambi: 4, totale ricambi:10.


    Grazie, anzi un super grazie!!!!!!!!!!!!!!!!!!!!!!!!!
  • Re: Lettura da file con allocazione in una lista

    Io ti ho dato un esempio per capire dov'è che sbagli, il resto lo devi fare tu.
  • Re: Lettura da file con allocazione in una lista

    Il problema è che tra 3 giorni ho un esame e devo almeno avere una copia esatta di questo programmma.


    Ho riscritto tutto.
    Potresti correggerlo?
    E' pieno di errori e in questo momento, dato che sono sotto esami, ho la testa che non mi funziona più, non riesco a raggionare bene!
    Aiutami ti prego!!!!!!!!!!!
    Grazie!

    Ecco il codice:
    
     #include <stdio.h>
     #include <stdlib.h>
     #include <string.h>
    
     struct articolo{ char nome[20];
    		  int q;
    		  struct articolo *next;};  
    
     typedef struct articolo nodo; 
     char menu();
     nodo *cons(nodo *start);
     void stampa(nodo *start);
     nodo *trova(nodo *start);
     nodo *delete(nodo *start);
     nodo *inserisci_preleva(nodo *start);
     nodo *prod_work(nodo *start);
     void scrivi(nodo *start);
     nodo *leggi(nodo *start);
    
    
     main(int argc, char **argv) 
     { char sc='\0'; 
       char prod='\0';
    
       nodo *start=NULL;
    
      while(sc!='q')
      	{sc=menu();
      	switch(sc){
    		case 'a': start=cons(start);			break;
    		case 'd': delete(start);			break;
    		case 's': stampa(start); 			break;
    		case 't': trova(start);				break;
    		case 'p': start=inserisci_preleva(start);	break;
    		case 'l': start=leggi(start);			break;
    		case 'w': scrivi(start);			break;
    		case 'q': exit (0); 				break;
    		}
    	}
     return 0;
     }
    
    
    
     char menu()
    	{char sc='\0';
    	 printf("A)dd, D)elete, S)tampa, T)rova, P)releva o inserisci, L)oad, W)rite, Q)uit.\n"); scanf("%c", &sc); 
    	 return  sc; 
    	}
    
     nodo *cons(nodo *start) 
    	{char nom_prod[20];
    	 int quant;
    	 nodo *start2; 
    	
    	printf("Inserisci nome prodotto:\t");
    	scanf(" %s", nom_prod);
    
    	start2=(nodo *)malloc(sizeof(nodo));
    	
    	if(start2!=NULL)
    		{ start2->next=start; 
    		  printf("Inserisci la quantità:\t");
    		  scanf(" %d", &quant); 
    		  
    		  start2->q=quant;
    		  strcpy(start2->nome, nom_prod);   
    	
    		  return (start2);
    		}
    	 return (start); 
    	}
    
     void stampa(nodo *start)
    	{while(start!=NULL)
    		{ printf("%s\t%d\n ", start->nome, start->q);
    		  start=start->next;
    		}  
    		  printf("\n");
    	}
    
     nodo *trova(nodo *start)
    	{char prod[20];
    	 printf("Inserisci il nome dell'articolo che cerchi:\t");
    	 scanf(" %s", prod);
     		if(start->nome!=NULL)
    					{while(start->nome!=prod)
    							{start=start->next;
    							}
    					return start;
    					}
    
    	printf("L'articolo da te cercato è: %s %d\n", start->nome, start->q);
    	return start;
    	} 
    
    
     nodo *prod_work(nodo *start)
    	{ char prod='\0';
    	  printf("Inserisci il nome dell'articolo:");
    	  scanf("%s", prod);
    	  return prod;
    	}
     
     nodo *delete(nodo *start)
    	{int num_del;
    	 char prod='\0';
    	 
    	 prod=prod_work(start);
     	 while(start->next->nome!=prod)
    		{start=start->next;
    		}	 
    	 start->next=start->next->next; 
    	 printf("Il numero è stato correttamente eliminato\n"); 
    	}	
    
     nodo *inserisci_preleva(nodo *start)
    	{int pezzi_add, pezzi_sub;
    	 char sc='\0';
    	 char prod='\0';
    
    	 prod=prod_work(start);
    	 while(start->nome!=prod)
    				{start=start->next;
    				}  
    	 printf("vuoi A)ggiungere o E)liminare pezzi? ");
    	 scanf("%c", &sc);	
    		switch(sc)
    			{case 'a': printf("QUanti pezzi vuoi aggiungere?");
    			scanf("%d", &pezzi_add); start->q=start->q+pezzi_add; 		 break; 
    
    			 case 'e': if(start->q >0)
    						{printf("Quanti pezzi vuoi sottrarre?");
    						 scanf("%d", &pezzi_sub); start->q=start->q-pezzi_sub;
    						}
    						else{printf("Non ci sono pezzi disponibili\n"); break;
    						    }
    
    	 return (start);
    	}
    	
     void scrivi(nodo *start)
    	{FILE *pf; 
    	pf=fopen("numeri.txt", "w");
    	if(pf)
    		{while(start!=NULL)
    				{fprintf(pf, "%s\t %d\n", start->nome, start->q);
    				 start=start->next;
    				}
    		fclose(pf);
    		}	
    	else{printf("Non è stato possibile scrivere il file");
    	    }
     	}
    
     nodo *leggi (nodo *start)
    	{char nom_prod2[20];
    	 int quant2;
    	 nodo *tmp;
    
    	 tmp=(nodo *)malloc(sizeof(nodo));
     	
    	 FILE *pf;
    	 pf=fopen("numeri.txt", "r");
    	 if(pf)
    		{ while(!feof(pf))
    				{fscanf(pf, "%s\t %d", nom_prod2, &quant2);
    				 tmp->q=quant2;
    				 strcpy(tmp->nome, nom_prod2);
    				 tmp=tmp->next;
    				}
    		 fclose(pf);
    	  	 return tmp;
    
    		} 
    	 else{
    		printf("Errore lettura file\n");
    	     }
    	return tmp;
    	}  
    
  • Re: Lettura da file con allocazione in una lista

    Grazie alle vostre direttive sono riuscito a scrivere tutto il codice tranne due funzioni fondamentali:
    1)la funzione cancella funziona con tutti trannne con il primo elemento della lista(infatti ho creato un nuovo nodo, ma non funziona lo stesso);
    2)la funzione leggi.


    Ecco il codice:
    
        #include <stdio.h>
        #include <stdlib.h>
        #include <string.h>
    
    
        struct articolo
        {
           char nome[20];
            int q;
           struct articolo *next;
        };
    
        typedef struct articolo nodo;
    
    
        char menu();
        nodo *cons(nodo *start);
        void stampa(nodo *start);
        void trova(nodo *start);
        void deposita(nodo *start);
        void prelieva(nodo *start);
        nodo *cancella(nodo *start);
        void scrivi(nodo *start);
    
        int main(int argc, char **argv)
        {
           char sc = '\0';
    
           nodo *start = NULL;
    
           while(sc!='q')
           {
              sc=menu();
              switch(sc)
              {
                 case 'a': start=cons(start);   break;
                 case 'd': cancella(start);	break;
                 case 's': stampa(start);    break;
                 case 't': trova(start);	break;
                 case 'p': prelieva(start);	break;
                 case 'i': deposita(start);	break;
                 case 'l': break;
                 case 'w': scrivi(start);	break;
              }
           }
           return 0;
        }
    
    
    
        char menu()
        {
           char sc = '\0';
            printf("A)dd, D)elete, S)tampa, T)rova, P)relievo, I)nserisci, L)oad, W)rite, Q)uit.\n");
           scanf(" %c", &sc);
           return sc;
        }
    
        nodo *cons(nodo *start)
        {
           char nom_prod[20];
           int quant; 
           nodo *nuovo;
           
           printf("Inserisci nome articolo:\t");
           scanf(" %s", nom_prod);
    
    
           nuovo=(nodo *)malloc(sizeof(nodo));
           if(nuovo != NULL)
           {
              nuovo->next=start;
    
              printf("Inserisci la quantità: ");
              scanf(" %d", &quant);
    
              strcpy(nuovo->nome,nom_prod);
              nuovo->q=quant;
              return nuovo;
           }
           return start;
        }
    
        void stampa(nodo *start)
        {
           while(start!=NULL)
            {
               printf("%s - %d\n", start->nome, start->q);
              start=start->next;
           }
    	printf("\n");
        }
    
    
        void trova(nodo *start)
        {
    	char parola[20];
    	printf("Quale oggetto vuoi ricercare?\t");
    	scanf("%s", parola);
          
            while( strcmp (parola, start->nome) !=0)
    	 {
    		start=start->next;
    	 }
    
             printf("%s\t %d\n", start->nome, start->q); printf("\n");
        }
    
     void deposita(nodo *start)
        {
    	char parola[20];
    	int pezzi;
    
    	printf("Quale oggetto vuoi ricercare?\t");
    	scanf("%s", parola);
          
            while( strcmp (parola, start->nome) !=0)
    	 {
    		start=start->next;
    	 }
    	printf("Quanti pezzi devo aggiungere?\t");
    	scanf("%d", &pezzi);
    	start->q=start->q + pezzi;
             printf("%s\t %d\n", start->nome, start->q); printf("\n");
        }
    
    
     void prelieva(nodo *start)
        {
    	char parola[20];
    	int pezzi;
    
    	printf("Quale oggetto vuoi ricercare?\t");
    	scanf("%s", parola);
          
            while( strcmp (parola, start->nome) !=0)
    	 {
    		start=start->next;
    	 }
    	printf("Quanti pezzi devo prelevare?\t");
    	scanf("%d", &pezzi);
    	if((start->q - pezzi) >= 0)
    	  {
    	start->q=start->q - pezzi;
            printf("%s\t %d\n", start->nome, start->q); printf("\n");
    	   }else{
    	         printf("Non puoi sottrarre %d pezzi, perchè in magazzino sono presenti solo %d pezzi\n", pezzi, start->q);
    		 printf("\n");
    	        }
        }
    
    
     nodo *cancella(nodo *start)
        {
    	char parola[20]; nodo *nuovo2;
    	printf("Quale oggetto vuoi eliminare?\t");
    	scanf("%s", parola);
    
    	nuovo2=(nodo *)malloc(sizeof(nodo));        
    	nuovo2->next=start;
    
            while( strcmp (parola, nuovo2->next->nome) !=0)
    	 {
    		nuovo2=nuovo2->next;
    	 }
    	nuovo2->next=nuovo2->next->next;
    	printf("L'oggetto da te richiesto (%s) è stato correttamente ELIMINATO\n", parola);
    	printf("\n");
    
    	return start;
        }
    
    
     void scrivi(nodo *start)
        {
    	FILE *pf;
    	pf=fopen("numeri.txt", "w");
    	 
    	if(pf)
    	   {
    		while(start!=NULL)
    		   {
    			fprintf(pf, "%s\t %d\n", start->nome, start->q);
    			start=start->next;
    		   }
    	fclose(pf);
    	printf("Il file è stato scritto correttamente\n"); printf("\n");
    	   }else
    	    {
    		printf("Non è stato possibile scrivere il file\n");} 
    	}
    
  • Re: Lettura da file con allocazione in una lista

    
    void stampa(nodo *start)
        {
           nodo * ptr = start;
           while(ptr!=NULL)
            {
               printf("%s - %d\n", ptr->nome, ptr->q);
              ptr=ptr->next;
           }
       printf("\n");
        }
    
    Controlla prima la funzione stampa. Così perdi la testa della lista. devi prima salvare il puntatore e lavorare su quello.
  • Re: Lettura da file con allocazione in una lista

    Ok,
    adesso spero di aver ben capito.
    Mi manca solo la funzione LEGGI da file, che non capisco il perchè ma continua a non funzionare!

    Potreste scrivermela???


    Grazie, davvero non so come ringraziarvi!
Devi accedere o registrarti per scrivere nel forum
36 risposte