ALGUIEN QUE ME PUEDA AYUDAR POR FAVOR, PROBLEMA CON LETRAS EN C++

Iniciado por FOURJhina, 9 Marzo 2019, 22:51 PM

0 Miembros y 2 Visitantes están viendo este tema.

FOURJhina

Tengo un proyecto de la escuela el cual es una calculadora con varias opciones, ya están todas programadas, el único problema que tengo es que al ingresar una letra se crea un bucle infinito y ya no puedo hacer nada, llevo intentando arreglarlo demasiado tiempo pero simplemente ya no se que hacer, me bloquee por completo, por favor alguien ayúdeme.
El código es el siguiente:

#include <iostream>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>



using namespace std;

int main() {

float numero1, numero2;
int potencia, base;
int opcion;

int n;
long double factorial(int);
char cadena[63];
unsigned long long int decimal = 0;
int bas;
int tabla=0 or 1, tabla1=0 or  1;




do {
   etiqueta_1:
   system ("color 0D");
   system("cls");
   cout << "BIENVENIDO AL PROGRAMA DE CALCULADORA" << endl;
   cout << "MENU PRINCIPAL" << endl;
    cout << "1. Operaciones aritmeticas" << endl;
    cout << "2. Factorial" << endl;
    cout << "3. Conversor entre bases" << endl;
    cout << "4. Tabla de verdad" << endl;
    cout << "5. Salir" << endl;
    cout << "Elija una opcion" << endl;
    cin >> opcion;

    switch(opcion){
case 1:
system ("color 01");


do{

system("cls");
cout << "MENU DE OPERACIONES ARITMETICAS" << endl;
cout << "1. Suma" << endl;
cout << "2. Resta" << endl;
cout << "3. Multiplicacion" << endl;
cout << "4. Division" << endl;
cout << "5. Potencia" << endl;
cout << "6. Volver al menu principal" << endl;
cout << "7. Salir" << endl;
cout << "Elija una opcion" << endl;
cin >> opcion;


system("cls");

if(opcion >= 1 && opcion <=4)
{
cout << "Ingrese el numero 1:" << endl;
cin >> numero1;
cout << "Ingrese el numero 2:" << endl;
cin >> numero2;


switch(opcion){
case 1:
cout << "La suma es: " << numero1 + numero2 << endl << endl;
break;
case 2:
cout << "La resta es: " << numero1 - numero2 << endl << endl;
break;
case 3:
cout << "La multiplicacion es: " << numero1 * numero2 << endl << endl;
break;   
case 4:
cout << "La division es: " << numero1 / numero2 << endl << endl;
break;

}
}
else if (opcion == 5){
cout << "Introduce la base: " << endl;
cin >> base;
cout << "Introduce la potencia: " << endl;
cin >> potencia;
cout << "El resultado es: " << pow(base,potencia) << endl << endl;

   

}
if (opcion == 6){
   goto etiqueta_1;
}

if(opcion != 7){
cout << "Presione cualquier tecla para volver al menu de operaciones aritmeticas." << endl;
getchar(); getchar(); 
}


}

while(opcion != 7);   
return 0;



case 2:
system ("color 02");


do{
system("cls");
cout << "MENU DE FACTORIAL" << endl;
cout << "1. Factorial" << endl;
cout << "2. volver al menu principal" << endl;
cout << "3. Salir" << endl;
cout << "Elija una opcion" << endl;
cin >> opcion;
system("cls");


if(opcion == 1)
{
    cout << "Introduzca numero: ";
    cin >> n;
    cout << "Factorial: " << factorial(n) << endl;
    system("pause");

}
if (opcion == 2){
   goto etiqueta_1;
}



if(opcion != 3){
cout << "Presione cualquier tecla para volver al menu de factorial." << endl;
getchar(); getchar();
}
}while(opcion != 3);   
return 0;




case 3:
system ("color 03");

do{
system("cls");
cout << "MENU DE CONVERTIDOR DE BASES" << endl;
cout << "1. Binario" << endl;
cout << "2. Octal" << endl;
cout << "3. Hexadecimal" << endl;
cout << "4. volver al menu principal" << endl;
cout << "5. Salir" << endl;
cout << "Elija una opcion" << endl;
cin >> opcion;
system("cls");


if(opcion >= 1 && opcion <=3)
{

    cout << "Ingresa un numero decimal: " << endl;
    cin >> decimal;

switch(opcion){
case 1:

ltoa(decimal, cadena, 2);
    cout << "El numero en base binaria es:" << (2, cadena) << endl;

break;
case 2:
ltoa(decimal, cadena, 8);
    cout << "El numero en base octal es:" << (8, cadena) << endl;


break;
case 3:
ltoa(decimal, cadena, 16);
    cout << "El numero en base hexadecimal es:" << (16, cadena) << endl;


break;   

}

   

 


}


if (opcion == 4){
   goto etiqueta_1;
}


if(opcion != 5){
cout << "Presione cualquier tecla para volver al menu de convertidor de bases." << endl;
getchar(); getchar();
}
}while(opcion != 5);   
return 0;




case 4:
system ("color 04");


do{
system("cls");
cout << "MENU DE OPERADORES LOGICOS" << endl;
cout << "1. AND" << endl;
cout << "2. OR" << endl;
cout << "3. XOR" << endl;
cout << "4. NOT" << endl;
cout << "5. Volver al menu principal " << endl;
cout << "6. Salir" << endl;
cout << "Elija una opcion" << endl;
cin >> opcion;
system("cls");


if(opcion >= 1 && opcion <=3)
{
    cout << "Inserte el valor de A (solo 0 o 1): " << endl;
    cin >> tabla;
cout << "Inserte el valor de B (solo 0 o 1): " << endl;
    cin >> tabla1;
switch(opcion){
case 1:
if(tabla == 0 && tabla1 ==0)
{
   cout << "Su salida es: 0" << endl;
}

else if (tabla == 1 && tabla1 == 0)
{
   cout << "Su salida es: 0" << endl;
}

else if (tabla == 0 && tabla1 == 1)
{
   cout << "Su salida es: 0" << endl;
}

else if (tabla == 1 && tabla1 == 1)
{
   cout << "Su salida es: 1" << endl;
}


break;


case 2:
if(tabla == 0 && tabla1 ==0)
{
   cout << "Su salida es: 0" << endl;
}

else if (tabla == 1 && tabla1 == 0)
{
   cout << "Su salida es: 1" << endl;
}

else if (tabla == 0 && tabla1 == 1)
{
   cout << "Su salida es: 1" << endl;
}

else if (tabla == 1 && tabla1 == 1)
{
   cout << "Su salida es: 1" << endl;
}



break;


case 3:
if(tabla == 0 && tabla1 ==0)
{
   cout << "Su salida es: 0" << endl;
}

else if (tabla == 1 && tabla1 == 0)
{
   cout << "Su salida es: 1" << endl;
}

else if (tabla == 0 && tabla1 == 1)
{
   cout << "Su salida es: 1" << endl;
}

else if (tabla == 1 && tabla1 == 1)
{
   cout << "Su salida es: 0" << endl;
}

break;   
}


}
else if (opcion == 4){
cout << "Introduce el valor de A (solo 0 o 1): " << endl;
cin >> tabla;
if(tabla == 0 )
{
   cout << "Su salida es: 0" << endl;
}
else if (tabla == 1 )
{
   cout << "Su salida es: 1" << endl;
}

}

   

 



if (opcion == 5){
   goto etiqueta_1;
}


if(opcion != 6){
cout << "Presione cualquier tecla para volver al menu de operadores logicos." << endl;
getchar(); getchar();
}
}while(opcion != 6);   
return 0;



}
   
   
   

}


while(opcion != 5);

}


