Classe Matrice....

di il
15 risposte

Classe Matrice....

Avrei bisogno di un aiutino per risolvere questo esercizio sulle classi
il testo è il seguente:
Realizzare in c++ una classe Matrice che possiede come attributo un array NxN di stringhe , dove N è una costante intera.
La classe deve disporre di:
-un costruttore che inizializza tutti gli elementi della matrice con la stringa vuota;
-una funzione leggi() che legge riga per riga dallo standard input il valore di tutti gli elementi della matrice;
-una funzione stampa() che stampa riga per riga dallo standard output il valore di tutti gli elementi della matrice(andando a capo per ogni nuova riga);
-una funzione mirror() che modifica la matrice scambiando tra loro le colonne k e N-1-k(k=0,1,....,N-1).
Esempio data una matrice 3x3:
a b c
d e f
g h i

il suo mirror è
c b a
f e d
i h g

data una matrice 4x4:
a b c l
d e f m
g h i n
o p q r
il suo mirror è
l c b a
m f e d
n i h g
r q p o

allora io l'ho fatto per mezzo di una compilazione separata
ecco il mio codice con qualche errorino che non cqapisco come correggerlo

file Matrice.h

#ifndef MATRICE_H
#define MATRICE_H

#include<string>
using namespace std;

const int N=3;
class Matrice
{
    public:
    Matrice();
    void leggi();
    void stampa();
    void mirror();

    private: string a[N][N];
};
#endif

file Matrice.cpp

#include<iostream>
#include <string>
#include "Matrice.h"

using namespace std;

Matrice::Matrice()
{
    int i,j;
    for(i=0;i<N;i++){
        for(j=0;j<N;j++){
            a[i][j]="";
        }
    }
}

void Matrice::leggi()
{
    int i,j;
    string a[i][j];

    for(i=0;i<N;i++){
        for(j=0;j<N;j++){
            getline(cin, a[i][j]);
        }
    }
}

void Matrice::stampa()
{
    int i,j;
    for(i=0;i<N;i++){
        for(j=0;j<N;j++){
            cout<<a[i][j]<<" ";
        }
        cout<<endl;
    }
}

void Matrice::mirror()
{
    int i,j;
    string temp;
    for(i=0;i<N;i++){
        for(j=0;j<N/2;j++){
            temp=a[i][j];
            a[i][N-1-j]=temp;
            a[i][j]=a[i][N-1-j];
        }
    }
}

file provaMatrice.cpp

#include<iostream>
#include<string>

#include "Matrice.h"

int i,j;
string a[N][N];

main()
{
    Matrice M();

    leggi(a[][]);

    stampa(a[][]);

    mirror(a[][]);

    stampa(a[][]);
}

