Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: juanpalomo098 en 21 Noviembre 2016, 15:44 pm



Título: Ayuda por favor ejercicio reloj do/while C
Publicado por: juanpalomo098 en 21 Noviembre 2016, 15:44 pm
6.   Realizar un reloj que se retrase una hora automáticamente el tercer día de la semana 40
Por que no funciona?
Código
  1. #include<stdio.h>
  2. #include<conio.h>
  3. void main(){
  4. int seg,min,hr,dia;
  5. seg=0;
  6. min=0;
  7. hr=0;
  8. dia=1;
  9.  
  10. do{
  11. seg=seg++;
  12. if(seg==59){min=min++; seg=0;}
  13. if(min==59&&seg==59){hr=hr++;min=0;seg=0;}
  14. if(hr==23&&min==59&&seg==59){dia=dia++;hr=0;min=0;seg=0;}
  15. if(dia==282&&hr==23&&min==59&&seg==59){dia=dia++;hr=-1;min=0;seg=0;}
  16.  
  17. printf("\ndia %d %d:d%:%d",dia,hr,min,seg);
  18. }while(dia<283);
  19.  
  20.  
  21. }//void

MOD: Etiqueta GeSHi.


Título: Re: Ayuda por favor ejercicio reloj do/while C
Publicado por: Ocelot1994 en 21 Noviembre 2016, 16:27 pm
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.


Título: Re: Ayuda por favor ejercicio reloj do/while C
Publicado por: juanpalomo098 en 21 Noviembre 2016, 17:47 pm
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.

Código
  1. #include<stdio.h>
  2. #include<conio.h>
  3. void main(){
  4. //NUMEROS PRIMOS
  5. int num,divisor;
  6. num=5;
  7. divisor=3;
  8. printf("primo:2\nprimo:3\n");
  9. while(1000>num){
  10. if(num%divisor!=0){divisor=divisor+2;
  11. }//if
  12. else{divisor=3;
  13. num=num+2;}//else
  14. if(num==divisor){
  15.  
  16. printf("primo:%d\n",num);
  17. divisor=3;
  18. num=num+2;
  19. }//if2
  20.  
  21. }//while
  22.  
  23.  
  24. }//void


Título: Re: Ayuda por favor ejercicio reloj do/while C
Publicado por: MAFUS en 21 Noviembre 2016, 18:59 pm
Código:
seg = seg++;
¿Al final de esta instrucción qué vale seg?


Título: Re: Ayuda por favor ejercicio reloj do/while C
Publicado por: Kenji-chan en 21 Noviembre 2016, 19:01 pm
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;}


Título: Re: Ayuda por favor ejercicio reloj do/while C
Publicado por: juanpalomo098 en 22 Noviembre 2016, 14:29 pm
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....


Código
  1. #include<stdio.h>
  2. void main(){
  3. int seg,min,hr,dia;
  4. seg=0;
  5. min=0;
  6. hr=0;
  7. dia=1;
  8.  
  9.  
  10. do{
  11.  
  12.  
  13. if (seg!=60){seg++;}
  14. if(seg>=60){min++; seg=0;}
  15. if(min>=60){hr++;min=0;}
  16. if(dia%283==0&&dia!=1&&hr>=24){dia++;hr=-1;}
  17. if(hr>=24){dia++;hr=0;}
  18.  
  19.  
  20. printf("\ndia %d %d:d%:%d",dia,hr,min,seg);
  21.  
  22.  
  23. }while(dia<285);
  24.  
  25.  
  26. }//void


Título: Re: Ayuda por favor ejercicio reloj do/while C
Publicado por: MAFUS en 22 Noviembre 2016, 17:37 pm
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.


Título: Re: Ayuda por favor ejercicio reloj do/while C
Publicado por: juanpalomo098 en 22 Noviembre 2016, 18:57 pm
Entiendo, pero sigue sin funcionarme en C sera por que uso turbo C?
Lo he probado en java y parece que funciona bien...


Título: Re: Ayuda por favor ejercicio reloj do/while C
Publicado por: Kenji-chan en 22 Noviembre 2016, 19:05 pm
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


Título: Re: Ayuda por favor ejercicio reloj do/while C
Publicado por: juanpalomo098 en 22 Noviembre 2016, 19:27 pm
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)
Código
  1. #include<stdio.h>
  2. #include<conio.h>
  3. void main(){
  4. int seg,min,hr,dia,cont;
  5. seg=0;
  6. min=0;
  7. hr=0;
  8. dia=1;
  9. cont=0;
  10.  
  11.  
  12. do{
  13.  
  14. seg++;
  15. if(seg>=60){min++; seg=0;}
  16. if(min>=60){hr++;min=0;}
  17. if(hr>=24){dia++;hr=0;}
  18. if(dia==283&&cont==0){cont++;dia=282;hr=23;}
  19.  
  20. printf("\ndia %d %d:%d:%d",dia,hr,min,seg);
  21.  
  22.  
  23. }while(dia<283);
  24.  
  25.  
  26. }//void


Título: Re: Ayuda por favor ejercicio reloj do/while C
Publicado por: MAFUS en 22 Noviembre 2016, 19:42 pm
No es putchar. Es getchar.

Date cuenta de que no reinicias cont. Al siguiente año, si implementas el código para reiniciar los días a cada año, no va a funcionar.


Título: Re: Ayuda por favor ejercicio reloj do/while C
Publicado por: juanpalomo098 en 22 Noviembre 2016, 20:46 pm
Ya, pero tengo que seguir, me faltan muchos ejercicios por hacer todavia.
¿Veis algun error? Si dejo el programa corriendo para ver si llega al dia 8  voy a tener que sacar un extintor.


Realizar un reloj que muestre el siguiente formato por pantalla:
   Viernes 30 de Octubre de 1998. 14:25:15,58

Código
  1. #include<stdio.h>
  2. void main(){
  3.  
  4. int centiseg,seg,min,hr,dia,sem,mes,ano;
  5. seg=0;
  6. min=0;
  7. hr=0;
  8. dia=1;
  9. centiseg=0;
  10. sem=1;
  11. mes=1;
  12. ano=1900;
  13.  
  14.  
  15. do{
  16. centiseg++;
  17. if(centiseg>=100){seg++;centiseg=0;}
  18. if(seg>=60){min++; seg=0;}
  19. if(min>=60){hr++;min=0;}
  20. if(hr>=24){dia++;hr=0;}
  21. if(dia>=8){sem++;}
  22. if(sem>=5){mes++;dia=1;}
  23. if(mes>=13){ano++;mes=1;}
  24. if(dia==1){printf("Lunes");}
  25. else if(dia==2){printf("Martes");}
  26. else if(dia==3){printf("Miercoles");}
  27. else if(dia==4){printf("Jueves");}
  28. else if(dia==5){printf("Viernes");}
  29. else if(dia==6){printf("Sabado");}
  30. else if(dia==7){printf("Domingo");}
  31. else {printf("error dia");}
  32.  
  33. printf(" %d de ",dia);
  34.  
  35. if(mes==1){printf("Enero");}
  36. else if(mes==2){printf("Febrero");}
  37. else if(mes==3){printf("Marzo");}
  38. else if(mes==4){printf("Abril");}
  39. else if(mes==5){printf("Mayo");}
  40. else if(mes==6){printf("Junio");}
  41. else if(mes==7){printf("Julio");}
  42. else if(mes==8){printf("Agosto");}
  43. else if(mes==9){printf("Septiembre");}
  44. else if(mes==10){printf("Octubre");}
  45. else if(mes==11){printf("Noviembre");}
  46. else if(mes==12){printf("Dicienbre");}
  47. else{printf("error mes");}
  48. printf(" %d ",ano);
  49.  
  50.  
  51.  
  52.  
  53. printf("%d:%d:%d,%d\n",hr,min,seg,centiseg);
  54.  
  55.  
  56. }while(ano<2000);//por ejemplo
  57.  
  58.  
  59. }//void
  60.  


Título: Re: Ayuda por favor ejercicio reloj do/while C
Publicado por: MAFUS en 22 Noviembre 2016, 21:26 pm
Puedes cambiar todo ese if else por switch.
Por otro lado tienes meses de 35 días. Recuerda que son de 28, 29, 30 y 31 días según el mes y año.


Título: Re: Ayuda por favor ejercicio reloj do/while C
Publicado por: juanpalomo098 en 22 Noviembre 2016, 23:34 pm
Ahi esta, creo que esta bien, gracias de nuevo.
Código
  1. #include<stdio.h>
  2. void main(){
  3.  
  4. int centiseg,seg,min,hr,dia,mes,ano;
  5. seg=0;
  6. min=0;
  7. hr=0;
  8. dia=1;
  9. centiseg=0;
  10.  
  11. mes=1;
  12. ano=1900;
  13.  
  14.  
  15. do{
  16. centiseg++;
  17. if(centiseg>=100){seg++;centiseg=0;}
  18. if(seg>=60){min++; seg=0;}
  19. if(min>=60){hr++;min=0;}
  20. if(hr>=24){dia++;hr=0;}
  21.  
  22. if(dia>=32&&mes==1){mes++;dia=0;}
  23. if(dia>=29&&mes==2){mes++;dia=0;}
  24. if(dia>=32&&mes==3){mes++;dia=0;}
  25. if(dia>=31&&mes==4){mes++;dia=0;}
  26. if(dia>=32&&mes==5){mes++;dia=0;}
  27. if(dia>=31&&mes==6){mes++;dia=0;}
  28. if(dia>=32&&mes==7){mes++;dia=0;}
  29. if(dia>=31&&mes==8){mes++;dia=0;}
  30. if(dia>=31&&mes==9){mes++;dia=0;}
  31. if(dia>=32&&mes==10){mes++;dia=0;}
  32. if(dia>=31&&mes==11){mes++;dia=0;}
  33. if(dia>=32&&mes==12){ano++;mes=1;dia=0;}
  34.  
  35.  
  36.  
  37.  
  38.  
  39. switch(dia){
  40. case 1:printf("Martes");break;
  41. case 2:printf("Martes");break;
  42. case 3:printf("Miercoles");break;
  43. case 4:printf("Jueves");break;
  44. case 5:printf("Viernes");break;
  45. case 6:printf("Sabado");break;
  46. case 7:printf("Domingo");break;}
  47. printf(" %d de ",dia);
  48.  
  49.  
  50.  
  51. switch(mes){
  52. case 1:printf("Enero");break;
  53. case 2:printf("Febrero");break;
  54. case 3:printf("Marzo");break;
  55. case 4:printf("Abril");break;
  56. case 5:printf("Mayo");break;
  57. case 6:printf("Junio");break;
  58. case 7:printf("Julio");break;
  59. case 8:printf("Agosto");break;
  60. case 9:printf("Septiembre");break;
  61. case 10:printf("Octubre");break;
  62. case 11:printf("Noviembre");break;
  63. case 12:printf("Dicienbre");break;}
  64. printf(" %d ",ano);
  65.  
  66.  
  67.  
  68.  
  69. printf("%d:%d:%d:%d\n",hr,min,seg,centiseg);
  70.  
  71.  
  72. }while(ano<2000);//por ejemplo
  73.  
  74.  
  75. }//void
  76.  
  77.