Vaja iz poštevanke
Ogrevalna naloga
Napiši program, ki zastavi račun "Koliko je XX krat YY", pri čemer sta XX
in YY naključno izbrani števili med 2 in 10. Za izbiranje naključnih števil
uporabite funkcijo randint(a, b)
, ki vrne naključno število med
(vključno) a
in b
.
Uporabnik mora odgovoriti, računalnik pa izpiše "Pravilno." ali "Napačno." glede na to, ali je odgovor pravilen ali ne.
Pogovor z uporabnikom je lahko videti tako:
ali tako:
Za slednje vam lahko pride prav funkcija str(x)
, ki pretvori
število x
v niz. (V resnici zna pretvarjati tudi druge stvari.)
Rešitev
Tule ni kaj komentirati: izmislimo si obe naključni števili, vprašamo, preverimo, izpišemo "pravilno" ali "narobe".
Če hočemo lepši izpis ("Koliko je 3 krat 6?"), bo potrebno stlačiti številke
v niz, ki ga bo izpisal input
. To lahko napačno naredimo tako, da
napišemo "Koliko je " + a + " krat " + b + "?"
. Ker je Python
resen jezik, se ne bo spustil na ta nivo, da bi sešteval nize in števila.
Števila moramo prej pretvoriti v nize. Tako dobimo
in tako naprej.
Obvezna naloga
Program naj zastavlja takšne račune dvajset sekund. Uporabnik dobi za vsak odgovor točko. Program naj na koncu izpiše število točk.
Pri reševanju ti bo prišla prav funkcija time()
(dobiš jo z
from time import *
, ki pove trenutni čas v sekundah od 1. januarja
1970. Namig: na začetku shrani trenutni čas v spremenljivko zdaj
.
Program teče, dokler razlika med trenutnim časom in zdaj
ni
prevelika.
Rešitev
Za začetek napišimo program, ki dvajset sekund ne dela ničesar. Pisanje takšnih programov je vedno lažje od pisanje programov, ki kaj delajo.
V zanko while
je potrebno nekaj napisati. Ker nimamo napisati
česa, napišemo pass
. Ta namreč ne naredi ničesar: imamo ga prav
zato, da ga uporabimo, kjer bi morali kaj reči, pa nimamo česa.
Program dela natačno tako, kot bi delali sami, če bi nam nekdo rekel, naj
čakamo dvajset sekund: pogleda na uro in si zapomni, do kdaj mora čakati,
(konec = time() + 20
). Nato stalno gleda na uro, dokler ne
napoči čas (while time() < konec
).
Obratna različica si zapomni trenutni čas pred zanko in nato računa razliko med (kasnejšim) trenutnim časom in časom začetka.
(Mimogrede povejmo, da se takole ne dela pavz v programih. Ta program mora
v resnici nekaj delati, namreč vrteti zanko, s čimer računalniku krade čas
in energijo. Če hočemo, da računalnik 20 sekund ne dela ničesar, napišemo
sleep(20)
.
Nalogo zdaj rešimo tako, da pass
zamenjamo s tistim, kar naj
bi program počel, namreč rešitvijo ogrevalne naloge. Poleg tega dodamo še
štetje točk: Pred zanko tock = 0
, v zanki pa, takrat, ko izpišemo
pravilno, tock += 1
.
Tule je še rešitev za tiste, ki stokajo "zakaj ravno Python".
Dodatna naloga
Ugibanje naj se konča tudi, ko uporabnik prvič naredi napako.
Poleg tega naj se odgovor, ki je bil podan po pretečenem času, ne upošteva.
Rešitev
Za tole dodamo še en if
, ki pred prištevanjem točk preveri,
kako smo s časom. Poleg tega potrebujemo še break
, ki bo ob
napačnem odgovoru ustavil zanko.
V programih se vedno poskušamo izogniti temu, da bi večkrat napisali isto
stvar (če se to le da narediti kolikor toliko elegantno). Tule mi gre na živce,
da ponavljamo time() < konec
, zato bi sam raje naredil takole:
Ostalo ostane, kot je bilo.