Inclusione tra vettori

di Anonimizzato18300 il
17 risposte
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

  • Rifletti ... così la variabile flag avrà un valore che dipende solo dall'ultimo confronto.
  • 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;
    }
  • 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 è ");
    }
    
  • Ti ringrazio , ti confesso che con questo codice ho capito meglio il procedimento da fare
  • 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...).
  • Un attimo ... che succede con

    {1, 2, 5};

    da cercare in

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

    ?
  • 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.
  • 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.
  • 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.
  • 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?
  • 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
  • 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.
  • 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
  • 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