Kolmkümmend kaks

Teeme siis aastakokkuvõtte.

Ma olen näidanud paljusid erinevaid võimalusi ja püüdnud selgitada kuidas asju võib teha. Nagu paljude asjadega elus on ka programmeerides alati palju võimalusi – lihtsam ja kiirem võib algul olla hea, aga on raskem täiendada ja lisavõimalusi luua. Kõige efektiivsem ja kiirem lahendus on keeruline, eeldab proovimist ja testimist.

Programmeerimine on arvuti üle valitsemine. Väga hea tunne on panna arvutit tegema midagi nii nagu sa täpselt ise tahad teha. Enamik arvutikasutajatest sõltuvad teiste loodud programmidest, hea kui osatakse seadistusmenüüs midagi ümber panna nii, et see endale käepärasem tundub, aga kogenud programmeerija võib oma arvutit täielikult valitseda või ise uue opsüsteemi luua.

Programmeerijad on tööturul hinnas. Suurtes ettevõtetes võib väga olulise tarkvara loonud või kohandanud programmeerija nõuda väga kõrget palka, sest alternatiivid oleks ettevõttele veel kallimad. Näiteks majandustarkvara “rätsepatööna” vajadusteks kohandavad firmad võivad küsida veel suuremaid summasid.

Kõik hakkab peale ise uurida ja teha viitsimisest.

Meie kasutasime oma programmeerimise algõppes Python 2.7 Ubuntu Linuxi “elus-DVD” plaadilt.
Siinkohal laadisin üles viimase versiooni plaadi tõmmisest: ubuntu-python-final.iso

Plaadi parool on: huvi2010

Selle saab kirjutada DVD plaadile Nero/Roxio, ImgBurn (viimati Windowsi kasutades meeldis see tasuta programm mulle kõige enam ja on just tõmmisfailide keskne) või mõne muu plaadikirjutamistarkvaraga: silmas tuleb pidada, et tuleks valida “write image to disk” kirjutamisrežiim, lihtsalt niisama plaadile lohistades ja failina kirjutades ei hakka plaat tööle.

Millest huviringi läbinuna võiks oma oskuste lihvimisel jätkata?

Kasutada võib meie poolt juba alustatud videonäiteid The New Bostonis:
Seal on kolm Pythoni alajaotust:

Üldine Pythoni ABC:
www.thenewboston.com/?cat=40&pOpen=tutorial
PyGame näited:
www.thenewboston.com/?cat=32&pOpen=tutorial
Graafilised ehk akendega programmid Wx-teegi abil:
www.thenewboston.com/?cat=41&pOpen=tutorial

Täpsemalt PyGame’ist leiab www.pygame.org, eriti kasulik on lugema õppida dokumentatsiooni : www.pygame.org/docs – kõikidel programmeerimiskeeltel on sarnased dokumentatsioonid olemas, veidi kuivavõitu, aga faktitihedad ametlikud selgitused, et mis mida teeb.
Pythoni kohta üldiselt sama asi: http://docs.python.org/ (praegu on seal Python 2.7.1 dokumentatsioon, kunagi saab esilehel olema 3.x seeria, siis leiab 2.7 linkidest kõrvalt), üldine Pythoni lehekülg on http://python.org/.
PyGame lehel on ka viiteid paljudele inimeste poolt tehtud näitetele, mida saab alla laadida, proovida, muuta ja sealt palju õppida. Oleme seda proovinud ka ringitundides. Ülesandeid leiab näiteks Tartu Ülikooli Täppisteaduste kooli Informaatikaolümpiaadide vanemalt leheküljelt: www.ttkool.ut.ee/comp/olymp/ – seal juures tuleb silmaspidada, et ülesanded ei ole koostatud spetsiaalselt Pythoni jaoks, kuid programmeerimiskeeled on universaalsed ja selliseid ülesandeid annab kõiki lahendada ka Pythonis. Vaadata tasub algul vaid algajatele suunatud koolivoorude ülesandeid, vabariikliku vooru ja edasijõudnute ülesanded eeldavad väga palju matemaatikat ja pakuvad vaid väga tõsisele väga suurte kogemustega huvilise oskustele vastavat mõtlemist.

