Reloj c++

Iniciado por ianmorar03, 31 Marzo 2016, 20:32 PM

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

ianmorar03

Hola gente, de nuevo vengo a molestar, estoy haciendo un codigo de un reloj, tengo el codigo completo del reloj, lo que quiero ahora, es que el usuario digite cuantas horas, minutos y segundos quiere adelantar el reloj, y cuantas quiere atrasar, lo que pasa es que al adelantar muchos minutos y segundos cambia las horas o los minutos.
Si me pudieran ayudar, como puedo hacer para que no sume mas de la cuenta (que las horas no pasen de 24, que los minutos de 60 y segundos de 60)
Estoy empezando y no se como hacer :-(
Aca el codigo:

class Reloj{
private:
int horas, minutos, segundos, horasxa, minutosxa, segundosxa, horasxat, minutosxat, segundosxat;

};
int main(){
Reloj reloj1;
reloj1.setHoras(8);
reloj1.setMinutos(30);
reloj1.setSegundos(15);
}
Aquellos que estan locos como para pensar que pueden cambiar el mundo , son los que lo hacen.

kr.chacacreker

Podrías poner solo el resto de la división y listo... hace algo como:


...
reloj1.setHoras(ingreso%60);
...


LaiaxanIV

Mira esto, esta claro que es mejorable pero creo que te puede funcionar para lo que buscas. Si necesitas ayuda o no entiendes alguna cosa, solo lo tienes que decir!

Código (GeSHi) [Seleccionar]

#include <iostream>
using namespace std;

class Reloj{
private:
int time;
bool correctSum(int t);
bool correctSub(int t);
    public:
            Reloj();
            void subHoras(int h);
            void subMin(int m);
            void subSeg(int s);
            void addHoras(int h);
            void addMin(int m);
            void addSeg(int s);
            void printReloj();
};


Reloj::Reloj(){
    time = 0;
    }
   
    void Reloj::addHoras(int h){
    if(!correctSum(h*3600)) cout << "No se ha podido realizar esta operacion con las horas" << endl;
    else time += h*3600;
}

    void Reloj::addMin(int m){
    if(!correctSum(m*60)) cout << "No se ha podido realizar esta operacion con los minutos" << endl;
    time += m*60;
}

    void Reloj::addSeg(int s){
    if(!correctSum(s)) cout << "No se ha podido realizar esta operacion con los segundos" << endl;
    time += s;
}
   
    void Reloj::subHoras(int h){
    if(!correctSub(h*3600)) cout << "No se ha podido realizar esta operacion con las horas" << endl;
    else time -= h*3600;
}

    void Reloj::subMin(int m){
    if(!correctSub(m*60)) cout << "No se ha podido realizar esta operacion con los minutos" << endl;
    time -= m*60;
}

    void Reloj::subSeg(int s){
    if(!correctSub(s)) cout << "No se ha podido realizar esta operacion con los segundos" << endl;
    time -= s;
}

    void Reloj::printReloj(){
int h = time/3600;
int min = (time%3600)/60;
int seg = (time%3600)%60;
cout << h << ":" << min << ":" << seg << endl;
}

    bool Reloj::correctSum(int t){
if((time + t) >= 3600*24) return false;
return true;
}

    bool Reloj::correctSub(int t){
if(time - t < 0) return false;
return true;
}

int main(){
Reloj reloj;
cout << "Introduce la hora inicial del reloj en formato HH:MM:SS" << endl;
int h,m,s;
char c;
cin >> h >> c >> m >> c >> s;
reloj.addHoras(h);
reloj.addMin(m);
reloj.addSeg(s);
int op;
cout << "1->Adelantar reloj 2->Retrasar reloj 3->Ver hora -1-> Salir" << endl;
cin >> op;
while(op != -1){
switch(op){
case 1:
cout << "Introduce el tiempo que quieres adelantar en el siguiente formato HH:MM:SS" << endl;
cin >> h >> c >> m >> c >> s;
reloj.addHoras(h);
reloj.addMin(m);
reloj.addSeg(s);
cout << "Hora:" << endl;
reloj.printReloj();
break;
case 2:
cout << "Introduce el tiempo que quieres retrasar en el siguiente formato HH:MM:SS" << endl;
cin >> h >> c >> m >> c >> s;
reloj.subHoras(h);
reloj.subMin(m);
reloj.subSeg(s);
cout << "Hora:" << endl;
reloj.printReloj();
break;
case 3:
cout << "Hora:" << endl;
reloj.printReloj();
break;
default:
cout << "Opcion no valida" << endl;
}
cin >> op;
}
}

ianmorar03

Cita de: kr.chacacreker en 31 Marzo 2016, 21:15 PM
Podrías poner solo el resto de la división y listo... hace algo como:


...
reloj1.setHoras(ingreso%60);
...


Pura vida! y si quisiera atrasar las horas como hago?
Aquellos que estan locos como para pensar que pueden cambiar el mundo , son los que lo hacen.

HardForo

Siiempre tuve curiosidad..... por qué se suelen implementar los metodos por fuera de la clase donde se definen en C++ ?

HardForo:  foro de Hardware y programación

Se buscan Mods y colaboradores *

MAFUS

#5
Los que se implementan dentro de la clase se convierten en métodos inline. Cada vez que el compilador encuentra uno no hace una llamada a ese método, sino que copia todo el código en ese lugar.
Por tanto los métodos inline se usan para hacer pequeños trabajos muy repetidos ya que no hay que perder tiempo llamándolos. Nótese que si el método inline es grande el código final va a crecer mucho, además por lo que es coste de tiempo en llamarlo al del tamaño del código objeto, a lo mejor, no compensa.

El implementarlo fuera sigue la filosofía de separar la declaración de la definición. Así la declaración va en un archivo de cabecera que puede pasarse al archivo de código que sea necesario. Mjentras tanto tienes por otra parte las definiciones en un código objeto que el enlazador te va a unir en último momento.
Esto te da la ventaja de reducir el tiempo de compilación porque sólo debes compilar el archivo que se ha cambiado y no todo el código.


Por cierto, no resucites hilos antiguos. Estaría mejot si iniciaras uno nuevo para la cuestión.

HardForo

Amigo @MAFUS: he leido sobre funciones inline...... entiendo que copian el codigo in situ en vez de hacer una llamada a la funcion ahorrando tiempo en la llamada y espacio en la pila....... pero... es el caso del "Reloj c++" ? no veo la keyword inline

O cuando estan dentro de una clase no requieren esa keyword y el concepto es el mismo ?

En caso de no ser el mismo concepto........ cual es?


HardForo:  foro de Hardware y programación

Se buscan Mods y colaboradores *

MAFUS

La palabra clave inline hace lo mismo, lo que en ese caso la definición de la función puede hacerse en el archivo .cpp