Massimo numero elementi in comune tra 2 vettori

di il
8 risposte

Massimo numero elementi in comune tra 2 vettori

Mi date un parere su questo programma che mi dice il massimo numero di elementi in comune tra due vettori?
Io penso di star migliorando ma vorrei conferma da qualcuno più esperto. Grazie.

#include <iostream>
#include<cstdlib>
using namespace std;
bool trova_elemento(int dim,int V[],int k,int i)
{
        if(V[i]==k)
        {
           return true;
        }
        else
           return false;
}
void ivettore(int dim,int V[])
{
    for(int i=0;i<dim;i++)
    {
        cout<<"\nInserisci l'elemento "<<i+1<<" ";
        cin>>V[i];
    }
}
void ovettore(int dim,int V[])
{
    for(int i=0;i<dim;i++)
    {
        cout<<"  "<<V[i];
    }
}
int main() 
{
    int V1[100];
    int dim1;
    cout<<"Scegli dimensione V1: ";
    cin>>dim1;
    ivettore(dim1,V1);
    cout<<"\nV1 = ";
    ovettore(dim1,V1);
    int V2[100];
    int dim2;
    cout<<"\nScegli dimensione V2: ";
    cin>>dim2;
    ivettore(dim2,V2);
    cout<<"\nV2 = ";
    ovettore(dim2,V2);
    int cont=0;
    int j;
    for(int i=0;i<dim2;i++)
    {
        j=0;
        if(trova_elemento(dim1,V1,V2[i],j)==1)
            cont++;
        else
        {
            while(trova_elemento(dim1,V1,V2[i],j)==0&&j<=dim1-1)
            {
                ++j;
                
                if(trova_elemento(dim1,V1,V2[i],j)==1)
                {
                    ++cont;
                    break;
                }
            }
        }
    }
    cout<<"\nIl numero massimo di elementi in comune è "<<cont;
}

