PDA

Visualizza la versione completa : matrici c++


c_nicola
03-01-2009, 15:58
Ragazzi sto cercando di ordinare una matrice... es:
matrice di partenza:
3 2 1
4 6 5
deve diventare:
1 2 3
4 5 6;
ho provato a scrivere un programma che mi copia la matrice in un vettore, ordina il vettore e poi ricopia il vettore ordinato nella matrice...ma non va...ecco il codice


#include<iostream>
using namespace std;
void leggi_mat(int m[100][100], int &c, int&r);
void ordina(int *v,int n);
int main()
{int m[100][100];
int*v;
int n,r,c,k,i,j;
cout<<"r";
cin>>r;
cout<<"c";cin>>c;
n=r*c;
v=(int*)malloc (n*sizeof (int));
leggi_mat(m,r,c);
for(i=0;i<r;i++)
{for(j=0;j<c;j++)
v[k]=m[i][j];
k++;}
ordina(v,n);
for(i=0;i<r;i++)
{for(j=0;j<c;j++)
m[i][j]=v[k];
k++;
cout<<m[i][j]<<"\t";
cout<<endl;}







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];}}



void ordina(int *v,int n)
{int i,j,temp;
for(i=0;i<n-1;i++)
{for(j=0;j<n-i-1;i++)
if(v[j]>v[j+1])
{temp=v[i];
v[i]=v[i+1];
v[i+1]=temp;
}



}
}

c_nicola
03-01-2009, 15:59
Ragazzi sto cercando di ordinare una matrice... es:
matrice di partenza:
3 2 1
4 6 5
deve diventare:
1 2 3
4 5 6;
ho provato a scrivere un programma che mi copia la matrice in un vettore, ordina il vettore e poi ricopia il vettore ordinato nella matrice...ma non va...ecco il codice


#include<iostream>
using namespace std;
void leggi_mat(int m[100][100], int &c, int&r);
void ordina(int *v,int n);
int main()
{int m[100][100];
int*v;
int n,r,c,k,i,j;
cout<<"r";
cin>>r;
cout<<"c";cin>>c;
n=r*c;
v=(int*)malloc (n*sizeof (int));
leggi_mat(m,r,c);
for(i=0;i<r;i++)
{for(j=0;j<c;j++)
v[k]=m[i][j];
k++;}
ordina(v,n);
for(i=0;i<r;i++)
{for(j=0;j<c;j++)
m[i][j]=v[k];
k++;
cout<<m[i][j]<<"\t";
cout<<endl;}







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];}}



void ordina(int *v,int n)
{int i,j,temp;
for(i=0;i<n-1;i++)
{for(j=0;j<n-i-1;i++)
if(v[j]>v[j+1])
{temp=v[i];
v[i]=v[i+1];
v[i+1]=temp;
}



}
}
Potrebbero esserci problemi nella stampa a video della matrice ordinata...

YuYevon
03-01-2009, 17:36
Preliminariamente ti consiglio di postare il codice indentandolo, magari utilizzando le tag apposite... giusto perché così si capisce meglio ed è più facile aiutarti.

Il problema è innanzitutto nella funzione di ordinamento. Mi sembra che volessi implementare il Bubble sort ma così è sbagliato, tra l'altro come errore più evidente incrementi l'indice i anche nel ciclo for interno dove invece andrebbe incrementata j.

Inoltre l'indice k del vettore v (nel main) va incrementato nel ciclo for interno sia quando copi gli elementi dal vettore alla matrice sia quando fai la copia inversa, altrimenti incrementando k nel ciclo esterno consideri un numero di elementi pari al numero di righe della matrice, e non a quello dei suoi elementi.

Ricorda anche di azzerare l'indice k dopo il primo doppio for e occhio anche alla stampa della matrice alla fine: la stampa degli elementi deve avvenire - ancora una volta - nel ciclo for interno.

Poi... perché passi per riferimento le dimensioni della matrice alla funzione di lettura? Non ti compromette il funzionamento del programma ma è inutile...

Ti consiglio di provare a debuggarlo da solo, comunque nel caso avessi troppi problemi ti posto il codice corretto... senza eccessive modifiche al tuo.



#include <iostream>
using namespace std;

void leggi_mat(int m[100][100], int c, int r);
void ordina(int *v, int n);

int main()
{
int m[100][100];
int *v;
int n, r, c, k = 0, i, j;
cout << "r";
cin >> r;
cout << "c";
cin >> c;
n = r * c;
v = (int *) malloc(n * sizeof(int));
leggi_mat(m, r, c);
for (i = 0; i < r; i++) {
for (j = 0; j < c; j++) {
v[k] = m[i][j];
k++;
}
}

ordina(v, k);

k = 0;
for (i = 0; i < r; i++) {
for (j = 0; j < c; j++) {
m[i][j] = v[k];
k++;
cout << m[i][j] << "\t";
}
cout << endl;
}
}

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];
}
}



void ordina(int *v, int n)
{
int i, j, temp;

for (i = 0; i<n-1; i++)

for (j=n-1; j>i; j--)

if (*(v + i) > *(v + j)) {
temp = v[i];
v[i] = v[j];
v[j] = temp;
}
}

oregon
03-01-2009, 19:30
Ma perche' hai aperto un altro thread invece di continuare in quello gia' aperto? :confused:

Cosi' si fa confusione ...

alka
03-01-2009, 20:21
Non apriamo discussioni duplicate sugli stessi argomenti.

Loading