[C++] Scambiare due righe di una matrice

NickInter
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:

"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
NickInter
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;
}

hamming_burst
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:
//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...

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