Non capisco cosa non va

di il
26 risposte

Non capisco cosa non va

"Siano dati in ingresso due matrici di numeri interi M1 e M2.
Si assuma che il numero di colonne di M1 sia uguale al numero
di righe di M2. Scrivere un programma che, per ogni riga di M1,individui la
colonna C di M2 avente il più elevato numero di elementi in comune
con tale riga. Si provveda quindi a scambiare gli elementi della
riga R con quelli della colonna C. Stampare infine le matrici M1 e M2 cosi ottenute."

La mia soluzione è questa ma il programma non funziona correttamente poiché la colonna di interesse non viene copiata nella corrispondente riga.

#include <iostream>
#include<cstdlib>
#define nmax 100
using namespace std;
void leggi_vettore(int dim,int V[])
{

    for(int i=0;i<dim;i++)
    {
        cout<<"\nInserisci l'elemento "<<i+1<<" ";
        cin>>V[i];
    }
}
void stampa_vettore(int dim,int V[])
{
    for(int i=0;i<dim;i++)
    {
        cout<<"  "<<V[i];
    }
}
void leggi_matrice(int nrig,int ncol,int M[][nmax])
{
    for(int i=0;i<nrig;i++)
    {
        cout<<"\n";
        for(int j=0;j<ncol;j++)
        {
            cout<<"Inserisci l'elemento posto alla riga "<<i+1<<" e colonna "<<j+1<<"\n";
            cin>>M[i][j];
        }
    }
}

void stampa_matrice(int nrig,int ncol,int M[][nmax])
{
    for(int i=0;i<nrig;i++)
    {
        cout<<"\n";
        for(int j=0;j<ncol;j++)
        {
            cout<<"    "<<M[i][j]<<"    ";
        }
    }
}
int cerca_massimo(int dim,int V[])
{
    int max=V[0];
    for(int i=1;i<dim;i++)
    {
        if(max<V[i])
            max=V[i];
    }
    return max;
}
int pos_max(int dim,int V[])
{
    int max=V[0];
    int posmax=0;
    for(int i=1;i<dim;i++)
    {
        if(max<V[i])
        {
            max=V[i];
            posmax=i;
        }
    }
    return posmax+1;
}
void elimina_k_elementi(int k,int pos,int &dim,int V[])
{
    int j=pos-1;
    for(int i=j;i<dim-k;i++)
    {
        V[i]=V[i+k];
    }
    dim=dim-k;
}
int nmax_elementi_comune(int dim1,int V1[],int dim2,int V2[])
{
    int j=0;
    int k;
    int cont=0;
    while(j<dim1)
    {
        k=0;
        while(k<dim2&&j<dim1)
        {
           if(V1[j]==V2[k]) 
           {
               ++cont;
               elimina_k_elementi(1,1+j,dim1,V1);
               elimina_k_elementi(1,1+k,dim2,V2);
               k=0;
           }
           else
               ++k;
        } 
        ++j;
     }
    return cont;
}
void copia_riga_INvettore(int nrig,int ncol,int M[][nmax],int dimV,int V[],int riga)//questa funzione copia una riga di matrice in un vettore
{
    for(int i=0;i<ncol;i++)
    {
        V[i]=M[riga-1][i];
    }
}
void copia_colonna_INvettore(int nrig,int ncol,int M[][nmax],int dimV,int V[],int colonna)
{
    for(int i=0;i<nrig;i++)
    {
        V[i]=M[i][colonna-1];
    }
}
void copia_vettore_INriga(int nrig,int ncol,int M[][nmax],int dimV,int V[],int riga)//copia in una riga di matrice un vettore
{
    for(int i=0;i<ncol;i++)
    {
        M[riga-1][i]=V[i];
    }
}
void copia_vettore_INcolonna(int nrig,int ncol,int M[][nmax],int dimV,int V[],int colonna)
{
    for(int i=0;i<nrig;i++)
    {
        M[i][colonna-1]=V[i];
    }
}
int main()
{
    
    int M1[nmax][nmax];
    int M2[nmax][nmax];
    int nrig1;
    int dim;
    cout<<"Scegli il numero di righe di una matrice M1 ";
    cin>>nrig1;
    cout<<"\nScegli il numero di colonne di M1 uguale al numero di righe di una matrice M2\n";
    cin>>dim;
    leggi_matrice(nrig1,dim,M1);
    int ncol2;
    cout<<"\nScegli il numero di colonne di M2 ";
    cin>>ncol2;
    leggi_matrice(dim,ncol2,M2);
    cout<<"\nM1 = ";
    stampa_matrice(nrig1,dim,M1);
    cout<<"\nM2 = ";
    stampa_matrice(dim,ncol2,M2);
    int V1supporto[nmax];//qui memorizzo una riga di M1
    int V2supporto[nmax];//qui memorizzo una colonna di M2
    int V3supporto[nmax];//qui memorizzo il massimo numero di elementi in comune fra la riga di M1 e la colonna di M2
    for(int i=0;i<nrig1;i++)
    {
        copia_riga_INvettore(nrig1,dim,M1,dim,V1supporto,i+1);
        for(int j=0;j<ncol2;j++)
        {
            copia_colonna_INvettore(dim,ncol2,M2,dim,V2supporto,j+1);
            V3supporto[j]=nmax_elementi_comune(dim,V1supporto,dim,V2supporto);
        }
        copia_colonna_INvettore(dim,ncol2,M2,dim,V2supporto,pos_max(dim,V3supporto));
        copia_vettore_INriga(nrig1,dim,M1,dim,V2supporto,i+1);
        copia_vettore_INcolonna(dim,ncol2,M2,dim,V1supporto,pos_max(dim,V3supporto));
    }
    cout<<"\nM1 = ";
    stampa_matrice(nrig1,dim,M1);
    cout<<"\nM2 = ";
    stampa_matrice(dim,ncol2,M2);
}

