PDA

Visualizza la versione completa : [C++] Esercizio sulle classi


mygametech
20-02-2014, 16:43
salve a tutti, quello che vi chiedo oggi riguarda un esercizio per la prova pratica di informatica della mia università, da spiegare come esercizio è un pochino lungo ma comunque è semplice, il testo è il seguente, ci sarebbe anche la seconda parte dell'esercitazione ma per il momento il problema si trova nella prima parte.


http://it.tinypic.com/r/1zy7979/8

il codice scritto da me si divide in due parti, un file con estenzione .h in cui dichiaro la classe e tutte le funzioni che andrò ad usare ed un file con estenzione .cpp in cui vado a scrivere le funzioni vere e proprie. ecco il codice di seguito:

compito.h:


#include <iostream>
#include <cstring>


using namespace std;


class Display {
int n;
bool *display; //false: led spento , true: led acceso;


public:


Display (int );
bool set (const char );
friend ostream & operator<<(ostream & , const Display & );


void specchia ();
//~Display();
};


mentre questo è il compito.cpp:



#include "compito.h"


Display::Display (int dim) {
n= (dim<=0 || ((dim%2)==0))? 5 : dim;
display=new bool[n*n];


for (int i=0; i<n; i++)
for (int j=0; j<n; j++)
display[i*dim+j]=false;


};


bool Display::set (const char ch) {
int media = n/2;


for (int i=0; i<n; i++){
for (int j=0; j<n; j++){

if (ch=='-' && i==media)
display[i*n+j]=true;
if (ch=='|' && j==media)
display[i*n+j]=true;
if (ch=='/' && i==(n-j-1))
display[i*n+j]=true;


else
return false;
}
}




return true;
}


ostream & operator<<(ostream & os, const Display & d) {
int dim= d.n;


for (int i=0; i<dim; i++){
for (int j=0; j<dim; j++){

if (d.display)
os<<'1';
else
os<<'0';

}
os<<endl;
}


return os;


}


il main.cpp invece ci viene dato dai professori, chiama le funzioni che abbiamo scritto ed è il seguente:



#include "compito.h"
#include <iostream>
using namespace std;

int main(){

//PRIMA PARTE
cout<<"1/8 Test del costruttore (deve creare un Display 5x5 con tutti i led spenti)"<<endl;
Display d1(4);
cout<<d1<<endl;

cout<<"2/8 Test della set('-') (deve stampare la riga centrale accesa)"<<endl;
d1.set('-');
cout<<d1<<endl;

cout<<"3/8 Test della set('|') (deve stampare la colonna centrale accesa)"<<endl;
Display d2(5);
d2.set('|');
cout<<d2<<endl;

cout<<"4/8 Test della set('/') (deve stampare la diagonale ascendente accesa)"<<endl;
Display d3(7);
d3.set('/');
cout<<d3<<endl;

// SECONDA PARTE

cout<<"5/8 Test dell'or bit a bit (deve stampare il segno '+')"<<endl;
d1|=d2;
cout<<d1<<endl;

cout<<"6/8 Test della 'specchia' (deve stampare la diagonale discendente 7x7 accesa)"<<endl;
d3.specchia();
cout<<d3<<endl;

{
Display d4(3);
cout<<"7/8 Test dell'operatore di assegnamento (deve stampare l'asta '|' 5x5)"<<endl;
d4=d2;
cout<<d4<<endl;
cout<<"8/8 Test (implicito) del distruttore"<<endl;
}

return 0;
}

e contiene pure la chiamata alle funzioni della parte seconda.

come vi avevo accennato prima il problema si trova nella prima parte del codice e (secondo il mio parere) nella classe ostream che stampa a video il contenuto delle matrici, infatti questo programma mi stampa in ogni caso, una matrice formata da tutti 1 invece che stamparmi:
-0 se display==false;
-1 se display==true;

non riesco tuttavia a capirne il motivo, spero che riusciate ad individuare il problema della funzione ed aiutarmi!
Grazie mille delle risposte.

l'uscita del mio terminale è la seguente:

http://it.tinypic.com/r/2w54zsi/8

LeleFT
20-02-2014, 17:19
if (d.display)
os<<'1';
else
os<<'0';



