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);
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);
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);
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
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 );
diff := diff - t3.h * 3600 ;
t3.m := trunc (diff / 60 );
diff := diff - t3.m * 60 ;
t3.s := diff;
|
Autre méthode : chercher d'abord les secondes puis les minutes puis les heures.
|