5. naloga

Brzinomer

V avtomobilu za prikaz trenutne hitrosti vozila skrbi instrument (brzinomer), ki je lahko digitalen (prikazuje številke), ali pa je analogen (fizični kazalec instrumenta se pomika po skali in s svojo lego kaže izmerjeno hitrost). A tudi prikazovalniki s kazalcem in skalo so doživeli svojo prenovo in niso več preprosti analogni merilniki neke fizikalne veličine, ampak gre za prikazovalnike, kjer je kazalec pritrjen na os miniaturnega koračnega elektromotorčka, pomike tega pa krmili avtomobilski računalnik glede na hitrost, ki jo izmerijo tipala hitrosti.

Naš prikazovalnik ima skalo v obsegu od 0 km/h do 250 km/h. Koračni motorček lahko pomika kazalec v vsakem koraku le za 1 km/h navzgor ali navzdol, ali pa kazalca ne premakne. Če je kazalec že v najnižji legi, ukaz za pomik navzdol ne stori ničesar (kazalec ostane v najnižji legi, t.j. kaže na 0 km/h na skali). Podobno tudi pri najvišji legi: ukaz za pomik navzgor ne stori ničesar, kazalec ostane pri najvišji legi, t.j. kaže na 250 km/h na skali.

Premik koračnega motorčka za en korak (oz. kazalca, pritrjenega nanj, za 1 km/h) je sicer precej hiter, vendar vseeno zahteva določen čas. Da ne bi avtomobilski računalnik skušal premikati kazalca hitreje kot to koračni motorček zmore, skrbi ura, ki se proži nekajkrat v sekundi in jamči, da je takrat koračni motorček pripravljen sprejeti nov ukaz za pomik za en korak.

Napiši podprogram oz. funkcijo Premik, ki jo bo ura periodično klicala (približno stokrat v sekundi, točna vrednost intervala ni pomembna). Kot argument bo funkcija ob vsakem klicu prejela celo število med 0 in 300, ki predstavlja trenutno hitrost avtomobila v km/h. Glede na svoje védenje o trenutni legi kazalca brzinomera naj funkcija vrne vrednost −1, +1 ali 0, kar bo povzročilo pomik kazalca za en korak navzdol ali navzgor ali pa pomika v tem časovnem intervalu ne bo. Funkcija naj skrbi, da bo lega kazalca brzinomera čim bolj verno sledila dejanski hitrosti avtomobila:

function Premik(Hitrost: integer): integer; { v pascalu }
int Premik(int hitrost); /* v C/C++ in podobnih jezikih */
def Premik(hitrost): ... # v pythonu; ”hitrost“ bo tipa int

Upoštevaj, da se lahko hitrost avtomobila med dvema zaporednima klicema tvoje funkcije spremeni tudi za več kot 1 km/h. V tem primeru bo sicer kazalec merilnika lahko za krajši čas zaostajal s pravim prikazom, a mora pravo lego po najboljših močeh čim prej ujeti. Pri hitrostih nad prikazovalnim območjem (t.j. nad 250 km/h) naj kazalec tiči v svoji najvišji legi.

Po potrebi lahko deklariraš poljubne globalne spremenljivke in jim tudi določiš začetne vrednosti.

Upoštevaj tudi, da ob zagonu avtomobilskega računalnika ne vemo točno, kje je obtičal kazalec brzinomera — lahko bi se npr. zgodilo, da je bil motor avtomobila (in računalnik) ugasnjen, še preden se je avtomobil dokončno ustavil na domačem dvorišču. Da zagotovimo znano lego kazalca, si lahko pomagamo z informacijo iz drugega odstavka, ki zagotovi, da z 250 koraki navzdol zagotovo dosežemo spodnjo lego (torej prikaz 0 km/h) ne glede na začetni položaj kazalca. Če ti to dela preglavice, lahko zapišeš, da tvoj program predpostavlja ob zagonu ničelno lego kazalca, a za to boš prikrajšan za polovico točk.