PDA

Visualizza la versione completa : C++: Eliminazione dei doppioni!!


dibussolo
25-08-2010, 20:45
Buonasera a tutti !! vi prego aiutatemi prima che impazzisco !
allora il problema è questo:
ho una matrice inserita da tastiera, ad esempio così:

1 0 4 5 6
8 9 3 0 0
0 5 6 3 5
1 0 4 5 6
1 0 4 5 6

Devo eliminare i doppioni.. cioè le tre righe 1 0 4 5 6 e sommare gli elementi delle rimanenti due, cioè 39! (8+9+3+0+0+0+5+6+3+5).




for (i=0;i<n;i++)
{
for (j=0;j<m;j++)
{
if (a[i][j] == a[i+1][j])
{
a[i][j]=0;
a[i+1][j]=0;
}
}
}
for (i=0;i<n;i++)
{
for (j=0;j<m;j++)
{
b[i][j]=a[i][j];
}
}

cout<<"La nuova matrice è: "<<endl;
for (i=0;i<n;i++)
{
for (j=0;j<m;j++)
{
cout<<b[i][j];
cout<<" ";
}
cout<<endl;
}


con questo codice appena scritto non va bene, perché confronto solo con la riga successiva, ad esempio:
1 2 3
1 2 3
4 5 6

diventa:

0 0 0
0 0 0
4 5 6

ma

1 2 3
4 5 6
1 2 3

resta uguale !!

ossia:

1 2 3
4 5 6
1 2 3

quindi il codice non va, chi mi aiuta ??

Scara95
26-08-2010, 09:38
Intanto è meglio che aggiungi la dichiarazione delle variabili e l'inizializzazione...
poi comunque così è sbagliato, in quanto se la matrice fosse così:

124
123
678

diventerebbe così

004
003
678

per risolvere il problema delle righe basta aggiungere un ciclo e, per quello del confronto sbagliato, dopo aver assegnato true a una variabile nel ciclo esterno, la cambi in false se una coppia non è uguale e quindi cambi la riga in zero...
...anche se magari sarebbe comodo aggiungere una funzione che ti faccia il confronto delle righe a cui passi solo il primo indice, spero tu mi abbia compreso,
ciao :)

dibussolo
26-08-2010, 10:33
..si si, è già tutto dichiarato, ho solo incollato quel pezzo di codice che interessa !
comunque è vero questo:

124
123
678

diventerebbe così

004
003
678

e xkè??

facendo


for (i=0;i<n;i++)
{
for (j=0;j<m;j++)
{
if (a[i][j] == a[i+1][j])
{
a[i][j]=0;
a[i+1][j]=0;
}
}
}


..non paragono tutti gli elementi della prima riga con la seconda ?
cmq ora provo a fare quello che mi hai detto.

dibussolo
26-08-2010, 11:12
:'( non ci riesco !! aiuto !!

Ippo343
26-08-2010, 11:39
Si, paragoni tutti gli elementi, ma sostituisci immediatamente se due sono uguali, e lasci invariato nel caso che non lo siano. Quella procedura non sostituisce gli zeri se le due righe sono uguali, ma sostituisce tutti gli elementi uguali e lascia inalterati quelli diversi.

Prima di continuare, ti serve una funzione che ti dica se due righe della matrice sono uguali.

Scorri tutto l'array. Se trovi due elementi diversi, ritorna 0. Se hai passato tutto l'array senza trovare elementi diversi, ritorna 1;

Scara95
26-08-2010, 11:42
e quella funzione può implementarla come ho detto io....

dibussolo
26-08-2010, 12:12
for (i=0;i<n;i++)
{
for (j=0;j<m;j++)
{
if (a[i][j] != a[i+1][j])
{
return 0;
}
else
{
return 1;
}
}
}



allora.. se le due righe sono diverse mi ritorna 0, cioè esci dal ciclo confrontando altre 2 righe;
altrimenti mi ritorna 1.
Ora quando mi ritorna 1 come faccio ad annullare le due righe uguali ?

dibussolo
26-08-2010, 12:15
..forse vi aiuto di più pubblicando tutto il codice !



#include <iostream>
#include <stdio.h>
#define max 100

using namespace std;

int main(int argc, char** argv)

{
int i,j,n,m;
int a[max][max],b[max][max];

cout<<"Calcolare la somma degli elementi di una matrice appartenenti \nalle righe che non si ripetono nella matrice stessa."<<endl;
cout<<"Inserire la dimensione della matrice."<<endl;
cout<<"Inserire la dimensione di n: ";
cin>>n;
cout<<"Inserire la dimensione di m: ";
cin>>m;

//leggi_mat
for (i=0;i<n;i++)
{
for (j=0;j<m;j++)
{
cout<<"Inserire l'elemento ["<<i<<"]["<<j<<"]: ";
cin>>a[i][j];
}
}
//stampa
cout<<"La matrice inserita è: "<<endl;
for (i=0;i<n;i++)
{
for (j=0;j<m;j++)
{
cout<<a[i][j];
cout<<" ";
}
cout<<endl;
}

//doppione
/*
Scorri tutto l'array. Se trovi due elementi diversi,
ritorna 0. Se hai passato tutto l'array senza trovare
elementi diversi, ritorna 1;
*/

for (i=0;i<n;i++)
{
for (j=0;j<m;j++)
{
if (a[i][j] != a[i+1][j])
{
return 0;
}
else
{
return 1;
}
}
}

for (i=0;i<n;i++)
{
for (j=0;j<m;j++)
{
b[i][j]=a[i][j];
}
}

cout<<"La nuova matrice è: "<<endl;
for (i=0;i<n;i++)
{
for (j=0;j<m;j++)
{
cout<<b[i][j];
cout<<" ";
}
cout<<endl;
}

//somma_riga
int sum=0;
for (i=0;i<n;i++)
{
for (j=0;j<m;j++)
{
sum+=b[i][j];
}
}
cout<<"La somma degli elementi della matrice senza doppioni è "<<sum<<".";


return 0;
}

Scara95
26-08-2010, 13:53
int confrontaRighe(int r, int R, int lunghezza, int **m)
{
int i, uguali = 1;
/* confronto di due elementi della riga, se sono diversi viene impostato uguali a zero (false) e bloccato il ciclo*/
for(i = 0; i < lunghezza; i++)
if(m[r][i] != m[R][i])
{
uguali = 0;
break;
}
return uguali;
}

questo di confronta due righe....
...il resto fallo tu però... ciao :)

dibussolo
26-08-2010, 14:15
r ed R cosa sono ?
r = riga i
R = riga i + 1 ?

Loading