PDA

Visualizza la versione completa : [C++]Elimina tutte e sole le righe crescenti da una matrice, semplice e risolto ma non funziona per tutti gli input.


Warioss
21-01-2016, 18:13
Salve a tutti , oggi ho provato a fare un esercizio che dice :
"Letta da file una matrice di interi in cui sono specificati numero di riga come primo valore e numero di colonna come secondo valore, cancellare da questa matrice tutte e sole le colone crescenti"

Ho provato così:

MAIN:


#include <iostream>
#include "CancRigCresc.h"
using namespace std;
int main(int argc, char** argv) {
matrice m;
int r,c;
LeggiMatriceFile("Matrice.txt",m,r,c);
StampaMatrice(m,r,c);
cout<<"La matrice senza le righe crescenti e':\n";
EliminaRigCresc(m,r,c);
StampaMatrice(m,r,c);
return 0;
}


HEADER:


#include <fstream>
#define N 100
typedef int vettore[N];
typedef int matrice[N][N];
typedef char VettoreCaratteri[N];
void LeggiMatriceFile(VettoreCaratteri,matrice,int&,int&);
void StampaMatrice(matrice,int,int);
void EliminaRiga(matrice,int&,int,int);
bool RigaCrescente(matrice,int,int);
void EliminaRigCresc(matrice,int&,int);


BODY:


#include <iostream>
#include "CancRigCresc.h"
using namespace std;


void LeggiMatriceFile(VettoreCaratteri nomefile,matrice m,int& r,int& c){
fstream f;
r=0,c=0;
f.open(nomefile,ios::in);
if(!f)
cout<<"Access Denied Or Can't found file\n";
else{
while(!f.eof()){
f>>r;
f>>c;
for(int i=0;i<r;i++)
for(int j=0;j<c;j++)
f>>m[i][j];
}
}
}


void StampaMatrice(matrice m,int r,int c){
for(int i=0;i<r;i++){
for(int j=0;j<c;j++){
cout<<m[i][j]<<" ";
}
cout<<endl;
}
}


void EliminaRiga(matrice m,int& r,int c,int rigacan){
for(int j=0;j<c;j++)
for(int i=rigacan;i<r;i++)
m[i][j]=m[i+1][j];
r--;
}
bool RigaCrescente(matrice m,int rigafissata ,int c){
for(int j=0;j<c-1;j++){
if(m[rigafissata][j]<m[rigafissata][j+1])
return true;
}
return false;
}


void EliminaRigCresc(matrice m,int& r,int c){
int k=0;
for(int i=0;i<r;i++){
if(RigaCrescente(m,i,c)){
EliminaRiga(m,r,c,i);
r++;
k++;
}
}
r=r-k;
}


Mi Funziona SOLO se le righe crescenti sono 1 oppure 2 , altrimenti non va... e non capisco il motivo!

ESEMPI:
1) 1 solo Riga Crescente:
26757
2)2 Righe Crescenti
26758
3) 3 Righe Crescenti
26759
4) 4 Righe Crescenti
http://i65.tinypic.com/sl2wit.png

Come vedete negli esempi 3) e 4) non funziona mentre in 1) e 2) si... Non riesco a capire il motivo

Grazie mille a chiunque mi aiuta :D

oregon
22-01-2016, 11:15
L'errore è in EliminaRigCresc

Warioss
22-01-2016, 11:53
L'errore è in EliminaRigCresc
Penso di aver capito in EliminaRigCresc devo mettere i--; altrimenti non mi trovo con il numero di riga che decresce

hezter
22-01-2016, 15:24
Salve a tutti , oggi ho provato a fare un esercizio che dice :
"Letta da file una matrice di interi in cui sono specificati numero di riga come primo valore e numero di colonna come secondo valore, cancellare da questa matrice tutte e sole le colone crescenti"

Ho provato così:

MAIN:


#include <iostream>
#include "CancRigCresc.h"
using namespace std;
int main(int argc, char** argv) {
matrice m;
int r,c;
LeggiMatriceFile("Matrice.txt",m,r,c);
StampaMatrice(m,r,c);
cout<<"La matrice senza le righe crescenti e':\n";
EliminaRigCresc(m,r,c);
StampaMatrice(m,r,c);
return 0;
}


HEADER:


#include <fstream>
#define N 100
typedef int vettore[N];
typedef int matrice[N][N];
typedef char VettoreCaratteri[N];
void LeggiMatriceFile(VettoreCaratteri,matrice,int&,int&);
void StampaMatrice(matrice,int,int);
void EliminaRiga(matrice,int&,int,int);
bool RigaCrescente(matrice,int,int);
void EliminaRigCresc(matrice,int&,int);


BODY:


#include <iostream>
#include "CancRigCresc.h"
using namespace std;


void LeggiMatriceFile(VettoreCaratteri nomefile,matrice m,int& r,int& c){
fstream f;
r=0,c=0;
f.open(nomefile,ios::in);
if(!f)
cout<<"Access Denied Or Can't found file\n";
else{
while(!f.eof()){
f>>r;
f>>c;
for(int i=0;i<r;i++)
for(int j=0;j<c;j++)
f>>m[i][j];
}
}
}


void StampaMatrice(matrice m,int r,int c){
for(int i=0;i<r;i++){
for(int j=0;j<c;j++){
cout<<m[i][j]<<" ";
}
cout<<endl;
}
}


void EliminaRiga(matrice m,int& r,int c,int rigacan){
for(int j=0;j<c;j++)
for(int i=rigacan;i<r;i++)
m[i][j]=m[i+1][j];
r--;
}
bool RigaCrescente(matrice m,int rigafissata ,int c){
for(int j=0;j<c-1;j++){
if(m[rigafissata][j]<m[rigafissata][j+1])
return true;
}
return false;
}


void EliminaRigCresc(matrice m,int& r,int c){
int k=0;
for(int i=0;i<r;i++){
if(RigaCrescente(m,i,c)){
EliminaRiga(m,r,c,i);
r++;
k++;
}
}
r=r-k;
}


Mi Funziona SOLO se le righe crescenti sono 1 oppure 2 , altrimenti non va... e non capisco il motivo!

ESEMPI:
1) 1 solo Riga Crescente:
26757
2)2 Righe Crescenti
26758
3) 3 Righe Crescenti
26759
4) 4 Righe Crescenti
http://i65.tinypic.com/sl2wit.png

Come vedete negli esempi 3) e 4) non funziona mentre in 1) e 2) si... Non riesco a capire il motivo

Grazie mille a chiunque mi aiuta :D
sembra piuttosto complicato

Warioss
22-01-2016, 16:18
sembra piuttosto complicato
No , non lo è ... te lo assicuro :p

Grazie Oregon , era come dicevo io :

Penso di aver capito in EliminaRigCresc devo mettere i--; altrimenti non mi trovo con il numero di riga che decresce

Tutto risolto , il topic può essere chiuso/eliminato .
Alla prossima :D :ciauz:

Loading