#include<iostream>
using namespace std;
// Primer ejemplo de clases en C++
// Version 26 mayo 2013 By: CompSystems www.jaimeza.org
// El usuario entra una hora, minuto y segundo y la maquina la convierte a formato estandar y universal o militar,
// ademas se da uso del Operador condicional ternario símbolo (?)
#define True 1
#define False 0
#define Beep '\a'
int flag1 = False;
// Definicion de un nuevo tipo de objeto de nombre Time_Type
class Time_Type{ // Time_Type Es un nuevo especificador de tipo
friend void fr_setTime_hour( Time_Type &Time_ObjectX, int c_hour ); // Declaracion de una funcion friend
public: // Interfaz
// Constructor
// Metodo1: Inicializa a valores validos los datos private dados en el cuerpo de la funcion Time_Type( ) si esta definida dentro de main()
// Time_Type( ); // El nombre del constructor debe ser igual al nuevo tipo de dato de la clase
// Esta funcion Time_Type( ); se invocase o se llama automaticamente (por esta razon no se debe esbrirla en main) en el momento de crearse un objeto de tipo de esta clase
// Metodo2: Inicializa a valores validos, los 3 primeros datos private, El 4to miembro no se inicializa por ahora
Time_Type( // El constructor, no requiere el prefijo de tipo de dato
int hour = 0,
int minute = 0,
int second = 0
); // Aunque tiene
// La anterior sentencia podria esbribirse sin el nombre identificador de los miembros
// Time_Type( int = 0, int = 0, int = 0 ); // pero es menos intuitiva
// Funciones get
void getTime_keyboard( ); // funcion (get) para obtener del usuario la hora inicial por teclado
int getTime_hour( ); // retorna hora
int getTime_minute( ); // retorna minuto
int getTime_second( ); // retorna segundo
// getTime_current( ); // funcion (get) para obtener del la hora actual de la clase
// Funciones set
void setTime( int Time_Object_memberX, int memberXPos, int limInf, int limSup ); // Funcion para extablecer el valor a cada miembro, ademas de verificar si es un dato valido dado por los limetes del argumento
void setTime_check( int hour_, int minute_, int second_ );
void setTime_hour( int c_hour );
void setTime_minute( int c_minute );
void setTime_second( int c_second );
// Funciones con el operador *this
Time_Type &setTime2_hour( int c_hour );
Time_Type &setTime2_minute( int c_minute );
Time_Type &setTime2_second( int c_second );
// Funciones impresion
void printMilitary( );
void printStandard( );
private: // Cliente
int hour; // member1, rango valido [ 0 , ..., 23 ]
int minute; // member2, rango valido [ 0 , ..., 59 ]
int second; // member3, rango valido [ 0 , ..., 59 ]
const char *string[ 4 ]; // member4, cada submiembro tiene rango expandible
// No hay funciones private
// No hay funciones auxiliares o de utileria
};
void incrementMinutes ( Time_Type &Time_ObjectX, const int count );
void fr_setTime_hour( Time_Type &Time_ObjectX, int c_hour ){ // comparar con la funcion normal: void Time_Type:: setTime_hour( int c_hour )
Time_ObjectX.hour = ( c_hour >=0 && c_hour < 24 )? c_hour: 0; // cuerpo de la funcion normal: hour = ( c_hour >=0 && c_hour < 24 )? c_hour: 0;
}
int main ( int argc, char *argv[] ) {
//////////////////////////////// Sin datos especificos
cout << "\nDatos entrados por el usuario, por teclado" << endl;
class Time_Type Time_Object; // Se crea un objeto de nombre Time_Object() y de tipo Time_Type
// como Time_Object no tiene sufijos argumentos entre parentesis, entonces equivale a asignar todos los argumentos predeterminados de Time_Type( int hour = 0, ... ) definidos en el la clase
// Time_Type( ); // Esta sentencia esta comentada por se invoca automaticamente cuando se crea un objeto Time_Object
Time_Object.getTime_keyboard( );
Time_Object.printMilitary( );
Time_Object.printStandard( );
//cout << Time_Object.hour << endl; // No se puede acceder a un dato privado
////////////////////////////////
//////////////////////////////// Con datos especificos
cout << "\n\nDatos especificados dentros del algoritmo, 3 argumentos ( 7, 35, 58 )" << endl;
class Time_Type Time_Object2( 7, 35, 58 ); // Se crea un objeto de nombre Time_Object2 y de tipo Time_Type
// como Time_Object tiene 3 argumentos, equivale a asignar todos los argumentos de Time_Type( );
// Time_Type( 7, 35, 58 );; // Esta sentencia esta comentada pero se invoca automaticamente cuando se crea un objeto Time_Object2
Time_Object2.printMilitary( );
Time_Object2.printStandard( );
////////////////////////////////
//////////////////////////////// Con datos especificos
cout << "\n\nDatos especificados dentros del algoritmo, 1 argumento ( 23 )" << endl;
class Time_Type Time_Object3( 23 ); // Se crea un objeto de nombre Time_Object2 y de tipo Time_Type
// como Time_Object tiene 1 argumento equivale a asignar solo el 1er argumento de Time_Type( );
// Time_Type( 23 ); // el 2do y 3cer elemento se definen a 0 en la sentencia anterior
Time_Object3.printMilitary( );
Time_Object3.printStandard( );
////////////////////////////////
//////////////////////////////// Con datos especificos
cout << "\n\nDatos especificados dentros del algoritmo, INVALIDOS ( 24, 60, -1 )" << endl;
class Time_Type Time_Object4( 24, 60, -1 ); // Se crea un objeto de nombre Time_Object2 y de tipo Time_Type
// Time_Type( 24, 60, -1 );
Time_Object4.printMilitary( ); // Salida 00:00:00, cuando es un dato invalido
Time_Object4.printStandard( ); // Salida 12:00:00 AM
////////////////////////////////
////////////////////////////////
Time_Object4.setTime_check( 9, 45, 2 ); // Fijando valores con la funcion setTime
Time_Object4.printMilitary( ); // Salida 09:45:02
Time_Object4.printStandard( ); // Salida 9:45:2 AM
////////////////////////////////
////////////////////////////////
class Time_Type Time_Object5; // Creando un nuevo objeto Time_Object5 de tipo Time_Type con valores predeterminados por que no posee argumentos
Time_Object5.printMilitary( ); // Salida 00:00:00 valor predeterminado del constructor
Time_Object5.printStandard( ); // Salida 12:00:00 AM valor predeterminado del constructor
Time_Object5 = Time_Object4; // Asigancion por copia de los miembros de Time_Object4 hacia Time_Object5
Time_Object4.printMilitary( ); // Salida 09:45:02
Time_Object4.printStandard( ); // Salida 9:45:2 AM
////////////////////////////////
////////////////////////////////
class Time_Type Time_Object6;
Time_Object6.setTime_check( 11, 58, 7 ); // Fijando valores con la funcion setTime
incrementMinutes( Time_Object6, 3 );
// Salida inicial 11:58:07
////////////////////////////////
// Fijando valores con la subfunciones setTime_hour/minute/second
Time_Object6.setTime_hour( 14 ); Time_Object6.setTime_minute( 38 ); Time_Object6.setTime_second( 52 );
Time_Object6.printMilitary( ); // Salida 14:38:52
// la sentencias anteriores se pueden simplificar usando la version anidada de funciones operador *this
Time_Object6.setTime2_hour( 14 ).setTime2_minute( 38 ).setTime_second( 52 );
Time_Object6.printMilitary( ); // Salida 14:38:52
// la sentencias anteriores se pueden simplificar usando la version anidada de funciones operador *this
Time_Object6.setTime2_hour( 0 ).setTime2_minute( 1 ).setTime_second( 2 );
Time_Object6.printMilitary( ); // Salida 00:01:02
// Utilizando la funcion amigo
fr_setTime_hour( Time_Object6, 12 );
Time_Object6.printMilitary( ); // Salida 12:01:02
return 0;
}
// Funcione constructor
// Metodo1: Inicializa a valores validos los datos private
//Time_Type:: Time_Type( int hour_, int minute_, int second_ ){ // Constructor, ( con argumentos opcionales )
// hour = 0;
// minute = 0;
// second = 0;
// string[ 0 ] = "";
// string[ 1 ] = "";
// string[ 2 ] = "";
// string[ 3 ] = "";
//}
// Metodo2:
Time_Type:: Time_Type( int arg1_hour, int arg2_minute, int arg3_second ){ // Constructor, ( con argumentos opcionales )
setTime_check( arg1_hour, arg2_minute, arg3_second );
}
// Funcion destructor
// Funciones get
int Time_Type:: getTime_hour( ){ // retorna hora
return hour;
}
int Time_Type:: getTime_minute( ){ // retorna minuto
return minute;
}
int Time_Type:: getTime_second( ){ // retorna segundo
return second;
}
void Time_Type:: getTime_keyboard( )
{
int input;
cout << "Entrada de Time" << endl;
do{
cout << "\nEntre Hora: rango valido [ 0 , ..., 23 ]" << endl;
cout << "Hora = ";
cin >> input; // memberX
setTime( input, 1, 0, 23 ); // 1 = hour
} while( flag1 == True ); // se puede simplificar a: while( flag1 );
do{
cout << "\nEntre Minuto: rango valido [ 0 , ..., 59 ]" << endl;
cout << "Minuto = ";
cin >> input; // memberX
setTime( input, 2, 0, 59 ); // 2 = minute
} while( flag1 == True );
do{
cout << "\nEntre Segundo: rango valido [ 0 , ..., 59 ]" << endl;
cout << "Segundo = ";
cin >> input; // memberX
setTime( input, 3, 0, 59 ); // 3 = second
} while( flag1 == True );
}
// Funciones set
void Time_Type:: setTime_hour( int c_hour ){
hour = ( c_hour >=0 && c_hour < 24 )? c_hour: 0;
}
void Time_Type:: setTime_minute( int c_minute ){
minute = ( c_minute >=0 && c_minute < 60 )? c_minute: 0;
}
void Time_Type:: setTime_second( int c_second ){
second = ( c_second >=0 && c_second < 60 )? c_second: 0;
}
void Time_Type:: setTime( int Time_Object_memberX, int memberXPos, int limInf, int limSup ){
flag1 = ( Time_Object_memberX < limInf || Time_Object_memberX > limSup )? True: False; // verifica si es un rango valido
if ( flag1 == True ) {
cout << Beep; // se emite un sonido
cout << "\nDato invalido" << endl;
}else{ // asigna a un miembro especifico dado por el identificador memberXPos
switch ( memberXPos ) {
case 1:
hour = Time_Object_memberX;
break;
case 2:
minute = Time_Object_memberX;
break;
case 3:
second = Time_Object_memberX;
break;
//default:
}
}
}
void Time_Type:: setTime_check( int hour_, int minute_, int second_ ){ // Ajuste a 00:00:00, cuando es un dato invlaido
setTime_hour( hour_ );
setTime_minute( minute_ );
setTime_second( second_ );
}
// Funciones set con el operador *this
Time_Type &Time_Type:: setTime2_hour( int c_hour ){
hour = ( c_hour >=0 && c_hour < 24 )? c_hour: 0;
return *this; // Habilita la opcion de sentencias anidadas
}
Time_Type &Time_Type:: setTime2_minute( int c_minute ){
minute = ( c_minute >=0 && c_minute < 60 )? c_minute: 0;
return *this; // Habilita la opcion de sentencias anidadas
}
Time_Type &Time_Type:: setTime2_second( int c_second ){
second = ( c_second >=0 && c_second < 60 )? c_second: 0;
return *this; // Habilita la opcion de sentencias anidadas
}
// Funciones de impresion
void Time_Type:: printMilitary( ){
cout << "\nFormato universal o Militar: ";
string[0] = ( hour < 10 )? "0": ""; // Ajuste del prefijo "0" para valores menores de 10
string[1] = ( minute < 10 )? "0": "";
string[2] = ( second < 10 )? "0": "";
string[3] = "";
// Despliegue final en pantalla
cout
<< string[0] << hour << ":"
<< string[1] << minute << ":"
<< string[2] << second
<< endl; ;
}
void Time_Type:: printStandard( ){
int hour_std;
cout << "\nFormato Estandar: ";
// { 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 } modulo 12 =
// { 0 1 2 3 4 5 6 7 8 9 10 11 0 1 2 3 4 5 6 7 8 9 10 11 }
hour_std = (hour)%12;
(hour_std == 0)? (hour_std=12) : (hour_std=hour_std) ; // si el modulo es 0 se hace un ajuste a 12 de lo contrario nada
// string[0] = ( hour == 0 || hour == 12 )? "12": (hour)%12 ; // Como convierto (hour)%12 a cadena?
string[0] = "";
string[1] = ( minute < 10 )? "0": ""; // Ajuste del prefijo "0" para valores menores de 10
string[2] = ( second < 10 )? "0": "";
string[3] = ( hour < 12 )? "AM": "PM";
// Despliegue final en pantalla
cout
<< string[0] << hour_std << ":"
<< string[1] << minute << ":"
<< string[2] << second << " "
<< string[3]
<< endl;
}
void incrementMinutes ( Time_Type &Time_ObjectX, const int count ){ // &Time_ObjectX = Time_ObjectX // paso por refernacia
int a_hour, a_minute; // identificadores auxiliares
// setTime_check( 11, 58, 7 ) se fijaron estos valores dentro de main
cout << "\nHora inicial: "; // 11:58:00 AM
Time_ObjectX.printStandard( ); // llamada incrementMinutes( Time_Object6, 3 );
for ( int i = 0; i < count;i++ ) {
a_minute = ( Time_ObjectX.getTime_minute() + 1 ) % 60;
Time_ObjectX.setTime_minute( a_minute );
if ( Time_ObjectX.getTime_minute() == 00 ) {
a_hour = ( Time_ObjectX.getTime_hour() + 1 ) % 24;
Time_ObjectX.setTime_hour( a_hour );
}
cout << "\nIncremento en 1 minuto:"; // 11:59:07 AM, 12:00:07 PM, 12:01:07 PM
Time_ObjectX.printStandard( );
}
}