(* opk01.h3_13-15.pohja.p SJ *) program lotto; const maxnro = 39; (* suurin numero *) peli = 7; (* arvottujen numeroiden määrä *) maxjarj = 11; (* suurin järjestelmä *) maxpeleja = 100; (* pelaajia mukana *) rivihinta = 3.60; (* yhden rivin hinta *) valtionosuus = 0.33; (* pelin järjestäjän marginaali *) alinvoittaja = 4; (* alin voittoluokka (jos niitä on) *) raha = 'mk'; (* tulostusyksikkö *) type rivi = set of 1..maxnro; (* yksi ruudukko *) rivitaulu = array[1..maxpeleja] of rivi; (* kaikki ruudukot *) maarataulu = array[0..peli] of integer; (* voittomäärät *) voittotaulu = array[0..peli] of real; (* voittosummat *) function yli(a, b : integer) : integer; forward; procedure TulostaRivi(r : rivi); forward; procedure ArvoLottoRivi(var r : rivi; numeroita : integer; var riveja : integer); forward; (* lukee lottorivin muuttujaparametriin r, kinuaa itsepintaisesti kunnes on rivin saanut, palauttaa myös tiedon siitä, montaako irtoriviä peli vastaa *) (* käyttää vakioita maxnro, peli ja maxjarj *) procedure LueLottoRivi(var r : rivi; var riveja : integer); begin (* tehtävä 13 *) end; (* LueLottoRivi() *) (* tarkastaa Lottorivin, palauttaa osumien määrän *) function LotossaOikein(oikeat, pelattu : rivi) : integer; begin (* tehtävä 14a *) end; (* LotossaOikein() *) (* laskee lottokierroksen tulokset kun oikea rivi on oikeat, pelattuja olivat pelatut (lkm kpl), tallettaa tulokset (kunkin voittoluokan määrät) taulukkoon tulokset *) procedure LaskeTulokset(oikeat : rivi; var pelatut : rivitaulu; lkm : integer; var tulokset : maarataulu); begin (* tehtävä 14b *) end; (* LaskeTulokset() *) (* laskee kunkin voittoluokan ja valtion voitto-osuudet taulukon tulokset perusteella ja tallettaa tulokset taulukkoon voitot ja muuttujaparametriin valtiolle *) procedure LaskeVoitot(summa : real; var tulokset : maarataulu; var voitot : voittotaulu; var valtiolle : real); begin (* tehtävä 15 *) end; (* LaskeVoitot() *) (* apualiohjelmia *) (* laskee luvun a yli b:n *) (* x numeron järjestelmä vastaa yli(x, 7) 7 numeron peliä *) function yli(a, b : integer) : integer; var i : integer; os, nim : longint; (* Turbo Pascalissa muuten ylivuoto *) begin (* lasketaan osoittaja a*(a-1)*...*(a-b+1) *) os := 1; for i := a downto (a-b+1) do os := os * i; (* lasketaan nimittäjä b! *) nim := 1; for i := 2 to b do nim := nim * i; yli := os div nim; end; (* yli() *) (* tulostaa lottorivin *) procedure TulostaRivi(r : rivi); var i : integer; begin for i := 1 to maxnro do if (i in r) then write(i, ' '); writeln; end; (* TulostaRivi() *) (* arpoo lottorivin (numeroita numeroa) muuttujaparametriin r, palauttaa myös tiedon siitä, montaako irtoriviä peli vastaa *) (* käyttää vakioita maxnro ja peli *) procedure ArvoLottoRivi(var r : rivi; numeroita : integer; var riveja : integer); var num, ruutu : integer; begin r := []; (* tyhjennetään rivi *) (* arvotaan numerot, num kasvatetaan vain jos arpominen onnistui *) num := 1; while (num <= numeroita) do begin ruutu := random(maxnro) + 1; (* verrataan aiempiin *) if (not (ruutu in r)) then begin r := r + [ ruutu ]; num := num + 1; end; end; (* while *) riveja := yli(numeroita, peli); end; (* ArvoLottoRivi() *) (* pääohjelma *) (* Muokkaa pääohjelmaa tarpeen mukaan, ainakin jollet tee kaikkia tehtäviä (vaikka kyllä kannattaisi ;-) ) *) var pelatut : rivitaulu; (* pelatut pelit taulukossa *) peleja : integer; (* pelattujen pelien määrä *) rivienmaara : integer; (* rivien määrä (järjestelmät useana) *) oikearivi : rivi; (* arvotut oikeat numerot *) tulokset : maarataulu; (* voittoluokkien määrä *) voitot : voittotaulu; (* voittojen määrä luokittain *) potti : real; (* liikevaihto *) vero : real; (* valtion voitto-osuus *) i, j, k : integer; (* apumuuttujia *) s : integer; (* syötettävät rivit, loput arvotaan *) begin randomize; (* alustetaan satunnaisluvut *) write('Montako riviä viitsit syöttää? : '); readln(s); rivienmaara := 0; j := 0; for i := 1 to maxpeleja do begin (* luetaan käyttäjältä osa, arvotaan loput *) if (i <= s) then LueLottoRivi(pelatut[i], k) else begin (* arvottu rivi *) (* arvotaan ruutujen määrä *) j := random(maxjarj) + 1; if (j < peli) then j := peli; ArvoLottoRivi(pelatut[i], j, k); end; rivienmaara := rivienmaara + k; (* tulostetaan rivi, jos halutaan, j on nolla jos syötetään käsin *) (* write(i:5, j:3, k:5, ' : '); TulostaRivi(pelatut[i]); *) end; (* lasketaan liikevaihto *) potti := rivienmaara * rivihinta; peleja := maxpeleja; writeln; writeln('Pelattu ', peleja, ' ruudukkoa, vastaten ', rivienmaara, ' riviä, potti on ', potti:10:2, ' ', raha); writeln; (* Oikean rivin arvonta *) ArvoLottoRivi(oikearivi, peli, k); write('Oikea rivi on : '); TulostaRivi(oikearivi); writeln; (* lasketaan tulokset *) LaskeTulokset(oikearivi, pelatut, peleja, tulokset); LaskeVoitot(potti, tulokset, voitot, vero); writeln('Voitonjako:'); writeln; writeln('Valtiolle ', vero:10:2, ' ', raha); writeln; writeln('oikein määrä voitto'); for i := 0 to peli do writeln(i:6, ' ', tulokset[i]:6, ' ', voitot[i]:11:2, ' ', raha); writeln; end.