Kui kasutada “elus plaati”, siis peab programmifailid salvestama kas Windowsi kettale, mälupulgale või laadima üles mõnele internetis asuvale failide hoidmise lehele (näiteks Dropbox.com). Windowsi ketta peaks leidma teisest menüüst – Asukohad, Arvuti järelt (nt 54 GB failisüsteem). Sealt saab need “külge haakida” ja salvestada näiteks Documents and settings\kasutajanimi\My documents (Win XP) või Users\kasutajanimi\… (Win Vista ja 7).

Pythoni Windowsi installi kohta jagas soovitusi the New Boston oma Pythoni õpetuste esimestes videotes.

Rubriigid: Uncategorized | Lisa kommentaar

Kolmkümmend üks

Eelmisel korral jõudsime päris kaugele ja “kivide”kukutamisega tegelev programm töötab edukalt. Mainisin juba otsapidi ka, et lisaks otseselt nähtavale peab programmeerides mõtlema ka veidi kaugemale…

“Kivide kukutaja” algsel versioonil oli näiteks komme veaga programm lõpetada kui osade “ekraanilt mööda” kukkunud kivide koordinaadid läksid liiga suureks. Selle vastu tegutsemiseks sai lisatud kontroll:

    for kivi in kivid:
       if kivi.y > 795 :
          kivi.y=799

Nii ei saa kivid “kukkuda” lõputult.

Järgnev video näitab, et ka kivide arvu tõus ei pruugi olla hea:

Tänapäeva arvutitel on väga palju mälu, kivi objekt (kolm numbrit – koordinaadid ja kukkumiskiirus) ei võta palju mälu, aga kui iga mõne sekundi tagant kive juurde lisatakse, siis on kive varsti kümneid, sadu ja poole tunni pärast tuhandeid. See on juba märgatav kogus. Kujutleme nüüd ette, et unustame arvuti seda programmi pikalt näitama või teeme sellest programmist “ekraanisäästja” … jõuetum arvuti (nagu meil koolis) on varsti ülekoormatud, võib jääda aeglaseks ja suisa ebanormaalseks.

Seepärast lisame kivide eemaldamise mängule.

Mida edasi?

Võime lisada mängule “võitmise”.

Selleks on kaks võimalust:

1. Ajaline limiit – kui mängija suudab “ellu jääda” ehk kivita mitte pihta saada mingi aja, siis on ta esimese taseme võitnud.
2. Kokku kukkunud kivide arvu limiit – selleks peame peale kivide kustutamise lisamist tegema eraldi kokku kukkuma pandud kivide loenduri. Kui loendur jõuab mingi suurema ilusa arvuni – näiteks 1000 – siis on mängija võitnud.

Kokkuvõttes erilist vahet ei ole – kuigi kuna kivisid pannakse kukkuma juhuslikult, siis mäng on igakord veidi erinev mõlemal juhul.

Et mängu põnevamaks teha, siis võiks lisada mitu taset (levelit). Igal tasemel võiksid erineda kivide välimus ja suurus (teised pildid), kukkumiskiirus ja/või kukkuvate kivide arv olla suuremad, kolmandal või neljandal tasemel võiks lisada võimaluse osadel kividel kukkuda veidi viltu – vasakule või paremale kaldu.

Kui programmeerimise poolest õigesti teha, siis levelite kirjeldused võiksid olla eraldi konfiguratsioonifailis (vastava taseme piltide nimed, kiirusandmed, suvaliste numbrite alumised ja ülemised limiidid jne).

Proovimiseks ja uurimiseks mõned näited: lihtsam “banaanipommidega” näide, kosmosesõda ja keerulisem “kahuritule” programm.

