1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130
| with ada.text_io;
with ada.integer_text_io;
procedure exodate is
subtype Tjour is positive range 1..31;
type Tmoi is (jan,
fev,
mar,
avr,
mai,
jui,
jul,
aou,
sep,
oct,
nov,
dec);
subtype Tannee is integer;
type Tdate is record
jour: Tjour;
moi: Tmoi;
annee: Tannee;
end record;
package p_moi is new ada.text_io.enumeration_io(Tmoi);
FUNCTION bisextille(
annee: Tannee)
RETURN boolean IS --année bisextille si div par 4 et pas par 100 OU div par 400
BEGIN
RETURN (annee rem 4 = 0 and annee rem 4 /= 0) OR (annee rem 400 = 0);
END bisextille;
FUNCTION maxjour(
moi: Tmoi;
annee: Tannee)
RETURN Tjour is
BEGIN
CASE moi IS
WHEN jan|mar|mai|jul|aou|oct|dec => RETURN 31;
WHEN avr|jui|sep|nov => RETURN 30;
WHEN fev =>
IF bisextille(annee) THEN RETURN 29;
ELSE RETURN 28;
END IF;
END CASE;
END maxjour;
-- PROCEDURE ENCORE NON UTILISEE
FUNCTION validdate( -
date: Tdate)
RETURN boolean IS
BEGIN
-- la seule vérification à fair concerne le nombre de jour
-- le sous-type moi limite sa valeur de 1 à 12 et j'estime
-- qu'on peut prendre n'importe quel entier pour une année.
IF date.jour > maxjour(date.moi,date.annee) THEN RETURN FALSE;
ELSE RETURN TRUE; END IF;
END validdate;
-----------------------------
PROCEDURE lendemain(
auj: in Tdate;
demain: out Tdate) IS
BEGIN
IF auj.jour = maxjour(auj.moi,auj.annee) THEN
demain.jour := 1;
IF auj.moi = dec THEN
demain.moi:=jan;
demain.annee:= auj.annee + 1;
ELSE
demain.moi := Tmoi'Succ(auj.moi);
END IF;
ELSE
demain.jour := auj.jour + 1;
END IF;
END lendemain;
PROCEDURE veille(
auj: in TDate;
hier: out Tdate) IS
BEGIN
IF auj.jour = 1 THEN
IF auj.moi = jan THEN
hier.moi:=dec;
hier.annee:= auj.annee - 1;
hier.jour := 31;
ELSE
hier.moi := Tmoi'Pred(auj.moi);
hier.jour := maxjour(Tmoi'Pred(auj.moi),auj.annee);
-- demain étant en out, je ne peux l'utiliser pour l'appel de ma fonction
END IF;
ELSE
hier.jour := auj.jour - 1;
END IF;
END veille;
PROCEDURE affich(
date: in Tdate) IS
BEGIN
ada.integer_text_io.put(date.jour,2);
ada.text_io.new_line;
p_moi.put(date.moi);
ada.text_io.new_line;
ada.integer_text_io.put(date.annee,4);
ada.text_io.new_line;
END affich;
PROCEDURE lire(
date: out Tdate) IS
BEGIN
ada.integer_text_io.get(date.jour);
p_moi.get(date.moi);
ada.integer_text_io.get(date.annee);
END lire;
--/\ VALEURS DE TEST /\
--------------------------
test1, Test2: Tdate;
--------------------------
BEGIN
lire(test1);
lendemain(test1, test2);
affich(test2);
veille(test1, test2);
affich(test2);
END exodate; |
Partager