Discussione Esercizio con vettori in C

Cristian_fighter

Utente Silver
2 Giugno 2016
58
25
2
59
Ultima modifica:
Salve ragazzi stavo svolgendo il seguente esercizio (traccia messa tra commenti del programma) ma non capisco perché mi dia sempre che gli elementi sono uguali.


C:
/*
Scrivere un programma in linguaggio C che riceve in ingresso una sequenza di N numeri
interi. I numeri sono memorizzati in un vettore. Il valore N è inserito dall’utente, ma il
vettore può contenere al massimo 30 numeri. Terminato l’inserimento della sequenza di
numeri, il programma deve verificare se gli elementi del vettore sono tutti uguali tra loro.
*/

#include <stdio.h>
#include <stdlib.h>
#define max 30

int main(int argc, char *argv[]) {
    int v[max]; //vettore con grandezza massima 10
    int N; //elementi del vettore
    int i;
    int uguali;
    
    do{
        printf("Di quanti elementi e' composto questo vettore? : ");
        scanf("%d",&N);
        if(N>max){
            printf("Errore!\n");
        }
    }while(N>max);
    
    printf("\nInserisci elementi nel vettore...\n");
    
    for(i=0;i<N;i++){
        printf("Posizione %d : ",i);
        scanf("%d",&v[i]);
    }
    
    uguali=0;//uguali = 0 non sono uguali gli elementi, = 1 sono uguali;
    
    //VERIFICA SE GLI ELEMENTI DEL VETTORE SONO TUTTI UGUALI
    
    for(i=0;i<N;i++){
        if(v[i]==v[i++]){
            uguali=1;
        }else{
            uguali=0;
        }
    }
    
    if(uguali==1){
        printf("Gli elementi sono tutti uguali");
    }else{
        printf("Gli elementi sono diversi");
    }
    
    
    return 0;
}
Messaggio unito automaticamente:

Aggiorno: Ho risolto cambiando l'incremento di i, ovvero al posto di i++ ho messo i+1 (nel if dell'ultimo for) Ma non capisco perché non mi leggeva il ++
 
perche' era un post incremento, quindi confrontava e poi incrementava
comunque stai attento, perche' se crei un vettore [4,5,6,6] per esempio, ti dice che sono tutti uguali, stai attento al codice ed ai controlli!
 
Ultima modifica:
Come si puo ovviare a questo problema?
Messaggio unito automaticamente:

Risolto ponendo la condizione dell'utimo for non solo minore i<N ma anche uguali==1
Messaggio unito automaticamente:

Ok ricontrollando in relatà ora non mi rileva quelli uguali
 
C:
for(i=0;i<N;i++){
    if(v[i]==v[++i]){
        uguali=1;
    }else{
        uguali=0; //corretto, ma poi continui il ciclo
        //se il confronto e' falso, allora non mi interessa vedere gli altri confronti
        //perche' ho gia' trovato due elementi diversi
        //quindi posso uscire dal ciclo di controllo
        break;
    }
}

Spero sia chiaro :D
 
C:
for(i=0;i if(v[i]==v[++i]){
uguali=1;
}else{
uguali=0; //corretto, ma poi continui il ciclo
//se il confronto e' falso, allora non mi interessa vedere gli altri confronti
//perche' ho gia' trovato due elementi diversi
//quindi posso uscire dal ciclo di controllo
break;
}
}

Spero sia chiaro :D
Avevo provato anche io a fare così credendo fosse la situazione definitiva ma il problema si ripropone in un altra maniera mi sembra, adesso che ritorno controllo

Inviato dal mio SM-G950F utilizzando Tapatalk
 
A te interessa sapere solamente quando almeno un elemento del vettore non è uguale a quello successivo.
Quindi puoi ridurre l'agortimo di controllo a questo:

C:
int uguali = 1;
    
for(i=0;i<N;i++){
    if(v[i] != v[++i]){
        uguali=0;
        break;
    }
}
 
Occhio con gli incrementi. State cambiando il valore di i, dunque state verificando se gli elementi sono uguali a due a due (eg. v[] = {1, 1, 2, 2}) rischiando anche di accedere ad elementi out of bounds in caso N sia dispari.

C:
bool elements_all_euqals(int v[], int n)
{
    for (int i = 0; i < n-1; i++) {
        if (v[i] != v[i+1]) // non incremento l'indice
            return false;
    }

    return true;
}
 
Occhio con gli incrementi. State cambiando il valore di i, dunque state verificando se gli elementi sono uguali a due a due (eg. v[] = {1, 1, 2, 2}) rischiando anche di accedere ad elementi out of bounds in caso N sia dispari.

C:
bool elements_all_euqals(int v[], int n)
{
    for (int i = 0; i < n-1; i++) {
        if (v[i] != v[i+1]) // non incremento l'indice
            return false;
    }

    return true;
}
Si, scusa, N-1 e' il limite, non N