Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Nioh 3: souls-like punitivo e Action RPG
Nioh 3: souls-like punitivo e Action RPG
Nioh 3 aggiorna la formula Team NINJA con aree esplorabili più grandi, due stili di combattimento intercambiabili al volo (Samurai e Ninja) e un sistema di progressione pieno di attività, basi nemiche e sfide legate al Crogiolo. La recensione entra nel dettaglio su combattimento, build, progressione e requisiti PC
Test in super anteprima di Navimow i220 LiDAR: il robot tagliaerba per tutti
Test in super anteprima di Navimow i220 LiDAR: il robot tagliaerba per tutti
La facilità di installazione e la completa automazione di tutte le fasi di utilizzo, rendono questo prodotto l'ideale per molti clienti. Ecco com'è andata la nostra prova in anteprima
Dark Perk Ergo e Sym provati tra wireless, software via browser e peso ridotto
Dark Perk Ergo e Sym provati tra wireless, software via browser e peso ridotto
be quiet! debutta nel settore mouse da gaming con Dark Perk Ergo e Dark Perk Sym: due modelli gemelli per specifiche, con polling rate di 8.000 Hz anche in wireless, sensore PixArt PAW3950 da 32.000 DPI e autonomia dichiarata fino a 110 ore. Nel test, a 8.000 Hz si arriva a circa 30 ore reali, con ricarica completa in un'ora e mezza
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 24-07-2011, 16:37   #1
vegetablu
Junior Member
 
Iscritto dal: Jul 2011
Messaggi: 8
Lettura da file con allocazione in una lista

Salve a tutti,
ho un problema con un programma che gestisce un magazino di ricambi. Io per adesso lo sto provando solo con interi, perchè ancora non ho assimilato bene la funzione che permette di scrivere dentro un'allocazione di memoria, una stringa. Se non sbaglio si chiama strcpy questa funzione.
Il problema per adesso sta nella lettura degli interi. Per la scrittura, ecc. ci siamo perfettamente, ma per la lettura mi da sempre un errore riguardante la segmentazione.
Potreste aiutarmi???

Io sto usando il linguaggio C su piattaforma UNIX (Linux Ubuntu).
Vi ringrazio anticipatamente.


Ecco il codice che ho scritto:
Codice:
    #include <stdio.h>
    #include <stdlib.h>
    struct articolo{ int num;
           struct articolo *next;      };   
    typedef struct articolo nodo;
    nodo *cons(nodo *start, nodo *p);
    char menu();
    void stampa(nodo *start, nodo *p);
    nodo *delete(nodo *start, nodo *p);
    nodo *leggi(nodo *start, nodo *p);
    void scrivi(nodo *start, nodo *p);

    main(int argc, char **argv)
    {
       char sc;
       nodo *start, *p, *punt;

       start=(nodo *)malloc(sizeof(nodo));

       p=start;
       p->next=NULL;
    do{
    sc=menu();
    switch(sc){
       case 'a': start=cons(start, p);       break;
       case 'd': start=delete(start, p);    break;
       case 's': stampa(start, p);       break;
       case 'l': start=leggi(start, p);         break;
       case 'w': scrivi(start, p);         break;
       case 'q': exit (0); }

    }while(sc!='q');
    }



    void stampa(nodo *start, nodo *p){
       while(start!=NULL)
       {printf("%d--> ", start->num);
        start=start->next;
                } 
       printf("\n");
                }


    nodo *cons(nodo *start, nodo *p)
       { nodo *start2;  int numero;
         start2=(nodo *)malloc(sizeof(nodo));
         printf("Inserisci numero: "); scanf("%d", &numero);
         p=start2;   
         p->num=numero;
         p->next=start ;
        return (start2);
       }


    char menu()

       {char sc; printf("A)dd, D)elete, S)tampa, L)oad, W)rite, Q)uit\n");
        scanf("%c", &sc); return (sc);   }

    nodo *delete(nodo *start, nodo *p)
       {int num_del; nodo *p2;
        printf("Inserisci il numero che vuoi eliminare:");
        scanf("%d", &num_del);
        p2=start;
           while(p2->next->num!=num_del)
           {p2=p2->next;}
           p2->next=p2->next->next;   
       return (start); 
                         }
    nodo *leggi(nodo *start, nodo *p)
       {FILE *pf;
        pf=fopen("numeri.txt", "r");
        nodo *start3;
        start3=(nodo *)malloc(sizeof(nodo));
        p=start3;

        if(pf)
          {while(!feof(pf))
             {fscanf(pf, "%d\t", &p->num); p=p->next;}
           fclose(pf);
          }else{printf("Errore nella lettura del file\n");}
       p->next=start;
       return(start3);   }

    void scrivi(nodo *start, nodo *p)
       {FILE *pf;
        pf=fopen("numeri.txt", "w");
        if(pf)
          {while(start!=NULL)
             {fprintf(pf, "%d\t", start->num); start=start->next;}
          fclose(pf);
          }else{printf("Non è stato possibile scrivere il file\n");}
       }
