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 paivays = record vuosi, kk, pv : integer; end; hlo = record nimi : string[30]; syntymaaika : paivays; (* aloitusaika : paivays; *) (* tämä on vielä käyttämättä *) end; type hlotaulu = array[1..max] of hlo; (* -- päiväysten käsittelyn aliohjelmia, irroitetaan omaksi moduulikseen myöhemmin -- *) (* päiväyserotin tulostettaessa *) const pverotin = '.'; (* Lueluku ei ole varsinainen päiväysaliohjelma, mutta sitä tarvitaan *) function Lueluku(kentta : string; alku, loppu : integer) : integer; forward; (* 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() *) (* tulostaa päiväyksen, esimerkin vuoksi ei käytetty with-lausetta vaikka olisi voinut *) procedure TulostaPaivaysLyhyt(p : paivays); begin write(p.pv, '.', p.kk, '.', p.vuosi); end; (* TulostaPaivaysLyhyt() *) (* tulostaa päiväyksen, esimerkin vuoksi ei käytetty with-lausetta vaikka olisi voinut *) procedure TulostaPaivaysPitka(p : paivays); begin write(p.pv, '. '); case p.kk of 1 : write('tammi'); 2 : write('helmi'); 3 : write('maalis'); 4 : write('huhti'); 5 : write('touko'); 6 : write('kesä'); 7 : write('heinä'); 8 : write('elo'); 9 : write('syys'); 10 : write('loka'); 11 : write('marras'); 12 : write('joulu') end; (* case *) write('kuuta ', p.vuosi); end; (* TulostaPaivaysPitka() *) (* lukee yhden päiväyksen käyttäjältä, käytetään with-lausetta *) procedure Luepaivays(var p : paivays); begin with p do begin vuosi := Lueluku('vuosi', alku, nyt); kk := Lueluku('kuukausi', 1, 12); pv := Lueluku('päivä', 1, Paivaluku(vuosi, kk)); end; (* with *) end; (* Luepaivays() *) (* palauttaa toden, jos päiväys a varhaisempi kuin b *) function Aiempi(var a, b : paivays) : boolean; begin if a.vuosi < b.vuosi then Aiempi := true else if (a.vuosi = b.vuosi) and (a.kk < b.kk) then Aiempi := true else if (a.vuosi = b.vuosi) and (a.kk = b.kk) and (a.pv < b.pv) then Aiempi := true else Aiempi := false; end; (* Aiempi() *) (* -- päiväysaliohjelmien loppu -- *) (* -- hekilötietojen käsittelyaliohjelmia -- *) (* 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 (* lue nimi käyttäjältä *) write('Anna nimi, tai "loppu" lopettaaksesi : '); readln(nimi); (* luetaan syntymäpäivä, jollei lopetettu *) if nimi = 'loppu' then Luehlo := false else begin writeln('Anna syntymäpäivä'); Luepaivays(syntymaaika); end; end; (* with *) end; (* Luehlo() *) (* 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 nuorimmasa vanhimpaan *) 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 Aiempi(H[j].syntymaaika, H[j+1].syntymaaika) then Vaihdahlo(H[j], H[j+1]); end; (* Ikajarjestykseen() *) (* 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() *) (* 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; writeln; end; (* while *) (* järjestä iän mukaan nuorin ensimmäiseksi *) Ikajarjestykseen(H, lkm); (* tulosta tiedot *) writeln('Nuorimmasta vanhimpaan:'); for i := 1 to lkm do begin write(H[i].nimi, ' ('); TulostaPaivaysPitka(H[i].syntymaaika); writeln(')'); end; end.