Come generare una matrice casuale 10x10 tramite sottoprogrammi

di il
14 risposte

Come generare una matrice casuale 10x10 tramite sottoprogrammi

Salve a tutti, ho da poco iniziato a programmare con c++ (come potrete notare dal nickname) e volevo avere una delucidazione, visto che non ho trovato in rete ciò che cercavo.
Come da titolo, (1) vorrei sapere come generare una matrice casuale 10x10 tramite sottoprogrammi.
Lo so fare inserendo la funzione nel main, ma non so proprio come tramite sottoprogrammi.
2)Perché quando dichiaro una matrice come variabile globale non posso inserire nelle parentesi quadre [] un valore intero dichiarato prima ma per forza un valore numerico? (sennò durante la compilazione mi da errore).
Lo so che sono domande che possono sembrare stupide, ma avendo cominciato da poco anche le cose più stupide mi sembrano difficili.
Grazie in anticipo.

Questo è come avevo impostato il programma:

/*
Programma che genera una matrice numerica casuale 10x10 e la stampa a schermo
*/
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

using namespace std;
//variabili globali
int i,j;
int r=10;
int c=10;
int matrice[10][10];  /*perché quando dichiaro una matrice come variabile globale non posso inserire
un valore intero dichiarato prima (ad esempio in questo caso r o c) ma per forza un valore numerico?*/

//prototipi

void stampa ();

//programma principale

int main(){
	int num;
	
cout<<"Ora uscira' a schermo una matrice casuale 10x10.\n\n";
	
	//generazione matrice (questa funzione dovrei farla diventare un sottoprogramma)
	
	for(i=0; i<10; i++){ 
	    for(j=0; j<10; j++){
	    	num=rand()%100;
	    	matrice[i][j]=num;
		}
   }
   
   //stampa a schermo della matrice
	
	stampa();
	
	
	cout<<"\n\n\n";
	
	system("pause");
}

//sottoprogrammi

//stampa a schermo matrice

void stampa(){
for (i=0; i<r; i++){
	cout<<"\n";
	for (int j=0; j<c; j++){
		cout<<matrice[i][j]<<" ";
	}
}
return;
}

