Problema funzione che rimuove un elemento da un'array di struct

di il
1 risposte

Problema funzione che rimuove un elemento da un'array di struct

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;
    
}





1 Risposte

Devi accedere o registrarti per scrivere nel forum
1 risposte