Inclusione tra vettori

di il
17 risposte

Inclusione tra vettori

Buona sera , sono alle prese con questo esercizo:
/*Letti in input due array di numeri interi (rispettivamente di n e m elementi)
verifica se tutti gli elementi del primo sono contenuti nel secondo-
ESEMPIO: Gli elementi di A=(1, 2,3) sono contenuti in B=(8, 1, 3, 7, 5, 2, 6)).
Nota che gli elementi nei due array non sono ordinati.
*/
Dopo aver riempito gli array, averli ordinati ed averli stampati, per vedere se tutto fosse andato a buon fine, ho eseguito l'altra meta' di consegna. Ho elaborato questo codice ma purtroppo mi dice sempre che "il primo vettore non e' contento nel secondo". Non vedo l'errore.
int incluso(int *v, int *v2, int dim1, int dim2){
int i, j, flag;

 for(i=0; i<dim1; i++){
  for(j=0; j<dim2; j++){
   if(v[i]!=v2[j])
    flag=1;
   else
    flag=0;
  }
 }
 
return flag;
}

17 Risposte

  • Re: Inclusione tra vettori

    Rifletti ... così la variabile flag avrà un valore che dipende solo dall'ultimo confronto.
  • Re: Inclusione tra vettori

    oregon ha scritto:


    Rifletti ... così la variabile flag avrà un valore che dipende solo dall'ultimo confronto.
    Alla fine ho cambiato il codice in questo modo e ancora non sembra funzionare :
    int incluso(int *v, int *v2, int dim1, int dim2){
    int i, j=0, flag=0;
    
     for(i=0; i<dim1 && flag==0; i++){
        flag=1;
      while(j<dim2 && v[i]!=v[j]){
        j++;
      }
      if(j<dim2){
        flag=0;
      }
     }
    
    return flag;
    }
  • Re: Inclusione tra vettori

    Non serve usare mille cicli innestati per svolgere il controllo richiesto.
    
    ........
    size_t i = 0;
    while(array_piccolo[i] == array_grande[i] && i < dimensione_array_piccolo)
    {
       i++;
    }
    if(i == dimensione_array_piccolo)
    {
       puts("Array piccolo è in array grande);
    }
    else
    {
       puts("Non lo è ");
    }
    
  • Re: Inclusione tra vettori

    Ti ringrazio , ti confesso che con questo codice ho capito meglio il procedimento da fare
  • Re: Inclusione tra vettori

    Ovviamente il codice proposto si basa sull'assunto che gli array siano già stati ordinati.L'efficienza del programma in questione,mantenendo questa soluzione, dipende pesantemente dall'algoritmo di sorting scelto.Un insertion sort andrà bene se si vuole fare felice il/la povera insegnante incompetente dell'itis che si frequenta o se si è alle prime armi come autodidatti.In ogni caso apprendere anche gli altri algoritmi,oltre a essere mandatario,è utile per migliorare il problem solving,requisito indispensabile per un programmatore.Da notare,perché tu lo sappia,che esiste molto di meglio di quanto scritto da te e da quanto proposto da me.Per esempio esiste il Boyer-Moore per la ricerca veloce di sottostringhe in una stringa (basta ricordare che una stringa è una array di char è che i char sono interi...).
  • Re: Inclusione tra vettori

    Un attimo ... che succede con

    {1, 2, 5};

    da cercare in

    {1, 2, 3, 4, 5, 6};

    ?
  • Re: Inclusione tra vettori

    Non funziona naturalmente. Dipende come si intende l'esercizio:
    -se B deve essere in A così com'è allora quanto proposto può essere la base per l'esercizio.
    - se gli elementi devono essere in A anche in ordine sparso allora bisogna fare altro.
  • Re: Inclusione tra vettori

    Secondo me l'esercizio non lascia adito a dubbi. Quando dice
    verifica se tutti gli elementi del primo sono contenuti nel secondo
    mi sembra chiarissimo.

    Quindi quel codice non va e un semplice docente dell'itis (anche poco preparato), avrebbe ben ragione di dare un cattivo voto.
  • Re: Inclusione tra vettori

    loopunrolling ha scritto:


    Ovviamente il codice proposto si basa sull'assunto che gli array siano già stati ordinati.L'efficienza del programma in questione,mantenendo questa soluzione, dipende pesantemente dall'algoritmo di sorting scelto.Un insertion sort andrà bene se si vuole fare felice il/la povera insegnante incompetente dell'itis che si frequenta.
    Io ho ordinato l'array altrimenti non mi avrebbe dato mai un risultato corretto applicando il codice che avevo formulato anche se presentava degli errori già di suo.
    Da notare,perché tu lo sappia,che esiste molto di meglio di quanto scritto da te e da quanto proposto da me.Per esempio esiste il Boyer-Moore per la ricerca veloce di sottostringhe in una stringa (basta ricordare che una stringa è una array di char è che i char sono interi...)
    Per questo che hai scritto non sapevo l'esistenza di questo algoritmo, grazie per le informazioni.
  • Re: Inclusione tra vettori

    oregon ha scritto:


    Quindi quel codice non va e un semplice docente dell'itis (anche poco preparato), avrebbe ben ragione di dare un cattivo voto.
    Da cio' deduco che se i numeri inserito sono A={1,2,3} e B={1,2,3,6 } l'algoritmo funzona, se invece i numeri sono A={1,2,4} e B={1,2,3,4} da' una soluzione errata. Giusto?
  • Re: Inclusione tra vettori

    La soluzione di questo esercizio fornito dal docente e' la seguente:
    
    flag = 1;
    i=0; 
     while (i<n && flag==1) { 
      flag = 0;
      j = 0; 
       while (j<m && A[i]!=B[j]) { 
        j = j+1;   } 
      if (j<m) 
      flag = 1;
      i++;  } //end-while
      
    if (flag == 1) 
       printf("L'array A e' contenuto in B.\n"); 
     else
      printf("L'array A non e' contenuto in B.\n");
    }   //end-mai
    Questa soluzione non e' riuscita a chiarire i miei dubbi, cosi' ho scritto qua e ho capito meglio il concetto. I docenti non sono molto preparati, forniscono poco materiale e soprattutto non riescono a spiegare in maniera chiara. Infatti mi sono rifiutata di seguire le loro lezioni e quindi sto studiando da autodidatta. Parlo di docenti universitari, quindi la situazione e' critica
  • Re: Inclusione tra vettori

    Fare questo esercizio è semplice,farlo bene è un altra cosa.
    
    int flag = 1;
    for (size_t i = 0;i < dim1 && flag == 1; i++)
    {
      for(size_t j = 0; j. < dim2 && flag ! = 1;j++)
      {
          flag = arr1[i]  == arr2[j];
      }
    }
    if( flag)
    {
       puts("trovato");
    }
    else
    {
      puts("Non trovato");
    }
    
    Ovviamente fa schifo ed è lento.
  • Re: Inclusione tra vettori

    loopunrolling ha scritto:


    Fare questo esercizio è semplice,farlo bene è un altra cosa.
    Alla fine per risolvere l'esercizio come lo vogliono loro, ovvero in maniera non del tutto funzionante, il codice che mi avevi postato precedentemente penso che vada bene
  • Re: Inclusione tra vettori

    Dipende dalla consegna come ha fatto notare Oregon. Per casi generici va bene l'ultimo postato,se invece gli elementi dell'array piccolo devono comparire in ordine nel l'array grande allora quel che ho postato prima va bene purché:
    - gli array siano ordinati
    -non abbiano duplicati
    - si consideri solo la prima occorenza
Devi accedere o registrarti per scrivere nel forum
17 risposte