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

[SOLUCIONADO] Reinicio del programa

Estas en el tema de Reinicio del programa en el foro de C/C++ en Foros del Web. Buenas, he intentado hacer que mi programa le pregunte al usuario si desea reinciar la aplicación y que este, contestando si o no, haga que ...
  #1 (permalink)  
Antiguo 30/03/2015, 16:11
Avatar de HelThunk  
Fecha de Ingreso: marzo-2015
Ubicación: std::cout<<"En mi PC";
Mensajes: 33
Antigüedad: 9 años
Puntos: 0
Reinicio del programa

Buenas, he intentado hacer que mi programa le pregunte al usuario si desea reinciar la aplicación y que este, contestando si o no, haga que se cierre o se reinicie el programa.. podrían echarme una mano (soy muy nuevo, lo siento);

Código C++:
Ver original
  1. #include "stdafx.h"
  2. #include <iostream>
  3. using namespace std;
  4.  
  5.  
  6. int main(){
  7.     system("cls");
  8.  
  9.     bool exit = false;
  10.  
  11.     do{
  12.     int num1, num2;
  13.     //Escanear digitos;
  14.     cout << "Escribe dos numeros;" << endl;
  15.     cin >> num1 >> num2;
  16.     //Ordenar de mayor a menor;
  17.     if (num1 > num2){
  18.         cout << "" << num1 << " es mayor que " <<num2<<endl;
  19.     }
  20.     else if (num1 < num2){
  21.         cout << "" << num1 << " es menor que " << num2<<endl;
  22.     }
  23.     //Es igual;
  24.     else cout << "" << num1 << " es igual a " << num2 << endl;
  25.     //Repetición
  26.  
  27.     cout << "¿Desea usted continuar?" << endl;
  28.     char cont;
  29.     cin >> cont;
  30.     switch(cont){
  31.         case 'Si':
  32.         case 'si':
  33.         case 'SI':
  34.         case 'sI': return 1;
  35.             break;
  36.         case 'No':
  37.         case 'nO':
  38.         case 'NO':
  39.         case 'no': break;
  40.         defaul:cout << "Por favor, escriba 'si' o 'no'" << endl;
  41.     }
  42.    
  43.     } while (!exit);
  44.  
  45.     system("pause");
  46.     return 0;
  47. }
  #2 (permalink)  
Antiguo 30/03/2015, 16:44
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: Reinicio del programa

Esa cosa ni siquiera compila!

Por favor danos algo que al menos compile.
  #3 (permalink)  
Antiguo 30/03/2015, 16:45
Avatar de HelThunk  
Fecha de Ingreso: marzo-2015
Ubicación: std::cout<<"En mi PC";
Mensajes: 33
Antigüedad: 9 años
Puntos: 0
Respuesta: Reinicio del programa

Cita:
Iniciado por razpeitia Ver Mensaje
Esa cosa ni siquiera compila!

Por favor danos algo que al menos compile.
A mi si me compila :s, el problema es que después de la pregunta de si deseas continuar salta el error.

Un saludo
  #4 (permalink)  
Antiguo 30/03/2015, 16:47
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 6 meses
Puntos: 38
Respuesta: Reinicio del programa

Los errores son:
-No puedes guardar mas de una letra en un char 'si' es ilegal, legal es 's' por ejemplo.
-Lo mismo pasa con switch. No puedes poner 'Si' solo puedes poner 'a' o un entero, float etc switch no compara strings, para eso use if que va tener mismo efecto.