14 Risposte

  • Re: Come generare una matrice casuale 10x10 tramite sottoprogrammi

    - le librerie stdio, stdlib e math sono superflue;
    - evita di usare il system pause, tanto se lanci il programma tramite IDE non serve;
    - cerca di non utilizzare variabili globali;
    2)Perché quando dichiaro una matrice come variabile globale non posso inserire nelle parentesi quadre [] un valore intero dichiarato prima ma per forza un valore numerico? (sennò durante la compilazione mi da errore).
    - secondo lo standard del C++, la dimensione degli array deve essere una costante. Se vuoi utilizzare r e c per definire la matrice devi dichiarare r e c come costanti utilizzando lo specificatore const;
    - prima di utilizzare la funzione rand(), devi inizializzare il seme con cui verranno creati i numeri pseudocasuali utilizzando la funzione srand();
    - quel return nella funzione stampa() è inutile;
    - la variabile num che utilizzi nel main è superflua, puoi anche scrivere direttamente matrice[j]=rand()%100;
    (1) vorrei sapere come generare una matrice casuale 10x10 tramite sottoprogrammi.
    Lo so fare inserendo la funzione nel main, ma non so proprio come tramite sottoprogrammi.

    - di preciso cosa non ti è chiaro nell'utilizzo delle funzioni?
  • Re: Come generare una matrice casuale 10x10 tramite sottoprogrammi

    Nippolo ha scritto:


    - le librerie stdio, stdlib e math sono superflue;
    Ho rimosso stdio e math, ma purtroppo devo lasciare stdlib, sennò mi da l'errore:
    "[Error] 'rand' was not declared in this scope".

    Nippolo ha scritto:


    - evita di usare il system pause, tanto se lanci il programma tramite IDE non serve;
    Ok tolto.

    Nippolo ha scritto:


    - cerca di non utilizzare variabili globali;
    Ho provato a rimuoverle e a dichiararle nei singoli programmi, ma mi dava una quantità infinita di errori.

    Nippolo ha scritto:


    - secondo lo standard del C++, la dimensione degli array deve essere una costante. Se vuoi utilizzare r e c per definire la matrice devi dichiarare r e c come costanti utilizzando lo specificatore const;
    Non lo sapevo, ho corretto come su tua indicazione, grazie.

    Nippolo ha scritto:


    - prima di utilizzare la funzione rand(), devi inizializzare il seme con cui verranno creati i numeri pseudocasuali utilizzando la funzione srand();
    Che significa?
    Potresti farmi un esempio con un pezzo di codice?

    Nippolo ha scritto:


    - quel return nella funzione stampa() è inutile;
    Ok rimosso.

    Nippolo ha scritto:


    - la variabile num che utilizzi nel main è superflua, puoi anche scrivere direttamente matrice[j]=rand()%100;

    Ho corretto come su tua indicazione, grazie.

    Nippolo ha scritto:


    (1) vorrei sapere come generare una matrice casuale 10x10 tramite sottoprogrammi.
    Lo so fare inserendo la funzione nel main, ma non so proprio come tramite sottoprogrammi.

    - di preciso cosa non ti è chiaro nell'utilizzo delle funzioni?

    Ho cercato un esempio su internet che mostrasse come si fa ma niente, tutte matrici generate direttamente nel main, mai tramite sottoprogrammi.


    Ecco il programma con le tue correzioni (dove fosse possibile applicarle):
    
    /*
    Programma che genera una matrice numerica casuale 10x10 e la stampa a schermo
    */
    #include <iostream>
    #include <stdlib.h>
    
    using namespace std;
    //variabili globali
    int i,j;
    const int r=10;
    const int c=10;
    int matrice[r][c];
    
    //prototipi
    
    void stampa ();
    
    //programma principale
    
    int main(){
       
    cout<<"Ora uscira' a schermo una matrice casuale 10x10.\n\n";
       
       //generazione matrice (questa funzione dovrei farla diventare un sottoprogramma)
       
       for(i=0; i<10; i++){ 
           for(j=0; j<10; j++){
              matrice[i][j]=rand()%100;
          }
       }
       
       //stampa a schermo della matrice
       
       stampa();
       
       
       cout<<"\n\n\n";
       
       system("pause");
    }
    
    //sottoprogrammi
    
    //stampa a schermo matrice
    
    void stampa(){
    for (i=0; i<r; i++){
       cout<<"\n";
       for (int j=0; j<c; j++){
          cout<<matrice[i][j]<<" ";
       }
    }
    }
    
  • Re: Come generare una matrice casuale 10x10 tramite sottoprogrammi

    Non so se sia compatibile con le richieste del tuo esercizio, nè se può esserti utile o esserti d'impaccio, però ricordo che in un testo che ho letto si indicava anche la possibilità di "simulare" il comportamento di una matrice usando un semplice vettore e una formula o una apposita funzione per accedere ai suoi elementi. Più o meno era una cosa di questo genere:
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    
    #define QRIGHE      10U // quantita' di righe
    #define QCOLONNE    10U // quantita' di colonne
    
    void inizializza_matrice( int *m, unsigned int qr, unsigned int qc );
    void mostra_matrice( const int *m, unsigned int qr, unsigned int qc );
    int elemento_matrice( const int *m, unsigned int qc,
                          unsigned int ir, unsigned int ic );
    
    int main() {
        int m[QRIGHE*QCOLONNE];
    
        srand( time(NULL) ); // passando ad ogni lancio un numero diverso a srand(),
                             // le chiamate successive a rand() daranno serie
                             // numeriche pseudo casuali diverse; non chiamando
                             // srand() con numeri diversi, rand() dara' ad ogni
                             // lancio del programma la stessa serie numerica
                             // pseudocasuale
    
        inizializza_matrice( m, QRIGHE, QCOLONNE );
        mostra_matrice( m, QRIGHE, QCOLONNE );
    
        printf( "\nL'elemento in terza riga, quinta colonna e' %d.\n\n",
                elemento_matrice( m, QCOLONNE, 2, 4 ) );
    
        return 0;
    }
    
    void inizializza_matrice( int *m, unsigned int qr, unsigned int qc ) {
        unsigned int r, c;
    
        for( r=0; r<qr; ++r ) {
            for( c=0; c<qc; ++c ) {
                m[r*qc+c] = rand()%100;
            }
        }
    }
    
    /*==============================================================================
    Premessa
    c<qc-1?' ':'\n' serve solo per fare in modo che tra numero e numero sulla stessa
    riga venga inserito uno spazio e che a fine riga venga invece inserito un '\n'.
    Lo stesso risultato si poteva ottenere con...
    
        for( r=0; r<qr; ++r ) {
            for( c=0; c<qc; ++c ) {
                printf( "%5d", m[r*qc+c] );
            }
    
            printf( "\n" );
        }
    ==============================================================================*/
    
    void mostra_matrice( const int *m, unsigned int qr, unsigned int qc ) {
        unsigned int r, c;
    
        for( r=0; r<qr; ++r ) {
            for( c=0; c<qc; ++c ) {
                printf( "%5d%c", m[r*qc+c], c<qc-1?' ':'\n' );
            }
        }
    }
    
    int elemento_matrice( const int *m, unsigned int qc,
                          unsigned int ir, unsigned int ic ) {
        return m[ir*qc+ic];
    }
    Non è un suggerimento, è solo una cosa che mi hai fatto tornare in mente.
  • Re: Come generare una matrice casuale 10x10 tramite sottoprogrammi

    Ho rimosso stdio e math, ma purtroppo devo lasciare stdlib, sennò mi da l'errore:
    "[Error] 'rand' was not declared in this scope".
    Evidentemente la mia versione di iostream contiene la funzione rand(), mentre la tua no.
    Che significa?
    Potresti farmi un esempio con un pezzo di codice?
    I numeri pseudocasuali sono generati a partire da un valore detto seme. Per ogni valore del seme, la funzione rand() restituisce una prefissata sequenza di numeri pseudocasuali (cmq variabile da macchina a macchina). Se il seme non viene inizializzato, esso sarà inizializzato di default ad 1, ossia non richiamare la funzione srand() coincide con la chiamata srand(1). In pratica se provi a lanciare più volte il seguente codice:
    #include <iostream>
    
    using namespace std;
    
    int main()
    {
        srand(1);
        for(unsigned int i = 0; i < 10; ++i)
        {
            cout << rand() << endl;
        }
    }
    oppure
    #include <iostream>
    
    using namespace std;
    
    int main()
    {
        for(unsigned int i = 0; i < 10; ++i)
        {
            cout << rand() << endl;
        }
    }
    otterrai sempre lo stesso output.
    Bisogna quindi trovare un modo per inizializzare il seme con un valore diverso ogni volta che eseguiamo il programma, ma come possiamo farlo? La soluzione spesso adottata è quella di inizializzare il seme ricorrendo alla funzione time(0) (per usarla bisogna includere la libreria ctime), che restituisce un valore legato all'orario in cui il programma è stato lanciato.
    Lanciando il seguente programma infatti otterrai di volta in volta output diversi:
    #include <iostream>
    #include <ctime>
    
    using namespace std;
    
    int main()
    {
        srand(time(0));
        for(unsigned int i = 0; i < 10; ++i)
        {
            cout << rand() << endl;
        }
    }
    Ho provato a rimuoverle e a dichiararle nei singoli programmi, ma mi dava una quantità infinita di errori.
    Comprendere la genesi di quegli errori significa capire come funzionano i sottoprogrammi, quindi è un argomento su cui vale la pena soffermarsi.
    Se ti va quindi puoi postare quel codice e poi insieme si ragiona sui vari errori.
  • Re: Come generare una matrice casuale 10x10 tramite sottoprogrammi

    Grazie specialmente a @nippolo per la spiegazione sull'inizializzazione del seme, ma anche ai contributi degli altri.
    Il problema principale è che sono stupido e che non avevo spiegato il problema bene.
    Dichiarando le variabili come globali invece che locali, risolvo il problema (cioè genero la matrice casuale 10x10 con un sottoprogramma), mentre invece prima dichiarandole localmente c'era una montagna di errori.
    Provo da solo a farlo con le variabili locali, e proprio nel caso non ci riesco torno a chiedere qui.
    Grazie ancora per l'aiuto, veramente gentilissimi.

    Qui sotto il codice per la generazione di una matrice casuale 10x10 con variabili globali e sottoprogrammi:
    
    /*
    Programma che genera una matrice numerica casuale 10x10 e la stampa a schermo
    */
    #include <iostream>
    #include <stdlib.h>
    #include <ctime>
    
    using namespace std;
    
    
    //variabili globali
    int i,j;
    const int r=10;
    const int c=10;
    int matrice[r][c];
    
    //prototipi
    
    void generamatrice();
    void stampa ();
    
    //programma principale
    
    int main(){
       
    cout<<"Ora uscira' a schermo una matrice casuale 10x10.\n\n";
       
       //generazione matrice
       
       generamatrice();
       
       //stampa a schermo della matrice
       
       stampa();
       
       
       cout<<"\n\n\n";
       
    }
    
    //sottoprogrammi
    
    //generazione matrice
    
    void generamatrice(){
    	srand(time(0));
    for(i=0; i<10; i++){ 
           for(j=0; j<10; j++){
              matrice[i][j]=rand()%100;
          }
       }
    };
    
    //stampa a schermo matrice
    
    void stampa(){
    for (i=0; i<r; i++){
       cout<<"\n";
       for (int j=0; j<c; j++){
          cout<<matrice[i][j]<<" ";
       }
    }
    };
    
  • Re: Come generare una matrice casuale 10x10 tramite sottoprogrammi

    Ok, ho fatto il codice che genera una matrice casuale 10x10 con i sottoprogrammi e le variabili locali.

    Una sola domanda: non esiste un metodo più comodo invece di dover dichiarare ogni volta di nuovo tutte le variabili in ogni singolo sottoprogramma?

    Qui sotto il codice per la generazione di una matrice casuale 10x10 con variabili locali e sottoprogrammi:
    
    /*
    Programma che genera una matrice numerica casuale 10x10 e la stampa a schermo
    */
    #include <iostream>
    #include <stdlib.h>
    #include <ctime>
    
    using namespace std;
    
    //prototipi
    
    void generamatrice();
    void stampa ();
    
    //programma principale
    
    int main(){
       
    cout<<"Ora uscira' a schermo una matrice casuale 10x10.\n\n";
       
       //generazione matrice
       
       generamatrice();
       
       //stampa a schermo della matrice
       
       stampa();
       
       
       cout<<"\n\n\n";
       
    }
    
    //sottoprogrammi
    
    //generazione matrice
    
    void generamatrice(){
    	int i,j;
    	const int r=10;
        const int c=10;
        int matrice[r][c];
        
    	srand(time(0));
    for(i=0; i<r; i++){ 
           for(j=0; j<c; j++){
              matrice[i][j]=rand()%100;
          }
       }
    };
    
    //stampa a schermo matrice
    
    void stampa(){
    	int i,j;
    	const int r=10;
        const int c=10;
        int matrice[r][c];
        
    for (i=0; i<r; i++){
       cout<<"\n";
       for (int j=0; j<c; j++){
          cout<<matrice[i][j]<<" ";
       }
    }
    };
    
  • Re: Come generare una matrice casuale 10x10 tramite sottoprogrammi

    Il codice non è corretto. Lo hai provato?

    La matrice deve essere una sola, passata alle due funzioni come parametro.
  • Re: Come generare una matrice casuale 10x10 tramite sottoprogrammi

    Q8 quanto detto da oregon. Aggiungo alcune considerazioni:
    - il seme andrebbe inizializzato una sola volta, ma ipotizzando di invocare generamatrice() più volte, avremo come conseguenza che anche la funzione srand() sarebbe richiamata più volte. Soluzione? Inizializzare il seme nel main;
    - ho provato il codice (spero che lo abbia fatto anche tu) ed effettivamente ritorna un output accettabile, ma ti invito ad aggiungere all'inizio della funzione stampa() la seguente riga di codice:
    int l = 1, m = 5, n = -54, p = 32;
    Prova a lanciare il programma adesso, l'output è ancora accettabile? Se la risposta è no, come mai? visto che non abbiamo fatto nulla che dovrebbe incidere sul corretto funzionamento del programma? La risposta se vuoi possiamo fornirtela, ma il punto è che c'è qualcosa che non va nel codice che hai postato.
    A tal proposito sai cosa si intende con visibilità e tempo di vita di una variabile?
  • Re: Come generare una matrice casuale 10x10 tramite sottoprogrammi

    oregon ha scritto:


    Il codice non è corretto. Lo hai provato?
    Si, l'ho provato e funziona.

    oregon ha scritto:


    La matrice deve essere una sola, passata alle due funzioni come parametro.
    Ci ho provato, ma ogni volta mi dava una quantità infinita di errori, per questo poi l'ho dichiarata come variabile globale, perché così risolvevo.
    Ma visto che come ha detto giustamente @Nippolo, le variabili globali bisogna evitare di usarle, eccomi qui.


    Qui sotto il codice NON funzionante, nel quale ho provato a passare la matrice come parametro.
    
    /*
    Programma che genera una matrice numerica casuale 10x10 e la stampa a schermo
    */
    #include <iostream>
    #include <stdlib.h>
    #include <ctime>
    
    using namespace std;
    //variabili globali
    const int r=10;
    const int c=10; //le ho rese variabili globali poiché sono costanti
    
    //prototipi
    
    void generamatrice(int matrice[r][c]);
    void stampa (int matrice[r][c]);
    
    //programma principale
    
    int main(){
    	int matrice[r][c];
       
    cout<<"Ora uscira' a schermo una matrice casuale 10x10.\n\n";
        
       srand(time(0)); //inizializzazione seme
       
       //generazione matrice
       
       generamatrice(matrice[r][c]);
       
       //stampa a schermo della matrice
       
       stampa(matrice[r][c]);
       
       
       cout<<"\n\n\n";
       
    }
    
    //sottoprogrammi
    
    //generazione matrice
    
    void generamatrice(matrice[r][c]){
    	int i,j;
    for(i=0; i<r; i++){ 
           for(j=0; j<c; j++){
              matrice[i][j]=rand()%100;
          }
       }
    };
    
    //stampa a schermo matrice
    
    void stampa(matrice[r][c]){
    	int i,j;
    for (i=0; i<r; i++){
       cout<<"\n";
       for (int j=0; j<c; j++){
          cout<<matrice[i][j]<<" ";
       }
    }
    };
    
    Qui sotto lo screenshot con gli errori dati dal compilatore:
  • Re: Come generare una matrice casuale 10x10 tramite sottoprogrammi

    Nippolo ha scritto:


    Q8 quanto detto da oregon. Aggiungo alcune considerazioni:
    - il seme andrebbe inizializzato una sola volta, ma ipotizzando di invocare generamatrice() più volte, avremo come conseguenza che anche la funzione srand() sarebbe richiamata più volte. Soluzione? Inizializzare il seme nel main;
    Ok corretto come su tua indicazione, grazie.

    Nippolo ha scritto:


    - ho provato il codice (spero che lo abbia fatto anche tu) ed effettivamente ritorna un output accettabile,
    Il codice lo provo ogni volta prima di postarlo qui sopra, mi sembra normale.

    Nippolo ha scritto:


    ma ti invito ad aggiungere all'inizio della funzione stampa() la seguente riga di codice:
    int l = 1, m = 5, n = -54, p = 32;
    Prova a lanciare il programma adesso, l'output è ancora accettabile? Se la risposta è no, come mai? visto che non abbiamo fatto nulla che dovrebbe incidere sul corretto funzionamento del programma? La risposta se vuoi possiamo fornirtela, ma il punto è che c'è qualcosa che non va nel codice che hai postato.
    Ho fatto la modifica da te indicata e l'output è ancora accettabile, posto anche il codice qui sotto.
    Ok, c'è qualcosa che non va nel codice che ho postato, va benissimo, sto ancora imparando (il nickname non è stato scelto a caso) e penso sia normale commettere degli errori.

    Codice funzionante con aggiunta suggerita da Nippolo:
    
    /*
    Programma che genera una matrice numerica casuale 10x10 e la stampa a schermo
    */
    #include <iostream>
    #include <stdlib.h>
    #include <ctime>
    
    using namespace std;
    
    //prototipi
    
    void generamatrice();
    void stampa ();
    
    //programma principale
    
    int main(){
       
    cout<<"Ora uscira' a schermo una matrice casuale 10x10.\n\n";
       
       //generazione matrice
       
       generamatrice();
       
       //stampa a schermo della matrice
       
       stampa();
       
       
       cout<<"\n\n\n";
       
    }
    
    //sottoprogrammi
    
    //generazione matrice
    
    void generamatrice(){
       int i,j;
       const int r=10;
        const int c=10;
        int matrice[r][c];
        
       srand(time(0));
    for(i=0; i<r; i++){ 
           for(j=0; j<c; j++){
              matrice[i][j]=rand()%100;
          }
       }
    };
    
    //stampa a schermo matrice
    
    void stampa(){
    	int l = 1, m = 5, n = -54, p = 32; //riga di codice aggiunta su indicazione di Nippolo
       int i,j;
       const int r=10;
        const int c=10;
        int matrice[r][c];
        
    for (i=0; i<r; i++){
       cout<<"\n";
       for (int j=0; j<c; j++){
          cout<<matrice[i][j]<<" ";
       }
    }
    };
    

    Nippolo ha scritto:


    A tal proposito sai cosa si intende con visibilità e tempo di vita di una variabile?
    Penso di si, il tempo di vita di una variabile indica dove la variabile esiste, ad esempio se la dichiariamo nel main esisterà solo nel main, mentre se la dichiariamo nel sottoprogramma esisterà solo all'interno del sottoprogramma.
    Questo era il motivo per il quale le avevo dichiarate come variabili globali, perché dovevano essere usate più volte, e per evitare dichiarazioni su dichiarazioni (e poiché non riuscivo a passarle alle funzioni come parametri).

    Mentre invece visibilità non so che si intenda...
  • Re: Come generare una matrice casuale 10x10 tramite sottoprogrammi

    Ho fatto la modifica da te indicata e l'output è ancora accettabile, posto anche il codice qui sotto.
    Ok, c'è qualcosa che non va nel codice che ho postato, va benissimo, sto ancora imparando (il nickname non è stato scelto a caso) e penso sia normale commettere degli errori.

    Codice funzionante con aggiunta suggerita da Nippolo
    ...
    Output senza l'aggiunta di quella riga di codice:

    come avevo già detto l'output è accettabile (tutti i 100 valori sono compresi tra 0 e 99).
    Output con l'aggiunta di quella riga di codice:

    come vedi l'output non è accettabile.
    Il motivo è proprio legato al concetto di tempo di vita di una variabile. Cito le tue parole:
    ... il tempo di vita di una variabile indica dove la variabile esiste, ad esempio se la dichiariamo nel main esisterà solo nel main, mentre se la dichiariamo nel sottoprogramma esisterà solo all'interno del sottoprogramma.
    Consideriamo la funzione generamatrice(), la variabile matrice che vai a riempire nasce e muore all'interno di quel sottoprogramma! Di ritorno nel main non ci sarà più alcuna traccia di quella matrice. Quindi ti chiedi "come mai allora il codice ritorna un output accettabile?" Evidentemente quando nella funzione stampa() dichiari la nuova variabile matrice, essa va ad occupare le stesse porzioni di memoria in cui si trovava la matrice dichiarata nell'altro sottoprogramma e quindi, visto che quella porzione di memoria non è stata modificata, ti restituirà un output accettabile coincidente con la matrice generata dalla funzione generamatrice().
    Piccola precisazione, nel momento in cui una variabile smette di esistere si intende che la porzione di memoria che essa occupava si è resa disponibile e può quindi essere sovrascritta, ma se ciò non avviene ovviamente quelle locazioni di memoria conterranno dati che coincidono con l'ultima configurazione assunta dalla suddetta variabile.
    In questo discorso si inserisce la riga che ti avevo chiesto di aggiungere... nel momento in cui vai a dichiarare delle nuove variabili ci sarà una certa probabilità di andare a modificare lo stato attuale della memoria.
    Ci ho provato, ma ogni volta mi dava una quantità infinita di errori, per questo poi l'ho dichiarata come variabile globale, perché così risolvevo.
    Ma visto che come ha detto giustamente @Nippolo, le variabili globali bisogna evitare di usarle, eccomi qui.


    Qui sotto il codice NON funzionante, nel quale ho provato a passare la matrice come parametro.
    ...
    - nei prototipi delle funzioni basta inserire il tipo delle variabili, l'identificativo è superfluo;
    - nella definizione delle funzioni i tipi degli argomenti vanno specificati;
    - i punti e virgola che metti alla fine delle definizioni delle funzioni non devono esserci;
    - e adesso il problema fondamentale del suddetto codice: se dichiari la funzione stampa(int matrice[r][c]), nel momento in cui richiami tale funzione dal main, essa si aspetta come parametro una variabile di tipo int[r][c] e non un int (infatti il valore che tu gli passi, ossia matrice[r][c] è un int). Se vuoi approfondire la questione relativa al passaggio di array a funzioni ti suggerisco di andarti a leggere uno dei precedenti topic intitolato "Array bidimensionali (multidimensionali)". Detto questo, il modo corretto di invocare la funzione stampa dal main è quindi:
    stampa(matrice);
  • Re: Come generare una matrice casuale 10x10 tramite sottoprogrammi

    Nippolo ha scritto:


    Ho fatto la modifica da te indicata e l'output è ancora accettabile, posto anche il codice qui sotto.
    Ok, c'è qualcosa che non va nel codice che ho postato, va benissimo, sto ancora imparando (il nickname non è stato scelto a caso) e penso sia normale commettere degli errori.

    Codice funzionante con aggiunta suggerita da Nippolo
    ...
    Output senza l'aggiunta di quella riga di codice:

    come avevo già detto l'output è accettabile (tutti i 100 valori sono compresi tra 0 e 99).
    Output con l'aggiunta di quella riga di codice:

    come vedi l'output non è accettabile.
    Il motivo è proprio legato al concetto di tempo di vita di una variabile. Cito le tue parole:
    ... il tempo di vita di una variabile indica dove la variabile esiste, ad esempio se la dichiariamo nel main esisterà solo nel main, mentre se la dichiariamo nel sottoprogramma esisterà solo all'interno del sottoprogramma.
    Consideriamo la funzione generamatrice(), la variabile matrice che vai a riempire nasce e muore all'interno di quel sottoprogramma! Di ritorno nel main non ci sarà più alcuna traccia di quella matrice. Quindi ti chiedi "come mai allora il codice ritorna un output accettabile?" Evidentemente quando nella funzione stampa() dichiari la nuova variabile matrice, essa va ad occupare le stesse porzioni di memoria in cui si trovava la matrice dichiarata nell'altro sottoprogramma e quindi, visto che quella porzione di memoria non è stata modificata, ti restituirà un output accettabile coincidente con la matrice generata dalla funzione generamatrice().
    Piccola precisazione, nel momento in cui una variabile smette di esistere si intende che la porzione di memoria che essa occupava si è resa disponibile e può quindi essere sovrascritta, ma se ciò non avviene ovviamente quelle locazioni di memoria conterranno dati che coincidono con l'ultima configurazione assunta dalla suddetta variabile.
    In questo discorso si inserisce la riga che ti avevo chiesto di aggiungere... nel momento in cui vai a dichiarare delle nuove variabili ci sarà una certa probabilità di andare a modificare lo stato attuale della memoria.
    Ah chiaro, grazie gentilissimo.
    Comunque anche aggiungendo quella linea di codice, mi funzionava il tutto dandomi valori accettabili (cioè compresi tra 0 e 99).

    Nippolo ha scritto:


    - nei prototipi delle funzioni basta inserire il tipo delle variabili, l'identificativo è superfluo;
    Fatto, grazie per la precisazione.

    Nippolo ha scritto:


    - nella definizione delle funzioni i tipi degli argomenti vanno specificati;
    Ok, vediamo se ho capito bene questa frase.
    Con definizione di funzione si intende:
    "La definizione di una funzione corrisponde all’elenco di istruzioni che vengono eseguite ogni volta che essa viene invocata".
    Quindi tutto quello compreso tra le parentesi graffe {}.
    I tipi sono ad esempio int, void, bool, char eccetera.
    Quindi dovrei fare una cosa del genere?
    
    void generamatrice(){
            int matrice [r][c];
    	int i,j;
    for(i=0; i<r; i++){ 
           for(j=0; j<c; j++){
              matrice[i][j]=rand()%100;
          }
       }
    }
    
    Però non avrebbe senso per quanto detto sopra, quindi penso che intendi questo:
    
    void generamatrice(int matrice){
    	int i,j;
    for(i=0; i<r; i++){ 
           for(j=0; j<c; j++){
              matrice[i][j]=rand()%100;
          }
       }
    }
    

    Nippolo ha scritto:


    - i punti e virgola che metti alla fine delle definizioni delle funzioni non devono esserci;
    Ok chiaro, li rimuovo, grazie per la precisazione.

    Nippolo ha scritto:


    - e adesso il problema fondamentale del suddetto codice: se dichiari la funzione stampa(int matrice[r][c]), nel momento in cui richiami tale funzione dal main, essa si aspetta come parametro una variabile di tipo int[r][c] e non un int (infatti il valore che tu gli passi, ossia matrice[r][c] è un int). Se vuoi approfondire la questione relativa al passaggio di array a funzioni ti suggerisco di andarti a leggere uno dei precedenti topic intitolato "Array bidimensionali (multidimensionali)". Detto questo, il modo corretto di invocare la funzione stampa dal main è quindi:
    stampa(matrice);
    Chiaro, ora me lo vado a leggere.

    Ho fatto come su tua indicazione ma mi da errore.
    Posto i vari codici non funzionanti con relativi errori.

    Codice NON funzionante 1:
    
    /*
    Programma che genera una matrice numerica casuale 10x10 e la stampa a schermo
    */
    #include <iostream>
    #include <stdlib.h>
    #include <ctime>
    
    using namespace std;
    //variabili globali
    const int r=10;
    const int c=10; //le ho rese variabili globali poiché sono costanti
    
    //prototipi
    
    void generamatrice(int x);
    void stampa (int x);
    
    //programma principale
    
    int main(){
    	int matrice[r][c];
       
    cout<<"Ora uscira' a schermo una matrice casuale 10x10.\n\n";
        
       srand(time(0)); //inizializzazione seme
       
       //generazione matrice
       
       generamatrice(matrice[r][c]);
       
       //stampa a schermo della matrice
       
       stampa(matrice); //corretto come su indicazione di Nippolo
       
       
       cout<<"\n\n\n";
       
    }
    
    //sottoprogrammi
    
    //generazione matrice
    
    void generamatrice(int matrice[r][c]){
    	int i,j;
    for(i=0; i<r; i++){ 
           for(j=0; j<c; j++){
              matrice[i][j]=rand()%100;
          }
       }
    }
    
    //stampa a schermo matrice
    
    void stampa(int matrice[r][c]){
    	int i,j;
    for (i=0; i<r; i++){
       cout<<"\n";
       for (int j=0; j<c; j++){
          cout<<matrice[i][j]<<" ";
       }
    }
    }
    
    Errori del codice 1:



    Codice 2 NON funzionante:
    
    /*
    Programma che genera una matrice numerica casuale 10x10 e la stampa a schermo
    */
    #include <iostream>
    #include <stdlib.h>
    #include <ctime>
    
    using namespace std;
    //variabili globali
    const int r=10;
    const int c=10; //le ho rese variabili globali poiché sono costanti
    
    //prototipi
    
    void generamatrice(int x);
    void stampa (int x);
    
    //programma principale
    
    int main(){
    	int matrice[r][c];
       
    cout<<"Ora uscira' a schermo una matrice casuale 10x10.\n\n";
        
       srand(time(0)); //inizializzazione seme
       
       //generazione matrice
       
       generamatrice(matrice[r][c]);
       
       //stampa a schermo della matrice
       
       stampa(matrice);
       
       
       cout<<"\n\n\n";
       
    }
    
    //sottoprogrammi
    
    //generazione matrice
    
    void generamatrice(int matrice){
    	int i,j;
    for(i=0; i<r; i++){ 
           for(j=0; j<c; j++){
              matrice[i][j]=rand()%100;
          }
       }
    }
    
    //stampa a schermo matrice
    
    void stampa(int matrice){
    	int i,j;
    for (i=0; i<r; i++){
       cout<<"\n";
       for (int j=0; j<c; j++){
          cout<<matrice[i][j]<<" ";
       }
    }
    }
    
    Errori del codice 2:


    Codice 3 NON funzionante:
    
    /*
    Programma che genera una matrice numerica casuale 10x10 e la stampa a schermo
    */
    #include <iostream>
    #include <stdlib.h>
    #include <ctime>
    
    using namespace std;
    //variabili globali
    const int r=10;
    const int c=10; //le ho rese variabili globali poiché sono costanti
    
    //prototipi
    
    void generamatrice(int x);
    void stampa (int x);
    
    //programma principale
    
    int main(){
    	int matrice[r][c];
       
    cout<<"Ora uscira' a schermo una matrice casuale 10x10.\n\n";
        
       srand(time(0)); //inizializzazione seme
       
       //generazione matrice
       
       generamatrice(matrice);
       
       //stampa a schermo della matrice
       
       stampa(matrice);
       
       
       cout<<"\n\n\n";
       
    }
    
    //sottoprogrammi
    
    //generazione matrice
    
    void generamatrice(int matrice){
    	int i,j;
    for(i=0; i<r; i++){ 
           for(j=0; j<c; j++){
              matrice[i][j]=rand()%100;
          }
       }
    }
    
    //stampa a schermo matrice
    
    void stampa(int matrice){
    	int i,j;
    for (i=0; i<r; i++){
       cout<<"\n";
       for (int j=0; j<c; j++){
          cout<<matrice[i][j]<<" ";
       }
    }
    }
    
    Errori del codice 3:


    Codice 4 non funzionante (corretto come su suggerimento del DEV):
    
    /*
    Programma che genera una matrice numerica casuale 10x10 e la stampa a schermo
    */
    #include <iostream>
    #include <stdlib.h>
    #include <ctime>
    
    using namespace std;
    //variabili globali
    const int r=10;
    const int c=10; //le ho rese variabili globali poiché sono costanti
    
    //prototipi
    
    void generamatrice(int x);
    void stampa (int x);
    
    //programma principale
    
    int main(){
    	int matrice[r][c];
       
    cout<<"Ora uscira' a schermo una matrice casuale 10x10.\n\n";
        
       srand(time(0)); //inizializzazione seme
       
       //generazione matrice
       
       void generamatrice(int matrice);
       
       //stampa a schermo della matrice
       
       void stampa(int matrice);
       
       
       cout<<"\n\n\n";
       
    }
    
    //sottoprogrammi
    
    //generazione matrice
    
    void generamatrice(int matrice){
    	int i,j;
    for(i=0; i<r; i++){ 
           for(j=0; j<c; j++){
              matrice[i][j]=rand()%100;
          }
       }
    }
    
    //stampa a schermo matrice
    
    void stampa(int matrice){
    	int i,j;
    for (i=0; i<r; i++){
       cout<<"\n";
       for (int j=0; j<c; j++){
          cout<<matrice[i][j]<<" ";
       }
    }
    }
    
    Errori del codice 4:



    Codice 5 NON funzionante:
    
    /*
    Programma che genera una matrice numerica casuale 10x10 e la stampa a schermo
    */
    #include <iostream>
    #include <stdlib.h>
    #include <ctime>
    
    using namespace std;
    //variabili globali
    const int r=10;
    const int c=10; //le ho rese variabili globali poiché sono costanti
    
    //prototipi
    
    void generamatrice(int x);
    void stampa (int x);
    
    //programma principale
    
    int main(){
    	int matrice[r][c];
       
    cout<<"Ora uscira' a schermo una matrice casuale 10x10.\n\n";
        
       srand(time(0)); //inizializzazione seme
       
       //generazione matrice
       
       void generamatrice(int matrice[r][c]);
       
       //stampa a schermo della matrice
       
       void stampa(int matrice);
       
       
       cout<<"\n\n\n";
       
    }
    
    //sottoprogrammi
    
    //generazione matrice
    
    void generamatrice(int matrice[r][c]){
    	int i,j;
    for(i=0; i<r; i++){ 
           for(j=0; j<c; j++){
              matrice[i][j]=rand()%100;
          }
       }
    }
    
    //stampa a schermo matrice
    
    void stampa(int matrice[r][c]){
    	int i,j;
    for (i=0; i<r; i++){
       cout<<"\n";
       for (int j=0; j<c; j++){
          cout<<matrice[i][j]<<" ";
       }
    }
    }
    
    Non mi da errori nella compilazione, ma mi appare questo:


    Dire che sto impazzendo è riduttivo, per una cosa che dovrebbe essere anche molto semplice...
  • Re: Come generare una matrice casuale 10x10 tramite sottoprogrammi

    Forse è meglio che tu guardi le correzioni e comprenda dove sbagli
    
    //prototipi
    void generamatrice(int x[r][c]);
    void stampa (int x[r][c]); 
    
    //programma principale
    int main(){
       int matrice[r][c];
       
       cout<<"Ora uscira' a schermo una matrice casuale 10x10.\n\n";
        
       srand(time(0)); //inizializzazione seme
       
       //generazione matrice
       generamatrice(matrice);
       
       //stampa a schermo della matrice
       stampa(matrice);
       
       cout<<"\n\n\n";
    
       return 0; 
    }
    
    //sottoprogrammi
    
    //generazione matrice
    void generamatrice(int matrice[r][c]){
       int i,j;
       
       for(i=0; i<r; i++)
           for(j=0; j<c; j++)
              matrice[i][j]=rand()%100;
    }
    
    //stampa a schermo matrice
    void stampa(int matrice[r][c]){
       int i,j;
    
       for (i=0; i<r; i++){
    	cout<<"\n";
    	for (j=0; j<c; j++){
          cout<<matrice[i][j]<<" ";
    	}
       }
    }
    
  • Re: Come generare una matrice casuale 10x10 tramite sottoprogrammi

    @oregon grazie per la risposta, gentilissimo.
    Mi sto studiando il tuo codice, e sto capendo dove ho sbagliato, ancora grazie.

    Ma il mio speciale e sentito ringraziamento va a @Nippolo, che con pazienza ha sempre dato delle risposte magnifiche.
    Sono in debito.

    Ora la sfida sarebbe fare un programma analogo ma con numero di righe e colonne random, ma visto che è un altro argomento, da regolamento devo aprire una discussione separata.

    Qui il codice finale, caso mai qualcuno su internet stesse cercando qualcosa di analogo:
    
    /*
    Programma che genera una matrice numerica casuale 10x10 e la stampa a schermo
    */
    #include <iostream>
    #include <stdlib.h>
    #include <ctime>
    
    using namespace std;
    
    //variabili globali
    const int r=10;
    const int c=10; //le ho rese variabili globali poiché sono costanti
    
    
    //prototipi
    void generamatrice(int x[r][c]);
    void stampa (int x[r][c]); 
    
    //programma principale
    int main(){
       int matrice[r][c];
       
       cout<<"Ora uscira' a schermo una matrice casuale 10x10.\n\n";
        
       srand(time(0)); //inizializzazione seme
       
       //generazione matrice
       generamatrice(matrice);
       
       //stampa a schermo della matrice
       stampa(matrice);
       
       cout<<"\n\n\n";
    
       return 0; 
    }
    
    //sottoprogrammi
    
    //generazione matrice
    void generamatrice(int matrice[r][c]){
       int i,j;
       
       for(i=0; i<r; i++)
           for(j=0; j<c; j++)
              matrice[i][j]=rand()%100;
    }
    
    //stampa a schermo matrice
    void stampa(int matrice[r][c]){
       int i,j;
    
       for (i=0; i<r; i++){
       cout<<"\n";
       for (j=0; j<c; j++){
          cout<<matrice[i][j]<<" ";
       }
       }
    }
    
Devi accedere o registrarti per scrivere nel forum
14 risposte