vegetablu è offline   Rispondi citando il messaggio o parte di esso
Old 24-07-2011, 20:36   #2
Gimli[2BV!2B]
Senior Member
 
L'Avatar di Gimli[2BV!2B]
 
Iscritto dal: Feb 2006
Città: Parma
Messaggi: 3010
In nodo *leggi(nodo *start, nodo *p) leggi tutto il file, ma allochi una sola struttura nodo.
Già il primo p=p->next ti porta un un punto qualsiasi della memoria (p->next non è inizializzato, dovrebbe puntare ad una nuova struttura allocata).

Anche nel delete vedo vari problemi:
  • salti il test sul primo elemento
  • non liberi la memoria (con free) -> memory leak
  • pronto al botto se il numero non c'è!

Mi sfugge cosa vuoi fare con gli argomenti che passi alle funzioni, visto che spesso li sovrascrivi ed altre volte non li usi.

Per finire ti consiglio vivamente di scegliere uno stile di indentazione e di mantenerlo per tutto il codice: quelle graffe buttate a caso sono fonte di errore e terribili da rintracciare nella lettura.
__________________
~Breve riferimento ai comandi GNU/Linux (ormai non molto breve...)
Gimli[2BV!2B] è offline   Rispondi citando il messaggio o parte di esso
Old 25-07-2011, 00:11   #3
vegetablu
Junior Member
 
Iscritto dal: Jul 2011
Messaggi: 8
Quote:
Originariamente inviato da Gimli[2BV!2B] Guarda i messaggi
In nodo *leggi(nodo *start, nodo *p) leggi tutto il file, ma allochi una sola struttura nodo.
Già il primo p=p->next ti porta un un punto qualsiasi della memoria (p->next non è inizializzato, dovrebbe puntare ad una nuova struttura allocata).

Anche nel delete vedo vari problemi:
  • salti il test sul primo elemento
  • non liberi la memoria (con free) -> memory leak
  • pronto al botto se il numero non c'è!

Mi sfugge cosa vuoi fare con gli argomenti che passi alle funzioni, visto che spesso li sovrascrivi ed altre volte non li usi.

Per finire ti consiglio vivamente di scegliere uno stile di indentazione e di mantenerlo per tutto il codice: quelle graffe buttate a caso sono fonte di errore e terribili da rintracciare nella lettura.
Ciao, perdonami ma è da poco che programmo con il C.
Adesso ti spiego meglio cosa devo fare. Si lo so che non ci sono controlli, ma momentaneamente non mi preoccupo, perchè il mio problema è altro e quindi quello è l'ultimo pensiero.

Ecco il codice più fluido, ma con sempre i problemi.
I problemi sono:
1) non so come si fa ad inserire un nome\stringa in un'allocazione di memoria;
2) non riesco a far leggere da file;
3) quando stampo, mi stampa sempre lo zero alla fine.
4) nella funzione delete mi elimina tutto tranne l'ultimo numero inserito.

