Funzione restituzione array

di il
15 risposte

Funzione restituzione array

Scrivere una funzione C++ che, dati due array di interi positivi a
e b, restituisce l’array c che si ottiene eliminando da a gli elementi che appaiono in b (si
suppone che gli array a e b non contengano elementi ripetuti).
Esempio: a={2,11,6,5,9}, e b={2,3,4,11,7,5}. La funzione restituisce c={6,9}.

cosa c'è che nn va?

#include<iostream>
using namespace std;
const int N=20;
void funzione(int [], int []);
int main()
{
    int a[N]={2,11,6,5,9};
    int b[N]={2,3,4,11,7,5};
    funzione(a,b);

    return 0;

}

void funzione(int x[N],int y[N])
{
    int i,j;
    int c[N];
    int dc=0;
    bool condizione=false;
    for(i=0;i<N && !condizione;i++)
    {
        for(j=0;j<N && !condizione;j++)
        {
          if(x[i]!=y[j] && !condizione)
          {
              condizione=true;
              c[dc]=x[i];
              dc++;
          }
        }
        condizione=false;
    }
    cout<<"Gli elementi dell'array sono :"<<"\n";
    for(int k=0;k<dc;k++)
    cout<<c[k]<<" ";
}

15 Risposte

  • Re: Funzione restituzione array

    Era necessaria un' altra istruzione if all' interno del secondo ciclo for. Come puoi osservare adesso ho utilizzato la funzione cin.get() al posto del system("PAUSE"), inoltre anche se la funzione ritorna void io preferisco sempre mettere l' istruzione return, anche se si potrebbe omettere, ma per avere una maggiore chiarezza nella logica del programma.

    Il programma corretto è il seguente:
    #include<iostream>
    using namespace std;
    const int N=20;
    void funzione(int [], int []);
    int main()
    {
        int a[N]={2,11,6,5,9};
        int b[N]={2,3,4,11,7,5};
        funzione(a,b);
        cin.get();
        return 0;
    
    }
    
    void funzione(int x[N],int y[N])
    {
        int i,j;
        int c[N];
        int dc=0;
        bool condizione=false;
        for(i=0; i<N && !condizione; i++)
        {
            for(j=0; j<N && !condizione; j++)
            {
              if(x[i]==y[j] && !condizione)
                condizione=true;
              
              if(j==N-1 && !condizione)
               {
                c[dc]=x[i];
                dc++; 
               }
            }
          condizione=false;
        }
        cout<<"Gli elementi dell'array sono :\n";
        for(int k=0; k<dc; k++)
        cout<<c[k]<<" ";
        return;
    }
    
  • Re: Funzione restituzione array

    Scusami ma io nenache cin.get() ho mai usato
    sarebbe la stessa cosa di prima
    in realtà non potrei usare cose che non ho studiato
    praticamente solo array e cicli posso usare

    e soprattutto quel secondo ciclo io non l'ho capito a cosa serve
    perche
    
    j==N-1
    
  • Re: Funzione restituzione array

    Puoi anche non metterla la funzione cin.get(), il programma risulta essere corretto lo stesso.

    Per quanto riguarda l' istruzione:
    if(j==N-1 && !condizione)
    Essa è necessaria, perchè solamente quando il ciclo for è arrivato a j= N-1 e la condizione è ancora falsa, allora significa che nel vettore b[N] non sono presenti elementi uguali all' i-mo elemento del vettore a[N] ed in questo caso potremo inserire questo elemento nel vettore c[N].

    Matteo
  • Re: Funzione restituzione array

    Ok grazie ora ci ragiono un attimo e ti faccio sapere se ho qualche problema
    grazie ancora
  • Re: Funzione restituzione array

    Scusami non è che potresti spiegarmi meglio questa parte
    non capisco perchè è stata messa questa condizione
  • Re: Funzione restituzione array

    La condizione j==N-1 permette di sapere quando l' analisi degli elementi del vettore b[N] è arrivata al suo termine (l' indice negli array va da 0 a N-1), infatti solo quando l' analisi del vettore è arrivata al suo termine e la condizione risulta essere ancora falsa allora significa che tutti gli elementi del vettore b[N] sono diversi dall' i-mo elemento del vettore a[N] e pertanto potremo inserire questo elemento nel vettore c[N].

    Matteo
  • Re: Funzione restituzione array

    Ma la condizione in j==N-1 risulta essere true per inserirlo nel vettore c[N]?
    e poi scusa un'altra domanda
    ma N è una costante definita sopra(ho messo N=20)
    se b ha nel caso nostro come dimensione logica 6 per N-1 dovrebbe essere di 19 elementi quindi non ho capito da 6 a 20 tutti gli elementi sono 0
    in parole povere come fa a capire qual'è la dimensione logica dell'array, perchè l'ho già inizializzato io?
  • Re: Funzione restituzione array

    Gli elementi del vettore a[N] vengono inseriti nel vettore c[N] solo quando la condizione è false, infatti:
    if(j==N-1 && !condizione)
    significa che l' istruzione if verrà eseguita solo se j==N-1 e la condizione risulta essere false (!condizione).

    Per quanto riguarda l' altra domanda, gli elementi del vettore a[N] per gli indici da 5 a N-1 e del vettore b[N] per gli indici da 6 a N-1 sono tutti nulli.
    Infatti quando inizializzi gli array nel seguente modo:
    int a[N]={2,11,6,5,9};
    int b[N]={2,3,4,11,7,5};


    automaticamente inizializzi a zero tutti gli elementi degli indici che non sono stati inseriti.
    Puoi verificare facilmente ciò compilando il programma seguente che è identico a quello dell' esercizio ma dove ho aggiunto nel main:
    int i;
    cout<<"Il vettore a[N] contiene gli elementi:\n";
    for(i=0; i<20; i++)
    cout<<a[i]<< ",";  
    cout<< "\n";
    cout<< "\n";
    cout<<"Il vettore b[N] contiene gli elementi:\n";
    for(i=0; i<20; i++)
    cout<<b[i]<< ",";
    cout<< "\n";
    cout<< "\n";
    che mi permettono di vedere il contenuto di tutti e 20 gli elementi dei vettori a[N] e b[N].
    Il programma è il seguente:
    #include<iostream>
    using namespace std;
    const int N=20;
    void funzione(int [], int []);
    int main()
    {
        int a[N]={2,11,6,5,9};
        int b[N]={2,3,4,11,7,5};
        int i;
        cout<<"Il vettore a[N] contiene gli elementi:\n";
        for(i=0; i<20; i++)
        cout<<a[i]<< ",";  
        cout<< "\n";
        cout<< "\n";
        cout<<"Il vettore b[N] contiene gli elementi:\n";
        for(i=0; i<20; i++)
        cout<<b[i]<< ",";
        cout<< "\n";
        cout<< "\n";
        funzione(a,b);
        cin.get();
        return 0;
    
    }
    
    void funzione(int x[N],int y[N])
    {
        int i,j;
        int c[N];
        int dc=0;
        bool condizione=false;
        for(i=0; i<N && !condizione; i++)
        {
            for(j=0; j<N && !condizione; j++)
            {
              if(x[i]==y[j] && !condizione)
                condizione=true;
              
              if(j==N-1 && !condizione)
               {
                c[dc]=x[i];
                dc++; 
               }
            }
          condizione=false;
        }
        cout<<"Gli elementi che vanno nell'array c[N] sono:\n";
        for(int k=0; k<dc; k++)
        cout<<c[k]<<" ";
        return;
    }
    
    
  • Re: Funzione restituzione array

    Scusami ho ancora due domande
    ma se noi abbiamo inizializzato condizione =false
    quando scrivo
      !condizione  
    la va a negare e quindi dovrebbe essere true
    quindi perchè tu sopra mi hai scritto che l' istruzione if verrà eseguita solo se j==N-1 e la condizione risulta essere false (!condizione).

    e soprattutto quando
     j==N-1 
    non potrebbe essere che quest'elemento appaia in b e quindi non deve essere aggiunto al vettore c?

    giuro che dopo queste domande non ti rompo più su quest'esercizio
  • Re: Funzione restituzione array

    Non è corretto quello che dici sulla condizione booleana della istruzione if.
    L' istruzione:
    if(condizione)
    significa che se la condizione è true (condizione=true), allora l' istruzione if viene eseguita.

    Mentre l' istruzione:
    if(!condizione)
    significa che se la condizione è false (condizione=false), allora l' istruzione viene eseguita.

    Per verificarlo prova a compilare questo semplice programma di esempio:
    #include<iostream>
    using namespace std;
    
    int main()
    {
      bool condizione=false;
      if(condizione)
      cout<<"La condizione e' vera\n";  
      if(!condizione)
      cout<<"la condizione e' falsa\n";
      cin.get();
      return 0;
    }
    Per quanto riguarda la seconda domanda, scusami ma non ho capito bene quello che vuoi dire, potresti spiegarmela meglio?

    Matteo
  • Re: Funzione restituzione array

    Ok per la prima parte ho capito
    grazie
    ma per quanto riguarda la seconda domanda volevo dire quando j==N-1 chi te lo dice che bisogna inserire quel valore nel nuovo vettore?
    perchè questo?
  • Re: Funzione restituzione array

    Quando j=N-1 avremo:
    if(x[i]==y[N-1] && !condizione)
      condizione=true;
    Pertanto solo se x=y[N-1] e la condizione è false, verrà cambiata la condizione in true.
    Successivamente avremo l' istruzione:
    if(j==N-1 && !condizione)
    Pertanto nel vettore c[N] verrà inserito l' i-mo elemento di a[N] solo se la condizione è ancora false e quindi abbiamo x!=y[N-1].

    Matteo
  • Re: Funzione restituzione array

    Ok grazie penso di aver capito anche questa parte
    ma perchè non stampa anche gli zeri il vettore?
    te lo chiedo perchè in un altro esercizio che ho postato simile ho lo stesso problema
  • Re: Funzione restituzione array

    Non vengono stampati gli zeri semplicemente perchè il vettore c[N] non li contiene, infatti sono elementi in comune sia del vettore a[N] che del vettore b[N].

    Matteo
Devi accedere o registrarti per scrivere nel forum
15 risposte