d.display è un array... quindi va indicizzato, altrimenti quell'espressione sarà sempre vera (essendo che stai testando la "bontà" del puntatore)... infatti stai usando due for annidati, ma non ne stai usando gli indici.


Ciao. :ciauz:

mygametech
20-02-2014, 17:22
if (d.display)
os<<'1';
else
os<<'0';






Ciao. :ciauz:

grazie mille!!!

mygametech
20-02-2014, 17:27
allora ho indicizzato l'array modificando questa parte di codice:



ostream & operator<<(ostream & os, const Display & d) {
int dim= d.n;


for (int i=0; i<dim; i++){
for (int j=0; j<dim; j++){

if (d.display[i*dim+j]==true)
os<<'1';
else if (d.display[i*dim+j]==false)
os<<'0';

}
os<<endl;
}


return os;


}


ma ora mi da il problema oppposto, ovvero stampa tutti 0, cosa sbaglio (scusami ancora!!!)?

LeleFT
20-02-2014, 17:46
if ( d.display[i*dim+j] ) // Se il valore è true, l'espressione è true e andrà in then, altrimenti in else
os<<'1';
else // Se non è true, non serve un secondo if per sapere che è false... :)
os<<'0';



Questo è più che sufficiente... :)

Perchè stampa tutti 0... Guarda, ad esempio, la "set()":




for (int i=0; i<n; i++){
for (int j=0; j<n; j++){

if (ch=='-' && i==media)
display[i*n+j]=true;
if (ch=='|' && j==media)
display[i*n+j]=true;
if (ch=='/' && i==(n-j-1))
display[i*n+j]=true;


else
return false;
}
}


Se il carattere passato è '-', comincierà il controllo. Siamo sulla prima cella (0,0), il primo if non viene soddisfatto.
Va a vedere il secondo if, non viene soddisfatto.
Va a vedere il terzo if, non viene soddisfatto quindi ritorna false... ma come? E tutte le altre celle non le controlliamo? Ci fermiamo alla prima? :)

Ricorda che gli "else" non sono obbligatori... se il flusso logico non ha bisogno di una "alternativa", semplicemente non metterla.


Ciao. :ciauz:

mygametech
20-02-2014, 17:48
quindi basta togliere l'else alla set?

mygametech
20-02-2014, 17:50
quindi basta togliere l'else alla set?

è vero!!! Grazie mille del tuo auto ora funziona, grazie!!!

mygametech
20-02-2014, 17:53
scusa se ti disturbo ancora, ora ho visto che funziona tutto tranne una seconda funzione, la specchia che dovrebbe stampare la matrice come se fosse riflessa a specchio.

questo è il mio codice:



void Display::specchia () {
bool temp;

for (int i=0; i<n; i++){
for (int j=0; j<n; j++){
temp=display[i*n+j];
display[i*n+j]=display[i*n+(n-j-1)];
display[i*n+(n-j-1)]=temp;




}
}
return;
}


il problema è che mi ristampa la stessa matrice senza invece scambiare le righe, anche qui, cosa sbaglio?

LeleFT
20-02-2014, 18:05
E' piuttosto "ovvio" e "divertente", se ci pensi... tu stai scorrendo tutta la matrice e ogni cella la scambi con quella opposta... ma siccome stai scorrendo tutta la matrice, prima o poi arrivi sopra alla cella "opposta" e scambi anche quella, quindi tutto torna alla posizione originale... :)

Quello che devi fare è scorrere solo "metà matrice":



for (int i=0; i<n; i++){
for (int j=0; j<n/2; j++){
temp=display[i*n+j];
display[i*n+j]=display[i*n+(n-j-1)];
display[i*n+(n-j-1)]=temp;
}
}



Ciao. :ciauz:

mygametech
20-02-2014, 18:10
ciao, allora grazie mille del tuo aiuto!!! allora ho capito perfettamente il problema, però ti volevo chiedere una piccola sottigliezza, questa cosa di scorrere solo metà matrice funziona, tuttavia noi a lezione non l'abbiamo mai utilizzata, ci sarebbe un metodo alternativo per farlo? non che questo non vada bene, anzi, però non mi resta "comodo", se però è l'unico modo, va bene lo stesso! mi adeguerò!

Loading