program rekisteri(input, output); (* luetaan käyttäjältä nimiä ja syntymäaikoja, lajitellaan syntymäajan mukaan, tulostetaan *) const max = 100; alku = 1850; nyt = 2001; type hlo = record nimi : string[30]; vuosi, kk, pv : integer; end; type hlotaulu = array[1..max] of hlo; (* lukee käyttäjältä kokonaisluvun alku..loppu, kehotteena kentta *) function Lueluku(kentta : string; alku, loppu : integer) : integer; var luku : integer; begin luku := 0; repeat write('Anna ', kentta, ' : '); readln(luku); if (luku < alku) or (luku > loppu) then writeln('Ei kelpaa ', kentta, 'ksi, pitää olla ', alku, '-', loppu); until (luku >= alku) and (luku <= loppu); Lueluku := luku; end; (* Lueluku() *) (* palauttaa kuukauden päivien määrän *) function Paivaluku(vuosi, kk : integer) : integer; begin case kk of 1, 3, 5, 7, 8, 10, 12 : Paivaluku := 31; 4, 6, 9, 11 : Paivaluku := 30; 2 : if (vuosi mod 4 = 0) and ( (vuosi mod 100 <> 0) or (vuosi mod 400 = 0) ) then Paivaluku := 29 else Paivaluku := 28; end; (* case *) end; (* Paivaluku() *) (* lukee yhden henkilön tiedot, palauttaa false, jos käyttäjä lopetti, eikä tietoja luettu, true muuten *) function Luehlo(var hen : hlo) : boolean; begin with hen do begin write('Anna nimi, tai "loppu" lopettaaksesi : '); readln(nimi); (* lue nimi käyttäjältä *) if nimi = 'loppu' then Luehlo := false else begin (* uusi henkilö *) vuosi := Lueluku('syntymävuosi', alku, nyt); kk := Lueluku('syntymäkuukausi', 1, 12); pv := Lueluku('syntymäpäivä', 1, Paivaluku(vuosi, kk)); Luehlo := true; end; end; (* with *) end; (* Luehlo() *) (* palauttaa toden, jos a nuorempi kuin b *) function Vanhempi(var a, b : hlo) : boolean; begin if a.vuosi < b.vuosi then Vanhempi := true else if (a.vuosi = b.vuosi) and (a.kk < b.kk) then Vanhempi := true else if (a.vuosi = b.vuosi) and (a.kk = b.kk) and (a.pv < b.pv) then Vanhempi := true else Vanhempi := false; end; (* Vanhempi() *) (* vaihtaa muuttujien a ja b henkilöt keskenään *) procedure Vaihdahlo(var a, b : hlo); var tmp : hlo; begin tmp := a; a := b; b := tmp; end; (* Vaihdahlo() *) (* lajittelee taulukon henkilö ikäjärjestykseen *) procedure Ikajarjestykseen(var H : hlotaulu; lkm : integer); var i, j : integer; begin for i := 1 to lkm do for j := 1 to lkm-1 do if Vanhempi(H[j], H[j+1]) then Vaihdahlo(H[j], H[j+1]); end; (* Ikajarjestykseen() *) (* pääohjelma *) var H : hlotaulu; uusihlo : hlo; lkm, luku, paivia, vuosi, kk, pv, i, j : integer; nimi : string[30]; ok : boolean; begin (* lue tiedot *) lkm := 0; ok := true; while ok and (lkm < max) do begin ok := Luehlo(uusihlo); if ok then begin lkm := lkm + 1; H[lkm] := uusihlo; end; end; (* while *) (* järjestä iän mukaan nuorin ensimmäiseksi *) Ikajarjestykseen(H, lkm); (* tulosta tiedot *) for i := 1 to lkm do writeln(H[i].nimi, ' ', H[i].pv, '.', H[i].pv, '.', H[i].vuosi); end.