[C++] Scambiare due righe di una matrice
Salve. Ho provato a cercare nel forum, ma invano... Così ho cediso di postare il mio dubbio.
Sto preparando "Elementi di Informatica" e un esercizio sul C++ mi chiede:
Un primo codice che ho fatto è:
I miei problemi nascono nell'invertire le righe (dal commento //invertire le righe) . Non so come invertire le righe di una matrice... Il resto è tutto funzionante, ma lì... Avete consigli al riguardo?
Grazie, Giovanni
Sto preparando "Elementi di Informatica" e un esercizio sul C++ mi chiede:
"Dato un arrayA[ N ][ M] di elementi reali, con N ed M assegnati, invertire
la riga di somma max con la riga di somma minima"
Un primo codice che ho fatto è:
#include <iostream> using namespace std; int main() { int matrice[10][10], i, j, N, M, sriga[10], max, min, posmax, posmin; cout<<"Digitare l'ordine della matrice \nrighe: "; cin>>N; cout<<"\ncolonne: "; cin>>M; cout<<endl; while ((N<0)||(M<0)||(N>10)||(M>10)) { cout<<"Dimensioni errate, inserire nuove dimensioni \nrighe: "; cin>>N; cout<<"\ncolonne: "; cin>>M; cout<<endl; } //Lettura matrice for (i=0; i<N; i++) for (j=0; j<M; j++) { cout<<"Inserire l'elemento ["<<i<<"]["<<j<<"]: "; cin>>matrice[i][j]; } //Calcolo riga con somma max e min for (i=0; i<N; i++) { sriga[i]=0; for (j=0; j<M; j++) sriga[i]=sriga[i]+matrice[i][j]; cout<<"La somma della riga "<<i<<" e' "<<sriga[i]<<endl; } //Stampa max=sriga[0]; posmax=0; min=sriga[0]; posmin=0; for (i=0; i<N; i++) { if (sriga[i]>max) { max=sriga[i]; posmax=i; } if (sriga[i]<min) { min=sriga[i]; posmin=i; } } cout<<"Posizione della riga la cui somma e' massima: "<<posmax<<" -->somma: "<<max<<endl<< "Posizione della riga la cui somma e' minima: "<<posmin<<" -->somma: "<<min<<endl<<endl; for (i=0; i<N; i++) { for (j=0; j<M; j++) cout<<matrice[i][j]<<" "; cout<<endl<<endl; } //[b]Invertire le righe[/b] <---------------------- for (i=0; i<N; i++) { if (i=posmax) i=posmin; if (i=posmin) i=posmax; for (j=0; j<M; j++) cout<<matrice[i][j]<<" "; cout<<endl<<endl; } system ("Pause"); return 0; }
I miei problemi nascono nell'invertire le righe (dal commento //invertire le righe) . Non so come invertire le righe di una matrice... Il resto è tutto funzionante, ma lì... Avete consigli al riguardo?
Grazie, Giovanni
Risposte
Ho risolto! Per chi avrà lo stesso problema, ho risolto con questo algoritmo (in pratica ho introdotto la variabile di appoggio temporaneo)
#include <iostream> using namespace std; int main() { int matrice[10][10], i, j, N, M, sriga[10], max, min, posmax, posmin, appo; cout<<"Digitare l'ordine della matrice \nrighe: "; cin>>N; cout<<"\ncolonne: "; cin>>M; cout<<endl; while ((N<0)||(M<0)||(N>10)||(M>10)) { cout<<"Dimensioni errate, inserire nuove dimensioni \nrighe: "; cin>>N; cout<<"\ncolonne: "; cin>>M; cout<<endl; } //Lettura e stampa matrice for (i=0; i<N; i++) for (j=0; j<M; j++) { cout<<"Inserire l'elemento ["<<i<<"]["<<j<<"]: "; cin>>matrice[i][j]; } for (i=0; i<N; i++) { for (j=0; j<M; j++) cout<<matrice[i][j]<<" "; cout<<endl<<endl; } //Calcolo riga con somma max e min for (i=0; i<N; i++) { sriga[i]=0; for (j=0; j<M; j++) sriga[i]=sriga[i]+matrice[i][j]; cout<<"La somma della riga "<<i<<" e' "<<sriga[i]<<endl; } //Stampa max=sriga[0]; posmax=0; min=sriga[0]; posmin=0; for (i=0; i<N; i++) { if (sriga[i]>max) { max=sriga[i]; posmax=i; } if (sriga[i]<min) { min=sriga[i]; posmin=i; } } cout<<"Posizione della riga la cui somma e' massima: "<<posmax<<" -->somma: "<<max<<endl<< "Posizione della riga la cui somma e' minima: "<<posmin<<" -->somma: "<<min<<endl<<endl; //[b]Invertire le righe[/b] <---------------------- for (j=0; j<M; j++) { appo=matrice[posmax][j]; matrice[posmax][j]=matrice[posmin][j]; matrice[posmin][j]=appo; } cout<<"Matrice con righe max e min invertite: \n"; for (i=0; i<N; i++) { for (j=0; j<M; j++) cout<<matrice[i][j]<<" "; cout<<endl<<endl; } system ("Pause"); return 0; }
Ciao,
per il problema del post, basta un semplice swap come hai già avuto modo di risolvere.
Ho dato un'occhiata veloce al codice, questo:
potresti fare tutto in un unico ciclo senza memorizzarti in una array secondario le varie somme.
La cosa che ti interessa è il numero di riga con somma max e min. Una volta calcolata la somma max e min ti salvi semplicemente l'indice, che poi utilizzerai per lo swap. Per dire potresti migliorare il codice...
per il problema del post, basta un semplice swap come hai già avuto modo di risolvere.
Ho dato un'occhiata veloce al codice, questo:
//Calcolo riga con somma max e min for (i=0; i<N; i++) { sriga[i]=0; for (j=0; j<M; j++) sriga[i]=sriga[i]+matrice[i][j]; cout<<"La somma della riga "<<i<<" e' "<<sriga[i]<<endl; } //Stampa max=sriga[0]; posmax=0; min=sriga[0]; posmin=0; for (i=0; i<N; i++) { if (sriga[i]>max) { max=sriga[i]; posmax=i; } if (sriga[i]<min) { min=sriga[i]; posmin=i; } }
potresti fare tutto in un unico ciclo senza memorizzarti in una array secondario le varie somme.
La cosa che ti interessa è il numero di riga con somma max e min. Una volta calcolata la somma max e min ti salvi semplicemente l'indice, che poi utilizzerai per lo swap. Per dire potresti migliorare il codice...