Il testo di tutto l'esercizio vuole che io gestica un magazzino, la struttura deve contenere solo una stringa di char che indica il nome, e un int che indica la quantità dei pezzi. Ci devono essere le funzioni aggiungi pezzo, aggiorna le quantità del pezzo(preleva o aggiungi pezzo), cerca, elimina, stampa, rimuovi tutto, carica da file, salva su file. Dopo ogni operazione che faccio deve aggiornare i valori relativi al numero di tipi di ricambi e al numero complessivo di pezzi presenti.


Esempio:
A)ggiungi, C)erca, E)limina, R)imuovi tutto, P)releva, D)eposita, C)arica, S)crivi, E)sci.
p
Quale tipo di ricambio vuoi prelevare? Ruota
numero dei pezzi disponibili: 15
quanti pezzi vuoi prelevare? 3

Codice:
#include <stdio.h>
#include <stdlib.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(nodo *start);

main(int argc, char **argv)
{char sc;

nodo *start;
start=(nodo *)malloc(sizeof(nodo));

 /*
start->next=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': break;
        case 'i': start=inserisci(start); break;
        case 'l': break;
        case 'w': break;
        case 'q': exit (0); break;
        }}
}



char menu()
        {char sc;
         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; int quant;  nodo *start2;
         start2=(nodo *)malloc(sizeof(nodo));
         start2->next=start;
/*      printf("Inserisci Nome prodotto: ");
        scanf("%s", nom_prod);                   */
        printf("Inserisci la quantità: ");
        scanf("%d", &quant);
         start2->q=quant;

/*       strcpy(start2->nome, nom_prod);  */

         return (start2);
        }

void stampa(nodo *start)
        {while(start!=NULL)
                {/* printf("%s", start->nome); */
                 printf("%d ", start->q); start=start->next;}
        printf("\n");
        }

nodo *trova(nodo *start)
        {int numero;
         printf("Inserisci il numero che cerchi: ");
         scanf("%d", &numero);
         while(start->q!=numero)
                {start=start->next;}
        printf("Il numero da TE cercato è: %d\n", start->q);
        }


nodo *delete(nodo *start)
        {int num_del;
         printf("Inserisci il numero che vuoi eliminare: ");
         scanf("%d", &num_del);
         while(start->next->q!=num_del){start=start->next;}
         start->next=start->next->next;
         printf("Il numero è stato correttamente eliminato\n");
        }

nodo *inserisci(nodo *start)
        {int pezzi_add;

         printf("Quanti pezzi devo aggiungere? ");
         scanf("%d", &pezzi_add);
         start->q=start->q+pezzi_add;
         return (start);
        }
vegetablu è offline   Rispondi citando il messaggio o parte di esso
Old 25-07-2011, 00:12   #4
vegetablu
Junior Member
 
Iscritto dal: Jul 2011
Messaggi: 8
PS: Le parti inserite tra /* */ sono le parti che secondo il mio raggionamento sono esatte, ma purtroppo mi creano errori e non funzionano.
vegetablu è offline   Rispondi citando il messaggio o parte di esso
Old 25-07-2011, 01:04   #5
darkito85
Senior Member
 
L'Avatar di darkito85
 
Iscritto dal: Jun 2008
Città: Catania
Messaggi: 429
Non la prendere a male ma mi sa che hai qualche problema con i puntatori, o con il C in generale. Ti consiglio vivamente di dare una ripassata al C e ai puntatori.
Al di la della indentazione il tuo codice ha errori un po ovunque, controlli non fatti, valori non ritornati, parametri di ingresso ed uscita passati "a casaccio".
L'unica funzione che non ha errori è la funzione di stampa.
__________________
Amd X2 5600+ Brisbane -- GIGABYTE MA790X DS4 (REV 1.0)-- POV NVIDIA 9600GS0 EXO -- 2X1GB KINGSTON DDR2 800Mhz -- SAMSUNG HD250HJ 250GB -- LG FLATRON 20"
Trattive concluse: fgdac,k1ll3r,PhilAnselmo@Superjoint,danyrs92,emaborsa,ferone,Midia.
darkito85 è offline   Rispondi citando il messaggio o parte di esso
Old 25-07-2011, 01:15   #6
Gimli[2BV!2B]
Senior Member
 