Meie programmi mõnede muutustega versioon (kukub kuni 100 kivi ja kui suudad pihta saamata toime tulla, siis võidad).

Rubriigid: Uncategorized | Lisa kommentaar

Kolmkümmend

Jätkame täna Pygame’is asjade liikuma panemist.

Mõned lisavõimalused:

Teksti kuvamine
Pygame programmi algusesse juurde:
# lisab määramata kirjastiili
kiri = pygame.font.Font(None, 17)
# lisab teksti, (255,255,255) on teksti värv - valge
# ja (100,100,245) on tekstikasti värv)
tekst = kiri.render('Tere maailm!', True, (255,255, 255), (100, 100, 245))
#tekstikast - ala mille sisse tekst kuvatakse
tekstikast = tekst.get_rect()
#asukoha määramine
tekstikast.x, tekstikast.y=500, 700

Lisaks tuleb pildi kuvamise juurde lisada selline rida:
# see paneb teksti kenasti ka ekraanile
ekraan.blit(tekst, tekstikast)

Objektide vahelise kauguse arvutamine ja võrdlemine

Pytagorase teoreem

Selleks tuleb kaasata matemaatikafunktsioonid pythonile:
import math
# [siia vahele käib kogu muu programmi värk]
# arvutamine ise
vahemaa = math.sqrt(abs(asi1x-asi2x)+abs(asi1y-asi2y))

Tänane ülesanne

Võtame eelmise korra tunni lõpu tulemuse.
Esmalt lisame kontrolli et kui kaugel üksteisest on “pall” ja “rakett”. Kui kagus on väike (alla 5 piksli), siis lõpetame mängu (näitame sellekohast teadet – plahvatuse pilti “palli” või “raketi” peal).

Seejärel ehitame koodi ümber töötama nii, et juhtida saab “palli” vaid vasakule-paremale (alumises servas). Paneme “raketi” kukkuma ülevalt alla otse ja paljundame seda nii, et “kukub” palju “rakette” või õigem oleks öelda “asteroide”. Kui “pall/kosmoselaev” satub vähem kui 5 piksli kaugusele “asteroidist”, siis saab mäng läbi.

Vajalikud pildid saab:pildid2.tar

Lõpptulemuse programmikoodi failid saab: naited.tar

Rubriigid: Uncategorized | Lisa kommentaar

Kakskümmend üheksa

Võtame näidiseks ühe lihtsa PyGame näite, milles saab liigutada palli:


#!/usr/bin/python
# -*- coding: utf-8 -*-
bif = "bg.jpg"
mif = "ball.png"
import pygame
from pygame import *
pygame.init()
ekraan=pygame.display.set_mode((800, 600), 0, 32)
taust=pygame.image.load(bif).convert()
hiir1=pygame.image.load(mif).convert_alpha()
hiir2=pygame.image.load(mif).convert_alpha()
x, y = 0, 0
liigutax, liigutay = 0, 0
hiir = hiir1
while True :
    for syndmus in pygame.event.get() :
        if syndmus.type == QUIT:
            pygame.quit()
            sys.exit()
        if syndmus.type==KEYDOWN:
            if syndmus.key==K_LEFT:
                liigutax=-1
            elif syndmus.key==K_RIGHT:
                liigutax=+1
            elif syndmus.key==K_UP:
                liigutay=-1
            elif syndmus.key==K_DOWN:
                liigutay=+1
            elif syndmus.key==K_SPACE:
                hiir=hiir2
                ekraan.blit(hiir, (x, y))
            elif syndmus.key==K_TAB:
                hiir=hiir1
                ekraan.blit(hiir, (x, y))
        if syndmus.type==KEYUP:
            if syndmus.key==K_LEFT:
                liigutax=0
            elif syndmus.key==K_RIGHT:
                liigutax=0
            elif syndmus.key==K_UP:
                liigutay=0
            elif syndmus.key==K_DOWN:
                liigutay=0
    x+=liigutax
    y+=liigutay
    ekraan.blit(taust, (0, 0))
    ekraan.blit(hiir, (x, y))
    pygame.display.update()

Vajalikud pildid on siin.

Ja selle keerukam jätk:

Lõpeks meie oma kahe “asjaga” programm: punane pall, mida saab klaviatuurilt juhtida ja rakett, mis jälitab palli. Jälitamisalgoritm on praegu “aeglustuv”, sihtmärgi juurde jõudes on “rakett” väga aeglane.


#!/usr/bin/python
# -*- coding: utf-8 -*-
bif = "bg.jpg"
mif = "ball.png"
gif = "ball2.png"
rif = "rakett.png"

import pygame, sys
from pygame import *

pygame.init()

ekraan=pygame.display.set_mode((800, 600), 0, 32)
taust=pygame.image.load(bif).convert()
hiir1=pygame.image.load(mif).convert_alpha()
hiir2=pygame.image.load(gif).convert_alpha()
rakett=pygame.image.load(rif).convert_alpha()

x, y = 0, 0
rx, ry = 700, 550
liigutax, liigutay = 0, 0
pall = hiir1

kell = pygame.time.Clock()
kiirus = 1

while True :
    for syndmus in pygame.event.get() :
        if syndmus.type == QUIT:
            pygame.quit()
            sys.exit()
        if syndmus.type==KEYDOWN:
            if syndmus.key==K_LEFT:
                liigutax=-1
            elif syndmus.key==K_RIGHT:
                liigutax=+1
            elif syndmus.key==K_UP:
                liigutay=-1
            elif syndmus.key==K_DOWN:
                liigutay=+1
            elif syndmus.key==K_SPACE:
                hiir=hiir2
                ekraan.blit(pall, (x, y))
            elif syndmus.key==K_TAB:
                hiir=hiir1
                ekraan.blit(pall, (x, y))
        if syndmus.type==KEYUP:
            if syndmus.key==K_LEFT:
                liigutax=0
            elif syndmus.key==K_RIGHT:
                liigutax=0
            elif syndmus.key==K_UP:
                liigutay=0
            elif syndmus.key==K_DOWN:
                liigutay=0
    x+=liigutax
    y+=liigutay

    milli = kell.tick()
    sekundid = milli / 1000.
    dm =sekundid * kiirus

    if rx<>x :
        rx-=((rx-x)/kiirus*sekundid)
    if ry<>y :
        ry-=((ry-y)/kiirus*sekundid)
    #rx+=dm

    if x < 0 : x = 0     elif x > 799 : x=799
    if y < 0 : y=0     elif y > 599 : y=599

    ekraan.blit(taust, (0, 0))
    ekraan.blit(pall, (x, y))
    ekraan.blit(rakett, (rx, ry))
    pygame.display.update()

Rakett võib olla suvaline väike osalt läbipaistev PNG (ka muu pilt, aga PNG läbipaistvus võimaldab ilusamat tulemust). Näiteks kiir korras tehtud rakett:

Rubriigid: Uncategorized | Lisa kommentaar

Kakskümmend kaheksa

Teeme täna väikse katse ja proovime hoopis midagi muud. Visuaalset programmeerimise õppeprogrammi Scratch.

Esmalt üks video:

Programmi enda leiab aadressilt: http://scratch.mit.edu/ ja allalaadimise http://scratch.mit.edu/download (ei pea kõike täitma).

Rubriigid: Uncategorized | Lisa kommentaar

Kakskümmend seitse

Teeme vahelduseks midagi lihtsamat kah.

Teeme käsureapõhise loteriiprogrammi.

Kasutaja kontol on alguses 100 krooni.

Arvuti küsib käsureal kasutaja panust, see peab olema väiksem kui käes olev raha.

Arvuti küsib “õnnenumbrit”.

Arvuti “mõtleb” ühe juhusliku numbri 1..5 vahel, kaasa arvatud.

Kui arvuti mõtles sama numbrit kui “õnnenumber”, siis lisatakse kasutaja kontole 4 kordne panuse summa. Kui numbrid erinevad, siis lahutatakse kasutaja kontolt panuse summa.

Mäng kestab kuni kasutajal on üks ühik või vähem raha kontol.

#!/usr/bin/python
# -*- coding: utf-8 -*-
import random
mangkaib = True
print "Tere tulemast loteriile!"
raha = 100
while mangkaib :
    okei = False
    while not okei :
       panus = int(raw_input("Palju panustad?"))
       if (panus < raha) :           print "Tore, panustasid ", panus, " summas!"           okei = True        else :           print "Panus ei sobi!"     okei = False     while not okei :        onnenumber = int(raw_input("Mis on õnnenumber?"))        if (1 <= onnenumber <= 5) :           print "Tore, su õnnenumber on ", onnenumber, " !"           okei = True        else :           print "Õnnenumber ei sobi!"     voidunumber = random.randint(1, 5)     print "Võidunumber oli : ", voidunumber     if (voidunumber==onnenumber) :        print "Võitsid!"        raha = raha + panus * 4     else :        print "Kaotasid!"        raha = raha - panus     print "Kontol raha:", raha     if (raha <2) :        print "Sul on raha peaaegu otsas! Kaotasid!"        mangkaib = False

Teiseks proovime teha programmi, mis krüpteeriks sõnumi arusaadamatuks või vähemalt raskesti arusaadavaks. Kasulikuks võiks osutuda eelmisel tunnil vaadatud tekstivõimalused:
.swapcase()
.replace(“”, “”)
jms.

Rubriigid: Uncategorized | Lisa kommentaar

Kakskümmend kuus

Proovime näiteks lahendada sellist ülessannet:

Ärimees tahab lennata linnast A linna C. Kuna nende linnade vahel otseliini pole, tuleb tal linnas B ühelt lennukilt teisele ümber istuda. Ümberistumiseks kulub vähemalt 30 minutit. Kirjutada programm, mis liinide A − B ja B − C lennugraafikute põhjal leiab reisiplaani, mille ajakulu on vähim võimalik.

Lennuliinid on failis: lennud.txt :
Näiteks:

* Tallinn-London
10:10 11:50
13:10 14:50
16:40 18:20
* London-Boston
8:10 16:50
12:10 20:50
22:40 6:20

Vastuseks kirjutab programm ekraanile:
Tallinn-London
16:40 18:20
London-Boston
22:40 6:20

(Keerulisemaks läheb asi siis kui reis võib toimuda ka mitme järjestikuse päeva jooksul või võib mõni lennuk olla õhus keskööl. Kui saame käima versiooni, mis seda ei toeta, siis on pool tööd tehtud.)

Tegeleme selle ülesandega hiljem edasi. Seniks mõned tekstiga tehtavad funktsioonid, mida meil tarvis läheb:

.split(“:”) – oleme ilma parameetriteta varem ka kasutanud, siis teeb ta tekstijupi tükkideks tühikute kohtadelt. Kui aga kaasa anda parameeter, siis tehakse tekst tükkideks just selle märgi kohalt. Selles ülesandes tuleb linnade nimed üksteisest eraldada kriipsu “-” kohalt ja minutid ja tunnid eraldada kooloni “:” abil.

find(“*”) otsib teksti hulgast soovitud märki või märgijada. Kui find selle leiab, siis vastuseks saab positiivse numbri, mis vastab märgi positsioonile tekstis. Näiteks rea “* Tallinn-London” kohta vastab find(“*”) 0, sest * on kõige esimesel ehk nö nullpositsioonil. Kui * ei leita, siis saab vastuseks -1.

Kasulikud võimalused on ka teksti kirjasuuruse muutmiseks:

