Aiuto traccia!!!

di il
2 risposte

Aiuto traccia!!!

Salve a tutti, sono un ragazzo che sta facendo ingegneria informatica:) , martedi ho un esame sul c++! esercitandomi mi sono imbatutto in una traccia del prof, e non capisco come va affrontata o fatta. L ho svolta ma non so se va bene, quindi chiedevo aiuto a qualcuno x farmi capire bene le cose..grazie a tutti.


Si scriva un programma che utilizzi la struttura dati più adatta per gestire una playlist di brani musicali, in cui il generico elemento deve contenere i seguenti dati:

titolo del brano
nome dell'esecutore
anno della registrazione
durata del brano in secondi

Il programma deve prevedere inizialmente la lettura dell'elenco per un numero N di brani specificato dall'utente. Una volta inserito l'elenco, il programma deve prevedere la lettura di un valore T e procedere all'eliminazione dall'elenco dei brani di durata inferiore a T. L'elenco ottenuto al termine delle eliminazioni deve essere quindi ordinato per durata del brano in senso decrescente e stampato, riportando tutti i dati di ciascun brano.




#include <cstdlib>
#include <iostream>

using namespace std;

struct brani
{
char titolo[32];
char nomec[32];
int anno;
float durata;

};
void ordina(brani b[],int n);
void elimina(brani b[],int n,int pos);
int cerca(brani b[],int n,float x);
void leggi(brani b[],int n);
void stampa(brani b[],int n);
int main(int argc, char** argv) {
    brani b[200];
    int n;
    int pos;
    float t;
    cout<<"Quanti brani vuole inserire:"<<endl;
    cin>>n;
    leggi(b,n);
    ordina(b,n);
    cout<<"Inserisci la durata del brano:"<<endl;
    cin>>t;
    pos=cerca(b,n,t);
    if(pos>=0)
    {
        elimina(b,n,pos);
        n--;
    }
    stampa(b,n);

    return 0;
}

void leggi(brani b[],int n){
    for(int i=0;i<n;i++)
    {
    cout<<"Titolo brano:"<<endl;
    cin.ignore();
    cin.getline(b[i].titolo,32);
    cout<<"Nome artista:"<<endl;
    cin.ignore();
    cin.getline(b[i].nomec,32);
    cout<<"Anno pubblicazione:"<<endl;
    cin>>b[i].anno;
    cout<<"Durata brano:"<<endl;
    cin>>b[i].durata;


    }


}
void stampa(brani b[],int n){
    for(int i=0;i<n;i++)
    {
    cout<<"Anno pubblicazione"<<b[i].anno<<endl;
    cout<<"Titolo brano:"<<b[i].titolo<<endl;
    cout<<"Artista del brano:"<<b[i].nomec<<endl;
    cout<<"Durata brano:"<<b[i].durata<<endl;


    }




}
int cerca(brani b[],int n,float x)
{
int posin,posfin,posmed,pos;
pos=-1;
posin=0;
posfin=n-1;
while(pos<0 && posin<=posfin)
{
posmed=(posin+posfin)/2;
if(x>b[posmed].durata)
    posin=posmed+1;
else if(x<b[posmed].durata)
    posfin=posmed-1;
else
    pos=posmed;
}
return(pos);


}
void elimina(brani b[],int n,int pos)
{
for(int i=pos;i<n-1;i++)
    b[i]=b[i+1];
}
void ordina(brani b[],int n)
{
for(int i=0;i<n-1;i++)
    for(int j=i+1;j<n;j++)
        if(b[i].durata<b[i].durata)
            swap(b[i],b[j]);

}

2 Risposte

  • Re: Aiuto traccia!!!

    Ciao ^^ ,

    La traccia dice
    il programma deve prevedere la lettura di un valore T e procedere all'eliminazione dall'elenco dei brani di durata inferiore a T
    Il programma che hai implementato invece elimina soltanto il brano che abbia una durata uguale a quella inserita tramite input dall' utente, cosa completamente diversa.
    Dato l' inserimento tramite input di un valore T , devi eliminare tutti i brani i quali hanno una durata inferiore a T, quindi possono essere anche più di uno se non tutti.
    Quindi in conclusione , penso che il sottoprogramma Cerca è un pò inutile ma basta fare una funzione molto meno complessa del tipo
    
    void elimina_brani ( brani b[], int riemp, float T) {
        for ( int i = 0 ; i < riemp ; i++ ) 
              if ( b[i].durata < T )
                     elimina(b...... ) ( non mi ricordo i parametri che passi ) ; 
    }
    
    Distinti Saluti,
    Alessandro
  • Re: Aiuto traccia!!!

    Ci sono vari modi per affrontare il problema da te indicato. Infatti una playlist può essere implementata con array o liste, a loro volta allocate staticamente o dinamicamente a runtime. Se ancora non hai studiato la parte dei puntatori e dell'allocazione dinamica, allora un array va più che bene, altrimenti l'uso di liste dinamiche è più conveniente, almeno secondo me. Per il codice che hai scritto, ho pensato ad alcune modifiche:
    
    #include <cstdlib>
    #include <iostream>
    
    using namespace std;
    
    #define MAX 100
    
    typedef struct{
        char titolo[32];
        char nomec[32];
        int anno;
        float durata;
    }Brano;
    
    typedef Brano Playlist [MAX];
    
    void ordina(Playlist p,int n);
    void elimina(Playlist p,int n,int pos);
    int cerca(Playlist p,int n,float x);
    void leggi(Playlist p,int n);
    void stampa(Playlist,int n);
    
    int main(int argc, char** argv) {
        Playlist p;
        int n;
        int pos;
        float t;
        cout<<"Quanti brani vuole inserire (Max "<<MAX<<"):"<<endl;
        cin>>n;
        leggi(p,n);
        cout<<"Inserisci la durata del brano:"<<endl;
        cin>>t;
        pos=0;
        while((pos=cerca(p,n,pos,t))!=-1)
                elimina(p,n,pos);
                n--;
        }
        ordina(p,n);
        stampa(b,n);
        return 0;
    }
    
    void leggi(Playlist p,int n){
        for(int i=0;i<n;i++){
            cout<<"Titolo brano:"<<endl;
            cin.ignore();
            cin.getline(p[i].titolo,32);
            cout<<"Nome artista:"<<endl;
            cin.getline(p[i].nomec,32);
            cout<<"Anno pubblicazione:"<<endl;
            cin>>p[i].anno;
            cout<<"Durata brano:"<<endl;
            cin>>p[i].durata;
     }
    
    void stampa(Playlist p,int n){
        for(int i=0;i<n;i++){
            cout<<"\nN."<<i+1<<":\n"
            cout<<"Anno pubblicazione"<<p[i].anno<<endl;
            cout<<"Titolo brano:"<<p[i].titolo<<endl;
            cout<<"Artista del brano:"<<p[i].nomec<<endl;
            cout<<"Durata brano:"<<p[i].durata<<endl;
    }
    
    int cerca(Playlist p,int n,int init,float x){
        int pos=-1;
        for(int i=0;i<n;i++){
            if(p[i].durata<x){
                pos=i;
                break;
            }
        }
        return pos;
    }
    
    void elimina(Playlist p,int n,int pos){
    for(int i=pos;i<n-1;i++)
        p[i]=p[i+1];
    }
    
    void ordina(Playlist p,int n){
        for(int i=0;i<n-1;i++){
            for(int j=i+1;j<n;j++){
                if(p[i].durata<p[i].durata)
                    swap(p[i],p[j]);
            }
        }
    }
    
Devi accedere o registrarti per scrivere nel forum
2 risposte