L'Avatar di Gimli[2BV!2B]
 
Iscritto dal: Feb 2006
Città: Parma
Messaggi: 3010
Codice:
#include <stdio.h>
#include <stdlib.h>
#include <string.h> /*memset e funzioni stringhe*/

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(nodo *start);

main(int argc, char **argv)
{
	char sc = 'z'; /*inizializza SEMPRE*/

	nodo *start = (nodo *)malloc(sizeof(nodo));
	memset((void *)start, 0x00, sizeof(nodo)); /*tutto il contenuto della struttura azzerato*/
	/*Ah, a causa di questa allocazione iniziale avrai sempre un elemento*/
	/*vuoto in coda alla lista; non credo sia ciò che desideri...*/

	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':

			break;
		case 'i':
			start=inserisci(start);
			break;
		case 'l':

			break;
		case 'w':

			break;
		case 'q':
			exit(0);
			break;
		}
	}
}


char menu()
{
	char sc;
	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)
{
	nodo *nuovo = (nodo*)malloc(sizeof(nodo));
	memset((void*)nuovo, 0x00, sizeof(nodo)); /*pulizie di primavera, come sopra*/
	nuovo->next = start;
	printf("Inserisci Nome prodotto: ");
	scanf("%s", nuovo->nome); /*scanf di stringa: puoi usare direttamente la struttura*/
	printf("Inserisci la quantità: ");
	scanf("%d", &(nuovo->q)); /*idem per l'int, avendo l'accortezza di riferirsi all'elemento desiderato*/
	return nuovo;
}

void stampa(nodo *start)
{
	while(start!=NULL)
	{
		printf("%s: qty ", start->nome); /*questa immagino schiantasse a causa della mancata inizializzazione delle strutture (stringhe non terminate)*/
		printf("%d\n", start->q);
		start=start->next;
	}
	printf("\n");
}

nodo *trova(nodo *start)
        {int numero;
         printf("Inserisci il numero che cerchi: ");
         scanf("%d", &numero);
         while(start->q!=numero)
                {start=start->next;}
        printf("Il numero da TE cercato è: %d\n", start->q);
        }


/*come ti ho scritto prima, questo delete non controlla il primo elemento*/
/*della lista, cioè l'ultimo inserito. Devi controllare start->q, non saltare*/
/*subito al next. Devi anche fare il delete del nodo.*/
nodo *delete(nodo *start)
        {int num_del;
         printf("Inserisci il numero che vuoi eliminare: ");
         scanf("%d", &num_del);
         while(start->next->q!=num_del){start=start->next;}
         start->next=start->next->next;
         printf("Il numero è stato correttamente eliminato\n");
        }

nodo *inserisci(nodo *start)
        {int pezzi_add;

         printf("Quanti pezzi devo aggiungere? ");
         scanf("%d", &pezzi_add);
         start->q += pezzi_add;
         return (start);
        }
Tra commenti e correzioni dirette dovrei aver risposto a tutte le tue domande (più una porzione indentata a modo mio).
Ah, giusto, ho tralasciato il leggi da file: quello lo hai abbozzato, quando avrai ben capito come navigare nella lista e leggere i dati ti verrà molto più semplice: lascialo per ultimo, prima completa le funzioni interattive.
La scrittura su file dovrebbe essere ancora più semplice.

Trattandosi di un esercizio non posso andare oltre, devi capire ed applicare i suggerimenti, ma vedo che hai fatto varie prove, quindi confido che sarai in grado di procedere.
Visto che sei in Ubuntu ricordati che esistono anche le man per le funzioni C, che son comode, solitamente ben scritte e, soprattutto, indicano comodamente quali header occorre includere per utilizzare tal funzione.
__________________
~Breve riferimento ai comandi GNU/Linux (ormai non molto breve...)
Gimli[2BV!2B] è offline   Rispondi citando il messaggio o parte di esso
Old 25-07-2011, 12:44   #7
vegetablu
Junior Member
 
