COMPTE À REBOUR EN C++

cs_Chouchou182 Messages postés 252 Date d'inscription vendredi 13 juin 2003 Statut Membre Dernière intervention 25 avril 2011 - 25 juil. 2004 à 23:51
mage_des_enfers Messages postés 24 Date d'inscription vendredi 18 juin 2004 Statut Membre Dernière intervention 25 octobre 2004 - 26 août 2004 à 17:57
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/24874-compte-a-rebour-en-c

mage_des_enfers Messages postés 24 Date d'inscription vendredi 18 juin 2004 Statut Membre Dernière intervention 25 octobre 2004
26 août 2004 à 17:57
lol j'ai pas le temps de retravailler sur ma source donc désolé si elle ne change pas. Si un jour je trouve le temps de le faire je le ferai mais là ça fait un bout de temps que je n'ai pas programmer ni lu mon livre qui me sert d'apprentissage. Merci pour vos commentaires !
cs_viran Messages postés 104 Date d'inscription jeudi 6 mai 2004 Statut Membre Dernière intervention 31 décembre 2006
26 août 2004 à 17:36
Ta version avait un probleme et ne pouvait pas se compiler(au niveau de main je crois)mais la version de chouchou182 fonctionne tres bien,sinon c'est pas mal je debute et j'ai beaucoup de mal a definir els parametres de compilation(mais bon vous vous en foutez^^)
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
28 juil. 2004 à 21:36
ca fusille les performance et c'est antillogique : a quoi ca sert les e/s bufferisée si on vide systematiquement le tampon?? (a part pour le debug)
BlackGoddess Messages postés 338 Date d'inscription jeudi 22 août 2002 Statut Membre Dernière intervention 14 juin 2005
28 juil. 2004 à 18:52
d'accord avec djl

endl = '\n'+flush,
ce n'est pas recommandé de forcer le vidage du tampon à chaque fin de ligne.
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
26 juil. 2004 à 19:27
c'est du c avec des cout, pas du c++
neo_00110010101 Messages postés 360 Date d'inscription samedi 27 septembre 2003 Statut Membre Dernière intervention 30 mai 2006
26 juil. 2004 à 10:30
d'accord avec toi Chouchou 182, mais laissez les goto tranquilles ^^
cs_Arnotic Messages postés 933 Date d'inscription dimanche 1 avril 2001 Statut Membre Dernière intervention 9 janvier 2012
26 juil. 2004 à 09:14
Bonjour,

Sleep() est une API donc marche à tout les coups (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/sleep.asp)

Concernant du code lisible trop de commentaire tue le code ! Il ne faut pas commenter les instructions (il faut simplement apprendre le C) mais commenter juste 2 ou 3 trucs c'est tout.
cs_Chouchou182 Messages postés 252 Date d'inscription vendredi 13 juin 2003 Statut Membre Dernière intervention 25 avril 2011 1
25 juil. 2004 à 23:51
Bonjour.

Tu es sûrement débutant ; il ne faut pas se décourager mais tu as encore quelques progrès à faire.

Tout d'abord ton compte à rebours n'a rien de "très simple". Il est totalement illisible.

Il y a trop d'includes : et <ctime> auraient suffi.
L'ordinateur sait faire des calculs sur des nombres plus grand que 10, il n'est donc pas nécessaire de traiter chiffre par chiffre.
cout c'est du C++, getch() c'est pas standard. Alterner n'est pas l'idéal d'un point de vue logique du programme.
L'utilisation de goto ainsi que celle de l'opérateur virgule sont plutôt à bannir. Dans certains cas ils peuvent être utiles mais pas dans ton programme.

La méthode aussi a des lacunes, tu attends 1000 millisecondes mais tu ne mesures pas le temps nécessaire à l'affichage et aux calculs. Donc tes secondes sont un peu trop longues.

Nous allons donc refaire un compte à rebours en C ansi lisible :

/* rebours.c */

/* Includes */
#include <stdio.h> /* Pour les entrées / sorties */
#include <time.h>  /* Pour mesurer le temps qui passe */

/* main */
int main(int argc, char** argv)
{
    /* Variables */
    /* Durées entrées par l'utilisateur */
    time_t heures 0, minutes 0, secondes = 0 ;
    /* Temps à patienter en secondes, déduit de la saisie de l'utilisateur */
    time_t temps = 0 ;
    /* Heure du début du compte à rebours */
    time_t debut = 0 ;
    /* Temps écoulé et temps écoulé précédant */
    time_t temps_ecoule 0, precedant 0 ;

    /* On affiche un petit message de bienvenue */
    puts("-- Compte \205 rebours --\n") ;

/*
 * On commence par demander à l'utilisateur
 * la durée du compte à rebours
 */
    /* On lit le nombre d'heures... */
    puts("Entrez le nombre d\'heures \205 attendre : ") ;
    scanf("%d", &heures) ;
    /* ...puis le nombre de minutes... */
    puts("Entrez le nombre de minutes \205 attendre : ") ;
    scanf("%d", &minutes) ;
    /* ...et enfin le nombre de secondes */
    puts("Entrez le nombre de secondes \205 attendre : ") ;
    scanf("%d", &secondes) ;

/*
 * On convertit la saisie de l'utilisateur en un nombre de secondes
 */
    temps = secondes + minutes * 60 + heures * 3600 ;

/*
 * Maintenant on boucle tant que le temps n'est pas écoulé.
 * C'est une boucle infinie qui utilise toute la puissance de calcul
 * du CPU.
 */
    /* On récupère l'heure de début du compte à rebours */
    time(&debut) ;
    while ( temps > (temps_ecoule = time(0) - debut) )
    {
        /* Seulement lorsque le temps écoulé change : */
        if ( precedant == temps_ecoule )
            continue ;

        /* On convertit le temps restant au format h-m-s */
        secondes = (temps-temps_ecoule) % 60 ;
        minutes  = ( ((temps-temps_ecoule) - secondes) / 60 ) % 60 ;
        heures   = (((temps-temps_ecoule) - secondes) / 60 - minutes) / 60 ;
        /* On affiche le temps restant */
        printf("\r%02ih%02im%02is soit %06is", heures, minutes, secondes, (temps-temps_ecoule)) ;

        /* On sauve le temps écoulé */
        precedant = temps_ecoule ;
    }

/*
 * Un petit message d'adieu pour que le programme
 * ne se ferme pas avant que l'utilisateur ne l'ai vu
 * en entier
 */
    puts("\nC\'est fini !!\nEntrez une valeur pour terminer\n") ;
    getchar() ;

    return 0 ;
}



Cette méthode n'est toujours pas idéale. En effet elle consomme toutes les resources disponibles et n'est fiable qu'à la seconde près.

J'espère que ce code te servira.

Et si tu as des questions, surtout, n'hésite pas.

A++

Chouchou
Rejoignez-nous