Ciao ragazzi,
sono nuovo nell'ambito della programmazione e ho un problema con questo esercizio: /*Definisci una struct Playlist che rappresenti una lista di brani musicali. La struct dovrebbe includere un array di struct Brano con campi come titolo, artista, e durata. Scrivi una funzione che permetta all'utente di creare una playlist, aggiungere e rimuovere brani e calcolare la durata totale della playlist.*/
Ho un problema con funzione di rimozione dei brani, a causa della quale il programma non termina. Sono giorni che provo a risolverlo ma non sono riuscito e capire dove stia il mio errore. Ringrazio in anticipo chiunque interverrà per indirizzarmi ad una soluzione. DI seguito il codice:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define DIM 50
typedef struct
{
char titolo[30];
char artista[30];
double durata;
} Brano;
typedef struct
{
Brano brani[DIM];
} Playlist;
void gestisci_playlist();
void visualizza_playlist(Playlist *, int);
int crea_playlist(Playlist *);
int aggiungi_brano(Playlist *, int);
int rimuoviBrano(Playlist *, int);
int calcolaDurta(Playlist *, int);
int main(){
gestisci_playlist();
}
void gestisci_playlist(){
int opzione, n_brani;
float durata;
Playlist compilation;
printf("SCEGLIERE UN'OPZIONE:\n1-creare una playlist\n2-aggiungere un brano\n3-calolcare la durata totale della playlist\n"
"4-rimuovere un brano\n0-EXIT\n\nN.B: PER POTER ACCEDERE ALLE ALTRE FUNZIONI DEVI PRIMA" "CREARE UNA PLAYLIST!");
do{
printf("\n\n\nINSERISCI UN'OPZIONE: ");
scanf("%d", &opzione);
while(getchar()!='\n');
switch (opzione){
case 1:
printf("\n\n-----Crea una playlist------");
n_brani=crea_playlist(&compilation);
visualizza_playlist(&compilation, n_brani);
break;
case 2:
printf("-----AGGIUNGI BRANI-------\n\n");
n_brani=aggiungi_brano(&compilation, n_brani);
visualizza_playlist(&compilation, n_brani);
break;
case 3:
printf("-----CALCOLA DURATA-------\n\n");
durata=calcolaDurta(&compilation, n_brani);
break;
case 4:
printf("\n\n\t\t-----RIMOZIONE BRANI-------\n\n");
n_brani=rimuoviBrano(&compilation, n_brani),
visualizza_playlist(&compilation, n_brani);
break;
case 0:
exit(1);
}
}
while(opzione!=0 && opzione>=1 && opzione<5);
}
int crea_playlist(Playlist *ptr){
int n;
do{
printf("\n\nQuanti brani vuoi inserire?: ");
scanf("%d", &n);
while(getchar()!='\n');
if(n<1 || n>DIM)
printf("\n\n---ERR---VALORE NON VALIDO---\n\n");
} while (n<1 || n>DIM);
for(int i=0; i<n; i++){
printf("\n\tInserisci il %d brano\n\nTITOLO: ", i+1); //inserimento brani
gets(ptr->brani[i].titolo);
printf("\nARTISTA: ");
gets(ptr->brani[i].artista);
printf("\nDURATA: ");
scanf("%lf", &ptr->brani[i].durata);
while(getchar()!='\n');
}
return n;
}
void visualizza_playlist(Playlist *ptr, int n){
int i;
printf("\n\n------------VISUALIZZAZIONE DELLA PLAYLIST------------");
for(i=0; i<n; i++){
printf("\n\n\t\tBRANO %d\n\n",i+1);
printf("TITOLO: ");
puts(ptr->brani[i].titolo);
printf("ARTISTA: ");
puts(ptr->brani[i].artista);
printf("DURATA: ");
printf("%.2lf", ptr->brani[i].durata);
}
}
int aggiungi_brano(Playlist *ptr, int n){
int i, brani_aggiunti;
printf("NUMERO BRANI DA AGGIUNGERE: ");
scanf("%d", &brani_aggiunti);
while(getchar()!='\n');
for(i=n; i<n+brani_aggiunti; i++){
printf("\n\tInserisci il %d brano\n\nTITOLO: ", i+1);
gets(ptr->brani[i].titolo);
printf("\nARTISTA: ");
gets(ptr->brani[i].artista);
printf("\nDURATA: ");
scanf("%lf", &ptr->brani[i].durata);
while(getchar()!='\n');
}
return i;
}
int calcolaDurta(Playlist *ptr, int n){
double durata=0.0;
for(int i=0; i<n; i++)
durata=durata+ptr->brani[i].durata;
printf("LA DURATA TOTALE DELLA PLAYLIST: %.2lf", durata);
return durata;
}
int rimuoviBrano(Playlist *ptr, int n){
int brano_da_rimuovere;
printf("\n\nNUMERO BRANO DA RIMUOVERE: ");
scanf("%d", &brano_da_rimuovere);
while(getchar()!=0);
if(brano_da_rimuovere>=1 && brano_da_rimuovere<n){
for(int i=brano_da_rimuovere; i<n; i++)
ptr->brani[i] = ptr->brani[i+1];
}
else if (brano_da_rimuovere == n)
ptr->brani[n-2] = ptr->brani[n-1]; //inizializza penultimo con ultimo
else
printf("-----ERRORE: VALORE NON VALIDO------");
n--;
return n;
}