Classe Matrice....

giuliomontenero
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 header
#ifndef MATRICE_H_INCLUDED
#define MATRICE_H_INCLUDED
#include<string>
using namespace std;
const int N=4;
class matrice
{
public:
matrice();
void leggi();
void stampa();
void mirror();

private: string a[N][N];

}


#endif // MATRICE_H_INCLUDED

file sorgente 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, string 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][j]=a[i][N-1-j];
            a[i][N-1-j]=temp;
        }
    }

}

file sorgente matricetest.cpp
#include<iostream>
#include<string>
#include "matrice.h"
main()
{
    matrice M();
    M.leggi();
    M.stampa();
    M.mirror();
    M.stampa();

}

Risposte
apatriarca
Ti ho già detto di utilizzare il tag code per inserire il tuo codice nei post. C'è un pulsante apposito nell'editor avanzato e puoi inserirlo direttamente scrivendo [ code ] (senza spazi tra la parola e le parentesi) prima del codice e [ /code ] dopo. In questo modo la formattazione si mantiene e non c'è il rischio di avere parti del codice sostituite da emoticons (può ad esempio capitare con :D).

giuliomontenero
l'ho modificato ora è leggibile
potreste darmi una mano?

apatriarca
Che cosa non ti funziona esattamente? Non ho tempo in questo momento di provare a compilare e a far girare il codice e ad una prima occhiata veloce mi sembra abbastanza corretto.

giuliomontenero
lo pensavo anche io
ma non mi funziona
se puoi darci un occhiata mi faresti un piacere
almeno capisco dove sbaglio

apatriarca
Non mi hai ancora detto che cosa non funziona. In ogni caso gli errori che ho trovato sono:
1. Manca un ; dopo la dichiarazione della classe.
2. Nella riga
getline(cin, string a[i][j]);

string è di troppo. Cancellalo.
3. La funzione main DEVE restituire int in C++. In C era possibile omettere il tipo perché int era il tipo di ritorno di default, ma in C++ le cose sono cambiate ed è necessario scrivere esplicitamente che il tipo di ritorno del main è int.
4. Per richiamare il costruttore di default devi scrivere semplicemente
matrice M;

Tutti i compilatori che ho non accettano la tua versione, anche se devo ammettere che in questo momento non mi è chiaro il perché.

giuliomontenero
a me non funziona lo stesso
potresti provare a compilarlo e mi dici cos'è che non va
saranno sicuramente cose semplice , ma almeno così facendo vedo gli errori e capisco una volta per tutte
ti ringrazio
se mi puoi aiutare al più presto

apatriarca
Con le modifiche che ti ho elencato a me compila e funziona correttamente.

giuliomontenero
non ho capito dove devo metter il ; della prima modifica esattamente
potresti farmelo vedere nel codice

apatriarca
Dove chiudi la parentesi graffa della classe. matrice.h deve insomma diventare come la seguente:
#ifndef MATRICE_H_INCLUDED
#define MATRICE_H_INCLUDED
#include<string>
using namespace std;
const int N=4;
class matrice
{
public:
matrice();
void leggi();
void stampa();
void mirror();

private: string a[N][N];

};

#endif // MATRICE_H_INCLUDED

giuliomontenero
compilando entrambi i file sorgente mi dà sempre lo stesso errore
undefined reference to per tutte le funzioni della classe
provaci un secondo e fammi sapere
oppure mi posti il programma classe matrice con i tre file che a te funzionano e risolviamo
grazie mille

apatriarca
In matrice.cpp dovevi solo togliere quel string da quella riga. Cioé
#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][j]=a[i][N-1-j];
            a[i][N-1-j]=temp;
        }
    }

}

Mentre nel file matricetest.cpp dovevi togliere () dopo M, cioè
#include<iostream>
#include<string>
#include "matrice.h"
main()
{
    matrice M;
    M.leggi();
    M.stampa();
    M.mirror();
    M.stampa();

}

giuliomontenero
a me non funziona
ti posto gli errori
nel file matricetest.cpp quando lo vado a compilare ecco gli errori
C:\Users\Vincenzo\Desktop\prova laboratorio\matricetest.o:matricetest.cpp|| undefined reference to `matrice::matrice()'|
C:\Users\Vincenzo\Desktop\prova laboratorio\matricetest.o:matricetest.cpp|| undefined reference to `matrice::leggi()'|
C:\Users\Vincenzo\Desktop\prova laboratorio\matricetest.o:matricetest.cpp|| undefined reference to `matrice::stampa()'|
C:\Users\Vincenzo\Desktop\prova laboratorio\matricetest.o:matricetest.cpp|| undefined reference to `matrice::mirror()'|
C:\Users\Vincenzo\Desktop\prova laboratorio\matricetest.o:matricetest.cpp|| undefined reference to `matrice::stampa()'|
||=== Build finished: 5 errors, 0 warnings ===|

nel file matrice.cpp ecco l'errore

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 ===|

apatriarca
ma hai creato un'applicazione Win32? WinMain è necessaria solo quando si creano applicazione GUI per Windows (usando le API di Windows). Credo che tu abbia configurato male Code::Blocks o il progetto.

giuliomontenero
mi potresti spiegare come devo fare passo passo usando questi 3 file scritti correttamente
devo creare un progetto e includerli e poi andarlo a compilare e eseguire
se potresti darmi una spiegazione dettagliata mi saresti molto utile

giuliomontenero
@apatriarca
l'ho fatto con un progetto e mi funziona ora
ma in un singolo file no
prova un pò a vedere per favore
mi dà un errore nel main
error:expected ; before const
che vuol dire?
#include <iostream>
#include <string>

using namespace std;

const int N=4;

class Matrice
{
public:
Matrice();
void leggi();
void stampa()const;
void mirror();
private:
string a[N][N];
};

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

void Matrice::leggi()
{
for(int i=0;i<N;i++)
{
for(int j=0;j<N;j++)
{
string str;
cin>>str;
getline(cin,str);
a[i][j]=str;
}
}
}

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

void Matrice::mirror()
{
string ap;
for(int i=0;i<N;i++)
{
for(int j=0;j<N/2;j++)
{
ap=a[i][j];
a[i][j]=a[i][N-1-j];
a[i][N-1-j]=ap;
}
}
}
int main()
{
    Matrice M;
    M.leggi();
    M.stampa()const;
    M.mirror();
    M.stampa()const;
return 0;
}


Rggb1
"maschulillo":
error:expected ; before const
che vuol dire?

Fai la traduzione. ;)

Ok, te la faccio io: "Errore: mi aspettavo il carattere ';' prima di 'const' "

[ PS. I 'const' scritti nel main non vanno vene... dove hai trovato tale sintassi? :?: Comunque, toglili. ]

giuliomontenero
ma non mi funziona lo stesso
puoi veder il perchè?
eppure il codice è giusto

Rggb1
"maschulillo":
ma non mi funziona lo stesso

Cosa intendi dire, che ottieni un errore in fase di compilazione? Oppure il programma non ha il comportamento desiderato? Nell'ultimo caso, posta un esempio di esecuzione.

[ Noto che c'è una funzione "leggi" che usa sia cin>>str; sia getline(cin,str);, sei sicuro di voler fare ciò? ]

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.