Simulointi: Olutravintola
(TK99JR1)
Mika Juhani Tanninen
Jukolantie 31, 00730 Helsinki
050-3594763 / 09-3867898
Tietorakenteiden
harjoitustyö
Helsingin
Yliopisto
Tietojenkäsittelytieteen
laitos
Ryhmä:
K99-13
Ohjaaja:
Jaakko Kyrö
Simulointi: Olutravintola (TK99JR1) Helsinki 29.4.1999
Mika Juhani Tanninen Tietorakenteiden
harjoitustyö
050-3594763 / 09-3867898 Tietojenkäsittelytieteen
laitos
Olutravintolassa on n tarjoilijaa ja tilaa m asiakkaalle. Olutta saa sekä hanasta (iso ja pieni tuoppi) että pullossa (0,33 ja 0,5 litraa). Lisäksi ravintolasta saa pieniä ruoka-annoksia.
Tarjoilijalta menee aikaa tilauksen vastaanottamiseen, tarjoiluun sekä rahastamiseen seuraavasti:
Iso tuoppi / pullo 4 aikayksikköä, pieni tuoppi / pullo 2 aikayksikköä. Lisäksi pullon hakemiseen ja avaamiseen kuluu 1 aikayksikkö. Ruoka-annoksen valmistaminen kestää 20 aikayksikköä.
Asiakkaita saapuu ravintolaan tasaisesti aikavälillä (1,k). Jos ravintola on täynnä, asiakas jää jonottamaan ovelle joksikin ajaksi (odotusaika tasaisesti jakautunut välille (1,w)), jonka jälkeen hän kyllästyy ja lähtee pois. Asiakkaat pääsevät sisään jonoonsaapumisjärjestyksessä.
Asiakkaan ravintolassa ollessaan tekemien tilausten määrä on tasaisesti jakautunut välille (1,p). Tilaukset jakautuvat seuraavasti: iso tuoppi 40%, pieni tuoppi 30%, iso pullo 20%, pieni pullo 8% ja ruoka-annos 2%. Tilausten välillä kuluu asiakkaalta aikaa (1,t) yksikköä.
Ohjelma simuloi olutravintolan toimintaa annetuilla parametreillä m, n, k, w, p ja t.
Ohjelma kerää simuloinnin aloitushetkestä lähtien sisäänpäässeitten asiakkaitten, myytyjen tuotteiden, kyllästyneiden asiakkaiden ja poistuneiden asiakkaiden määriä.
Ravintolan täyttöastetta, tarjoilijoiden työllisyysprosenttia ja jonotusaikoja tarkkaillaan simuloinnin aloitushetkestä lähtien, mutta omalla tarkkailulla tarkkailuhetken aloituskohdan pystyy määrittelemään itse.
Sisältö
1 Käyttöohje 1
1.1 Ohjelman yleiskuvaus käyttäjälle 1
1.2 Ajo- ja asennusohje 1
1.3 Ohjelman käyttöohje 2
1.3.1 Komentovalikko 2
1.3.1.1 Komento: Aloita simulointi alusta 2
1.3.1.2 Komento: Jatka / Pysäytä simulointi 2
1.3.1.3 Komento: Käynnistä / Lopeta oma tarkastelu 2
1.3.1.4 Komento: Ohjelman lopetus 2
1.3.2 Komentovalikon arvojen muuttaminen 3
1.3.2.1 Tarjoilijoita 3
1.3.2.2 Asiakaspaikkoja 3
1.3.2.3 Asiakkaiden saapumisväli 3
1.3.2.4 Sisäänpääsyn jonotusaika 3
1.3.2.5 Tilauksia per asiakas 3
1.3.2.6 Nauttimiseen kuluva aika 4
1.3.2.7 Simuloinnin nopeus 4
1.3.3 Simuloinnin seuranta 4
1.4 Virheilmoitukset ja rajoitukset 5
2 Ohjelman toiminta ja rakenne 6
2.1 Järjestelmän yleiskuvaus ja ratkaisutapa 6
2.2 Tärkeimmät tietorakenteet 7
2.2.1 Linkitetyt listat ja listan alkiot 7
2.2.2 Taulukot 7
2.2.3 Muuttujat 8
2.2.4 Vakiot 8
2.3 Määrittely- ja kutsurakenne 9
2.4 Ohjelman toiminta 9
2.4.1 Pääohjelma 9
2.4.2 Aliohjelma Lisaa 10
2.4.3 Aliohjelma Poista 10
2.4.4 Aliohjelma Pituus 10
2.4.5 Aliohjelma TekoJononKasittely 10
2.4.6 Aliohjelma MaksuJononKasittely 10
2.4.7 Aliohjelma TilausJononKasittely 10
2.4.8 Aliohjelma JuomaJononKasittely 10
2.4.9 Aliohjelma PihaJononKasittely 10
2.4.10 Aliohjelma AikaHarppaus 10
2.4.11 Aliohjelma LisaaMaariin 11
2.4.12 Aliohjelma TarkkailuPaivitys 11
2.4.13 Aliohjelma GrafiikkaPaivitys 11
2.4.14 Aliohjelma NappaimenKasittely 11
2.4.15 Aliohjelma KysyArvo 11
2.4.16 Muut Aliohjelmat 12
2.5 Parannusehdotuksia 12
3 Testaus 13
3.1 Tietorakenteiden käsittelyrutiinien testaus 13
3.2 Kommunikointirutiinien testaus 14
3.3 Tarkkailurutiinien testaus 14
Liitteet 1. Tehtäväpaperi
2. Työpäiväkirja
3. Ohjelmalistaus
1
1.1 Ohjelman yleiskuvaus käyttäjälle
Ohjelmalla simuloidaan olutravintolan toimintaa.
Simuloinnissa tuotteiden ostojakauma ja valmistusaika on kiinnitetty seuraavasti:
Tuote: Tilausjakauma: Valmistusaika:
Iso tuoppi 40 % 4
Pieni tuoppi 30 % 2
Iso pullo 20 % 5
Pieni pullo 8 % 3
Ruoka-annos 2 % 20 aikayksikköä
Kaikkea muuta ohjelmassa pystyykin muuttamaan: tarjoilijoiden ja asiakaspaikkojen määriä, asiakkaiden saapumisväliä, sisäänpääsyn suurinta jonotusaikaa, asiakkaan tilausten määrää, nauttimiseen kuluvaa aikaa ja simulointinopeutta.
Simuloinnin aloitushetkestä lähtien seurataan ajan kulkua, kyllästyneiden jonottajien, sisäänpäässeitten jonottajien, poistuneiden asiakkaiden ja myytyjen tuotteiden määriä.
Simuloinnin alkuhetkestä lähtien seurataan myös ravintolan täyttöastetta, tarjoilijoiden työllisyysprosenttia ja keskimääräisiä jonotusaikoja eri aikaväleiltä.
Simuloinnista piirretään myöskin graafisia käyriä, joista selviää jonojen viimeisimmät pituudet ja pituuksien vaihtelut.
1.2 Ajo- ja asennusohje
Ohjelma toimii MS-DOS käyttöympäristössä. Koneen on pystyttävä 640x480 pistetarkkuuteen 16 värillä. Suositeltavaa on myös, että koneen laskentateho yltää vähintään pentium tasoisen koneen tasolle.
Ohjelma tarvitsee toimiakseen ohjelman käynnistystiedoston olutsimu.exe ja grafiikkakirjaston egavga.bgi.
Ohjelmasta on myöskin käynnistystiedoston ja grafiikkakirjaston lisäksi ohjelmakoodi, muutoksia varten. Tiedosto on olutsimu.pas ja siitä saa tehtyä käynnistystiedoston turbo pascalin komennolla tpc olutsimu.pas.
2
1.3 Ohjelman käyttöohje
1.3.1 Komentovalikko
Komentovalikossa on neljä varsinaista komentoa: "Aloita simulointi alusta", "Jatka / Pysäytä simulointi", "Käynnistä / Lopeta oma tarkastelu" ja "Ohjelman lopetus". Lopuilla komennoilla voi muuttaa simuloinnin arvoja. Arvojen muuttamisesta lisää luvussa 1.3.2.
Komentovalikossa liikkuminen tapahtuu nuolilla ylös ja alas. Komennon suoritukseen käytetään enteriä. Komentovalikon aktiivista komentoa ympäröi musta suorakaide ja komentovalikon oikealla puolella on pienimuotoinen ohje komennon ja näppäinten käytöstä. (Katso kuva 1.)