Iscritto dal: Jul 2011
Messaggi: 8
Quote:
Originariamente inviato da Gimli[2BV!2B] Guarda i messaggi
Codice:
#include <stdio.h>
#include <stdlib.h>
#include <string.h> /*memset e funzioni stringhe*/

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(nodo *start);

main(int argc, char **argv)
{
	char sc = 'z'; /*inizializza SEMPRE*/

	nodo *start = (nodo *)malloc(sizeof(nodo));
	memset((void *)start, 0x00, sizeof(nodo)); /*tutto il contenuto della struttura azzerato*/
	/*Ah, a causa di questa allocazione iniziale avrai sempre un elemento*/
	/*vuoto in coda alla lista; non credo sia ciò che desideri...*/

	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':

			break;
		case 'i':
			start=inserisci(start);
			break;
		case 'l':

			break;
		case 'w':

			break;
		case 'q':
			exit(0);
			break;
		}
	}
}


char menu()
{
	char sc;
	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)
{
	nodo *nuovo = (nodo*)malloc(sizeof(nodo));
	memset((void*)nuovo, 0x00, sizeof(nodo)); /*pulizie di primavera, come sopra*/
	nuovo->next = start;
	printf("Inserisci Nome prodotto: ");
	scanf("%s", nuovo->nome); /*scanf di stringa: puoi usare direttamente la struttura*/
	printf("Inserisci la quantità: ");
	scanf("%d", &(nuovo->q)); /*idem per l'int, avendo l'accortezza di riferirsi all'elemento desiderato*/
	return nuovo;
}

void stampa(nodo *start)
{
	while(start!=NULL)
	{
		printf("%s: qty ", start->nome); /*questa immagino schiantasse a causa della mancata inizializzazione delle strutture (stringhe non terminate)*/
		printf("%d\n", start->q);
		start=start->next;
	}
	printf("\n");
}

nodo *trova(nodo *start)
        {int numero;
         printf("Inserisci il numero che cerchi: ");
         scanf("%d", &numero);
         while(start->q!=numero)
                {start=start->next;}
        printf("Il numero da TE cercato è: %d\n", start->q);
        }


/*come ti ho scritto prima, questo delete non controlla il primo elemento*/
/*della lista, cioè l'ultimo inserito. Devi controllare start->q, non saltare*/
/*subito al next. Devi anche fare il delete del nodo.*/
nodo *delete(nodo *start)
        {int num_del;
         printf("Inserisci il numero che vuoi eliminare: ");
         scanf("%d", &num_del);
         while(start->next->q!=num_del){start=start->next;}
         start->next=start->next->next;
         printf("Il numero è stato correttamente eliminato\n");
        }

nodo *inserisci(nodo *start)
        {int pezzi_add;

         printf("Quanti pezzi devo aggiungere? ");
         scanf("%d", &pezzi_add);
         start->q += pezzi_add;
         return (start);
        }
Tra commenti e correzioni dirette dovrei aver risposto a tutte le tue domande (più una porzione indentata a modo mio).
Ah, giusto, ho tralasciato il leggi da file: quello lo hai abbozzato, quando avrai ben capito come navigare nella lista e leggere i dati ti verrà molto più semplice: lascialo per ultimo, prima completa le funzioni interattive.
La scrittura su file dovrebbe essere ancora più semplice.

Trattandosi di un esercizio non posso andare oltre, devi capire ed applicare i suggerimenti, ma vedo che hai fatto varie prove, quindi confido che sarai in grado di procedere.
Visto che sei in Ubuntu ricordati che esistono anche le man per le funzioni C, che son comode, solitamente ben scritte e, soprattutto, indicano comodamente quali header occorre includere per utilizzare tal funzione.

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!!!!!!!!!!!
Grazie!

Ecco il codice:
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;
	}
