[C++] Operazioni con matrici. Scansione di una matrice generata casualmente

paolotesla91
Salve a tutti ho un problema con una bozza di un codice sorgente, nello specifico nell'esercizio mi si chiede di scrivere il codice sorgente di alcune parti di un programma che genere una matrice quadrata in modo casuale con numeri interi da 0 a 255, devo implementare delle funzioni che svolgano le operazioni di seguito descritte: una funzione che estrae gli elementi pari della matrice e li inserisce in un vettore, una funzione che estrae gli elementi dispari della matrice e li inserisce in un vettore e altre funzioni. Mi fermo a queste due prime funzioni in quanto trovo già dei problemi. Qualcuno saprebbe aiutarmi a capire dove sbaglio? Riporto di seguito una bozza del codice che ho implementato:

// Premabolo del programma
using namespace std;
#include<iostream>
#include<cstdlib>
#include<ctime>
#define DIMR 10
#define DIMC 10
typedef int Matrice[DIMR][DIMR];
typedef int Vettore[DIMR];

// Prototipi delle funzioni sviluppate
void stampa(Matrice A, int nr, int nc);

// Prototipi della funzioni da sviluppare
void estrai_pari(Matrice A, int nr, int nc, Vettore pari, int& k);
void estrai_dispari(Matrice A, int nr, int nc, Vettore dispari, int& m);
void sostituisci(Matrice A, int nr, int nc, Vettore pari, int k, Vettore dispari, int m);
void elimina(Matrice A, int& nr, int nc);

// Funzione stampa

void stampa(Matrice A, int nr, int nc) {
	 int i,j;
	 for (i=0;i<nr;i++) {
        cout<<endl; 
        for(j=0;j<nc;j++) cout<<A[i][j]<<"\t";
    }
    cout<<endl<<endl;
}

// Inserire qui di seguito le implementazione delle funzioni richieste

void estrai_pari(Matrice A, int nr, int nc, Vettore pari, int& k){
    bool ok=true;
    for(int i=0; i<nr; i++){
	    for(int j=0; j<nc; j++){
		    if(A[i][j]%2==0){
			    pari[k]=A[i][j];
			    k++;
			    ok=true;
		    } 
		
        }
    } 
	return;
}
void estrai_dispari(Matrice A, int nr, int nc, Vettore dispari, int& m){
	bool ok=true;
	for(int i=0; i<nr; i++){
		for(int j=0; j<nc; j++){
			if(A[i][j]%2 != 0){
				dispari[m]= A[i][j];
				m++;
				ok=true;
			} 
			
		}
	} 
	return;
}
void stampa_vett(Vettore pari, Vettore dispari, int nr, int nc){
	cout<<"il vettore di elementi pari della matrice e': pari= ";
	for(int i=0; i<nr; i++){
		cout<<pari[i]<< ";";
	}
	cout<<endl;
	cout<<"il vettore di elementi dispari della matrice e': dispari= ";
	for(int j=0; j<nc; j++){
		cout<<dispari[j]<< ";";
	}
}

int main(){
    int i,j,nr,nc,k,max,m;
    Matrice A;
    Vettore pari;
    Vettore dispari;
    Vettore minrighe;
    srand(time(NULL));
    cout<<"\t Elaborazione di un'IMMAGINE BIOMEDICALE  \t"<<endl<<endl;
    cout<<"Generazione random della Matrice di Interi..."<<endl<<endl;
    system("PAUSE");
    // Generazione random della matrice
    cout<<endl;
    nr=(rand()%8)+2;
    nc=(rand()%8)+2;
    cout<<"Numero di righe della Matrice: "<<nr<<endl;
    cout<<"Numero di colonne della Matrice: "<<nc<<endl;
    for (i=0;i<nr;i++) 
        for(j=0;j<nc;j++) A[i][j]=rand()%256;
    cout<<"Matrice generata:"<<endl<<endl;
    stampa(A,nr,nc);
    system("PAUSE");
    //Inserire a partire da questo punto in poi le nuove istruzioni
    //per l'attivazione delle funzione e la stampa a video dei risultati  
    
    estrai_pari(A, nr, nc, pari, k);
    estrai_dispari(A, nr, nc, dispari, m);
    stampa_vett(pari, dispari, nr, nc);
    
    system("PAUSE");
    return 0;
}





