Classe Matrice con array di puntatori a stringhe

di Anonimizzato8504 il
22 risposte
L'esercizio grosso modo diceva :
creare una classe matrice con un array a puntatori di stringhe da acquisire in input; come funzioni bisognava creare una per l'acquisizione dei valori e se l'utente inseriva il "-" alla cella dell'array si assegnava 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 (dove nella stessa funzione ho messo la stampa direttamente)
dov'è che sbaglio ragazzi? vorrei capire qualcosa

#include<iostream>
#include<string>

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 k=0; k<N; k++)
            array[i][k]=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<<*array[r][c]<<" ";
        else
            cout<<"- ";
    }
    cout<<endl;
    }
}

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

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

for(int r=0; r<N; r++)
{
    for(int c=0; c<N; c++)
{
        if(temp[r][c]!=NULL)
        cout<<*temp[r][c]<<" ";
        else
        cout<<"-"<<" ";
}
    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;
}


22 Risposte

  • Qual'è l'errore? A parte il new senza delete a fine programma non riesco a vederne altri.
  • Se lo vai ad eseguire il programma nella trasposta crasha
  • 
    *temp[c][r]="-";
    
    temp[r][c] = NULL. Non puoi assegnare niente se prima non fai un new.
  • 
    #include<iostream>
    #include<string>
    
    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 k=0; k<N; k++)
                array[i][k]=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<<*array[r][c]<<" ";
            else
                cout<<"- ";
        }
        cout<<endl;
        }
    }
    
    void Matrix::trasposta()
    {
        string* temp[N][N];
    
    	for(int r=0; r<N; r++)
        {
    		for(int c=0; c<N; c++)
    		{
    			if(array[r][c]!=NULL)
    				temp[c][r]=array[r][c];
    			else
    				temp[c][r]= NULL;
    		}
    	}
    
    	for(int r=0; r<N; r++)
    	{
    		for(int c=0; c<N; c++)
    		{
    			if(temp[r][c]!=NULL)
    			cout<<*temp[r][c]<<" ";
    			else
    			cout<<"-"<<" ";
    		}
    		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;
    }
    
    cmq senza i delete io sto codice non lo considero completo.
  • L'ho fatto
    
    string* temp[N][N];
    temp[N][N]=new string;
    
    ma non mi funziona lo stesso
    e non capisco proprio il perchè
    le condizioni mi pare di averle messe tutte
  • Prova la mia modifica. In C++ non esiste il garbage collector quindi ad ogni new deve corrispondere un delete. Non te l'hanno insegnato a scuola?
  • Sisi per deallocare la memoria
    non l'ho messo perchè non penso che non basti la memoria per questo programmino
    dove devo inserire il delete nomepuntatore?
    alla fine della funzione trasposta,dopo che effettuo la stampa?
  • 
    
    #include<iostream>
    #include<string>
    
    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 k=0; k<N; k++)
                array[i][k]=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<<*array[r][c]<<" ";
            else
                cout<<"- ";
        }
        cout<<endl;
        }
    }
    
    void Matrix::trasposta()
    {
        string* temp[N][N];
        temp[N][N]=new string;
        for(int r=0; r<N; r++)
        {
        for(int c=0; c<N; c++)
        {
    
            if(array[r][c]!=NULL)
            temp[c][r]=array[r][c];
            else
            *temp[c][r]="-";
        }
        }
    
    for(int r=0; r<N; r++)
    {
        for(int c=0; c<N; c++)
    {
            if(temp[r][c]!=NULL)
            cout<<*temp[r][c]<<" ";
            else
            cout<<"-"<<" ";
    }
        cout<<endl;
    }
    delete temp[N][N];
    }
    
    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;
    }
    
  • Ma non funziona lo stesso
    mi va comunque in crash
    fammi sapere se trovi l'errore
  • LA MIA MODIFICA NON LA TUA.
    
    void Matrix::trasposta()
    {
        string* temp[N][N];
    
       for(int r=0; r<N; r++)
        {
          for(int c=0; c<N; c++)
          {
             if(array[r][c]!=NULL)
                temp[c][r]=array[r][c];
             else
                temp[c][r]= NULL;
          }
       }
    
       for(int r=0; r<N; r++)
       {
          for(int c=0; c<N; c++)
          {
             if(temp[r][c]!=NULL)
             cout<<*temp[r][c]<<" ";
             else
             cout<<"-"<<" ";
          }
          cout<<endl;
       }
    }
    
    Ma leggete prima di postare o no?
  • Ora funziona grazie ho capito l'errore
    ma vorrei chiederti un'altra cosa
    
    void Matrix::trasposta()
    {
        string* temp[N][N];
        temp[N][N]=new string;
        for(int r=0; r<N; r++)
        {
        for(int c=0; c<N; c++)
        {
    
            if(array[r][c]!=NULL)
            temp[c][r]=array[r][c];
            else
            temp[c][r]=NULL;
        }
        }
    
    for(int r=0; r<N; r++)
    {
        for(int c=0; c<N; c++)
    {
            if(temp[r][c]!=NULL)
            cout<<*temp[r][c]<<" ";
            else
            cout<<"-"<<" ";
    }
        cout<<endl;
    }
    delete temp[N][N];
    }
    
    perchè se lascio l'allocatore new e il delete il programma crasha ?

    Altra domanda:
    nel main invece quando metto
    
    string* value;
    
    perchè non posso allocare subito la memoria per il puntatore string ma devo farlo all'interno del ciclo?
    
    int main()
    {
        Matrix mat;
    
        string* value;
        for(int r=0; r<N; r++)
        {
        for(int c=0; c<N; c++)
        {
            value=new string;
    
  • 
    temp[N][N]=new string;
    
    questo non è C++ e non so cosa sia.
    perchè non posso allocare subito la memoria per il puntatore string ma devo farlo all'interno del ciclo?
    perche ad ogni allocazione viene assegnato un nuovo indirizzo alla variabile value che perde così il vecchio dato per ricevere il nuovo. Infatti questo metodo di programmazione è molto pericolso perche devi fare un casino di attenzione come allochi e assegni le risorse.
  • L'ultima risposta è stata molto chiara ma non ho capito la prima risposta
    non devo allocare la memoria ogniqualvolta dichiaro una variabile puntatore
    per esempio nel main l'ho fatto a string* value
    e ho allocato la memoria con value=new string e l'ho fatto all'interno del ciclo per il motivo che mi hai spiegato sopra
    ma non capisco perchè non lo posso fare anche per
    string*temp[N][N]=new string;
    e perchè poi non posso fare il delete di temp[N][N]
  • Perche puoi allocare un array ma non una matrice. puoi invece fare
    
    string *temp = new string[N*N];
    
    .......
    
    delete [] temp;
    
    Ma quì devi poi cambiare il tuo codice.
Devi accedere o registrarti per scrivere nel forum
22 risposte