Pergunta

Eu estou tendo dificuldade em entender e, portanto, gerenciar matrizes e índices manualmente no C. Estas são as minhas duas abordagens clássicas, mas eles não parecem funcionar como eles manter looping quando a condição é alcançado:

#include<stdio.h>
#define MAX 255

int main(){

    int arr[MAX]={0};
    int idx=0;

    /* Approach #1 */

    printf("Enter elements, -1 to finish:\n");
    scanf("%d", &arr[idx]);

    while(arr[idx-1] != -1 && idx < MAX){
        printf("Enter elements, -1 to finish:\n");
        scanf("%d", &arr[idx]);
        idx++;        
    }

    /* Approach #2 */

    do{
        printf("Enter elements, -1 to finish:\n");
        scanf("%d", &arr[idx]);
        idx++;
    }while(arr[idx-1] != -1 && idx < MAX);

    // Main func continues here.

}

Qualquer conselho seria muito apreciada!

Update:

Agora que funciona! Muito obrigado todas de vocês para tais respostas instantâneas. Esta é definitivamente uma grande comunidade, isso está me ajudando muito.

Foi útil?

Solução

arr[idx] <= MAX

deve ser

idx < MAX

a menos que você está verificando o item em vez do índice.

Você também estão sempre verificando o "próximo" elemento para -1 (arr [idx] = -1!) Porque você está incrementando idx antes de verificar o seu valor acrescentado.

Então, se você teve

arr[idx-1] != -1

Você ficaria bem.

Outras dicas

arr[idx] <= MAX

deve ser

idx <= MAX
while(arr[idx] != -1 && idx <= MAX){ // Fixed by sklivvz
    printf("Enter elements, -1 to finish:\n");
    scanf("%d", &arr[idx]);
    idx++;        
}

Em primeiro lugar, você deve verificar se o idx índice variabel é menor do que MAX (não menor do que ou igual a). Você iria para fora dos limites se o seu índice é igual a MAX. Uma matriz com MAX = 10 tem valores de índice de 0 a 9 e incluindo, mas não 10.

Em segundo lugar, você adiciona o primeiro elemento ao arr [0], você incrementa o seu índice de 0 a 1, depois de saltar de volta para a condição tempo e verificar se arr [1] == -1, o que não é . Portanto, verifique vez que arr [idx-1]! = -1. Nota, contudo, que a primeira vez que você chegar ao while-loop, você vai realmente verificar arr [-1]! = -1, que também está fora dos limites. ;). Então você precisa descobrir como resolver este

para Roman M:

Antes de mais nada, o cara que faz a pergunta acaba de começar um curso de programação, e provavelmente ainda não aprendeu sobre ponteiros. Em segundo lugar, agora você lidar com ambos um contador e um ponteiro. Eu não estou certo que eu ver o benefício de fazer isso em vez de utilizar um índice assim:

para (IDX = 0; idx

scanf("%d", &arr[idx]);
if(arr[idx] == -1)
    break;

}

Usando um loop for que você pode eliminar a necessidade para o confuso idx-1 Código de verificação:

/* Approach #3*/
int i;
int value;

for (i = 0; i < MAX; ++i)
{
  printf("Enter elements, -1 to finish:\n");
  scanf("%d", &value);
  if (value == -1) break;
  arr[i] = value;
}

matrizes C começar a contagem de 0.

Se você alocar uma matriz de tamanho MAX, acessando o elemento no MAX seria um erro. Alterar o loop para;

int arr[MAX];
for ( .... && idx < MAX )

Em seu primeiro loop while, o

arr[idx] <= MAX

linha deve ler

idx <= MAX

Em seu segundo ciclo, que está incrementando idx antes do teste - deve terminar com

} while ((arr[idx-1] != -1) && (idx-1 <= MAX));

Eu também tendem a entre parênteses todas as condições internas só para estar absolutamente certo de que a precedência é correta (daí os suportes extras acima).

Eu iria com algo como isto.

Você não tem que se preocupar com limites de matriz e outras condições confuso.

int cnt = MAX;        // how many elements in the array, in this case MAX
int * p = &arr[0];    // p is a pointer to an integer and is initialize to the address of the first
                      // element of the array. So now *p is the same as arr[0] and p is same as &arr[0]

// iterate over all elements. stop when cnt == 0
while (cnt) {

    // do somthing
    scanf("%d", *p); // remember  that *p is same as arr[some index]
    if (*p == -1)    // inspect element to see what user entered
        break;

    cnt --;  // loop counter
    p++;     // incrementing p to point to next element in the array
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top