Problema con la Restricción de Edad hecha con If-Else y Struct

Iniciado por Rodrili1337, 27 Noviembre 2018, 00:15 AM

0 Miembros y 1 Visitante están viendo este tema.

Rodrili1337

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.

AlbertoBSD

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
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW


K-YreX

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 (cpp) [Seleccionar]

void registro(Usuario &user){
    cout << "Nombre: ";
    fgets(user.nombre, 100, stdin);
    cout << "Edad: ";
    scanf("%d", &user.edad);
    cout << "Registrado Usuario: " << user.nombre << " Edad: " << user.edad << endl;
}

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 (cpp) [Seleccionar]

while(res == 'N' || res == 'n'){
cout<<"\n\nOk, que tenga un buen dia.";
return 0;

// Forma correcta
if(res == 'N' || res == 'n')
    // todo lo demas
}


- 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 (cpp) [Seleccionar]

switch(opcion){
    case 1:
        // lo que sea si la opcion es 1
        break;
    case 2:
        // lo que sea si la opcion es 2
        break;
    // asi con todas las opciones que tengas y finalmente
    default:
        // lo que sea si la opcion no es ninguna de las anteriores
        break; // este es opcional
}


- 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 (cpp) [Seleccionar]

if(opcion == 1);{
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{
cout<<"Perfecto, son $40"<<endl;
}
return 0;
}

- 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 (cpp) [Seleccionar]

else
    cobrar();
// el resto del programa

// funcion cobrar()
void cobrar(){
    const double DESCUENTO = 0.5;
    double precio = PRECIO; // PRECIO yo lo pondría <double> por si no es un entero.
    char respuesta;
    cout << "Eres estudiante (s/n)? ";
    respuesta = getchar();
    if(respuesta == 'S' || respuesta == 's')
        precio *= DESCUENTO;
    cout << "Perfecto, son $" << precio << endl;
}

- 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 (cpp) [Seleccionar]
conio :silbar:
Código (cpp) [Seleccionar]

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