El cero en el array está causando un error semántico. ¿Cómo superarlo?
La pregunta es hacer un programa para leer un arreglo de enteros del usuario y pasarlo a una función que toma dos arreglos – el primer arreglo con los valores obtenidos del usuario y el segundo arreglo como un arreglo vacío. El objetivo es añadir los índices de los números pares presentes en el arreglo original al arreglo vacío y retornar el número de números pares presentes en el arreglo original.
Si la entrada fue:
Ingresa el número de elementos: 5
Ingresa el elemento [1]: 0
Ingresa el elemento [2]: 1
Ingresa el elemento [3]: 2
Ingresa el elemento [4]: 3
Ingresa el elemento [5]: 4
Entonces la salida muestra:
37945345.
que es un valor basura dentro del primer elemento del arreglo vacío.
Este es el código:
#include <stdio.h>
int evenIndices(int origArr[], int emptyArr[]) {
int i = 0, j = 0;
int evenCount = 0;
while (origArr[i] != '\0') {
if (origArr[i] % 2 == 0) {
emptyArr[j] = i;
evenCount ++;
j++;
}
i++;
}
return evenCount;
}
int main() {
int numOfElts;
printf("Ingresa el número de elementos: ");
scanf("%d", &numOfElts);
int arr[numOfElts];
for (int i = 0; i < numOfElts; i++) {
printf("Ingresa el elemento [%d]: ", i + 1);
scanf("%d", &arr[i]);
}
arr[numOfElts] = '\0';
int indexArr[numOfElts];
int evenCount = evenIndices(arr, indexArr);
printf("Hay %d números pares. \n", evenCount);
printf("*** Índices con Números Pares en el Arreglo Original *** \n");
for (int i = 0; i < evenCount - 1; i++) {
printf("%d, ", indexArr[i]);
}
printf("%d. \n", indexArr[evenCount - 1]);
return 0;
}
Este código funciona para todos los números en el arreglo excepto para el 0. Si se ingresa 0, la función asume que es igual a ‘\0’ y sale del bucle. ¿Cuál es la solución a esto?</stdio.h>
davy.ai
La solución a esto es modificar la condición de terminación del bucle while en la función
evenIndices
. En lugar de verificar'\0'
, que en realidad es un carácter nulo, debemos verificar sii
es menor que el número de elementos enorigArr
. Esto aseguraría que el bucle se ejecute para todos los elementos del array, incluido el cero. El bucle while modificado se vería así:Aquí,
sizeof(origArr)/sizeof(origArr[0])
da el número de elementos en el array, que es la condición de terminación real que necesitamos. Esto solucionaría el problema de que la función termine prematuramente para un array con un cero como uno de sus elementos.