Sei sulla pagina 1di 6

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.

h> #define N 200/*aggiunto define N 200*/ typedef struct accessori{ char nomeAccessorio[N]; /*cambiamento da puntatore ad vettore*/ char dataDisponibilita[9]; int prezo; int index; struct accessori*next; }Accessori; typedef struct a{ char nomeModello[N]; char dataDisponibilita[9]; int prezzo; char fileAccessori[N]; struct a*nextauto; struct accessori*sublist; }LISTA; void stampaElenco(LISTA*); LISTA*database(LISTA*,FILE*); void stampaElencoAcc(LISTA*,char*); void stampaSelezione(LISTA*,char*,char*); void libera_memoria(LISTA*); void ritrova_data_maggiore(LISTA*,char*,char*);/* passagio dell vettor nella funzione rendendola cosi void */ LISTA*newelement(); Accessori*newacc(); int main(int argc,char*argv[]){ if(argc!=2){ printf("Numero parametri errato!\n"); exit(1); } FILE*fin,*facc; char selezioneUtente[N],buffer;/*aggiunta di una variabile buffer per tener conto dei caratteri '\n',' ' ecc*/ int indice,i; char vettorepreferenze[100];/*cambiato tipo da int* a char perche nell programa l'ho implementato ed usato come vettore di caratteri*/ LISTA*TESTA=NULL;

Accessori*SUBTESTA=NULL; fin=fopen(argv[1],"r"); if (fin==NULL){ printf("Non posso aprire il file!\n"); exit(1); } TESTA=database(TESTA,fin); fclose(fin); printf("La lista delle automobili :\n"); stampaElenco(TESTA); printf("Introduci la preferenza:\n"); scanf("%s",selezioneUtente); printf("Il elenco dei accessori :\n"); stampaElencoAcc(TESTA,selezioneUtente); printf("Introduci il codice dell accessorio desiderato:\n"); i=0; do{ scanf("%c",&buffer); if((buffer>48)&&(buffer<58)){ vettorepreferenze[i]=buffer;/*aggiunta dell iff in modo da selezionare solo i caratteri validi*/ i++; } }while(buffer!='0');/*cambiato range ed il confronto si fa con il carattere avendo implementato come vettore di caratteri*/ vettorepreferenze[i+1]='\0';/*dimenticato il terminatore anche se nello scritto dovrei averlo messo*/ stampaSelezione(TESTA,selezioneUtente,vettorepreferenze); return(0); } Accessori* newacc(){ Accessori* tmp; tmp=(Accessori*)malloc(sizeof(Accessori)); if(tmp==NULL){ printf("Non posso allocare la memoria!\n"); exit(1); } return(tmp); } LISTA* newelement(){ LISTA *tmp; tmp=(LISTA*)malloc(sizeof(LISTA)); if (tmp==NULL){

printf("Non posso allocare la memoria!\n"); exit(1); } tmp->sublist=NULL; return(tmp); }

