Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Problemas con manejo de errores

Estas en el tema de Problemas con manejo de errores en el foro de C/C++ en Foros del Web. Hola, muy buen dia Realizo una calculadora, sencilla en cuanto a funcionalidad, sin embargo se me hace algo complicado, bueno todo va de acuerdo al ...
  #1 (permalink)  
Antiguo 01/11/2010, 20:41
Avatar de saudakar  
Fecha de Ingreso: octubre-2010
Ubicación: Donde pueda beber Cafe
Mensajes: 11
Antigüedad: 14 años, 1 mes
Puntos: 5
Problemas con manejo de errores

Hola, muy buen dia

Realizo una calculadora, sencilla en cuanto a funcionalidad, sin embargo se me hace algo complicado, bueno todo va de acuerdo al nivel :).

El programa solamente debe realizar la operacion X&Y&Z donde XYZ son cualquier numero y & es cualquiera de los operadores matematicos basicos +*-/ ,... No necesariamente debe tomar en cuenta la precedencia de operadores(no se como hacerlo)

Es funcional hasta cierto punto, sin embargo cuando ingreso una operacion invalida por ejemplo:

//Este es el principal problema que no logro corregir,
**siento que ya estoy saturado**

r+3-Z, //o sea no ingreso numeros donde deben ir numeros o los signos deben ir

me salta hasta el mensaje que coloque "Realizar otra operacion? s/n: " sin embargo al presionar cualquier tecla termina la ejecucion del programa.

--Sin embargo esto no sucede cuando ingreso la operacion de la forma correcta.--


Adjunto el Codigo:
Perdon por los comentarios en el codigo, pero son la manera en la que me logro guiar con lo que voy escribiendo.
//El codigo se puede compilar con Borlan 5 sin errores ni advertencias
Código C++:
Ver original
  1. #include <iostream>
  2. #include <conio>
  3.  
  4. //Funciones a utilizar
  5. int comprobarNumero(int, int, int);
  6. char comprobarSigno(char, char);
  7. float operaciones(float, float, float);
  8.  
  9. main()
  10. {
  11.  
  12.  float n1, n2, n3, paso1, resultado;
  13.  char s1, s2, seleccion='s';
  14.  int x=0;
  15.  while (seleccion == 's')
  16.  {
  17.   n1 = 0.0;
  18.   n2 = 0.0;
  19.   n3 = 0.0;
  20.   cin.clear();
  21.   clrscr();
  22.   cout<<"ingresar la operacion de la forma X%Y%Z donde XYZ = Numero y % = operador [+-*/]"<<endl;
  23.   cin >>n1 >>s1 >>n2 >>s2 >>n3;//Asigna los valores a las variables;
  24.  
  25.   //Verificar datos numericos llamando a su respectiva funcion
  26.   if ((comprobarNumero(n1, n2, n3))&&(comprobarSigno(s1, s2)))
  27.     {
  28.      x=1;
  29.     }
  30.     else
  31.       {
  32.        cout <<"Ingresar una operacion valida"<<endl;
  33.        //goto IN;
  34.       }
  35.  
  36.   if(x==1)
  37.     {
  38.      paso1= operaciones(n1, s1, n2);
  39.      resultado = operaciones(paso1, s2, n3);
  40.      cout <<"El resultado es: " << resultado << endl<<endl;
  41.     }
  42.  
  43.      cout <<"Realizar otra operacion? s/n: ";
  44.      cin >> seleccion;
  45.    }
  46. return(1);
  47. }
  48.  
  49.  
  50.  
  51.  
  52. //Funcion para comprobar que el dato ingresado sea del tipo entero
  53. int comprobarNumero(int, int, int)
  54. {
  55.  if(cin.fail() && cin.rdstate())//Si no se ingreso un dato del mismo tipo de la variable y hay flujo de datos
  56.    {
  57.     cin.clear();//Limpiar bufer
  58.     clrscr();   //limpiar Pantalla
  59.     return(0);  //Regresar Falso
  60.    }
  61.    else
  62.      {
  63.        return(1);//Regresar Verdadero
  64.      }
  65. }
  66.  
  67. //Funcion para comprobar que se ingrese un operador valido [+,-,*,/]
  68. char comprobarSigno(char s1, char s2)
  69. {
  70.  //Compara si las variables para signos son signos de operacion +-*/
  71.  if(((s1 == '+')||(s1 == '-')||(s1 == '*')||(s1 == '/')) & ((s2 == '+')||(s2 == '-')||(s2 == '*')||(s2 == '/')))
  72.    {
  73.     return(1);
  74.    }
  75.    else //Si no son signos de operacion
  76.    {
  77.     clrscr(); //Limpiar pantalla
  78.    }
  79.    return(0);
  80. }
  81.  
  82. //Funcion que determina la operacion a realizar, en base al signo ingresado
  83. float operaciones (float n1, float signo, float n2)
  84. {
  85.  float resultado;
  86.  if(signo == '+')
  87.  {
  88.   resultado = (n1 + n2);
  89.   return(resultado);
  90.  }
  91.  
  92.   if(signo == '-')
  93.  {
  94.   resultado = (n1 - n2);
  95.   return(resultado);
  96.  }
  97.  
  98.   if(signo == '*')
  99.  {
  100.   resultado = (n1 * n2);
  101.   return(resultado);
  102.  }
  103.  
  104.   if(signo == '/')
  105.  {
  106.   resultado = (n1 / n2);
  107.   return(resultado);
  108.  }
  109.  return(0);
  110. }


Podrian brindarme alguna orientacion por favor :)
Muchas Gracias!
  #2 (permalink)  
Antiguo 01/11/2010, 21:16
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años, 7 meses
Puntos: 228
Respuesta: Problemas con manejo de errores

El problema esta cuando haces :cin >>n1 >>s1 >>n2 >>s2 >>n3;
Como lo primero que pedis es un numero y llega una letra inicial entonces el cin falla y deja todo los caracteres en el buffer esperando otra entrada.

Te dice opcion invalida y luego cuando pide un caracter este ya existe en el buffer y como casi seguro que no es s entonces sale.
  #3 (permalink)  
Antiguo 01/11/2010, 22:14
Avatar de saudakar  
Fecha de Ingreso: octubre-2010
Ubicación: Donde pueda beber Cafe
Mensajes: 11
Antigüedad: 14 años, 1 mes
Puntos: 5
Respuesta: Problemas con manejo de errores

Muchas gracias,..
pensando en ello agregue el cin.clear() (linea 58), sin embargo no estoy del todo seguro de su correcto funcion, tambien lo intente en la linea 33,... No se me ocurren mas :(,... Continuare investigando como vaciar el bufer...
¡Gracias compañero!


Actualizacion 03-11-2010:

Problema solucionado,... utilice flush(stdin) despues de asignar los valores a las variables.
//En borland 5 no me funcionaba luego compile el mismo codigo con Dev C++ 4.8 y no aparecio el problema

!Muchas Gracias por la ayuda!
Un saludo!!

Última edición por saudakar; 03/11/2010 a las 21:20 Razón: Nueva Informacion Agregada

Etiquetas: manejo
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 12:19.