Appartenenza di un elemento ad array con function

di il
10 risposte

Appartenenza di un elemento ad array con function

Buongiorno a tutti, avevo questo esercizio scritto da un professore sull'appartenenza di un elemento a un array, ma nell'andare a farlo non mi funziona. Questa è la function di appartenenza:
int appartiene_aF(float chiave, float a[], int n){

int i=0;

for(i=0; i<n; i++){
           if(chiave==a[i])
            return 1;
else return 0;
}}
La chiamata della function:
esito_ricerca=appartiene_aF(chiave, a, n_elem);
if(esito_ricerca)
    printf("L'elemento appartiene all'array");
else printf("L'elemento non appartiene all'array");
Questo è il codice per intero:

 int appartiene_aF(float, float [], int n);
void legge_da_tastiera_aF(float [], int);
void visualizza_aF(float [], int);


int main(){

float a[100], chiave;
int esito_ricerca, n_elem;
printf("Inserire numero degli elementi dell'array <=100: ");
scanf("%d", &n_elem);
printf("Inserire gli elementi dell'array: \n");
legge_da_tastiera_aF(a, n_elem);
printf("L'array e': \n");
visualizza_aF(a, n_elem);
printf("\n");
printf("Inserire elemento da ricercare nell'array: ");
scanf("%f", &chiave);
esito_ricerca=appartiene_aF(chiave, a, n_elem);
if(esito_ricerca)
    printf("L'elemento appartiene all'array");
else printf("L'elemento non appartiene all'array");


return 0;


}

void legge_da_tastiera_aF(float a[], int n){
int i;

for(i=0; i<n; i++){
    printf("Inserisci elemento %d dell'array: ", i+1);
    scanf("%f", &a[i]);
}
}

void visualizza_aF(float a[], int n){

int i;
for(i=0; i<n; i++){
    printf("%f ", a[i]);
}
}

int appartiene_aF(float chiave, float a[], int n){

int i=0;

for(i=0; i<n; i++){
           if(chiave==a[i])
            return 1;
else return 0;
}}
Il programma non riconosce mai l'appartenenza di un elemento all'array, è come se ritornasse sempre 0 e mai 1 (ho provato a scrivere !esito_ricerca nel main e invertire le printf e ho verificato).

