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

Hybrid View

  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,328
    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,328
    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
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    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

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

  9. #9
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Quote Originariamente inviata da mygametech Visualizza il messaggio
    tuttavia noi a lezione non l'abbiamo mai utilizzata
    Scusa la perplessità... ma immagino che a scuola ti abbiano spiegato come "scorrere una matrice". Che tu debba scorrerla tutta o scorrerne metà, o scorrere solo i primi 5 elementi, dipende dal tipo di elaborazione che devi fare... spero che voi studenti non pretendiate che vi si insegni separatamente come scorrere i primi 2 elementi, poi i primi 3 elementi, poi i primi 4 elementi, ecc.

    La richiesta del professore è quella di scrivere un metodo che scambi i valori di determinati elementi della matrice. Non serve che ve lo dica il professore che se vai nella cella A e la scambi con B, poi vai sopra a B e la scambi con A, hai ri-ottenuto la situazione iniziale. Questo si chiama "ragionamento" ed è ciò che si fa quando si approccia un problema per risolverlo.

    Ora, per invertire una matrice devo scambiare tra di loro due elementi opposti... a me viene "naturale" pensare (ragionare) che, quindi, non dovrò prendere in considerazione tutti gli elementi di quella matrice... mi basterà prenderne in considerazione la metà e scambiarli con l'altra metà. Quindi dovrò scorrere solo metà matrice. Ma se qualcuno mi ha spiegato come scorrere una matrice (tutti gli elementi della matrice), non mi serve andargli a chiedere come fare per scorrerne solo metà... ti pare?


    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
    grazie mille del tuo aiuto, come sempre chiarissimo! in effetti hai proprio ragione. non che io non ragioni quando programmo ma anzi il ragionamento è proprio alla base della programmazione altrimenti non riuscirei a fare nulla, grazie del tuo aiuto!

    (sai mica come si chiude una discussione qui sul forum?)

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.