8 Risposte

  • Re: Massimo numero elementi in comune tra 2 vettori

    Non posso provarlo quindi non so dirti se funziona (potresti dircelo tu?) ma posso dirti che i vettori dovresti inizializzarli dopo aver chiesto la dimensione con
    int V1[dim1], V2[dim2];
    così non li inizializzi con un maggiore numero di elementi (se dim1 e dim2 sono minori di 100) e se invece sono maggiori puoi anche dargli una dimensione maggiore di 100 in quel caso. Inoltre trova_elemento è di tipo bool, quindi non serve confrontarla con niente nell'if e nel while (se proprio devi, confrontala con un bool) ma è inutile, tanto la funzione stessa ti ritorna true o false
  • Re: Massimo numero elementi in comune tra 2 vettori

    Indipendentemente dal funzionamento, ti segnalo alcune cose che secondo me rendono illeggibile il tuo programma (non offenderti ):
    - ivettore() e ovettore(): dal nome non si capisce cosa facciano, non era meglio leggi_vettore() e stampa_vettore() (usando lo stesso stile che hai adottato per trova_elemento())?
    - la funzione trova_elemento() riceve in input una serie di valori che in realtà non le servono, prima di tutto dim (inutilizzato) e poi V[] ed i (al posto delle quali potresti passare direttamente V)
    - se ragioni sul punto precedente, capirai che il nome trova_elemento() è fuorviante, sembra che all'interno venga fatta una ricerca; molto meglio sarebbe stato check_elemento() oppure, ancora meglio, is_elemento_uguale() (anche se non è bello mischiare italiano e inglese)
    - capirai, anche, che la funzione trova_elemento(), comunque tu la chiami, non serve a niente
    - se hai capito tutto fino a qui, capirai anche che la vera funzione che dovevi fare riguarda i due cicli for e while che hai brutalmente inserito nel main()
    - per l'inserimento delle dimensioni degli array, dato che è codice ripetuto, potevi farne una funzione (es.: leggi_dimensione()); naturalmente dovresti controllare che la dimensione inserita 1<=dim<=100 (al posto di 100 puoi usare una define?)
  • Re: Massimo numero elementi in comune tra 2 vettori

    E comunque non è neanche necessario usare una funzione solo e soltanto per verificare se due valori sono uguali, potresti farlo direttamente e sarebbe anche più leggibile e facile da capire
  • Re: Massimo numero elementi in comune tra 2 vettori

    Provo a correggere quello che mi avete suggerito.
    Comunque il programma funziona correttamente.

    Perchè la funzione trova_elemento è inutile? Se non la introducessi poi avrei del codice ripetuto nel main, e da quel che ho capito voi non volete che ci sia codice ripetuto visto che mi chiedete addirittura di definire una funzione per leggere la dimensione dei vettori.
  • Re: Massimo numero elementi in comune tra 2 vettori

    La funzione trova_elemento non fa altro che ritornare true se un certo elemento di V1 è uguale a un certo elemento di V[2], e false se sono diversi. Quindi invece di farlo fare a una funzione, potresti mettere direttamente quei due elementi a confronto. Per esempio nel primo caso tu fai
    trova_elemento(dim1,V1,V2,j)
    che alla fine potresti semplificare con V1[j]==V2 perché tanto é questo che fa la funzione, quindi è inutile
  • Re: Massimo numero elementi in comune tra 2 vettori

    Perchè la funzione trova_elemento è inutile? Se non la introducessi poi avrei del codice ripetuto nel main, e da quel che ho capito voi non volete che ci sia codice ripetuto visto che mi chiedete addirittura di definire una funzione per leggere la dimensione dei vettori.
    Solo per chiarire:
    - la funzione trova_elemento() è inutile perchè in fin dei conti non fa altro che testare due valori che potrebbero benissimo essere testati direttamente;
    - la funzione trova_elemento() non solo è inutile ma anche dannosa ai fini della leggibilità del codice in quanto sembra che faccia una cosa mentre ne fa un'altra, e richiede dei parametri che poi non usa...
    - lo scopo delle funzioni non è solo quello di riunire codice ripetuto: le funzioni servono prima di tutto a suddividere logicamente il problema in tanti sottoproblemi;
    - la suddivisione dovrebbe nascere fin da subito nella stesura del programma, per es. in questo caso nel main() mi aspetterei
    dimA=leggi_vettore(A);
    dimB=leggi_vettore(B); 
    if((dimA>0)&&(dimB>0))
    {
       stampa_vettore(A,dimA);
       stampa_vettore(B,dimB);
       cont=conta_elementi(A,dimA,B,dimB);
       printf("ci sono %d elementi comuni\n",cont);
    } 
    
  • Re: Massimo numero elementi in comune tra 2 vettori

    Ho apportato le modifiche tenendo conto dei consigli. Non ho inserito il controllo sulle dimensioni visto che negli esercizi svolti dal docente non c'è.
    
    #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];
        }
    }
    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()
    {
        int V1[nmax];
        int dim1;
        cout<<"Scegli dimensione V1: ";
        cin>>dim1;
        leggi_vettore(dim1,V1);
        cout<<"\nV1 = ";
        stampa_vettore(dim1,V1);
        int V2[nmax];
        int dim2;
        cout<<"\nScegli dimensione V2: ";
        cin>>dim2;
        leggi_vettore(dim2,V2);
        cout<<"\nV2 = ";
        stampa_vettore(dim2,V2);
        cout<<"\nIl numero massimo di elementi in comune è "<<nmax_comune(dim1,V1,dim2,V2);
    }
    
    
    Schermata del RUN

    Scegli dimensione V1: 9

    Inserisci l'elemento 1 8

    Inserisci l'elemento 2 34

    Inserisci l'elemento 3 5

    Inserisci l'elemento 4 6

    Inserisci l'elemento 5 5

    Inserisci l'elemento 6 3

    Inserisci l'elemento 7 23

    Inserisci l'elemento 8 4

    Inserisci l'elemento 9 5

    V1 = 8 34 5 6 5 3 23 4 5
    Scegli dimensione V2: 3

    Inserisci l'elemento 1 2

    Inserisci l'elemento 2 3

    Inserisci l'elemento 3 4

    V2 = 2 3 4
    Il numero massimo di elementi in comune è 2
    RUN SUCCESSFUL (total time: 7s)
  • Re: Massimo numero elementi in comune tra 2 vettori

    Ho rifatto l'esercizio adottando una nuova logica e questo è il risultato.
    
    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;
    }
    
    Secondo me è più efficiente, voi che dite?
Devi accedere o registrarti per scrivere nel forum
8 risposte