vegetablu è offline   Rispondi citando il messaggio o parte di esso
Old 25-07-2011, 19:59   #8
vegetablu
Junior Member
 
Iscritto dal: Jul 2011
Messaggi: 8
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:

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");} 
	}
vegetablu è offline   Rispondi citando il messaggio o parte di esso
Old 26-07-2011, 11:12   #9
darkito85
Senior Member
 
L'Avatar di darkito85
 
Iscritto dal: Jun 2008
Città: Catania
Messaggi: 429
Lo dico per te, secondo me devi studiarti meglio i puntatori, dal tuo codice vedo che hai le idee pochi chiare.

Codice:
    nodo *cancella(nodo *start)
    {
	char parola[20]; nodo *nuovo2,*tmp;
	printf("Quale oggetto vuoi eliminare?\t");
	scanf("%s", parola);
	nuovo2=start;
	if(!strcmp(nuovo2->nome,parola)) // se l'elemento si trova in prima posizione
	{
		start=start->next;
		free(nuovo2);
		printf("L'oggetto da te richiesto (%s) è stato correttamente ELIMINATO\n", parola);
		printf("\n");
		return start;
	}
	else
	{
			while (nuovo2->next!=NULL&&strcmp(nuovo2->next->nome,parola))
			 {
				nuovo2=nuovo2->next;
			 }
			 if(nuovo2->next!=NULL) //elemento trovato!
			 {
				 tmp=nuovo2->next;
				nuovo2->next=nuovo2->next->next;
				 free(tmp);
				printf("L'oggetto da te richiesto (%s) è stato correttamente ELIMINATO\n", parola);
				printf("\n");

				return start;
			 }
			 else // elemento non trovato
			 {
				 printf("L'oggetto da te richiesto (%s) non è stato trovato \n", parola);
				 printf("\n");
				return start;
			 }
    }
Questa è la funzione delete per come dovrebbe essere scritta. Comunque ci sono diversi errori nel tuo sorgente. In pratica quasi sempre non consideri mai l'eventualità che la parola non venga trovata.
Ad esempio nella funzione trova dovresti aggiungere la riga:

Codice:
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;
	 }
         if(start!=NULL)
               printf("%s\t %d\n", start->nome, start->q); printf("\n");
         else
               printf("Elemento non trovato");
    }
__________________
Amd X2 5600+ Brisbane -- GIGABYTE MA790X DS4 (REV 1.0)-- POV NVIDIA 9600GS0 EXO -- 2X1GB KINGSTON DDR2 800Mhz -- SAMSUNG HD250HJ 250GB -- LG FLATRON 20"
Trattive concluse: fgdac,k1ll3r,PhilAnselmo@Superjoint,danyrs92,emaborsa,ferone,Midia.
darkito85 è offline   Rispondi citando il messaggio o parte di esso
Old 27-07-2011, 11:43   #10
vegetablu
Junior Member
 
Iscritto dal: Jul 2011
Messaggi: 8
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!
vegetablu è offline   Rispondi citando il messaggio o parte di esso
Old 27-07-2011, 11:54   #11
vegetablu
Junior Member
 
Iscritto dal: Jul 2011
Messaggi: 8
Quote:
Originariamente inviato da darkito85 Guarda i messaggi
Lo dico per te, secondo me devi studiarti meglio i puntatori, dal tuo codice vedo che hai le idee pochi chiare.

