#include #include #include /*** MODULO 740 by Daniele Raffo 24.11.1997 ***/ struct struttura { char nome[40]; int s0, s1, s2, s3; struct struttura *next; }; typedef struct struttura node; char *t0="Redditi di lavoro dipendente "; char *t1="Redditi terreni e fabbricati "; char *t2="Spese mediche generali "; char *t3="Detrazioni per pagamenti di mutui"; int nclienti; FILE *ptold,*ptnew; main() { void elenca(node *record); void esamina(node *record); void inserisci(node *first); void cancella(node *first); void modifica(node *record); node *readfile (node *record, node *finish); void writefile(node *record); void noofnodes(node *record); int choice, nrecs, i; node *start; node *finish; node *temprecord; printf("\n\n\n\tPROGRAMMA PER LA GESTIONE DI UN ARCHIVIO DI MODULI 740\n"); printf("\tby Daniele Raffo c.d.D. Informatica 24.11.1997\n"); printf("\tper l'esame di Algoritmi e Strutture Dati\n\n\n\n"); start=(node *) malloc(sizeof(node)); finish=(node *) malloc(sizeof(node)); /* i campi nome dei nodi start e finish sono !!! e ~~~ */ /* in questo modo gli estremi lista rimangono in ordine alfabetico */ strcpy(start->nome,"!!!"); /* invece il comando start->nome="!!!" */ strcpy(finish->nome,"~~~"); /* darebbe errore */ if ((ptold=fopen("740.data","r"))==0) { printf("File dati non trovato, inizializzazione archivio...\n"); start->next=finish; finish->next=0; } else { printf("Lettura file dati in corso... "); fscanf(ptold, "%d\n", &nrecs); printf(" %d registrazioni trovate\n", nrecs); temprecord=start; for (i=1; i<=nrecs; i++) temprecord=readfile(temprecord, finish); } ptnew=fopen("740.data2","w"); /* la ricerca dei nomi e' case sensitive, meglio immetterli in MAIUSCOLO */ do { printf("\n\n\n 1 - Elenca tutti i clienti\n"); printf(" 2 - Esamina i dati di un cliente\n"); printf(" 3 - Inserisci un nuovo cliente\n"); printf(" 4 - Cancella un cliente\n"); printf(" 5 - Modifica i dati di un cliente\n"); printf(" 0 - Esci e salva l'archivio su file\n\n"); printf(" Operazione: "); fflush(stdin); scanf("%d",&choice); switch (choice) { case 1: nclienti=0; printf("\n\n\nContenuto archivio:\n"); elenca(start); printf("%d clienti in archivio\n",nclienti); break; case 2: esamina(start); break; case 3: inserisci(start); break; case 4: cancella(start); break; case 5: modifica(start); break; case 0: break; default: break; } } while (choice!=0); printf("\n\n\nProgramma terminato, "); if (start->next->next==0) { /* se l'archivio e' vuoto */ printf("niente in archivio da salvare\n\n\n\n"); system("rm -f 740.data 740.data2"); /* cancella i file dati (vuoti) */ } else { printf("scrittura dati su file... "); nclienti=0; noofnodes(start); /* come prima riga del file dati */ fprintf(ptnew, "%d\n",nclienti); /* scrive il numero dei clienti */ writefile(start->next); printf("%d registrazioni salvate\n\n\n\n",nclienti); system("mv -f 740.data2 740.data"); } fclose(ptold); fclose(ptnew); } /* end of main */ void elenca(node *record) /* elenca i nomi di tutti i clienti presenti in archivio */ { if (record->next!=0) { if (strcmp(record->nome,"!!!")) { nclienti++; printf(" %3d. %s\n",nclienti,record->nome); } elenca(record->next); } return; } void esamina(node *record) /* visualizza tutti i dati di un determinato cliente */ { node *find(node *, char[]); void view(node *); char chi[40]; node *dove; printf("\n\n\nNome del cliente da cercare? "); fflush(stdin); scanf("%[^\n]",chi); dove=find(record,chi); if (dove==0) { printf("Cliente %s non in archivio\n",chi); return; } view(dove); return; } void inserisci (node *first) /* inserisce un nuovo cliente in archivio, nel giusto ordine alfabetico */ { node *find(node *, char[]); node *alpha(node *, char[]); void enterdata(node *); node *newrecord; node *tag; char nuovonome[40]; printf("\n\n\nNome del nuovo cliente da inserire: "); fflush(stdin); scanf("%[^\n]", nuovonome); if (find(first,nuovonome)) { printf("Cliente %s gia' presente,", nuovonome); printf(" scegli un altro nome\n"); return; } tag=alpha(first, nuovonome); newrecord=(node *) malloc(sizeof(node)); strcpy(newrecord->nome, nuovonome); newrecord->next=tag->next; tag->next=newrecord; enterdata(newrecord); printf("Ok, nuovo cliente inserito in archivio\n"); return; } void cancella(node *first) /* cancella un cliente dall'archivio */ { node *find(node *, char[]); node *tag; node *temp; char target[40]; printf("\n\n\nCliente da cancellare: "); fflush(stdin); scanf("%[^\n]", target); tag=find(first,target); if (tag==0) { printf("Cliente %s non in archivio,",target); printf(" niente da cancellare\n"); return; } temp=tag->next->next; free(tag->next); tag->next=temp; printf("Ok, cliente cancellato dall'archivio\n"); return; } void modifica(node *record) /* modifica i dati di un cliente gia' esistente in archivio */ { node *find(node *, char[]); void view(node *); void enterdata(node *); char chi[40]; node *dove; printf("\n\n\nNome del cliente di cui modificare i dati: "); fflush(stdin); scanf("%[^\n]",chi); dove=find(record,chi); if (dove==0) { printf("Cliente %s non ancora in archivio,",chi); printf(" devi prima inserirlo\n"); return; } printf("\nDati attuali del cliente:"); view(dove); printf("\n\nOra inserisci i dati aggiornati\n"); enterdata(dove->next); /* attenzione, e' sempre lo stesso nodo! */ printf("Ok, aggiornamento dati cliente completato\n"); return; } node *readfile (node *record, node *finish) /* legge un unico nodo di archivio, che poi rende, dal file dati vecchio */ { node *readrecord; readrecord=(node *) malloc(sizeof(node)); record->next=readrecord; readrecord->next=finish; /* temporaneamente, viene assegnato finish */ /* come successivo al nodo letto da file */ fscanf(ptold, "%[^\n]\n",readrecord->nome); fscanf(ptold, "%d\n",&readrecord->s0); fscanf(ptold, "%d\n",&readrecord->s1); fscanf(ptold, "%d\n",&readrecord->s2); fscanf(ptold, "%d\n",&readrecord->s3); return(readrecord); } void writefile(node *record) /* scrive l'archivio, esclusi i nodi start e finish, sul file dati nuovo */ { fprintf(ptnew, "%s\n",record->nome); fprintf(ptnew, "%d\n",record->s0); fprintf(ptnew, "%d\n",record->s1); fprintf(ptnew, "%d\n",record->s2); fprintf(ptnew, "%d\n",record->s3); if (record->next->next!=0) writefile(record->next); return; } void noofnodes(node *record) /* conta il numero di nodi esclusi start e finish, cioe' di clienti */ /* il numero e' memorizzato nella variabile esterna nclienti */ { if (record->next!=0) { if (strcmp(record->nome,"!!!")) nclienti++; noofnodes(record->next); } return; } node *find(node *record, char target[]) /* localizza un cliente per nome */ /* riceve l'inizio della lista e il nome da cercare */ /* restituisce un pointer al nodo precedente il nodo con nome=target */ /* quindi nodo->next sara' il nodo cercato */ /* restituisce 0 se non trova il cliente */ { if (strcmp(record->next->nome, target)==0) return(record); else if (record->next->next==0) return(0); else find(record->next, target); } node *alpha(node *record, char target[]) /* controlla alfabeticamente il nome di ogni nodo */ /* restituisce il nodo dopo il quale andra' inserito quello con nome=target */ /* perche' venga rispettato l'ordine alfabetico (dei nomi) dei nodi */ { if (strcmp(record->next->nome, target)>0) return(record); else alpha(record->next, target); } void view(node *dove) /* mostra i dati del cliente del nodo successivo a quello dato per argomento */ { /* le seguenti definizioni sono solo per comodita' */ int e0=dove->next->s0; int e1=dove->next->s1; int e2=dove->next->s2; int e3=dove->next->s3; printf("\n\n\n %s",dove->next->nome); printf(" Mod 740 valori x 000 \n"); printf("--------------------------------------------------------\n"); printf(" CAUSALE ENTRATE USCITE\n"); printf("%s %6d\n",t0,e0); printf("%s %6d\n",t1,e1); printf("%s %6d\n",t2,e2); printf("%s %6d\n",t3,e3); printf("--------------------------------------------------------\n"); printf(" Totale entrate %6d\n",e0+e1); printf(" Totale uscite %6d\n",e2+e3); printf("--------------------------------------------------------\n"); printf(" Imponibile %6d\n",e0+e1-e2-e3); return; } void enterdata(node *newrecord) /* immette i dati del cliente del nodo passato per argomento */ { printf("\nImmetti i valori corrispondenti, in migliaia di lire\n"); fflush(stdin); printf("%s: ",t0); scanf("%d",&newrecord->s0); fflush(stdin); printf("%s: ",t1); scanf("%d",&newrecord->s1); fflush(stdin); printf("%s: ",t2); scanf("%d",&newrecord->s2); fflush(stdin); printf("%s: ",t3); scanf("%d",&newrecord->s3); return; }