15 Risposte

  • Re: Classe Matrice....

    Dalla definizione di string
    
    string ( ); //constructor
        Content is initialized to an empty string.
    
    quindi questo codice non ha senso di esistere.
    
    int i,j;
        for(i=0;i<N;i++){
            for(j=0;j<N;j++){
                a[i][j]="";
            }
        }
    
    il costruttore di stringa ha già fatto tutto per te.

    questi invece sono tutti sbagliati.
    
    Matrice M();
    
        leggi(a[][]);
    
        stampa(a[][]);
    
        mirror(a[][]);
    
        stampa(a[][]);
    
    Leggi bene come creare una instanza di una classe e come usare i suoi membri funzione.
  • Re: Classe Matrice....

    Non riesco ad applicarlo
    infatti è proprio qui che mi da errore
    come si fa?
    potresti aiutarmi?
  • Re: Classe Matrice....

    
    Matrice M;
    
        M.leggi();
    
        M.stampa();
    
        M.mirror();
    
        M.stampa();
    
    Ma su che libri studiate?
  • Re: Classe Matrice....

    Ti ringrazio ora ci provo e vedo se mi funziona
    altrimenti ti dico quali errori mi da
    grazie ancora
  • Re: Classe Matrice....

    Ma mi hai preso per un servizio clienti? Il tuo libro cosa ti dice al riguardo?
  • Re: Classe Matrice....

    Allora io ho provato a mettere M.leggi
    così per tutte le funzioni
    mi dà comunque errore
    e comunque io sto solo cercando di capirci qualcosa
    ho letto molte dispense ma ninete non riesco ad applicare la teoria
    potresti controllare col tuo compilatore e correggermi gli errori
    mi faresti veramente una cortesia
  • Re: Classe Matrice....

    Il problema è che non hai chiaro il concetto delle classi. Anche se io te lo mettessi a posto alla fine avrai il problema di non capire perche funziona. Guarda la funzione leggi. Cos'è sta roba qui
    
    void Matrice::leggi()
    {
        int i,j;
        string a[i][j]; //cos'è questo.
    
        for(i=0;i<N;i++){
            for(j=0;j<N;j++){
                getline(cin, a[i][j]);
            }
        }
    }
    
    La matrice "a" esiste per ogni oggetto della classe Matrice e tu lo stai ridefinendo dentro una funzione. UNa classe è una struct (spero sai cos'è una struct) ma per default tutti i suoi membri sono privati, in una struct i membri sono publici. Togli quella riga e il tuo programma funziona.
  • Re: Classe Matrice....

    Allora ho capito qual'era il problema più grande, ho corretto la riga che dicevi tu e ho capito perchè avevo sbagliato, ora però ho lo stesso errore per tutte le dichiarazioni delle funzioni
    potresti dirmi perchè
    ti posto nuovamente i file modificati
    file Matrice.h
    
    #ifndef MATRICE_H
    #define MATRICE_H
    
    #include<string>
    using namespace std;
    
    const int N=3;
    class Matrice
    {
        public:
        Matrice();
        void leggi();
        void stampa();
        void mirror();
    
        private: string a[N][N];
    };
    #endif
    
    
    file Matrice.cpp
    
    #include<iostream>
    #include <string>
    #include "Matrice.h"
    
    using namespace std;
    
    Matrice::Matrice()
    {
        int i,j;
        for(i=0;i<N;i++){
            for(j=0;j<N;j++){
                a[i][j]=" ";
            }
        }
    }
    
    void Matrice::leggi()
    {
        int i,j;
    
        for(i=0;i<N;i++){
            for(j=0;j<N;j++){
                getline(cin, a[i][j]);
            }
        }
    }
    
    void Matrice::stampa()
    {
        int i,j;
        for(i=0;i<N;i++){
            for(j=0;j<N;j++){
                cout<<a[i][j]<<" ";
            }
            cout<<endl;
        }
    }
    
    void Matrice::mirror()
    {
        int i,j;
        string temp;
        for(i=0;i<N;i++){
            for(j=0;j<N/2;j++){
                temp=a[i][j];
                a[i][N-1-j]=temp;
                a[i][j]=a[i][N-1-j];
            }
        }
    }
    
    
    file provaMatrice.cpp
    
    #include<iostream>
    #include<string>
    
    #include "Matrice.h"
    
    int i,j;
    string a[N][N];
    
    main()
    {
        Matrice M;
    
        M.leggi();
    
        M.stampa();
    
        M.mirror();
    
        M.stampa();
    }
    
    
  • Re: Classe Matrice....

    File provaMatrice.cpp
    
        #include<iostream>
        #include "Matrice.h"
    
        int    main()
        {
            Matrice M;
    
            M.leggi();
    
            M.stampa();
    
            M.mirror();
    
            M.stampa();
        }
    
    non esiste main() e basta. Ma li leggi gli errori che ti propone il compilatore?
  • Re: Classe Matrice....

    Io risolverei nel seguente modo...

    Non metto la compilazione separata.
    
    #include <iostream>
    #include <string>
    const int n=3;
    
    using namespace std;
    
    void swap(string& a,string &b)
    {
        string appo;
        appo=a;
        a=b;
        b=appo;
    }
    
    
    class matrice
       {
        public:
           matrice();
           void leggi();
           void stampa();
           void mirror();
       private:
          string mat[n][n];
       };
       // definizione costruttore
       matrice::matrice()
       {
           for(int i=0;i<n;i++)
            for(int j=0;j<n;j++)
             {
                 mat[i][j]="";
             }
       }
       // lettura della matrice
       void matrice::leggi()
        {
           for(int i=0;i<n;i++)
           {
            for(int j=0;j<n;j++)
            {
    
                cout<<"inserire elemento "<< i << ", " << j <<" della matrice: ";
                cin>>mat[i][j];
            }
           }
        }
        // stampa della matrice
        void matrice::stampa()
        {
    
             for(int i=0;i<n;i++)
           {
              cout<<endl;
            for(int j=0;j<n;j++)
            {
    
                //cout<<"Stampa dell' elemento "<< i << ", " << j <<" della matrice: ";
                cout<<" "<<mat[i][j];
    
            }
            cout<<endl;
           }
        }
        //funzione mirror
        void matrice::mirror()
        {
            int j=0;
            int f=n-1-j;
    
            while(j<(n/2))
             {
                 for(int i=0;i<n;i++)
                 {
                 swap(mat[i][j],mat[i][f]);
    
             }
             j++;
    
             }
        }
    
    
    
    
    
    int main()
    {
        cout << "MATRICE MIRROR!" << endl;
    
        matrice matr;
        cout<<endl;
        cout<<"inserire elementi matrice"<<endl;
        cout<<endl;
        matr.leggi();
        cout<<endl;
        cout<<"stampa elementi"<<endl;
        matr.stampa();
        cout<<endl;
        cout<<"dopo lo scambio otteniamo"<<endl;
        matr.mirror();
        cout<<endl;
        cout<<"STAMPO"<<endl;
        matr.stampa();
        return 0;
    }
    
    
    dove praticamente:
    Creo una funzione non membro di nome SWAP che fa lo scambio di 2 valori.
    Ometto la spiegazione della lettura e della stampa della matrice.
    la funzione mirror:
    Prendi ogni elemento "i" della matrice e lo scambi con l'elementi "n-1-i" con la funzione swap
  • Re: Classe Matrice....

    Ciao Bomberdini, e invece con la compilazione separata, come lo risolveresti ?
  • Re: Classe Matrice....

    Skynet comunque l'errore che mi continua a dare è sempre il seguente
    nel file Matrice.cpp
    c:\program files\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\..\..\..\libmingw32.a(main.o):main.c|| undefined reference to `WinMain@16'|
    ||=== Build finished: 1 errors, 0 warnings ===|
    nel file provaMatrice.cpp

    C:\Users\Giulio\Desktop\provaMatrice.o:provaMatrice.cpp|| undefined reference to `Matrice::Matrice()'|
    C:\Users\Giulio\Desktop\provaMatrice.o:provaMatrice.cpp|| undefined reference to `Matrice::leggi()'|
    C:\Users\Giulio\Desktop\provaMatrice.o:provaMatrice.cpp|| undefined reference to `Matrice::stampa()'|
    C:\Users\Giulio\Desktop\provaMatrice.o:provaMatrice.cpp|| undefined reference to `Matrice::mirror()'|
    C:\Users\Giulio\Desktop\provaMatrice.o:provaMatrice.cpp|| undefined reference to `Matrice::stampa()'|
    ||=== Build finished: 5 errors, 0 warnings ===|

    non capisco cosa significo, tant'è che non è indicata nemmeno la riga
    perchè a te invece non dà errori?
  • Re: Classe Matrice....

    
    reference to `WinMain@16
    
    Hai creato una applicazione win32 quando dovevi creare una console.
    L'errore però parla del file Matrice.cpp che non è il file da dove partire l'applicazione. Insomma devi vedere le impostazioni del progetto oppure creare un progetto nuovo. Quelli non sono errori C++ ma errori del compliatore/linker.
  • Re: Classe Matrice....

    Non ho capito bene
    in pratica cosa dovrei fare di preciso?
    grazie
Devi accedere o registrarti per scrivere nel forum
15 risposte