Le parti da me implementate sono la funzione VOID ESTRAI_PARI, la funzione VOID ESTRAI_DISPARI, e la funzione stampa anche se non richiesta dall'esercizio con lo scopo di verificare se le prime due funzioni siano corrette, se provate ad eseguire il codice riportato noterete gli errori. Vi ringrazio in anticipo.

Risposte
giovx24
ciao!
ho dato un'occhiata veloce al codice
dimentichi di inizializzare k ed m a 0, inoltre hai qualche problemino con le dimensioni dei vettori
la dimensione dei tuoi vettori è 10, mentre la matrice ha 100 elementi
devono essere due vettori da 100 elementi, così non avrai problemi anche se gli elementi della matrice sono tutti pari o tutti dispari

paolotesla91
Ciao giovx, questo è il testo di un esercizio assegnato ad una prova d'esame. Gran parte del codice sorgente è stata scritta dal prof mentre a noi allievi viene chiesto solo di completare il codice implementando le funzioni che ho scritto sopra e successivamente richiamarle nel main opportunamente. Ho inizializzato k ed m a 0 come hai detto tuttavia adesso ho un altro problema, nei vettori non vengono memorizzati effettivamente tutti gli elementi della matrice. Posto di seguito il codice con la correzione che mi hai detto:

// Elaborazione di immagini

// Premabolo del programma
using namespace std;
#include<iostream>
#include<cstdlib>
#include<ctime>
#define DIMR 10
#define DIMC 10
typedef int Matrice[DIMR][DIMR];
typedef int Vettore[DIMR];

// Prototipi delle funzioni sviluppate
void stampa(Matrice A, int nr, int nc);

// Prototipi della funzioni da sviluppare
void estrai_pari(Matrice A, int nr, int nc, Vettore pari, int& k);
void estrai_dispari(Matrice A, int nr, int nc, Vettore dispari, int& m);
void sostituisci(Matrice A, int nr, int nc, Vettore pari, int k, Vettore dispari, int m);
void elimina(Matrice A, int& nr, int nc);

// Funzione stampa

void stampa(Matrice A, int nr, int nc) {
	 int i,j;
	 for (i=0;i<nr;i++) {
        cout<<endl; 
        for(j=0;j<nc;j++) cout<<A[i][j]<<"\t";
    }
    cout<<endl<<endl;
}

// Inserire qui di seguito le implementazione delle funzioni richieste

void estrai_pari(Matrice A, int nr, int nc, Vettore pari, int& k){
    bool ok=true;
    k=0;
    for(int i=0; i<nr; i++){
	    for(int j=0; j<nc; j++){
		    if(A[i][j]%2==0){
			    pari[k]=A[i][j];
			    k++;
			    ok=true;
		    } 
		
        }
    } 
	return;
}
void estrai_dispari(Matrice A, int nr, int nc, Vettore dispari, int& m){
	bool ok=true;
	m=0;
	for(int i=0; i<nr; i++){
		for(int j=0; j<nc; j++){
			if(A[i][j]%2 == 1){
				dispari[m]= A[i][j];
				m++;
				ok=true;
			} 
			
		}
	} 
	return;
}
void sostituisci(Matrice A, int nr, int nc, Vettore pari, int k, Vettore dispari, int m){
	float media_pari;
	float s=0;
	for(int h=0; h<k; h++){
		s=s+pari[k];
	}
	media_pari=s/k;
	float g=0;
	float media_dispari;
	for(int x=0; x<m; x++){
		g=g+dispari[m];
	}
	media_dispari=g/m;
	for(int i=0; i<nr; i++){
		for(int j=0; j<nc; j++){
			if(A[i][j]==0){
				A[i][j]=media_pari;
			} else
			A[i][j]=media_dispari;
		}
	}
	return;
}
void stampa_vett(Vettore pari, Vettore dispari, int nr, int nc){
	cout<<"il vettore di elementi pari della matrice e': pari= ";
	for(int i=0; i<nr; i++){
		cout<<pari[i]<< ";";
	}
	cout<<endl;
	cout<<"il vettore di elementi dispari della matrice e': dispari= ";
	for(int j=0; j<nc; j++){
		cout<<dispari[j]<< ";";
	}
	return;
}

