
// 3.20, 3.21, 3.26

extern "C" {
  //  #include <time.h>
  #include <ctype.h>
}

#include <iostream.h>


bool multiple(int x, int y) {
  // y * z => x
  return (x % y == 0);
}

bool even(int x) {
  return (x % 2 == 0);
}

int mtos(int minutes) {
  const int s = 60;
  return (minutes * s);
}

int htom(int hour) {
  const int m = 60;
  return (hour * m);
}

int htos(int hour) {
  return (mtos(htom(hour)));
}

int base_seconds(int hour, int minutes, int seconds) {
  const int h = 12;
  
  int total_base_seconds = htos(h);
  int total_seconds = htos(hour) + mtos(minutes) + seconds;
  if (total_seconds < total_base_seconds)
    return total_seconds;
  else return (total_seconds - total_base_seconds);

}

bool badtime(int horas, int minutos, int segundos) {
  return ((horas > 24) || (horas < 0) || 
	  (minutos > 60) || (minutos < 0) ||
	  (segundos > 60) || (segundos < 0));
}

int getvalue( char *mess) {
  int hour; int minutes; int seconds;
  bool baddata;

    do {
      cout << mess;
      cin >> hour >> minutes >> seconds;
      baddata = badtime(hour, minutes, seconds);
      if (baddata) cout << "Valor incorrecto" << endl;
      else break;
    } while (1);
    return (base_seconds(hour, minutes, seconds));
}

void clean_display(void) {
  for (int i = 1; i <= 25; i++) cout << endl;
}

bool YesExit() {
  char answer;

  cout << endl << "Para terminar entre 'Y': ";
  cin >> answer;
  cout << endl;
  clean_display();
  return (toupper(answer) == 'Y');
}

void display(void) {
  clean_display();
  cout << "Menu de seleccion"
       << endl << endl
       << "1. Programa 3.20" << endl
       << "2. Programa 3.21" << endl
       << "3. Programa 3.26" << endl
       << "4. Salir" << endl
       << endl
       << "Entre el numero del programa" << endl
       << "que desea correr: ";
}

void Programa_3_20() {
  int y; int x;

  do {
    cout << "Para determinar si un numero entero x es"
	 << endl
	 << "multiplo de un numero entero y; entre un par"
	 << endl
	 << "de numeros enteros de la forma-> y x: ";
    cin >> y >> x;

    if (multiple(y,x))
      cout << x << " ES multiplo de " << y << endl;
    else cout << x << " NO es multiplo de " << y << endl;

  } while (!YesExit());
}

void Programa_3_21() {
  char answer;
  int x;

  do {
    cout << "Para determinar si un numero entero x es par"
	 << endl
	 << "entre de la forma-> x: ";
    cin >> x;

    if (even(x))
      cout << x << " ES un numero par" << endl;
    else cout << x << " NO es numero par" << endl;


  } while (!YesExit());
}

void Programa_3_26() {
  bool baddata;
  int valor1; int valor2;

  do {
    // int base_seconds(hour, minutes, seconds)

    cout << "Para determinar la diferencia en segundos"
	 << endl
	 << "entre dos horas de la forma-> "
	 << "horas minutos segundos"
	 << endl
	 << "donde las horas deben estar dentro del mismo"
	 << endl
	 << "periodo de 12 horas.  Ambas deben ser despues"
	 << endl
	 << "de las 12 o antes de las 12 a la vez"
	 << endl;
    
    valor1 = getvalue("Entre la primera hora: ");

    valor2 = getvalue("Entre la segunda hora: ");

    cout << "Diferencia en segundos entre ambas es: "
	 << abs(valor1 - valor2) << endl;
	
  } while (!YesExit());
}

void main() {
  char seleccion;

  do {
    display();
    cin >> seleccion;
    if (seleccion == '1')
      { clean_display(); Programa_3_20();}
    else if (seleccion == '2')
      { clean_display(); Programa_3_21();}
    else if (seleccion == '3')
      { clean_display(); Programa_3_26();}
    else if (seleccion == '4');
    else { 
      cout << "Seleccion erronea" << endl << endl;
      cout << "Oprima cualquier tecla para continuar";
      cin.get(); cin.get();
    }
  } while (seleccion != '4');

}