10 Risposte

  • Re: Appartenenza di un elemento ad array con function

    La funzione non è corretta ... deve essere
    
    int appartiene_aF(float chiave, float a[], int n) {
    
    	int i;
    
    	for (i = 0; i<n; i++)
    		if (chiave == a[i])
    			return 1;
    
    	return 0;
    }
    
  • Re: Appartenenza di un elemento ad array con function

    Ah, ecco... avevo provato a mettere e togliere l'else ma evidentemente l'errore era il return 0 dentro il for (?). Grazie
  • Re: Appartenenza di un elemento ad array con function

    Ovviamente sì... ti sei spiegata il perché?
  • Re: Appartenenza di un elemento ad array con function

    oregon ha scritto:


    Ovviamente sì... ti sei spiegata il perché?
    Penso sia perché con il return 0 dentro al for la funzione non saprebbe cosa ritornare...cioè se per esempio la chiave fosse nella posizione 3 di un array di 6 elementi, diventerebbe 1 al passo 3 e poi tornerebbe a 0 nei passi successivi, invece mettendolo fuori ritorna 0 solo nel caso in cui la chiave non sia stata trovata. Correggimi se sbaglio.
    Piccolo dubbio: se la chiave viene trovata l'if ritorna 1, ma il return 0 fuori poi non viene proprio eseguito? Il return 1 esclude il return 0?
  • Re: Appartenenza di un elemento ad array con function

    Secondo me ti fai semplicemente fuorviare dai rientri (indentazione), che sono invece una cosa più che altro "estetica", anche se preziosi per rendere leggibile il codice. Guarda come cambia la "espressività" di quel che hai scritto se lo formuli nel primo o nel secondo di questi due modi.
    for(i=0; i<n; i++){
               if(chiave==a[i])
                return 1;
    else return 0;
    }
    
    for( i=0; i<n; i++ ) {
        if( chiave==a[i] )
            return 1;
        else return 0;
    }
    Il risultato delle due presentazioni è identico (sbagliato in entrambi i casi), ma secondo me nel secondo caso si capisce molto meglio perché il codice non funziona come vorresti.

    A voler vedere, così sarebbe ancora più chiaro:
    for( i=0; i<n; i++ ) {
        if( chiave==a[i] ) {
            return 1;
        }
        else {
            return 0;
        }
    }
  • Re: Appartenenza di un elemento ad array con function

    Sulla scia di quanto detto da @AldoBaldo ti consiglio vivamente di scrivere codice indentato e di racchiudere il corpo delle istruzioni di controllo (if, for, while, ecc.) tra parentesi graffe anche quando si tratta di una sola riga di codice.

    In ogni caso alla luce del tuo ultimo post mi sorge un dubbio... sai cosa fa l'istruzione return?
  • Re: Appartenenza di un elemento ad array con function

    Nippolo ha scritto:


    In ogni caso alla luce del tuo ultimo post mi sorge un dubbio... sai cosa fa l'istruzione return?
    Hai ragione, dovrebbe forzare l'uscita dalla funzione per tornare al programma... giusto?

    AldoBaldo ha scritto:


    Secondo me ti fai semplicemente fuorviare dai rientri (indentazione), che sono invece una cosa più che altro "estetica", anche se preziosi per rendere leggibile il codice. Guarda come cambia la "espressività" di quel che hai scritto se lo formuli nel primo o nel secondo di questi due modi.
    for(i=0; i<n; i++){
               if(chiave==a[i])
                return 1;
    else return 0;
    }
    
    for( i=0; i<n; i++ ) {
        if( chiave==a[i] )
            return 1;
        else return 0;
    }
    Il risultato delle due presentazioni è identico (sbagliato in entrambi i casi), ma secondo me nel secondo caso si capisce molto meglio perché il codice non funziona come vorresti.

    A voler vedere, così sarebbe ancora più chiaro:
    for( i=0; i<n; i++ ) {
        if( chiave==a[i] ) {
            return 1;
        }
        else {
            return 0;
        }
    }
    Mi sono un poco confusa perché la funzione mi era stata presentata direttamente senza parentesi graffe, ma in effetti sbagliando con le parentesi ho poi capito come va fatta e come funziona. Grazie a entrambi
  • Re: Appartenenza di un elemento ad array con function

    Sara ... devi comprendere il problema che avevi a parte la presenza di else, parentesi e indentazione ...

    Se scrivi la return con la else, una delle due deve essere sempre eseguita. Quindi, quando la for controlla il primo elemento, se trovato restituisce 1 altrimenti restituisce 0 e NON controlla gli altri elementi. Quindi, ritorna 1 solo se quello che cerchi è nel primo elemento, altrimenti restituisce SEMPRE 0.

    Se non metti la else, la return 0 non fa parte del blocco di controllo. In questo modo sono controllati TUTTI gli elementi del vettore e se trovato esegue la return 1. Ma se non viene trovato in NESSUN elemento, il for termina e termina anche la funzione con un return 0 per indicare che non esiste in NESSUN elemento.
  • Re: Appartenenza di un elemento ad array con function

    Sara.a.d.07 ha scritto:


    Nippolo ha scritto:


    In ogni caso alla luce del tuo ultimo post mi sorge un dubbio... sai cosa fa l'istruzione return?
    Hai ragione, dovrebbe forzare l'uscita dalla funzione per tornare al programma... giusto?
    Esatto! E magari senza la pappa semi-pronta di @oregon e con i giusti input, saresti potuta arrivare alla soluzione anche in modo autonomo!
  • Re: Appartenenza di un elemento ad array con function

    oregon ha scritto:


    Sara ... devi comprendere il problema che avevi a parte la presenza di else, parentesi e indentazione ...

    Se scrivi la return con la else, una delle due deve essere sempre eseguita. Quindi, quando la for controlla il primo elemento, se trovato restituisce 1 altrimenti restituisce 0 e NON controlla gli altri elementi. Quindi, ritorna 1 solo se quello che cerchi è nel primo elemento, altrimenti restituisce SEMPRE 0.

    Se non metti la else, la return 0 non fa parte del blocco di controllo. In questo modo sono controllati TUTTI gli elementi del vettore e se trovato esegue la return 1. Ma se non viene trovato in NESSUN elemento, il for termina e termina anche la funzione con un return 0 per indicare che non esiste in NESSUN elemento.
    Sei stato chiarissimo, grazie. In realtà nella funzione che mi era stata data l'else ovviamente non c'era, probabilmente se non avessi sbagliato non mi sarei accorta di questa cosa. Il punto è anche che non ricordavo nemmeno bene come funzionava la return quindi ho confuso un po' tutto, ma adesso è tutto chiaro.

    Nippolo ha scritto:


    Esatto! E magari senza la pappa semi-pronta di @oregon e con i giusti input, saresti potuta arrivare alla soluzione anche in modo autonomo!
    Hai ragione, mi sono fatta prendere un poco dal panico
Devi accedere o registrarti per scrivere nel forum
10 risposte