Bucle imparable en C++

Hola,queria pediros ayuda por un problema con un ciclo en un programa de C++.

El programa es un conversor de temperaturas,el problema está en que cuando inserto una letra,en vez de un valor numerico,el programa se cierra pero esto no es todo...si antes de poner la letra,pongo un numero y le doy a enter y luego inserto la letra,entra en un ciclo que no para de repetirse...por favor necesito ayuda V_V estoy aprendiendo a programar en C++ tengo 15 y esto me está frustrando xD!

El problema creo que es por el Do}{While, porque he probado sin ellos y si insertas una letra el programa mismo te dice que no es un digito valido,lo malo,es que cuando está On el ciclo de While,esa informacion se repite hasta la saciedad y nunca se puede parar...

Aqui os dejo el link del programa:http://www.mediafire.com/download.php?mozmz2wjnmi
Está escrito y compilado en Visual C++ 6.0



Y Aqui os dejo el codigo fuente:
#include <iostream>
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>


int main()

{
   
   float Celsius,Faren,Kelvin;
   int x,y;
   using std::cout;
   using std::cin;
   
   
    /*Aqui estan representadas todas las variables y el bucle while junto a los archivos para el preprocesador*/
   
   system("COLOR 0A"); 
   do{

   cout <<"              --------------------------------------------------\n";
   cout <<"             |       CONVERSOR DE GRADOS V.4 BY JOSELETE        |\n";
    cout <<"              --------------------------------------------------\n";
   //Es mi conversor,un programa de Joselete para ayudar a la gente en apuros con las temperaturas ^^
      
   cout <<"             ---------------------------------------------------- \n";
   cout <<"            |Inserte 0 si quiere pasar de Farenheit a Celsius    |\n";
   cout <<"            |Inserte 1 si quiere pasar de Celsius a Farenheit    |\n";
   cout <<"            |Inserte 2 si quiere pasar de Celsius a Kelvin       |\n";
   cout <<"            |Inserte 3 si quiere pasar de Kelvin a Celsius       |\n";
   cout <<"            |Inserte 5 si quiere pasar de Kelvin a Farenheit     |\n";
   cout <<"            |Inserte 6 si quiere tener informacion sobre mi      |\n";
   cout <<"            |Inserte 7 si lo que desea es salir                  |\n";
   cout <<"             ---------------------------------------------------- \n";
   cin >>x;

   switch(x)
   {
           case 0:
       
          cout <<"\nInserte la temperatura en grados Farenheit\n\n";//inserta la temperatura
         cin >>Faren;//lo reconoce en pantalla
         Celsius = ( Faren - 32 ) * 5/9;//formula de Farenheit a Celsius
         cout <<"\nSu temperatura en grados celsius es: \t" <<Celsius <<"\n\n";//En esta linea se muestra el resultado
           cout <<"Pulse una tecla para continuar\n";
         getch();
         system("cls");
         
         
   break;
   
         case 1:
         
          cout <<"\nInserte la temperatura en grados Celsius\n\n";//inserta la temperatura
         cin >>Celsius;//lo reconoce en pantalla
         Faren = Celsius * 9/5 + 32;//formula de Celsius a Farenheit
         cout <<"\nSu temperatura en grados Farenheit es: \t" <<Faren <<"\n\n"; //En esta linea se muestra el resultado
           cout <<"Pulse una tecla para continuar\n";
         getch();
         system("cls");
         
   break;

         case 2:

         cout <<"\nInserte la temperatura en grados Celsius\n\n";//inserta la temperatura
         cin >>Celsius;//lo reconoce en pantalla
         Kelvin = Celsius + 273.15;//formula de celsius a Kelvin
         cout <<"\nSu temperatura en grados Kelvin es: \t" <<Kelvin <<"\n\n";//En esta linea se muestra el resultado
           cout <<"Pulse una tecla para continuar\n";
         getch();
         system("cls");
   
   break;
         
         case 3:

         cout <<"\nInserte la temperatura en grados Kelvin\n\n";//inserta la temperatura
         cin >>Kelvin;//lo reconoce en pantalla
         Celsius = Kelvin - 273.15;//formula de Kelvin a Celsius
         cout <<"\nSu temperatura en grados Celsius es: \t" <<Celsius <<"\n\n";//En esta linea se muestra el resultado
           cout <<"Pulse una tecla para continuar\n";
         getch();
         system("cls");

   break;
         
         case 4:

         cout <<"\nInserte la temperatura en grados Farenheit\n\n";//inserta la temperatura
         cin >>Faren;//lo reconoce en pantalla
         Kelvin = (Faren + 459.67) / 1.8; //formula de Farenheit a Kelvin
          cout <<"\nSu temperatura en grados Kelvin es: \t" <<Kelvin <<"\n\n";//En esta linea se muestra el resultado
          cout <<"Pulse una tecla para continuar\n";
         getch();
         system("cls");
         
   break;

         case 5:

          cout <<"\nInserte la temperatura en grados Kelvin\n\n";//inserta la temperatura
         cin >>Kelvin;//lo reconoce en pantalla
         Faren = Kelvin * 1.8 - 459.67;//formula de Kelvin a Farenheit
         cout <<"\nSu temperatura en grados Farenheit es: \t" <<Faren <<"\n\n"; //En esta linea se muestra el resultado 
          cout <<"Pulse una tecla para continuar\n";
         getch();
         system("cls");
   
   break;
          case 6:

         cout <<"\nHola,me llamo Jose Angel Gonzalez y este es uno de mis programas acabados\n";
         cout <<"\nSoy estudiante de 4 de ESO en el Instituto San Jaime Apostol (Moncada)";
         cout <<"\nTengo 15 a\xa4os y mi sue\xa4o es ser programador,si quieres contactar conmigo\n";
         cout <<"\nEste es mi msn:  Joselete-11@hotmail.com.Gracias por usar mi programa\n";
           cout <<"Pulse una tecla para continuar\n";
         getch();
         system("cls");
         
   break;

         case 7:

         exit(0);

         
   break;
   
         

           default:      //SI SE PRESIONA OTRO NUMERO DIFERENTE
               
         printf("ESE NUMERO NO ESTA PERMITIDO!HUM!\n");
           cout <<"Pulse una tecla para continuar\n";
         getch();
         system("cls");
  break;      
   
   
}
  }while(x!=y);
      
   getch();
   return 0;


}



Lo siento si este tema no va aquí pero es que no me sé guiar mucho por estos foros :(
No tengo tiempo ahora para leerlo, pero usa la etiqueta code para código (lógico), guarda el identado.

Si lees un número y te meten un caracter, peta. La solución es leer una cadena, comprobar que es un número y pasarlo al tipo de dato que uses.
Gracias pero...soy iniciado en esto y no puedo enterarme de muchas cosas xDDD!

Cuando tengas tiempo me lo explicas mejor,no hay prisa,eres de los pocos que se han molestado en ayudarme,gracias ^^
no se en c++ pero en java (se parecen) y haciendo lo que dice amuchamu es que metas en el numero como un string, leas dicho string y luego guardes el numero cn el tipo de dato que quieras ya sea int, float, double...
Me podrias poner un ejemplo simple? es que estoy siguiendo un tutorial y aun voy por los prototipos de funciones xD!

Entiendo de condicionales,If,else y ternarios,de switch y case declarar funciones y poco mas,tengo un nivel mas bien -basico xDDD!

EDIT:
Donato,lo que me estás diciendo se podria hacer poniendo en un string un numero de mi variable x y luego en un condicional,poner
if(x=(elquesea))
{
x=char
}
para transformar la variable int x en una char no?

Si es así,no entiendo mucho el funcionamiento de este proceso :S xD!
No te preocupes porque no entiendas el proceso. Programar es un poco como un coche. Tu no sabes como está diseñado tu motor, ni el carburador, solo que le echas gasolina, lo enciendes y se mueve.

En programacion te encontrarás un montón de cosas que ya están hechas por gente y que ha dejado su codigo (o librerias) disponibles para que las uses. No te importe como lo hacen. Solo necesitas saber que lo hacen.

En tu caso, lo que tu estás buscando a grandes rasgos es algo como:

char[] x="200";
int num=x[0] * 100 + x[1] *10 + x[3]


De todas formas C tiene funciones y librerias disponibles para ello. Te recomiendo que leas:

http://www.ozzu.com/programming-forum/how-convert-char-into-int-t271.html
http://www.chw.net/foro/lenguajes-de-programacion-f22/120244-pasar-de-char-a-int-en-c.html
Vale,muchas gracias, a ver si con esto consigo algo ^^

Ahora me voy a dormir que mañana tengo instituto pero mañana me pongo en cuanto pueda.

Mi sueño es ser programador y lo voy a ser cueste lo que me cueste,como si tengo que estar dia y noche estudiando ^^

Si no te molesta,me podrias dar tu msn por privado y asi si me surgen dudas te voy preguntando? Muchas gracias ^^
Wow... no le mareeis:

int x;
std::cin >> x;


Eso es perfectamente válido. Y hace lo que cualquiera esperaría que hiciera. No hay que hacer historias de ningún tipo como le estais diciendo.

Saludos.
Hola,

Por un lado, en la condición del blucle do..while estás comparando las variables x e y, pero ésta última (aparte de no usarla para nada) ni siquiera la has inicializado. ¿Para qué se supone que la usas? Si lo que quieres es un bucle infinito, puedes usar una estructura como while(1) { ... } ó bien do { ... } while(1);, que se repetirá siempre, ya que 1 es el valor que representa un lógico y en consecuencia la condición se evaluará siempre como cierta. Nota: si haces eso, debes asegurarte siempre que puedes finalizar el bucle desde dentro, con alguno de los casos (como ya haces pulsando '7').

Por otro lado, quizás te convendría definir x como char en lugar de int, y utilizar en los case su valor literal (es decir entre comillas simples). De ese modo, discriminas en el default cualquier caracter distinto a los que quieras evaluar en el resto de case, incluyendo letras u otros símbolos. Algo del esito: switch(x) { case '0': ... break; case '1': ... }

Un saludo.
ya que 1 es el valor que representa un sí lógico


Para nada. 0 representa falso, cualquier otra cosa es verdadero.
Ferdy escribió:Wow... no le mareeis:

int x;
std::cin >> x;


Eso es perfectamente válido. Y hace lo que cualquiera esperaría que hiciera. No hay que hacer historias de ningún tipo como le estais diciendo.

Saludos.


Pff es verdad, qué cagada.
Ferdy escribió:
ya que 1 es el valor que representa un sí lógico


Para nada. 0 representa falso, cualquier otra cosa es verdadero.


Eso es discutible, si consideramos otras lógicas como la ternaria.
De todos modos cambio "el valor" por "un valor" y acepto la colleja :)
¿El C/C++ considera lógicas como la ternaria (sin que la implementemos nosotros, me refiero al lenguaje en si)?
A ver,la variable y la declare para hacer pruebas con el ciclo while,pero en realidad esa variable no estaba en mis planes,lo que pasa esque subi el codigo equivocado(El bueno es igual pero sin la variable y)

Entonces si defino la variable X como char podria funcionar?


Edit:
Hola,

Por un lado, en la condición del blucle do..while estás comparando las variables x e y, pero ésta última (aparte de no usarla para nada) ni siquiera la has inicializado. ¿Para qué se supone que la usas? Si lo que quieres es un bucle infinito, puedes usar una estructura como while(1) { ... } ó bien do { ... } while(1);, que se repetirá siempre, ya que 1 es el valor que representa un sí lógico y en consecuencia la condición se evaluará siempre como cierta. Nota: si haces eso, debes asegurarte siempre que puedes finalizar el bucle desde dentro, con alguno de los casos (como ya haces pulsando '7').

Por otro lado, quizás te convendría definir x como char en lugar de int, y utilizar en los case su valor literal (es decir entre comillas simples). De ese modo, discriminas en el default cualquier caracter distinto a los que quieras evaluar en el resto de case, incluyendo letras u otros símbolos. Algo del esito: switch(x) { case '0': ... break; case '1': ... }

Un saludo.


Ya lo he probado,casi funciona,pero el problema es que poniendolo asi,digamos que solo reconoce la primera cifra,por lo tanto si pongo "75" se cerrará,o si pongo "62" dará mi informacion...que puedo hacer?
xzibit escribió:¿El C/C++ considera lógicas como la ternaria (sin que la implementemos nosotros, me refiero al lenguaje en si)?


Si te refieres a si las expresiones pueden ser verdaderas, falsas o un tercer estado. No.

Si te refieres a si existe la expresión ?:, entonces si.

- ferdy
Tambien podrias utilizar los string stream para validar la entrada, algo como:
#include <iostream>
#include <sstream>
#include <string>

using namespace std;
.....
string str;
float celcius;
...
cin >> str;
istringstream ss(str);
ss >> celcius;
if(!ss.eof()) {
   cout << "Error" << endl;
}
Bueno de momento funciona,pero tiene los bugs que si no pruebas bien,son dificiles de encontrar xD!

Gracias de todas formas ^^
Ferdy escribió:
xzibit escribió:¿El C/C++ considera lógicas como la ternaria (sin que la implementemos nosotros, me refiero al lenguaje en si)?


Si te refieres a si las expresiones pueden ser verdaderas, falsas o un tercer estado. No.

Si te refieres a si existe la expresión ?:, entonces si.

- ferdy


Era una pregunta retórica dirigida a Deschamps ;)
Por cierto,os estaría muy agradecido,si hay algun programador o experto en C++ por aqui que me agregaseis al msn y asi os puedo pedir consejo y ayuda,además que tengo unas preguntas que estoy deseando preguntárselas a alguien que entienda V_V
Joselete-11@hotmail.com
xzibit escribió:Era una pregunta retórica dirigida a Deschamps ;)


