Classe matrice con un array a puntatori di stringhe

giuliomontenero
Salve a tutti avrei bisogno di un aiuto con questo esercizio sulle classi
creare una classe matrice con un array a puntatori di stringhe da acquisire in input; come funzioni bisogna creare una per l'acquisizione dei valori e se l'utente inseriva il "-" alla cella dell'array si assegna NULL, una per la stampa dei valori della martice e se una qualsiasi delle celle della matrice aveva NULL come valore si andava a stampare il "-"; una per la trasposta della matrice

io ci ho provato più volte e in un primo momento mi crashava il programma quando mettevo un trattino poi ho risolto e ora non mi crasha più ma neanche mi stampa la trasposta corretta , bensì la stessa di prima, avevo anche pensato di mettere la stampa all'interno della funzione trasposta ma provandoci non mi ha funzionato
#include<iostream>
#include<string>
#include<iomanip>
using namespace std;
const int N=3;
class Matrix
{
    public:
    Matrix();
    void inserisci(string* data,int r,int c);
    void stampa()const;
    void trasposta();
    private:
    string* array[N][N];
};
Matrix::Matrix()
{
    for(int i=0;i<N;i++)
    {
        for(int j=0;j<N;j++)
        {
            array[i][j]=NULL;
        }
    }
}
void Matrix::inserisci(string* data,int r,int c)
{
    if(*data=="-")
    array[r][c]=NULL;
    else
    array[r][c]=data;
}
void Matrix::stampa()const
{
    for(int r=0;r<N;r++)
    {
        for(int c=0;c<N;c++)
        {
            if(array[r][c]!=NULL)
            cout<<setw(10)<<*array[r][c]<<setw(10);
            else cout<<setw(10)<<"-"<<setw(10);
        }
        cout<<endl;
    }
}
void Matrix::trasposta()
{
    string* temp[N][N];

    for(int r=0;r<N;r++)
    {
        for(int c=0;c<N;c++)
        {
            temp[c][r]=array[r][c];
        }
    }
    for(int r=0;r<N;r++)
    {
        for(int c=0;c<N;c++)
        {
            cout<<setw(10)<<*temp[r][c]<<setw(10);
        }
        cout<<endl;
    }
}

int main()
{
    Matrix mat;
    string* value;
    for(int r=0;r<N;r++)
    {
        for(int c=0;c<N;c++)
        {
            value=new string;
            cout<<"Inserire il valore della cella"<<r<<","<<c<<":";
            cin>>*value;
            mat.inserisci(value,r,c);
        }
    }
    cout<<"Matrice:"<<endl;
    mat.stampa();
    cout<<"Matrice trasposta:"<<endl;
    mat.trasposta();
return 0;
}


Risposte
vict85
Manca soltanto il controllo che il puntatore non sia NULL.

giuliomontenero
cioè?
puoi farmi vedere come e dove va scritto nel codice?

vict85
Puoi fare così
void Matrix::trasposta()
{
    string* temp[N][N];

    for(int r=0;r<N;r++)
    {
        for(int c=0;c<N;c++)
        {
            temp[c][r]=array[r][c];
        }
    }
    for(int r=0;r<N;r++)
    {
        for(int c=0;c<N;c++)
        {
            const string str = *temp[r][c] == NULL? "-" : temp[r][c];
            cout<<setw(10)<< str <<setw(10);
        }
        cout<<endl;
    }
}


Oppure anche
void Matrix::trasposta()
{
    string* temp[N][N];

    for(int r=0;r<N;r++)
    {
        for(int c=0;c<N;c++)
        {
            temp[c][r]=array[r][c];
        }
    }
    for(int r=0;r<N;r++)
    {
        for(int c=0;c<N;c++)
        {
            if(temp[r][c] == NULL)
               cout<<setw(10)<< "-" <<setw(10); 
            else cout<<setw(10)<< *temp[r][c] <<setw(10);
        }
        cout<<endl;
    }
}

In altre parole il codice è corretto ma nella seconda visualizzazione hai dimenticato di tenere conto del fatto che c'erano i puntatori a NULL...

giuliomontenero
ti ringrazio moltissimo ho capito dove avevo sbagliato, o meglio cosa avevo dimenticato

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