/*Il programma gestisce la base dati di una casa discografica.Le informazioni sono contenute nel file artisti.txt che contiene i nomi del gruppo dell'artista o della band di cui si hanno le canzoni e il codice identificativo. All'utente viene presentato un menu dove: se preme uno puņ visualizzare tutte le canzoni di un artista di cui inserisce il codice identificativo, se preme due puņ ottenere dal prgramma il codice dell'autore o degli autori che hanno composto una determinata canzone inserita dall'utente e se preme tre puņ uscire dal programma.*/ #include #include #include #include struct _canzone { char titolo[50]; struct _canzone *next; }; struct _cantante { char codice[6]; char nome[13]; struct _cantante *next; struct _canzone *canzoni; }; typedef struct _canzone canzone; typedef struct _cantante cantante; cantante* primo_artista; void load(void); void printcode(void); void printsong(void); void loadsong(cantante* attuale); cantante* loadartist(char* nome); void main() { short select; load(); do { printf("Inserisci 1 per visualizzare tutte le canzoni di un artista inserendo il codice\n"); printf("Inserisci 2 per visualizzare l\'artista inserendo il titolo della canzone\n"); printf("Inserisci 3 per uscire\n"); do select=getch(); while(select !='1' && select!='2' && select!='3'); if(select=='1') printcode(); else if(select=='2') printsong(); } while(select!='3'); } void load(void) { char temp[30]; cantante *p0; FILE *fp; if((fp=fopen("artisti.txt","r"))==NULL) { printf("Manca il file degli artisti"); exit(1); } while(fgets(temp,31,fp)!=NULL) { p0=loadartist(temp); loadsong(p0); } fclose(fp); } cantante* loadartist(char* nome) { char *codice, *nome_a; cantante *p0=NULL,*p1,*temp; if(nome[strlen(nome)-1]=='\n') nome[strlen(nome)-1]='\0'; codice=strtok(nome," "); nome_a=strtok(NULL," "); if(!primo_artista) { primo_artista=(cantante*)malloc(sizeof(cantante)); strcpy(primo_artista->codice,codice); strcpy(primo_artista->nome,nome_a); primo_artista->next=NULL; return primo_artista; } else { for(p1=primo_artista;p1!=NULL && (strcmp(p1->codice,codice)<0);p1=p1->next) p0=p1; if(p0) { temp=(cantante*)malloc(sizeof(cantante)); strcpy(temp->codice,codice); strcpy(temp->nome,nome_a); temp->next=p1; p0->next=temp; } else { temp=(cantante*)malloc(sizeof(cantante)); strcpy(temp->codice,codice); strcpy(temp->nome,nome_a); temp->next=primo_artista; primo_artista=temp; } return temp; } } void loadsong(cantante *attuale) { char point[51]; canzone *p0,*p1,*temp; FILE *fp; fp=fopen(attuale->nome,"r"); while(fgets(point,51,fp)!=NULL) { p0=NULL; if(point[strlen(point)-1]=='\n') point[strlen(point)-1]='\0'; if(attuale->canzoni==NULL) { attuale->canzoni=(canzone*)malloc(sizeof(canzone)); strcpy(attuale->canzoni->titolo,point); attuale->canzoni->next=NULL; } else { for(p1=attuale->canzoni;p1!=NULL && strcmp(p1->titolo,point)<0;p1=p1->next) p0=p1; temp=(canzone*)malloc(sizeof(canzone)); strcpy(temp->titolo,point); if(p0) { temp->next=p1; p0->next=temp; } else { temp->next=attuale->canzoni; attuale->canzoni=temp; } } } } void printcode(void) { cantante *p0=NULL,*p1; canzone *temp; char codice[5]; printf("Inserisci il codice dell'artista: "); scanf("%s",&codice); for(p1=primo_artista;p1!=NULL && strcmp(p1->codice,codice)<=0;p1=p1->next) p0=p1; if(!p0) printf("L\'artista non e\' presente\n\n"); else { if(!strcmp(p0->codice,codice)) { for(temp=p0->canzoni;temp!=NULL;temp=temp->next) printf("%s\n",temp->titolo); } else printf("Il cantante non e\'presente\n\n"); } } void printsong(void) { char point[51]; cantante *p0; canzone *p1; printf("Inserisci il titolo della canzone: "); do gets(point); while(strlen(point)==0); if(point[strlen(point)-1]=='\n') point[strlen(point)-1]='\0'; for(p0=primo_artista; p0!=NULL;p0=p0->next) { for(p1=p0->canzoni; p1!=NULL && (strcmp(p1->titolo,point))<0; p1=p1->next); if(p1!=NULL) if((strcmp(p1->titolo,point))==0) printf("%s\n",p0->codice); } }