Kuva 1: Komentovalikko
Kun komentoa ruetaan suorittamaan komentonappi painuu sisään ja nousee ylös vasta, kun komennon suoritus on tehty. Tällä on tarkoitus varmistaa, ettei käyttäjä paina nappia uudelleen, jos komennon suoritus kestää tavallista pidempään.
1.3.1.1 Komento: Aloita simulointi alusta
Komennolla nollataan simuloinnin nykyinen tilanne ja simulointi aloitetaan alusta.
Simuloinnin pystyy aloittamaan alusta vaikka simulointi olisikin käynnissä, simulointia ei siis tarvitse pysäyttää ennen uudelleenaloitusta.
1.3.1.2 Komento: Jatka / Pysäytä simulointi
Komento joko jatkaa pysäytettyä simulointia tai pysäyttää käynnissä olevan simuloinnin.
1.3.1.3 Komento: Käynnistä / Lopeta oma tarkastelu
Komento käynnistää tai lopettaa oman tarkastelun riippuen siitä, onko oma tarkastelu komennon suoritushetkellä käynnissä vai ei. Oman simuloinnin voi käynnistää, vaikka simulointi olisikin pysäytetty, tällöin oma simulointi aloitetaan simuloinnin käynnistyessä. Omasta tarkastelusta kerrotaan lisää kohdassa 1.3.3 Simuloinnin seuranta.
1.3.1.4 Komento: Ohjelman lopetus
Komento lopettaa ohjelman suorituksen, ohjelmasta voi poistua, vaikka simulointi olisikin käynnissä.
3
1.3.2 Komentovalikon arvojen muuttaminen
Komentovalikon arvoja pystyy muuttamaan kahdella eri tavalla:
Sivuttaisnuolilla arvoa saa lisättyä tai vähennettyä yhdellä, nuoli vasemmalle vähentää arvoa yhdellä, nuoli oikealle lisää yhdellä. Arvo muuttuu välittömästi ja mahdollisesti käynnissä oleva simulointi jatkuu keskeytyksettä.
Enterillä ohjelma siirtyy syöttötilaan, jolloin simulointi on pysähdyksissä. Syöttötilassa arvon tilalle tulee syötön odotusmerkki "_" ja ohjelma odottaa syötteeksi kokonaislukua.
Luvun syöttäminen toimii yleisten tapojen mukaisesti, enterillä uusi luku hyväksytään, backspacella pyyhitään virhelyöntejä ja escillä perutaan muutokset.
Pienin sallittu arvo on 1 ja surin 1000. Sivuttaisnuolissa luvun ylitykset estetään hylkäämällä komento, syöttötilassa tyhjä syöte palauttaa vanhan arvon ja yritettäessä antaa suurempaa lukua kuin 1000 muutetaan luku jo syöttövaiheessa tuhanneksi.
Arvoja pystyy muuttamaan kesken simuloinnin, mutta muutokset eivät välttämättä tule käyttöön heti. Tarkemmat tiedot muutosten vaikutuksista löytyvät erikseen jokaisesta valikkoarvon kohdasta.
1.3.2.1 Tarjoilijoita
Tarjoilijoiden määrää muutetaan kuten kappaleessa 1.3.2 on kerrottu.
Kesken simuloinnin tarjoilijoiden lisääminen lisää heti tarjoilijoiden määriä. Poistettaessa tarjoilijoita poistetaan mahdollisimman monta vapaista tarjoilijoista, mutta jos vapaita tarjoilijoita ei ole tarpeeksi, joudutaan poistamaan loput vasta, kun he saavat työnsä tehtyä.
1.3.2.2 Asiakaspaikkoja
Asiakaspaikkojen määrää muutetaan kuten kappaleessa 1.3.2 on kerrottu.
Kesken simuloinnin asiakaspaikkojen lisäys huomioidaan välittömästi. Poistettaessa paikkoja ylimääräisiä asiakkaita ei poisteta ravintolasta, ravintolaan vain ei päästetä uusia asiakkaita ennenkuin ravintolassa on taas vapaita paikkoja.
1.3.2.3 Asiakkaiden saapumisväli
Asiakkaiden saapumisväliä muutetaan kuten kappaleessa 1.3.2 on kerrottu.
Saapumisväli kertoo kuinka usein uusia asiakkaita saapuu jonottamaan ravintolaan.
Merkintä "1.." kertoo, että saapumisväli on tasaisesti jakautunut annetulle välille (1..x).
Kesken simuloinnin muutos huomioituu heti.
1.3.2.4 Sisäänpääsyn jonotusaika
Asiakkaiden sisäänpääsyn jonotusaika muutetaan kuten kappaleessa 1.3.2 on kerrottu.
Jonotusaika kertoo kuinka kauan asiakas jaksaa jonottaa, ennenkuin poistuu muualle.
Merkintä "1.." kertoo, että jonotusaika on tasaisesti jakautunut annetulle välille (1..x).
Kesken simuloinnin muutos huomioituu täysin vasta, kun kaikki vanhat jonottajat ovat joko poistuneet jonosta tai päässeet sisään.
1.3.2.5 Tilauksia per asiakas
Asiakkaiden tilauksien määrää muutetaan kuten kappaleessa 1.3.2 on kerrottu.
Arvo kertoo kuinka monta tilausta asiakas tekee, ennenkuin poistuu ravintolasta.
Merkintä "1.." kertoo, että jonotusaika on tasaisesti jakautunut annetulle välille (1..x).
Kesken simuloinnin muutos huomioituu täysin vasta, kun kaikki vanhat asiakkaat ovat poistuneet ravintolasta.
4
1.3.2.6 Nauttimiseen kuluva aika
Asiakkaiden nauttimiseen kuluvaa aikaa muutetaan kuten kappaleessa 1.3.2 on kerrottu.
Arvo kertoo kuinka kauan asiakkaalla kuluu aikaa, ennenkuin hän tekee uuden tilauksen.
Merkintä "1.." kertoo, että jonotusaika on tasaisesti jakautunut annetulle välille (1..x).
Kesken simuloinnin muutos huomioituu täysin vasta, kun kaikki asiakkaat ovat tilanneet uudelleen tai poistuneet ravintolasta.
1.3.2.7 Simuloinnin nopeus
Simuloinnin nopeutta ei muuteta kuten kappaleessa 1.3.2.
Nuoli vasemmalle vähentää simulointinopeutta, jos nopeus ei ole jo hitain mahdollinen.
Nuoli oikealle lisää simulointinopeutta, jos nopeus ei ole jo nopein mahdollinen.
Simulointinopeudessa on 7 eri nopeutta, simuloinnin nopeuden muutos huomioidaan välittömästi.
Nopeutetussa simuloinnissa graafisia näyttöjä pienennetään, jotta simulointi nopeutuu.
1.3.3 Simuloinnin seuranta
|
Simuloinnin aloitushetkestä lähtien seurataan ajan kulkua, kyllästyneiden jonottajien, sisäänpäässeitten jonottajien, poistuneiden asiakkaiden ja myytyjen tuotteiden määriä. Katso kuva 2. |
Kuva 2: Määrien seuranta |
Simuloinnin alkuhetkestä lähtien seurataan myös ravintolan täyttöastetta, tarjoilijoiden työllisyysprosenttia ja keskimääräisiä jonotusaikoja.
Jokaisesta kohdasta tarkkaillaan viimeisintä arvoa, kymmenen ja sadan viimeisimmän arvon keskiarvoa. Kymmenen viimeisimmän keskiarvoa päivitetään aina kymmenen tapahtuman välein, ja sadan viimeisimmän keskiarvoa sadan välein. Lukujen alla olevat viivat kertovat, milloin lukuja päivitetään seuraavan kerran. (Katso kuva 3.)
Omalle tarkkailulle on myöskin jokaisessa tarkkailtavassa kohdassa oma sarake, jos oma tarkkailu on päällä, lasketaan siihen oman tarkkailun aloitushetkestä lähtien keskiarvoa. Jos oma tarkkailu ei ole päällä, oma tarkkailusarake on tyhjä. (Katso kuva 3.)

