Back to site
Since 2004, our University project has become the Internet's most widespread web hosting directory. Here we like to talk a lot about web servers, web development, networking and security services. It is, after all, our expertise. To make things better we've launched this science section with the free access to educational resources and important scientific material translated to different languages.

Team Ten-Uvod u programiranje

Programming Languages


Autor: Lawrence Kesteloot

Cilj programiranja je da se kompjuteru zada sta treba da radi. Kompjuteri mnogo bolje neke stvari rade od nas, kao sto je profesionalni kuvar bolji u kuvanju od nas. Lakse je stoga tom istom kuvaru reci da nam skuva neko jelo nego da mi to sami uradimo. Sto ste precizniji u Vasim zahtevima, to ce Vase jelo biti bas onakvo kakvo Vi zelite da bude. U vecini scenarija, kao i u stvarnom zivotu, cak i najmanja nedoumica ili tumacenje jesu prihavatljivi. Mozda ce kuvar skuvati krpompir i pretvoriti ga u pire umesto da ga ispece. Kada su komjuteri u pitanju, nedoumice i dvosmislenosti su retko prihvatljivi. Programi su toliko kompleksni da ukoliko komjuter pogadja dvosmisleno ili nejasno znacenje zhateva, to moze izazvati toliko suptilne i male probleme koje necete ni primetiti. Programski jezici, stoga jesu dizajnirani da prihvate samo jasne i nedvosmislene komande. Program ipak moze imati poteskoca, ali je u tom slucaju krivica na Vama a ne na nagadjanju samog kompjutera. Vecina poteskoca u programiranju potice od cinjenice da se mora biti potpuno jasan i nedvosmislen u vezi svega.

Ili kao sto moj prijatelj Dan Collens kaze: ,,Pisanje softvera je kao pisanje instrukcija za dvanaestogodisnje dete koje sve sto Vi kazete shvata bukvalno samo da bi Vas nerviralo”. Imajte ovo na umu kada shvatite da izgovarate: ,, Da, ali ono sto sam mislio je . . .”

C++ su takvi jezici i oni se zovu jezici nizeg nivoa. Drugi jezici ce stvortiti sve vrste pretpostavki a to dopusta programeru da definise i najsitnije detalje. Python i Basic jesu takvi jezici i zovu se jezici viseg nivoa. Uopsteno govoreci, jezici viseg nivoa je lakse programirati, ali dozvoljavaju manju kontrolu. Ponekad, kontrola je vazna, na primer u slucaju da da se Vas program pokrene sto je brze moguce. U vecini slucajeva potpuna kontrola i brzina nisu neophodni, a kako kompjuteri postaju sve brzi i brzii, jezici viseg nivoa postaju, sa druge strane, sve popularniji. Jezici nizeg nivoa su generalno slicni osim sto postoji vise linija koda koje treba ispisati da bi se postigla ista stvar. (Kod je skracenica od koda programa, termin koji se odnosi na tekst koji Vi napisete, a koji govori kompjuteru sta treba da uradi kada se pokrene program).

Uvididte da manje detalja ne znaci i manje preciznosti. Svi jezici zahtevaju precizno pisanje. Ukoliko bismo se vratili na analogiju sa kuvanjem jezik viseg nivoa bi pitao :,,Ja zelim pire od dva krompira”, dok bi jezik nizeg nivoa zahtevao tacna uputstva za pravljenje pire krpompira. Jezik viseg nivoa ima specifikaciju koja tacno daje uputstva kako treba skuvati, a zatim napraviti pire krompir, tako da, sto se komjutera tice, nagadjanju nema mesta.

Statements

Vecina programskih jezika ima koncept izjave. Izjava je zapravo komanda koju programer daje kompjuteru. Na primer:

print "Hello, world!"

Ova komanda ima glagol (,,stampaj”) i ostalje detalje (,,sta stampati”). U ovom slucaju, komanda stampaj znaci ,,pokazi na ekranu”, a ne ,,stampaj u stampacu”. Progamer ili daje izjavu direktno kompjuteru (tako sto je ukucava dok pokrece odredjeni program) ili kreira tekst fajl sa komandom u tom fajlu. Mozete kreirati fajl ,,hi.txt” koristeci Notepad program, stavite gore navedenu komandu u ovaj prgram i dajte fajl komjuteru. (Detalji koji se odnose na kako uraditi sve ovo su jezik i specificnosti sistema, ali isti se ne nalaze u ovom tekstu. Ovaj tekst predstavlja samo uvod u koncepte.)

Ukoliko imate vise od jedne komande u fajlu, svaka ce biti izvrsena po redosledu, odozgo nadole. Pa tako fajl moze sadrzati:

print "Hello, world!"
print "Strange things are afoot..."

Kompjuter ce uraditi svaku komandu u sekvencama. Nije preporucljivo ,,igrati kompjuter” dok se odigrava proces programiranja. Zapitakte se, ;;Da sam ja kompjuter, sta bih ja uradio sa ovim uzjavama?’’ Ukoliko niste sigurni koji je Vas odgovor onda se na pravom putu da napisete netacne programe. Stanite i proverite uputstvo za programski jezik koji koristite.

U gore pomenutom slucaju, kompjuter ce pogledati prvu izjavu, utvrditi da li je to izjava za stampanje pogledati sta je to sto treba istampati, i prikazati isto na ekranu kompjutera. To izgleda pvako:

Hello, world!

Primeticete da ovde nema navodnika. Njihova uloga je da kaze kompjuteru gde pocinje, a gde se zaustavlja, isto kao i u engleskoj prozi. Kompjuter ce zatim otici do sledec izjave, izvrsiti komandu koju ista sadrzi, a ekran ce izgeladati ovako:

Hello, world!
Strange things are afoot...

Kada kompjuter stigne do kraja tekst fajla on se zasutavlja i ceka na dalje instrukcije. Ovaj celi proces se zove pokretanje ili izvrsavanje programa. Kada pokrecete pokrecet program, kompjuter pogleda u Vas programski fajl i izvrsava odgovarajucu radnju za svaku izjavu.

Postoji mnogo vrsta izjava, u zavisnosti od toga koji se programski jezik koristi. Na primer, moze postojati beep koja kompjuteru govori da proizvede beep zvuk na zvucniku, ili izjava za prozor koja govori kompjuteru da treba da pokrene novi prozor.

Ce varirati u zavisnosti od programskog jezika. Programski jezik Python koristi izjave koje izgeldaju kao gore pomenute. U C cete napisati:

puts("Hello, world!");
puts("Strange things are afoot...");

primetite nekoliko razlika:

  1. Parametri (tekst sa znacima navoda koje stampac koristi da utvrdi sta da prikaze) se nalaze u zagradama.
  2. Svaka izjava je prekintua sa dve tacke.
  3. Glagol stampaj se zove puts, zbog ,,postavi niz”. Rec niz je komjuterski termin za tekst. Potice od ,,niza pisama”. ,,Staviti” podrazumeva ,,staviti na ekran.”

Ove razlike su prilicno male. Skup pravila kao sto su prva dva se naziva sintaksa. programskog jezika. Skup glagola se naziva biblioteka. Sve to lici na gramatiku i vokubular stvarnog jezika.

Syntax

Svaki jezik ima mnogo sintaksickih pravila. Na primer, ukoliko zelite da kompjuter prikaze dve razlicite stvari treba da napisete:

print "I have a dog.  His name is Bort."

ili mozete da napisete:

print "I have a dog.  " + "His name is Bort."

Drugi primer ima dva niza, i svaki od njih je pod navodnicima. Tu je i plus (+) izmedju njih , a to zapravo znaci: ,,Spojite dva niza, i pretvorite ih u jedan niz”. (Spajanje dva niza se naziva ulancavanje.) Dve gore navedene izjave ce prikazati istu stvar:

I have a dog.  His name is Bort.

U navedenom primer nema razloga da koristie + i dva niza kada mozete koristiti samo jedan niz, kao u prvom primeru, ali cemo kasnije videti slucajeve gde je ulancavanje nizova neophodno. Python i Java jezici krosite plus (+) za ulancavanje nizova, Perl i PHP koriste tacku (.) dok VisualBasic koristi (&). Ponavljamo, ove razlike su minimalne. Ono sto je vazno je koncept ulancavanja nizova i sintaksa jezika koja ce moci da uradi ulancavanje. Razdvojite osnovni koncept i odredjeni nacin kojim se jezikom izrazava taj koncept.

Mozete se pitati zasto su ljudi smisli ovakve jezike sa tako malim razlikama. Ove razlike su obicno rezultat razjasnjavanja, pinekad zbog jaasnoce, ponekad zbog lakse upotrebe programa, ponekad zbog potrebe da program izvrsi komandu sto brze. Jedan stvaralac jezika moze misliti da znak plus predstavlja najjasniji nacin da se pokaze povezivanje dva niza. Drugi moze pomisliti da je znak plus dvosmislen zbog veze znaka plus i brojeva u matematici pa umesto plusa moze izabrati znak &. Treci covek moze pomisliti da znak & zparavo ima znacenje ceznika i, sto ce pre biti korisceno za logicka pitanja, a ne za manipulacije sa nizovima, pa ce se pre odluciti za tacku. Cetvrti, pak ce odluciti, da posto postoji toliko nacina da povezemo dva niza (interno za kompjuter) on nije zeleo ni jednog za progarmera, vec je primorao programera da napise nekoliko verzija detaljnog koda kako bi dovrsio ovaj jednostavan zadatak.

Postoji mnogo razlicitih filozofija u jezickom dizajniranju. Perl, programski jezik na primer, pokusava biti veoma sazet, tako da veliki posao mozete zavrsiti sa veoma malo kucanja. Ovo predstavlja prednost za one koji ne vole da kucaju, ali sa druge strane i nedostatak za one kojima su sazeti kodovi nejasni. Programski jezik Java je veoma pouzdan i on stvara sigurnsonu mrezu oko programa tako da i lose napisan program nece se urusiti. Zbog ovoga napisani programa biva pokrenut i radi sporije, tako da da li cete koristiti Java programski jezik zavisi od toga sta Vam je vaznije brzina ili sigurnost. C jezik je suprtan: on neposeduje sigurnosnu mrezu i omnogucava da Vas program radi najbrze moguce. S obzirom na to da Vam sigurnosna mreza (programer) stedi vreme dok pisete program, uvidecete kako ustedu vremena rada kompjutera tako i ustedu Vaseg vremena.

Postoji stara tradicijia predstavljanja sintakse programskog jezika tako sto se napise program koji prikazuje tekst ,,zdravo svete!’’. U jeziku koji cemo koristiti u ovoj knjizi to bi ovako izgledalo:

print "Hello, world!"

Spisak Zdravo svete programa na Wikipediji ima ovaj program na vise od jedne stotine programskih jezika. Pogledajte ih da biste videli velike varijetete u sintaksi.

Variables

Recimo da imate program koji govori o Vasem psu. To bi moglo izgledati ovako:

print "I have a dog.  It is called Bort."
print "Bort likes to eat dog food."
print "My children and Bort get along very well."
print "My dog Bort barks at my neighbor, whose name is also Bort."

Mozete ovako raditi neko vreme trazeci od kompjutera da prikaze mnostvo interesantnih stvari o Vasem psu. Ukoliko, jednoga dana, promeniote psu ime, ili umesto toga pozelite da pricate o Vasem drugom psu, ili ukoliko ovaj program date Vasem prijatelju i on pozeli da ga promeni da bi se odnosio na njgeovog psa moracete da prodjete kroz citav program pa i svaki najmanji detalj i promenite svako pojavljivanje imena Bort u novo ime. Mozete koristit uredjivac teksta serac-and-replace da ovo uradi, ali to je veoma dosadan proces i mozete pogresiti. Na primer mozete sasvim slucajno zameniti ime psa Vaseg komsije a hteli ste samo s=da promentie iem Vaseg psa.

programiranje jezika resava ovaj problem tako sto omogucava da samo jednom napisete ime psa a zatim ga koristite pomocu oznake. Sve ovo pomalo lici na upotrebu zamenica u stvarnom jeziku. Tako mozete napisati:

dog = "Bort"

koliko ,,igrate kompjuter” i dobijete gore pomenutu izjavuy, pomislicete, ,,Zapamti niz ,,Bort”, i kad god se upotrebi rec pas zamenice rec ,,bort”. Ovo se naziva dodeljena izjava zato sto dodeljujete znacenje reci pas. sledece izjava bi mogla sadrzati:

print dog

Primecujete da ovde nema znaka navoda. Vi ne zelite stvarno da istampate rec pas, vec samo zelite da kompjuter zapamti tekst koji je ranije sam povezao sa tom reci. To sve pomalo lici na razliku izmedju sledecih recenic: ,,On je rekao svoje godiste” i ,,on je rekao ,,svoje godiste”. U prvom slucaju to je broj a u drugom su reci ,,njegovo ngodiste”. Rec dog predstavlja varijablu. Ona je u stvari simbol koji kompjuter povezuje sa necim drugim, u ovom slucaju sa reci ,,bort”. Nas originalni program sada moze biti napisan kao:

print "I have a dog.  It is called " + dog + "."
print dog + " likes to eat dog food."
print "My children and " + dog + " get along very well."
print "My dog " + dog + " barks at my neighbor, whose name is Bort."

Primecujete da je ulancavanje nizova (uz koriscenje znaka plus) ovde bilo neophodno, posto smo mi ponekad zeleli da upoterbimo znake navoda (da oznacimo stvarni tekst) a ponekad nismo zeleli (da bismo upotrebili varijable). Kompjuter ce izjavu videti ovako:

print dog + " likes to eat dog food."

i prvo ce zameniti rec dpas sa nizom ,,Bort”:

print "Bort" + " likes to eat dog food."

a zatim ulancati nizove:

print "Bort likes to eat dog food."

i onda izvrsiti izjavu, prikazujuci na ekranu:

Bort likes to eat dog food.

Uocicete da se ime komsije nije zamenjeno iako je povezano sa recju pas. Promenljiva pas se odnosi na ime psa. To je u stvari citava poenta koriscenja promenljivih: zadrzati odredjeni koncept. Mozete imati razlicite promenljive da biste zadrzali komsijino ime:

neighbor = "Bort"

i promeniti poslednji red u programu u:

print "My dog " + dog + " barks at my neighbor, whose name is " + neighbor + "."

Na taj nacin veoma lako mozete promeniti ime Vaseg psa ili pak ime Vaseg komsije na vrhu fajla a ostatak programa ce raditi bez problema. Izostavio sam rec ,,takodje” iz reda zato sto sada koristimo varijable, pa ne mogu biti siguran da su dva imena ista. Ja ne zelim da menjam ni jedno od dva imena a da istvormeno moj program prikazuje rec ,,takodje”. Kasnije cemo videti nacine prikazivanja reci,,takodje”, samo u slucaju kada imamo dva ista imena.