void stampa_mat_sost(Matrice A, int nr, int nc){
	cout<<"Matrice sostituita"<<endl;
	for(int i=0; i<nr; i++){
		cout<<endl;
		for(int j=0; j<nc; j++){
			cout<<A[i][j]<<"\t";
		}
	} cout<<endl<<endl;
	return;
}

int main(){
    int i,j,nr,nc,k,max,m;
    Matrice A;
    Vettore pari;
    Vettore dispari;
    Vettore minrighe;
    srand(time(NULL));
    cout<<"\t Elaborazione di un'IMMAGINE BIOMEDICALE  \t"<<endl<<endl;
    cout<<"Generazione random della Matrice di Interi..."<<endl<<endl;
    system("PAUSE");
    // Generazione random della matrice
    cout<<endl;
    nr=(rand()%8)+2;
    nc=(rand()%8)+2;
    cout<<"Numero di righe della Matrice: "<<nr<<endl;
    cout<<"Numero di colonne della Matrice: "<<nc<<endl;
    for (i=0;i<nr;i++) 
        for(j=0;j<nc;j++) A[i][j]=rand()%256;
    cout<<"Matrice generata:"<<endl<<endl;
    stampa(A,nr,nc);
    system("PAUSE");
    //Inserire a partire da questo punto in poi le nuove istruzioni
    //per l'attivazione delle funzione e la stampa a video dei risultati  
    
    estrai_pari(A,nr,nc,pari,k);
    estrai_dispari(A,nr,nc,dispari,m);
    stampa_vett(pari,dispari,nr,nc);
    sostituisci(A,nr,nc,pari,k,dispari,m);
    stampa_mat_sost(A,nr,nc);
    
    system("PAUSE");
    return 0;
}




Ho provato a risolvere anche il punto successivo ovviamente con esito negativo :cry:
Sulla questione delle dimensioni dei vettori non so cosa dirti, le dimensioni vengono definite da prof con i #define sopra.
Ti ringrazio ancora per la risposta.

giovx24
"paolotesla91":
Ciao giovx, questo è il testo di un esercizio assegnato ad una prova d'esame. Gran parte del codice sorgente è stata scritta dal prof mentre a noi allievi viene chiesto solo di completare il codice implementando le funzioni che ho scritto sopra e successivamente richiamarle nel main opportunamente. Ho inizializzato k ed m a 0 come hai detto tuttavia adesso ho un altro problema, nei vettori non vengono memorizzati effettivamente tutti gli elementi della matrice. Posto di seguito il codice con la correzione che mi hai detto:

// Elaborazione di immagini

// Premabolo del programma
using namespace std;
#include<iostream>
#include<cstdlib>
#include<ctime>
#define DIMR 10
#define DIMC 10
typedef int Matrice[DIMR][DIMR];
typedef int Vettore[DIMR];

// Prototipi delle funzioni sviluppate
void stampa(Matrice A, int nr, int nc);

// Prototipi della funzioni da sviluppare
void estrai_pari(Matrice A, int nr, int nc, Vettore pari, int& k);
void estrai_dispari(Matrice A, int nr, int nc, Vettore dispari, int& m);
void sostituisci(Matrice A, int nr, int nc, Vettore pari, int k, Vettore dispari, int m);
void elimina(Matrice A, int& nr, int nc);

// Funzione stampa

void stampa(Matrice A, int nr, int nc) {
	 int i,j;
	 for (i=0;i<nr;i++) {
        cout<<endl; 
        for(j=0;j<nc;j++) cout<<A[i][j]<<"\t";
    }
    cout<<endl<<endl;
}

// Inserire qui di seguito le implementazione delle funzioni richieste

