Progtwig que no hace lo que debería – C

Escribí un progtwig que recibe del usuario una serie de números (<= 20) mientras que el último '0' significa el final de la serie (no incluido en el almacenamiento de la serie). 2 matrices (x, y) tamaño 20 (0-19 + 1 para el '0') deben ser ceros, y m significa el número de órganos en la matriz Y.

El usuario debe ingresar números ascendentes (está bien 4ex. 1,2,2,3,7,8, …, 0) y terminar con un ‘0’, por supuesto, si no, aparecerá el mensaje de error correspondiente, y El progtwig se apagará.

Podemos estar seguros de que el usuario mantendrá los <= 20 números de entrada.

La matriz Y será (si todo va bien con la matriz X) una matriz ordenada de X pero sin duplicados. ‘m’ será el número de órganos en Y excluir ‘0’, por supuesto.

La función SIFT solo debe organizar la matriz Y para que se imprima desde main ().

Ejemplo:

Si el usuario almacena en X: 1,1,2,3,5,5,5,6

En la pantalla será: m = 5 Y = 1,2,3,5,6

Mi código:

#include  #include  void SIFT(int x_arr[ ], int y_arr[]); int main () { int x[20] = {0} , y[20] = {0}; int m=0,temp=0,curr=0,i=0,j=0; printf("Please enter your numbers now:\n\n"); /*enter numbers one by one. if x[i+1] value = curr) { x[i] = temp; curr = temp; i++; } else { printf("The numbers are not at the right order !\n\nProgram will now terminate...\n\n"); } } SIFT(x,y); for (i=0 ; y[i]=='0' ; i++) /*strlen(y) without ('0')'s includes*/ m++; /*Prints m , y's organs*/ printf("\n\nm = %d",m); printf("Y = "); while (y[j]!='0') { printf ("%d ,",y[j]); j++; } return 0; } void SIFT(int x_arr[ ], int y_arr[]) { int i=0,j=0; while (x_arr[i] != '0') { if (x_arr[i] == x_arr[i+1]) /*if current val. equals next val. -> jump dbl at x_arr*/ { y_arr[j] = x_arr[i]; i+=2; j++; } else { y_arr[j]=x_arr[i]; i++; j++; } } } 

Por alguna razón desconocida, por cualquier tipo de información legal, recibo un mensaje de error “Los números no están en el orden correcto …”

Estaré más que feliz si alguien puede arreglarlo, así que debería funcionar correctamente, porque hasta ahora puedo ver que todo parece estar bien …

Gracias 🙁 …

getchar() no hace lo que crees que hace. Lea su descripción ( http://pubs.opengroup.org/onlinepubs/9699919799/functions/getchar.html ).

Puede probar scanf() lugar ( http://pubs.opengroup.org/onlinepubs/9699919799/functions/scanf.html ), o mejor, fgets() y sscanf() .

Al corregir el análisis de entrada (con scanf por ejemplo), su código todavía tiene algunos problemas:

1) Usted asume que la entrada está ordenada (pero no estrictamente). Por lo tanto, no necesita almacenar todo en x , en el momento de la entrada solo puede comparar el número anterior y el número actual. Si el número actual es MAYOR que el anterior (estrictamente), lo almacena y aumenta m . Si es MENOR que el anterior, debe salir. Si son iguales, no hagan nada.

 while ( scanf("%d",&temp) == 1 && temp != 0 && m < 20) { if (temp > curr) { y[m++] = temp; } else if (temp < curr) { printf("The numbers are not at the right order !\n\nProgram will now terminate...\n\n"); exit(0); } curr = temp; } 

(por lo tanto ya no necesita SIFT y la matriz x ).

2) No sale del progtwig bajo la condición de terminación, ¡simplemente imprime un mensaje! (fijado arriba).

3) Pongo una condición m < 20 en el bucle, solo para asegurarme de que no se produzca una falta de seguridad en las entradas mal hechas.

Eso debería ponerte en la pista. Observe que ahora que está utilizando scanf , la condición de terminación ya no es un char ( '0' ) sino un número ( 0 ). Y recuerda #include en la parte superior (para exit() )

Lo más probable es que estés usando getchar() lugar de algo como fgets() . ¿Está presionando nueva línea después de los números de entrada?

Primero, sería de gran ayuda si incluyera en su statement de Error Print los valores de temp y curr .

Como otros lo han dicho, no quieres leer un personaje, quieres leer un número. Los enlaces que PMG ha proporcionado en su respuesta deben llevarlo a una solución. Además, la depuración con puntos de interrupción probablemente podría haber ayudado a identificar este problema rápidamente, lo insto a que investigue algunas habilidades básicas de depuración. Los errores de impresión solo pueden llegar hasta ahora 🙂

No usas getchar() para leer un número, ¡su propósito es leer un solo carácter del búfer de entrada!

Necesita llamar a scanf() o fgets() , por ejemplo.

También,

Si entendí bien, creo que te refieres

 for (i=0 ; y[i] != '0' ; i++) /* strlen */ m++;