Codice:
    nodo *cancella(nodo *start)
    {
	char parola[20]; nodo *nuovo2,*tmp;
	printf("Quale oggetto vuoi eliminare?\t");
	scanf("%s", parola);
	nuovo2=start;
	if(!strcmp(nuovo2->nome,parola)) // se l'elemento si trova in prima posizione
	{
		start=start->next;
		free(nuovo2);
		printf("L'oggetto da te richiesto (%s) è stato correttamente ELIMINATO\n", parola);
		printf("\n");
		return start;
	}
	else
	{
			while (nuovo2->next!=NULL&&strcmp(nuovo2->next->nome,parola))
			 {
				nuovo2=nuovo2->next;
			 }
			 if(nuovo2->next!=NULL) //elemento trovato!
			 {
				 tmp=nuovo2->next;
				nuovo2->next=nuovo2->next->next;
				 free(tmp);
				printf("L'oggetto da te richiesto (%s) è stato correttamente ELIMINATO\n", parola);
				printf("\n");

				return start;
			 }
			 else // elemento non trovato
			 {
				 printf("L'oggetto da te richiesto (%s) non è stato trovato \n", parola);
				 printf("\n");
				return start;
			 }
    }
Questa è la funzione delete per come dovrebbe essere scritta. Comunque ci sono diversi errori nel tuo sorgente. In pratica quasi sempre non consideri mai l'eventualità che la parola non venga trovata.
Ad esempio nella funzione trova dovresti aggiungere la riga:

Codice:
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;
	 }
         if(start!=NULL)
               printf("%s\t %d\n", start->nome, start->q); printf("\n");
         else
               printf("Elemento non trovato");
    }

Nella funzione cancella non mi elimina il primo elemento.
Nella funzione trova, se scrivo un elemento diverso va in errore.

L'ho appena provato incollando queste due tue funzioni.
vegetablu è offline   Rispondi citando il messaggio o parte di esso
Old 27-07-2011, 13:23   #12
darkito85
Senior Member
 
L'Avatar di darkito85
 
Iscritto dal: Jun 2008
Città: Catania
Messaggi: 429
la funzione cancella devi chiamarla dal menù così:

start=cancella(start);

Per quanto riguarda la funzione trova il problema credo stia nella condizione del ciclo while. Prova ad usare questa.

Codice:
void trova(nodo *start)
    {
	char parola[20];
	printf("Quale oggetto vuoi ricercare?\t");
	scanf("%s", parola);
      
        while( start!=NULL&&strcmp (parola, start->nome) !=0)
	 {
		start=start->next;
	 }
         if(start!=NULL)
               printf("%s\t %d\n", start->nome, start->q); printf("\n");
         else
               printf("Elemento non trovato");
    }
__________________
Amd X2 5600+ Brisbane -- GIGABYTE MA790X DS4 (REV 1.0)-- POV NVIDIA 9600GS0 EXO -- 2X1GB KINGSTON DDR2 800Mhz -- SAMSUNG HD250HJ 250GB -- LG FLATRON 20"
Trattive concluse: fgdac,k1ll3r,PhilAnselmo@Superjoint,danyrs92,emaborsa,ferone,Midia.
darkito85 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Nioh 3: souls-like punitivo e Action RPG Nioh 3: souls-like punitivo e Action RPG
Test in super anteprima di Navimow i220 LiDAR: il robot tagliaerba per tutti Test in super anteprima di Navimow i220 LiDAR: i...
Dark Perk Ergo e Sym provati tra wireless, software via browser e peso ridotto Dark Perk Ergo e Sym provati tra wireless, softw...
DJI RS 5: stabilizzazione e tracking intelligente per ogni videomaker DJI RS 5: stabilizzazione e tracking intelligent...
AMD Ryzen 7 9850X3D: Zen 5, 3D V-Cache e frequenze al top per il gaming AMD Ryzen 7 9850X3D: Zen 5, 3D V-Cache e frequen...
Logitech G325: audio di fascia alta, wir...
Nessuna pubblicità su Claude, per...
Gli stipendi nel settore tech? Sono anco...
Problemi con la stampa 3D? Un prompt per...
Amazon Leo amplia i contratti con SpaceX...
Basta Purefication, il Giurì bloc...
LibreOffice 26.2 migliora prestazioni e ...
La Cina si prepara a un test della capsu...
La NASA rende note alcune informazioni a...
ASUS ExpertCenter PN54: mini PC Copilot+...
Geely userà una fabbrica europea ...
Leica Camera tratta la cessione della ma...
La nuova AMD non è più 'ec...
La Cina non è più la pecor...
Un SSD accanto alla GPU: la ricetta di Z...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 19:37.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v