Sada ceo program izgleda ovako:

dog = "Bort"
neighbor = "Bort"

print "I have a dog.  It is called " + dog + "."
print dog + " likes to eat dog food."
print "My children and " + dog + " get along very well."
print "My dog " + dog + " barks at my neighbor, whose name is " + neighbor + "."

Prazna linija izmedju dodeljene izjave i skupa izjava za stampanje nije neophodna. Kompjuter istu ignorise . Ona je tu radi olkasavanja, zapravo da biste Vi mogli da vidite razmak izmedju dva bloka koda. Posto su dva bloka rade potpuno razlicite stvari, lepo je kada bi oni i vzualno bili razdvojeni. Slobodno koristite prazne redove u Vasem kodu kako biste odvojili blokove koda koji su i konceptualno razliciti.

Vazno je zapamtiti dve stvari kada su varijable u pitanjuu. Prvo, varijabla mora biti definisana pre nego sto je uoptrebimo. Iz toga sledi da morate napisati:

dog = "Bort"
print dog

a ne:

print dog                             (Wrong!)
dog = "Bort"

Zapamtite da kada ,,igrate kompjuter” svaku izjavu morate pogledati pojedinacno i po redosledu, odozgo na dole. U drugom, gore navedenom primeru prvo biste stigli do izjave ,,stampaj pas” i ne biste znali na sta se varijabla pas odnosi. Razliciti jezici reaguju drugacije kada se nadju u ovom problemu. Neki samo predpostavljaju da je varijabla prazan niz (,, “), ali vecina zaustavlj aprogram i prijavljuje gresku.

Drugo, kada ,,igrate kompjuter” i vidite drugu liniju ispravnog programa:

dog = "Bort"
print dog

veoma je vazno da ,,se ne vratite” na prvi red da vidite na sta se pas odnosi. Prvog reda odavno nema. Jedan red mozete jednom pogledati ili uvek u sekvencama. Prvi red pravi zabelesku negde (u memoriji) da se pas odnosi na ,,bort” ali od tada linija nestaje i zaboravlja se. Druga linija proverava memoriju i tamo dobija znacenje varijable, a ne direktno iz prve linije. Ovo moze izgledati kao trivijalna distinkcija, ali cemo varijable koristiti kasnije na veoma sofisticiran nacin kasnije i tada program nece raditi na komandu ,,vrati se” da bi pronasao gde je varijabla definisana; moracete da razmislite o varijabli i njenjoj vrednosti kao du se nalaze u memoriji.

Rec koju koristite da biste imenovali Vasu varijablu je vazna samo Vama. Za kompjuter je samo bitno da budete konzistentni. Pa tako, mozete napisati:

dog = "Bort"
print dog

i to ce funkcionsati ito tako dobro kao i:

xyz = "Bort"
print xyz

Isto ime morati koristiti na oba mesta kako bi kompjuter shvatio da mislite na istu stvar, ali stvarna rec (pas ili xyz) je samo Vama vidljiva, ali ne i korisniku programa. U ovom prvimeru prvi slucaj je bolji jer ime pas predstavlja za sta Vi koristite varijablu. Nekome ko cita ovaj program bice jasno da niz ,,Bort’’ predstavlja ime psa. Ukoliko treba da koristite xyz kao ime varijable, u tom slucaju korisniku koji cita ovaj program to nece biti jasno.

Rec varijabla podrazumeva da se varijable mogu menjati, i zapravo stvarno i jeste tako. Mozete napisati sledeci program:

dog = "Bort"
print "My first dog was called " + dog + "."
dog = "Milou"
print "And my second dog was called " + dog + "."

Kompjuter ce videti prvi red, povezati niz ,,Bort” sa varijablom pas, iskoristiti taj niz u drugom redu, promeniti asocijaciju varijable pas u ,,Milou’’ u trecem redu, i iskoristiti novu asocijaciju u cetvrtom redu. U memoriji varijabla pas moze biti povezana sa samo jednim nizom. Treci red, pomenut gore, zamenjuje staru asocijaciju sa novom. Drugi i cetvrti red gledaju memoriju da bi videli sta je asocijacija i u svakoj izjavi vrednost je razlicita zato sto je vrednost u memoriji razlicita u tacki kada se program izvrsava. Videcete:

My first dog was called Bort.
And my second dog was called Milou.

Math

Kada kompjuter uoci matematicki izraz, on automatski pokrece aritmetiku. Na primer, mozete napisati:

print 5 + 6

Opet cete primetiti da nema navodnika. Ukoliko bi oni ovde postojali, kompjuter bi to bukvalno shvatio i istampao “5+6”. Znak plus se nazivaoperator zato sto on izvrsava operacije na drugim vrednostima. Kada kompjuter uoci gore pomunti red, on ce primeniti aritmetiku i dobiti:

print 11

Izvrsavanjem izjave dobicemo samo stampanje broja:

11

Uocite da ce dve sledece izjave prikazati istu stvar:

print 11
print "11"

osim ako u prvom slucaju kompjuter zna da je u pitanju broj, dok u drugom slucaju kompjuter prepoznaje samo niz. Matematika moze biti prilicno komlikovana:

print (5 + 12) * 9 / 14

Kompjuter ce upotrebiti areitmetiku korak po korak, isto kao sto biste i Vi uradili. Prvo ce uraditi opraciju sabiranja zato sto imamo zagrade:

print 17 * 9 / 14

Zatim sledi mnozenje, posto je na levoj strani:

print 153 / 14

A onda deljenje: (Kosa crta znaci ‘’podeli’’ zato sto znak “÷” ne postoji na tastaturi).

print 10

Ovo cete videti ukoliko ste pokrenuli originalnu liniju:

10

primetite da kada 153 podelimo sa 14 dobijamo otprilike 10,928 ali kompjuter taj rezukltat zaokruzuje ispod realne vrednosti. To je zato sto postoje dve vrste brijeva sa kojima veci jezika radi: celi brojevi celi brojevi koji jesu zaokruzeni brojevi, kao malopre pomenuti i realni brojevi koji imaju decmale, kao sto je 10,928. Kada kompjuter uoci izraz u kome se iskljucivo koristie celi brojevi, on nastavlja sa koriscenjem tih istih celih brojeva, pa cak i u slucajevima kada se rezultat treba sastojati od realnih brojeva. Napisali smo:

print (5.0 + 12.0) * 9.0 / 14.0

tako ce kompjuter uraditi matematiku koristeci realne brojeve a mi cemo videti ovako nesto istampano:

10.9285714286

Ovo je rezultat istorijskog razvoja kompjutera. On moze dovesti do bizarnih rezultata, kao sto jeste ova linja:

print 1 / 2

prokazujuci ‘’0’’ umesto ocekivanog ‘’o.5’’. Postoje slucajevi kada je takvo ponasanje pozeljno, ali veoma cesto to nije slucaj tako da treba da pravite razliku izmedju celih i realnih brojeva. Takodje obratite paznju da se gore pomenuta pravila vezana za realne i cele brojeve primenjuju na anjcesce koriscene programske jezike, ali svaki jezik ima slobodu da odredi svoja sopstvena pravila kada su u pitanju operacije sa brojevima, pa tako da jednog dana mozete koristiti jezik koji drugacije obradjuje stvari, kao sto je pretvaranje ‘’1 / 2’’ rezultata u ‘’o.5’’

a su u pitanju brojevi i nizovi. Mozete napistai:

x = 5
print x

da biste istampali ‘’5’’. Ili mozete napisati:

age = 33
print age * 2

da biste dobili rezultat Vasih godina kada ih pomnozite. Ovde ponovo prvi red kreira u memoriji asocijaciju izmedju varijable ciji je naziv godiste sa brojem 33. Drugi red gleda u memoriju, uzima broj koji je povezan za godistem i izvrsava aritmetiku. Primeticete da prvi red nije algebra. To nije jednacina u kojoj se godiste i broj 33 izjednacavaju. To je zadatak dodeljen broju 33 za varijablu godiste. Razlika je bitna kada vidite ovakav red:

x = x + 5

Gore pomenuta linija je nemoguca u algebri. Vrednost x ne moze biti jednaka vrednosti x plus pet. Ali u programskom jeziku, linija znaci ‘’Pronadji vrednost varijable x u memoriji, dodajoj joj 5, a zatim povezi rezultat sa varijablom x”. Cinjenica da je x koriscen i u matematickom izrazu sa desne strane znaka jednakosti kao i mesto gde stoji rezultat je irelevantna. Njegova vrednost se u matematickim izrazima koristi pre nego sto rezultat biva ponov sacuvan u varijabli. Sa leve strane znaka jednakosti mozete staviti samo jednu varijablu. To je varijabla koja ce biti povezana sa bilo cime sto se nalazi sa desne strane znaka jednakosti. Zamislite da je znak jednakosti zapravo strelica koja je usmerena u levo i koja pomera vrednost koja se nalazi sa njene desne strane ka varijabli koja se nalazi na levoj strani. Zapravo, neki jezici kao sto je Pascal znak “:=” (koji pomalo lici na strelicu koja je okrenuta ulevo) da bi sto jasnije oznacili da su podaci koji su se nalazili na desnoj strani prebacen na levu.

age := 33                  (in Pascal)

Evo jos jednog primera:

x = 5
y = x + 2
print x
print y

Dobicete:

5
7

Ali ako sada napisete (nova linija je obelezena):

x = 5
y = x + 2
x = 10
print x
print y

Dobicete:

10
7

Prodjite kroz svaki red i ‘’igrajte kompjuter’’ da biste se uverili zasto je sve gore pomenuto tako. Uzmite parce papira da biste vodili evidenciju o x i y varijablama ukoliko je to potrebno. Ukoliko sve gore pomenuto nije jasno, zaustavite se i ponovo procitajte ovo poglavlje ili ono koje se odnosi na varijable. Ovaj deo predstavlja cest kamen spoticanja za nove programere.

Mozda ste uocili da znak plus (+) koristimo da bismo oznacili ‘’ulancavanje nizova’’ i ‘’numericka dodavanja’’. Ovo je dobro i obicno je jasno, ali sta bi komjuter terbao uraditi sa ovakvom izjavom:

print "5" + 6

Da li treba da sberemo brojeve 5 i 6 da bismo dobili rezultat 11? Da li niz ‘’5’’ treba biti povezan sa nizom ‘’6’’ da bismo dobili ‘’56’’? Da li komjuter treba da prestane sa radom i prijavi gresku? Svaki jezik se bavi dvosmislenim problemima na drugaciji nacin. Python jezik bi gore pomenuto preoznao kao gresku. Treba eksplicitno saopstit kompjuteru kakvo tumacenje Vi zapravo zelite. Programski jezik Java bi ‘’6’’ pretvorio u niz, pa bismo zapravo dobili niz ‘’56’’. Za Perl, PHP i Visual Basic operator za povezivanje nizova nije plus, vec je tacka za Perl i PHP, a za Visual Basic je znak &., stoga na osnovu operatera koji mkoristimo uvek je jasno sta treba da se uradi. (To je jedna od prednosti koriscenja razlicitih operatera za razlicite stvari).

Da bismo Vam dali jos jedan primer kako sintaksa moze varirati kroz razlicite jezike, evo nacina na koji mozete sabrati dva broja u Jeziku nalik Python:

5 + 6

A evo ga i nacin kao to radite u Lisp programskom jeziku:

(+ 5 6)

Primeticete dve razlike: sve mora biti u zagradi; a znak plus dolazi na prvom mestu. Ponovo, razdvojte koncept sabiranja iz specificne sintakse za sabiranje koju koristi jezik koji Vi ucite.

Conditionals

Pretpostavimo da imate jednostavan program koji prikazuje Vase godiste:

age = 25
print "You are " + age + " years old."

Ukoliko pokrenete ovaj program on ce prikazati:

You are 25 years old.

Sledece godine prvi red mozete promeniti u “godiste = 26” a ono sto ce program izbaciti ce biti adekvatno azurirano. Zapravo ovaj program mozete dati bilo kome, pa tako svako moze modifikovati prvi red a drugi red ce istampati tacno godiste. Kada napunite 30 godina mozda cete pozeleti da ga ovako modifkujete:

age = 30
print "You are " + age + " years old."
print "Your warranty has expired!"

Sve ovo ce pravilno raditi, osim u slucaju ako isti date nekome ko ima 25 godina. Tada ce ta osoba morati da modifikuje prvi red ali takodje zapamtite da obrisete treci red. Ali zasto terati ljudsko bice da brise treci red? Kompjuter bi sam automatski trebao da ili prikaze ili ne prikaze treci red u zavisnosti od vrednosti godista. Mi mozemo koristit ‘’ako’’ izjavu da bismo rekli komopjuteru da upravo to uradi:

age = 30
print "You are " + age + " years old."
if age > 29:
    print "Your warranty has expired!"

Hajde da opet ‘’igramo kompjuter’’: kada dobijete trecu liniju, pogledajte u rec godiste, shvatite da ona jeste varijabla i dobijete njenu vrednost (30) iz memorije (ona je tamo sacuvana u redu 1):

if 30 > 29:

U ovom redu pise “”Ukoliko je 30 vise od 29, izvrsite izjave koje su i namenjene. Ako nije tako, preskocite i tada ce se sala pojaviti na ekranu. Ukoliko prijatelj promeni prvi red u ‘’godiste = 25’’, treci red ce uporediti 25 i 29, a posto 25 nije vece od 29, cetvrtu liniju cemo preskociti.

Ovo je uslovno. Da li ce se cetvrti red pojaviti zavisi od matematickog izraza u trecem redu. Taj izraz bi mogao biti kompleksniji, kao na primer:

if age >= 40 and age < 50:
    print "You are in your forties."

Znak >= sznaci ‘’vece od ili jednako sa’’ (u matematici taj znak se pise ovako“=” ). Ovde red za ‘’stampanje’’ nece biti pokrenut ukoliko godiste nije izmedju 40 i 49 godine. takodje mozete staviti vise od jedne namenjene izjave:

if age >= 50 and age < 60:
    print "You are in your fifties."
    print "Mid-life crisis yet?"

Ukoliko osoba ima izmedju 50 i 59 godina, oba reda ce biti prikazana; u suprotnom, naravno nece. Sada obratite paznju na sledece, ukoliko korisnik ima 1 godinu, drugi red naseg originalnog programa ce prikazati gramaticku gresku:

You are 1 years old.

