Classe Matrice con array di puntatori a stringhe

di il
22 risposte

Classe Matrice con array di puntatori a stringhe

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

  • Re: Classe Matrice con array di puntatori a stringhe

    Qual'è l'errore? A parte il new senza delete a fine programma non riesco a vederne altri.
  • Re: Classe Matrice con array di puntatori a stringhe

    Se lo vai ad eseguire il programma nella trasposta crasha
  • Re: Classe Matrice con array di puntatori a stringhe

    
    *temp[c][r]="-";
    
    temp[r][c] = NULL. Non puoi assegnare niente se prima non fai un new.
  • Re: Classe Matrice con array di puntatori a stringhe

    
    #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.
  • Re: Classe Matrice con array di puntatori a stringhe

    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
  • Re: Classe Matrice con array di puntatori a stringhe

    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?
  • Re: Classe Matrice con array di puntatori a stringhe

    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?
  • Re: Classe Matrice con array di puntatori a stringhe

    
    
    #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;
    }
    
  • Re: Classe Matrice con array di puntatori a stringhe

    Ma non funziona lo stesso
    mi va comunque in crash
    fammi sapere se trovi l'errore
  • Re: Classe Matrice con array di puntatori a stringhe

    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?
  • Re: Classe Matrice con array di puntatori a stringhe

    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;
    
  • Re: Classe Matrice con array di puntatori a stringhe

    
    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.
  • Re: Classe Matrice con array di puntatori a stringhe

    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]
  • Re: Classe Matrice con array di puntatori a stringhe

    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