IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
logo
Sommaire > Intervalles et enregistrements > Heures
        Heures





Heures
auteur : Edouard Thiel
Créer des types intervalles heure_t, minute_t et seconde_t, puis un type enregistrement temps_t.

Solution :

TYPE
  heure_t = 0..23;
  minute_t = 0..59;
  seconde_t = 0..59;
  temps_t = Record
              h : heure_t;
              m : minute_t;
              s : seconde_t;
            end;
Soit t1 et t2 deux temps_t.
Faire un programme qui lit t1 et t2 et qui dit si ils sont égaux.


Solution :

PROGRAM tp_egaux;
TYPE
  heure_t = 0..23;
  minute_t = 0..59;
  seconde_t = 0..59;
  temps_t = Record
              h : heure_t;
              m : minute_t;
              s : seconde_t;
            end;
VAR
  t1, t2 : temps_t;
  egal : boolean;
BEGIN
  Write ('Temps1 (h m s) : ');
  ReadLn (t1.h, t1.m, t1.s);
  Write ('Temps2 (h m s) : ');
  ReadLn (t2.h, t2.m, t2.s);
  { Teste si les temps sont egaux }
  egal := (t1.h = t2.h) and (t1.m = t2.m) and (t1.s = t2.s);
  WriteLn ('Egalite : ', egal);
END.
Modifier le programme pour qu'il dise si t1 < t2 :
a) Avec une expression booléenne;
b) Avec des if then else.


Solution a :

VAR
  inf : boolean.
  
inf := (t1.h < t2.h) or (t1.h = t2.h) and (t1.m < t2.m) or 
       (t1.h = t2.h) and (t1.m = t2.m) and (t1.s < t2.s);
       
{ On peut encore réduire l'expression : }
inf := (t1.h < t2.h) or (t1.h = t2.h) and 
       ( (t1.m < t2.m) or (t1.m = t2.m) and (t1.s < t2.s) );       
Solution b :

VAR
  inf : boolean.
  
inf := false;
if (t1.h < t2.h)
then inf := true
else if (t1.h = t2.h)
     then if (t1.m < t2.m)
          then inf := true
          else if (t1.m = t2.m)
               then if (t1.s < t2.s)
                    then inf := true;
Soit t un temps_t.
Faire un programme qui lit t et qui affiche le nombre de secondes ns écoulées depuis 0 :0 :0.


Solution :

PROGRAM nb_sec;
TYPE
  heure_t = 0..23;
  minute_t = 0..59;
  seconde_t = 0..59;
  temps_t = Record
              h : heure_t;
              m : minute_t;
              s : seconde_t;
            end;
VAR
  t : temps_t;
  ns : integer;
BEGIN
  Write ('Temps (h m s) : ');
  ReadLn (t.h, t.m, t.s);
  { Calcule le nb de sec depuis 0:0:0 }
  ns := t.h * 3600 + t.m * 60 + t.s;
  WriteLn ('ns : ', ns);
END.
Le nombre de seconde écoulées est ns := t.h * 3600 + t.m * 60 + t.s.;
On s'aperçoit que 23 :59 :59 compte 86399 secondes, on peut donc bien déclarer ns comme entier, car maxint = 2 milliards sous Delphi.
Sous Turbo Pascal, vu que maxint = 32767, on aurait dû déclarer ns comme un réel, puis faire WriteLn ('ns : ', ns:5:0); (5 chiffres en tout, dont 0 après la virgule).

Faire un programme qui lit t1 et t2 et qui dit si t1 est < ou = ou > à t2, en passant par la conversion en secondes.

Solution :

PROGRAM tp_comp;
TYPE
  heure_t = 0..23;
  minute_t = 0..59;
  seconde_t = 0..59;
  temps_t = Record
              h : heure_t;
              m : minute_t;
              s : seconde_t;
            end;
VAR
  t1, t2 : temps_t;
  ns1, ns2 : integer;
BEGIN
  { Lecture t1 et t2 ... }
  { Calcule les nb de sec depuis 0:0:0 }
  ns1 := t1.h * 3600 + t1.m * 60 + t1.s;
  ns2 := t2.h * 3600 + t2.m * 60 + t2.s;
  if (ns1 < ns2)
  then WriteLn ('t1 < t2')
  else if (ns1 > ns2)
       then WriteLn ('t1 > t2')
       else WriteLn ('t1 = t2');
END.
Calculer la différence absolue en nombre de secondes entre t1 et t2, puis en heures/minutes/secondes.

Soit diff un entier; la différence est diff := abs(ns1 - ns2);
Idée : faire la conversion de diff en heures/minutes/secondes.
On place le résultat dans t3 : temps_t.

Solution :

diff := abs(ns1 - ns2);
t3.h := diff div 3600;
diff := diff mod 3600;
t3.m := diff div 60;
diff := diff mod 60;
t3.s := diff;
Attention : on ne peut employer div et mod que sur des entiers ! Dans le cas de Turbo Pascal, où maxint = 32767, on aurait dû prendre diff réel, et il aurait fallu écrire :

diff := abs(ns1 - ns2);
t3.h := trunc (diff / 3600); { div 3600 }
diff := diff - t3.h * 3600; { mod 3600 }
t3.m := trunc (diff / 60); { div 60 }
diff := diff - t3.m * 60; { mod 60 }
t3.s := diff;
Autre méthode : chercher d'abord les secondes puis les minutes puis les heures.


Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2010 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site ni de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.