PDA

Visualizza la versione completa : scambio righe matrici c/c++


c_nicola
05-01-2009, 19:55
Ragazzi sto provando a scrivere un programma che in una matrice mi scambi la riga con somma massima con quella di somma minima...vi posto il codice(ve lo posto così xkè nn conosco i tag appositi :cry: sono un po inesperto)


//scambia la riga con somma max con quella con somma min

#include<iostream>
using namespace std;
void leggi_mat(int m[100][100], int &c, int&r);
void stampa_mat(int m[100][100], int &c, int&r);
int sommamax(int m[][100],int r, int c);
int sommamin(int m[][100],int r, int c);
void scambia_righe(int m[][100], int&r,int&c, int x, int k);
int main()
{int m[100][100];
int r,c,x,k;
cin>>r>>c;
leggi_mat(m,r,c);
x=sommamax(m,r,c);
k=sommamin(m,r,c);
scambia_righe(m,r,c,x,k);


system("PAUSE");
}


void leggi_mat(int m[100][100], int &c, int&r)
{int i,j;
for(i=0;i<r;i++)
for(j=0;j<c;j++)
{cout<<"m["<<i<<"]["<<j<<"]";
cin>>m[i][j];}}

int sommamax(int m[][100],int r, int c)
{int somma=0,temp,j,i,k;
for(i=0;i<r;i++)
{temp=0;
for(j=0;j<c;j++)
temp+=m[i][j];
if(somma<temp)
{somma=temp;
k=i;}
}
return k;

}

int sommamin(int m[][100],int r, int c)
{int somma=0,temp,j,i,k;
for(i=0;i<r;i++)
{temp=0;
for(j=0;j<c;j++)
{temp+=m[i][j];
somma=temp;
if(temp<somma)
{ somma=temp;
k=i;
}
}
return k;}


}
void scambia_righe(int m[][100], int&r,int&c, int x, int k)//scambia riga x con riga k
{int j,y,i;
int temp[100];
i=0;
for(j=0;j<c;j++)
{temp[i]=m[x][j]; //temp[i]è un vettore d'appoggio x lo scambio
m[x][j]=m[k][j];
m[k][j]=temp[i];
i++;
}
stampa_mat(m,r,c); }

void stampa_mat(int m[100][100], int &c, int&r)
{int i,j;
for(i=0;i<r;i++)
{for(j=0;j<c;j++)
cout<<m[i][j]<<"\t";
cout<<endl;
}
}


il programma viene compilato ma non mi funziona...help!

MrX87
05-01-2009, 22:34
Innanzi tutto la prossima volta usa i tag appositi, non è difficile, basta scrivere:
[*code*]
CODICE TUO
[/*code*]
Nota però che non devi mettere gli asterischi...e prima di postare magari fai una anteprima e vedi se esce in maniera corretta.
counque ho dato un'occhiata al codice da te proposto e ho notato qualche errorino banale di distrazione tipo che sbagli a passare i parametri alla funzione che legge la matrice:


void leggi_mat(int m[100][100], int &c, int&r);
in questo modo leggi la matrice all'incontrario, perchè dal main tu passi:


leggi_mat(m,r,c);

quindi si invertono le variabili di riga e colonna;
Lo stesso accade nella funzione di stampa che richiami dalla funzione che scambia le righe!
--2) Poi c'è un errore anche nella funzione della ricerca della somma minima:


int sommamin(int m[][100],int r, int c)
{int somma=0,temp,j,i,k;
for(i=0;i<r;i++)
{temp=0;
for(j=0;j<c;j++)
{temp+=m[i][j];
---->somma=temp;<----
if(temp<somma)
{ somma=temp;
k=i;
}
}
return k;}

Non capisco a cosa serve somma = temp! così facendo, non entrerà main nell'if sotto! e inoltre ti conviene dichiarare somma=1000, altrimenti se la somma minore è 5 già non entrerà mai nell'if e il programma va in palla! quindi modificala così:


int sommamin(int m[][100],int r, int c)
{int somma=1000,temp,j,i,k;
for(i=0;i<r;i++)
{temp=0;
for(j=0;j<c;j++)
{temp+=m[i][j];
if(temp<somma)
{ somma=temp;
k=i;
}
}
return k;}

Poi c'è una cosa che non ho ben capito, ovvero perchè nella funzione di scambio di righe definisci temp come vettore di 100 unità?? per fare quello che fai basta una variabile int normale senza nessun vettore!


void scambia_righe(int m[][100], int&r,int&c, int x, int k)//scambia riga x con riga k
{int j,y,i;
int temp;
for(j=0;j<c;j++)
{temp=m[x][j]; //temp è una variabile d'appoggio x lo scambio
m[x][j]=m[k][j];
m[k][j]=temp;
}
stampa_mat(m,r,c); }

per il resto sembra andare bene...testalo un pò e vedi su funziona come dovrebbe altrimenti posta di nuovo!

c_nicola
06-01-2009, 00:01
Ho provato ma nn va...mi stampa la matrice normale senza righe invertite come faceva anche prima...forse ci sono problemi nell'inserimento della stampa a video? dovrei metterla da un altra parte?

MrX87
06-01-2009, 00:12
veramente io avevo provato a eseguirlo e sembrava funzionare...ti posto tutto il prigramma che ho provato io!


#include<iostream>
using namespace std;
void leggi_mat(int m[100][100], int &c, int&r);
void stampa_mat(int m[100][100], int &c, int&r);
int sommamax(int m[][100],int r, int c);
int sommamin(int m[][100],int r, int c);
void scambia_righe(int m[][100], int&r,int&c, int x, int k);

int main()
{int m[100][100];
int r,c,x,k;
cout<<"Inserire numero riga e colonna: ";
cin>>r>>c;
cout<<"riga: "<<r<<"\ncolonna: "<<c<<"\n";

leggi_mat(m,r,c);

x=sommamax(m,r,c);

k=sommamin(m,r,c);

scambia_righe(m,r,c,x,k);


system("PAUSE");
}


void leggi_mat(int m[100][100], int &r, int&c)
{int i,j;
for(i=0;i<r;i++)
for(j=0;j<c;j++)
{cout<<"m["<<i<<"]["<<j<<"]";
cin>>m[i][j];}}

int sommamax(int m[][100],int r, int c)
{int somma=0,temp,j,i,k;
for(i=0;i<r;i++)
{temp=0;
for(j=0;j<c;j++)
temp+=m[i][j];
if(somma<temp)
{somma=temp;
k=i;}
}
return k;

}

int sommamin(int m[][100],int r, int c)
{int somma=1000,temp,j,i,k;
for(i=0;i<r;i++)
{temp=0;
for(j=0;j<c;j++)
{temp+=m[i][j];
if(temp<somma)
{ somma=temp;
k=i;
}
}
return k;}


}
void scambia_righe(int m[][100], int&r,int&c, int x, int k)//scambia riga x con riga k
{int j,y,i;
int temp;
for(j=0;j<c;j++)
{temp=m[x][j]; //temp[i]è un vettore d'appoggio x lo scambio
m[x][j]=m[k][j];
m[k][j]=temp;
}
stampa_mat(m,r,c); }

void stampa_mat(int m[100][100], int &r, int&c)
{int i,j;
for(i=0;i<r;i++)
{for(j=0;j<c;j++)
cout<<m[i][j]<<"\t";
cout<<endl;
}
}

Loading