C101:¿Cuál es la mejor manera de llenar una matriz a partir de la entrada del usuario?
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.
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
}