Ayuda por favor ejercicio reloj do/while C

Iniciado por juanpalomo098, 21 Noviembre 2016, 15:44 PM

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

juanpalomo098

6.   Realizar un reloj que se retrase una hora automáticamente el tercer día de la semana 40
Por que no funciona?
#include<stdio.h>
#include<conio.h>
void main(){
int seg,min,hr,dia;
seg=0;
min=0;
hr=0;
dia=1;

do{
seg=seg++;
if(seg==59){min=min++; seg=0;}
if(min==59&&seg==59){hr=hr++;min=0;seg=0;}
if(hr==23&&min==59&&seg==59){dia=dia++;hr=0;min=0;seg=0;}
if(dia==282&&hr==23&&min==59&&seg==59){dia=dia++;hr=-1;min=0;seg=0;}

printf("\ndia %d %d:d%:%d",dia,hr,min,seg);
}while(dia<283);
getch();


}//void


MOD: Etiqueta GeSHi.

Ocelot1994

Lo primero no utilices la libreria conio, puede utilizar otras funciones estilo putchar.
Y luego tu principal fallo es que cuando llega al segundo 59, el contador se reinicia a 0 por lo que nunca te entrara ni por el segundo , ni por el tercero... etc ya que no se cumple la condición.

Un saludo.

juanpalomo098

Parece que no funciona ni e contador de segundos y no entiendo porque... el otro dia hice un programa de numeros primos que se parece bastante y funcionaba correctamente.

#include<stdio.h>
#include<conio.h>
void main(){
//NUMEROS PRIMOS
int num,divisor;
num=5;
divisor=3;
printf("primo:2\nprimo:3\n");
while(1000>num){
if(num%divisor!=0){divisor=divisor+2;
}//if
else{divisor=3;
num=num+2;}//else
if(num==divisor){

printf("primo:%d\n",num);
divisor=3;
num=num+2;
}//if2

}//while
getch();


}//void

MAFUS

seg = seg++;
¿Al final de esta instrucción qué vale seg?

Kenji-chan

primero estas haciendo mal el incremento de las variables
seg=seg++;
con poner seg++; es suficiente

segundo estas haciendo mal las comprobaciones
if(seg==59){min=min++; seg=0;}
solo entrara cunando seg sea exactamente igual a 59

tercero estas haciendo mal el reinicio de las variables
if(seg==59){min=min++; seg=0;}
if(min==59&&seg==59){hr=hr++;min=0;seg=0;}
no puedes estar poniendo a cero cada ves que entras en una nueva comprobación
tiene que haber una sola que se encargue de reiniciarla cuando supere su valor máximo
por ejemplo
if(seg>=60){min++; seg=0;}
if(min>=60){hr++;min=0;}

juanpalomo098

#5
En primer lugar gracias a todos por vuestros comentarios.
No se porque pero solo suma las horas y los dias, he probado sin el if (seg!=60), pero es lo mismo...

MAFUS al final de esa instrucción seg vale 1 y pensaba que deberia seguir sumando 1 hasta meterse en el if que sumaria un minuto y reiniciaria seg.

Kenji-chan he cambiado el codigo pero no se que mas hace falta....



#include<stdio.h>
void main(){
int seg,min,hr,dia;
seg=0;
min=0;
hr=0;
dia=1;


do{


if (seg!=60){seg++;}
if(seg>=60){min++; seg=0;}
if(min>=60){hr++;min=0;}
if(dia%283==0&&dia!=1&&hr>=24){dia++;hr=-1;}
if(hr>=24){dia++;hr=0;}


printf("\ndia %d %d:d%:%d",dia,hr,min,seg);


}while(dia<285);
putchar();


}//void

MAFUS

Decide a qué hora debes realizar el cambio. Si lo haces justo al entrar al día debes volver a las 23 horas del día anterior.
Ya que vuelves una hora atrás, al volver a ser la hora definida, se repetiría el atraso de la hora, y eso no te interesa. Usa un marcador para decir que se ha realizado ese cambio y evitar que se produzca de nuevo.
Ese marcador no puede estar activo eternamente porqué al siguiente año no se podría producir el atraso de la hora. Deberás reiniciarlo.

juanpalomo098

Entiendo, pero sigue sin funcionarme en C sera por que uso turbo C?
Lo he probado en java y parece que funciona bien...

Kenji-chan

en la linea 16 con el operador '%' estas comprobado si el residuo de dividir en cada iteracion el valor de dia entre 283 sea exactamente igual a 0
if(dia%283==0&&dia!=1&&hr>=24){dia++;hr=-1;}
mejor evalúa el dia y despues haces otra evalucion del dia que quieres que se atrase
if(dia<=24)


printf("\ndia %d %d:d%:%d",dia,hr,min,seg);
esta mal escrito es %d por eso te imprime la d y en el contador de las horas te imprime los minutos

juanpalomo098

#9
Muchas gracias! ya funciona perfectamente, el reloj retrasa una hora en el dia 283 que creo que es lo que pedia el ejecicio, en lugar de retrasarla cada 283 dias que es lo que pretendia aunque estuviera mal...
(Al final he puesto la libreria conio.h porque me da error con putchar(); en turbo c)
#include<stdio.h>
#include<conio.h>
void main(){
int seg,min,hr,dia,cont;
seg=0;
min=0;
hr=0;
dia=1;
cont=0;


do{

seg++;
if(seg>=60){min++; seg=0;}
if(min>=60){hr++;min=0;}
if(hr>=24){dia++;hr=0;}
if(dia==283&&cont==0){cont++;dia=282;hr=23;}

printf("\ndia %d %d:%d:%d",dia,hr,min,seg);


}while(dia<283);
getch();


}//void