Ciao a tutti ragazzi, ho bisogno di aiuto con un compito d'esame che ho svolto io. In sostanza alcune delle funzioni implementate non funzionano. Poichè questo forum è pieno di persone molto più esperte di me mi sono permesso di domandare nella speranza di essere aiuto e soprattutto nella speranza che prendiate il codice e lo provate voi così da potermi consigliare come risolvere perchè io non ci sto riuscendo proprio :D
In particolare la funzione di modifica nome del cantante, elimina brano, copia brani nell'altra lista mi danno molti problemi, eppure mi sembrano scritte nel modo corretto. Di compilare compila senza problemi. Ovviamente non funzionando la funzione copia nell'altra lista non possono funzionare le altre funzioni visto che le altre funzioni funzionano in base al contenuto della seconda lista. Vi posta qua il codice e vi prego di aiutarmi, inoltre ovviamente posto anche la foto del compito. Grazie.
Vi posto qua anche un esempio di file riguardo i brani da caricare con il file:
Tra le Granite e le Granate
Francesco Gabbani
Pop
2017 3:15
Per Averti
Adriano Celentano
Pop
2000 4:55
Ecc....
In particolare la funzione di modifica nome del cantante, elimina brano, copia brani nell'altra lista mi danno molti problemi, eppure mi sembrano scritte nel modo corretto. Di compilare compila senza problemi. Ovviamente non funzionando la funzione copia nell'altra lista non possono funzionare le altre funzioni visto che le altre funzioni funzionano in base al contenuto della seconda lista. Vi posta qua il codice e vi prego di aiutarmi, inoltre ovviamente posto anche la foto del compito. Grazie.
C:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*DEFINIZIONE STRUTTURE DATI*/
typedef struct BranoMusicale {
char titolo_brano[255];
char nome_cantante[63];
char genere_musicale[15];
int anno;
int minuti;
int secondi;
}TBranoMusicale;
typedef struct NodoBranoMusicale{
TBranoMusicale info;
struct NodoBranoMusicale *next;
}TNodoBranoMusicale;
typedef TNodoBranoMusicale* TListaBrani;
typedef struct GenereMusicale {
char genere_musicale[15];
int minuti;
int secondi;
TListaBrani elenco_brani;
}TGenereMusicale;
typedef struct NodoGenereMusicale {
TGenereMusicale info;
struct NodoGenereMusicale *next;
}TNodoGenereMusicale;
typedef TNodoGenereMusicale* TListaGeneri;
/*DEFINIZIONE DI FUNZIONE*/
int menu(void) {
int scelta;
printf("\tMenu' Principale\n\n");
printf("[1] Carica Brani Musicali\n");
printf("[2] Modifica Brano\n");
printf("[3] Elimina Brano Musicale\n");
printf("[4] Inserisci Brano Musicale --> Aggiuntiva\n");
printf("[5] Copia Brani In Lista Generi Musicali\n");
printf("[6] Durata Media\n");
printf("[7] Visualizza Brani Per Anno\n");
printf("[8] Visualizza Tutto\n");
printf("[9] Esci\n\n");
do {
printf("Scelta: ");
scanf("%d", &scelta);
} while (scelta < 1 || scelta > 9);
return scelta;
}
void InserisciBraniInListaOrdinata(TListaBrani *lis, TBranoMusicale elem) {
TListaBrani prec, curr, newnode;
if ((newnode = (TListaBrani)malloc(sizeof(TNodoBranoMusicale))) == NULL) {
printf("Errore nell'allocazione della memoria.\n");
exit(1);
}
newnode->info = elem;
prec = NULL;
curr = *lis;
while (curr != NULL && strcmp(curr->info.titolo_brano, elem.titolo_brano) < 0) {
prec = curr;
curr = curr->next;
}
newnode->next = curr;
if (prec != NULL) {
prec->next = newnode;
}
else {
*lis = newnode;
}
}
int CaricaBraniMusicali(char *nomefile, TListaBrani *plis) {
FILE *f;
TBranoMusicale brano;
int nletti = 0;
if ((f = fopen(nomefile, "r")) == NULL) {
perror("File non trovato!!!\n");
exit(1);
}
*plis = NULL;
while (!feof(f)) {
fgets(brano.titolo_brano, sizeof(brano.titolo_brano), f);
fgets(brano.nome_cantante, sizeof(brano.nome_cantante), f);
fscanf(f, "%[^\n]s\n", brano.genere_musicale);
fscanf(f, "%d\t", &brano.anno);
fscanf(f, "%d : %d\n", &brano.minuti, &brano.secondi);
InserisciBraniInListaOrdinata(plis, brano);
nletti++;
}
fclose(f);
return nletti;
}
void VisualizzaBrani(TListaBrani lis) {
int i;
for (i = 0; i < lis; i++) {
printf("------> Brano Numero : %d\n\n", i + 1);
printf("- Titolo Del Brano: %s\n", lis->info.titolo_brano);
printf("- Nome Cantante: %s\n", lis->info.nome_cantante);
printf("- Genere Musicale: %s\n", lis->info.genere_musicale);
printf("\n- Anno: %d\t", lis->info.anno);
printf("Durata: %d : %d\n\n", lis->info.minuti, lis->info.secondi);
printf("---------------------------------------------------->\n\n");
lis = lis->next;
}
}
TListaBrani RicercaBrano(TListaBrani lis, char *titolo_brano) {
while (lis != NULL) {
if (!(strcmp(lis->info.titolo_brano, titolo_brano)))
return(lis);
lis = lis->next;
}
return(lis);
}
int ModificaCantante(TListaBrani *lis, char *titolo_brano, char *nuovo_cantante) {
TListaBrani aux;
aux = RicercaBrano(*lis, titolo_brano);
if (aux != NULL) {
strcpy(aux->info.nome_cantante, nuovo_cantante);
return 1;
}
else {
return 0;
}
}
int EliminaBrano(TListaBrani *lis, char *titolo_brano) {
TListaBrani prec, curr;
prec = NULL;
curr = *lis;
while (curr != NULL && (strcmp(curr->info.titolo_brano, titolo_brano) )!=0) {
prec = curr;
curr = curr->next;
}
if (curr == NULL) {
return 0;
}
if (prec != NULL) {
prec->next = curr->next;
}
else {
*lis = curr->next;
}
free(curr);
return 1;
}
TBranoMusicale InserisciBrano(void) {
TBranoMusicale brano;
getchar();
printf("Per inserire un nuovo brano inserisci i campi richiesti\n\n");
printf("- Titolo del brano: ");
gets(brano.titolo_brano);
printf("- Nome Cantante: ");
gets(brano.nome_cantante);
printf("- Genere Musicale: ");
scanf("%[^\n]s", brano.genere_musicale);
printf("- Anno: ");
scanf("%d", &brano.anno);
printf("Durata: ");
scanf("%d : %d", &brano.minuti, &brano.secondi);
return brano;
}
TListaGeneri RicercaGenereMusicale(TListaGeneri lis, char *genere_musicale) {
while (lis != NULL) {
if (!(strcmp(lis->info.genere_musicale, genere_musicale))) return(lis);
lis = lis->next;
}
return(lis);
}
void InserisciGenereMusicale(TListaGeneri *lis, char *genere_alimentare) {
TListaGeneri newnode;
if ((newnode = (TListaGeneri)malloc(sizeof(TNodoGenereMusicale))) == NULL) {
printf("Errore nell'allocazione della memoria.\n");
exit(1);
}
newnode->next = *lis;
strcpy(newnode->info.genere_musicale, genere_alimentare);
newnode->info.elenco_brani = NULL;
*lis = newnode;
}
void CopiaProgrammiInListaGeneriMusicali(TListaBrani listabrani, TListaGeneri *lis) {
TBranoMusicale brano;
TListaGeneri paux;
while (listabrani != NULL) {
brano = listabrani->info;
paux = RicercaGenereMusicale(*lis, brano.genere_musicale);
if (paux != NULL) {
InserisciBraniInListaOrdinata(&(paux->info.elenco_brani), brano);
}
else {
InserisciBrano(lis, brano.genere_musicale);
RicercaGenereMusicale(*lis, brano.genere_musicale);
InserisciBraniInListaOrdinata(&(paux->info.genere_musicale), brano);
}
listabrani = listabrani->next;
}
}
float DurataMedia(TListaGeneri listageneri, char *generemusicale) {
TListaGeneri paux;
TListaBrani cc;
int k;
int sommadurata = 0;
paux = RicercaGenereMusicale(listageneri, generemusicale);
if (paux == NULL) {
return -1;
}
cc = paux->info.elenco_brani;
k = 0;
while (cc != NULL) {
sommadurata = sommadurata + cc->info.genere_musicale;
k++;
cc = cc->next;
}
return((float)sommadurata / k);
}
void VisualizzaBraniAnno(TListaGeneri listageneri, int *anno) {
TListaBrani paux;
while (listageneri != NULL) {
paux = listageneri->info.elenco_brani;
while (paux != NULL) {
if (strcmp(paux->info.anno, anno) >= 0) {
VisualizzaBrani(paux);
}
paux = paux->next;
}
listageneri = listageneri->next;
}
}
void VisualizzaTutto(TListaGeneri listageneri) {
TListaBrani paux;
printf("Visualizzazione dati lista di liste\n\n");
while (listageneri != NULL) {
printf("---> Genere Musicale: %s\n", listageneri->info.genere_musicale);
paux = listageneri->info.elenco_brani;
while (paux != NULL) {
printf("- Titolo del brano: %s\n", paux->info.titolo_brano);
printf("- Nome Cantante: %s\n", paux->info.nome_cantante);
printf("- Anno: %d\t", paux->info.anno);
printf("Durata: %d : %d\n", paux->info.minuti, paux->info.secondi);
paux = paux->next;
}
listageneri = listageneri->next;
}
}
/*FUNZIONE PRINCIPALE MAIN*/
int main(void) {
TListaBrani lista_brani = NULL;
TListaGeneri lista_generi = NULL;
int scelta, n, esito, anno;
TBranoMusicale cc;
char nomefile[64];
char titolo_brano[255];
char nuovo_cantante[63];
do {
scelta = menu();
switch (scelta) {
case 1:
printf("\tFunzione Caricamento Da File\n");
printf("Inserisci il nome del file da cui caricare i brani musicali: ");
scanf("%s", nomefile);
n = CaricaBraniMusicali(nomefile, &lista_brani);
printf("Sono stati caricati %d brani e sono i seguenti: \n\n", n);
VisualizzaBrani(lista_brani);
break;
case 2:
printf("\tFunzione modifica nome cantante\n\n");
printf("Inserisci il titolo del brano: ");
gets(titolo_brano);
printf("Inserisci il nuovo cantante: ");
gets(nuovo_cantante);
break;
case 3:
printf("\tFunzione Di Eliminazione Elemento\n");
printf("Inserisci il titolo del brano che intendi eliminare: ");
scanf("%s", titolo_brano);
if (esito = EliminaBrano(&lista_brani, titolo_brano) == 1) {
printf("Brano Eliminato con successo!!\n\n");
}
else {
printf("Brano non trovato!\n");
}
break;
case 4:
cc = InserisciBrano();
InserisciBraniInListaOrdinata(&lista_brani, cc);
VisualizzaBrani(lista_brani);
break;
case 5:
CopiaProgrammiInListaGeneriMusicali(lista_brani, &lista_generi);
break;
case 6:
break;
case 7:
printf("Inserisci Anno: ");
scanf("%d", &anno);
VisualizzaBraniAnno(lista_generi, anno);
break;
case 8:
VisualizzaTutto(lista_generi);
break;
case 9:
printf("Grazie per aver utilizzato questo programma, alla prossima!!!\n\n");
return 0;
break;
}
} while (scelta != 0);
return 0;
}
[ATTACH=full]328601[/ATTACH]
Post unito automaticamente:
Vi posto qua anche un esempio di file riguardo i brani da caricare con il file:
Tra le Granite e le Granate
Francesco Gabbani
Pop
2017 3:15
Per Averti
Adriano Celentano
Pop
2000 4:55
Ecc....
Allegati
Ultima modifica: