Forum Clubic

Besoin d'aide pour mon petit programme en C

Bonsoir a tous,

Je cherche a faire une horloge toute simple dans le cadre d’un projet, je suis un peu bloqué en faite car au bahut je travaille et programme sous linux. Alors que visiblement sous windows c’est bien plus galère je trouve … ( je suis débutant en programmation ).

pour faire simple voila mon programme :

#include <conio.h>
#include <stdio.h>
#include <stdlib.h>

main()
{
int arret=-1;
int h=0;
int m=0;
int s=0;
while(!arret)
{
if(s==59)
{
s=0;
if(m==59)
{
m=0;
if(h==23)
{
h=0;
}
else
{h++;}
}
else
{m++;}
}
else
{s++;}
}
sleep(1);
clrscr();
printf("%d : %d : %d",h,m,s);
}

Je comprend pas pourquoi lors de la compilation et de l’exécution du programme il ne se passe rien. J’ai pu lire sur quelques divers forums que des problèmes peuvent venir des compilateur ou autre.
Et j’ai par ailleurs une autre pitite question, le " sleep(1); " et le " clrscr(); " fonctionnent en C ? ou ils ne marchent qu’en C++ ? Si ils ne marchent qu’en C++ comment faire
pour imposer a l’ordinateur d’incrémenter les secondes correctement ? ( sinon il va me le faire a la vitesse de la lumière )

merci si vous vous prenez le temps de m’aider

P.S. : je ne suis pas sur que ma boucle while soit 100% juste
Edité le 11/12/2007 à 23:15

La cause de ton problme est l’indentation.
Indente ton code !

clrscr est une fonction turbo C de borland. utilise ncurses, c’est mieux.

le code :


#include <stdio.h>

main()
{
        int arret=0;
        int h=0;
        int m=0;
        int s=0;
        while(arret<1) /** arret est a affecter au moment ou tu veux **/
        {
                if(s==59)
                {
                        s=0;
                        if(m==59)
                        {
                                m=0;
                                if(h==23)
                                {
                                         h=0;    
                                }else   {
                                                h++;
                                        }
                        }else   {
                                        m++;
                                }
                }else   {
                                s++;
                        }
        printf("chrono %d : %d : %d\n",h,m,s);
        sleep(1);
        system("clear"); /** C'est moche. oriente toi vers du ncurses **/
        }
}


avec l'indentation : [pastebin.ca...](http://pastebin.ca/raw/812633)

benj: on ne peut pas l’accuser de mal indenter. Le forum ne reprend pas l’indentation même dans une balise code (cf. ton exemple).

Sinon je ne sais pas ce que c’est comme type de projet, mais si c’est du système, je pense que tu fais mal ton horloge. Tu devrais par exemple utiliser les signaux (y en a un je crois pour l’horloge) qui te permettront (si je me plante pas) de faire la même chose, de manière moins lourde (appel d’un handler qui fait plus ou moins le boulot de boucle à ta place, elle est pas belle la vie?)
Edité le 12/12/2007 à 00:30

Si tu ne met pas de ‘\n’ à la fin de ton printf, il va falloir que tu fflush, sinon ton output sera bufferisé.
Sinon pour éviter les if else tu peux utiliser modulo :


#include <stdio.h>

int main()
{
  int s,m,h;

  s = m = h = 0;

  while(42)
  {
    s = (s + 1) % 60;
    if (s == 0)
    {
      m = (m + 1) % 60;
      if (m == 0)
        h = (h + 1) % 24;
    }
    printf("%d : %d : %d\n",h,m,s);
    sleep(1);
  }
  return 0;
}

J’ai réussi a le faire, j’ai un petit peu patogé mais bon ca a marché.
Merci a vous ! :jap:

Zulnov j’ai testé ton programme il marche a merveille il est plus court que le mien mais honnêtement je t’avoue n’y avoir rien compris oO. Donc je ne l’ais pas repris mais merci baucoups pour ton aide.

Sinon bonne :paf: programmation :paf: a tous.
Edité le 12/12/2007 à 19:14

C’est le modulo que t’as pas compris ?

s = (s + 1) % 60;

ca te donne le reste de la division entière de (s+1) / 60.

Par exemple, si s = 2
la division ENTIERE (s+2)/60 = 3/60 = 0
il te reste 3, donc ca va donnée la valeur 3 à s.
Tout va être aussi simple tant que tu es en dessous de 60.
Au dela : prenons 65
66/60 = 1
il te reste 66 - 1*60 = 6
et ainsi de suite …
Pas trop compliqué, non ?

Modulo = le reste de la division.

x % n = le reste de la division entiere de x par n; Par exemple

10 % 60 ? Combien de fois peux tu rentrer 60 dans 10 ? = 0 donc ce qu’il reste c’est : 10 - (0 * 60) = 10;
80 % 60 ? Combien de fois peux tu rentrer 60 dans 80 ? = 1 donc ce qu’il reste c’est : 80 - (1 * 60) = 20;
120 % 60 ? Combien de fois peux tu rentrer 60 dans 120 ? = 2 donc ce qu’il reste cest : 120 - (2 * 60) = 0;

Voilà. Couplé à la réponse de manu2, j’éspère que c’est un peu plus clair maintenant.
Edité le 12/12/2007 à 23:02