PDA

Visualizza la versione completa : [C++] Progetto: lettore musicale (con codice)


luna88
25-08-2011, 12:27
Ciao a tutti di nuovo, avevo già aperto una discussione del genere ma senza codice. Mi è stata chiusa così ne inizio una nuova.
Il mio progetto consiste nel gestire file musicali. Ho pensato così di creare una lista con strutture e puntatori... purtroppo nel web non trovo molto... perciò avrei bisogno di voi...
Vi posto il codice che funge fino ad Aggiungi (aggiunge un elemento) ma quando chiedo di visualizzare la lista si blocca.
Avviso che per il momento per il titolo e l'artista ho usato le stringhe ma che lo perfezionerò con char e [] appena tutte le funzioni sono ok; ma nel complesso il codice tutto è ancora da perfezionare...per ora mi interessa che almeno ci sia un buon scheletro.
Questo è il codice




#include <iostream>
#include <string>
using namespace std;

struct brano
{
string titolo;
string artista;
string genere;
struct brano *next;
};

brano* testa;
int attuali = 0;

//Prototipi di funzioni
void Titolo();
void Menu();
void Aggiungi (brano* & );
void Visualizza (brano*);
void Ordina();
void Trova ();
void Elimina ();


//funzione principale
int main()
{

int risp;

brano* testa = NULL;


Titolo ();

do {
Menu ();
cout <<"\n\nDigita la tua scelta: ";
cin >> risp;
} while (risp <1 || risp > 6);
switch (risp)
{
case 1:
Aggiungi(testa);
break;
case 2:
Visualizza(testa);
break;
case 3:
Ordina;
break;
case 4:
Trova;
break;
case 5:
Elimina;
break;
case 6:
cout <<"\nArrivederci! :) \n\n";
break;
}

return 0;
}

// funzioni in dettaglio

void Titolo ()
{
cout <<"\n\t LettoreMusicale.cpp \n";
cout <<"\n\t Esame di: ALGORITMI E PROGRAMMAZIONE \n";
cout <<"\n\t == GESTIONE DI FILE MUSICALI == \n";
cout <<"\n\t Contatti attualmente presenti: " << attuali << endl;
} // fine Titolo

void Menu()
{
cout <<"\n\n\t == Menu'== \n";
cout <<"\n\t [1]: Aggiungi un nuovo brano \n";
cout <<"\n\t [2]: Visualizza i brani inseriti \n";
cout <<"\n\t [1]: Ordina brani \n";
cout <<"\n\t [4]: Trova un brano \n";
cout <<"\n\t [5]: Elimina brano \n";
cout <<"\n\t [6]: Esci\n";
} // fine Menu

void Aggiungi (brano* &testa)
{
int risposta;
string TitoloBrano;
string ArtistaBrano;
string GenereBrano;

brano* nuovo;
nuovo = new brano;

cout <<"\n\n == Nuovo elemento == \n";
cout <<"\nTitolo brano: \t";
cin >> TitoloBrano;
cout <<"\nArtista: \t";
cin >> ArtistaBrano;
cout <<"\nGenere: \t";
cin >> GenereBrano;

nuovo->titolo = TitoloBrano;
nuovo->artista = ArtistaBrano;
nuovo->genere = GenereBrano;
nuovo->next = testa;
testa = nuovo;
attuali ++;
cout <<"\n == Brano Inserito! == \n";
cout <<"\nVuoi effettuare una nuova operazione? Si= 1; No = 0 \n\n";
cin >> risposta;
if (risposta == 1) main();
} // fine Aggiungi

void Visualizza (brano* testa)
{
brano* prossimo;
prossimo = testa;

cout <<"\n\n == ELENCO BRANI == \n\n";

do {
cout <<"\n\n\tTitolo: " << prossimo->titolo << " \n";
cout <<"\n\n\tArtista: " << prossimo->artista << " \n";
cout <<"\n\n\tGenere: " << prossimo->genere << " \n";
prossimo = prossimo->next;
} while (prossimo != NULL);
} // fine Visualizza

MisterBean
25-08-2011, 12:56
cout <<"\nVuoi effettuare una nuova operazione? Si= 1; No = 0 \n\n";
cin >> risposta;
if (risposta == 1) main();
Perchè fai questa cosa? Quando la funzione Aggiungi termina ritorna comunque al main. Se vuoi che continui a mostrare il menu per altre operazioni devi modificare la condizione del while, aggiungendo che deve essere diverso da 6 (uscita dal programma).

luna88
25-08-2011, 13:05
Ok...ho seguito il tuo suggerimento...thanks... ora è più lineare ;)
che mi potresti suggerire per la funzione Visualizza?

luna88
25-08-2011, 13:15
Ottimo!!! Con questa modifica funge anche la funzione Visualizza().... :yuppi: :yuppi:
THX!!!

MisterBean
25-08-2011, 13:16
Non capisco cosa intendi per "suggerimenti", comunque c'è un piccolo errore: nella funzione Visualizza non controlli se la testa della lista è NULL, all'inizio. In tal modo rischi di dereferenziare un puntatore NULL nel corpo del do ... while, ottenendo un bel segmentation fault.

luna88
25-08-2011, 13:23
Hai ragione....aggiungo subito!!! ;)

MisterBean
25-08-2011, 13:27
Originariamente inviato da luna88
Ottimo!!! Con questa modifica funge anche la funzione Visualizza().... :yuppi: :yuppi:
THX!!!
Si, perchè il problema era dato dal fatto che dopo l'Aggiungi chiamavi il main, che impostava a NULL la testa della lista. La funzione Visualizza quindi riceveva un puntatore a NULL e cercava di chiamarne i valori, mandando in crash il programma.

luna88
26-08-2011, 13:45
Strano...ma non capisco perchè :(
Con questa funzione trova se inserisco un solo dato me lo trova. OK
Se ne inserisco due: se voglio trovare proprio il secondo che ho inserito me lo trova, se invece voglio trovare il primo no... perché??? uff...



void Trova (brano *testa)
{
string ArtistaBrano;
bool trovato = false;

if (!testa)
{cout <<" \n\n LISTA VUOTA!!! \n";
return;}

else
{
cout <<"\n == RICERCA PER ARTISTA == \n";
cout <<"\n\nArtista: \t";
cin >> ArtistaBrano;

brano* scorri;
scorri = testa;

do {
if (scorri->artista == ArtistaBrano)
{
trovato = true;
cout <<"\n\n == RISULTATO DELLA RICERCA == \n" << endl;
cout <<" _________________________________ \n" << endl;
cout <<"\nArtista: " << scorri->artista << " \n";
cout <<"\nTitolo: " << scorri->titolo << " \n";
cout <<"\nGenere: " << scorri->genere << " \n\n";
} // fine if
else
{
trovato = false;
scorri = scorri->next;}
} while(scorri == NULL);
system ("pause");
system ("cls");

} // fine Else
}// fine Trova

MisterBean
26-08-2011, 14:10
Due cose:
1) Evita l'else nel controllo sulla testa della lista, tanto se è vuota la funzione ritorna, per cui ti basta solo l'if, senza l'else.
2) Togli assolutamente quel

while(scorri == NULL);, è lì il problema.
Il tuo programma inserisce i nuovi dati in testa alla lista, per cui se tu cerchi l'ultimo elemento che hai inserito (ovvero quello in testa), allora viene trovato, in tutti gli altri casi così non sarà, perchè la condizione del while è sbagliata.

luna88
26-08-2011, 14:38
GRAZIEEE!!! MR BEAN... sei il numero 1!!! :unz:

Loading