Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2015
    Messaggi
    32

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

    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:
    codice:
    #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:
    codice:
    #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:
    codice:
    #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:
    provola 1.jpg
    2)2 Righe Crescenti
    provola 2.jpg
    3) 3 Righe Crescenti
    provola 3.jpg
    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
    Ultima modifica di Warioss; 21-01-2016 a 19:20

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    L'errore è in EliminaRigCresc
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    Nov 2015
    Messaggi
    32
    Quote Originariamente inviata da oregon Visualizza il messaggio
    L'errore è in EliminaRigCresc
    Penso di aver capito in EliminaRigCresc devo mettere i--; altrimenti non mi trovo con il numero di riga che decresce

  4. #4
    Utente di HTML.it
    Registrato dal
    Dec 2015
    Messaggi
    23
    Quote Originariamente inviata da Warioss Visualizza il messaggio
    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:
    codice:
    #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:
    codice:
    #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:
    codice:
    #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:
    provola 1.jpg
    2)2 Righe Crescenti
    provola 2.jpg
    3) 3 Righe Crescenti
    provola 3.jpg
    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
    sembra piuttosto complicato

  5. #5
    Utente di HTML.it
    Registrato dal
    Nov 2015
    Messaggi
    32
    Quote Originariamente inviata da hezter Visualizza il messaggio
    sembra piuttosto complicato
    No , non lo è ... te lo assicuro

    Grazie Oregon , era come dicevo io :
    Quote Originariamente inviata da Warioss Visualizza il messaggio
    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

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.