Programma che genera matrice quadrata casuale e array con sottoprogrammi

di il
25 risposte

Programma che genera matrice quadrata casuale e array con sottoprogrammi

Buonasera a tutti, vi spiego in breve:
Ho scritto questo programma che genera una matrice quadrata casuale (con un numero di righe/colonne incluso tra 5 e 10), e crea rispettivamente un vettore pari ed uno dispari, entrambi costituiti con i valori della matrice.
Il problema è che in una funzione mi restituisce una lunghezza di un vettore, mentre in un'altra funzione una lunghezza diversa dello stesso vettore.
E la cosa è molto strana, considerando che le funzioni sono quasi uguali (ma ho dovuto farne 2 diverse in quanto una deve ritornare il vettore di interi, mentre l'altra la lunghezza del vettore stesso).
Come di solito vi ringrazio in anticipo.

Codice che compila ma NON funzionante:

/*
Programma che genera una matrice quadrata numerica casuale e la stampa a schermo.
Aggiungere:
1)Memorizzi in due vettori di uscita gli elementi pari e quelli dispari della matrice di pixel, e successivamente li stampi a schermo
*/
#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;
//variabili globali
const int righe_colonne=10; //numero righe e colonne massimo possibile della matrice
const int num=100; //numero massimo di numeri pari o dispari presenti nella matrice

//prototipi
int numero_righe_e_colonne (int r);
void generamatrice(int r,int matrice[righe_colonne][righe_colonne]); 
void stampa (int r,int matrice[righe_colonne][righe_colonne]);
int generazione_vettorepari (int lunghezzapari, int r, int matrice[righe_colonne][righe_colonne], int vettpari[num]);
int calcolo_lunghezza_vettorepari (int lunghezzapari, int r, int matrice[righe_colonne][righe_colonne]);
int generazione_vettore_dispari (int lunghezzadispari, int r, int matrice[righe_colonne][righe_colonne], int vettdispari[num]);
int calcolo_lunghezza_vettoredispari (int lunghezzadispari, int r, int matrice[righe_colonne][righe_colonne]);
void stampa_vettore(int lunghezzavettore, int vettore[num]);


//programma principale
int main(){
	
	srand(time(0)); //inizializzazione seme
	
	int r; //indice righe e colonne
	
	r=numero_righe_e_colonne (r); //generazione numero di righe e colonne con un valore compreso tra 5 e 10
	
	cout<<"La matrice avra' "<<r<<" righe e "<<r<<" colonne\n\n";
	
   int matrice[righe_colonne][righe_colonne];
   
   cout<<"Ora uscira' a schermo una matrice casuale.\n\n";
   
   generamatrice(r, matrice);  //generazione matrice
   
   stampa(r, matrice); //stampa a schermo della matrice
   
   //1)Memorizzi in due vettori di uscita gli elementi pari e quelli dispari della matrice di pixel
   
   int lunghezzapari=0;
   int vettpari[lunghezzapari];
   
   generazione_vettorepari (lunghezzapari, r, matrice, vettpari); //generazione vettore pari
   
   lunghezzapari=calcolo_lunghezza_vettorepari (lunghezzapari, r, matrice); //calcolo lungheza vettore pari
   
   cout<<"\nIl vettore pari e' lungo (nel main): "<<lunghezzapari<<endl;
   
   cout<<"\nOra stampera' a schermo il vettore pari\n";
   
   stampa_vettore(lunghezzapari, vettpari); //stampa a schermo vettore pari
   
   int lunghezzadispari;
   int vettdispari[lunghezzadispari];
   
   generazione_vettore_dispari (lunghezzadispari, r, matrice, vettdispari); //generazione vettore dispari
   
   lunghezzadispari=calcolo_lunghezza_vettoredispari (lunghezzadispari, r, matrice); //calcolo lungheza vettore dispari
   
   cout<<"\nIl vettore dispari e' lungo (nel main): "<<lunghezzadispari<<endl;
   
   cout<<"\nOra stampera' a schermo il vettore dispari\n";
   
   stampa_vettore(lunghezzadispari, vettdispari); //stampa a schermo vettore dispari 
   
   cout<<"\n\n\n";

   return 0; 
}

//sottoprogrammi

//generazione numero di righe e colonne
int numero_righe_e_colonne (int r){
	r=5+rand()%5;
    return (r);
}

//generazione matrice
void generamatrice(int r, int matrice[righe_colonne][righe_colonne]){
   for(int i=0; i<r; i++){
       for(int j=0; j<r; j++){
          matrice[i][j]=rand()%100;
      }
  }
}

//stampa a schermo matrice
void stampa(int r, int matrice[righe_colonne][righe_colonne]){
   for (int i=0; i<r; i++){
   cout<<"\n";
   for (int j=0; j<r; j++){
      cout<<matrice[i][j]<<" ";
   }
   }
}

//generazione vettore pari

int generazione_vettorepari (int lunghezzapari, int r, int matrice[righe_colonne][righe_colonne], int vettpari[num]){
	int numeratore;
	int resto;
	lunghezzapari=0;
	for (int i=0; i<r; i++){
		for (int j=0; j<r; j++){
			numeratore=matrice[i][j];
			resto=numeratore%2;
			if (resto==0){
				vettpari[lunghezzapari]=numeratore;
				lunghezzapari++;
			}else{
			}
		}
	}
	cout<<"\nIl vettore pari e' lungo (nella funzione generazione vettore pari): "<<lunghezzapari<<endl;
	return (vettpari[lunghezzapari]); 
}

//calcolo lughezza vettore pari

int calcolo_lunghezza_vettorepari (int lunghezzapari, int r, int matrice[righe_colonne][righe_colonne]){
    int numeratore;
	int resto;
	lunghezzapari=0;
	for (int i=0; i<r; i++){
		for (int j=0; j<r; j++){
			numeratore=matrice[i][j];
			resto=numeratore%2;
			if (resto==0){
				lunghezzapari++;
			}else{
			}
		}
	}
	cout<<"\nIl vettore pari e' lungo (nella funzione calcolo lughezza vettore pari): "<<lunghezzapari<<endl;
	return (lunghezzapari);
}

//stampa a schermo vettore 

void stampa_vettore(int lunghezzavettore, int vettore[]){
	cout<<"\nIl vettore e' costituito dai seguenti elementi: \n";
	for (int i=0; i<lunghezzavettore; i++){
		cout<<vettore[i]<<" ";
	}
	cout<<"\n\n";
}

//generazione vettore dispari

int generazione_vettore_dispari (int lunghezzadispari, int r, int matrice[righe_colonne][righe_colonne], int vettdispari[num]){
	int numeratore;
	int resto;
	lunghezzadispari=0;
	for (int i=0; i<r; i++){
		for (int j=0; j<r; j++){
			numeratore=matrice[i][j];
			resto=numeratore%2;
			if (resto!=0){
				vettdispari[lunghezzadispari]=numeratore;
				lunghezzadispari++;
			}else{
			}	 
		}
	}
		cout<<"\nIl vettore dispari e' lungo (nella funzione generazione vettore dispari): "<<lunghezzadispari<<endl;
	return (vettdispari[lunghezzadispari]); 
}

//calcolo lunghezza vettore dispari

int calcolo_lunghezza_vettoredispari (int lunghezzadispari, int r, int matrice[righe_colonne][righe_colonne]){
	int numeratore;
	int resto;
	lunghezzadispari=0;
	for (int i=0; i<r; i++){
		for (int j=0; j<r; j++){
			numeratore=matrice[i][j];
			resto=numeratore%2;
			if (resto!=0){
				lunghezzadispari++;
			}else{
			}
		}
	}
		cout<<"\nIl vettore dispari e' lungo (nella funzione calcolo lunghezza vettore dispari): "<<lunghezzadispari<<endl;
	return (lunghezzadispari); 
}

25 Risposte

  • Re: Programma che genera matrice quadrata casuale e array con sottoprogrammi

    Ok, ho fatto un controllo grafico stampando a schermo la matrice in ogni funzione ed ho scoperto qual è il problema:
    cambia la matrice.
    Quindi la matrice non viene memorizzata.
    Ok, problema identificato, ma per la soluzione non so come fare.

    Codice di verifica che stampa a schermo la matrice in ogni singola funzione:
    
    /*
    Programma che genera una matrice quadrata numerica casuale e la stampa a schermo.
    Aggiungere:
    1)Memorizzi in due vettori di uscita gli elementi pari e quelli dispari della matrice di pixel, e successivamente li stampi a schermo
    */
    #include <iostream>
    #include <cstdlib>
    #include <ctime>
    
    using namespace std;
    //variabili globali
    const int righe_colonne=10; //numero righe e colonne massimo possibile della matrice
    const int num=100; //numero massimo di numeri pari o dispari presenti nella matrice
    
    //prototipi
    int numero_righe_e_colonne (int r);
    void generamatrice(int r,int matrice[righe_colonne][righe_colonne]); 
    void stampa (int r,int matrice[righe_colonne][righe_colonne]);
    int generazione_vettorepari (int lunghezzapari, int r, int matrice[righe_colonne][righe_colonne], int vettpari[num]);
    int calcolo_lunghezza_vettorepari (int lunghezzapari, int r, int matrice[righe_colonne][righe_colonne]);
    int generazione_vettore_dispari (int lunghezzadispari, int r, int matrice[righe_colonne][righe_colonne], int vettdispari[num]);
    int calcolo_lunghezza_vettoredispari (int lunghezzadispari, int r, int matrice[righe_colonne][righe_colonne]);
    void stampa_vettore(int lunghezzavettore, int vettore[num]);
    
    
    //programma principale
    int main(){
    	
    	srand(time(0)); //inizializzazione seme
    	
    	int r; //indice righe e colonne
    	
    	r=numero_righe_e_colonne (r); //generazione numero di righe e colonne con un valore compreso tra 5 e 10
    	
    	cout<<"La matrice avra' "<<r<<" righe e "<<r<<" colonne\n\n";
    	
       int matrice[righe_colonne][righe_colonne];
       
       cout<<"Ora uscira' a schermo una matrice casuale.\n\n";
       
       generamatrice(r, matrice);  //generazione matrice
       
       stampa(r, matrice); //stampa a schermo della matrice
       
       cout<<"\n";
       
       //1)Memorizzi in due vettori di uscita gli elementi pari e quelli dispari della matrice di pixel
       
       int lunghezzapari=0;
       int vettpari[lunghezzapari];
       
       generazione_vettorepari (lunghezzapari, r, matrice, vettpari); //generazione vettore pari
       
       lunghezzapari=calcolo_lunghezza_vettorepari (lunghezzapari, r, matrice); //calcolo lungheza vettore pari
       
       cout<<"\nIl vettore pari e' lungo (nel main): "<<lunghezzapari<<endl;
       
       cout<<"\nOra stampera' a schermo il vettore pari\n";
       
       stampa_vettore(lunghezzapari, vettpari); //stampa a schermo vettore pari
       
       int lunghezzadispari;
       int vettdispari[lunghezzadispari];
       
       generazione_vettore_dispari (lunghezzadispari, r, matrice, vettdispari); //generazione vettore dispari
       
       lunghezzadispari=calcolo_lunghezza_vettoredispari (lunghezzadispari, r, matrice); //calcolo lungheza vettore dispari
       
       cout<<"\nIl vettore dispari e' lungo (nel main): "<<lunghezzadispari<<endl;
       
       cout<<"\nOra stampera' a schermo il vettore dispari\n";
       
       stampa_vettore(lunghezzadispari, vettdispari); //stampa a schermo vettore dispari 
       
       cout<<"\n\n\n";
    
       return 0; 
    }
    
    //sottoprogrammi
    
    //generazione numero di righe e colonne
    int numero_righe_e_colonne (int r){
    	r=5+rand()%5;
        return (r);
    }
    
    //generazione matrice
    void generamatrice(int r, int matrice[righe_colonne][righe_colonne]){
       for(int i=0; i<r; i++){
           for(int j=0; j<r; j++){
              matrice[i][j]=rand()%100;
          }
      }
    }
    
    //stampa a schermo matrice
    void stampa(int r, int matrice[righe_colonne][righe_colonne]){
       for (int i=0; i<r; i++){
       cout<<"\n";
       for (int j=0; j<r; j++){
          cout<<matrice[i][j]<<" ";
       }
       }
    }
    
    //generazione vettore pari
    
    int generazione_vettorepari (int lunghezzapari, int r, int matrice[righe_colonne][righe_colonne], int vettpari[num]){
    	int numeratore;
    	int resto;
    	lunghezzapari=0;
    	cout<<"\nMatrice nelle funzione generazione_vettorepari:\n";
    	for (int i=0; i<r; i++){
    		cout<<"\n";
    		for (int j=0; j<r; j++){
    			cout<<matrice[i][j]<<" ";
    			numeratore=matrice[i][j];
    			resto=numeratore%2;
    			if (resto==0){
    				vettpari[lunghezzapari]=numeratore;
    				lunghezzapari++;
    			}else{
    			}
    		}
    	}
    	cout<<"\n\nIl vettore pari e' lungo (nella funzione generazione vettore pari): "<<lunghezzapari<<endl;
    	return (vettpari[lunghezzapari]); 
    }
    
    //calcolo lughezza vettore pari
    
    int calcolo_lunghezza_vettorepari (int lunghezzapari, int r, int matrice[righe_colonne][righe_colonne]){
        int numeratore;
    	int resto;
    	lunghezzapari=0;
    	cout<<"\nMatrice nelle funzione calcolo_lunghezza_vettorepari:\n";
    	for (int i=0; i<r; i++){
    		cout<<"\n";
    		for (int j=0; j<r; j++){
    			cout<<matrice[i][j]<<" ";
    			numeratore=matrice[i][j];
    			resto=numeratore%2;
    			if (resto==0){
    				lunghezzapari++;
    			}else{
    			}
    		}
    	}
    	cout<<"\n\nIl vettore pari e' lungo (nella funzione calcolo lughezza vettore pari): "<<lunghezzapari<<endl;
    	return (lunghezzapari);
    }
    
    //stampa a schermo vettore 
    
    void stampa_vettore(int lunghezzavettore, int vettore[]){
    	cout<<"\nIl vettore e' costituito dai seguenti elementi: \n";
    	for (int i=0; i<lunghezzavettore; i++){
    		cout<<vettore[i]<<" ";
    	}
    	cout<<"\n\n";
    }
    
    //generazione vettore dispari
    
    int generazione_vettore_dispari (int lunghezzadispari, int r, int matrice[righe_colonne][righe_colonne], int vettdispari[num]){
    	int numeratore;
    	int resto;
    	lunghezzadispari=0;
    	cout<<"\nMatrice nelle funzione generazione_vettore_dispari\n";
    	for (int i=0; i<r; i++){
    		cout<<"\n";
    		for (int j=0; j<r; j++){
    			cout<<matrice[i][j]<<" ";
    			numeratore=matrice[i][j];
    			resto=numeratore%2;
    			if (resto!=0){
    				vettdispari[lunghezzadispari]=numeratore;
    				lunghezzadispari++;
    			}else{
    			}	 
    		}
    	}
    		cout<<"\n\nIl vettore dispari e' lungo (nella funzione generazione vettore dispari): "<<lunghezzadispari<<endl;
    	return (vettdispari[lunghezzadispari]); 
    }
    
    //calcolo lunghezza vettore dispari
    
    int calcolo_lunghezza_vettoredispari (int lunghezzadispari, int r, int matrice[righe_colonne][righe_colonne]){
    	int numeratore;
    	int resto;
    	lunghezzadispari=0;
    	cout<<"\nMatrice nelle funzione calcolo_lunghezza_vettoredispari\n";
    	for (int i=0; i<r; i++){
    		cout<<"\n";
    		for (int j=0; j<r; j++){
    			cout<<matrice[i][j]<<" ";
    			numeratore=matrice[i][j];
    			resto=numeratore%2;
    			if (resto!=0){
    				lunghezzadispari++;
    			}else{
    			}
    		}
    	}
    		cout<<"\n\nIl vettore dispari e' lungo (nella funzione calcolo lunghezza vettore dispari): "<<lunghezzadispari<<endl;
    	return (lunghezzadispari); 
    }
    
  • Re: Programma che genera matrice quadrata casuale e array con sottoprogrammi

    Lascio pure gli screeshot di un'esecuzione del programma, così sono più chiaro e faccio risparmiare tempo:





  • Re: Programma che genera matrice quadrata casuale e array con sottoprogrammi

    Tutto dipende dal fatto che non dichiari i vettori con lunghezza 100 prima di usarli.

    int vettpari[num];
    int vettdispari[num];
  • Re: Programma che genera matrice quadrata casuale e array con sottoprogrammi

    oregon ha scritto:


    Tutto dipende dal fatto che non dichiari i vettori con lunghezza 100 prima di usarli.

    int vettpari[num];
    int vettdispari[num];
    Era questo il problema, mi è bastato dichiarare i vettori nel seguente modo:
    
    int vettpari[num]={10};
    int vettdispari[num]={10};
    
    per risolvere il problema, grazie ancora dell'aiuto!
  • Re: Programma che genera matrice quadrata casuale e array con sottoprogrammi

    Ragazzi una domanda di tipo tecnico: il programma funziona, quindi il codice è scritto bene.
    Però avreste qualche suggerimento per migliorarlo?

    Perché poiché una funzione può ritornare solo un valore, ho scritto una funzione nella quale ritorna il vettore, ed un'altra nella quale ritorna la lunghezza dello stesso.
    E' giusto?
    Avreste fatto anche voi così, oppure avreste adottato un'altra soluzione?
  • Re: Programma che genera matrice quadrata casuale e array con sottoprogrammi

    Perché

    ={10};

    ??

    Non serve ...
  • Re: Programma che genera matrice quadrata casuale e array con sottoprogrammi

    nabboc++ ha scritto:


    quindi il codice è scritto bene
    No, se un programma funziona non significa che il codice sia scritto bene.
    Anzi, il tuo codice ne è un esempio.
    Perché poiché una funzione può ritornare solo un valore, ho scritto una funzione nella quale ritorna il vettore, ed un'altra nella quale ritorna la lunghezza dello stesso.
    Una stessa funzione può fare tutto, restituire la lunghezza e modificare i dati del vettore passato come argomento.
    Avreste fatto anche voi così
    Ovviamente no ma dato che stai iniziando, può andare per ora, poi migliorerai.
    Ad esempio, queste
    int r;
    r=numero_righe_e_colonne(r);
    
    in realtà dovrebbe essere
    int r = numero_righe_e_colonne();
    
    e nota che il compilatore dovrebbe farti notare qualcosa circa l'inutile argomento r passato alla funzione.
  • Re: Programma che genera matrice quadrata casuale e array con sottoprogrammi

    Dal punto di vista logico il programma presenta parecchi problemi:
    - non dimenticarti di utilizzare gli underscore per rendere gli identificatori più chiari;
    - la funzione numero_righe_colonne() ritorna un numero compreso tra 5 e 9 e non tra 5 e 10... ti faccio una domanda, che valori può restituire la seguente operazione M%N?
    - premesso che te l'avevo già fatto notare in un altro post, spiegami a cosa serve l'argomento r della suddetta funzione! Le cose sono due... o fai una funzione senza argomenti che ritorna un int oppure una funzione con argomento passato per riferimento che non ritorna nulla (ossia di tipo void). A tal proposito hai studiato la differenza che sussiste tra passaggio per valore e passaggio per riferimento?
    - una volta fissata la costante righe_colonne (che nel seguito per brevità chiamerò R), la costante num diventa superflua, in quanto pari a R*R;

    nabboc++ ha scritto:


    Era questo il problema, mi è bastato dichiarare i vettori nel seguente modo:
    nt vettpari[num]={10};
    int vettdispari[num]={10};
    per risolvere il problema, grazie ancora dell'aiuto!
    Perchè non semplicemente
    int vettpari[num];
    int vettdispari[num];
    ?
    Cosa ti aspetti faccia quel 10 tra parentesi graffe?

    nabboc++ ha scritto:


    Perché poiché una funzione può ritornare solo un valore, ho scritto una funzione nella quale ritorna il vettore, ed un'altra nella quale ritorna la lunghezza dello stesso.
    E' giusto?
    Avreste fatto anche voi così, oppure avreste adottato un'altra soluzione?
    A tal proposito mi tocca richiederti se hai studiato il passaggio per riferimento e il passaggio per valore!
    Detto ciò, ti faccio presente che non solo l'adozione delle due diverse funzioni calcolo_lunghezza_vettorepari() e generazione_vettorepari() è superflua, ma anche la separazione tra funzioni per i numeri pari e funzioni per i numeri dispari è inutile... In pratica adesso per ottenere i 2 vettori e le relative lunghezze scorri la matrice ben 4 volte, quando invece utilizzando una funzione del genere:
    void genera_v_pari_dispari(int r, int &l_pari, int &l_dispari, int v_pari[R*R], int v_dispari[R*R], int matrice[R][R]);
    basterebbe scorrere la matrice una volta sola.

    Inoltre:
    - perchè la funzione generazione_vettorepari() dovrebbe ritornare un intero?
    - il valore ritornato (return (vettpari[lunghezzapari]);) fa parte di vettpari?
    - sempre nella stessa funzione dichiari le variabili numeratore e resto, secondo te sono così indispensabili?

    P.S.
    @oregon, scusami se su alcuni punti avevi già risposto, ma ormai il post l'avevo scritto...
  • Re: Programma che genera matrice quadrata casuale e array con sottoprogrammi

    Nippolo ha scritto:


    @oregon, scusami se su alcuni punti avevi già risposto, ma ormai il post l'avevo scritto...
    No problem ... meglio due post di uno ...
  • Re: Programma che genera matrice quadrata casuale e array con sottoprogrammi

    oregon ha scritto:


    Perché

    ={10};

    ??

    Non serve ...
    Si infatti hai ragione, prima avevo scritto solo int vettpari[num]; int vettdispari[num]; e non funzionava, mentre ora usando un altro IDE si...
    Misteri degli IDE.
  • Re: Programma che genera matrice quadrata casuale e array con sottoprogrammi

    oregon ha scritto:



    Una stessa funzione può fare tutto, restituire la lunghezza e modificare i dati del vettore passato come argomento.
    L'ultima che hai detto sarebbe molto utile, il procedimento però è da vedere.

    oregon ha scritto:


    Ad esempio, queste
    int r;
    r=numero_righe_e_colonne(r);
    
    in realtà dovrebbe essere
    int r = numero_righe_e_colonne();
    
    Chiaro, ho modificato, grazie per la correzione.

    oregon ha scritto:


    e nota che il compilatore dovrebbe farti notare qualcosa circa l'inutile argomento r passato alla funzione.
    No in realtà il compilatore non mi ha mai fatto uscire nessun warning al riguardo...
  • Re: Programma che genera matrice quadrata casuale e array con sottoprogrammi

    Se il programma funziona o no,

    NON E' MAI COLPA DEGLI IDE,

    ma piu' semplicemente perche',

    SE NON SCRIVI IL CODICE BENE,

    il comportamento del programma

    NON E' ASSICURATO SIA LO STESSO AD OGNI ESECUZIONE.

    Dire che' e' colpa dell'IDE e' come dire che e' colpa del gatto che sta facendo le fusa!

    E NEMMENO colpa del compilatore o della libreria: tieni presente che questi software sono usanti da moltissimi anni da centinaia di migliaia di persone che li usano/stressano in applicazioni infinitamente piu' complesse: TUTTI gli errori piu' banali, quelli meno banali, wuelli strani, ed anche quelli super strani, sono stati gia' risolti da tempo

    In pratica, E' COLPA TUA
  • Re: Programma che genera matrice quadrata casuale e array con sottoprogrammi

    Nippolo ha scritto:


    - non dimenticarti di utilizzare gli underscore per rendere gli identificatori più chiari;
    Chiaro, ho modificato il programma inserendo gli underscore ovunque fosse possibile.

    Nippolo ha scritto:


    - la funzione numero_righe_colonne() ritorna un numero compreso tra 5 e 9 e non tra 5 e 10...
    Si giusto, ho modificato, grazie per la correzione.

    Nippolo ha scritto:


    -ti faccio una domanda, che valori può restituire la seguente operazione M%N?
    Dipende dai valori di M ed N, '%' e l'operatore modulo, che restituisce 0 od 1 a seconda del resto della divisione.
    Ad esempio se M=10 ed N=2, il valore restituito sarà 0, mentre se M=10 ed N=3, il valore restituito sarà 1.

    Nippolo ha scritto:


    - premesso che te l'avevo già fatto notare in un altro post, spiegami a cosa serve l'argomento r della suddetta funzione! Le cose sono due... o fai una funzione senza argomenti che ritorna un int oppure una funzione con argomento passato per riferimento che non ritorna nulla (ossia di tipo void). A tal proposito hai studiato la differenza che sussiste tra passaggio per valore e passaggio per riferimento?
    'r' indica il numero di righe/colonne della matrice generata, sennò facciamo girare il ciclo for all'infinito?
    In realtà la funzione dovrebbe ritornare un vettore di interi, e di fatto lo fa, la stampa a schermo lo dimostra.
    Nel passaggio per valore si passano alla funzione delle copie delle variabili, quindi il valore della variabile non viene modificato nel programma che chiama la funzione, mentre nel passaggio per riferimento viene passato l'indirizzo e non la copia del valore della variabile.
    Diciamo che una cosa è capire cos'è il passaggio per riferimento, un'altra è usarlo...

    Nippolo ha scritto:


    - una volta fissata la costante righe_colonne (che nel seguito per brevità chiamerò R), la costante num diventa superflua, in quanto pari a R*R;
    Si giusto, corretto, grazie per la segnalazione.

    Nippolo ha scritto:


    Perchè non semplicemente
    int vettpari[num];
    int vettdispari[num];
    ?
    Cosa ti aspetti faccia quel 10 tra parentesi graffe?
    Come ho risposto prima ad oregon, dopo aver modificato e compilato il programma, eseguiva ma mi dava sempre errori nella stampa a schermo, come se non modificasse il file .exe dopo la compilazione.
    Ho usato un altro IDE che ha generato un altro .exe è tutto è filasciato liscio.

    Nippolo ha scritto:


    A tal proposito mi tocca richiederti se hai studiato il passaggio per riferimento e il passaggio per valore!
    Detto ciò, ti faccio presente che non solo l'adozione delle due diverse funzioni calcolo_lunghezza_vettorepari() e generazione_vettorepari() è superflua, ma anche la separazione tra funzioni per i numeri pari e funzioni per i numeri dispari è inutile... In pratica adesso per ottenere i 2 vettori e le relative lunghezze scorri la matrice ben 4 volte, quando invece utilizzando una funzione del genere:
    void genera_v_pari_dispari(int r, int &l_pari, int &l_dispari, int v_pari[R*R], int v_dispari[R*R], int matrice[R][R]);
    basterebbe scorrere la matrice una volta sola.
    Ho capito cosa sono, ma visto che non credo di saperli usare bene, ho scritto il programma evitando di usarli.
    Interessante, vedo di provare a fare una funzione del genere.

    Nippolo ha scritto:


    - perchè la funzione generazione_vettorepari() dovrebbe ritornare un intero?
    In realtà dovrebbe ritornare tutto il vettore di interi...

    Nippolo ha scritto:


    - il valore ritornato (return (vettpari[lunghezzapari]);) fa parte di vettpari?
    Come sopra, in realtà dovrebbe ritornare tutto il vettore di interi...

    Nippolo ha scritto:


    - sempre nella stessa funzione dichiari le variabili numeratore e resto, secondo te sono così indispensabili?
    La variabile numeratore come mi hai fatto notare è superflua quindi l'ho rimossa, l'altra mi sembra necessaria.


    Codice funzionante con le correzioni datemi molto gentilmente dagli altri utenti:
    
    /*
    Programma che genera una matrice quadrata numerica casuale e la stampa a schermo.
    Aggiungere:
    1)Memorizzi in due vettori di uscita gli elementi pari e quelli dispari della matrice di pixel, e successivamente li stampi a schermo
    */
    #include <iostream>
    #include <cstdlib>
    #include <ctime>
    
    using namespace std;
    //variabili globali
    const int R=10; //numero righe e colonne massimo possibile della matrice
    
    //prototipi
    int numero_righe_e_colonne (int r);
    void genera_matrice(int r,int matrice[R][R]); 
    void stampa (int r,int matrice[R][R]);
    int generazione_vettorepari (int lunghezza_pari, int r, int matrice[R][R], int vettore_pari[R*R]);
    int calcolo_lunghezza_vettorepari (int lunghezza_pari, int r, int matrice[R][R]);
    int generazione_vettore_dispari (int lunghezza_dispari, int r, int matrice[R][R], int vettore_dispari[R*R]);
    int calcolo_lunghezza_vettoredispari (int lunghezza_dispari, int r, int matrice[R][R]);
    void stampa_vettore(int lunghezza_vettore, int vettore[R*R]);
    
    
    //programma principale
    int main(){
       
       srand(time(0)); //inizializzazione seme
       
       int r=numero_righe_e_colonne (r); //generazione numero di righe e colonne con un valore compreso tra 5 e 10
       
       cout<<"La matrice avra' "<<r<<" righe e "<<r<<" colonne\n\n";
       
       int matrice[R][R];
       
       cout<<"Ora uscira' a schermo una matrice casuale.\n\n";
       
       genera_matrice(r, matrice);  //generazione matrice
       
       stampa(r, matrice); //stampa a schermo della matrice
       
       //1)Memorizzi in due vettori di uscita gli elementi pari e quelli dispari della matrice di pixel
       
       int lunghezza_pari=0;
       int vettore_pari[R*R];
       
       generazione_vettorepari (lunghezza_pari, r, matrice, vettore_pari); //generazione vettore pari
       
       lunghezza_pari=calcolo_lunghezza_vettorepari (lunghezza_pari, r, matrice); //calcolo lungheza vettore pari
       
       cout<<"\nIl vettore pari e' lungo (nel main): "<<lunghezza_pari<<endl;
       
       cout<<"\nOra stampera' a schermo il vettore pari\n";
       
       stampa_vettore(lunghezza_pari, vettore_pari); //stampa a schermo vettore pari
       
       int lunghezza_dispari;
       int vettore_dispari[R*R];
       
       generazione_vettore_dispari (lunghezza_dispari, r, matrice, vettore_dispari); //generazione vettore dispari
       
       lunghezza_dispari=calcolo_lunghezza_vettoredispari (lunghezza_dispari, r, matrice); //calcolo lungheza vettore dispari
       
       cout<<"\nIl vettore dispari e' lungo (nel main): "<<lunghezza_dispari<<endl;
       
       cout<<"\nOra stampera' a schermo il vettore dispari\n";
       
       stampa_vettore(lunghezza_dispari, vettore_dispari); //stampa a schermo vettore dispari 
       
       cout<<"\n\n\n";
    
       return 0; 
    }
    
    //sottoprogrammi
    
    //generazione numero di righe e colonne
    int numero_righe_e_colonne (int r){
       r=5+rand()%6;
        return (r);
    }
    
    //generazione matrice
    void genera_matrice(int r, int matrice[R][R]){
       for(int i=0; i<r; i++){
           for(int j=0; j<r; j++){
              matrice[i][j]=rand()%100;
          }
      }
    }
    
    //stampa a schermo matrice
    void stampa(int r, int matrice[R][R]){
       for (int i=0; i<r; i++){
       cout<<"\n";
       for (int j=0; j<r; j++){
          cout<<matrice[i][j]<<" ";
       }
       }
    }
    
    //generazione vettore pari
    
    int generazione_vettorepari (int lunghezza_pari, int r, int matrice[R][R], int vettore_pari[R*R]){
       int resto;
       lunghezza_pari=0;
       for (int i=0; i<r; i++){
          for (int j=0; j<r; j++){
             resto=matrice[i][j]%2;
             if (resto==0){
                vettore_pari[lunghezza_pari]=matrice[i][j];
                lunghezza_pari++;
             }else{
             }
          }
       }
       cout<<"\nIl vettore pari e' lungo (nella funzione generazione vettore pari): "<<lunghezza_pari<<endl;
       return (vettore_pari[lunghezza_pari]); 
    }
    
    //calcolo lughezza vettore pari
    
    int calcolo_lunghezza_vettorepari (int lunghezza_pari, int r, int matrice[R][R]){
       int resto;
       lunghezza_pari=0;
       for (int i=0; i<r; i++){
          for (int j=0; j<r; j++){
             resto=matrice[i][j]%2;
             if (resto==0){
                lunghezza_pari++;
             }else{
             }
          }
       }
       cout<<"\nIl vettore pari e' lungo (nella funzione calcolo lughezza vettore pari): "<<lunghezza_pari<<endl;
       return (lunghezza_pari);
    }
    
    //stampa a schermo vettore 
    
    void stampa_vettore(int lunghezza_vettore, int vettore[]){
       cout<<"\nIl vettore e' costituito dai seguenti elementi: \n";
       for (int i=0; i<lunghezza_vettore; i++){
          cout<<vettore[i]<<" ";
       }
       cout<<"\n\n";
    }
    
    //generazione vettore dispari
    
    int generazione_vettore_dispari (int lunghezza_dispari, int r, int matrice[R][R], int vettore_dispari[R*R]){
       int resto;
       lunghezza_dispari=0;
       for (int i=0; i<r; i++){
          for (int j=0; j<r; j++){
             resto=matrice[i][j]%2;
             if (resto!=0){
                vettore_dispari[lunghezza_dispari]=matrice[i][j];
                lunghezza_dispari++;
             }else{
             }    
          }
       }
          cout<<"\nIl vettore dispari e' lungo (nella funzione generazione vettore dispari): "<<lunghezza_dispari<<endl;
       return (vettore_dispari[lunghezza_dispari]); 
    }
    
    //calcolo lunghezza vettore dispari
    
    int calcolo_lunghezza_vettoredispari (int lunghezza_dispari, int r, int matrice[R][R]){
       int resto;
       lunghezza_dispari=0;
       for (int i=0; i<r; i++){
          for (int j=0; j<r; j++){
             resto=matrice[i][j]%2;
             if (resto!=0){
                lunghezza_dispari++;
             }else{
             }
          }
       }
          cout<<"\nIl vettore dispari e' lungo (nella funzione calcolo lunghezza vettore dispari): "<<lunghezza_dispari<<endl;
       return (lunghezza_dispari); 
    }
    
  • Re: Programma che genera matrice quadrata casuale e array con sottoprogrammi

    migliorabile ha scritto:


    Se il programma funziona o no,

    NON E' MAI COLPA DEGLI IDE,

    ma piu' semplicemente perche',

    SE NON SCRIVI IL CODICE BENE,

    il comportamento del programma

    NON E' ASSICURATO SIA LO STESSO AD OGNI ESECUZIONE.

    Dire che' e' colpa dell'IDE e' come dire che e' colpa del gatto che sta facendo le fusa!

    E NEMMENO colpa del compilatore o della libreria: tieni presente che questi software sono usanti da moltissimi anni da centinaia di migliaia di persone che li usano/stressano in applicazioni infinitamente piu' complesse: TUTTI gli errori piu' banali, quelli meno banali, wuelli strani, ed anche quelli super strani, sono stati gia' risolti da tempo

    In pratica, E' COLPA TUA
    Non lo metto in dubbio, sono sicuro che hai ragione, ma non è la prima che Dev-C++ mi fa uno scherzetto del genere...
Devi accedere o registrarti per scrivere nel forum
25 risposte