To bi trebalo biti ‘’godina’’, a ne ‘’godine’’. Mozemo koristiti uslov da bismo popravili ovaj bug. (Bug je greska u programu).

age = 25
if age == 1:
    print "You are " + age + " year old."
if age != 1:
    print "You are " + age + " years old."

Znak == znaci ‘’je jednako sa’’. Postoje dva znaka jednakosti da bismo mogli da ih razlikujemo od dodeljene izjave, koja koristi samo jedan znak jednakosti (kao u prvom redu naseg programa). Ovo se odnosi na ono sto smo ranije napisali o kompjuterskim jezicima, a to hje da sve mora da bude savrseno jasno kada govorimo o onome sto nameravamo da uradimo. Znak != oznacava ‘’nije jednako sa’’. Razmislite o matematickom simbolu za jednakost sa crticom povucnemo preko njega “?”, a zatim zamislite znak uzvika koji je ta crtica. Pa tako ako sada postavite da je godiste 1 sledece:

You are 1 year old.

Sto jeste tacno. Ukoliko godiste nije 1, onda ce prvo ‘’stampaj’’ biti preskoceno a drugi red pokrenut, i prikazivace verziju teksta sa mnozinom ‘’godine’’. Veoma cesto zelite da uradite jednu stvar ukoliko je uslov tacan (kao sto je ‘’godiste = = 1’’) i drugo ukoliko taj uslov nije tacan (godiste ! = 1”). Pa tako kompjuterski jezici imaju skracenice da bi Vas oslobodili prekucavanja cele “ako” izjave sa suprotnim uslovom. Stoga, jednostavno napisite sledece:

age = 25
if age == 1:
    print "You are " + age + " year old."
else:
    print "You are " + age + " years old."

Ovo znaci ‘’Ako je godiste 1, pokrenite prvu izjavu za stampanje. Ukoliko nije, pokrenite drugu izjavu za stampanje”. Opet mozete imati visestruke izjave bilo u prvom, bilo u drugom odeljku:

age = 25
if age == 1:
    print "You are " + age + " year old."
    print "You're an infant!"
else:
    print "You are " + age + " years old."
    print "You're not an infant."

SadaVas program mozete dati nekom drugom i sve sto ta druga osoba treba da uradi je da promeni prvi red da bi dobila nekoliko prikazanih linija tacnog teksta. Mozete zamisliti da sve ovo moze postati veoma kompleksno, uz veoma posebne uslove koji se testiraju. Razmislite o sledecm:

age = 25
if age == 1:
    print "You are " + age + " year old."
    print "You're an infant!"
else:
    print "You are " + age + " years old."

    if age < 25:
        print "You're young."
    else:
        print "You're mature!"

Ovo se zove ‘’’’umetnuto ako’’. Drugo ‘’ako’’ (ono koje uporedjuje godiste sa 25) je umetnuto (u) prvo ‘’ako’’. Posto je to namerno uradjeno, drugo ‘’ako’’ ce samo biti pokrenuto ukoliko je prvi uslov (‘’godiste = = 1’”) netacan. Ukoliko godiste zapravo jeste 1, prvo ‘’stampaj’’ ce biti pokrenutu i citav drugi deo, ukljucujuci i odeljak ‘’ako’’, ce biti preskocen. Tako ce program prikazati samo jedno od ‘’Ti si dete!’’ ili ‘’Ti so mlad’’ nili ‘’Ti si odrastao”. Treba da ‘’igrate kompjuter’’ kroz ovaj program sa razlicitim vrednostima godista, kao sto su 1, 5, 25 i 30.

Uslovi su veoma korisni. U nasem orvom primeru, bilo bi moguce (iako nepodobno) za svaku osobu da doda ili izosttavi ‘’stampaj’’ izjave posto one modifikuju godiste u prvom redu,l ali u stvarnosti vrednost za godiste ce doci sa neke druge strane, kao sto je na primer baza podataka, a program ce sve to pokrenuti kao nemodig=fikovano i prikazati tacan tekst za bilo koju vrednost godista koju moze dobiti.

Mozemo pogledati uslove u C ponovo da bismo prikazali da su osnovni koncepti dostupni u razlicitim programskim jezicima sa samo malim razklikama:

if (age > 29)
    puts("Your warranty has expired!");

Uocimo ove razlike: postoje zagrade oko uslova; ‘’stampaj’’ je zamnejeno sa’’stavi’’ kao i ranije,; tekst koji treba prikazati je u zagradi takodje; i postoji prekidajuca tacka zarez na kraju ‘’stavi’’ izjave. Ukoliko zelite da prikazete vise od jene izjave, moracete onda da napisete sledece:

if (age >= 50 && age < 60) {
    puts("You are in your fifties.");
    puts("Mid-life crisis yet?");
}

Evo jos dve dodatne razlike: ‘’i’’ je zamenjeno sa ‘’&&’’ u uslovu, a oko para ‘’stavi izjava stoje viticaste zagrade. U C (i jezicima koji su natali iz C, kao sto su C++, Java i C#)uvlacenje pasusa biva ignorisano, pa ce tako ‘’ako’’ izjava pretpostaviti da ce naredna izjava biti uslovno pokrenuta. Ukoliko zelite vise od jedne izjave, morate ih grupisati viticastim zagradama da biste rekli programskom jeziku da sve moraju biti uslovno pokrenute. U nasem jeziku nalik na Python, uvlacenje pasusa se koristi da bismo rekli koje se izjave nalaze pod kontrolom redova ‘’ako’’ i ‘’ostale’’

Input

U prethodnom primeru, godiste je pravilno stvaljeno u izvorni kod, u lininji 1:

age = 25

Ovo se naziva hard-coding godista. Termin hard (tesko) nastaje zbog cinjenice da je u programu kada je jednom ovako napisan godiste uvek 25. Ukoliko korisnik zeli da piokrene program sa nekim drugim godistem mora da promeni izvorni kod. Ali to predpostavlja da korisnici razumeju programiranje. S obzirom na cinjenicu da vecina korisnika ipak ne razume programiranje najbolje bi bilo da koriste svoje godiste tako da nikada ne bi imali potrebu da vide izvorni kod

Ovaj red mozemo ovako koristiti:

age = input()

Da bismo uradili input necega to zapravo znaci da nesto stavljamo u kompjuter. Output je suprotan proces, kao izjave za stampanje koje smo kroistili.

Sada nas program izgleda poput sledeceg:

print "What is your age?"
age = input()
if age == 1:
    print "You are " + age + " year old."
else:
    print "You are " + age + " years old."

Kada korisnik pokrene i koristi program, umesto da odmah vidi ‘’Ti si …” tekst, prvo ce videti sledece:

What is your age?

i izgledace kao da se sistem zaustavio. Tada ce korisnik moci da unese svoje godiste, pritisne Enter dugme a program ce nastaviti da radi kao i ranije, sa varijablom godiste podesenom na bilo koji broj koji je unesen

Moze Vas zanimati skup zagrada nakon reci input. Ukoliko ih niste imali, izgledace ovako:

age = input

Rec input ce u mnogome izgledati kao varijabla. Posto komjuter uvek zeli da ima potpuno jasnu komandu o tome sta treba da uradi, mi cemo dodati zagrade koje ce znaciti ‘’Ovo nije varijabla, ovo je komanda. Uradi nesto pametno.’’ input () jeste zapravo funkcija. kasnije cemo govoriti o funkcijama. Za sada mozete misliti o njima kao o delovima koda, a ti delovi rade zanimljive stvari (kao sto je na primer dobijanje broja sa tastature) i pretvaranje nekih vrednosti u rezultate ( za zadatak godiste u ovom slucaju). Kada kompjuter vidi ovu liniju:

age = input()

Prvo vidi funkciju (), radi pametnu stvar (dobija broj sa tastature) i zamenjuje funkciju sa vrednosti koju je dobio:

age = 25

(ukoliko je korisnik ukucao 25). Onda zadatak nastavlja da se izvrsava kao i pre, stavljajuci vrednsot 25 u memoriju i povezujuci je sa reci godiste.

Loops

Recimo da zelimo da napisemo mprogram koji od korisnika pita kolikomputa fraza treba biti ponovljena. (Da, zaista je neophdno imati ovakve primere. Stvarniji, realisticniji primeri su cesto suvise kompleksni da bi prikazali jedan novi koncpet).

print "How many times?"
count = input()
if count == 1:
    print "Are we there yet?"
if count == 2:
    print "Are we there yet?"
    print "Are we there yet?"
if count == 3:
    print "Are we there yet?"
    print "Are we there yet?"
    print "Are we there yet?"
if count == 4:
    print "Are we there yet?"
    print "Are we there yet?"
    print "Are we there yet?"
    print "Are we there yet?"

Ukoliko pokrenete ovaj program, korisnik ce bit pitan ‘’Koliko puta?’’ a kompjuter ce sacekati odgovor. Korisnik zatim mozete ukucati broj izmedju 1 i 4 i frazu ‘’Jesmo li stigli?”’ ce biti prikazana mnogo puta. postoji nekoliko mproblema sa ovim programaom. Prvo, ovaj program najvise moze da broji do 4. Ukoliko korisnik zeli da nesto bude prikazano 5 puta program mora biti prosiren da bi mogao da uradi takav zadatak. Drugo, posto broj slucajeva raste, bice tesko da budemo sigurni da je program tacan. Ukoliko ga prosirite, na primer 20 puta vise, veoma je tesko proveriti, uz pomoc tekst editora da slucaj za 17 ima zaista 17 linija. Mozda ste napravili gresku i samo isekli i zalepili red 16 puta. Mi mozemo biti pametni i napisati ga ovako:

print "How many times?"
count = input()
if count >= 1:
    print "Are we there yet?"
if count >= 2:
    print "Are we there yet?"
if count >= 3:
    print "Are we there yet?"
if count >= 4:
    print "Are we there yet?"

Ovo je prilicno lukavo tako da je vazno da pratite logiku kao kto bi kompjuter. Recimo da je broj 3. Prvo ‘’ako’’ izjava ce proveriti da li je 3 veci ili jednak sa 1, a posto jeste, odstampajte prvu recenicu. Naredna ‘’ako’’ ce porediti brojanje do 2 i istampati drugu recenicu.Ista stvar ce se desiti ako broj >=3 je testiran posto je 3 vece ili jednako od 3. Ali cetvrti test nece raditi posto 3 nije vece ili jednako sa 4. Pa samim tim cetvrta recenica nece biti prikazana. Recenica ce biti prikazana 3 puta (po jednom za prve tri ‘’ako’’ izjave), a to je upravo ono sto smo hteli posto je broj 3

Ovaj novi nacin pisanja programa je jednostavniji za proveru. Mi samo treba da budemo sigurni da je svaki broj u uzastopnim "ako" izjavama za jedan veci od prethodnog broja. Buduci da svaka "ako" izjava ispisuje samo jednu liniju, necemo rizikovati da pogresno izbrojimo "stampaj" linije kao u prvom primeru. Ali, to je još uvijek pomalo spor program koji treba prosirit da bi smo mogli obraditi i izracunati vece vriednosti. Moramo iseci i zalepiti dve linije i zapamtiti da se poveca broj u "ako" izjavama.

Sa novom verzijom bi bilo lakse:

print "How many times?"
count = input()
if count >= 1:
    print "Are we there yet?"
    count = count - 1
if count >= 1:
    print "Are we there yet?"
    count = count - 1
if count >= 1:
    print "Are we there yet?"
    count = count - 1
if count >= 1:
    print "Are we there yet?"
    count = count - 1

Program je sada složeniji, ali svaka "ako" izjava je identicna. To cini secenje i lepljenje puno lakšim - jednostavno mozemo pritisnuti Ctrl-V dugmad (Zalepi) i dobiti program koji obraduje vrlo velike vrednosti brojeva. Evo kako novi program radi. Prva "ako" izjava, kao i pre, uporeduje broj jedan i ispisuje frazu ako je broj veci ili jednak jedan. Ali to takode znaci nešto drugo: to smanjuje vrednost broja jedan. Ova izjava radi tri stvari:

count = count - 1

utvrdjuje vrednost racuna u memoriji, oduzima jedan od njega, i vraca rezultat u memoriju, zamenjujuci stare vrednosti broja. Dakle, ako je broj 3, broj na desnoj strani je zamenjen svojom vrednosti:

count = 3 - 1

onda aritmetika radi:

count = 2

i nova vrednost je sacuvana u memoriju kao i pre, zamenivši 3 koji je bio tamo. Možda se pitate zašto se samo racuna na desnoj strani znaka jednakosti, a ne i na levoj. Zašto kompjuter ne zameni obe reci u vrednosti 3, ovako:

3 = 3 - 1

Ocigledno je da to ne bi bilo vrlo korisno. Dodela izjava samo daje gore pomenutu vrednost varijabli kada se pojavljuje na desnoj strani znaka jednakosti (zadatak). Jedna varijabla na levoj strani znaka jednakosti se koristi da bi se ime povezalo sa aritmetickim rezultatom na desnoj strani.

Dakle, nakon što je prvi izraz prikazan, broj je smanjen za jedan, i pored "ako" isti je testiran. To je isti test, uporedjuje broj sa brojem jedan. Recimo da je broj 3 na pocetku. Na prvom "ako" cemo videti sta izraz prikazuje i broj ce postati dva. Na drugom "ako" cemo videti frazu i broj ce postati jedan. Na trecem "ako" cemo videti frazu i broj ce biti 0. Na cetvrtom "ako" test "0> = 1" nece biti tacan, pa se izraz nece prikazati i broj nece biti smanjen. Bez obzira na to koliko je "ako" izjava, vrednost broja ce ostati 0. Frazu cete videti tri puta, što nije ono sto smo mi zeleli, jer ih je bilo 3 izvorno.

Naš program sada ima jedan konacni problem: bez obzira koliko puta smo sekli i lepili ove tri linije, korisnik uvek može uneti broj koji je veci od toga. Mogli ste zalepiti "ako" izjavu 500 puta, ali ako korisnik unese "510", Vas program ce prikazati frazu 500 puta, jednom za svako "ako". Program ce završiti s promenljivim "broj" jer je postavljen na 10. Postoji 10 i vise upozorenja, ali zadnja 10 "ako" izjava nece biti tamo.

Ovaj poslednji problem mozemo resiti ovako:

print "How many times?"
count = input()
while count >= 1:
    print "Are we there yet?"
    count = count - 1

To je ceo program. Naime, to je neka vrsta niza (postoji nekoliko razlicitih vrsta). Uklonili smo sve "ako" izjave osim jedne, a i zamenili rec. To je isto kao kada bi citali englesku recenicu: "Broj je veci ili jednak 1, ispisi ovu recenicu i smanji broj jedan." Ako "igramo kompjuter" brojac s pocetka je postavljen na tri. Kompjuter ce doci do "dok" izjave, uporediti 3-1, i vidimo da je tri vece od ili jednaka sa 1. Fraza ce biti prikazana, smanjivacemo racunanje za 1 (za dva), a povratni niz do dok. Kompjuter ce opet uporediti racunanje do 1, a za dva veca ili jednaka od jedan, istampace izjavu, smanjiti broj do 1, uporediti izracunato i prikazati fraze, au isto vreme smanjiti varijablu broja na nulu. Zatim ce vratiti niz nazad do "dok" izjave, uporediti brojeve do 1, a ako 0 nije veca od ili jednaka 1, izjava nece ni biti pokrenuta. Niz "dok" ce biti zavrsen, i prelazi se na izjave koje slede. U ovom programu nema izjava koje slede, tako da ce program biti zavrsen. Svaki put kroz niz se zove promena.

Postoji nekoliko razlicitih vrsta nizova. Koji niz cemo koristiti zavisi od onoga sto je dostupno u programskom jeziku, kao i koji niz ima najvise smisla za ono sto mi pokusavamo da uradimo. Na primer, u gornjem primeru, mogli bismo ispisati vrednost broja u svakoj iteraciji, ovako:

print "How many times?"
count = input()
while count >= 1:
    print "Are we there yet?"
    print count
    count = count - 1

Pokretanje programa ce izgledati poput ovoga (ako korisnik unese "3", kada je pitao):

How many times?
3                     (what the user types in)
Are we there yet?
3
Are we there yet?
2
Are we there yet?
1

Brojevi 3, 2, 1 su vrednosti broja na svakoj iteraciji. A sta se desava u slucajevima kada smo hteli da racunamo na gore? Ili sta ako ne zelimo da menjamo broj jer smo zelei da ga upotrebimo kasnije u programu? Ovako bismo mogli koristiti niz:

print "How many times?"
count = input()
for i = 1 to count:
    print "Are we there yet?"
    print count

(Napomena:... Dosad smo jezik koristili za primere koji su slicni popularnom programskom jeziku Python, ali za primer sintakse koja je gore pomenuta koristicemo Basic programski jezik).

Kada su nizovi u pitanju ovo znaci "Pokrenite razdvojene izjave po jednom, za svaku vrednost izmedju 1 i broja, i postavite varijablu toj vrijednosti." Ako korisnik unese 3 videcete sledece:

How many times?
3
Are we there yet?
1
Are we there yet?
2
Are we there yet?
3

1, 2, 3 su vrednosti na svakoj iteraciji. Imajte na umu da vise ne treba smanjivati ??vrednost broja u svakoj iteraciji. Kompjuter automatski povecava za jedan svaku iteraciju dok se ne dostigne broj. U stvari, broj je nepromenjen nakon završetka niza. Ovaj niz:

for i = 1 to count:
    print i

je u sustini identican ovoj verziji:

i = 1
while i <= count:
    print i
    i = i + 1

Ovo je za niz svakako bolje. To je kraci nacin, a istovremeno je jednostavniji za citanje. Dok nizovi su fleksibilniji i sve odradjuju sami. Ako bi dodavali po dva tj. imali porast za dva na svakoj iteraciji, videli bi samo neparne brojeve, ili, s druge strane, mogli smo udvostruciti vrednosti i videti sledece:

print "What is the maximum?"
maximum = input()
i = 1
while i <= maximum:
    print i
    i = i * 2
What is the maximum?
128
1
2
4
8
16
32
64
128

To svakako nije jednostavno za niz. Pored toga u for nizu pocetne i konacne vrednosti (1 i broj u nasem primeru) zapravo moze biti bilo koji par brojeva. Mozemo uciniti sledece:

for i = 20 to 24:
    print i

za prikaz vrednosti 20, 21, 22, 23, i 24 je varijabla koja se ovde koristi, ali, zapravo bilo koja varijabla se moze koristiti. Najcesce koriscena varijabla za nizove je ona koja se odnosi indeks. Takode se moze koristiti ime varijable, sto ima vise smisla u odredjenom kontekstu kao sto je:

for year = 1992 to 2004:
    print "The year is " + year

Druga vrsta niza je foreach niz. Ovaj niz je slican for nizu, osim sto varijabla ne prolazi samo kroz numericki raspon, vec je zapravo postavljena na svakom elementu skupa brojeva:

foreach year in [1992, 1996, 2000, 2004]:
    print "The " + year + " Olympic Games."

Ovo takodje mozemo citati kao englesku recenicu: "Za svaku godinu u popisu 1992, 1996, 2000, 2004, istampati ovu izjavu." (Napomena: Python nema nesto ovako za nizove.)

Postoji nekoliko drugih vrsta nizova, ali oni su obicno varijacije na gore navedene tri vrste.

A Simple Example

U ovom poglavlju cemo pratiti vrlo jednostavan primer koji koristi pojmove koje smo naucili do sada. Mi cemo napisati program koji racuna savet u restoranu.

Postoji mnogo nacina da se pokrene kreiranje i pisanje programa. Jedan od nacina da se to dobro uradi je da zamislimo nekoga ko koristi taj program, a zatim sve to opisati. Ovo ima prednost jer je korisno i program ce biti jednom napisan. (To sto Vi zelite od programa moze izgledati kao ocigledna stvar, ali bi ste se iznenadili koliko beskorisnih programa ima, jer njihovi dizajneri nisu razmisljali o otme sta bi bilo korisno ).

Tako smo zamislili naseg korisnika, koga smo nazvali Tom i on je u restoranu. Bill dolazi i on treba da zapise porudzbinu, ali zeli da koristi program koji ce izracunati porudzbinu za njega. Stoga, u najmanju ruku, program mora prikazati Tomovu porudzbinu. Ali porudzbina zavisi od vrednosti zakona, tako da u nekom trenutku program mora dati i tu informaciju. To nas dovodi do sledece interakcije:

  • Program pita Toma sta je vrednost.
  • Tom unosi vrednost.
  • Program prikazuje porudzbinu.

Ovakav slucaj upotrebe se nazive fiktivna upotreba, ali realno postoji interakcija izmedju korisnika i programa. Oni postaju narocito korisno pri izradi vecih programa. Koriscenje ovog slucaja za Microsoft Word moze biti, "Korisnik zeli dodati sadrzaj na njihovom dokumentu." Ponekad nakon pisanja koriscenja ovakvog slucaja postaje ocigledno da je korisnik trebao uraditi mnogo vise posla, ili, sa druge strane da ovakve upotrebe ne razumeju previse apstraktne pojmove, a postoji sledece a to je da se pravi previse koraka kako bi se nesto ucinilo jednostavnijim. Ovo je sjajan nacin da se ima uvid u svet sa korisnikove tacke gledista.

Sada zelimo da vidimo program sa tacke gledista kompjutera. Pogledacemo sve gore navedeno ali iz perspektive kompjutera.

  • Pitajte korisnika sta je vrednost menice.
  • Korisnik nam daje vrednost racuna.
  • Prikaz saveta za korisnika.

Sada cemo prevesti u kod:

print "What was the value of the bill?"
bill = input()
print tip

U prvom redu cete traziti vrednost od korisnika, drugi red ce sacekati dok korisnik unese vrednost, a treci ce prikazati savet. U svakom slucaju se secate poglavlja o varijabli koja mora biti postavljen pre nego sto se moze koristiti. U trecem redu iznad, varijabla savet se koristi, ali to nikada nije postavljeno bilo gde u programu. Ono sto mi moramo da uradimo je da izracunamo savet. Dodacemo i to nasim koracima:

  • Pitajte korisnika sta je vrednost menice.
  • Korisnik nam daje vrednost racuna.
  • Izracunajte savet na osnovu zakona.
  • Prikaz saveta za korisnika.

Kako trebamo postaviti taj novi, treci korak u kodu? Ono sto znamo je da zelimo postaviti tip varijable. Stoga znamo da cemo koristiti zadatak izjavu, tako da imamo barem ovo:

tip =

Sada moramo shvatiti sto ce stajati sa desne strane znaka jednakosti. Recimo da zelimo savet da se izracuna 15% od iznosa racuna. To cemo uciniti tako sto cemo 15% pomnoziti sa 0,15. I mi zelimo 15% od iznosa racuna. Dakle, matematika nam sluzi za to:

bill * 0.15

To nam daje ovu liniju:

tip = bill * 0.15

Setite se sta znaci: varijabla uzima vrednost menice iz memorije, mnozi tu vrednost sa 0,15, a rezultat cuva u memoriji, povezujuci ga sa novom promenljivom. I ceo program izgleda ovako:

print "What was the value of the bill?"
bill = input()
tip = bill * 0.15
print tip

Pokusajmo:

What was the value of the bill?
12.50
1.875

Imajte na umu da korisnik unosi znak za dolar (ili bilo koju drugu valutu), ali ne dobijamo izlaz. Kompjuter se bavi samo brojevima, a Vi morate otici (prilicno daleko) od Vaseg nacina da biste shvatili kako se operise sa novcem (Microsoft Excel ovo izvodi veoma lako, ali to nije slucaj kada pisete svoje programe).

Takodje imamo obavestenje da iako je 1,87 dolara je pravi iznos, kompjuter ispisuje dodatnih "5" nakon toga. To je precizna vrednost od 15% od ukupno 12,50 dolara. Nismo rekli da ce kompjuter zaokružiti iznos na najblizi peni. To je u redu, ali i korisnik moze to uciniti u svojoj glavi. (To nije jako tesko uraditi, ali ovde necemo govoriti o tome). Pokusajmo jos jednom izracunati vrednost za racun:

What was the value of the bill?
12.92
1.9379999999999999

Opa! 1,93 dolara izgleda dobro, ali sta je sve ostatak nakon toga? Sta u stvari kompjuter podrazumeva sa "1,938", ali umesto toga ispisuje vrednost koja je vrlo vrlo blizu tome. Razlog je veoma kompleksan, ali u sustini kompjuter ne radi u bazi 10 (decimalno) poput nas ljudi. Umesto toga radi u bazi 2 (binarno). U bazi dva neki brojevi (poput 12,92) tesko se predstavljaju, bas kao sto se u bazi 10 neki brojevi (poput 3,333) takodje tesko predstavljaju. Dakle brojevi trebaju biti jednostavni,. Broj 1,938 u ovom slucaju izgleda kao da je pogresno prikazan. Mozemo popraviti da zaokruzivanje bude na najblizem peniju, ali cemo to ipak ostaviti za kasnije.

Umesto toga, hajde da dodamo jos nesto nasem programu. Tom, nas imaginarni korisnik, ponekad dobija dobru uslugu, a ponekad losu. Za dobru uslugu on bi dao napojnicu u iznosu od 20%, a za lose usluge 15%. Ovde sada imamo dve stvari:

  • Program pita Toma sta je vrednost.
  • Tom unos vrednost.
  • Program pita Toma kakav je bio kvalitet usluge.
  • Tom kaze da je bilo dobro.
  • Program prikazuje vrh (20% od racuna).

i:

  • Program pita Toma sta je vrednost.
  • Tom unos vrednost.
  • Program pita Toma kakav je bio kvalitet usluge.
  • Tom kaže da je bilo loše.
  • Program prikazuje vrh (15% od racuna).

Sa tacke gledista kompjutera:

  • Pitajte korisnika sta je vrednost menice.
  • Korisnik nam daje vrednost racuna.
  • Pitajte korisniku kakva je usluga bila.
  • Korisnik odgovara dobro ili lose.
  • Izracunajte napojnicu i kvalitet usluge.
  • Prikaz racuna za korisnika.

Idemo precizniji u toj drugi do posljednjeg koraka:

  • Ako je usluga bila dobra, izracunati napojnicu kao 20% od iznosa racuna, inace izracunati napojnicu kao 15% od iznosa racuna.

Prve cetiri linija koda su prilicno jednostavne:

print "What was the value of the bill?"
bill = input()
print "How was the service?"
service = input()

Sada zelimo izracunati drugaciju napojnicu, u zavisnosti od kvaliteta usluge. Mi mozemo koristiti ‘’ako’’ izjavu:

if service == "good":
    tip = bill * 0.20
else:
    tip = bill * 0.15

Ako to niema smisla, pogledajte poglavlje o uslovima. Poslednja linija je bas kao i pre:

print tip

Pokusajmo sa zaokruzenim brojem za racun, kao sto je $ 10

What was the value of the bill?
10
How was the service?
good
2.0

i:

What was the value of the bill?
10
How was the service?
bad
1.5

Imajte na umu da vrednost nije prikazana kao da ce biti za valutu (2,00 i 1,50). Opet to je zato sto se kompjuterc bavi samo brojevima, a ne i novcem.

Izgleda kao da nas program radi i to je korisno. Ipak, program nije idealan. U ‘’ako’’ izjavi:

if service == "good":
    tip = bill * 0.20
else:
    tip = bill * 0.15

Izracunavanje se obavlja u dva odvojena mjesta, s jednim brojem (postotak). To je ono sto smo hteli, ali svaki put kada vidimo ponavljanje koda, treba se zapitati da li treba naci bolji nacin za pisanje programa. Ponovljeni kod znaci da ako promijenite jednu liniju, tada morate promeniti i druge. Racunanje može biti previse komplikovano, kao sto je, na primer odbijanje poreza od racuna pre obracunavanja napojnice. (Neki ljudi izracunaju 15% pre oporezivanja). Tada treba zavrsiti nesto ovako. A ako je Vas lokalni porez 8%:

if service == "good":
    tip = bill / 1.08 * 0.20
else:
    tip = bill / 1.08 * 0.15

U ovom jednostavnom primeru to nije lose, ali mozete zamisliti slozeniji program ili obracun gde ima ažuriranja i gde postoji rizik od bugova. Mozete promeniti jedan, a ne drugi. Bilo bi bolje da se ovo racunanje uradi na jednom mjestu. Sledece poglavlje ce Vam pokazati jedan od nacina da to ucinite (uz pomoc funkcije), ali ovde cemo koristiti nesto drugo. Zamislimo da ste prisiljeni da gore pomenuto racunanje uradite na jednom mjestu. Postupak racunanja uzima u obzir procenat, koji je razlicit, zavisno od kvaliteta usluge, tako da potpuno tacan procenat ne moze biti deo tog proraeuna. Izgleda kao dobra prilika zaprimenu varijable:

tip = bill * percentage

Sada prvo moramo postaviti procenat varijablu. Ovde je novi tip-proracuna kod:

if service == "good":
    percentage = 0.20
else:
    percentage = 0.15
tip = bill * percentage

Posmatramo, korak po korak, sta se desava s ovom novom verzijom. Vrednost varijable usluga dobijamo iz memorije. Ako su jednake (tj. ako je korisnik uneo "dobar"), onda ce varijabla procenta u memoriji biti postavljen na vrednost 0,20. Inace (ako korisnik unese nesto drugo, kao sto je "lose") varijabla procenat ce biti postavljen na vrednost 0,15. Zatim, nakon sto je ovo uradjeno, tip varijable ce biti postavljen na varijablu racuna i varijablu procenta (koja je upravo bila postavljena).

Sada, ako zelite da promeniti svoj program uzevsi u obzir porez, postoji samo jedna linija za promenu:

if service == "good":
    percentage = 0.20
else:
    percentage = 0.15
tip = bill / 1.08 * percentage

Tu je manja mogucnost za pravljenje grešaka, i kada Vas program postane dovoljno velik sigurno cete zeleti neke dodatne mogucnosti u sto vecem broju. Proces kroz koji smo upravo prosli se zove refactoring. To je preraspodela koda i ona funkcionise identicno, ali nam daje i neku prednost, u ovom slucaju smanjenje broja vremena. Evo naseg celokupnog programa:

print "What was the value of the bill?"
bill = input()
print "How was the service?"
service = input()
if service == "good":
    percentage = 0.20
else:
    percentage = 0.15
tip = bill * percentage
print tip

Dobijanje naseg programa je prilicno komplikovano. Ako se vratimo unazad tri meseca, mozda cemo uspeti da razumemo o cemu se radi. Napisimo unutar samog programa neke beleske koje ce objasniti buducim citaocima koda (a mozda i nama) sta se dogadja. Mozemo to uciniti uz pomoc komentara. Komentari su beleške u kodu koje su iskljucivo u korist programera. Kompjuter ih u potpunosti ignorise. U nasem jeziku, komentar zapoceti sa # karakterima ponekad izgovaraju "funta" ili "mleveno meso". Ovo je nas celokupan program, sa komentarima:

# Get the value of the bill from the user. This
# is the total amount, including tax, but without
# any currency symbol.
print "What was the value of the bill?"
bill = input()

# Find out how the service was. This should be
# the word "good" or "bad".  Any word other than
# "good" will be considered the same as "bad".
print "How was the service?"
service = input()

# Good service gets a 20% tip.  Bad service gets 15%.
if service == "good":
    percentage = 0.20
else:
    percentage = 0.15

# Calculate and display the tip.  The tip here is based
# on the whole bill, including tax.  XXX We could
# remove the tax first. Perhaps ask the user whether they
# want the tax included in the calculation?
tip = bill * percentage
print tip

Primeticete da su komentari ne samo objasnjenja o tome sta se dogadja ("racunanje i prikaz saveta"), ali oni takode isticu razlicite zahteve ("ali bez valutnih simbola") i suptilnosti ("Svaka rec osim" dobro" ce se smatrati isto kao i 'lose' "). Lepo je kada se program u logicke blokove, kao sto je gore uradjeno. Dve linije koje traze i dobijaju vrednost menice idu zajedno. One bi trebale biti vizuelno grupisane, s praznim linijama izmedju njih. (Prazne linije su zanemarene od strane kompjutera.)

Napomena:komentar koji pocinje s "XXX". To je uobicajena stvar koja se pise u komentarima kada postoji potencijalni problem ili otvoreno pitanje. Ovaj komentar istice da je program mogao biti poboljsan, da se to trazi, kao i da se zeli ukloniti porez pre izracunavanja napojnice. Ako ikada trazite nacine kako da poboljsate Vas program, mozete jednostavno ukucati u pretraživanje "XXX" u svoj tekst editor.

oristite komentare. To je cak i korisno pisati komentare pre pisanja koda. Moj prijatelj Drew Olbrich izmislio je stil programiranja pod nazivom Extreme Komentarisanje. Njegovi komentari su vrlo reciti i detaljni. Cini se kao puno posla kada ste na pocetku pisanja, ali sigurni smo da ce Vam sest meseci kasnije biti drago, kada budete morali da razumete i menjate taj kod.

Functions

Hajde da napisemo program kako bi videli da li ste Vi i Vas drug kompatibilni. Mi cemo traziti horoskopski znak, Vas drug je znak, i videcemo šta astrologija predvidja za svakog od Vas. (Mi cemo ga ostaviti, na vama je da interpretiramo rezultate.)

Pocnimo: molba za Vas znak:

print "What's your sign?"
your_sign = input()

Imajte na umu da varijabla Vas_znak ima donju crtu i odvoja dve reci. Do sada sve nase varijable su bila jedna engleska rec, kao što su pas, godiste, boduje i savet. U ovom slucaju zelimo koristiti dve reci, jer cemo imati jednu varijablu za Vas znak i jednu za Vaseg partnera. Postoji nekoliko nacina za imenovanje varijabli kada zelite da bude vise od jedne reci. Jedna opcija je pokrenuti sve reci zajedno, kao to je Vasznak. To je bilo uobicajeno u 1970, ali to se ne koristi puno i danas, jer je tesko procitati. Druga mogucnost je da koristite naglasavanje, kao Vas_znak. Donja crta izgleda malo kao prostor, tako da dve reci izgledaju kao da su normalno napisane kada se prevede engleski jezik (your_sign). Treca mogucnost je da pokrenete reci zajedno i svaku rec napisete velikim slovom, kao YourSign, ili mozda sve reci napisete velikim slovima, ili prvo slovo, kao sto je yourSign. Velika slova olaksavaju da vidite gde svaka rec pocinje. Jezici poput LISP koriste crtice, kao sto su Vase-znak, ali to ovde ne mozemo uciniti jer se crtice u nasem jeziku koriste za oduzimanje, i to ce onda izgledati kao da pokusavate da oduzmete varijablu znak s promenljivom svoj. Ni u modernom jeziku ne mozete to uciniti istu tu stvar, a to je zato sto razmak vec koristimo za razdvajanje varijabli iz drugih stvari. Na primer, ako biste hteli ispisati vrednost ove varijable, zelite pisati:

print your_sign

Ako biste mogali koristiti razmake u imenima varijabli, to bi bilo ovako:

print your sign

Ali sta ako je varijabla koja je pocela s recju print, poput mozda tzv promenljive print racunala da ce sacuvati koliko puta ste hteli nesto ispisati? Ako biste zeleli da postavite ovu varijablu na pet, sta bi ste pisali:

print count = 5

a kompjuter ce biti vrlo zbunjen, jer ce na prvi pogled izgledati kao da ste hteli da prikazete vrednost varijable "count", a potom ce postati jasno da li stvarno zelite da postavite vrednost za ispis broja do pet. Buduci da su jezici osmisljeni kako bi se smanjio broj puta nagadjanja ili moguce zabune, dizajneri jezika ne daju prostora. Kompjuter ce vidjeti donju crtu, koju tretira kao bilo koje drugo pismo, tako da nece biti zabune izmedju:

print_count = 5

i:

print count

Dakle, vracamo se nasem programu. To izgleda ovako:

print "What's your sign?"
your_sign = input()

Mi sada imamo varijablu, your_sign, koja cuva Vasp horoskop kao niz. Mozemo koristiti vrednost ove varijable za prikaz razlicitih stvari. Na primer, za Ovna:

if your_sign == "Aries":
   print "Assertive, impulsive, defensive"

To uporedjuje varijablu your_sign s nizom "Ovan". Ako su oni isti, onda cemo ispisati broj prideva. Ako oni nisu isti (ako nisi Ovan), onda necemo uciniti nicta i krencemo dalje. Mozemo napisati mnogo njih u nizu za testiranje svih razlicitih znakova:

if your_sign == "Aries":
    print "Assertive, impulsive, defensive"
if your_sign == "Taurus":
    print "Resourceful, thorough, indulgent"
if your_sign == "Gemini":
    print "Logical, inquisitive, fast"
if your_sign == "Cancer":
    print "Protective, sensitive, clinging"
if your_sign == "Leo":
    print "Generous, proud, theatrical"
if your_sign == "Virgo":
    print "Practical, efficient, critical"
if your_sign == "Libra":
    print "Co-operative, fair, lazy"
if your_sign == "Scorpio":
    print "Passionate, sensitive, anxious"
if your_sign == "Sagittarius":
    print "Free, straightforward, careless"
if your_sign == "Capricorn":
    print "Prudent, cautious, suspicious"
if your_sign == "Aquarius":
    print "Democratic, unconventional, detached"
if your_sign == "Pisces":
    print "Imaginative, sensitive, distracted"

Hajde da ponovimo sve za Vaseg partnera, koristeci varijablu mate_sign umesto prethodne i promenicemo pitanje na prvoj crti

print "What's your mate's sign?"
mate_sign = input()
if mate_sign == "Aries":
    print "Assertive, impulsive, defensive"
if mate_sign == "Taurus":
    print "Resourceful, thorough, indulgent"
if mate_sign == "Gemini":
    print "Logical, inquisitive, fast"
if mate_sign == "Cancer":
    print "Protective, sensitive, clinging"
if mate_sign == "Leo":
    print "Generous, proud, theatrical"
if mate_sign == "Virgo":
    print "Practical, efficient, critical"
if mate_sign == "Libra":
    print "Co-operative, fair, lazy"
if mate_sign == "Scorpio":
    print "Passionate, sensitive, anxious"
if mate_sign == "Sagittarius":
    print "Free, straightforward, careless"
if mate_sign == "Capricorn":
    print "Prudent, cautious, suspicious"
if mate_sign == "Aquarius":
    print "Democratic, unconventional, detached"
if mate_sign == "Pisces":
    print "Imaginative, sensitive, distracted"

Tu idete. Sada mozete pokrenuti ovaj program i kompjuter ce Vam reci nesto o Vama i Vasem partneru:

What's your sign?
Aquarius
Democratic, unconventional, detached
What's your mate's sign?
Scorpio
Passionate, sensitive, anxious

U ovom primeru, mozete zakljuciti da Vi i Vaš drug jeste vrlo kompatibilni. Prilikom testiranja Vasih programa, uvek zelite da probate sve. Hajde da probamo neki nevazeci unos da bismo videli kako se program ponasa:

What's your sign?
Yogurt
What's your mate's sign?
Volvo

Ni jedna od navedenih ‘’ako’’ izjava se ne podudara, tako da nista ne postoji izmedju Vas i Vaseg partnera To nije vrlo prijateljski. Zeleli bismo reci korisniku da tekst koji je uneo nije imao dobar znak. Ova duga ‘’ako’’ izjava ce uciniti trik:

if your_sign != "Aries" and your_sign != "Taurus" and \
    your_sign != "Gemini" and your_sign != "Cancer" and \
    your_sign != "Leo" and your_sign != "Virgo" and \
    your_sign != "Libra" and your_sign != "Scorpio" and \
    your_sign != "Sagittarius" and your_sign != "Capricorn" and \
    your_sign != "Aquarius" and your_sign != "Pisces":

    print "That's not a valid sign."
    stop()

Postoji nekoliko novih stvari koje treba objasniti u toj liniji. Normalno, mi cemo pisati o ‘’ako’’ izjavama poput ove:

if age == 30:

Takodje smo napisali i one složenije ovako:

if age >= 40 and age < 50:

Vi biste mogli dobiti i vece i slozenije:

if (age >= 20 and age < 30) or (age >= 60 and age < 70):

Ako ste imali mnogo vise stvari za testiranje odjednom, linija ce biti vrlo dugo. Vi biste sve dodato mogli drzati na istoj liniji, kompjuter ce to prihvatiti, ali tekst editorom ce to biti tesko upravljati. Ili ce morati da koristi vodoravne trake za pomicanje, ili ce tekst editor automatski staviti isti u zagrade. Ono sto cete Vi uraditi je da cete podeliti linije. Stoga iz poslednjeg primera mozete napisati:

if (age >= 20 and age < 30) or
   (age >= 60 and age < 70):

To izgleda lepo i uredno, jer su dva para zagrade u jednoj liniji. Ali tu se kompjuter moze zbuniti, zato sto kompjuter ocekuje da je jedan red teksta jedna izjava. Dakle, treba izricito reci da se gore pomenute dve linije treba tretirati kao jednu liniju, pa cak ako je sve napisano u jednoj liniji. To je ucinjeno pomocu crticu na kraju prvog reda:

if (age >= 20 and age < 30) or \
   (age >= 60 and age < 70):

Zamislite crticu. To objasnjava pet obrnutih kosih crta u nasoj dugackoj ‘’ako’’ izjavi gore. "Zanemari ovu end-of-liniju ove, zamislimo da je sledeci red nastavljen upravo ovde, na ovoj liniji.". ‘’Ako’’ izjava izgleda kao jedna linija na kompjuteru , sto je ono sto Vam je potrebno jer ‘’ako’’ izjave moraju biti u jednoj liniji.

Dalje cemo videti sta logika radi. To se odnosi na varijablu Vas_znak, na niz "Ovan" da vidi da li su oni jednaki. Ako nisu varijabla Vas_znak nije jednaka nizu "Taurus", a takodje nije jednaka ni nizu "Blizanac", itd., a zatim se ispisuje poruka. Setite se da! = Znaci "nije jednako". Idemo "igramo kompjuter" pretpostavljajuci da Vas_znak jeste niz "jogurt". Kompjuter ce prvo da uradi uporedjivanje, pogledace vrednost za Vas_znak, smatrajjuci da je "jogurt", te ce ga uporediti sa "Ovnom":

if "Yogurt" != "Aries" and ...

Us vakom slucaju to je istina, niz "jogurt" i "Ovan" jesu razliciti. Odatle sledi da bismo dobili istu stvar sa sledecim natpisom, kao i da cemo ponovo pronaci da "jogurt" nije isto sto i "Bik", i tako dalje. Za svih dvanaest uspesnih uporedjivanja, korisniku ce biti napisano obavestenje. Sledeca linija je:

stop()

To govori kompjuteru da prestane da prikazuje ??program. Mi ne zelimo da nastavimo. U boljem program ne bismo prestajali, vec bismo se vratili i pitali za Vaš znak opet, ali to ovde necemo uraditi da ne bismo dodatno komplikovali.

Ako znak ima vrednost "Libra", poredjenje nece uspeti:

... and your_sign != "Libra" and ...

To biva pretvoreno u:

... and "Libra" != "Libra" and ...

ali to nije istina " Vaga" nije nije jednaka "Libra". Dakle, cela ako izjava bi bila lazna, poruka nece biti istampana, ali ne bismo zaustavili program. Zapamtite da ako imate puno odvojenih stvari da sve te stvari moraju biti istinite da bi smo uspeli da uradimo ono sto zelimo. Ako niste upoznati s pravilima logike, pogledajte pazljivo gore pomenutu ‘’ako’’ izjavu ponovno.

Vratimo se nasem programu. Ovo bismo stavili odmah nakon dobijanja znaka od korisnika:

print "What's your sign?"
your_sign = input()
if your_sign != "Aries" and your_sign != "Taurus" and \
    your_sign != "Gemini" and your_sign != "Cancer" and \
    your_sign != "Leo" and your_sign != "Virgo" and \
    your_sign != "Libra" and your_sign != "Scorpio" and \
    your_sign != "Sagittarius" and your_sign != "Capricorn" and \
    your_sign != "Aquarius" and your_sign != "Pisces":

    print "That's not a valid sign."
    stop()
if your_sign == "Aries":
    print "Assertive, impulsive, defensive"
...

Odlicno, sada nas program bolje radi:

What's your sign?
Elbow
That's not a valid sign.

Naravno ne zaboravite dodati ovaj znak na niz programa:

...
print "What's your mate's sign?"
mate_sign = input()
if mate_sign != "Aries" and mate_sign != "Taurus" and \
    mate_sign != "Gemini" and mate_sign != "Cancer" and \
    mate_sign != "Leo" and mate_sign != "Virgo" and \
    mate_sign != "Libra" and mate_sign != "Scorpio" and \
    mate_sign != "Sagittarius" and mate_sign != "Capricorn" and \
    mate_sign != "Aquarius" and mate_sign != "Pisces":

    print "That's not a valid sign."
    stop()
if mate_sign == "Aries":
    print "Assertive, impulsive, defensive"
...

Ipak, nesto u ovom resenju nije kako treba. Jedan od vaznih ciljeva ove knjige je da Vas nauci kako da napisete dobar kod, a ne samo funkcionalna broj. Gore pomenuta ‘’ako’’ izjava nije dobra. Ovim ne mislim reci da izgleda ruzno. Treba videti koja je vrednost, i opet kasnije ispisati odgovarajuci opis. To bi trebalo biti znak upozorenja za nas. Trebali bi imati bolji nacin da sve ovo napisemo, tako da mi samo treba da uradimo jedno poredjenje. Uostalom, ako se nista ne prikazuje, znak je nevazeci. Trebali bismo biti u mogucnosti da bi mozemo da utvrdimo tacnost znaka.

U ranijem poglavlju smo koristili else izjavu koja radi po defaultu, u sledecem slucaju theif izjava nije nista:

if age < 25:
    print "You're young."
else:
    print "You're mature!"

Ako je znak bila samo jedna zvezdica, onda bismo tu mogli koristiti tu istu tehniku da bismo resili nas problem:

if your_sign == "Aries":
    print "Assertive, impulsive, defensive"
else:
    print "That's not a valid sign."
    stop()

Ako smo imali dva znaka, mozemo napisati:

if your_sign == "Aries":
    print "Assertive, impulsive, defensive"
else:
    if your_sign == "Taurus":
        print "Resourceful, thorough, indulgent"
    else:
        print "That's not a valid sign."
        stop()

(Stop i raditi logicki, ako nam nije jasno sta se desavaa.) Tri znaka:

if your_sign == "Aries":
    print "Assertive, impulsive, defensive"
else:
    if your_sign == "Taurus":
        print "Resourceful, thorough, indulgent"
    else:
        if your_sign == "Gemini":
            print "Logical, inquisitive, fast"
        else:
            print "That's not a valid sign."
            stop()

To sve ce raditi veoma dobro, ali za svaki znak treba da uvucemo desno. Ss dvanaest znakova cemo biti na desnoj strani ekrana. To je cest problem, tako da jezik daje izjavu pod nazivom "else if", napisano skraceno kao Elif. Navedena tri znaka ce biti zapisano ovako:

if your_sign == "Aries":
    print "Assertive, impulsive, defensive"
elif your_sign == "Taurus":
    print "Resourceful, thorough, indulgent"
elif your_sign == "Gemini":
    print "Logical, inquisitive, fast"
else:
    print "That's not a valid sign."
    stop()

Mozete videti kako ce se ovo prosiriti na dvanaest znakova. U stvari mozemo uzeti naseih izvornih dvanaest ‘’ako’’ izjava, napisati "El" ispred svih, i dodati nas else na kraju. Sta ce se dogoditi? Prva ‘’ako’’ izjava ce biti proverena. Ako je to uspesno, prva izjava za stampanje ce biti izdata, a program ce nastaviti sa radom i nakon cele deonice. Zapamtite da se elif zalaze za "drugo ako", pa buduci da je sve uspesno, nema potrebe za pokretanje "drugog" dela, a mi cemo stoga preskociti ostatak.

Ali ako prvi ne uspe, onda cemo provjeriti drugi, onda treci, i tako dalje, sve dok ne pronadjemo onaj koji odgovara. Ako nista ne odgovara, onda cemo prikazati poruku o pogresci. Zato treba da promenimo celu stvar i naravno da ne zaboravimo ponovo da azuriramo odredjene delove. Evo sada celog programa:

print "What's your sign?"
your_sign = input()
if your_sign == "Aries":
    print "Assertive, impulsive, defensive"
elif your_sign == "Taurus":
    print "Resourceful, thorough, indulgent"
elif your_sign == "Gemini":
    print "Logical, inquisitive, fast"
elif your_sign == "Cancer":
    print "Protective, sensitive, clinging"
elif your_sign == "Leo":
    print "Generous, proud, theatrical"
elif your_sign == "Virgo":
    print "Practical, efficient, critical"
elif your_sign == "Libra":
    print "Co-operative, fair, lazy"
elif your_sign == "Scorpio":
    print "Passionate, sensitive, anxious"
elif your_sign == "Sagittarius":
    print "Free, straightforward, careless"
elif your_sign == "Capricorn":
    print "Prudent, cautious, suspicious"
elif your_sign == "Aquarius":
    print "Democratic, unconventional, detached"
elif your_sign == "Pisces":
    print "Imaginative, sensitive, distracted"
else:
    print "That's not a valid sign."
    stop()
print "What's your mate's sign?"
mate_sign = input()
if mate_sign == "Aries":
    print "Assertive, impulsive, defensive"
elif mate_sign == "Taurus":
    print "Resourceful, thorough, indulgent"
elif mate_sign == "Gemini":
    print "Logical, inquisitive, fast"
elif mate_sign == "Cancer":
    print "Protective, sensitive, clinging"
elif mate_sign == "Leo":
    print "Generous, proud, theatrical"
elif mate_sign == "Virgo":
    print "Practical, efficient, critical"
elif mate_sign == "Libra":
    print "Co-operative, fair, lazy"
elif mate_sign == "Scorpio":
    print "Passionate, sensitive, anxious"
elif mate_sign == "Sagittarius":
    print "Free, straightforward, careless"
elif mate_sign == "Capricorn":
    print "Prudent, cautious, suspicious"
elif mate_sign == "Aquarius":
    print "Democratic, unconventional, detached"
elif mate_sign == "Pisces":
    print "Imaginative, sensitive, distracted"
else:
    print "That's not a valid sign."
    stop()

Azuriranje moze biti nezgodno. Svaki put kad smo došli do poboljšanja u kodu za Vaš znak, moramo to uciniti za Mate znak. Kod izgleda gotovo identicno, osim varijable your_sign koja je zamenjena sa mate_sign. Šta je još gore je cinjenica da rizikujete pojavu bugova svaki put kada se menja drugi kod. A šta ako se prikazuju znakovi za 15 ljudi? Želite li onda da menjate 15 komplikovanih delove koda? Opet, zvono upozorenja! Ne trabamo imati imati toliko kodova dupliranja. Mora da postoji neki elegantniji nacin da to ucinite. Konacno, možemo doci do ovog poglavlja, funkcije.

Funkcija je deo koda koji pišete jednom, ali koriste na mnogim mestima u svom programu. U našem astrološkom programu, želeli bismo da koristimo ceo niz ‘’ako’’ dva puta, ali zbog prakticnosti želeli bismo ga napisati samo jednom. Pocnimo s jednostavnijim primerom. Ovaj primer nece ilustrovati prednosti funkcije, vec samo njihove sintakse i oblike. Onda se možemo vratiti na naše složenije primjere gore. Hajde da napisemo program za prikazivanje imen našeg pas tri puta:

print "My dog's name is Bort."
print "My dog's name is Bort."
print "My dog's name is Bort."

To je kod dupliranja, pa neka taj kod stoji u funkciji. To cemo ovako uraditi:

def display_the_name_of_my_dog():
    print "My dog's name is Bort."

Def je skracenica za "define (funkcija)". Mi cemo reci kompjuteru kako da opise ono što ova funkcija treba da uradi. Zatim, dolazimo do imena funkcije. To može biti šta god Vi želite, ali treba opisati ono što ta funkcija radi. (Ime funkcije je malo kao ime varijable, osim što je funkcija nazvana po onome što cini.) Ovde smo izabrali "display_the_name_of_my_dog". Skup zagrada nakon imena je potreban, ali o tome cemo govoriti kasnije. Nakon toga na red dolazi ono što se zove telo funkcije. To je ono što funkcija radi, tj. kod koji želite da Vas kompjuter pokrene kada koristite funkciju. Telo je razdeljeno, baš kao sto ‘’ako’’ izjava funkcionise.

Kada želimo upotrebiti funkciju, pišemo svoje ime nakon cega sledi zagrada:

display_the_name_of_my_dog()

Zapravo cemo morati da stavimo crtu tri puta jer smo hteli prikazati ime tri puta:

display_the_name_of_my_dog()
display_the_name_of_my_dog()
display_the_name_of_my_dog()

Kladenje u zagradama se odnosi na one u funkciji definiciji, i opet cu ih objasniti kasnije. Kada koristimo funkciju kao što je ova, možemo reci da smo pozvali funkciju. To je nešto poput poziva nekome, sa molebom da neko nešto ucini. Videli smo nekoliko funkcija poziva pre. Mogli smo takodje videti input funkciju:

age = input()

i zaustavljanje funkcije. U svakom slucaju nesto je ucinjeno, iako nije sve bilo definisano. Ovde cemo definisati nasu vlastitu funkciju. Svaki put kada se pozviva funkciju, kompjuter pogleda gore pomenutu funkciju po imenu, pronalazi telo koje je dao za njega zbog izjave u telu. Telo može imati mnogo izjava, a sve ce se pokrenuti svaki put kada se funkcija pozove. To izgleda kao da se mini-program nalazi unutar veceg programa.

Funkcije su korisne jer smanjuju broj dupliranja. Neku stvar možete napisati samo jednom umesto mnogo puta. No, to nije njihova jedina prednost, postoji tu jos nesto Na primer, mi ne bismo bili u mogucnosti da ih koristimo za naš astrološki program, jer kod nije identican: ime varijable je drugacije. Funkcije su sustisnski korisne samo kada imaju parametre.

fFunkcija je parametar varijable koju zadaju sama funkciju na pocetku. Normalno u programu morate definisati svaku varijablu pre nego što pocnete da ga koristiti. Parametar je varijabla koja je vec postavljena kada funkcija pocinje. Možete ga dati kad pozivate funkciju. U našem pojednostavljenom primeru, recimo da naš pas ime nije uvek bio "Bort", i zato hteli funkciju za prikaz raznih imena. Zatim, zelimo promeniti definiciju da izgleda ovako:

def display_the_name_of_my_dog(name):
    print "My dog's name is " + name + "."

To je ono za sta nam sluze zagrade. To je mesto gde dolaze parametri. Kada pozovete funkciju, šta ce osigurati vrednost za te parametre:

display_the_name_of_my_dog("Bort")
display_the_name_of_my_dog("Milou")
display_the_name_of_my_dog("Rocky")

Idemo pažljivo da pregledamo ono što se ovde dogada. U definiciji, Vi ste govorili kompjuteru koje funkcije želite definisati. U telu funkcije možete koristiti ime kao varijablu, u ovom slucaju ga koristite zajedno s nekim tekstom. (Setite + sa nizovima je ulancavanje, ili prikazivanje niti jedne za drugom.)

Kad mi pozivamo funkciju po prvi put, mi zadajemo niz "Bort". To poziva funkciju, i postavlja varijablu ime u nizu "Bort", ali samo za taj jedan poziv. Kada je funkcija uradjena, nastavljamo naš program na drugoj liniji, pozivajuci funkciju, ali opet sa imenom postavljenim na "Milou". To se dogada i treci put sa imenom "Rocky". Kada smo pokrenuli naš program vidimo ovo:

My dog's name is Bort.
My dog's name is Milou.
My dog's name is Rocky.

Funkcija može imati bilo koji broj argumenata, koji su odvojeni zarezima:

def display_the_name_of_my_pet(pet, name):
    print "My " + pet + "'s name is " + name + "."

display_the_name_of_my_pet("dog", "Bort")
display_the_name_of_my_pet("cat", "Milou")
display_the_name_of_my_pet("mouse", "Rocky")

Ovo ce biti prikazano:

My dog's name is Bort.
My cat's name is Milou.
My mouse's name is Rocky.

Imajte na umu da kada nazovete funkciju, morate dati što više parametara (odvojene zarezima) kao što stoji u definiciji. Takode, imajte na umu da morate definisati funkciju pre nego što je pozovete. To je kao postavljanje varijable pre nego što pocnete da je koristite.

Dakle, opet se vracamo na naš astrološki program. Kako cemo koristiti funkciju tako da možemo da izbegnem ažuriranje oba dela programa? Mozemo staviti ‘’ako’ odeljak u funkciju, kao što je ovaj:

def display_sign_information(sign):
    if sign == "Aries":
        print "Assertive, impulsive, defensive"
    elif sign == "Taurus":
        print "Resourceful, thorough, indulgent"
    elif sign == "Gemini":
        print "Logical, inquisitive, fast"
    elif sign == "Cancer":
        print "Protective, sensitive, clinging"
    elif sign == "Leo":
        print "Generous, proud, theatrical"
    elif sign == "Virgo":
        print "Practical, efficient, critical"
    elif sign == "Libra":
        print "Co-operative, fair, lazy"
    elif sign == "Scorpio":
        print "Passionate, sensitive, anxious"
    elif sign == "Sagittarius":
        print "Free, straightforward, careless"
    elif sign == "Capricorn":
        print "Prudent, cautious, suspicious"
    elif sign == "Aquarius":
        print "Democratic, unconventional, detached"
    elif sign == "Pisces":
        print "Imaginative, sensitive, distracted"
    else:
        print "That's not a valid sign."
        stop()

Mi smo koristili genericki naziv znak za parametar umesto your_sign ili mate_sign jer ne znamo ciji je znak. Ovo je samo genericka funkcija za prikaz informacija za bilo kakav znak.

Naš glavni program samo je postao puno jednostavniji:

print "What's your sign?"
your_sign = input()
display_sign_information(your_sign)

print "What's your mate's sign?"
mate_sign = input()
display_sign_information(mate_sign)

Ceo ovaj deo, sada možemo napisati samo jedanput, ali ga mi koristimo dva puta u našem programu. Postoje i druge prednosti. Na primer, ako deo sada ima ime (display_sign_information), to ime nam pomaže da objasnimo znacenje. Neko citanje koda možete videti na imenu funkcije i brzo ce shvatiti o cemu se radi, umesto da procita kod. Još jedna prednost je da je naš glavni program puno kraci i jasniji. Možemo pogledati tih šest linija i brzo shvatiti o cemu se radi. Ranije smo morali procitati preko 58 linija kako bismo dobili visok nivo pregleda programa.

Sad mozemo napraviti da izlaz iz ovog programa bude malo lepsi. Umesto da samo dodajemo neke prideve, možemo napisati lepšu recenicu, kao što je:

Scorpio people are passionate, sensitive, anxious.

Možemo promeniti sve ispise izveštaja. Dobra vest je da, nakon što je kod stavljen u funkciju, mi bi trebao da promenimo 12 redova umesto 24. Loša vest je da ponavljanje promena na ovaj nacin zahteva samo jednu liniju promene, a ne 12. Dvanaest print izjave su znak da mi ne pišemo naš kod na veoma elegantan i fleksibilan nacin. Možemo ‘’refactor’’ kod staviti kao pridjev u varijablu, kao što je ova:

def display_sign_information(sign):
    if sign == "Aries":
        adjectives = "assertive, impulsive, defensive"
    elif sign == "Taurus":
        adjectives = "resourceful, thorough, indulgent"
    elif sign == "Gemini":
        adjectives = "logical, inquisitive, fast"
    elif sign == "Cancer":
        adjectives = "protective, sensitive, clinging"
    elif sign == "Leo":
        adjectives = "generous, proud, theatrical"
    elif sign == "Virgo":
        adjectives = "practical, efficient, critical"
    elif sign == "Libra":
        adjectives = "co-operative, fair, lazy"
    elif sign == "Scorpio":
        adjectives = "passionate, sensitive, anxious"
    elif sign == "Sagittarius":
        adjectives = "free, straightforward, careless"
    elif sign == "Capricorn":
        adjectives = "prudent, cautious, suspicious"
    elif sign == "Aquarius":
        adjectives = "democratic, unconventional, detached"
    elif sign == "Pisces":
        adjectives = "imaginative, sensitive, distracted"
    else:
        print "That's not a valid sign."
        stop()
    print adjectives

Ovde su pridevi stavljeni u varijablu, svako prvo slovo je prilagodjeno (tako da se može koristiti u recenici), a dvanaest print izjava je prebaceno na kraj. U svom ‘’Refactoring’’ kodu na ovaj nacin lako mogu promeniti ono što je izmjeno u jednoj zadnjoj liniji:

    print sign + " people are " + adjectives + "."

Ako kasnije želite da ga ponovno promeniti, to mozete veoma lako uarditi. U stvari, možda glavni program želi da ima neku vrstu kontrole nad onim što se prikazuje. Cak i lepše stvari ce biti napisane kao:

You are democratic, unconventional, detached.

i:

Your mate is passionate, sensitive, anxious.

Postoje dva nacina za to. Jedna opcija je dodati još jedan parametar našoj funkciji koja odreduje kako recenica prikazuje ono sto je napisano:

def display_sign_information(sign, prefix):
    if sign == "Aries":
        adjectives = "assertive, impulsive, defensive"
    elif sign == "Taurus":
        adjectives = "resourceful, thorough, indulgent"
    elif sign == "Gemini":
        adjectives = "logical, inquisitive, fast"
    elif sign == "Cancer":
        adjectives = "protective, sensitive, clinging"
    elif sign == "Leo":
        adjectives = "generous, proud, theatrical"
    elif sign == "Virgo":
        adjectives = "practical, efficient, critical"
    elif sign == "Libra":
        adjectives = "co-operative, fair, lazy"
    elif sign == "Scorpio":
        adjectives = "passionate, sensitive, anxious"
    elif sign == "Sagittarius":
        adjectives = "free, straightforward, careless"
    elif sign == "Capricorn":
        adjectives = "prudent, cautious, suspicious"
    elif sign == "Aquarius":
        adjectives = "democratic, unconventional, detached"
    elif sign == "Pisces":
        adjectives = "imaginative, sensitive, distracted"
    else:
        print "That's not a valid sign."
        stop()
    print prefix + " " + adjectives + "."

Naš glavni program bi onda izgledao ovako:

print "What's your sign?"
your_sign = input()
display_sign_information(your_sign, "You are")

print "What's your mate's sign?"
mate_sign = input()
display_sign_information(mate_sign, "Your mate is")

Ali, što ako glavni program želi uciniti nešto drugo s pridevima? Možda želi da prikaze oba skupa zajedno, kao što je ovaj:

You are democratic, unconventional, detached; they are passionate, sensitive, anxious.

Tada bi bilo nezgodno raditi s funkcijom. U stvari funkcija je prilicno ogranicena za koriscenje jer ona ima pretpostavku o tome kako glavni program želi da rezultati budu prikazani. Uopsteno glavni program treba da definise sta su pridevi, a zatim treba da ucini sve sto je inace hteo da uradi sa njima. Evo kako se to radi, opet s pojednostavljenim primerom:

def get_square_of_number(x):
     return x * x

width = input()
area = get_square_of_number(width)
print area

Mi smo definisali funkciju koja se zove get_square_of_number, koji traje jedan parametar x. Ona izracunava kvadrat x (množenjem), i vraca se da da vrednost u glavnom programu, koristeci povratnu izjavu. Ovo je obrnuti proces od parametra. Uz parametar, glavni program šalje vrednost funkcije, funkcija se gubi i šalje vrednost nazad u glavni program. U glavnom programu, vracena vrednost se pojavljuje na mestu gde je funkcija zove. U primeru gore ono što je korisnik upisao pokazuje da je na mestu "ulaz ()", što znaci da je dodeljena širina varijable. Zatim vrednost širine je prošla get_square_of_number funkciju kao parametar (iako unutar funkcije to se nalazi u varijabli x). Vracena vrednost (kvadrat x) se onda pojavljuje u glavnom programu, a dobija dodeljenu oblast koja se potom prikazuje.

U našem astrološkog programu možemo imati funkciju vracanja prideva umesto da ih ispisujemo:

def get_sign_information(sign):
    if sign == "Aries":
        adjectives = "assertive, impulsive, defensive"
    elif sign == "Taurus":
        adjectives = "resourceful, thorough, indulgent"
    elif sign == "Gemini":
        adjectives = "logical, inquisitive, fast"
    elif sign == "Cancer":
        adjectives = "protective, sensitive, clinging"
    elif sign == "Leo":
        adjectives = "generous, proud, theatrical"
    elif sign == "Virgo":
        adjectives = "practical, efficient, critical"
    elif sign == "Libra":
        adjectives = "co-operative, fair, lazy"
    elif sign == "Scorpio":
        adjectives = "passionate, sensitive, anxious"
    elif sign == "Sagittarius":
        adjectives = "free, straightforward, careless"
    elif sign == "Capricorn":
        adjectives = "prudent, cautious, suspicious"
    elif sign == "Aquarius":
        adjectives = "democratic, unconventional, detached"
    elif sign == "Pisces":
        adjectives = "imaginative, sensitive, distracted"
    else:
        print "That's not a valid sign."
        stop()

    return adjectives

Mi smo to preimenovali u funkciju kako bi bilo jasno da se funkcija koristi za dobijanje prideva povezanih sa natpisom. Imajte na umu da naš korišcenje ‘’the adjectives’’ varijable ranije vrlo lako izvrsava ovu promenu. Mi samo menjamo prvi i poslednji red u funkciji. Glavni program izgleda ovako:

print "What's your sign?"
your_sign = input()
your_adjectives = get_sign_information(your_sign)
print "You are " + your_adjectives + "."

print "What's your mate's sign?"
mate_sign = input()
mate_adjectives = get_sign_information(mate_sign)
print "Your mate is " + mate_adjectives + "."

To je puno fleksibilnije. Umesto two print izjave bismo mogli imati ovo:

print "You are " + your_adjectives + "; they are " + mate_adjectives + "."

Ipak, necemo to uciniti. Umesto toga, mi cemo primetiti da su ovih osam linija sadrže mnogo dupliranja. Prve cetiri linije su gotovo identicni do poslednje cetiri. Hajde da ih stavimo u funkciju:

def display_sign_information(whose, prefix):
    print "What's " + whose + " sign?"
    sign = input()
    adjectives = get_sign_information(sign)
    print prefix + " " + adjectives + "."

Primetite da funkcija može pozvati i druge funkcije. Glavni program je sada:

display_sign_information("your", "You are")
display_sign_information("your mate's", "Your mate is")

Kod dupliranje je smanjen! Mi sada mozemo pitati o bilo kojem broju ljudi dodavanjem samo jedne linij našem glavnom programu. To je puno bolje nego da imamo duple linije (29 i potreba za promenom svaki put kada dolazi do poboljšanja). Visoko nivo strukture našeg programa je odmah uocljiv: Idemo pitati o znakove dvoje ljudi. Proces postavljanja je takode ocigledan: Mi postavljamo pitanje, dobijamo odgovor, dobijamo pridjeve na osnovu tog odgovora, i ispisujemo te pridjeve. Naš kod je odlican!

Funkcije razbijaju programe u male komade. Oni su korisni, jer oni smanjuju broj dupliranja, ali oni takode pomažu da razmislimo o tome što program radi, kako se to strukturira, i šta su njegovi važni procesi. Evo našeg konacnog programa:

def get_sign_information(sign):
    if sign == "Aries":
        adjectives = "assertive, impulsive, defensive"
    elif sign == "Taurus":
        adjectives = "resourceful, thorough, indulgent"
    elif sign == "Gemini":
        adjectives = "logical, inquisitive, fast"
    elif sign == "Cancer":
        adjectives = "protective, sensitive, clinging"
    elif sign == "Leo":
        adjectives = "generous, proud, theatrical"
    elif sign == "Virgo":
        adjectives = "practical, efficient, critical"
    elif sign == "Libra":
        adjectives = "co-operative, fair, lazy"
    elif sign == "Scorpio":
        adjectives = "passionate, sensitive, anxious"
    elif sign == "Sagittarius":
        adjectives = "free, straightforward, careless"
    elif sign == "Capricorn":
        adjectives = "prudent, cautious, suspicious"
    elif sign == "Aquarius":
        adjectives = "democratic, unconventional, detached"
    elif sign == "Pisces":
        adjectives = "imaginative, sensitive, distracted"
    else:
        print "That's not a valid sign."
        stop()

    return adjectives

def display_sign_information(whose, prefix):
    print "What's " + whose + " sign?"
    sign = input()
    adjectives = get_sign_information(sign)
    print prefix + " " + adjectives + "."

display_sign_information("your", "You are")
display_sign_information("your mate's", "Your mate is")

Uporedite to s programom koji smo imali pre nego što smo ga prekinuli u funkcijama:

print "What's your sign?"
your_sign = input()
if your_sign == "Aries":
    print "Assertive, impulsive, defensive"
elif your_sign == "Taurus":
    print "Resourceful, thorough, indulgent"
elif your_sign == "Gemini":
    print "Logical, inquisitive, fast"
elif your_sign == "Cancer":
    print "Protective, sensitive, clinging"
elif your_sign == "Leo":
    print "Generous, proud, theatrical"
elif your_sign == "Virgo":
    print "Practical, efficient, critical"
elif your_sign == "Libra":
    print "Co-operative, fair, lazy"
elif your_sign == "Scorpio":
    print "Passionate, sensitive, anxious"
elif your_sign == "Sagittarius":
    print "Free, straightforward, careless"
elif your_sign == "Capricorn":
    print "Prudent, cautious, suspicious"
elif your_sign == "Aquarius":
    print "Democratic, unconventional, detached"
elif your_sign == "Pisces":
    print "Imaginative, sensitive, distracted"
else:
    print "That's not a valid sign."
    stop()
print "What's your mate's sign?"
mate_sign = input()
if mate_sign == "Aries":
    print "Assertive, impulsive, defensive"
elif mate_sign == "Taurus":
    print "Resourceful, thorough, indulgent"
elif mate_sign == "Gemini":
    print "Logical, inquisitive, fast"
elif mate_sign == "Cancer":
    print "Protective, sensitive, clinging"
elif mate_sign == "Leo":
    print "Generous, proud, theatrical"
elif mate_sign == "Virgo":
    print "Practical, efficient, critical"
elif mate_sign == "Libra":
    print "Co-operative, fair, lazy"
elif mate_sign == "Scorpio":
    print "Passionate, sensitive, anxious"
elif mate_sign == "Sagittarius":
    print "Free, straightforward, careless"
elif mate_sign == "Capricorn":
    print "Prudent, cautious, suspicious"
elif mate_sign == "Aquarius":
    print "Democratic, unconventional, detached"
elif mate_sign == "Pisces":
    print "Imaginative, sensitive, distracted"
else:
    print "That's not a valid sign."
    stop()

Arrays

U poslednjem poglavlju smo imali dugi niz koda koji je izgledao ovako:

if sign == "Aries":
    adjectives = "assertive, impulsive, defensive"
elif sign == "Taurus":
    adjectives = "resourceful, thorough, indulgent"
elif sign == "Gemini":
    adjectives = "logical, inquisitive, fast"
elif sign == "Cancer":
    ...

Ceo ako / ostalo niz je preopširan, ponavlja se i zamorno je pisati ga. To treba da znaciti da kompjuter treba to da uradi raditi za Vas, tj. umesto Vas. Ono što je potrebno ovde je niz. Možete koristiti niz da biste povezali jednu stvar s drugom. U ovom slucaju želimo povezati niz "Ovan" sa nizom "uporan, impulsivan, odbramben ". Takode želimo povezati niz "Taurus" s nizom "snalažljiv, temeljan, odan, strpljiv, sklon uživanju". I tako dalje za ostalih 10 znakova.

Nakon što ste napravili 12 skupova, možete samo pitati kompjuter što se povezuje sa nizom "Blizanaca", i dobicete prideve za isti. Niz je varijabla. Do sada smo se bavila varijablama koje cuvaju brojeve (kao 25) i stvari (kao što je "jogurt"). Možete sacuvati niz u varijabli. Recimo da se naše polje zove znaci i želimo dati komandu kompjuteru koja se odnosi na Gemini nizove. Mi bi smo ga pisali ovako:

signs["Gemini"] = "logical, inquisitive, fast"

Doduše, ova sintaksa izgleda cudno, ali to ima smisla kada pocnete koristiti polja više. Ovde cemo reci da u polju znakovi, želimo povezati niz "Blizanci" s nizom "logicki, radoznao, brz". Tada kao da pravimo posebnu varijablu ovako:

signs_gemini = "logical, inquisitive, fast"

To bi bila normalna varijabla koja se zove adjective_gemini i ima vrednost "logicno, radoznao, brz". Prednost koriscena niza je da, kasnije, kada želite pogledati prideve za znak, možete to i uciniti:

print "What's your sign?"
sign = input()
adjectives = signs[sign]
print adjectives

Možete dobiti niz od korisnika, koristeci "ulaz ()" funkcije, i staviti rezultate u varijable sign. Vi onda pogledate niz povezan s tim nizom u nizu znakova, i stavite rezultat u varijablu prideva. To je prilicno suptilno. Obicno kada niz cuvamo u varijabli, kao što je ovaj:

To je prilicno suptilno. Obicno kada niz cuvamo u varijabli, kao što je ovaj:

signs_gemini = "logical, inquisitive, fast"

možete dobiti samo vrednost tako sto cete biti upuceni na varijablu po imenu, kao što je ova:

print signs_gemini

Ime varijable je postavljeno kada pišete program. Ako korisnik nije Blizanci, onda ova izjava nece prikazati tacnu stvar. To je razlog zašto moramo da pratimo IF / else naredbe: kako bi bili sigurni smo prikazali pravu varijablu.

Sa poljima, treba nam samo jedna varijabla. Umesto povezivanja prideve sa varijablom koja se zove signs_gemini, mi ih povezujemo s nizom "Gemini" u polju znakova. Cinjenica da smo pomocu niza sa sadržajem "Gemini" to uradili je važan deo. Buduci da smo postavili povezanost sa nizom, to znaci da možemo dobiti vrednost koriscenjem niza, a niz smo dobili od korisnika. Dakle, nema više, ako / else naredbi.

Možda bismo trebali napisati jedan manji program kako bismo ilustrirovali kako polja rade. Hajde da napisemo program koji, s obzirom na kamen, papir ili makaze, govori šta pobeduje. Bez polja bismo ga pisali ovako:

print "What object?"
object = input()
if object == "rock":
    rule = "Breaks scissors."
elif object == "paper":
    rule = "Covers rock."
elif object == "scissors":
    rule = "Cuts paper."
print rule

Sa poljima bismo ga pisali ovako:

rules["rock"] = "Breaks scissors."
rules["paper"] = "Covers rock."
rules["scissors"] = "Cuts paper."

print "What object?"
object = input()
rule = rules[object]
print rule

Prvi deo postavlja skupove u polju pravila. Postoje tri skupa, jedan za svako pravilo. Tada smo dobili naziv objekta od korisnika, pogledali pravilo povezano s tim objektu, i to istampali. Idemo "igrati kompjuter". U prvom redu, mi cemo napraviti nove varijable zvane pravila, koja ce biti niz. U njemu smo povezali niz "kamen" sa "lomi makaze". (Skup je samo jedan nacin. Možete samo otici iz prvog niza u drugi.) Drugi i treci red rade na isti nacin. Nakon trece linije, niz pravila sadrži tri skupa. Nakon što smo dobili objekt od korisnika, dolazimo do ove linije:

rule = rules[object]

Recimo da objekat varijabla sadrži niz "papir". U ovoj liniji cemo tražeci kompjuter pronaci nizove pravila, i vidjeti da li je niz "papir" ikada bio povezan s bilo cime. U ovom slucaju kompjuter pronalazi (u memoriji) sta je u stvari niz "Rad" i da je bio povezan s nizom "pokriva kamen." To se stavlja u varijablu "vladavine", a u sljedecem redu stampamo.

Druga verzija ovog programa je da je koriscenje niza mnogo lepše. To je cišce, krace i lakše za citanje. Možete pogledati prve tri linije kako bi videli pravila. Ne trebate slediti neadekvatan niz sa ako / else naredbama. Iz tih razloga je dobro da se koristi niz. Naravno, tu ima i drugih prednosti. Uz niz ako / else naredbi, niz je postavljen u kamenu (hard-coded) kad pišete program. Pa ipak, niz je samo varijabla kao i svaka druga, tako da se može postaviti kada se program pokrene! Teska pravila o kodiranju možemo dobiti od korisnika. Evo programa koji radi upravo to:

while true:
    print "New rule. What object?"
    object = input()

    if object == "done":
        break

    print "What rule?"
    rule = input()

    rules[object] = rule

print "What object?"
object = input()
rule = rules[object]
print rule

Prvi deo ovog programa (while petlja) je novi. Drugi deo je identican programu koji smo imali gore. Tako smo zamenili tri linije koje oznacavaju tri pravila u while petlji. Zatim cemo pogledati taj kod, jer ono što radi je prilicno važno za razumevanje moci programiranje i polja.

Mi smo ranije videli dok petlju, ovako:

while count >= 1:
    ...

To je znacilo, "Da li razdvojene izjave kao vrijednosti broja varijable jesu vece ili jednake sa jedan." Strogo govoreci, ono što je stvarno receno, "Nemojte razdvojene izjave kao sto je formula broj> = 1 su tacne "Evo naša while izjava izgleda ovako:

while true:
    ...

To znaci, "Nemojte razdvajati izjave dokle god su tacne/istinite." Formula istina je uvek istina. To se zove beskonacna petlja. Mi cemo se baviti "beskonacnim" delom kasnije.

Idemo sada da pogledamo razdvojene izjave i pokušacemo da napravimo novo pravilo. Pravila sadrže dva dela, niz (string) i druge predmete (još jedan niz). Moramo dobiti informacije i od korisnika kako bi izgradili naš skup pravila. Prvo smo dobili objekt:

    print "New rule. What object?"
    object = input()

Za sada cemo preskociti ako izjavu. Mi smo tada dobili pravilo:

    print "What rule?"
    rule = input()

i mi povezujemo nizo:

    rules[object] = rule

Ta zadnja linija je baš kao i linije koje smo imali pre:

rules["rock"] = "Breaks scissors."

osim da su nam žice date od strane korisnika, umesto da budu tvrdo kodirane u programu. Nakon ovih nizova dolazimo do kraja od razdvojenih izjava, a while petlja se vraca na vrh opet, zauvek. Mi zapravo ne želimo da se ovo degadja u nedogled jer nikada necemo doci do drugog dela programa gde smo iskoristiti pravila polja. Dakle, možemo reci da ako korisnik unese niz "radi", onda cemo zaustaviti petlju i premestiti je u naš program. To je ako izjava odmah nakon dobijanja objekta:

    if object == "done":
        break

Ako objekat koji je korisnik uneo jeste niz "ucinjeno"onda razdvojite izjavu. Ovu izjavu nismo videli pre. To znaci, "Stopiraj petlju upravo sada, idi na izjave odmah." To razbija petlju. To je kako smo dobili resenje problema sa beskonacnim petljama. Možete koristiti razdvojene izjave.

Možda mislite da je cudno da postavite beskonacnu petlju, a zatim je razbijete na pola puta. To je zato što je while petlja postavljen za testiranje stanja (kao broj> = 1) na vrhu petlje. Tada ceo set razdvojenih izjava treba ponovo proveriti. While loop se može zaustaviti na vrhu petlje. U našem slucaju ne znamo šta je to sto želimo da prestane kada je korisnik uneo "ucinjeno" za niz. Izveštaji postavljaju proveru uslova. Tako falsifikovanje whileloop ide zauvek.

Možemo pokrenuti program i upisati bilo koji skup pravila koja želimo:

New rule. What object?
bear
What rule?
Mauls ninja.
New rule. What object?
cowboy
What rule?
Shoots bear.
New rule. What object?
ninja
What rule?
Dodges bullets of cowboy.
New rule. What object?
done
What object?
ninja
Dodges bullets of cowboy.

Pokušajte da sa ako / ostalo nizu!

Oni su osnove polja. Oni su nešto poput baze podataka koje možete izgraditi u letu, a zatim koristiti kasnije. Postoji još nekoliko pojedinosti o kojima treba reci nesto. Prvo, šta se dogada kad pogledate nešto što nikada nije bio stavljeno u niz? Naš izvorni niz primera je izgledao ovako:

rules["rock"] = "Breaks scissors."
rules["paper"] = "Covers rock."
rules["scissors"] = "Cuts paper."

print "What object?"
object = input()
rule = rules[object]
print rule

Što ako korisnik unese string "patka". To nikada nije blio povezano sa bilo u array rules. Šta treba uciniti kada kompjuter pokušava da pokrene ovu liniju:

rule = rules[object]

i objekt promjenljive je niz "patka"? To zavisi od jezika. Neki jezici zaustavljaju program i pokazuju poruku o pogrešci, a neki samo postavljaju pravilo za varijablu sa praznim nizom. U nekim jezicima moguce je proveriti da li postoji odredeni skup. Python, na primer, bi mogao napisati:

if rules.has_key(object):
    rule = rules[object]
else:
    print "That's not a valid object."

To je prvi red i ima vrlo cudnu sintaksu, sa has_key funkcijom nakon tacke. Necemo to objasniti ovde, ali u osnovi kompjuter se pita da li pravilo polja ima skup za kljucni niz. (Kljucni niz je niz koji možete pogledati. Vrednost je povezana).

rules["rock"] = "Breaks scissors."

Da li možemo koristiti nesto drugo osim niti? Vrednost (u ovom slucaju "Lomi makaze") moze biti sve što može dodeliti normalne varijable, kao što je string, ceo broj, pravi broj, ili cak drugo polje. Kljuc (u ovom slucaju "Kamen") može biti niz ili ceo broj, kao i 25. Ako biste želeli zadržati neke informacije o raznim godinama, šta biste mogli napisati:

years[1066] = "Battle of Hastings"

Ili, ako ste hteli da pratiti svojih omiljenih pet pesama, šta bismo onda mogli napisati:

songs[1] = "Imagine"
songs[2] = "Baby I Love You"
songs[3] = "Hallelujah I Just Love Her So"
songs[4] = "Only The Good Die Young"
songs[5] = "Holiday"

Tada bi ih prikazali, kao:

for i = 1 to 5:
    print songs[i]

Drugi primer pokazuje prednosti koriscenja prirodnog kljuca: možete koristiti matematiku (kao petlje) i izracunati kljuc. U ovom slucaju smo ga postavili na 1 onda ga povecavali, prikazujuci svaku pesmu, dok nismo stigli do pet. U stvari, nizovi koji imaju male prirodne brojeve kao kljuceve kompjuter tretira posebno, jer se oni pokrecu mnogo brže. Mnogi jezici imaju posebna pravila u vezi ove vrste polja, s dodatnim ogranicenjima (kao fiksni broj ulazaka), ali i dodatnu brzinu. Koncepcijski, medutim, oni su samo poput drugih polja. Razgovarali smo o tome.

Hajde da zavrsimo ovo poglavlje o ponovnom pisanju našeg horoskopskog programa pomocu polja. Mi cemo koristiti Python i funkciju has_key, pa cemo otkriti da nevažeci znak koji smo dobili:

def get_sign_information(sign):
    signs["Aries"] = "assertive, impulsive, defensive"
    signs["Taurus"] = "resourceful, thorough, indulgent"
    signs["Gemini"] = "logical, inquisitive, fast"
    signs["Cancer"] = "protective, sensitive, clinging"
    signs["Leo"] = "generous, proud, theatrical"
    signs["Virgo"] = "practical, efficient, critical"
    signs["Libra"] = "co-operative, fair, lazy"
    signs["Scorpio"] = "passionate, sensitive, anxious"
    signs["Sagittarius"] = "free, straightforward, careless"
    signs["Capricorn"] = "prudent, cautious, suspicious"
    signs["Aquarius"] = "democratic, unconventional, detached"
    signs["Pisces"] = "imaginative, sensitive, distracted"

    if signs.has_key(sign):
        adjectives = signs[sign]
    else:
        print "That's not a valid sign."
        stop()

    return adjectives

def display_sign_information(whose, prefix):
    print "What's " + whose + " sign?"
    sign = input()
    adjectives = get_sign_information(sign)
    print prefix + " " + adjectives + "."

display_sign_information("your", "You are")
display_sign_information("your mate's", "Your mate is")

Projects

Vi ste naucili dovoljno o programiranju i pisanju korisnih programa. Ocigledno je da postoje mnoge stvari koje nedostaju, kao što su cuvanje stvari na disku i stvaranje lepih korisnickih medjusklopova. Tu treba uvesti više koncepta, kao što su struktura i objekti. Ja planiram da napisem i drugu knjigu za srednji nivo programiranja koja ce pokriti neke od tih stvari. U meduvremenu, vežbajte svoje nove veštine s ovim projektima:

Napišite program za prikaz teksta pesme "Dvanaest dana Božica." Mnogo toga se ponavlja. Nemojte upisati sve ponovljene stvari, neka kompjuter obavi posao za Vas.

Napišite program za pracenje vaših kontakata. Svaki kontakt imace ime i broj telefona. Program bi trebao da Vam omoguci da dodate novi kontakt, pogledati postojeci kontakt (po imenu, dajuci vam svoj broj telefona), kao i uklanjanje kontakta.

Napišite program za igranje "Kamen, papir, makaze" sa korisnikom. Pratite rezultat. Moracete shvatiti nacin da kompjuter dolazi do rezultata slucajno. Koristite ovu funkciju, koja je vec definisana u jeziku:

x = random(3)

To znaci, "Postavite varijablu x na ceo broj manji od tri." Svaki put kada ga zovu stavicete x na broj 0, 1 ili 2, slucajno. Mozete promeniti "3" za sve, ali za ovu igru ??cete zeleti da zadrzite "3", jer je to broj koliko vrsta objekata postoje.

Napisite program za igranje Tic-Tac-nožni prst s korisnikom. To je prilicno napredna igra, ali ne koristi nikakve programske koncepte koji jos niste naucili. Vi cete ih samo kombinovati na takav nacin da bi bili sofisticiraniji od svega sto smo ucinili do sada.

Published (Last edited): 26-12-2012 , source: http://www.teamten.com/lawrence/programming/intro/intro1.html