c asignación, promediando enteros

Ayer trabajé en esto alrededor de 5 horas y conseguí que el código funcionara utilizando la ayuda de este sitio, pero creo que la forma en que lo hice fue una manera engañosa, usé un comando scanf. De todas formas quiero arreglar esto de la manera correcta. ¡Gracias chicos! Oh, el código se comstack, pero el promedio que se escupe es incorrecto. Me gustaría entender conceptualmente lo que estoy haciendo mal, así como terminar la tarea.

#include  #include  double get_number(int num); main () { double n1,n2,n3; double average; printf("\nCompute the average of 3 integers\n"); printf("--------------------------------\n"); n1 = get_number(1); n2 = get_number(2); n3 = get_number(3); average = (n1 + n2 + n3)/3; printf("The average is %0.2f\n",average); } double get_number(int num) { double value = 0; int c; printf("Please input number %i: ", num); while ((c = getchar()) != '\n') { if ( (c'9') ) { printf("Incorrect character entered as a number - %i\n",c); exit(-1); } else { c =value; } } return(value); } 

Su función get_number siempre devuelve 0, porque nunca asigna nada a la variable de value . Supongo que quieres:

 value = value*10 + (c - '0'); 

En lugar de

 c = value; 

Para aclarar:

Estás leyendo un número dígito por dígito (con getchar lees un solo carácter). Así que digamos que lees los dígitos 1 2 3 :

Cuando lees 1 , haces value = value*10 + ('1' - '0') significa value = 0 + 1 = 1 .

Cuando lees 2 , haces lo mismo y obtienes un value = 1*10 + ('2' - '0') significa value = 12 .

Lo mismo para 3 .

Lo que hay que entender es que multiplicar algo por 10 agrega un 0 al final de ese algo. Agregar un dígito a algo que termina con un cero reemplaza ese 0 por ese dígito.

También debe comprender que está tratando con caracteres, que en realidad son números enteros. El carácter '0' está representado por un código ASCII de digamos x . '1' está representado por x + 1 etc. Si imprimiera el valor de '0'+'3' , no sería 3 como esperaría. Es por esto que restamos '0' (que es x ) de los caracteres, para obtener los dígitos reales.

Espero que eso aclare algunas cosas.

  1. Dado el carácter correspondiente a un dígito, debe obtener el dígito. Por ejemplo, desea obtener el número 0, no el número 48 (el código ASCII para el carácter ‘0’). Hay un truco para esto si sus caracteres son ASCII, lo que implica el hecho de que los dígitos comienzan secuencialmente en ‘0’, y el hecho de que puede “restar” caracteres unos de otros.

  2. Debe acumular el número usando los dígitos que ya ingresó. Te ayudaría si tuvieras una operación que pueda mover un dígito a la columna 10, de la columna 10 a la columna 100, y así sucesivamente. ¿Puedes pensar en lo que es esa operación?