Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 18
  1. #1

    [C++] Esercizio sulle classi

    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:
    codice:
    #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:

    codice:
    #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:

    codice:
    #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
    Immagini allegate Immagini allegate
    Ultima modifica di mygametech; 20-02-2014 a 17:45

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    codice:
    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.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Quote Originariamente inviata da LeleFT Visualizza il messaggio
    codice:
    if (d.display)
       os<<'1';
    else
       os<<'0';



    Ciao.
    grazie mille!!!

  4. #4
    allora ho indicizzato l'array modificando questa parte di codice:

    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!!!)?

  5. #5
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    codice:
    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()":


    codice:
        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.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  6. #6
    quindi basta togliere l'else alla set?

  7. #7
    Quote Originariamente inviata da mygametech Visualizza il messaggio
    quindi basta togliere l'else alla set?
    è vero!!! Grazie mille del tuo auto ora funziona, grazie!!!

  8. #8
    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:

    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?

  9. #9
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    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":

    codice:
            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.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  10. #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ò!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.