.strip() eemaldab parameetrita tavaliselt tühikud teksti algusest ja lõpust, aga parameetriks võib panna ka muud märgid, mida algusest ja lõpust eemaldada
.replace(“:”, “-“) vahetab teksti keskel asuva märgi millegi muu vastu, näiteks kooloni kriipsuga.
.lower() – see tekst ainult väiketähtedega (suurtähed tehtud väiketähtedeks)
.upper() – tekst ainult suurtähtedega
.swapcase() – vahetatud suur- ja väiketähed
.title() – esimene suurtäht, teised väiksed

Rubriigid: Uncategorized | Lisa kommentaar

Kakskümmend viis: sorteerimine

Eelmisel korral vaatasime tunni lõpus kui aega üle jäi üht ülesannet, mis osutus ootamatult keeruliseks.
Tegu oli sorteerimisega. Nagu ma näitasin, siis programmeerimiskeeltel on enamasti kaasas enda sorteerimisvahendid:

sorted([5, 2, 3, 1, 4])
[1, 2, 3, 4, 5]

Ehk siis kui meetodile sorted parameetriks anda mõni nimekiri numbritest, siis sorted annab vastu väiksemast suuremale järjekorras samad numbrid.
Samuti töötab sorteerimine teksti ja sõnadega, proovige näiteks IDLE’s:

sorted("See on test tekst mille kirjutas Adalbert".split())

.split() lahutab teksti (string, jutumärkides) tühikute alusel sõnade järjekorraks.
sorted sorteerib sõnad vastavalt tähestiku kooditabelile.

Tähelepanu: arvestab ka suurtähti ja see ei ole sama mis tähestiku järjekord!
Näiteks: “AAA ABB abb acc aaa ccc aBB abB BBB Ccc” sorteeritakse järjekorda “AAA ABB abb acc aaa ccc aBB abB BBB Ccc” – esmalt suurtähtedega algavad sõnad, siis väiketähtedega algavad. Põhjuseks see, et kooditabelis on suurtähed koos ja väiketähed koos, mitte läbisegi. Lisaks on järjekorras ka erisusi, enamus sellest küll kattub, aga täpitähed asuvad tähtede kooditabelites erinevas kohas ja seepärast ei pruugi nad sattuda samasse kohta kus tähestiku järgse sorteerimise korral nad olema peaks isegi siis kui tähtede suuruses erinevusi pole.

Näiteks programm:

#!/usr/bin/python
# -*- coding: utf-8 -*-
sorteeritud = sorted(u"äää üüü hädaldas Adalbert taga õues öösel žurnalistika Šurikut parajat juurikat".split())
for tekst in sorteeritud:
print tekst,

Programmi vastus:
Adalbert hädaldas juurikat parajat taga äää õues öösel üüü Šurikut žurnalistika
Eesti tähestik koos võõrtähtedega:
ABCDEFGHIJKLMNOPQRSŠZŽTUVWÕÄÖÜXY

Õ täht on kooditabelis peale Ä tähte ja enne Ö tähte ning ka Š ja Ž jäävad eesti tähestiku alusel valesse kohta.

Et sorteerimist parandada on Pythoni sorteerimisel päris head lisavõimalused, nimelt saab ette anda millise funktsiooni alusel sorteeritakse. Näiteks, et suur- ja väiketähti mitte eristada võib teha nii:

sorteeritud = sorted("AAA ABB abb aöc äaa ccc aBõ abB BBB Ccc".split(), key=str.lower)

key=str.lower tähendab, et enne sorteerimist tehakse mõtteliselt sõnad väiketähtedesse tekstitüübi str meetodiga lower.

Võib ka kasutada tagurpidi järjestamist, siis tuleb lisada parameetritesse, key=str.lower järele või asemele reverse=1

Python on lihtsalt kasutatav ja võimas keel, kuid mõned asjad käivad siin teistmoodi kui enamikus harjunumates vanemates keeltes. Olen vast juba maininud, et kui Pythonis võib järjekorras olla läbisegi numbreid ja teksti või muid objekte, siis enamikus teistes keeltes selline asi lubatud ei ole. Eelmisel tunnil ise sorteerida proovides mängis ka see väikese vingerpussi.

Näiteks võib Python sorteerida ka sedasi:
sorted((1, 3, "adalbert", "karu", 7, -5))

Vastuseks on: -5, 1, 3, 7, adalbert, karu

Mida siis ikkagi teha, et ise sorteerida?

Kõige lihtsam on käia nimekiri järjest läbi – esmalt leida kõige väiksem liige ja lisada see uude jadasse, siis sellele järgnev väike liige ja nii edasi kuni koos on kõik jada liikmed uues jadas (valikuga sorteerimine). See ei ole kindlasti matemaatiliselt ja praktiliselt kõige kiirem ja efektiivsem viis sorteerida. No kujutame ette kuidas õpilaste pikkuse järgi sorteerimine käib kehalise kasvatuse tunnis või veelparem spordilaagris, kus õpilased pole varem üksteisega tuttavad ega tea kui pikk keegi on umbkaudugi. Parem on ilmselt alguses paaridel omavahel võrrelda üksteist, siis paare omavahel ja nii edasi – paralleelselt. Sorteerimise kohta on hulgem omaette matemaatilisi teooriaid, ingliskeelses Wikipedias on väga põhjalik artikkel. Eesti keeles on väheseid selgitatud, kuid vaadake kindlasti mullsorteerimist, see vastabki ilmselt kõige paremini õpilaste pikkusepõhisele ise sorteerimisele. Võib uurida ka vahelepanemisega sorteerimist.

Ise sorteerimise ülesande üks võimalik versioon eelmise korra posti juurde:

#!/usr/bin/python
# -*- coding: utf-8 -*-
fail=open("KORD.SIS", "r")
numbrid = []
vastus = []
number=int(fail.readline()) #lugema veel numbri
tekstinumbrid=(fail.readline()).split() #lugema mitu numbrit realt tekstina
numbrid = []
for tekstn in tekstinumbrid:
    numbrid.append(int(tekstn))
while (len(numbrid)>0) :
    vaike = 100000
    for n in numbrid :
       if (vaike > n) :
          vaike=n
    vastus.append(vaike)
    numbrid.remove(vaike)
for i in vastus:
    print i,

Viimaks üks keerulisem objektipõhine näide:

#!/usr/bin/python
# -*- coding: utf-8 -*-
class Opilane:
    def __init__(self, nimi, hinne, vanus):
       self.nimi = nimi
       self.hinne = hinne
       self.vanus = vanus
   def __repr__(self):
      return repr((self.nimi, self.hinne, self.vanus))

   

Opilased = [
   Opilane('jaan', 'A', 15),
   Opilane('mari', 'B', 12),
   Opilane('art', 'B', 10),
]
print Opilased
print "nüüd sorteerime!"
print sorted(Opilased, key=lambda Opilane: Opilane.nimi)

Rubriigid: Uncategorized | Lisa kommentaar

Kakskümmend neli

Võtame veel ühe ülesande informaatikaolümpiaadi ülesannete hulgast:

Antud N +1-elemendiline jada, milles arvudest 1…N üks esineb kaks korda ja ülejäänud igaüks ühe korra. Kirjutada programm, mis leiab korduva väärtuse.
Sisend. Tekstifaili KORD.SIS esimesel real on jada elementide arv N (1 =< N =< 30 000) ja teisel real N + 1 tühikutega eraldatud täisarvu — jada elemendid. Väljund. Tekstifaili KORD.VAL ainsale reale väljastada üks täisarv — jadas kaks korda esinev
väärtus.
Näidisfailid KORD.SIS
4
1 2 4 2 3
KORD.VAL
2

Lahendus:

#!/usr/bin/python
# -*- coding: utf-8 -*-
fail=open(“KORD.SIS”, “r”)
numbrid = []
number=int(fail.readline()) #lugema veel numbri
numbrid=(fail.readline()).split() #lugema veel numbri
mitukorda=”mida”
i = 0
for n in numbrid :
    ki = 0
    for kontroll in numbrid :
        if (i != ki) :
            if (n == kontroll) :
            mitukorda=n
        ki=ki+1
    i=i+1
if (mitukorda != “mida”) :
    print “Mitu korda esineb number”, mitukorda

Veel üks ülesanne:
1. JADA
Antud täisarvude jada. Sorteerida selle elemendid kasvavalt.
Sisend. Tekstifaili JADA.SIS esimesel real on täisarv N (1≤N≤100) ja järgmisel real N üksteisest
tühikutega eraldatud paarikaupa erinevat täisarvu Ai (0≤Ai≤1000).
Väljund. Tekstifaili JADA.VAL ainsale reale väljastada arvud Ai kasvavalt järjestatuna ja
üksteisest tühikutega eraldatult.
Näide. JADA.SIS
4
6 3 1 7
JADA.VAL
1 3 6 7
Märkus. Programmeerimissüsteemi sisseehitatud sorteerimisprotseduuri käesoleva ülesande
lahenduses kasutada ei tohi

Rubriigid: Uncategorized | Lisa kommentaar

Kakskümmend kolm

Proovime veel kõige lihtsamaid olümpiaadiülesandeid mitmete aastate tagant. Üks on selline:

Sõnastik
Kirjutada programm, mis kontrollib etteantud sõnastiku põhjal sõnade õigekirja. (Allikas, 2006. aasta koolivooru algajate ülesanne nr 3.)

Sisend. Tekstifaili sonad.sis esimesel real on sõnastiku suurus M (0 ⩽ M ⩽ 10 000) ja
järgmisel M real igaühel üks väikestest ladina tähtedest koosnev sõne pikkusega kuni 30 märki.
Sõnastiku sisu on antud tähestikulises järjekorras. Faili järgmisel real on päringute arv N
(1 ⩽ N ⩽ 10 000) ja järgmisel N real igaühel uks väikestest ladina tähtedest koosnev päringusõne
pikkusega kuni 30 märki.

Väljund. Tekstifaili sonad.val väljastada täpselt N rida, üks rida iga päringu kohta. Igale reale
väljastada sõna JAH või EI vastavalt sellele, kas päringusõne kuulub või ei kuulu sõnastikku.

Näide.
Fail: sonad.sis
3
kana
kass
koer
3
kilu
kass

Fail:sonad.val
EI
JAH
EI

Pärast võime programmi nii ümber teha, et programm küsib sõnu käsurealt ja ei arvesta/arvestab vigu suurtähtedega.

Lahendus (ilma sõnapikkuse ja failipikkuse piiranguta):

#!/usr/bin/python
# -*- coding: utf-8 -*-
sonad = [] #sõnastiku järjekorra loomine
fail=open("sonad.sis", "r") #avame sisendfaili
number=int(fail.readline()) #lugema numbri

for i in range(0, number): #vastavalt numbrile lugema arv kordi
    sonad.append(fail.readline().rstrip("\n")) #ja lisama sõnastikku
#(siis olemas sonastik kõigi sõnadega)
number=int(fail.readline()) #lugema veel numbri

fh = open("sonad.val", 'w') #avama väljundfaili kirjutamiseks
for i in range(0, number): #siis uus number kordi lugema sõnu
    sona = fail.readline().rstrip("\n")
    vordus = False
    for test in sonad : #iga loetud sõna võrdlema kõigi sõnadega sõnastikus
       if sona == test :
          vordus = True
    if vordus :
       fh.write("JAH\n") #kui saime, siis kirjutame JAH väljundfaili
    else :
       fh.write("EI\n") #kui ühtegi vastet ei saanud, siis kirjutama EI väljundfaili
fh.close() #sulgema väljundfaili
fail.close() #sulgema sisendfaili

Rubriigid: Uncategorized | Lisa kommentaar