Carlez
26-04-2009, 14:36
Salve devo ordinare una matrice secondo il totale di riga.
Per fare questo, utilizzo un vettore nel quale momorizzo tutti i totali di ogni riga della matrice, poi attraverso un bubble-sort, ordino la matrice secondo il vettore.
Se inserisco un matrice come questa:
9 9 9
5 5 5
1 1 1
la ordina perfettamente restituendomi:
1 1 1
5 5 5
9 9 9
mentre se metto una matrice come:
9 9 9
1 1 1
5 5 5
non la ordina e la lascia cosė com'č.
Suppongo ci sia un problema nella funzione ordina, ma quale?
#include <stdio.h>
#include <string.h>
#define MAX 100
/* Prototipi */
int menu ();
int dimensione ();
void carica (char m[MAX][MAX],int r,int c);
void totrighe (char m[MAX][MAX],int r,int c,int v[]);
void ordina (char m[MAX][MAX],int r,int c,int v[]);
void stampa (char m[MAX][MAX],int r,int c);
int main () {
int sc,r,c,v[MAX];
char m[MAX][MAX];
do {
sc=menu();
switch (sc) {
case 1:
r=dimensione();
c=dimensione();
carica (m,r,c);
break;
case 2:
totrighe (m,r,c,v);
break;
case 3:
ordina (m,r,c,v);
break;
case 4:
stampa (m,r,c);
break;
}
}while (sc!=0);
return 0;
}
int menu () {
int sc;
printf ("1. Carica\n");
printf ("2. Calcola totali di riga\n");
printf ("3. Ordina\n");
printf ("4. Stampa\n");
printf ("0. Esci\n");
do {
printf ("Scelta:");
scanf ("%d",&sc);
} while ((sc<0)||(sc>4));
return sc;
}
int dimensione () {
int d;
do {
printf ("Dimensione:");
scanf ("%d",&d);
}while ((d<1)||(d>MAX));
return d;
}
void carica (char m[MAX][MAX],int r,int c) {
int i,j;
for (i=0;i<r;i++) {
for (j=0;j<c;j++) {
printf ("m[%d][%d]:",i,j);
scanf ("%d",&m[i][j]);
}
printf ("\n");
}
return;
}
void totrighe (char m[MAX][MAX],int r,int c,int v[]) {
int i,j;
for (i=0;i<r;i++) {
v[i]=0;
for (j=0;j<c;j++) {
v[i]=v[i]+m[i][j];
}
}
return;
}
void ordina (char m[MAX][MAX],int r,int c,int v[]) {
int i,j;
char app[c];
for (i=r-1;i>0;i--) {
for (j=0;j<i;j++) {
if (v[j]>v[j+1]) {
strcpy (app,m[j]);
strcpy (m[j],m[j+1]);
strcpy (m[j+1],app);
}
}
}
return;
}
void stampa (char m[MAX][MAX],int r,int c) {
int i,j;
for (i=0;i<r;i++) {
for (j=0;j<c;j++) {
printf ("m[%d][%d]: %d\n",i,j,m[i][j]);
}
}
return;
}
Per fare questo, utilizzo un vettore nel quale momorizzo tutti i totali di ogni riga della matrice, poi attraverso un bubble-sort, ordino la matrice secondo il vettore.
Se inserisco un matrice come questa:
9 9 9
5 5 5
1 1 1
la ordina perfettamente restituendomi:
1 1 1
5 5 5
9 9 9
mentre se metto una matrice come:
9 9 9
1 1 1
5 5 5
non la ordina e la lascia cosė com'č.
Suppongo ci sia un problema nella funzione ordina, ma quale?
#include <stdio.h>
#include <string.h>
#define MAX 100
/* Prototipi */
int menu ();
int dimensione ();
void carica (char m[MAX][MAX],int r,int c);
void totrighe (char m[MAX][MAX],int r,int c,int v[]);
void ordina (char m[MAX][MAX],int r,int c,int v[]);
void stampa (char m[MAX][MAX],int r,int c);
int main () {
int sc,r,c,v[MAX];
char m[MAX][MAX];
do {
sc=menu();
switch (sc) {
case 1:
r=dimensione();
c=dimensione();
carica (m,r,c);
break;
case 2:
totrighe (m,r,c,v);
break;
case 3:
ordina (m,r,c,v);
break;
case 4:
stampa (m,r,c);
break;
}
}while (sc!=0);
return 0;
}
int menu () {
int sc;
printf ("1. Carica\n");
printf ("2. Calcola totali di riga\n");
printf ("3. Ordina\n");
printf ("4. Stampa\n");
printf ("0. Esci\n");
do {
printf ("Scelta:");
scanf ("%d",&sc);
} while ((sc<0)||(sc>4));
return sc;
}
int dimensione () {
int d;
do {
printf ("Dimensione:");
scanf ("%d",&d);
}while ((d<1)||(d>MAX));
return d;
}
void carica (char m[MAX][MAX],int r,int c) {
int i,j;
for (i=0;i<r;i++) {
for (j=0;j<c;j++) {
printf ("m[%d][%d]:",i,j);
scanf ("%d",&m[i][j]);
}
printf ("\n");
}
return;
}
void totrighe (char m[MAX][MAX],int r,int c,int v[]) {
int i,j;
for (i=0;i<r;i++) {
v[i]=0;
for (j=0;j<c;j++) {
v[i]=v[i]+m[i][j];
}
}
return;
}
void ordina (char m[MAX][MAX],int r,int c,int v[]) {
int i,j;
char app[c];
for (i=r-1;i>0;i--) {
for (j=0;j<i;j++) {
if (v[j]>v[j+1]) {
strcpy (app,m[j]);
strcpy (m[j],m[j+1]);
strcpy (m[j+1],app);
}
}
}
return;
}
void stampa (char m[MAX][MAX],int r,int c) {
int i,j;
for (i=0;i<r;i++) {
for (j=0;j<c;j++) {
printf ("m[%d][%d]: %d\n",i,j,m[i][j]);
}
}
return;
}