Pfff... estoy perdiendo facultades... Mea culpa.

joseletonix escribió:Por cierto,os estaría muy agradecido,si hay algun programador o experto en C++ por aqui que me agregaseis al msn y asi os puedo pedir consejo y ayuda,además que tengo unas preguntas que estoy deseando preguntárselas a alguien que entienda V_V


Je... creo que te va a ser más fácil hacer las preguntas por aquí...

- ferdy
xzibit escribió:Era una pregunta retórica dirigida a Deschamps ;)


Ya acepté la corrección, y simplemente me limité a hacer un apunte indicando que no es así en todos los contextos.

De todos modos, si hablamos de formalismos y definiciones y me permites citar al propio Bjarne Stroustrup, : "By definition, true has the value 1 when converted to an integer and false has the value 0 (..)". The C++ Programming Language, cap.4, Tipos fundamentales (pág.71). Otra cosa distinta es cómo se convierten implícitamente los enteros en booleanos (0 falso, y cierto para cualquier otra cosa, como apuntaba Ferdy). Pero no sé hasta que punto tiene sentido querer "sacarle punta" a esto.

Un saludo.
Pero no sé hasta que punto tiene sentido querer "sacarle punta" a esto.


Nadie intentaba sacarle punta... símplemente ser UN POCO MÁS exactos. Es beneficioso para todo el que lea el hilo. No se trata de "mira ahí te pillé", se trata de "cierto, pero mira, así queda más claro para cualquiera que lo lea".

Por otro lado, lo que citas está bien, pero yo concretamente me refería a esto (sección 4.12 [conv.bool] del estándar):

An rvalue of arithmetic, enumeration, pointer, or pointer to member type can be converted to an rvalue of type bool. A zero value, null pointer value, or null member pointer value is converted to false; any other value is converted to true.


Y ya como curiosidad final, parece ser que una variable 'bool' PUEDE ser ni verdadera ni falsa (si, es un "undefined behavior", pero me ha parecido curioso): (Sección 3.9.1 [basic.fundamental] punto 6, footnote 40)

Using a bool value in ways described by this International Standard as ‘‘undefined,’’ such as by examining the value of an uninitialized automatic variable, might cause it to behave as if is neither true nor false


:P

- ferdy
Tienes un error, que no es de programación:

Los Kelvin son una unidad de temperatura per se. No existen grados Kelvin.

273,15 º K es incorrecto. Lo correcto es decir 273,15 K.
22 respuestas