Kuva 3: Keskiarvoiset tarkkailut
Simuloinnista piirretään myöskin graafisia käyriä, joista selviää jonojen viimeisimmät pituudet ja pituuksien vaihtelut. Normaalinopeudella ja sitä hitaammilla simulointinopeuksilla graafinen käyrä kertoo 430 viimeisimmän aikasykäyksen jonojen pituudet. Normaalia simulointinopeutta nopeammilla simulointinopeuksilla grafiikka-aluetta pienennetään, jollon simulointi toimii nopeammin.
Jokaisen käyrän oikeassa reunassa on näkyvissä piirtoalueen suurin ja pienin arvo sekä selite, minkä jonon pituutta käyrä kuvaa. (Katso kuva 4.)
5

Kuva 4: Graafinen tarkkailu
1.4 Virheilmoitukset ja rajoitukset
Ohjelmassa on kolme varsinaista virheilmoitusta, joista kaksi ensimmäistä voivat tulla vain ohjelman käynnistyksen yhteydessä ja kolmas virheilmoitus kertoo ohjelmointivirheestä. Viimeisin virheilmoitus on vain informaatioluontoinen virheilmoitus, joka ei estä simuloinnin jatkamista:
Virheilmoitus: Grafiikkatilan alustusvirhe: <Kääntäjän generoima grafiikkatilan alustusvirhe>
Tilanne: Ohjelma ei saanut alustettua grafiikkatilaa, joten ohjelman suoritus päättyy.
Toimenpiteet: Varmista, että näyttö ja näyttökortti pystyvät 640x480 pistetarkkuuteen 16 värillä.
Virheilmoitus: Grafiikkavirhe: Haluttu tila 640x480
Nykyinen tila ___x___
Tilanne: Ohjelma sai alustettua grafiikkatilan, mutta pistetarkkuus ei ole oikea.
Toimenpiteet: Varmista, että näyttö ja näyttökortti pystyvät 640x480 pistetarkkuuteen 16 värillä.
Virheilmoitus: Simulointivirhe, tyhjästä jonosta yritettiin poistaa alkiota
Tilanne: Simuloinnin suorituksessa on tapahtunut virhe, jonka takia ohjelman suoritus on
lopetettu.
Toimenpiteet: Jos ohjelma aiheuttaa tämän virheilmoituksen, ota yhteyttä ohjelman valmistajaan.
Vriheilmoitus: YLIVUOTO
Tilanne: Simuloinnin tarkkailumuuttujan arvo on vuotanut yli, joten arvoa ei voi enää
tulostaa näytölle. Varsinainen simulointi toimii ylivuodon sattuessakin normaalisti,
virheilmoituksen tarkoituksena on siis vain estää virheellisten tarkkailuarvojen
näyttäminen.
Toimenpiteet: Ylivuodon sattuessa simulointia on suoritettu hyvin pitkään ja olisi suotavaa aloittaa
simulointi alusta. Jos ylivuoto tapahtui oman tarkastelun sarakkeissa, riittää pelkkä
oman tarkastelun uudelleenkäynnistys, jolloin tarkkailumuuttuja nollaantuu.
Simuloinnin rajoitukset:
Komentovalikon arvot on rajoitettu yhdestä tuhanteen.
6
2 Ohjelman toiminta ja
rakenne
2.1 Järjestelmän yleiskuvaus ja ratkaisutapa
Ohjelman toiminnallisen ytimen muodostavat linkitetyt listat, joista käsittelyrutiineilla siirretään listojen alkioita jonosta toiseen.
Kuva 5 kertoo alkioiden siirrot ja siirron toteuttavat rutiinit. keltaisella alueella alkiot kuvaavat tarjoilijoita, muualla asiakkaita.
Aikaharpaus päivittää jokaisen alkion odotustietoja ja tekee uusia asiakkaita pihajonoon.
Pihajonon käsittely siirtää aasiakkaita tilausjonoon, jos ravintolassa on tilaa, tai poistaa asiakkaita jonosta, jos asiakas on ollut liian monta aikasykäystä pihajonossa (ts. kyllästynyt jonottamaan).
Tilausjonon käsittely siirtää tilausjonosta asiakkaan maksujonoon, jos huilausjonosta pystytään siirtämään tarjoilija tekojonoon, tämä kuvaa asiakkaan tekemää tilausta.
Tekojonon käsittely siirtää tarjoilijoita takaisin huilausjonoon, kun tarjoilija on odottanut jonossa tarpeeksi pitkään (ts. saanut tuotteen valmistettua).
Maksujonon käsittely siirtää asiakkaan maksujonosta juomajonoon kun asiakas on odottanut maksujonossa tarpeeksi pitkään (ts. saanut tilauksensa).
Juomajonon käsittely siirtää asiakkaan juomajonosta joko tilausjonoon tai poistaa asiakkaan, riippuen siitä, tilaako asiakas vielä. Asiakas on juomajonossa niin pitkään, kunnes tuotteen nauttimiseen kuluva aika on mennyt.
Käsittelyrutiinit sisältävät myös tarkkailutietojen päivityksiä.