void estrai_pari(Matrice A, int nr, int nc, Vettore pari, int& k){
    bool ok=true;
    k=0;
    for(int i=0; i<nr; i++){
	    for(int j=0; j<nc; j++){
		    if(A[i][j]%2==0){
			    pari[k]=A[i][j];
			    k++;
			    ok=true;
		    } 
		
        }
    } 
	return;
}
void estrai_dispari(Matrice A, int nr, int nc, Vettore dispari, int& m){
	bool ok=true;
	m=0;
	for(int i=0; i<nr; i++){
		for(int j=0; j<nc; j++){
			if(A[i][j]%2 == 1){
				dispari[m]= A[i][j];
				m++;
				ok=true;
			} 
			
		}
	} 
	return;
}
void sostituisci(Matrice A, int nr, int nc, Vettore pari, int k, Vettore dispari, int m){
	float media_pari;
	float s=0;
	for(int h=0; h<k; h++){
		s=s+pari[k];
	}
	media_pari=s/k;
	float g=0;
	float media_dispari;
	for(int x=0; x<m; x++){
		g=g+dispari[m];
	}
	media_dispari=g/m;
	for(int i=0; i<nr; i++){
		for(int j=0; j<nc; j++){
			if(A[i][j]==0){
				A[i][j]=media_pari;
			} else
			A[i][j]=media_dispari;
		}
	}
	return;
}
void stampa_vett(Vettore pari, Vettore dispari, int nr, int nc){
	cout<<"il vettore di elementi pari della matrice e': pari= ";
	for(int i=0; i<nr; i++){
		cout<<pari[i]<< ";";
	}
	cout<<endl;
	cout<<"il vettore di elementi dispari della matrice e': dispari= ";
	for(int j=0; j<nc; j++){
		cout<<dispari[j]<< ";";
	}
	return;
}

void stampa_mat_sost(Matrice A, int nr, int nc){
	cout<<"Matrice sostituita"<<endl;
	for(int i=0; i<nr; i++){
		cout<<endl;
		for(int j=0; j<nc; j++){
			cout<<A[i][j]<<"\t";
		}
	} cout<<endl<<endl;
	return;
}

int main(){
    int i,j,nr,nc,k,max,m;
    Matrice A;
    Vettore pari;
    Vettore dispari;
    Vettore minrighe;
    srand(time(NULL));
    cout<<"\t Elaborazione di un'IMMAGINE BIOMEDICALE  \t"<<endl<<endl;
    cout<<"Generazione random della Matrice di Interi..."<<endl<<endl;
    system("PAUSE");
    // Generazione random della matrice
    cout<<endl;
    nr=(rand()%8)+2;
    nc=(rand()%8)+2;
    cout<<"Numero di righe della Matrice: "<<nr<<endl;
    cout<<"Numero di colonne della Matrice: "<<nc<<endl;
    for (i=0;i<nr;i++) 
        for(j=0;j<nc;j++) A[i][j]=rand()%256;
    cout<<"Matrice generata:"<<endl<<endl;
    stampa(A,nr,nc);
    system("PAUSE");
    //Inserire a partire da questo punto in poi le nuove istruzioni
    //per l'attivazione delle funzione e la stampa a video dei risultati  
    
    estrai_pari(A,nr,nc,pari,k);
    estrai_dispari(A,nr,nc,dispari,m);
    stampa_vett(pari,dispari,nr,nc);
    sostituisci(A,nr,nc,pari,k,dispari,m);
    stampa_mat_sost(A,nr,nc);
    
    system("PAUSE");
    return 0;
}




Ho provato a risolvere anche il punto successivo ovviamente con esito negativo :cry:
Sulla questione delle dimensioni dei vettori non so cosa dirti, le dimensioni vengono definite da prof con i #define sopra.
Ti ringrazio ancora per la risposta.


se puoi modificare il main la soluzione è dichiarare così i tuoi vettori
vettore pari[DIMC];
vettore dispari[DIMC]


ciao!

paolotesla91
Perdonami, non sarebbe controproducente dichiarare le dimensioni di quei vettori? I parametri k ed m servono perchè io non posso sapere a priori che dimensioni hanno. Concordi? DIMC e DIMR sono dichiarati con valore 10 ma non è detto che i vettori avranno dimensione 10.

giovx24
"paolotesla91":
Perdonami, non sarebbe controproducente dichiarare le dimensioni di quei vettori?

se sostituisci con le righe che ti ho scritto sopra la dimensione di ogni vettore diventa 100.
non è possibile dichiarare dei vettori senza specificarne la dimensione
nel codice che hai fornito i vettori hanno dimensione 10

"paolotesla91":
DIMC e DIMR sono dichiarati con valore 10 ma non è detto che i vettori avranno dimensione 10.

come ti ho già detto i tuoi vettori hanno dimensione 10 ed essa non può variare mentre il programma è in esecuzione, al massimo puoi dire che non riempirai tutti gli elementi e qui entrano in gioco m e k che ti "ricordano" fin dove hai riempito i tuoi array.

ciao!

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.