26 Risposte

  • Re: Non capisco cosa non va

    Ma perché quella funzione crea_copia ?
    Per scambiare i valori ti basta una variabile temp nel ciclo in cui salvi l'elemento di V1 prima di cambiarlo
  • Re: Non capisco cosa non va

    Si le funzioni crea copia e scambio sono inutili però non le ho richiamate nel main quindi non sono loro a causare il problema. Il problema sta nella fase dello scambio, la riga viene scambiata correttamente con la colonna ma il vivecersa non avviene correttamente. E' giusto creare vettori di supporto per estrapolare righe e colonne di una matrice?
  • Re: Non capisco cosa non va

    Ma che c'entra il main? Ti ho detto di quella funzione perché la chiami nella funzione che scambia. È nella funzione che acambia che devi fare le modifiche che ti ho detto.
  • Re: Non capisco cosa non va

    Lo scambio lo faccio senza usare nessuna funzione ma in questo modo:
            
    copia_colonna_INvettore(dim,ncol2,M2,dim,V2supporto,pos_max(dim,V3supporto));
    copia_vettore_INriga(nrig1,dim,M1,dim,V2supporto,i+1);
    copia_vettore_INcolonna(dim,ncol2,M2,dim,V1supporto,pos_max(dim,V3supporto));
    
    Ricopio nel vettore V2supporto la colonna di interesse di M2. Poi mando questa colonna nella riga di M1. Infine mando la riga di M1 (memorizzata in V1supporto) nella colonna di interesse di M2.
  • Re: Non capisco cosa non va

    Ma se copi nella riga di M1 i valori precedenti li perdi. Non puoi più usarli dopo.
  • Re: Non capisco cosa non va

    Ho trovato: il problema è la funzione nmax_elementi_comune che va a modificare i vettori che prende. Dopo il ciclo for interno basta aggiungere "copia_riga_INvettore(nrig1,dim,M1,dim,V1supporto,i+1);" per riaggiornare V1supporto e funziona.
  • Re: Non capisco cosa non va

    Si è vero la matrice mi cambia quindi non posso riusarla dopo. Introduco quindi una funzione copia matrice. Poi c'erano altri errori sparsi che ho corretto. Ora pare che funziona tutto veramente. Se qualcuno ha voglia di testare gliene sarei grato.
    
    #include <iostream>
    #include<cstdlib>
    #define nmax 100
    using namespace std;
    void leggi_vettore(int dim,int V[])
    {
    
        for(int i=0;i<dim;i++)
        {
            cout<<"\nInserisci l'elemento "<<i+1<<" ";
            cin>>V[i];
        }
    }
    void stampa_vettore(int dim,int V[])
    {
        for(int i=0;i<dim;i++)
        {
            cout<<"  "<<V[i];
        }
    }
    void crea_copia_vettore(int dim,int V[],int Vcopia[])
    {
        for(int i=0;i<dim;i++)
        {
            Vcopia[i]=V[i];
        }
    }
    void leggi_matrice(int nrig,int ncol,int M[][nmax])
    {
        for(int i=0;i<nrig;i++)
        {
            cout<<"\n";
            for(int j=0;j<ncol;j++)
            {
                cout<<"Inserisci l'elemento posto alla riga "<<i+1<<" e colonna "<<j+1<<"\n";
                cin>>M[i][j];
            }
        }
    }
    
    void stampa_matrice(int nrig,int ncol,int M[][nmax])
    {
        for(int i=0;i<nrig;i++)
        {
            cout<<"\n";
            for(int j=0;j<ncol;j++)
            {
                cout<<"    "<<M[i][j]<<"    ";
            }
        }
    }
    void crea_copia_matrice(int nrig,int ncol,int M[][nmax],int Mcopia[][nmax])
    {
        for(int i=0;i<nrig;i++)
        {
            for(int j=0;j<ncol;j++)
            {
                Mcopia[i][j]=M[i][j];
            }
        }
    }
    int cerca_massimo(int dim,int V[])
    {
        int max=V[0];
        for(int i=1;i<dim;i++)
        {
            if(max<V[i])
                max=V[i];
        }
        return max;
    }
    int pos_max(int dim,int V[])
    {
        int max=V[0];
        int posmax=0;
        for(int i=1;i<dim;i++)
        {
            if(max<V[i])
            {
                max=V[i];
                posmax=i;
            }
        }
        return posmax+1;
    }
    void elimina_k_elementi(int k,int pos,int &dim,int V[])
    {
        int j=pos-1;
        for(int i=j;i<dim-k;i++)
        {
            V[i]=V[i+k];
        }
        dim=dim-k;
    }
    int nmax_elementi_comune(int dim1,int V1[],int dim2,int V2[])
    {
        int j=0;
        int k;
        int cont=0;
        while(j<dim1)
        {
            k=0;
            while(k<dim2&&j<dim1)
            {
               if(V1[j]==V2[k])
               {
                   ++cont;
                   elimina_k_elementi(1,1+j,dim1,V1);
                   elimina_k_elementi(1,1+k,dim2,V2);
                   k=0;
               }
               else
                   ++k;
            }
            ++j;
         }
        return cont;
    }
    void copia_riga_INvettore(int nrig,int ncol,int M[][nmax],int dim,int V[],int riga)//questa funzione copia una riga di matrice in un vettore
    {
        for(int i=0;i<ncol;i++)
        {
            V[i]=M[riga-1][i];
        }
    }
    void copia_colonna_INvettore(int nrig,int ncol,int M[][nmax],int dim,int V[],int colonna)
    {
        for(int i=0;i<nrig;i++)
        {
            V[i]=M[i][colonna-1];
        }
    }
    void copia_vettore_INriga(int nrig,int ncol,int M[][nmax],int dim,int V[],int riga)//copia in una riga di matrice un vettore
    {
        for(int i=0;i<ncol;i++)
        {
            M[riga-1][i]=V[i];
        }
    }
    void copia_vettore_INcolonna(int nrig,int ncol,int M[][nmax],int dim,int V[],int colonna)
    {
        for(int i=0;i<nrig;i++)
        {
            M[i][colonna-1]=V[i];
        }
    }
    int main()
    {
       
        int M1[nmax][nmax];
        int M2[nmax][nmax];
        int nrig1;
        int dim;
        cout<<"Scegli il numero di righe di una matrice M1 ";
        cin>>nrig1;
        cout<<"\nScegli il numero di colonne di M1 uguale al numero di righe di una matrice M2\n";
        cin>>dim;
        leggi_matrice(nrig1,dim,M1);
        int ncol2;
        cout<<"\nScegli il numero di colonne di M2 ";
        cin>>ncol2;
        leggi_matrice(dim,ncol2,M2);
        cout<<"\nM1 = ";
        stampa_matrice(nrig1,dim,M1);
        cout<<"\nM2 = ";
        stampa_matrice(dim,ncol2,M2);
        int V1supporto[nmax];//qui memorizzo una riga di M1
        int V1supportoCOPIA[nmax];
        int V2supporto[nmax];//qui memorizzo una colonna di M2
        int V3supporto[nmax];//qui memorizzo il massimo numero di elementi in comune fra la riga di M1 e la colonna di M2
        int M1copia[nmax][nmax];
        int M2copia[nmax][nmax];
        crea_copia_matrice(nrig1,dim,M1,M1copia);
        crea_copia_matrice(dim,ncol2,M2,M2copia);
        for(int a=0;a<nrig1;a++)
        {
            copia_riga_INvettore(nrig1,dim,M1copia,dim,V1supporto,a+1);
            for(int b=0;b<ncol2;b++)
            {
                crea_copia_vettore(dim,V1supporto,V1supportoCOPIA);
                copia_colonna_INvettore(dim,ncol2,M2copia,dim,V2supporto,b+1);
                V3supporto[b]=nmax_elementi_comune(dim,V1supportoCOPIA,dim,V2supporto);
            }
            copia_colonna_INvettore(dim,ncol2,M2copia,dim,V2supporto,pos_max(ncol2,V3supporto));
            copia_vettore_INriga(nrig1,dim,M1,dim,V2supporto,a+1);
            copia_vettore_INcolonna(dim,ncol2,M2,dim,V1supporto,pos_max(ncol2,V3supporto));
        }
        cout<<"\nM1 = ";
        stampa_matrice(nrig1,dim,M1);
        cout<<"\nM2 = ";
        stampa_matrice(dim,ncol2,M2);
    }
    
  • Re: Non capisco cosa non va

    Nessuno?
  • Re: Non capisco cosa non va

    Probabilmente nessuno risponde perché il forum serve a dare risposte su problemi e malfunzionamenti, non a fare i test degli esercizi. Non c'è tempo per queste cose, non siamo a scuola o ad un corso dove ci sono i tutor.

    Quindi, se qualcosa non va e lo scopri, fornisci le indicazioni e qualcuno si occupa di trovare una soluzione.
  • Re: Non capisco cosa non va

    Son stato diffidato a essere troppo acido.
    Qualsiasi cosa ciò significhi.
  • Re: Non capisco cosa non va

    Io sono un autodidatta quindi non ho qualcuno in carne ed ossa a cui chiedere. Come faccio a sapere se gli esercizi sono giusti? Alla fine si tratta di copiare il codice e premere RUN e darci un'occhiata veloce. Un pò una delusione sto forum...
  • Re: Non capisco cosa non va

    +m2+ ha scritto:


    Son stato diffidato a essere troppo acido.
    Qualsiasi cosa ciò significhi.
    Probabilmente non hai capito cosa significa.
  • Re: Non capisco cosa non va

    selfmademan ha scritto:


    Io sono un autodidatta quindi non ho qualcuno in carne ed ossa a cui chiedere. Come faccio a sapere se gli esercizi sono giusti? Alla fine si tratta di copiare il codice e premere RUN e darci un'occhiata veloce.
    Si tratta di farti da tutor. Può capitare che qualcuno, qualche volta, lo faccia. Ma non è il fine di un forum, ripeto, non sei ad un corso o all'università.

    Se nessuno ti risponde, non ti devi meravigliare perché non è affatto detto che si abbia il tempo di copiare, eseguire, commentare ed eventualmente correggere tutti i codici mostrati nel forum come se fosse, appunto, una scuola. Ci vuole molto più tempo di quello che credi e chi risonde, in genere, non ne ha molto e quello che ha lo dedica a dare indicazioni veloci che risolvono errori agli utenti.
    Un pò una delusione sto forum...
    Forse ti attendi troppo da un forum. Qui tutti rispondono liberamente e non si conoscono. Il forum non ha una organizzazione tipo "servizio" e nessuno è obbligato a rispondere. Non troverai un forum dove la gente sia al tuo servizio, ripeto, per quello dovrai iscriverti ad un corso.

    Finché presenterai codici con errori/problemi precisi e circoscritti, penso che qualcuno ti risponderà nel tempo libero. Se il tempo da impiegare sarà tanto, le probabilità saranno molto ridotte.
  • Re: Non capisco cosa non va

    oregon ha scritto:


    +m2+ ha scritto:


    Son stato diffidato a essere troppo acido.
    Qualsiasi cosa ciò significhi.
    Probabilmente non hai capito cosa significa.
    Lo so, spesso me lo dicono. Probabilmente ho un QI troppo basso, bisogna accontentarsi.
    Devo dire che i tuoi commenti, ad esempio, li reputo 10 volte più acidi dei miei, e didatticamente spesso inutili.
    Qualsiasi cosa ciò significhi.
Devi accedere o registrarti per scrivere nel forum
26 risposte