Una forma de arreglarlo seria:
Código C++:
Ver original
  1. #include <iostream>
  2. #include <windows.h>
  3. using namespace std;
  4.  
  5.  
  6. int main() {
  7.     bool exit = false;
  8.    
  9.     do {
  10.         int num1, num2;
  11.         //Escanear digitos;
  12.         cout << "Escribe dos numeros;" << endl;
  13.         cin >> num1 >> num2;
  14.        
  15.         //Ordenar de mayor a menor;
  16.         if ( num1 > num2 ) {
  17.             cout << "" << num1 << " es mayor que " << num2 << endl;
  18.         } else if ( num1 < num2 ) {
  19.             cout << "" << num1 << " es menor que " << num2 << endl;
  20.         }
  21.         //Es igual;
  22.         else cout << "" << num1 << " es igual a " << num2 << endl;
  23.        
  24.         //Repetición
  25.         bool salir = false;
  26.        
  27.         while ( !salir ) {
  28.             cout << "¿Desea usted continuar?" << endl;
  29.             string opcion;
  30.             cin >> opcion;
  31.            
  32.             if ( opcion == "si" || opcion == "SI" || opcion == "Si" || opcion == "sI" ) {
  33.                 salir = true;
  34.                 system ( "cls" );
  35.             } else if ( opcion == "no" || opcion == "NO" || opcion == "No" || opcion == "nO" ) {
  36.                 salir = true;
  37.                 exit = true;
  38.                 system ( "cls" );
  39.                 //al decir no saliremos de este bucle interno y tambien del externo
  40.             } else {
  41.                 system ( "cls" );
  42.                 cout << "No existe esta opcion. ";
  43.             }
  44.         }
  45.     } while ( !exit );
  46.    
  47.     system ( "pause" );
  48.     return 0;
  49. }
Hay muchas formas de salir. Esta no es la mejor ni la más efectiva, pero cumple lo que propone.

PD: Sobre lo de no compilar es solo quitar el archivo ese header stdafx, ese archivo es de visual studio y en codeblocks no hace falta.
Añadir cstdlib o windows.h para el system("cls"); y el system("pause");. Lo mejor seria no usar nunca system ya que no es una solución portable.
  #5 (permalink)  
Antiguo 30/03/2015, 16:59
Avatar de HelThunk  
Fecha de Ingreso: marzo-2015
Ubicación: std::cout<<"En mi PC";
Mensajes: 33
Antigüedad: 9 años
Puntos: 0
Respuesta: Reinicio del programa

Cita:
Iniciado por vangodp Ver Mensaje
Los errores son:
-No puedes guardar mas de una letra en un char 'si' es ilegal, legal es 's' por ejemplo.
-Lo mismo pasa con switch. No puedes poner 'Si' solo puedes poner 'a' o un entero, float etc switch no compara strings, para eso use if que va tener mismo efecto.

Una forma de arreglarlo seria:
Código C++:
Ver original
  1. #include <iostream>
  2. #include <windows.h>
  3. using namespace std;
  4.  
  5.  
  6. int main() {
  7.     bool exit = false;
  8.    
  9.     do {
  10.         int num1, num2;
  11.         //Escanear digitos;
  12.         cout << "Escribe dos numeros;" << endl;
  13.         cin >> num1 >> num2;
  14.        
  15.         //Ordenar de mayor a menor;
  16.         if ( num1 > num2 ) {
  17.             cout << "" << num1 << " es mayor que " << num2 << endl;
  18.         } else if ( num1 < num2 ) {
  19.             cout << "" << num1 << " es menor que " << num2 << endl;
  20.         }
  21.         //Es igual;
  22.         else cout << "" << num1 << " es igual a " << num2 << endl;
  23.        
  24.         //Repetición
  25.         bool salir = false;
  26.        
  27.         while ( !salir ) {
  28.             cout << "¿Desea usted continuar?" << endl;
  29.             string opcion;
  30.             cin >> opcion;
  31.            
  32.             if ( opcion == "si" || opcion == "SI" || opcion == "Si" || opcion == "sI" ) {
  33.                 salir = true;
  34.                 system ( "cls" );
  35.             } else if ( opcion == "no" || opcion == "NO" || opcion == "No" || opcion == "nO" ) {
  36.                 salir = true;
  37.                 exit = true;
  38.                 system ( "cls" );
  39.                 //al decir no saliremos de este bucle interno y tambien del externo
  40.             } else {
  41.                 system ( "cls" );
  42.                 cout << "No existe esta opcion. ";
  43.             }
  44.         }
  45.     } while ( !exit );
  46.    
  47.     system ( "pause" );
  48.     return 0;
  49. }
Hay muchas formas de salir. Esta no es la mejor ni la más efectiva, pero cumple lo que propone.

PD: Sobre lo de no compilar es solo quitar el archivo ese header stdafx, ese archivo es de visual studio y en codeblocks no hace falta.
Añadir cstdlib o windows.h para el system("cls"); y el system("pause");. Lo mejor seria no usar nunca system ya que no es una solución portable.
Perdón por seguir molestando, he comprendido tu explicación, pero al probarla en la linea 30;

Código C++:
Ver original
  1. string opcion;
  2. cin >> opcion;

no me lee ese cin>>opcion, me sale un error si intento ejecutar el programa y me marca los signos de 'mayor que' en rojo.
  #6 (permalink)  
Antiguo 30/03/2015, 17:13
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 6 meses
Puntos: 38
Respuesta: Reinicio del programa

poner como std::cin o incluya el using namespace std; luego debajo de haber incluido iostream arriba del todo.

A mi si me compila con cero errores. :/

Usas visual studio?

Pruebe si no poner string opcion; antes del bucle arriba al principio de main.
  #7 (permalink)  
Antiguo 30/03/2015, 17:17
Avatar de HelThunk  
Fecha de Ingreso: marzo-2015
Ubicación: std::cout<<"En mi PC";
Mensajes: 33
Antigüedad: 9 años
Puntos: 0
Respuesta: Reinicio del programa

Cita:
Iniciado por vangodp Ver Mensaje
poner como std::cin o incluya el using namespace std; luego debajo de haber incluido iostream arriba del todo.

A mi si me compila con cero errores. :/

Usas visual studio?

Pruebe si no poner string opcion; antes del bucle arriba al principio de main.
Así es, uso visual studio, he probado el std:: y tengo puesta la biblioteca <iostream> (solo me pasa con ese cin, los demás funcionan bien), si a ti te funciona no comprendo que puede ser (si cambio el interior del cin por otra variable del tipo entero, char.. si funciona, solo sale el error cuando es string)
  #8 (permalink)  
Antiguo 30/03/2015, 17:19
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 6 meses
Puntos: 38
Respuesta: Reinicio del programa

prueba una cosa...
Despues de cada cin, luego abajo ponga cin.sync(); a ver

Guardas el archivo como .cpp?

vuelva a poner el stdafx a ver si se soluciona. Quizas para VS sea imprecindible.
  #9 (permalink)  
Antiguo 30/03/2015, 17:25
Avatar de HelThunk  
Fecha de Ingreso: marzo-2015
Ubicación: std::cout<<"En mi PC";
Mensajes: 33
Antigüedad: 9 años
Puntos: 0
Respuesta: Reinicio del programa

Cita:
Iniciado por vangodp Ver Mensaje
prueba una cosa...
Despues de cada cin, luego abajo ponga cin.sync(); a ver

Guardas el archivo como .cpp?

vuelva a poner el stdafx a ver si se soluciona. Quizas para VS sea imprecindible.
Si lo guardo como ccp, he probado a poner cin.sync(); y tampoco..

Adjunto imágenes para intentar facilitar las cosas;





Un saludo!
  #10 (permalink)  
Antiguo 30/03/2015, 17:34
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 6 meses
Puntos: 38
Respuesta: Reinicio del programa

pues ya ves el error tonto que es... Es un simple string :S

No se por que te tira error el programa. sustituya el cin ese por: std::getline (std::cin,opcion); a ver si te funciona. Si no compila ponga el include <cstring>
Quita los cin.sync

y has dicho ccp ¿No guardas como CPP? :O
  #11 (permalink)  
Antiguo 30/03/2015, 17:40
Avatar de HelThunk  
Fecha de Ingreso: marzo-2015
Ubicación: std::cout<<"En mi PC";
Mensajes: 33
Antigüedad: 9 años
Puntos: 0
Respuesta: Reinicio del programa

Cita:
Iniciado por vangodp Ver Mensaje
pues ya ves el error tonto que es... Es un simple string :S

No se por que te tira error el programa. sustituya el cin ese por: std::getline (std::cin,opcion); a ver si te funciona. Si no compila ponga el include <cstring>
Quita los cin.sync

y has dicho ccp ¿No guardas como CPP? :O
También me tira error con std::getline (std::cin,opcion); , añadiendo la biblioteca <cstring>, etc.. creo que esto no vamos a poder solucionarlo :s

*Me he confundido, guardo en cpp.
  #12 (permalink)  
Antiguo 30/03/2015, 17:48
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 6 meses
Puntos: 38
Respuesta: Reinicio del programa

pero a ver? Como lees tu un string en visual studio?
  #13 (permalink)  
Antiguo 30/03/2015, 18:01
Avatar de HelThunk  
Fecha de Ingreso: marzo-2015
Ubicación: std::cout<<"En mi PC";
Mensajes: 33
Antigüedad: 9 años
Puntos: 0
Respuesta: Reinicio del programa

Cita:
Iniciado por vangodp Ver Mensaje
pero a ver? Como lees tu un string en visual studio?
Lo acabo de solucionar, me dijiste antes que incluyese #include <cstring>, he probado a incluir #include <string> y ahora si funciona, muchas gracias por tu ayuda, ahora va perfectamente.
  #14 (permalink)  
Antiguo 30/03/2015, 18:11
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 6 meses
Puntos: 38
Respuesta: Reinicio del programa

De nada.
Es que de visual studio estoy pillado. Como nunca lo use =(
  #15 (permalink)  
Antiguo 31/03/2015, 00:45
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: Reinicio del programa

Cita:
Iniciado por vangodp Ver Mensaje
Guardas el archivo como .cpp
Una pequeña aclaración... la extensión que se le ponga a los ficheros es totalmente irrelevante... puedes, si quieres, hacerlo todo al reves y tener la implementación en los .h y la declaración en los .cpp (recuerda actualizar los includes y que ahora únicamente debes compilar los .h)... o en la extensión que te de la gana y la compilación no se verá afectada... al compilador únicamente le estás diciendo que compile una serie de archivos... el los coge y los procesa y no se preocupa para nada por la extensión de los mismos.

El motivo de que las cabeceras sean .h y los archivos de código .cpp es simplemente por estandarización... así cualquiera que coja ese proyecto puede hacerse una idea acerca de cómo está organizado el código... si cada uno usase la extensión que le diese la gana podría ser traumático usar librerías externas...

Cita:
Iniciado por HelThunk Ver Mensaje
También me tira error con std::getline (std::cin,opcion); , añadiendo la biblioteca <cstring>, etc.. creo que esto no vamos a poder solucionarlo
Las librerías que empiezan con "c" suelen ser simples "wrappers" de las antiguas librerías de C. Así, en C tienes la librería "string.h" que en C++ pasa a ser "cstring"... o la librería de C "math.h" que pasa a ser "cmath". En teoría puedes hacer un include a cualquiera de las dos versiones. Aunque ambas versiones son compatibles, no tienen por qué ser exactamente iguales. Un ejemplo:
  • La función memchr(const void*, int, size_t) de "string.h" es reemplazada en "cstring" por dos funciones diferentes:
    • const void* memchr(const void* s, int c, size_t n);
    • void* memchr( void* s, int c, size_t n);

Un saludo

Última edición por eferion; 31/03/2015 a las 02:07

Etiquetas: char, int, numero, programa, reinicio
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 09:03.