Test Foro de elhacker.net SMF 2.1

Programación => Programación C/C++ => Mensaje iniciado por: lucians en 6 Junio 2015, 15:35 PM

Título: Duda sobre do while
Publicado por: lucians en 6 Junio 2015, 15:35 PM
Hola tengo un problema ya que al intentar decirle al usuario que si quiere continuar o no , me lo salta sin mas.

Codigo:

Código (cpp) [Seleccionar]
#include<stdio.h>
#include<stdlib.h>
#define E 166.67
int main ()

{
char res,moneda;
float valor,cambio;

do
{
printf("Si desea de E a PTA introduzca E, si desea de PTA a E introduzca P.\n");
scanf("%c",&moneda);
if (moneda=='E')
{
printf("Introduce la cantidad de euros a convertir en pesetas:\n");
scanf("%f",&valor);
cambio=valor*E;
printf("%.2f euros son %.2f pesetas.\n",valor,cambio);
}
if (moneda=='P')
{
printf("Introduce la cantidad de pesetas a convertir en euros:\n");
scanf("%f",&valor);
cambio=valor/E;
printf("%.2f pesetas son %.2f euros.\n",valor,cambio);
}
printf("Quiere seguir calculando? S / N?\n");
scanf("%c",&res);
}while (res=='N');

system("pause");
}

No me deja igresar si quiero continuar o no S o N.

Mod: los códigos van en GeSHi
Título: Re: Duda sobre do while
Publicado por: bash en 6 Junio 2015, 16:05 PM
primero que todo usa GESHI  para que se vea mejor el codigo y se mas legible
segundo trata de inicializar las variables antes de usarlas ,
Título: Re: Duda sobre do while
Publicado por: user-marcos en 6 Junio 2015, 16:14 PM
Tienes un fallo grande while (res=='N'), quieres decir que se va a repetir siempre que el usuario te diga que no quiere seguir, tienes que poner while (res != 'N')
Título: Re: Duda sobre do while
Publicado por: antkk en 6 Junio 2015, 17:14 PM
Es más legible usar un while que un do while, acostúmbrate a while.
Título: Re: Duda sobre do while
Publicado por: engel lex en 6 Junio 2015, 17:20 PM
Cita de: antkk en  6 Junio 2015, 17:14 PM
Es más legible usar un while que un do while, acostúmbrate a while.

no tienen la misma utilidad, ambos tienen su forma de usarse y la legibilidad no es el problema aquí
Título: Re: Duda sobre do while
Publicado por: lucians en 6 Junio 2015, 17:40 PM
Soy nuevo en esto de la programacion y no conozco esas funciones avanzadas.
Aunque lo ejecute con 
while (res != 'N')
no va!!!!
Título: Re: Duda sobre do while
Publicado por: lucians en 6 Junio 2015, 17:42 PM
Lo que digo es que no me deja introducir un S o un N para continuar o no.
Solo eso.
Les agradecería mucho si me ayudan.
Título: Re: Duda sobre do while
Publicado por: user-marcos en 6 Junio 2015, 17:47 PM
Tienes que limpiar el buffer
Título: Re: Duda sobre do while
Publicado por: user-marcos en 6 Junio 2015, 17:52 PM
Mira como si que te va, lo que pasa que te he puesto cosas de c++

Código (cpp) [Seleccionar]

#include<stdio.h>
#include<stdlib.h>
#define E 166.67
#include <iostream>
#define limpiarBuffer(){while(cin.get() != '\n');}
using namespace std;
int main ()

{
char res,moneda;
float valor,cambio;

do
{
printf("Si desea de E a PTA introduzca E, si desea de PTA a E introduzca P.\n");
scanf("%c",&moneda);
limpiarBuffer();
if (moneda=='E')
{
printf("Introduce la cantidad de euros a convertir en pesetas:\n");
scanf("%f",&valor);
limpiarBuffer();
cambio=valor*E;
printf("%.2f euros son %.2f pesetas.\n",valor,cambio);
}
if (moneda=='P')
{
printf("Introduce la cantidad de pesetas a convertir en euros:\n");
scanf("%f",&valor);
limpiarBuffer();
cambio=valor/E;
printf("%.2f pesetas son %.2f euros.\n",valor,cambio);
}
printf("Quiere seguir calculando? S / N?\n");
scanf("%c",&res);
limpiarBuffer();
}while (res!='N');


}

Adatpatalo a c
Título: Re: Duda sobre do while
Publicado por: lucians en 6 Junio 2015, 18:22 PM
Muchísimas gracias, teníais razón, había que limpiar el bufe. Le he puesto
fflush(stdin) antes de los printf y va perfecto.
¡¡¡Muchísimas gracias!!!  :D

Título: Re: Duda sobre do while
Publicado por: rir3760 en 9 Junio 2015, 04:04 AM
Cita de: lucians en  6 Junio 2015, 18:22 PM
Muchísimas gracias, teníais razón, había que limpiar el bufe. Le he puesto
fflush(stdin) antes de los printf y va perfecto.
fflush(stdin) no se recomienda, las razones de ello en el tema |Lo que no hay que hacer en C/C++. Nivel basico| (http://foro.elhacker.net/programacion_cc/lo_que_no_hay_que_hacer_en_cc_nivel_basico-t277729.0.html).

Tu problema se genera porque "%c" no descarta el espacio blanco antes de consumir los caracteres validos para la conversión indicada. Por ejemplo si al pedir el tipo de conversión introduces:
E{ENTER}
La primera llamada a scanf consume el carácter 'E', el carácter '\n' generado al presionar {ENTER} se queda en el bufer de la entrada estándar y es consumido por la segunda llamada a scanf.

Para evitarlo basta con utilizar " %c" en las dos llamadas a scanf.

Un saludo