Kuva 5: Jonojen käsittely
7
2.2 Tärkeimmät tietorakenteet
2.2.1 Linkitetyt listat ja listan alkiot
Linkitetyt listat pitävät sisällään alkioita, joita ohjelma siirtelee jonosta toiseen kappaleessa 2.1 kerrotulla tavalla.
Linkitettyjä listoja on viisi: PihaJono, TilausJono, MaksuJono, JuomaJono, HuilausJono ja TekoJono.
Jokainen lista koostuu samantyyppisistä alkioista. Yksittäinen alkio sisältää linkin seuraavaan alkioon ja tiedot kuinka kauan alkio on jonottanut, kuinka kauan alkio vielä jonottaa ja kuinka monta tilausta asiakas vielä tekee. Tarjoilijoiden listoissa alkioilla ei tarvitsisi olla tuota viimeistä tietokenttää, mutta listojen käsittely on huomattavasti helpompaa, jos jokainen lista koostuu samanlaisista alkioista.
2.2.2 Taulukot
Taulukoita käytetään tarkkailtavien kohtien arvojen säilyttämiseen.
Simuloinnin aloitushetkestä lähtien seurataan ajan kulkua, kyllästyneiden jonottajien, sisäänpäässeitten jonottajien, poistuneiden asiakkaiden ja myytyjen tuotteiden määriä. Nämä tiedot säilytetään taulukossa "maarat[1..5]" edellä luetellussa järjestyksessä.
Simuloinnin alkuhetkestä lähtien seurataan myös ravintolan täyttöastetta, tarjoilijoiden työllisyysprosenttia, keskimääräisiä jonotusaikoja ulko-ovella ja tiskillä, sekä tilauksen valmistumisen keskimääräistä odotusaikaa.
Jokaisesta kohteesta tarkkaillaan viimeisintä arvoa, 10 viimeisimmän arvon keskiarvoa, 100 viimeisimmän arvon keskiarvoa ja käyttäjän valitsemasta kohdastakin lähtien voidaan laskea keskiarvoa. Viimeisintä arvoa ei tarvitse säilöä, koska se pystytään tulostamaan välittömästi. Muut tiedot säilytetään 2 -ulotteisessa taulukossa "tarkkailtavat[1..5, 1..6]". Ensimmäinen sarake kertoo seurattavan kohteen, toisen sarakkeen perusteella taulukosta löytyvät seuraavat tiedot:
[X,1] Viimeisimpien arvojen yhteenlaskettu arvo (10 viimeisimmän arvon laskemiseen).
[X,2] Laskuri, joka kertoo, milloin 10 arvoa on laskettu yhteen.
[X,3] Viimeisimpien arvojen yhteenlaskettu arvo (100 viimeisimmän arvon laskemiseen).
[X,4] Laskuri, joka kertoo, milloin 100 arvoa on laskettu yhteen.
[X,5] Oman tarkkailun aloittamisesta lähtien saatujen arvojen yhteenlaskettu arvo.
[X,6] Oman tarkkailun aloittamisesta lähtien saatujen arvojen lukumäärä.
Laskureitten perusteella siis tiedetään, milloin oikea määrä lukuja on saatu, jotta uusi arvo voidaan kirjoittaa näytölle ja muuttujat voidaan nollata.
Simuloinnista piirretään myöskin graafisia käyriä, joista selviää jonojen viimeisimmät pituudet ja pituuksien vaihtelut. Näiden käyrien tiedot säilytetään taulukossa "tilastot[0..tilastopituus, 1..5]". Jälkimmäinen sarake kertoo, mistä käyrästä on kyse ja ensimmäisen sarakkeen 0:s arvo kertoo käyrän suurimman arvon ja loput arvot ovat käyrän uudelleenpiirtämistä varten.
8
2.2.3 Muuttujat
Muuttuja: Selite:
tarjoilijoita Ravintolassa työskentelevien tarjoilijoiden määrä.
paikkoja Ravintolan asiakaspaikkojen määrä.
saapumisvali Asiakkaiden saapumisväli ravintolan jonoon on tasaisesti jakautunut välille
(1..saapumisvali).
odotusaika Asiakkaiden jonotusaika ulko-ovella ennen kyllästymistä on tasaisesti
jakautunut välille (1..odotusaika).
tilauksia Asiakkaiden tilausten määrä on tasaisesti jakautunut välille (1..tilauksia).
tilaustiheys Tuotteen nauttimiseen kuluva aika on tasaisesti jakautunut välille
(1..tilaustiheys).
uusijonottaja Määrittelee, milloin uusi asiakas tulee ravintolan jonoon.
kyllastyneet Laskee kyllastyneiden asiakkaiden määriä yhdellä aikavälillä.
simuloidaanko Kertoo, onko simulointi käynnissä, vai ei.
simulointinopeus Simulointinopeuden määräävä muuttuja.
rullauspoisto Kertoo kuinka monta arvoa jätetään piirtämättä graafisista käyristä (määrittää
simuloinnin nopeuden).
valikko Käyttäjävalikon aktiivinen kohta.
tilastokohta Käytetään graafisten käyrien arvojen tallennuksessa.
2.2.4 Vakiot
Tilastopituus vakio määrittelee, kuinka suuren taulukon ohjelma varaa graafisten käyrien arvojen säilytykseen, vakio määrittelee myös sen, kuinka isot graafiset käyrät piirretään normaalilla simulointinopeudella. Arvon muuttamista ei suositella, koska käyrät eivät välttämättä piirry oikein eri arvolla.
Virkistysviivan_vari vakio kertoo, minkä värinen on harvaan päivitettävien lukujen alla oleva viiva, joka kertoo milloin lukuja seuraavan kerran päivitetään.
9
2.3 Määrittely- ja kutsurakenne
Kuvassa 6 on ohjelman kutsumatriisi, joka kertoo mitä aliohjelmakutsuja proseduurit sisältävät. Aliohjelmakutsuissa välitettävistä parametreista kerrotaan jokaisen aliohjelman kohdalla erikseen (Luvut 2.4.1 - 2.4.16).

