
Originariamente inviata da
mygametech
Allora riscrivo in questa discussione per non aprirne una nuova.
Oggi ho rifatto un nuovo esercizio sempre di preparazione all'esame che dovrò dare tra poco, in questo caso il testo è il seguente:
http://it.tinypic.com/r/290sftu/8
in cui devo creare una lista per il noleggio di dvd, il mio codice come sempre è diviso in file.h e file.cpp, nel file.h metto la dichiarazione di classe mentro nel file.cpp vado proprio a scrivere le funzioni.
ecco i due file:
file.h
codice:
#include <iostream>
#include <cstring>
using namespace std;
struct elem {
char titolo [36];
char cliente [21];
bool stato; // False: dvd presente , True: dvd noleggiato
elem *pun;
};
class NoleggioDVD {
elem *testa;
public:
NoleggioDVD ();
bool insDVD (const char *);
bool noleggia (const char *,const char *);
friend ostream& operator<<(ostream& , const NoleggioDVD& );
};
mentre questo è il
file.cpp
codice:
#include <iostream>
#include "compito8.h"
using namespace std;
NoleggioDVD::NoleggioDVD () {
testa=NULL;
};
bool NoleggioDVD::insDVD (const char *s) {
if (strlen(s)>35)
return false;
//inserimento in testa
if (testa==NULL){
strcpy (testa->titolo, s);
testa->stato=false;
testa->pun=NULL;
}
//inserimento in coda
else {
elem *p=testa;
while (p->pun!=NULL)
p=p->pun;
elem *r=new elem;
p->pun=r;
r->pun=NULL;
r->stato=false;
strcpy (r->titolo, s);
}
return true;
}
bool NoleggioDVD::noleggia (const char *s,const char *c) {
//controllo
if (strlen(s)>35 || strlen (c)>20 || testa==NULL)
return false;
//scorro la lista
elem *p=testa;
while (p!=NULL && !(strcmp(p->titolo, s)==0))
p=p->pun;
//caso in cui non esista il dvd inserito o sia già noleggiato
if (p==NULL || p->stato==true)
return false;
//il dvd esiste-->il cliente lo noleggia
else {
p->stato=true;
strcpy(p->cliente, s);
}
return true;
}
ostream& operator<<(ostream& os, const NoleggioDVD& n) {
elem *p;
if (n.testa==NULL)
os<<"Non ci sono DVD presenti in videoteca";
for (p=n.testa; p!=NULL; p=p->pun) {
os<<p->titolo<<',';
if (!p->stato)
os<<"PRESENTE";
else {
os<<"ASSENTE"<<'('<<p->cliente<<')';
}
os<<endl;
}
}
il
main.cpp datomi dai professori è il seguente:
codice:
#include <iostream>
#include "compito8.h"
using namespace std;
int main(){
// test prima parte
NoleggioDVD n;
n.insDVD("Madagascar 3");
n.insDVD("Sherlock Holmes - Gioco di ombre");
n.insDVD("Lo Hobbit");
n.insDVD("Django Unchained");
n.insDVD("Battleship");
cout<<n<<endl;
n.noleggia("Lo Hobbit", "MARIO.ROSSI");
n.noleggia("Django Unchained", "LUIGI.BIANCHI");
n.noleggia("Madagascar 3", "GIOVANNI.VERDI");
cout<<n<<endl;
/*
// test seconda parte
n.riconsegna("LUIGI.BIANCHI");
cout<<n<<endl;
{
NoleggioDVD n2(n);
cout<<n2<<endl;
}
NoleggioDVD n3=!n;
cout<<n3<<endl;
*/
return 0;
}
la seconda arte è commentata perchè non ho scritto le funzioni riguardanti questa parte, comunque ora il mio problema è che quando vado a compilare il computer mi da errore di segmentazione, in questo modo:
http://i62.tinypic.com/2s68od2.png
in effetti devo dire che ogni volta che faccio un esercizio con puntatori mi da sempre questo errore, quindi è qualche sbaglio che faccio ripetutamente, potreste aiutarmi a capire quel'è tale sbaglio?
inoltre ho anche un'altra domanda da fare, infatti inizialmente avevo messo la struct all'interno della classe ma poi vedendo la soluzione del professore, ho notato che lui la mette fuori, così l'ho fatto anche io, ma che differenza ci sarebbe?
Grazie mille a tutti per le risposte! non immaginate quanto io sia grato dell'aiuto che mi state dando!