LISTA* database(LISTA*TESTA,FILE*fin){ FILE*facc; LISTA*ptemp; LISTA Buffer; Accessori*tmp; Accessori sustain; int index=1;/*dimenticato l'aggiunta dell index perche sotto l'ho usato*/ while(fscanf(fin,"%s%s%d %s",Buffer.nomeModello,Buffer.dataDisponibilita,&Buffer.prezzo,Buffer.fileAccessori )!=EOF){ ptemp=newelement(); strcpy(ptemp->nomeModello,Buffer.nomeModello); strcpy(ptemp->dataDisponibilita,Buffer.dataDisponibilita); strcpy(ptemp->fileAccessori,Buffer.fileAccessori); ptemp->prezzo=Buffer.prezzo; ptemp->nextauto=TESTA; TESTA=ptemp; } /*scambiato il indice i con testa cosi non cera bisogno di aggiungere un altra variabile siccome ptemp c'e gi*/ for(ptemp=TESTA;ptemp!=NULL;ptemp=ptemp->nextauto){ facc=fopen(ptemp->fileAccessori,"r"); if (facc==NULL){ printf("Errore apertura file accessori!\n"); exit(1); } index=1; while(fscanf(facc,"%s%s %d",sustain.nomeAccessorio,sustain.dataDisponibilita,&sustain.prezo)!=EOF){ tmp=newacc(); /*Come scritto nell compito la procedura di creazione della sotto lista duale alla prima e per motivi di tempo non la ho scritta in aula quindi la completo ora aggiungendo anche il index ad ogni accessorio*/ strcpy(tmp->nomeAccessorio,sustain.nomeAccessorio); strcpy(tmp->dataDisponibilita,sustain.dataDisponibilita); tmp->prezo=sustain.prezo; tmp->index=index; tmp->next=ptemp->sublist;

ptemp->sublist=tmp; index++; } fclose(facc); } return(TESTA); } void stampaElenco(LISTA*TESTA){ LISTA*i; for(i=TESTA;i!=NULL;i=i->nextauto){ printf("%s\n",i->nomeModello); } return ; } void stampaElencoAcc(LISTA*TESTA,char*selection){ LISTA*i; Accessori*j; for(i=TESTA;i!=NULL;i=i->nextauto){ if(strcmp(i->nomeModello,selection)==0){ for(j=i->sublist;j!=NULL;j=j->next){/*e solo next non accessorinext*/ printf("%s %s %d\t%d\n",j->nomeAccessorio,j->dataDisponibilita,j->prezo,j>index);/*dimenticato aggiungere gli spazi tra le parole ed il \n*/ } break; } } return ; } void stampaSelezione(LISTA*TESTA,char*selezione,char*vettore_sel){ LISTA *i; Accessori* j; int k; char maxdata[N]; int costoTotale=0; for(i=TESTA;i!=NULL;i=i->nextauto){ if(strcmp(i->nomeModello,selezione)==0){ costoTotale=costoTotale+i->prezzo; for(j=i->sublist;j!=NULL;j=j->next){/*dimenticato di scrivere l'ultimo pezzo dell for "j=j->next"*/ for(k=strlen(vettore_sel);k>=0;k--){ if(j->index==(vettore_sel[k]-48)){/*dalla tabella ascii la distanza e 48 non 42*/ costoTotale=costoTotale+j->prezo; }

} } ritrova_data_maggiore(i,vettore_sel,maxdata); /*spostata dentro il if perche era fuori*/ break; /*dimenticato di mettere il break*/ } } printf("La vostra selezione :\n%s ",i->nomeModello); for(k=strlen(vettore_sel);k>=0;k--){ /*sistemato i range di k perche andava fuori range*/ for (j=i->sublist;j!=NULL;j=j->next){ if(j->index==(vettore_sel[k]-48)){ printf("%s ",j->nomeAccessorio); } } } printf("%d %s\n",costoTotale,maxdata); return; }

void libera_memoria(LISTA *TESTA){ LISTA *i,*tmp; Accessori *j,*ptemp; for(i=TESTA;i!=NULL;i=i->nextauto){ for(j=i->sublist;j!=NULL;j=j->next){ ptemp=j; free(ptemp); } tmp=i; free(tmp); } return; }

void ritrova_data_maggiore(LISTA *ptr,char *vettore_sel,char*maxdata){ Accessori *j; char masimo[9]; int n,i; n=(strlen(vettore_sel)); strcpy(masimo,ptr->dataDisponibilita); for(i=0;i<n;i++){ for(j=ptr->sublist;j!=NULL;j=j->next) if(j->index==(vettore_sel[i]-48)){

if(strcmp(masimo,j->dataDisponibilita)<0){ strcpy(masimo,j->dataDisponibilita); } } } strcpy(maxdata,masimo); return; }

Potrebbero piacerti anche