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:

3 krat 6 Odgovor? 18 Pravilno.

ali tako:

Koliko je 3 krat 6? 18 Pravilno.

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".

from random import * a = randint(2, 10) b = randint(2, 10) print(a, "krat", b) c = int(input("Odgovor? ")) if a * b == c: print("Pravilno.") else: print("Napačno.")

Č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

a = randint(2, 10) b = randint(2, 10) c = int(input("Koliko je " + str(a) + "x" + str(b) + "?"))

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.

from time import * konec = time() + 20 while time() < konec: pass

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.

from time import * zacetek = time() while time() - zacetek < 20: pass

(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.

from random import * from time import * konec = time() + 20 tock = 0 while time() < konec: a = randint(2, 10) b = randint(2, 10) c = int(input("Koliko je " + str(a) + "x" + str(b) + "? ")) if a * b == c: print("Pravilno.") tock += 1 else: print("Napačno.") print("Dosegli ste", tock, "tock")

Tule je še rešitev za tiste, ki stokajo "zakaj ravno Python".

import time import random konec = time.time() + 10 tock = 0 while time.time() < konec: a, b = random.randint(2, 10), random.randint(2, 10) c = int(input("Koliko je {}x{}? ".format(a, b))) print(["Napačno.", "Pravilno."][a * b == c]) tock += a * b == c print("Dosegli ste", tock, "tock")

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.

from random import * from time import * konec = time() + 20 tock = 0 while time() < konec: a = randint(2, 10) b = randint(2, 10) c = int(input("Koliko je " + str(a) + "x" + str(b) + "? ")) if time() > konec: print("Čas za reševanje je potekel.") elif a * b == c: print("Pravilno.") tock += 1 else: print("Napačno.") break print("Dosegli ste", tock, "točk.")

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:

while True: a = randint(2, 10) b = randint(2, 10) c = int(input("Koliko je " + str(a) + "x" + str(b) + "? ")) if time() > konec: print("Čas za reševanje je potekel.") break

Ostalo ostane, kot je bilo.

Zadnja sprememba: nedelja, 26. oktober 2014, 11.59