Kuva 6: Kutsumatriisi
2.4 Ohjelman toiminta
Linkitettyjä listoja ohjelmassa käsittelee yhdeksän aliohjelmaa. Kolmella ensimmäisellä (Lisaa, Poista ja Pituus) käsitellään yksittäisiä jonoja. Jonojenkäsittelyaliohjelmat yhdessä aikaharppausaliohjelman kanssa suorittavat simuloinnin.
Simuloinnista käyttäjälle näkyvä informaatio tulostetaan aliohjelmilla LisaaMaariin, TarkkailuPaivitys ja GrafiikkaPaivitys.
Ohjelman ja simuloinnin alustamiseen käytetään aliohjelmia AlustaOhjelma, AlustaSimulaattori, NollaaGrafiikka ja EiTarkkailla.
Valikon tilanteen muutokset toteutetaan aliohjelmilla ValikkoKohta ja ValikkoArvo.
Käyttäjän ja ohjelman kommunikoinnista huolehtii aliohjelmat NappaimenKasittely ja KysyArvo.
Grafiikkatilan alustuksen suorittaa aliohjelma Grafiikkatilaan.
Aliohjelmalla Box piirretään kolmiulotteisia suoraikaiteita.
Aliohjelmalla PiirraTausta piirretään ohjelman taustakuva.
Pääohjelmasta ja aliohjelmista kerrotaan lisää luvuissa 2.4.1 - 2.4.16.
2.4.1 Pääohjelma
Pääohjelman alussa alustetaan muuttujat, grafiikkatila ja piirretään taustakuva. Sen jälkeen ikuisessa silmukassa suoritetaan simulointia kutsumalla AikaHarppaus proseduuria. Simulointisykäyksien välissä tarkastetaan onko käyttäjä painanut jotain nappia, jos on, kutsutaan NappaimenKasittely proseduuria.
10
2.4.2 Aliohjelma Lisaa
Proseduurilla lisätään linkitetyn listan perään uusi alkio. Parametreina annetaan osoitin linkitettyyn listaan ja lisättävän alkion tiedot.
2.4.3 Aliohjelma Poista
Proseduurilla poistetaan linkitetystä listasta alkio. Parametreina annetaan osoitin linkitettyyn listaan ja poistettavan alkion osoitin. Jos linkitetty lista on tyhjä, aiheuttaa aliohjelma virheilmoituksen ja poistuu ohjelmasta. Jos poistettavaa alkiota ei ole linkitetyssä listassa aliohjelma ei tee listalle mitään.
2.4.4 Aliohjelma Pituus
Fnktio saa parametrina osoittimen linkitetyn listan alkuun ja palauttaa listan pituuden.
Jos parametrina annetaan jokin linkitetyn listan alkio, palauttaa funktio listan pituuden, kuin annettu alkio olisi listan ensimmäinen alkio.
2.4.5 Aliohjelma
TekoJononKasittely
Proseduuri siirtää kaikki tilauksensa valmiiksi tehneet tarjoilijat TekoJonosta HuilausJonoon.
2.4.6 Aliohjelma
MaksuJononKasittely
Proseduuri siirtää kaikki asiakkaat, joiden tilaus valmistui MaksuJonosta JuomaJonoon ja heiltä vähennetään jäljelläolevien tilausten määrää yhdellä.
2.4.7 Aliohjelma
TilausJononKasittely
Proseduuri käsittelee mahdollisimman monta tilausta, tilausten käsittelyssä käytetään seuraavaa algoritmiä:
Varmistetaan että TilausJonossa ja HuilausJonossa on kummassakin vähintään yksi alkio, jolloin vapaalla tarjoilijalla on siis tilaava asiakas. Asiakkaalle arvotaan tilattava tuote, tarjoilija siirretään HuilausJonosta TekoJonoon tuotetta tekemään ja asiakas siirretään TilausJonosta MaksuJonoon odottamaan tuotteen valistumista. Tätä jatketaan niin kauan, kunnes TilausJonosta tai HuilausJonosta ei löydy yhtään alkiota.
2.4.8 Aliohjelma
JuomaJononKasittely
Proseduuri siirtää tilauksensa nauttineet asiakkaat JuomaJonosta TilausJonoon, jos asiakas tekee vielä tilauksia. Jos asiakas ei enää tilaa, poistetaan asiakas JuomaJonosta ja kasvatetaan poistuneiden asiakkaiden määrää yhdellä.
2.4.9 Aliohjelma
PihaJononKasittely
Proseduuri päästää pihalta mahdollisimman monta asiakasta ravintolaan ja poistaa kyllästyneet asiakkaat jonosta. Ravintolaan päässeet asiakkaat siis siirretään PihaJonosta TilausJonoon ja heille arvotaan tilausten määrä. Kyllästyneet asiakkaat poistetaan PihaJonosta ja kasvatetaan kyllästyneiden asiakkaiden laskuria.
2.4.10 Aliohjelma
AikaHarppaus
Proseduuri kutsuu TekoJonon-, MaksuJonon-, Tilausjonon-, JuomaJonon- ja PihaJononKäsittely aliohjelmia. Huolehtii uusien asiakkaiden lisäämisestä PihaJonoon ja kasvattaa jokaisen jonon odotusaikoja.
11
2.4.11 Aliohjelma
LisaaMaariin
Proseduuri kasvattaa simuloinnin aloitushetkestä lähtien seurattavia muuttujia ja tulostaa kasvatetun arvon näytölle, parametrina välitetään kasvatettavan kohdan järjestysnumero. Parametrin arvon on oltava välillä 1-5, muuten proseduuri yrittää koskea taulukon "maarat" ulkopuolelle. Muuttujan kasvatuksen yhteydessä tarkistetaan, ettei luku vuotanut yli. Parametrilla 1 kasvattetaan simuloinnin aikaa ja parametrilla 5 myytyjen tuotteiden määrää (Katso kuva 2 luvusta 1.3.3).
Normaalisti lukujen ylivuodon tarkastelussa luku on vuotanut yli, jos se on negatiivinen. Tässä tapauksessa luku on vuotanut yli, jos se on pienempi kuin -1. Tämä sen takia, koska luvut nollataan asettamalla luvun arvoksi -1 ja kutsumalla tätä aliohjelmaa, tällöinhän aliohjelma tulostaa luvun 0.
2.4.12 Aliohjelma
TarkkailuPaivitys
Proseduuri päivittää tarkkailumuuttujia ja tulostaa muutetun kohdan arvot näytölle, parametreina välitetään päivitettävän kohdan järjestysnumero ja uusi arvo. Parametrin arvon on oltava väliltä 1-5, muuten proseduuri yrittää koskea taulukon "tarkkailtavat" ulkopuolelle. Tarkkailumuuttujien kasvatuksen yhteydessä tarkistetaan, ettei luku vuotanut yli. Ylivuodon tarkistukset 10 ja 100 viimeisimmän keskiarvon kohdalla voisi todennäköisesti jättää pois, koska vain pihajonon pituuden keskiarvon laskeminen voi aiheuttaa ylivuodon ja pihajonon pituuden pitäisi tällöin olla epärealistisen suuri. Parametrilla 1 päivittetään ravintolan täyttöastetta ja parametrilla 5 tilausta odottavien määrää (Katso kuva 3 luvusta 1.3.3).
2.4.13 Aliohjelma
GrafiikkaPaivitys
Proseduuri päivittää graafisia käyriä, uusimmat arvot haetaan jonojen pituuksien ja muuttujan "kyllastyneet" avulla.
2.4.14 Aliohjelma
NappaimenKasittely
Proseduuri lukee käyttäjän painaman näppäimen ja suorittaa tarvittavat toimenpiteet. Aliohjelmaa on siis tarkoitus kutsua vasta, kun käyttäjä on painanut jotain näppäintä, muutoin aliohjelma jää odottamaan näppäimen painamista.
Ensin aliohjelmassa selvitetään näppäimen aiheuttaman komennon numero seuraavasti:
Komentovalikon ylin komento on 0 ja alin 10.
-(n+1): 0 >= n >= 6: valikon komennon n kohdalla on painettu nuolta vasemmalle.
n+1: 0 >= n >= 6: valikon komennon n kohdalla on painettu nuolta oikealle.
12: painettu nuolta ylös.
13: painettu nuolta alas.
n+21: 0 >= n >= 10: valikon komennon n kohdalla on painettu enteriä.
Näin on jokainen toiminto saatu yksilöllisesti numeroitua, jolloin toiminnot voidaan suorittaa case-lauseen sisällä.
2.4.15 Aliohjelma KysyArvo
Proseduuri pyytää käyttäjältä uutta arvoa valikon arvoihin, parametreina välitetään päivitettävän arvon järjestysnumero ja vanha arvo. Kysyttävä arvo on kokonaisluku, joten proseduuri hyväksyy vain lukuja, jos syötettävä arvo ylittää ylärajan tuhat, niin arvo muutetaan jo syöttövaiheessa tuhanneksi. Jos käyttäjä yrittää palauttaa tyhjää arvoa tai painaa esciä palauttaa proseduuri vanhan arvon.
12
2.4.16 Muut aliohjelmat
AlustaOhjelma
Alustaa linkitetyt listat, asettaa yleiset muuttujat alkuarvoihinsa, aliohjelmien avulla piirtää
taustakuvan ja valikon muuttujat.
AlustaSimulaattori
Tyhjentää linkitetyt listat, asettaa oikean määrän tarjoilijoita huilausjonoon sekä nollaa
tarkkailumuuttujat.
NollaaGrafiikka
Nollaa Graafiset käyrät .
EiTarkkailla
Tyhjentää "oma tarkkailu" sarakkeiden arvot.
ValikkoKohta
Saa parametreinä valikon kohdan ja napin tyylin. Piirtää valikon napin joko normaaliksi,
valituksi tai alaspainetuksi ja päivittää ohjekentän.
ValikkoArvo
Saa parametreinä valikon kohdan ja tulostettavan arvon. Tulostaa annetun valikon napin
arvokenttään annetun arvon.
Grafiikkatilaan
Siirtää ohjelman tekstimodista grafiikkatilaan tai antaa virheilmoituksen grafiikkatilaan
siirtymisen epäonnistumisesta ja pysäyttää ohjelman suorituksen.
Box
Saa parametreinaan suorakaiteen vasemman yläkulman ja oikean alakulman koordinaatit ja
kolme väriä, ensimmäisellä värillä väritetään suorakaiteen vasen- ja yläreuna, jos keskimmäinen
väri on positiivinen väritetään suorakaide sillä värillä sisältä ja viimeisellä värillä väritetään
suorakaiteeen oikea- ja alareuna.
Piirratausta
Piirtää ohjelman taustakuvan.
2.5 Parannusehdotuksia
Simuloinnin lämmittelyn olisi voinut toteuttaa jotenkin muuten, kuin "oma tarkastelu" komennolla. Tosin tähän käyttöliittymään ei olisi enää voinut lisätä kuin oman tarkastelun sarakkeet myös ajan ja määrien tarkkailuun (Kuva 2 luvusta 1.3.3).
Graafisten käyrien takia jonojen käsittely pitää suorittaa käänteisessä järjestyksessä, tällöin asiakkaat joutuvat jonottamaan yhden aikayksikön, vaikka eteneminen olisi ollut mahdollista suoraan. Tämä ylimääräinen odotusaika voidaan vaikka ajatella siirtymiseen kuluvaksi ajaksi.
Simuloinnin olisi voinut suorittaa huomattavasti tehokkaammin, mutta tässä järjestelmässä simuloinnin nopeus ei mielestäni ole pääasia. Ja kuitenkin suurin osa ajasta kuluu graafisen käyttöliittymän päivitykseen.
13
3 Testaus
3.1 Tietorakenteiden
käsittelyrutiinien testaus
Lisaa ja poista proseduurien testaus suoritettiin koodauksen yhteydessä, testaustuloksia rutiinien testauksesta ei ole, mutta rutiinien virheellinen toiminta huomattaisiin varmasti käsittelyrutiinien yhteisessä testauksessa.
Lisaa proseduurin toiminta testattiin kutsumalla proseduuria aina uudelleen samaan jonoon. Alussa
jono oli tyhjä ja jokaisen kutsukerran jälkeen jonon pituus kasvoi yhdellä. Tuhannennen alkion kohdalla testaus lopetettiin. Lisättävällä alkiolla oli aina yhtä suurempi järjestysnumero kuin aikaisemmalla alkiolla. Lopussa järjestysnumerot olivat nousevassa järjestyksessä, joten lisäys tapahtui aina jonon perään.
Poista proseduuria testattiin 50 alkion jonoihin, ensimmäisellä kerralla poista proseduurilla
poistettiin jonon ensimmäinen alkio 50 kertaa, toisella kerralla poistettiin jonon viimeinen alkio 50 kertaa ja kolmannella kerralla arvottiin poistettava alkio. Alkioihin oli sioitettu järjestysnumerot, joten oikean alkion poistaminen pystyttiin näin varmistamaan.
Funktio pituus testattiin lisaa proseduurin testauksen yhteydessä.
Jonojenkäsittelyrutiinien testauksen testaustuloste on liitteessä 4. AikaHarppaus proseduuri tulostaa jokaisen aikaharppauksen kohdalla jonojen pituudet ja jokainen käsittelyrutiini tulostaa tekemänsä
siirrot. Parametrien muuttumiset on myöskin kirjattu testaustulosteeseen.
Simuloiti käynnistettiin yhdellä tarjoilijalla ja pienellä asiakkaiden saapumisvälillä, koska ravintolan tilausjonoon haluttiin kerätä ruuhka.
Ruuhkan synnyttyä tarjoilijoiden määrää nostettiin viiteen, jolloin Tilausjonon käsittelyn proseduurin toiminnan oikeellisuus saatiin testattua.
Seuraavaksi asiakaspaikkojen määrä pudotettiin kahdestakymmenestä viiteen. Näin pihajonon käsittelyn toiminta tuli testattua, pihajonosta ei päästetty asiakkaita sisään, koska ravintola oli täynnä.
Saapumisväli muutettiin (1,1):stä (1,100):aan. Välittömästi havaittiin, ettei ravintolan jonoon tullut enää uusia asiakkaita. Samalla havaittiin asiakkaiden kyllästyvän ulko-ovella jonottamiseen, joten
pihajononkäsittely osasi poistaa kyllästyneitä asiakkaita jonosta ja aikaharppaus proseduuri osasi lisätä asiakkaita pihajonoon saapumisvälin mukaisesti.
Simuloiti käynnistettiin uudestaan, samalla muutettiin simuloinnin parametrejä. Jonot olivat simuloinnin alussa tyhjiä, joten uudelleenkäynnistysrutiini toimi halutulla tavalla. Tämän jälkeen ruettiin jälleen kasvattamaan tilausjonoa.
Tarjoilijoiden määrää lisättiin jälleen, etukäteen jo tiedettiin tarjoilijoiden lisäämisen toimivan, mutta nyt simulointia pyöritettiin sen aikaa, että voitaisiin testata tarjoilijoiden poistamista.
Kun 5 tarjoilijasta 2 oli huilaamassa ja 3 tekemässä tuotetta, pudotettiin tarjoilijoiden määrä yhteen. Poistaminen toimi aivan kuin oli suunniteltu. Ensimmäiseksi poistettiin huilausjonosta tarjoilijoita ja loput poistettiin tekojonosta. Kaksi asiakasta saivat tilauksensa "haamutarjoilijalta" ja simulointi jatkui sen jälkeen aivan normaalisti.
Testaustulosteesta selviää myöskin, ettei asiakkaita tai tarjoilijoita huku matkan varrella.
14
3.2 Kommunikointirutiinien
testaus
Päävalikossa liikkuminen tapahtuu nuolilla ylös ja alas, ylimmästä kohdasta ei pääse ylemmäs ja alimmasta kohdasta ei pääse alemmas.
Valikkoarvoja voi muuttaa sivuttaisnuolilla, pienintä arvoa (1 / ---I) ei voi enää pienentää ja suurinta arvoa (1000 / I+++) ei voi suurentaa. Komentojen kohdalla sivuttaisnuolet eivät aiheuta toimintoja.
Valikkoarvojen kohdalla enter pyytää uutta lukua, simulointinopeuden kohdalla enterillä ei tapahdu mitään. Komentojen kohdalla enterillä hyväksytään komento.
Muita näppämiä ei käsitellä komentovalikon kohdalla.
Komentovalikon arvon muuttamisessa hyväksytään numeronäppäimet, backspace, enter ja esc.
Numeronäppäimillä nykyinen arvo kerrotaan kymmenellä ja numeronäppäimen arvo lisätään lukuun. Luvun ylittäessä tuhannen, luku muutetaan tuhanneksi.
Backspace jakaa luvun kymmenellä ja ottaa jäljelle jäävän kokonaisluvun uudeksi luvuksi. Vaikka tyhjästä luvusta yritetään pyyhkiä merkkejä pois on luku siis edelleenkin 0.
Enter hyväksyy luvun, jos se ei ole nolla. Luvun ollessa nolla enter toimii kuten esc.
Esc palauttaa luvuksi luvun vanhan arvon.
Muita näppäimiä ei käsitellä.
3.3 Tarkkailurutiinien
testaus
Proseduuria LisaaMaariin ei testattu kuin ylivuodon osalta. Normaalisti proseduuri kasvattaa muuttujaa yhdellä, mutta testauksessa muuttujaa kasvatettiin paljon suuremmalla arvolla ja simulointia suoritettiin niin pitkään, että jokainen luku oli vuotanut yli.
Proseduuri TarkkailuPaivitys testattiin ylivuodon osalta kertomalla parametrina saatu luku sopivalla arvolla, jolloin ylivuotoja tapahtui huomattavasti nopeammin, kuin normaalissa simuloinnissa.