Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: αиσиyмσυรCร en 12 Julio 2013, 00:45 am



Título: Esto es un error o es que lo realice mal??
Publicado por: αиσиyмσυรCร en 12 Julio 2013, 00:45 am
El enunciado del ejercicio es este:

Crear un programa que use tres variables x,y,z. Las tres serán números reales, y nos
bastará con dos cifras decimales. Deberá pedir al usuario los valores para las tres
variables y mostrar en pantalla cual es el mayor de los tres números tecleados.

Yo hice este código y ahora mostrare que pasa cuando lo pruebo ¿eso debería ser así?¿Que tengo mal?...
Código:
#include <stdio.h>

main(){

float x, y, z;
float mayor;

printf("Introduce el valor de x: ");
getchar();
scanf("%f", &x);
getchar();
printf("Introduce el valor de y: ");
getchar();
scanf("%f", &y);
getchar();
printf("Introduce el valor de z: ");
getchar();
scanf("%f", &z);
getchar();

if ((x>y)&&(x>z))
   mayor=x;
else if (y>z)
     mayor=y;
     else mayor=z;

printf("El mayor de los 3 numeros introducidos es => %f", mayor);
getchar();

}


http://gyazo.com/8365c6a48c13ed575eb620db2850c7e2

Me podéis ayudar un saludo y gracias de antemano :D


Título: Re: Esto es un error o es que lo realice mal??
Publicado por: ivancea96 en 12 Julio 2013, 01:06 am
Código
  1. #include <stdio.h>
  2.  
  3. main(){
  4.  
  5. float x, y, z;
  6. float mayor;
  7.  
  8. printf("Introduce el valor de x: ");
  9. scanf("%f", &x);
  10. printf("Introduce el valor de y: ");
  11. scanf("%f", &y);
  12. printf("Introduce el valor de z: ");
  13. scanf("%f", &z);
  14. if ((x>y)&&(x>z))
  15.   mayor=x;
  16. else if (y>z)
  17.     mayor=y;
  18.     else mayor=z;
  19.  
  20. printf("El mayor de los 3 numeros introducidos es => %f", mayor);
  21. scanf("%f", &y);
  22. }
  23.  

Le quité los getchar() y le puse al final un scanf(). Parece que el getchar daba algun problema :o

(El scanf del final, ponle lo que sea, es solo para detener el programa)


Título: Re: Esto es un error o es que lo realice mal??
Publicado por: rir3760 en 12 Julio 2013, 02:30 am
Le quité los getchar() y le puse al final un scanf(). Parece que el getchar daba algun problema
Cierto. La causa del error son las llamadas a getchar:
Código
  1. printf("Introduce el valor de x: ");
  2. scanf("%f", &x);

Por ejemplo si se introduce "123.456" getchar lee y descarta el primer carácter (el '1'), scanf procesa los restantes almacenando el valor 23.456 en la variable "x", de ahí los resultados incorrectos.

Un saludo


Título: Re: Esto es un error o es que lo realice mal??
Publicado por: eferion en 12 Julio 2013, 09:24 am
es que getchar solo lee un caracter... si tu introduces 1234.56 por teclado, el buffer de entrada va a contener una cadena de caracteres tal que "1234.56"... luego ya es responsabilidad tuya, mediante una función de la librería estándar o mediante una función propia, convertir esa cadena de texto en un número.

Con lo comentado, si tu introduces 1234.56 y sólo pones un getchar, el getchar va a leer un único carácter, el primero que le llegue más concretamente, que será el "1" ( ojo, no un uno numérico, sino el carácter que representa al número 1 ), y dejará en el buffer de entrada el resto, "234.56".


Título: Re: Esto es un error o es que lo realice mal??
Publicado por: αиσиyмσυรCร en 12 Julio 2013, 09:41 am
Ok ya lo entendí y se corrigió pero ya que estamos yo ponía los getchar(); para que se viera lo que introducía no sabia que podía dar esos errores.
Al final deje así el código y funciona perfectamente:
Código:
#include <stdio.h>
 
main(){
 
float x, y, z;
float mayor;
 
printf("Introduce el valor de x: ");
scanf("%f", &x);
printf("Introduce el valor de y: ");
scanf("%f", &y);
printf("Introduce el valor de z: ");
scanf("%f", &z);
if ((x>y)&&(x>z))
   mayor=x;
else if (y>z)
     mayor=y;
     else mayor=z;
 
printf("El mayor de los 3 numeros introducidos es => %f", mayor);
getchar();
getchar();
}

Con el doble getchar me dejo de tener que añadir otro valor como hacia con scanf y se para :) y hay no le afecta a nada en especial ya que el programa hace la función que debe realizar correctamente.

Gracias por vuestra ayuda :D