| Ver tema anterior :: Ver siguiente tema | | Autor | Mensaje |
|---|
Naitmeir
Registrado: 20 Nov 2007 Mensajes: 14 Ubicación: Barcelona
| Publicado: 06/12/2007 3:58 am | | | Título: No entiendo por que falla |
| por que falla???
| Código: | #include <stdio.h>
int main ()
{ int cont=1; float num=1,suma,media;
printf ("\n\tHas de introducir un numero mayor que cero y menor o igual que diez"); printf ("\n\t... luego te devolvere la media de los numeros introducidos...\n");
printf ("\n\tPulsa 0 para salir del programa\n\n\n");
while (cont<=10){
printf("\n\tIntroduce el %d numero\n",cont);scanf("%lf",&num);
if (num == 0){
printf("\tHas elegido la opcion para salir del programa\n"); break;
}
else {
if(num<0 && num>10)
printf("\tNo!!! Valores mayores que cero y menores o iguales a 10\n");
else{
suma=suma+num; cont++;
} } }
if (num!=0){
media=suma / cont; printf("\n\tMEDIA ARITMETICA DE LOS NUMEROS INTRODUCIDOS : %lf\n\n\n",media); }
printf ("\n\n\n");
getch ();
} |
|
| | Volver arriba | |  | digies
Registrado: 18 Nov 2005 Mensajes: 377 Ubicación: Cono Sur
| Publicado: 06/12/2007 7:59 am | | | Título: |
| La función getch no pertenece al estándar de C; reemplázalo por system("PAUSE"); e incluye el archivo de cabecera <stdlib.h>
| Código: | #include <stdio.h> #include <stdlib.h>
int main(void) { int cont=1; float num, suma, media; printf ("\n\tHas de introducir un numero mayor que cero y menor o igual que diez\n"); while(cont <= 10) { printf("\nIntroduce el numero %d: ", cont); scanf("%f",&num); if(num == 0) { printf("\tHas elegido la opcion 0 para salir del programa\n"); break; } else if(num<0 || num>10) printf("\tNo!!! Valores mayores que cero y menores o iguales a 10\n"); else { suma=suma+num; cont++; } } if(num != 0) { media=suma/cont; printf("\n\tMEDIA ARITMETICA DE LOS NUMEROS INTRODUCIDOS : %.3f\n\n", media); } puts("\n\n"); system("PAUSE"); return EXIT_SUCCESS; }
|
Un saludo |
| | Volver arriba | |  | Naitmeir
Registrado: 20 Nov 2007 Mensajes: 14 Ubicación: Barcelona
| Publicado: 06/12/2007 8:34 am | | | Título: No... |
| | Lo del getch lo utilizo para parar el programa en el ejecutable, no hagas caso... el problema es que para cualquier numero que escriba me entra en el primer if (num==0) que es la condicion para salir del programa. Lo del getch se q se ha de cambiar por el pause pero no ese el fallo, gracias de todas formas |
| | Volver arriba | |  | | digies
Registrado: 18 Nov 2005 Mensajes: 377 Ubicación: Cono Sur
| Publicado: 06/12/2007 9:51 am | | | Título: |
| Independientemente del uso de la función getch() -puedes usarlo si quieres, pues eso ya depende exclusivamente de ti para que el compilador genere o no mensajes de advertencia; el código que puse soluciona tu problema, y está corregido para que no se produzcan warnings durante la compilación.
Un saludo |
| | Volver arriba | |  | Naitmeir
Registrado: 20 Nov 2007 Mensajes: 14 Ubicación: Barcelona
| Publicado: 06/12/2007 10:24 am | | | Título: |
| | digies escribió: | Independientemente del uso de la función getch() -puedes usarlo si quieres, pues eso ya depende exclusivamente de ti para que el compilador genere o no mensajes de advertencia; el código que puse soluciona tu problema, y está corregido para que no se produzcan warnings durante la compilación.
Un saludo |
Ok ya vi el problema, pero aun no termina de funcionar bien y sigo sin entenderlo. Ahora tal y como me lo has dejado lo unico que falla es la devolucion de la media de los numeros introducidos. Luego como duda me queda al hacer el scanf con un long float me sale del programa de las condiciones y se termina el programa ( tu ya lo corregiste ) y me lo pusiste como float, por que? ¬¬' |
| | Volver arriba | |  | digies
Registrado: 18 Nov 2005 Mensajes: 377 Ubicación: Cono Sur
| Publicado: 06/12/2007 1:32 pm | | | Título: |
| Te explico: En tu código declaras la variable num de tipo float, luego cuando ingresas el valor de esa variable con scanf utilizas en la cadena de control un tipo de dato double "%lf" que no se corresponde con la declaración de tipo de dato float que le diste a dicha variable inicialmente. Es por eso que en el segundo código figura scanf("%f", &num);. Pero eso también puede solucionarse utilizando conversiones explícitas de esas tres variables (num, suma, media) mediante el operador de molde (cast). Sería así: ... int cont=1; float num, suma=.0, media; ... printf("\nIntroduce el numero %d: ", cont); scanf("%f",&num); ... suma=(double)suma+(double)num; ...
Con respecto al error en el cálculo de la media, no lo tuve en cuenta, me pareció más importante corregir los otros errores que por cierto son más importantes. Pero ahora aprobecho para decirte dónde está ese error. Cuando el proceso llega a la fórmula media=suma/cont;, la varible cont será de 11 y no de 10 porque antes de este proceso cont ya tiene el valor de 11 que viene de ... suma=(double)suma+(double)num; cont++; ... Es por eso que antes de la división, tienes que decrementar cont en una unidad para que su valor sea de 10: ... media=suma/(--cont); ...
Aquí tienes las dos versiones de lo explicado. Versión 1:
| Código: | #include <stdio.h> #include <stdlib.h>
int main(void) { int cont=1; double num, suma=0.0, media; printf ("\n\tHas de introducir un numero mayor que cero y menor o igual que diez\n"); while(cont <= 10) { printf("\nIntroduce el numero %d: ", cont); scanf("%lf",&num); if(num == 0.0) { printf("\tHas elegido la opcion 0 para salir del programa\n"); break; } else if(num<0.0 || num>10.0) printf("\tNo!!! Valores mayores que cero y menores o iguales a 10\n"); else { suma=suma+num; cont++; } } if(num != 0.0) /* Puede reemplazarse 0.0 por .0 */ { media=suma/(--cont); /* Puede reemplazarse --cont por 10 */ printf("\n\tMEDIA ARITMETICA DE LOS NUMEROS INTRODUCIDOS : %.3lf\n\n", media); } puts("\n\n"); system("PAUSE"); return EXIT_SUCCESS; }
|
Versión 2:
| Código: | #include <stdio.h> #include <stdlib.h>
int main(void) { int cont=1; float num, suma=0.0, media; printf ("\n\tHas de introducir un numero mayor que cero y menor o igual que diez\n"); while(cont <= 10) { printf("\nIntroduce el numero %d: ", cont); scanf("%f",&num); if(num == 0.0) { printf("\tHas elegido la opcion 0 para salir del programa\n"); break; } else if(num<0.0 || num>10.0) printf("\tNo!!! Valores mayores que cero y menores o iguales a 10\n"); else { suma=(double)suma+(double)num; cont++; } } if(num != 0.0) { media=suma/(--cont); printf("\n\tMEDIA ARITMETICA DE LOS NUMEROS INTRODUCIDOS : %.3lf\n\n", media); } puts("\n\n"); system("PAUSE"); return EXIT_SUCCESS; }
|
Un saludo |
| | Volver arriba | |  | | Naitmeir
Registrado: 20 Nov 2007 Mensajes: 14 Ubicación: Barcelona
| Publicado: 06/12/2007 2:41 pm | | | Título: |
| Bueno te agradezco mucho la ayuda, por que me ha servido bastante, aunque lo he solucionado todo con assignar a suma un valor  ... float suma=0; ... el contador para hacer la media, como bien dices se podia hacer con un valor definido o con el de su ultimo valor restando uno. En este caso yo prefiero hacerlo asi para controlar el valor de las variables... ya que estoy aprendiendo... También añadir que no habia visto en las condiciones --- if(num<0.0 || num>10.0) ... entiendo por que lo haces, pero solucionando el problema con suma=0, me confundo un poco. El codigo ya funciona como esperaba, y la unica duda que me ha quedado es con la utilizacion del main (void) ... int main(void) ... No lo habia visto nunca, soy muy novato, lo siento si te molesta la simplicidad de las preguntas.
Asi lo dejaria yo..
| Código: | #include <stdio.h> #include <stdlib.h>
int main () { int cont=1; float num,suma=0,media;
printf ("\n\tHas de introducir un numero mayor que cero y menor o igual que diez"); printf ("\n\t... luego te devolvere la media de los numeros introducidos...\n");
printf ("\n\tPulsa 0 para salir del programa\n\n\n");
while (cont<=10){ printf("\n\tIntroduce el %d numero\n",cont);scanf("%f",&num); if (num == 0){ printf("\tHas elegido la opcion para salir del programa\n"); break; } else { if(num<0 || num>10) printf("\tNo!!! Valores mayores que cero y menores o iguales a 10\n"); else{ suma=suma+num; cont++; } } } if (num!=0){ cont--; media=suma / cont; printf("\n\tMEDIA ARITMETICA DE LOS NUMEROS INTRODUCIDOS : %.3f\n\n\n",media); } printf ("\n\n\n"); system("PAUSE"); return EXIT_SUCCESS; } |
Muchas gracias y un saludo |
| | Volver arriba | |  | digies
Registrado: 18 Nov 2005 Mensajes: 377 Ubicación: Cono Sur
| Publicado: 06/12/2007 4:31 pm | | | Título: |
| | Naitmeir escribió: | El codigo ya funciona como esperaba, y la unica duda que me ha quedado es con la utilizacion del main (void) ... int main(void) ... No lo habia visto nunca, soy muy novato, lo siento si te molesta la simplicidad de las preguntas.
| La declaración int main() {...} es correcta, pero sería mejor aun utilizar la forma int main(void) {...} -que es más explícita- ya que esta también es una forma correcta, y algunos compiladores al ser utilizados en su modo más estricto, “se quejarán” de la forma int main() {...}. Esto y las demás cosas que expuse son solamente algunas buenas costumbres de programación, independientemente si uno es novato o no en el lenguaje C.
Un saludo |
| | Volver arriba | |  | | |
| No puede crear mensajes No puede responder temas No puede editar sus mensajes No puede borrar sus mensajes No puede votar en encuestas
|
|
| |