long double factorial(int n)
{
    long double fact;
    if (n==0)
        return 1;
    else
         return n*factorial(n-1);
  }



De antemano muchas gracias.

K-YreX

Lo primero, coloca tu código entre etiquetas de código GeSHi (puedes seleccionarlas en un desplegable que hay encima del cuadro de texto cuando escribes/modificas un mensaje). Es más difícil de ver y puede dar lugar a errores al no estar dentro de las etiquetas.

Aparte como el código es bastante largo, si puedes especificar en qué momento falla... Es decir, qué línea o bloque de instrucciones se está ejecutando justo en el momento que el programa entra en el bucle infinito :rolleyes: :-X
Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;

FOURJhina

Cita de: YreX-DwX en  9 Marzo 2019, 22:55 PM
Lo primero, coloca tu código entre etiquetas de código GeSHi (puedes seleccionarlas en un desplegable que hay encima del cuadro de texto cuando escribes/modificas un mensaje). Es más difícil de ver y puede dar lugar a errores al no estar dentro de las etiquetas.

Aparte como el código es bastante largo, si puedes especificar en qué momento falla... Es decir, qué línea o bloque de instrucciones se está ejecutando justo en el momento que el programa entra en el bucle infinito :rolleyes: :-X

Me falla en cualquier parte donde hay que poner un numero osea practicamente en todo el programa, estoy super estresado con todo esto



K-YreX

Lógicamente si estás guardando el valor de entrada en un <int> e introduces una letra, tendrás un resultado no esperado.
Eso se suele dar por hecho y dejarlo como una precondición para el correcto funcionamiento sin necesidad de implementar nada al respecto.
Si lo quieres controlar tendrás que comprobar que lo que se ha introducido es un número. Por ejemplo mediante un filtro, guardando la entrada en un <string> o <char[]> y si es un número, convertirlo a entero (existen funciones para ello) y continuar con el curso del programa. Suerte :-X
PD: Las etiquetas del código pls... :rolleyes:
Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;

FOURJhina

Osea te refieres a que declare mis variables como string?
Y si perdon por lo de las etiquetas, ando un poco apresurado con muchas tareas y proyectos

K-YreX

Si la entrada del usuario puede ser de más de un caracter, entonces guárdalo en un <string>. Si sólo va a ser un caracter puedes usar un <char>.
Te dejo un código simple donde implemento un filtro para que se introduzca un número:
Código (cpp) [Seleccionar]

char respuesta;
do{
    cout << "Introduce un numero: ";
    cin >> respuesta;
}  while(respuesta < '0' || respuesta > '9');


También puedes usar la función <isdigit()> de la librería <cctype>:
Código (cpp) [Seleccionar]

char respuesta;
do{
    cout << "Introduce un numero: ";
    cin >> respuesta;
}  while(!isdigit(respuesta));


Si por ejemplo se aceptan como respuestas válidas los números de más de una cifra, tendrías que guardarlo en un <string> y comprobar que el <string> lo que contiene son dígitos. Suerte :-X
Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;