begin process at 2010 02 10 01:28:45
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Date / Heure

 > COMPTE À REBOUR EN C++

COMPTE À REBOUR EN C++


 Information sur la source

Note :
7,5 / 10 - par 2 personnes
7,50 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Date / Heure Niveau :Débutant Date de création :25/07/2004 Vu :11 015

Auteur : mage_des_enfers

Ecrire un message privé
Site perso
Commentaire sur cette source (8)
Ajouter un commentaire et/ou une note

 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.


 Sources du même auteur

SIMPLE PROG POUR SAVOIR SI UNE ANNÉE EST OU NON BISEXTILE

 Sources de la même categorie

Source avec Zip CLASSE MOMENT V2.0 par le_duche
CALCUL DATE DE PAQUES (DATE MOBILE) par steph12358
Source avec une capture VACCATION (AVEC FONCTION) CONSOLERIE, REMIX GCC par sebman
Source avec Zip Source avec une capture AFFICHER ET DIRE L'HEURE (REPONSE FORUM) par ndubien
Source avec Zip Source avec une capture ARRÊT AUTOMATIQUE DE WINDOWS. par patarotalexandre

Commentaires et avis

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

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.

Commentaire de neo_00110010101 le 26/07/2004 10:30:51

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

Commentaire de djl le 26/07/2004 19:27:04

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

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.

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)

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

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...

Comparez les prix

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,515 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales