C101:¿Cuál es la mejor manera de llenar una matriz a partir de la entrada del usuario?

StackOverflow https://stackoverflow.com/questions/112582

  •  02-07-2019
  •  | 
  •  

Pregunta

Me cuesta entender y, por lo tanto, administrar matrices e índices manualmente en C.Estos son mis dos enfoques clásicos, pero no parecen funcionar ya que siguen repitiendo cuando se alcanza la condición:

#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.

}

¡Cualquier consejo sería muy apreciado!

Actualizar:

¡Ahora funciona!muchas gracias todo de ustedes por respuestas tan instantáneas.Esta es definitivamente una gran comunidad, me está ayudando mucho.

¿Fue útil?

Solución

arr[idx] <= MAX

debiera ser

idx < MAX

a menos que esté verificando el elemento en lugar del índice.

También siempre está verificando el elemento "siguiente" para -1 (arr[idx]! = -1) porque está incrementando idx antes de verificar su valor agregado.

entonces si tuvieras

arr[idx-1] != -1

Estarías bien.

Otros consejos

arr[idx] <= MAX

debiera ser

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

En primer lugar, debe verificar si la variable de índice idx es menor que MAX (ni menor ni igual que).Estarías fuera de los límites si tu índice es igual a MAX.Una matriz con MAX = 10 tiene valores de índice de 0 a 9 inclusive, pero no 10.

En segundo lugar, agrega el primer elemento a arr[0], incrementa su índice de 0 a 1, luego regresa a la condición while y verifica si arr[1] == -1, lo cual no es así.Así que verifique que arr[idx-1] != -1.Sin embargo, tenga en cuenta que la primera vez que acceda al bucle while, en realidad marcará arr[-1] != -1, que también está fuera de límites.;) Entonces necesitas descubrir cómo resolver este.

a Romano M:

En primer lugar, el tipo que hace la pregunta acaba de comenzar un curso de programación y probablemente aún no haya aprendido acerca de los punteros.En segundo lugar, ahora se trata tanto de un contador como de un puntero.No estoy seguro de ver el beneficio de hacer eso versus usar un índice como este:

para(idx=0;idx <MÁX;++idx) {

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

}

Usando un bucle for puedes eliminar la necesidad de realizar tareas desordenadas. idx-1 código de verificación:

/* 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;
}

Las matrices C comienzan a contar desde 0.

Si asigna una matriz de tamaño MAX, acceder al elemento en MAX sería un error.Cambie el bucle a;

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

En su primer bucle while, el

arr[idx] <= MAX

la línea debe leer

idx <= MAX

En su segundo ciclo, está incrementando idx antes de la prueba; debería terminar con

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

También tiendo a poner entre paréntesis todas las condiciones internas solo para estar absolutamente seguro de que la precedencia es correcta (de ahí los corchetes adicionales arriba).

Yo iría con algo como esto.

No tiene que preocuparse por los límites de la matriz y otras condiciones confusas.

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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top