elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: (TUTORIAL) Aprende a emular Sentinel Dongle By Yapis


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  ALGUIEN QUE ME PUEDA AYUDAR POR FAVOR, PROBLEMA CON LETRAS EN C++
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: ALGUIEN QUE ME PUEDA AYUDAR POR FAVOR, PROBLEMA CON LETRAS EN C++  (Leído 2,082 veces)
FOURJhina

Desconectado Desconectado

Mensajes: 3


Ver Perfil
ALGUIEN QUE ME PUEDA AYUDAR POR FAVOR, PROBLEMA CON LETRAS EN C++
« en: 9 Marzo 2019, 22:51 pm »

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.


En línea

K-YreX
Moderador
***
Desconectado Desconectado

Mensajes: 1.008



Ver Perfil
Re: ALGUIEN QUE ME PUEDA AYUDAR POR FAVOR, PROBLEMA CON LETRAS EN C++
« Respuesta #1 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


En línea

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

Desconectado Desconectado

Mensajes: 3


Ver Perfil
Re: ALGUIEN QUE ME PUEDA AYUDAR POR FAVOR, PROBLEMA CON LETRAS EN C++
« Respuesta #2 en: 9 Marzo 2019, 23:01 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


En línea

K-YreX
Moderador
***
Desconectado Desconectado

Mensajes: 1.008



Ver Perfil
Re: ALGUIEN QUE ME PUEDA AYUDAR POR FAVOR, PROBLEMA CON LETRAS EN C++
« Respuesta #3 en: 9 Marzo 2019, 23:11 pm »

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:
En línea

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

Desconectado Desconectado

Mensajes: 3


Ver Perfil
Re: ALGUIEN QUE ME PUEDA AYUDAR POR FAVOR, PROBLEMA CON LETRAS EN C++
« Respuesta #4 en: 9 Marzo 2019, 23:44 pm »

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
En línea

K-YreX
Moderador
***
Desconectado Desconectado

Mensajes: 1.008



Ver Perfil
Re: ALGUIEN QUE ME PUEDA AYUDAR POR FAVOR, PROBLEMA CON LETRAS EN C++
« Respuesta #5 en: 10 Marzo 2019, 00:09 am »

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
  1. char respuesta;
  2. do{
  3.    cout << "Introduce un numero: ";
  4.    cin >> respuesta;
  5. }  while(respuesta < '0' || respuesta > '9');

También puedes usar la función <isdigit()> de la librería <cctype>:
Código
  1. char respuesta;
  2. do{
  3.    cout << "Introduce un numero: ";
  4.    cin >> respuesta;
  5. }  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
En línea

Código
  1. cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
por favor,alguien aqui que pueda ayudarme? .exe ha detectado un problema...
Dudas Generales
ojodeviento 2 3,730 Último mensaje 14 Noviembre 2010, 14:34 pm
por ojodeviento
alguien que me pueda ayudar con este problema?
Programación C/C++
alexandrots 5 2,940 Último mensaje 12 Mayo 2013, 01:23 am
por alexandrots
Alguien que me pueda ayudar por favor :)
Hacking
Lushooh 2 2,579 Último mensaje 23 Julio 2014, 07:33 am
por Lushooh
¿Hola,ayuda por favor,alguien que me pueda ayudar a completar el codigo
Java
anon92 1 2,266 Último mensaje 8 Diciembre 2014, 21:51 pm
por leobr6
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines