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

 

 


Tema destacado: Sigue las noticias más importantes de seguridad informática en el Twitter! de elhacker.NET


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Problema con la Restricción de Edad hecha con If-Else y Struct
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Problema con la Restricción de Edad hecha con If-Else y Struct  (Leído 1,783 veces)
Rodrili1337

Desconectado Desconectado

Mensajes: 3


Ver Perfil
Problema con la Restricción de Edad hecha con If-Else y Struct
« en: 27 Noviembre 2018, 00:15 am »

Como le hago para que acepte el caso de ser Mayor de Edad?

Lo ejecuto y aun si le pongo 128 años, me lo toma como menor de edad.


#include<conio.h> //Para los "getch" y "getche"
#include<iostream>   //Para las funciones de "cout", "cin", y "endl"
#include<stdio.h>
#include<stdlib.h>

using namespace std;

const int PRECIO = 40; // Los Precios, determinados con Constantes, se les puede aplicar un descuento con una función fuera del main

struct usuario{   //Los Datos del Usuario
char nombre[100];
int edad;
};

float registro();   
int main()
{
float resu;
char res;
int opcion;
usuario regis;
resu = registro();

cout<<"Desea Comprar un Boleto? (N)o / (S)i: ";
res = getche();
while(res == 'N' || res == 'n'){
cout<<"\n\nOk, que tenga un buen dia.";
return 0;
}

while(res == 'S' || res == 's'){
cout<<"\n\nFunciones Disponibles\n\n"<<endl;
cout<<"1. Venom"<<endl;
cout<<"2. Animales Fantasticos, Los Crimenes de Grindelwald"<<endl;
cout<<"3. Halloween"<<endl;
cout<<"4. Los Vengadores: Infinity War"<<endl;
cout<<"5. Wifi Ralph"<<endl;
cout<<"0. Salir"<<endl;

cout<<"\nQue quiere ver?: ";
cin>>opcion;

if(opcion == 1);   //Es decir, Si escogen ver Venom. Si son menores de Edad, no podrán entrar.
{cout<<"\nUsted quiere ver la de Venom..."<<endl;
if(regis.edad<18){
cout<<"Lo siento pero no puedes verla, esta bien grotesca para alguien como usted"<<endl;
}
else { //Aquí el problema
cout<<"Perfecto, son $40"<<endl;
}
return 0;
}

usuario regis;
float res;
res = registro();
getch();
}

return 0;
}

float registro(){   //Donde pide los datos del usuario para llenar el "struct"
usuario regis;
printf("Pon tu nombre: ");
gets(regis.nombre);
printf("Pon tu edad: ");
scanf("%d",&regis.edad);
return 0;
}



Ah, y si pueden decirme como aplicar un descuento como estudiante en forma de Función fuera del Int, y Conectar la Constante (40) al diálogo del Precio, se los agradecería aún más.


En línea

AlbertoBSD
Programador y
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.696


🏴 Libertad!!!!!


Ver Perfil WWW
Re: Problema con la Restricción de Edad hecha con If-Else y Struct
« Respuesta #1 en: 27 Noviembre 2018, 00:37 am »

En ningun momento capturas el "regis" de main, solo capturas uno en Registro, pero ese pertenece a esa funcion y dicha variable deja de "existir" al momento que vuelve a la funcion main.

Saludos.

PD, no uses CONIO, no es Standar

En su lugar usa  getchar () de la stdio.h


En línea

Rodrili1337

Desconectado Desconectado

Mensajes: 3


Ver Perfil
Re: Problema con la Restricción de Edad hecha con If-Else y Struct
« Respuesta #2 en: 27 Noviembre 2018, 01:13 am »

Y como tendría que quedar?
En línea

K-YreX
Moderador
***
Desconectado Desconectado

Mensajes: 1.008



Ver Perfil
Re: Problema con la Restricción de Edad hecha con If-Else y Struct
« Respuesta #3 en: 27 Noviembre 2018, 02:10 am »

Temas a tratar:
- El código siempre entre etiquetas GeSHi. Puedes seleccionarlas encima del cuadro de texto cuando estás escribiendo un mensaje.
- Lo de no usar <conio.h> ya te lo han comentado. Sustituye <getche()> por <getchar()> y adiós <conio.h>.

- La función <registro()> devuelve un <float>. No tiene ningún sentido si siempre va a devolver 0. Si quieres modificar un <Usuario> o haces que <registro()> devuelva un Usuario y se lo asignas a un Usuario en el <main> o pasas un <Usuario> por referencia para poder modificarlo y que los cambios se guarden.
- No sé si programas en C usando <iostream> o programas en C++ usando <gets>. Si estás con C++ usa un <string> para el nombre y <cin> para las entradas de datos. Si es C y tienes que usar <gets>, usa <fgets>.
Código
  1. void registro(Usuario &user){
  2.    cout << "Nombre: ";
  3.    fgets(user.nombre, 100, stdin);
  4.    cout << "Edad: ";
  5.    scanf("%d", &user.edad);
  6.    cout << "Registrado Usuario: " << user.nombre << " Edad: " << user.edad << endl;
  7. }

En este trozo de código te dejo la respuesta a como concatenar variables con cadenas de texto usando <cout>.

- El uso de <while> no es este. <while> se usa para un bucle que se repite. Lo que tú quieres usar aquí es un simple <if>.
Código
  1. while(res == 'N' || res == 'n'){
  2. cout<<"\n\nOk, que tenga un buen dia.";
  3. return 0;
  4.  
  5. // Forma correcta
  6. if(res == 'N' || res == 'n')
  7.    // todo lo demas
  8. }

- En el caso de que la respuesta sea <S> más de lo mismo, se utiliza un <if> no un <while>. En tu caso con el <if> cuando hayas elegido una opción te pedirá otra y otra y otra y otra. Aunque bueno sólo tienes definida la primera opción (imagino que el resto no lo has puesto por no hacer el código más largo :silbar:)

- No uses <if> para comprobar las opciones. Usa un <switch>.
Código
  1. switch(opcion){
  2.    case 1:
  3.        // lo que sea si la opcion es 1
  4.        break;
  5.    case 2:
  6.        // lo que sea si la opcion es 2
  7.        break;
  8.    // asi con todas las opciones que tengas y finalmente
  9.    default:
  10.        // lo que sea si la opcion no es ninguna de las anteriores
  11.        break; // este es opcional
  12. }

- Además y si a la primera pregunta no se responde ni <N> ni <S>? :huh:. Se sale también pues entonces haz que si la respuesta es <S> se ejecute el resto del programa y sino, <else>, se salga y no uses tanto <if>.

- Siguiente trozo de código.
Código
  1. if(opcion == 1);{
  2. cout<<"\nUsted quiere ver la de Venom..."<<endl;
  3. if(regis.edad<18){
  4. cout<<"Lo siento pero no puedes verla, esta bien grotesca para alguien como usted"<<endl;
  5. }
  6. else{
  7. cout<<"Perfecto, son $40"<<endl;
  8. }
  9. return 0;
  10. }
- El punto y coma que va después del <if> de fuera sobra.
- El problema de la edad ya está arreglado con el cambio que he hecho a la función <registro()>.
- Concatenar el valor de la constante ya te lo he mostrado también.
- Hacer un descuento?? Pues vaya complicación.
Código
  1. else
  2.    cobrar();
  3. // el resto del programa
  4.  
  5. // funcion cobrar()
  6. void cobrar(){
  7.    const double DESCUENTO = 0.5;
  8.    double precio = PRECIO; // PRECIO yo lo pondría <double> por si no es un entero.
  9.    char respuesta;
  10.    cout << "Eres estudiante (s/n)? ";
  11.    respuesta = getchar();
  12.    if(respuesta == 'S' || respuesta == 's')
  13.        precio *= DESCUENTO;
  14.    cout << "Perfecto, son $" << precio << endl;
  15. }
- Y una vez se ha elegido pagado, te echa del sistema con un <return> así que el <while> de antes para meter varios usuarios ha quedado inservible. Más vale que nadie quiera ver la de Venom porque sino el siguiente que venga se encuentra con el sistema caído y se queda sin peli.

- Hasta aquí todo bien, bueno contando todos estos fallos...
- Pero ahora, si la opción es 1 destruimos el sistema y si no es 1: creamos un usuario nuevo (y al anterior que le den por no saber elegir), creamos unas variables nuevas con el nombre de las viejas pero encima con los tipos cambiados. Una pena ya que iba a molar mucho que si el primero dice que quiere comprar un boleto y la máquina le echa por elegir mal el siguiente que venga compra sí o sí gracias al <while> (debe de ser una medida para recaudar más boletos ;-)).

- Y ya después de confundir un poco al compilador y hacer que se enfade y nos escupa unos cuantos errores llegaríamos al final. Una pena que nunca lleguemos al final ya que el programa nunca llega a compilar. Aunque han usado medidas para vender más boletos al final si no funciona la máquina se quedan sin vender ninguno... :-\

Ya tienes corregidos los errores pequeños y unas cuantas y repito, CUANTAS, recomendaciones para que ese código funcione mejor sólo te queda arreglar la función principal para que funcione. Vaya así dicho parece como si mi esfuerzo no hubiese servido de nada...  :-(

PD: No había visto el <getch()> del final. Cambialo por <cin.get()> y manda a <conio.h> al quinto...
Código
  1. conio
:silbar:
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:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines