Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

COMPTE À REBOUR EN C++


Information sur la source

Description

Voici un compte à rebour très simple mais avec quelques inconvénients dûs au système d'attente d'une seconde que j'ai trouvé sur cppfrance : c'est le seul truc que j'ai trouvé qui fonctionnait. (wait, sleep, delay ... ne fonctionnaient pas, pourtant les .h y étaient.)
Si vous avez une solution, svp donnez-la moi car le système employé empêche de faire autre chose sans faire bugué le programme.
Je programme avec Borland C++ Version 4.02.
 

Source

  • #include <iostream.h> //y'en a un tas mais c'est pas grave
  • #include <time.h>
  • #include <conio.h>
  • #include <stdlib.h>
  • #include <windows.h>
  • #include <stdio.h>
  • #include <ctype.h>
  • #include <dos.h>
  • #include <string.h>
  • void wait(int microsecondes){ // Cette partie ne vient pas de moi
  • time_t tmp=clock(); // Elle remplace sleep(x) ou delay(x) ou wait(x) qui ne
  • while ((((clock()-tmp)*1000)/CLOCKS_PER_SEC)<microsecondes); // fonctionnent pas sur mon compilateur
  • }
  • main(){
  • int h1, h2, m1, m2, s1, s2;
  • cout<<" -- Compte à rebour --"<<endl<<"Apuyez sur une touche"<<endl;
  • getch();
  • clrscr();
  • debut:
  • do {cout<<" Rentrez le chiffre des dizaines d'heure"<<endl<<" Hh:mm:ss"<<endl;
  • cin>>h1;
  • clrscr();
  • }
  • while (h1>=10 || h1<0);
  • do {
  • cout<<" Rentrez le chiffre des unités d'heure"<<endl<<" "<<h1<<"H:mm:ss"<<endl;
  • cin>>h2;
  • clrscr();
  • }
  • while (h2>=10 || h2<0);
  • do {
  • cout<<" Rentrez le chiffre des dizaines de minutes"<<endl<<" "<<h1<<h2<<":Mm:ss"<<endl;
  • cin>>m1;
  • clrscr();
  • }
  • while (m1>=6 || m1<0);
  • do {
  • cout<<" Rentrez le chiffre des unités de minutes"<<endl<<" "<<h1<<h2<<":"<<m1<<"M:ss"<<endl;
  • cin>>m2;
  • clrscr();
  • }
  • while (m2>=10 || m2<0);
  • do {
  • cout<<" Rentrez le chiffre des dizaines de secondes"<<endl<<" "<<h1<<h2<<":"<<m1<<m2<<":Ss"<<endl;
  • cin>>s1;
  • clrscr();
  • }
  • while (s1>=6 || s1<0);
  • do {
  • cout<<" Rentrez le chiffre des unités de secondes"<<endl<<" "<<h1<<h2<<":"<<m1<<m2<<":"<<s1<<"S"<<endl;
  • cin>>s2;
  • clrscr();
  • }
  • while (s2>=10 || s2<0);
  • cout<<" ----- "<<h1<<h2<<":"<<m1<<m2<<":"<<s1<<s2<<" -----"<<endl;
  • cout<<"Apuyez sur une touche pour lancer le compte à rebour."<<endl;
  • getch();
  • while (h1 != 0 || h2 != 0 || m1 != 0 || m2 != 0 || s1 != 0 || s2 != 0)
  • {
  • wait(1000);
  • if (s2 == 0)
  • {
  • if (s1 == 0)
  • {
  • if (m2 == 0)
  • {
  • if (m1==0)
  • {
  • if (h2==0) h1--, h2 = 9, m1 = 5, m2 = 9, s1 = 5, s2 = 9, h2 = 9;
  • else h2--, m1 = 5, m2 = 9, s1 = 5, s2 = 9;
  • m1 = 5;
  • }
  • else m1--, m2 = 9, s1 = 5, s2 = 9;
  • m2 = 9;
  • }
  • else m2--, s1 = 5, s2 = 9;
  • s1 = 5;
  • }
  • else s1--, s2 = 9;
  • s2 = 9;
  • }
  • else s2--;
  • clrscr();
  • cout<<" ----- "<<h1<<h2<<":"<<m1<<m2<<":"<<s1<<s2<<" -----"<<endl;
  • }
  • clrscr();
  • cout<<" ----- "<<h1<<h2<<":"<<m1<<m2<<":"<<s1<<s2<<" -----"<<endl;
  • wait(1000);
  • clrscr();
  • cout<<"Le compte à rebour a prit fin. Rentrez 1 pour en refaire un autre."<<endl;
  • int entree;
  • cin>>entree;
  • if (entree ==1 ) goto debut;
  • else return 0;
  • }
#include <iostream.h> //y'en a un tas mais c'est pas grave
#include <time.h>
#include <conio.h>
#include <stdlib.h>
#include <windows.h>
#include <stdio.h>
#include <ctype.h>
#include <dos.h>
#include <string.h> 

void wait(int microsecondes){                                                                              // Cette partie ne vient pas de moi
	 time_t  tmp=clock();                                                                            // Elle remplace sleep(x) ou delay(x) ou wait(x) qui ne
	 while ((((clock()-tmp)*1000)/CLOCKS_PER_SEC)<microsecondes);    // fonctionnent pas sur mon compilateur
}



main(){

	int h1, h2, m1, m2, s1, s2;

	cout<<"                             -- Compte à rebour --"<<endl<<"Apuyez sur une touche"<<endl;
	getch();
	clrscr();

	debut:
	do {cout<<" Rentrez le chiffre des dizaines d'heure"<<endl<<"      Hh:mm:ss"<<endl;
		cin>>h1;
		clrscr();
		}
	while (h1>=10 || h1<0);

	do {
		cout<<" Rentrez le chiffre des unités d'heure"<<endl<<"      "<<h1<<"H:mm:ss"<<endl;
		cin>>h2;
		clrscr();
		}
	while (h2>=10 || h2<0);

	do {
		cout<<" Rentrez le chiffre des dizaines de minutes"<<endl<<"      "<<h1<<h2<<":Mm:ss"<<endl;
		cin>>m1;
		clrscr();
		}
	while (m1>=6 || m1<0);

	do {
		cout<<" Rentrez le chiffre des unités de minutes"<<endl<<"      "<<h1<<h2<<":"<<m1<<"M:ss"<<endl;
		cin>>m2;
		clrscr();
		}
	while (m2>=10 || m2<0);

	do {
		cout<<" Rentrez le chiffre des dizaines de secondes"<<endl<<"      "<<h1<<h2<<":"<<m1<<m2<<":Ss"<<endl;
		cin>>s1;
		clrscr();
		}
	while (s1>=6 || s1<0);

	do {
		cout<<" Rentrez le chiffre des unités de secondes"<<endl<<"      "<<h1<<h2<<":"<<m1<<m2<<":"<<s1<<"S"<<endl;
		cin>>s2;
		clrscr();
		}
	while (s2>=10 || s2<0);

	cout<<" ----- "<<h1<<h2<<":"<<m1<<m2<<":"<<s1<<s2<<" -----"<<endl;
	cout<<"Apuyez sur une touche pour lancer le compte à rebour."<<endl;
	getch();

	while (h1 != 0 || h2 != 0 || m1 != 0 || m2 != 0 || s1 != 0 || s2 != 0)
		{
		wait(1000);
		if (s2 == 0)
			{
			if (s1 == 0)
				{
				if (m2 == 0)
					{
					if (m1==0)
						{
						if (h2==0) h1--, h2 = 9, m1 = 5, m2 = 9, s1 = 5, s2 = 9, h2 = 9;
						else h2--, m1 = 5, m2 = 9, s1 = 5, s2 = 9;
						m1 = 5;
						}
					else m1--, m2 = 9, s1 = 5, s2 = 9;
					m2 = 9;
					}
				else m2--, s1 = 5, s2 = 9;
				s1 = 5;
				}
			else s1--, s2 = 9;
			s2 = 9;
			}
		else s2--;
		clrscr();
		cout<<" ----- "<<h1<<h2<<":"<<m1<<m2<<":"<<s1<<s2<<" -----"<<endl;
		}
	clrscr();
	cout<<" ----- "<<h1<<h2<<":"<<m1<<m2<<":"<<s1<<s2<<" -----"<<endl;
	wait(1000);
	clrscr();
	cout<<"Le compte à rebour a prit fin. Rentrez 1 pour en refaire un autre."<<endl;
	int entree;
	cin>>entree;
	if (entree ==1 ) goto debut;
	else return 0;
	}

Conclusion

ha heu... aussi, j'ai du mal avec la reconnaissance des touches sur lesquelles ont appuie. J'ai pas compris comment faire et ça serai plus simple pour le choix de l'heure. Help me... Et aussi je tient à dire que je reconnais l'expression du code souvent maladroite... Pas la peine de me le rappeler donc.
 

Commentaires et avis

signaler à un administrateur
Commentaire de Chouchou182 le 25/07/2004 23:51: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 : <iostream> 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 :

[Code]
/* 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 ;
}

[/Code]

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

signaler à un administrateur
Commentaire de Arnotic le 26/07/2004 09:14:46 administrateur CS

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.

signaler à un administrateur
Commentaire de neo_00110010101 le 26/07/2004 10:30:51

d'accord avec toi Chouchou 182, mais laissez les goto tranquilles ^^

signaler à un administrateur
Commentaire de djl le 26/07/2004 19:27:04

c'est du c avec des cout, pas du c++

signaler à un administrateur
Commentaire de BlackGoddess le 28/07/2004 18:52:11

d'accord avec djl

endl = '\n'+flush,
ce n'est pas recommandé de forcer le vidage du tampon à chaque fin de ligne.

signaler à un administrateur
Commentaire de djl le 28/07/2004 21:36:27

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)

signaler à un administrateur
Commentaire de viran le 26/08/2004 17:36:00

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^^)

signaler à un administrateur
Commentaire de mage_des_enfers le 26/08/2004 17:57:17

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 !

Ajouter un commentaire



Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,281 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.