(* Une solution du TP2                   octobre 2000 *)
(***************************************)
(* Exercice 1
     Ce programme calcule la moyenne de x et y
     sans utiliser une variable intermédiaire.          *)
(***************************************)
PROGRAM TP2exc2 ;
USES crt ;
VAR x, y : real ;
BEGIN
clrscr ;
write('x= ') ; readln(x) ;
write('y= ') ; readln(y) ;
(* la ligne suivante a été rajoutée *)
writeln('avant traitement :') ; writeln('x= ', x:8:2, ' y= ', y:8:2) ;
x:=x+y ; y:=x-y ; x:=x-y ;
(* la ligne suivante a été modifiée *)
writeln('après traitement :') ; writeln('x= ', x:8:2, 'y= ', y:8:2) ;
readln ;
END.
(********************************)
PROGRAM TP2exc3 ;
BEGIN
Writeln('P':8, 'Q':8, 'P et Q':8, 'P ou Q':8, P => Q':8, 'P <=> Q':8) ;
P:=true ; Q:=true ;
writeln(P:8, Q:8, (P and Q):8, (P or Q):8, (Q or not P):8, ((Q or not P) and (P or not Q)):8) ;
Q:=false ;
writeln(P:8, Q:8, (P and Q):8, (P or Q):8, (Q or not P):8, ((Q or not P) and (P or not Q)):8) ;
P:=false ;
writeln(P:8, Q:8, (P and Q):8, (P or Q):8, (Q or not P):8, ((Q or not P) and (P or not Q)):8) ;
Q:=true ;
writeln(P:8, Q:8, (P and Q):8, (P or Q):8, (Q or not P):8, ((Q or not P) and (P or not Q)):8) ;
END.
(********************************)
(* Exercice 4
       Remarquons tout d'abord que s est déclarée comme une chaîne de 10 caractères.
     L'affectation s:='ça marche pas' tronquera la chaîne de 14 caractères en ne conservant
     que les 10 premiers caractères. Par conséquent, quel que soit le résultat du test (n=m),
     la variable s contiendra toujours 'ça marche' après l'affectation.
        La déclaration modifiée   s : string[14];   permet de voir la différence entre TRUNC et
     ROUND :
     TRUNC(x)  supprime la partie fractionnaire du nombre réel  x, alors que
     ROUND(x)  réalise l'arrondi classique (entier au dessus à partir de *.5, au dessous sinon). *)
(********************************)
PROGRAM TP2exc5 ;
Var T, H, M, S : integer ;
BEGIN
repeat
    write('temps en secondes (valeurs entières) ? ') ; readln(T) ;
    until (T>=0) ;
S:=T mod 60 ;
M:=(T div 60) mod 60 ;
H:=(T div 3600) ;
writeln('temps : ', H, 'heures ', M, 'minutes ', S, 'secondes.') ;
END.
(********************************)
PROGRAM TP2exc6 ;
VAR HeureDepart, MinuteDepart, SecondeDepart : integer ;
           HeureTrajet, MinuteTrajet, SecondeTrajet : integer ;
           HeureArrivee, MinuteArrivee, SecondeArrivee : integer ;
           JourArrivee : integer ;
BEGIN
(* saisie heure de départ *)
writeln('Depart :') ;
write('heure ? ') ; readln(HeureDepart) ;
write('minutes ? ') ; readln(MinuteDepart) ;
write('secondes ? ') ; readln(SecondeDepart) ;
(* saisie durée du trajet *)
writeln('Durée du trajet :') ;
write('heure ? ') ; readln(HeureTrajet) ;
write('minutes ? ') ; readln(MinuteTrajet) ;
write('secondes ? ') ; readln(SecondeTrajet) ;
(* calcul de l'heure d'arrivée *)
SecondeArrivee:=SecondeDepart+SecondeTrajet ;
MinuteArrivee:=MinuteDepart+MinuteTrajet+(SecondeArrivee div 60) ;
SecondeArrivee:=(SecondeArrivee mod 60) ;
HeureArrivee:=HeureDepart+HeureTrajet+(MinuteArrivee div 60) ;
MinuteArrivee:=(MinuteArrivee mod 60) ;
JourArrivee:=HeureArrivee div 24 ;
HeureArrivee:=HeureArrivee mod 24 ;
(* affichage du résultat *)
writeln('Heure d''arrivée : ') ;
if (JourArrivee=0)
    then write('même jour : ')
    else write('jour + ',JourArrivee,' : ') ;
writeln(HeureArrivee,'h ', MinuteArrivee, 'mn ',SecondeArrivee, 's.') ;
END.
(********************************)