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);
}