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


 


Tema destacado: Security Series.XSS. [Cross Site Scripting]


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Soluciones alternativas - Ejercicio en C++
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Soluciones alternativas - Ejercicio en C++  (Leído 622 veces)
csp

Desconectado Desconectado

Mensajes: 35


Ver Perfil
Soluciones alternativas - Ejercicio en C++
« en: 5 Abril 2020, 04:00 »

Buenas,

Tengo un ejercicio bastante simple en C++: calcular la edad de una persona. Pero con varias limitaciones.

- De la biblioteca estandar, unicamente se puede usar cout, cin, endl (Para pedir dia, mes y año de nacimiento).
- Solo variables de tipo entero.
- Solo operadores aritmeticos, o de incremento/decremento.
- Se permiten instrucciones if PERO, no pueden estar anidadas, no if...else y las condiciones solo se pueden formar por operadores de igualdad o relacion.
- No switch, no bucles, no punteros, no funciones raras ni nada por el estilo :xD Solo lo mas basico.

Despues de darle varias vueltas, la unica solucion que se me ocurrio fue la siguiente.
Para simplificar, la fecha actual ya la seteo en el codigo y se asume que los valores que se ingresan para dia/mes/año son correctos. No se valida entrada.

Código
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. int main(){
  5.    int n_dia, n_mes, n_anio; // Dia, mes y año de nacimiento
  6.    int a_dia = 4; int a_mes = 4; int a_anio = 2020; // Dia, mes y año actuales
  7.    int a = 0; int b = 0; int c = 0; int d = 0; int e = 0; // Banderas
  8.  
  9.    cout << "Ingrese dia nacimiento: ";
  10.    cin >> n_dia;
  11.    cout << "Ingrese mes nacimiento: ";
  12.    cin >> n_mes;
  13.    cout << "Ingrese año nacimiento: ";
  14.    cin >> n_anio;
  15.  
  16.    if (n_mes > a_mes) a++;
  17.    if (n_mes < a_mes) b++;
  18.    if (n_mes == a_mes) c++;
  19.    if (n_dia > a_dia) d++;
  20.    if (n_dia <= a_dia) e++;
  21.  
  22.    if (a == 1) cout << "Edad: " << (a_anio - n_anio) - 1 << endl;
  23.    if (b == 1) cout << "Edad: " << a_anio - n_anio << endl;
  24.    if (c + d == 2) cout << "Edad: "<< (a_anio - n_anio) -1 << endl;
  25.    if (c + e == 2) cout << "Edad " << a_anio - n_anio << endl;
  26.  
  27.    return 0;
  28.  
  29. }

A alguno se le ocurre alguna solucion mas simple/elegante que eso?
Es mas, ni siquiera se si funciona correctamente con todos los valores. Los casos que use los paso, pero no se sabe.

Gracias!


En línea

K-YreX
Moderador
***
Desconectado Desconectado

Mensajes: 803



Ver Perfil
Re: Soluciones alternativas - Ejercicio en C++
« Respuesta #1 en: 5 Abril 2020, 04:42 »

Bueno, lo primero es ver las posibles ramas del problema:
Código:
SI mes actual > mes nacimiento ENTONCES
    edad = año actual - año nacimiento
SINO SI mes actual < mes nacimiento ENTONCES
    edad = año actual - año nacimiento - 1
SINO
    SI dia actual >= dia nacimiento ENTONCES
        edad = año actual - año nacimiento
    SINO
        edad = año actual - año nacimiento - 1
    FIN SI
FIN SI
Ahora para cumplir con las restricciones podríamos establecer un valor por defecto, por ejemplo: año actual - año nacimiento y en caso de que sea necesario, restarle 1.

Sin embargo, una forma de eliminar ramas es trabajar con días directamente. La idea sería calcular los días que han pasado del inicio del año de nacimiento al día de nacimiento y del inicio del año actual al día actual y dependiendo de cual sea mayor, ya se habrán cumplido los años correspondientes del año actual o no. Como estamos trabajando con la misma referencia podemos establecer 30 días/mes para hacer los cálculos más sencillos (recuerda guardar ese 30 como una constante ya que ver números sueltos por el programa lo hace más difícil de entender).
Código:
edad = añoActual - añoNacimiento

diasAñoActual = 30 * (mesActual - 1) + diaActual
diasAñoNacimiento = 30 * (mesNacimiento - 1) + diaNacimiento

SI diasAñoActual < diasAñoNacimiento ENTONCES
    edad = edad - 1
FIN SI


En línea

Código
  1. cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
@XSStringManolo
<svg/onload=alert()>
Colaborador
***
Desconectado Desconectado

Mensajes: 2.171


Turn off the red ligth


Ver Perfil WWW
Re: Soluciones alternativas - Ejercicio en C++
« Respuesta #2 en: 5 Abril 2020, 06:46 »

Sin comprobaciones lo más básico que se me ocurre:
Código
  1. if(diaHoy<diaN)++mesN;
  2. if(mesHoy<mesN)++anhoN;
  3. cout<<"Tienes  "<<anhoHoy-anhoN<<" años."

« Última modificación: 5 Abril 2020, 06:51 por @XSStringManolo » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Soluciones a los crackmes
Ingeniería Inversa
byebye 7 3,601 Último mensaje 10 Agosto 2003, 16:28
por kapland
Soluciones ejercicios C « 1 2 »
Ejercicios
Cobac 13 47,401 Último mensaje 7 Agosto 2005, 21:55
por Cobac
Soluciones: « 1 2 3 4 »
Dispositivos Móviles (PDA's, Smartphones, Tablets)
karneth 32 39,698 Último mensaje 30 Junio 2011, 00:23
por robertayanes
[Ejercicio] Aca tienen un ejercicio para practicar « 1 2 3 »
Programación Visual Basic
Dreamaker 20 12,080 Último mensaje 5 Septiembre 2010, 02:57
por TGa.
Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines