Programma con matrici e scambio

di il
6 risposte

Programma con matrici e scambio

Es. 1 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.


#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 alla 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 pos_max(int dim,int V[])
{
    int max=V[0];
    int posmax=0;
    for(int i=1;i<dim;i++)
    {
        if(V[i]>max)
        {
            max=V[i];
            posmax=i;
        }
    }
    return posmax+1;
}
int nmax_comune(int dim1,int V1[],int dim2,int V2[])
{
    int cont=0;
    int j;
    for(int i=0;i<dim2;i++)
    {
        j=0;
        if(V2[i]==V1[j])
            cont++;
        else
        {
            while(V2[i]!=V1[j]&&j<=dim1-1)
            {
                ++j;
                if(V2[i]==V1[j])
                {
                    ++cont;
                    break;
                }
            }
        }
    }
    return cont;
}
int main() 
{
    cout<<"Numero colonne M1 e righe M2 ";
    int dim;
    cin>>dim;
    cout<<"\nNumero righe M1 ";
    int nrig1;
    cin>>nrig1;
    cout<<"\nNumero colonne M2 ";
    int ncol2;
    cin>>ncol2;
    int M1[nmax][nmax];
    int M2[nmax][nmax];
    cout<<"\nInserimento della prima matrice...\n";
    leggi_matrice(nrig1,dim,M1);
    cout<<"\nM1 = ";
    stampa_matrice(nrig1,dim,M1);
    cout<<"\nInserimento della seconda matrice...\n";
    leggi_matrice(dim,ncol2,M2);
    cout<<"\nM2 = ";
    stampa_matrice(dim,ncol2,M2);
    //creo 2 vettori di supporto V1 e V2 in cui memorizzare rispettivamente una riga di M1 e una colonna di M2
    int V1[nmax];
    int V2[nmax];
    int V3[nmax];  //creo un terzo vettore V3 nelle cui componenti memorizzo il max numero di elementi in comune tra la riga e la colonna. La posizione del max mi darà la colonna da scambiare.
    for(int j=0;j<nrig1;j++)
    {
        for(int i=0;i<dim;i++) //copio in V1 la j-esima riga di M1
        {
            V1[i]=M1[j][i];
        }
        for(int k=0;k<ncol2;k++)
        {
            for(int i=0;i<dim;i++)  //copio in V2 la k-esima colonna di M2
            {
                V2[i]=M2[i][k];
            }
            //copio nella k-esima componente di V3 il massimo numero di elementi in comune tra la riga j di M1 e la colonna k di M2
            V3[k]=nmax_comune(dim,V1,dim,V2);
        }
        //scambio
        for(int i=0;i<dim;i++)
        {
            M1[j][i]=M2[i][pos_max(ncol2,V3)-1];
            M2[i][pos_max(ncol2,V3)-1]=V1[i];
        }
    }
    cout<<"\nM1 = ";
    stampa_matrice(nrig1,dim,M1);
    cout<<"\nM2 = ";
    stampa_matrice(dim,ncol2,M2);
}

6 Risposte

  • Re: Programma con matrici e scambio

    Suppongo che tu voglia un parere, come per il thread che hai aperto in precedenza.
    Queste le prime impressioni:
    - nmax scrivilo in maiuscolo (NMAX) perchè questa è la consuetudine;
    - perchè il codice dell'algoritmo è all'interno del main(), ovvero perchè non hai scritto una funzione apposita?
    - le variabili locali definiscile tutte assieme all'inizio della funzione (main() in questo caso); specie gli array/matrici, tanto le "allochi" tutte alla dimensione massima possibile (NMAX)
  • Re: Programma con matrici e scambio

    Si però uno non deve immaginare anche ka domanda che viene posta...

    @selfmademan ... Fai le domande chiare e specifiche quando posti...
  • Re: Programma con matrici e scambio

    Beh era sottinteso che volevo un parere.
    Comunque penso di non aver capito bene cosa devo fare quando mi viene chiesto di organizzare un programma in sottoprogrammi. Significa forse che devo strutturare il programma in funzioni ognuna delle quali esegue un compito specifico?
    Quando scrivo il codice non sono abituato a creare una funzione da subito. All'inizio scrivevo tutto all'interno del main e il mio programma finiva così. Poi mi sono creato un insieme di funzioni ricorrenti che uso da un pò di tempo a questa parte. Se però non ho una funzione pronta per risolvere un certo problema, io risolvo il problema sempre all'interno del main come ho fatto in questo caso.
    La funzione me la creo solo se intuisco che può essere significativa e usata anche in altri esercizi altrimenti non la creo. Ad esempio una funzione per leggere e stampare vettori e matrici è chiaro che è utile. Ma a cosa mi serve creare una funzione per eseguire un compito specifico come quello richiesto dall'esercizio?
    Le funzioni vanno create sempre a prescindere da un loro riutilizzo futuro?
  • Re: Programma con matrici e scambio

    Beh era sottinteso che volevo un parere.
    Era sottinteso per me che ti ho seguito nell'altro thread! Specifica sempre bene cosa ti serve
    Comunque penso di non aver capito bene cosa devo fare quando mi viene chiesto di organizzare un programma in sottoprogrammi. Significa forse che devo strutturare il programma in funzioni ognuna delle quali esegue un compito specifico?
    Esatto, nulla ti vieta di scrivere tutto all'interno del main ma se ti abitui a creare una funzione per ciascun sottoproblema, anche se tale funzione non verrà riutilizzata in futuro in altri progetti, hai comunque il vantaggio di affrontare piccoli problemi ben definiti uno alla volta.
    La funzione me la creo solo se intuisco che può essere significativa e usata anche in altri esercizi altrimenti non la creo. Ad esempio una funzione per leggere e stampare vettori e matrici è chiaro che è utile. Ma a cosa mi serve creare una funzione per eseguire un compito specifico come quello richiesto dall'esercizio?
    Serve a definire e ad affrontare un sottoproblema, sottoinsieme del problema principale, senza doversi occupare di tutti gli altri sottoproblemi.
    Ad esempio, se devi provare l'algoritmo che hai implementato e ti sei stufato di dover ogni volta inserire dei valori da tastiera, puoi eventualmente chiamare la funzione con dei dati diversi, caricati da file oppure costanti nel codice; puoi anche chiamare più volte la funzione con dati in input diversi, per testarla; se hai scritto tutto nel main verrà fuori un pasticcio mentre se hai una funzione non c'è bisogno che la modifichi, basta richiamarla con dati diversi... prova a rifletterci sopra.
    Le funzioni vanno create sempre a prescindere da un loro riutilizzo futuro?
    Non esiste una regola: di certo è che è piuttosto raro trovare un'applicazione reale con il codice tutto presente nel main.
  • Re: Programma con matrici e scambio

    Ok grazie mille sei stato molto esaustivo:)!
  • Re: Programma con matrici e scambio

    I prototipi delle funzioni li metto nella cartella denominata "Header Files" mentre le funzioni anzichè metterle dentro la cartella "Source Files" nel file main.cpp le metto in un altro file separato da main.cpp sempre all'interno di "Source Files"?
Devi accedere o registrarti per scrivere nel forum
6 risposte