Elementi programiranja
(ab ovo usque ad mala)
Računala su elektronički uređaji namijenjeni obradi podataka. Ona prihvaćaju podatke u propisanom obliku, obrađuju ih i vraćaju rezultate u obliku informacija ili signala za automatsko upravljanje drugim strojevima.
Bitna je odrednica računala mogućnost programiranja, a time i rješavanja različitih zadaća.
Većina suvremenih računala digitalna su računala s von Neumannovom arhitekturom.
Digitalna računala obrađuju podatke kodirane kao niz diskretnih numeričkih elemenata; najčešći je binarni kôd (položajni zapis s bazom 2 i znamenkama 0 i 1).
Temeljne su odrednice Von Neumannova stroja:
MANIAC I – Mathematical Analyzer Numerical Integrator and Automatic Computer Model I (1952.; masa: ∼0,5 t)
Računalni ili kompjutorski programi formalno su i nedvosmisleno zapisane upute prema kojima računala mogu riješiti određene zadaće.
Podaci su brojčane vrijednosti i druge opisne jedinice značenja, sastavljene od brojeva, slova i drugih simbola, prilagođene obradi računalom (pohranjivanju, prikazu, prijenosu i preoblikovanju). Informacija je značenje koje se pridaje podacima prema dogovorenim pravilima za njihovo tumačenje.
Programski jezik umjetni je jezik strogo određene sintakse i semantike, to jest, skup znakova, riječi i pravila namijenjen nedvosmislenom zapisivanju računalnih programa.
Na najnižoj je razini, najbližoj računalu strojni jezik, skup instrukcija u binarnom kôdu. Program napisan u strojnom jeziku gotovo je nečitljiv. Stoga je uveden mnemonički jezik (asembler, engl. assembler) u kojem se strojne instrukcije označavaju kraticama njihovih (engleskih) naziva. Kako različite vrste računala imaju različite skupove instrukcija, mnemonički programi napisani za jednu vrstu računala ne mogu se izvoditi na računalima druge vrste. Osim toga, mnemonički su programi usko vezani uz način rada računala, koji se često bitno razlikuje od načina na koji ljudi rješavaju iste zadaće.
Oba su problema znatno smanjena, ali ne i potpuno uklonjena, uvođenjem viših programskih jezika: izvorni programi napisani u višim jezicima mogu se pomoću odgovarajućih programa prevodilaca ili programa tumača izvoditi na različitim računalima, a sintaksa i simbolika viših jezika približavaju se prirodnim jezicima (u pravilu engleskom) i formaliziranom, ali ipak razumljivom (ili barem razumljivijem) jeziku matematike. Program prevoditelj (kompilator, engl. compiler) prevodi izvorni program u izvedbeni ili izvršni program u strojnom jeziku (engl. executable program), a program tumač (interpreter, i engl.) izvorni program prevodi naredbu po naredbu te je odmah izvodi.
Sintaksa jezika skup je pravila koja propisuju poredak simbola pri njihovu povezivanju u izraze.
Primjerice:
<datum> := ZZ/ZZ/ZZZZ
<Z> := 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
tako da je 01/12/2013 ispravno oblikovani datum, a 010/A/20000 nije dopušteno.
Semantika jezika je skup pravila koja definiraju značenja simbola i sintaktički pravilno oblikovanih izraza.
Primjerice, 02/11/2016 je 2. studenoga ove godine kod nas, ali 11. veljače u Americi.
Sintaktički pravilno oblikovani izraz ne mora imati značenje: 25/12/2017 je Božić kod nas, a u Americi ??
Viši programski jezici podržavaju različite programske paradigme: zapovjednu, funkcijsku, logičku, objektno usmjerenu...
Zapovjedni programi nizovi su definicija i naredaba koje opisuje uzastopne korake transformacije zadanih ulaznih podataka u tražene rezultate.
Zapovjedni programi i njihovi cjeloviti dijelovi — programske funkcije — formalni su zapisi algoritama. Algoritam se u izvorni računalni program može prevesti različitim programskim jezicima. (Algoritam smo definirali na prošlom predavanju.)
Programska funkcija imenova je programska cjelina, namijenjena izvođenju određene zadaće. Hijerarhijskim sklapanjem razmjerno kratkih, neovisno napisanih i testiranih funkcija mogu se oblikovati strukturirani i pregledni programi.
Prisjetite se da smo na prošlom predavanju pokazali kako se u Python-u i SageMathu-u definira programska funkcija i kako se upotrebljava/poziva. (Osim funkcija, u Python-u i SageMath-u mogu se definirati razredi, koji su okosnica objektno usmjerenih programa.)
Najmanji su samostalni izvršni dijelovi programa naredbe. Naredbe mogu biti jednostavne ili složene.
Jednostavne su naredbe:
Naredba pridruživanja ima oblik
lvalue = rvalue
13 21 13 21 |
Operator = je operator pridruživanja, a ne ispitivanja jednakosti (o njemu nešto kasnije).
Pridruživanjem se vrijednost izraza rvalue upisuje ili „pohranjuje” u varijablu koju označava izraz lvalue.
Varijabla je područje u memoriji računala kojemu se može pristupiti navođenjem njezina naziva, a i nekih drugih izraza, poput indeksiranja u listi.
Nazivi varijable (ili drugi izrazi za pristupanje) mogu se pojaviti i s lijeve i s desne strane operatora pridruživanja, ali se njihova značenja u ta dva slučaja razlikuju: slijeva označavaju područje u memoriji u koje se upisuje vrijednost izraza koji je s desne strane; zdesna pak označavaju sadržaj varijable — vrijednost koja je u njoj pohranjena. Stoga se izraz koji označava varijablu naziva lvalue (left hand value), dok se izraz koji označava vrijednost koja jest ili može biti sadržaj varijable naziva rvalue (right hand value).
13 13 13 13 |
14 14 |
13 26 26 13 26 26 |
Traceback (click to the left of this block for traceback) ... SyntaxError: can't assign to operator Traceback (most recent call last): File "<stdin>", line 1, in <module> File "_sage_input_6.py", line 10, in <module> exec compile(u'open("___code___.py","w").write("# -*- coding: utf-8 -*-\\n" + _support_.preparse_worksheet_cell(base64.b64decode("YSArIGIgPSBj"),globals())+"\\n"); execfile(os.path.abspath("___code___.py")) File "", line 1, in <module> File "/tmp/tmpOL8oCX/___code___.py", line 2 a + b = c SyntaxError: can't assign to operator |
39 39 |
13 26 26 13 13 26 26 13 |
[1, 2, 3, 4] [1, 3, 3, 4] [1, 2, 3, 4] [1, 3, 3, 4] |
1 2 3 4 1 2 3 4 |
1 2 3 4 1 2 3 4 |
3 4 3 4 |
1 1 1 1 |
3 1 3 1 |
(1, 20, 3) (1, 20, 3) |
... ali ... oops:
(1, 20, 3) (1, 20, 3) |
(1, 20, 3) (1, 2, 3) (1, 20, 3) (1, 2, 3) |
Naziv je niz znakova koji označava varijablu, funkciju, tip ili razred.
Pravila oblikovanja naziva su:
Primjeri su ispravno oblikovanih naziva: seven, sedam, _7, __, the_girl_who_cried_champagne, TheGirlWhoCriedChampagne.
Primjeri su neispravnih naziva: 7_, C++, četvrtak, The Girl Who Cried Champagne, the-girl-who-cried-champagne.
Velika i mala slova se razlikuju, tako da su utviklingssang, Utviklingssang i UTVIKLINGSSANG tri različita naziva.
7 7 |
Traceback (click to the left of this block for traceback) ... SyntaxError: invalid syntax Traceback (most recent call last): File "<stdin>", line 1, in <module> File "_sage_input_7.py", line 10, in <module> exec compile(u'open("___code___.py","w").write("# -*- coding: utf-8 -*-\\n" + _support_.preparse_worksheet_cell(base64.b64decode("N18="),globals())+"\\n"); execfile(os.path.abspath("___code___.py")) File "", line 1, in <module> File "/tmp/tmpl6UP9d/___code___.py", line 2 7_ ^ SyntaxError: invalid syntax |
Izrazi su nizovi operanada i operatora koji opisuju aritmetičke, relacijske ili logičke operacije (mogu sadržavati zagrade za promjenu prioriteta operacija) i imaju vrijednosti. Operatori su simboli koji označavaju operacije i nazivi funkcija (sa zagradama ili s točkom i zagradama), dok su operandi izrazi na koje se primjenjuju operatori tvoreći složenije izraze. Temeljni su operandi konstante i varijable (možda bi korektnije bilo reći: nazivi varijabli).
Primjerice, u izrazu
x + 2*y - sin (z)
operatori su +, *, –, sin(); ako se operacije istoga prioriteta izvode slijeva na desno, operandi operatora + su varijabla x i izraz 2*y, operatora * konstanta 2 i varijabla y, operatora - izrazi x + 2*y i sin (z), te operatora sin() varijabla z.
U izrazu
A.solve_right (b)
operator je .solve_right(), dok su operandi A i b.
Tipom izraza određeni su
Razne „vrste” brojeva (cijele, racionalne, „realne”) nazivamo aritmetičkim tipovima.
Aritmetički izrazi oblikuju se pomoću aritmetičkih operatora. Unarni je operator - (promjena predznaka), dok su binarni operatori ^ ili **, *, /, //, %, + i - (oduzimanje). U aritmetičke operatore ubrajamo i nazive „klasičnih” matematičkih funkcija (sa zagradama). Vrijednosti su aritmetičkih izraza brojevi (konkretne vrijednosti ili opći brojevi), a operandi su također aritmetički izrazi — na „dnu”, brojčane konstante i varijable koje sadrže brojčane vrijednosti.
Prioriteti su aritmetičkih operatora: f(); ^; unarni -; *, /, //, %; +, binarni -.
23/2 23/2 |
3 3 |
1 1 |
Ako su podizrazi aritmetičkoga izraza različitih tipova, pretvaraju se prije izračunavanja u „najsveobuhvatniji” tip:
ZZ → QQ → RR → CC
RealField(m) → RealField(n) ako je m > n
1.00000000000000 1.00000000000000 |
2.0000000000000000000000000000 3.00 5.00 Real Field with 13 bits of precision 2.0000000000000000000000000000 3.00 5.00 Real Field with 13 bits of precision |
3.14 3.14159265358979 0.750 0.250000000000000 1.00 3.14 3.14159265358979 0.750 0.250000000000000 1.00 |
0.100000000000000 0.10000000000000000555111512313 0.10000000000000000000000000000 0.200000000000000 0.100000000000000 0.10000000000000000555111512313 0.10000000000000000000000000000 0.200000000000000 |
0.00011001100110011001100110011001100110011001100110011010 0.000110011001100110011001100110011001100110011001100110100000000000000000000000\ 0000000000000000000000000 0.000110011001100110011001100110011001100110011001100110011001100110011001100110\ 0110011001100110011001101 0.000110011001100110011001100110011001100110011001100110011001100110011001100110\ 01100110011001100110011001100110011001100110011001100110011001100110011001100110\ 01100110011001100110011001100110011001100110011001100110011001100110011001100110\ 01100110011001100110011001100110011001100110011001100110011001100110011001100110\ 01100110011001100110011001100110011001100110011001100110011001100110011001100110\ 01100110011001100110011001100110011001100110011001100110011001100110011001100110\ 01100110011001100110011001100110011001100110011001100110011001100110011001100110\ 01100110011001100110011001100110011001100110011001100110011001100110011001100110\ 01100110011001100110011001100110011001100110011001100110011001100110011001100110\ 01100110011001100110011001100110011001100110011001100110011001100110011001100110\ 01100110011001100110011001100110011001100110011001100110011001100110011001100110\ 01100110011001100110011001100110011001100110011001100110011001100110011001100110\ 01100110011001100110011001100110011001100110011001100110011001100110011001100110\ 01100110011001100110011001100110011001100110011001100110011001100110011001100110\ 01100110011001100110011001100110011001100110011001100110011001100110011001100110\ 01100110011001100110011001100110011001100110011001100110011001100110011001100110\ 01100110011001100110011001100110011001100110011010 0.00011001100110011001100110011001100110011001100110011010 0.0001100110011001100110011001100110011001100110011001101000000000000000000000000000000000000000000000000 0.0001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001101 0.00011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011010 |
True False True True False True |
True True True True True True |
True True True True True True |
1.00000000000000 1.000000000000000000000000000000000000000000000000000000000000000000000000000000\ 00000000000000000000000000000000000000000000000000000000000000000000000000000000\ 00000000000000000000000000000000000000000000000000000000000000000000000000000000\ 00000000000000000000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000000000000000000 1.00000000000000 1.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 |
False False False False |
0.99999999999999989 1.00000000000000 0.999999999999999999999999999999999999999999999999999999999999999999999999999999\ 99999999999999999999999999999999999999999999999999999999999999999999999999999999\ 99999999999999999999999999999999999999999999999999999999999999999999999999999999\ 99999999999999999999999999999999999999999999999999999999999999999999999999999999\ 99999999999999999999999999999999999999999999999999999999999999999999999999999999\ 86 1.000000000000000000000000000000000000000000000000000000000000000000000000000000\ 00000000000000000000000000000000000000000000000000000000000000000000000000000000\ 00000000000000000000000000000000000000000000000000000000000000000000000000000000\ 00000000000000000000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000000000000000000000000000000 0.99999999999999989 1.00000000000000 0.9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999986 1.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 |
0.10000000000000001 0.20000000000000001 0.30000000000000004 0.40000000000000002 0.50000000000000000 0.59999999999999998 0.69999999999999996 0.79999999999999993 0.89999999999999991 0.99999999999999989 0.10000000000000001 0.20000000000000001 0.30000000000000004 0.40000000000000002 0.50000000000000000 0.59999999999999998 0.69999999999999996 0.79999999999999993 0.89999999999999991 0.99999999999999989 |
1/2 = 0.10000000000000000000000000000000000000000000000000000 1/3 = 0.010101010101010101010101010101010101010101010101010101 1/4 = 0.010000000000000000000000000000000000000000000000000000 1/5 = 0.0011001100110011001100110011001100110011001100110011010 1/6 = 0.0010101010101010101010101010101010101010101010101010101 1/7 = 0.0010010010010010010010010010010010010010010010010010010 1/8 = 0.0010000000000000000000000000000000000000000000000000000 1/9 = 0.00011100011100011100011100011100011100011100011100011100 1/10 = 0.00011001100110011001100110011001100110011001100110011010 1/11 = 0.00010111010001011101000101110100010111010001011101000110 1/12 = 0.00010101010101010101010101010101010101010101010101010101 1/13 = 0.00010011101100010011101100010011101100010011101100010100 1/14 = 0.00010010010010010010010010010010010010010010010010010010 1/15 = 0.00010001000100010001000100010001000100010001000100010001 1/16 = 0.00010000000000000000000000000000000000000000000000000000 1/17 = 0.000011110000111100001111000011110000111100001111000011110 1/18 = 0.000011100011100011100011100011100011100011100011100011100 1/19 = 0.000011010111100101000011010111100101000011010111100101000 1/2 = 0.10000000000000000000000000000000000000000000000000000 1/3 = 0.010101010101010101010101010101010101010101010101010101 1/4 = 0.010000000000000000000000000000000000000000000000000000 1/5 = 0.0011001100110011001100110011001100110011001100110011010 1/6 = 0.0010101010101010101010101010101010101010101010101010101 1/7 = 0.0010010010010010010010010010010010010010010010010010010 1/8 = 0.0010000000000000000000000000000000000000000000000000000 1/9 = 0.00011100011100011100011100011100011100011100011100011100 1/10 = 0.00011001100110011001100110011001100110011001100110011010 1/11 = 0.00010111010001011101000101110100010111010001011101000110 1/12 = 0.00010101010101010101010101010101010101010101010101010101 1/13 = 0.00010011101100010011101100010011101100010011101100010100 1/14 = 0.00010010010010010010010010010010010010010010010010010010 1/15 = 0.00010001000100010001000100010001000100010001000100010001 1/16 = 0.00010000000000000000000000000000000000000000000000000000 1/17 = 0.000011110000111100001111000011110000111100001111000011110 1/18 = 0.000011100011100011100011100011100011100011100011100011100 1/19 = 0.000011010111100101000011010111100101000011010111100101000 |
1/3 = 0.010101010101010101010101010101010101010101010101010101 2/3 = 0.10101010101010101010101010101010101010101010101010101 1/5 = 0.0011001100110011001100110011001100110011001100110011010 2/5 = 0.011001100110011001100110011001100110011001100110011010 1/7 = 0.0010010010010010010010010010010010010010010010010010010 2/7 = 0.010010010010010010010010010010010010010010010010010010 1/9 = 0.00011100011100011100011100011100011100011100011100011100 2/9 = 0.0011100011100011100011100011100011100011100011100011100 1/3 = 0.010101010101010101010101010101010101010101010101010101 2/3 = 0.10101010101010101010101010101010101010101010101010101 1/5 = 0.0011001100110011001100110011001100110011001100110011010 2/5 = 0.011001100110011001100110011001100110011001100110011010 1/7 = 0.0010010010010010010010010010010010010010010010010010010 2/7 = 0.010010010010010010010010010010010010010010010010010010 1/9 = 0.00011100011100011100011100011100011100011100011100011100 2/9 = 0.0011100011100011100011100011100011100011100011100011100 |
Kombinirano pridruživanje spoj je binarne aritmetičke operacije u kojoj se (operatoru slijeva) pojavljuje varijabla kojoj će rezultat biti pridružen i pridruživanja:
1 1 |
1 1 |
0 0 |
81 81 |
3 3 |
81/4 81/4 |
3 3 |
Redoslijed izvođenja naredaba određuju upravljačke strukture:
Mnogi su od prethodnih primjera (u pojedinim ćelijama, a katkad i u nizu uzastopnih ćelija) primjeri najjednostavnije upravljačke strukture — nizanja naredaba. Naredbe se mogu nizati tako da se navode u uzastopnim recima ili da se u istom retku međusobno odvajaju točkom–zarezom.
Druge se dvije upravljačke strukture u programima ostvaruju složenim ili strukturiranim naredbama:
Petlja je upravljačka struktura koja omogućava ponavljanje jedne naredbe ili više njih unaprijed utvrđeni broj puta ili tako dugo dok je ispunjen određeni uvjet.
Naredba koja se ponavlja ili niz naredaba koji se ponavlja nazivaju se tijelom petlje. Jedno izvođenje tijela petlje nazivat ćemo korakom petlje (i, kraće, samo korakom) ili prolaskom kroz petlju.
Petlja for se u pravilu upotrebljava onda kada je broj prolazaka kroz petlju poznat prije ulaska u nju.
Opći je oblik petlje for:
for jedinka in lista :
tijelo petlje
Najjednostavniji je oblik:
for cjelobrojni_brojač in cjelobrojni_niz :
tijelo petlje
0 1 2 3 4 5 0 1 2 3 4 5 |
0 1 2 3 4 0 1 2 3 4 |
0 1 2 3 4 5 0 1 2 3 4 5 |
a b c d e a b c d e |
a b c d e a b c d e |
a b c d e a b c d e |
0 0 1 1 2 4 3 9 4 16 5 25 6 36 7 49 8 64 9 81 0 0 1 1 2 4 3 9 4 16 5 25 6 36 7 49 8 64 9 81 |
1 1 2 4 3 9 4 16 5 25 6 36 7 49 8 64 9 81 1 1 2 4 3 9 4 16 5 25 6 36 7 49 8 64 9 81 |
1 1 3 9 5 25 7 49 9 81 1 1 3 9 5 25 7 49 9 81 |
1 1 3 9 5 25 7 49 9 81 1 1 3 9 5 25 7 49 9 81 |
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] |
[0, 1, 2, 3, 4, 20, 6, 7, 8, 9] [0, 1, 2, 3, 4, 20, 6, 7, 8, 9] |
xrange(10) xrange(10) |
Traceback (click to the left of this block for traceback) ... TypeError: 'xrange' object does not support item assignment Traceback (most recent call last): File "<stdin>", line 1, in <module> File "_sage_input_48.py", line 10, in <module> exec compile(u'open("___code___.py","w").write("# -*- coding: utf-8 -*-\\n" + _support_.preparse_worksheet_cell(base64.b64decode("eHJbNV0gPSAyMAp4cg=="),globals())+"\\n"); execfile(os.path.abspath("___code___.py")) File "", line 1, in <module> File "/tmp/tmprxUw_I/___code___.py", line 3, in <module> xr[_sage_const_5 ] = _sage_const_20 TypeError: 'xrange' object does not support item assignment |
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] |
|
Petlja while se u pravilu upotrebljava onda kada broj prolazaka kroz petlju nije poznat unaprijed, nego ovisi o ispunjenju nekog uvjeta.
Opći je oblik petlje while:
while uvjet :
tijelo petlje
Koraci petlje će se ponavljati tako dugo dok je uvjet ispunjen, tako da u tijelu petlje treba omogućiti promjenu vrijednostî o kojima ovisi ispunjenje uvjeta.
13.0000000000000 3.60555127546399 1.89882892211594 1.37798001513663 1.17387393494218 1.08345462984943 1.04089126706368 1.02024078876689 1.01006969500470 13.0000000000000 3.60555127546399 1.89882892211594 1.37798001513663 1.17387393494218 1.08345462984943 1.04089126706368 1.02024078876689 1.01006969500470 |
13.0000000000000 3.60555127546399 1.89882892211594 1.37798001513663 1.17387393494218 1.08345462984943 1.04089126706368 1.02024078876689 1.01006969500470 1.00502223607475 13.0000000000000 3.60555127546399 1.89882892211594 1.37798001513663 1.17387393494218 1.08345462984943 1.04089126706368 1.02024078876689 1.01006969500470 1.00502223607475 |
0 0 1 1 2 4 3 9 4 16 5 25 6 36 7 49 8 64 9 81 0 0 1 1 2 4 3 9 4 16 5 25 6 36 7 49 8 64 9 81 |
0 0 1 1 2 4 3 9 4 16 5 25 6 36 7 49 8 64 9 81 0 0 1 1 2 4 3 9 4 16 5 25 6 36 7 49 8 64 9 81 |
Grananja su upravljačke strukture koja omogućavaju odabir naredbe ili niza naredaba koji će biti — ili neće biti — izvedeni. Razlikujemo
Svi oblici grananja ostvaruju se inačicama naredbe if.
U uvjetnom će izvođenju naredba ili niz naredaba biti izvedeni ako i samo ako je ispunjen zadani uvjet; u protivnom će biti „preskočeni”.
Opći je oblik naredbe if za uvjetno izvođenje:
if uvjet :
niz naredbi
|
ispred if-a u if-u iza if-a ispred if-a u if-u iza if-a |
ispred if-a iza if-a ispred if-a iza if-a |
Grananje u užem smislu odabir je jedne od dviju mogućih „grana” daljnjega izvođenja programa: bit će izvedena jedna od dvije naredbe ili jedan od dva niza naredaba, ovisno o tome je li zadani uvjet ispunjen ili ne.
Opći je oblik naredbe if za grananje u užem smislu:
if uvjet :
niz naredaba ‚onda’
else :
niz naredaba ‚inače’
Ako je uvjet ispunjen, onda će se izvesti niz naredaba nazvan „onda”, a inače — dakle, ako uvjet nije ispunjen — bit će izveden niz naredaba nazvan „inače”.
|
ispred if-a u if-u, grana za ispunjeni uvjet iza if-a ispred if-a u if-u, grana za ispunjeni uvjet iza if-a |
ispred if-a u if-u, grana za neispunjeni uvjet iza if-a ispred if-a u if-u, grana za neispunjeni uvjet iza if-a |
Pri višestrukom se grananju izvodi jedna od nekoliko mogućih naredaba ili jedan od nekoliko mogućih nizova naredaba.
Primjenom naredbe if višestruko se grananje ostvaruje kao niz uzastopnih grananja:
if prvi uvjet :
prvi niz naredbi
elif drugi uvjet :
drugi niz naredbi
...
else :
n-ti niz naredbi
(grana else nije obvezna).
|
ispred if-a u if-u, -1 iza if-a ispred if-a u if-u, -1 iza if-a |
ispred if-a u if-u, 1 iza if-a ispred if-a u if-u, 1 iza if-a |
ispred if-a u if-u, 2 iza if-a ispred if-a u if-u, 2 iza if-a |
ispred if-a u if-u, sve ostalo iza if-a ispred if-a u if-u, sve ostalo iza if-a |
|
ispred if-a iza if-a ispred if-a iza if-a |
|
ispred ifova-a u ifovima-u, -1 iza ifova-a ispred ifova-a u ifovima-u, -1 iza ifova-a |
ispred ifova-a u ifovima-u, 2 iza ifova-a ispred ifova-a u ifovima-u, 2 iza ifova-a |
ispred ifova-a u ifovima-u, sve ostalo iza ifova-a ispred ifova-a u ifovima-u, sve ostalo iza ifova-a |
Uvjeti u naredbama while i if relacijski su ili logički izrazi.
Relacijski se izrazi primjenjuju za usporedbe dviju vrijednosti ili ispitivanje pripadnosti „skupu”. Svi su relacijski operatori, naravno, binarni. Operatori usporedbe su == (jednako), != (nije jednako), < (manje), > (veće), <= (manje ili jednako) i >= (veće ili jednako), dok su operatori pripadanja in (u) i not in (nije u). (Naglašavamo da je operator ispitivanja jednakosti ==, a ne =.) Operandi izraza usporedbe su aritmetički izrazi. Operand s lijeve strane operatora pripadanja je aritmetički izraz, dok je operand zdesna „skup”. Vrijednosti su relacijskih izraza logičke vrijednosti True i False.
True True |
True True |
False False |
True True |
True True |
True True |
False False |
True True |
False False |
False False |
sqrt(2) 1.41421356237310 sqrt(2) 1.41421356237310 |
True True |
63690516725257734503599627370496
|
|
no no |
yes yes |
no no |
no no |
Relacijski operatori imaju niži prioritet od aritmetičkih.
True True |
True True |
True True |
True True |
False False |
360287970189639736028797018963968
|
False False |
540431955284459518014398509481984
|
13510798882111494503599627370496
|
True True |
False False |
sqrt(3) < 2 sqrt(3) < 2 |
True True |
True True |
sqrt(3) < 2.00000000000000 sqrt(3) < 2.00000000000000 |
True True |
Logički izrazi nastaju primjenom unarnog logičkog operatora not (negacija) i binarnih operatora and (i) i or ((uključivi) ili) na relacijske izraze. Vrijednosti su logičkih izraza logičke, True i False.
Izraz not ex je istinit ako i samo ako podizraz ex nije istinit.
Izraz ex1 and ex2 je istinit ako i samo ako su istinita oba podizraza ex1 i ex2.
Izraz ex1 or ex2 je istinit ako i samo ako je istinit barem jedan od podizraza ex1 i ex2.
False False |
False False |
True True |
True True |
False False |
False False |
True True |
False False |
Logičke su operacije međusobno povezane De Morganovim pravilima:
True True |
True True |
False False |
False False |
True True |
True True |
Pseudologički izrazi nastaju primjenom relacijskih operatora na relacijske izraze. Drugim riječima, relacijski operatori imaju ulogu logičkih operatora: == (ako i samo ako, ⇔; engl. if and only if, iff), != (isključivi ili, ili–ili, kao u aut Caesar aut nihil; engl. exclusive or, xor). Pseudologički izrazi poprimaju, naravno, logičke vrijednosti.
Izraz ex1 != ex2 je istinit ako i samo ako je istinit jedan i samo jedan od podizraza ex1 i ex2.
Izraz ex1 == ex2 je istinit ako i samo ako oba podizraza imaju istu istinosnu vrijednost.
False False |
True True |
False False |
True True |
True True |
False False |
Često se vrijednosti logičkih i pseudologičkih operacija prikazuju tablicama istinitosti:
|
True and True == True True and False == False False and True == False False and False == False True and True == True True and False == False False and True == False False and False == False |
and |
T |
F |
T | T | F |
F | F | F |
True or True == True True or False == True False or True == True False or False == False True or True == True True or False == True False or True == True False or False == False |
or | T | F |
T | T | T |
F | T | F |
True xor True == False True xor False == True False xor True == True False xor False == False True xor True == False True xor False == True False xor True == True False xor False == False |
xor | T | F |
T | F | T |
F | T | F |
True iff True == True True iff False == False False iff True == False False iff False == True True iff True == True True iff False == False False iff True == False False iff False == True |
iff | T | F |
T | T | F |
F | F | T |
Za kraj priče o „numeričkom” programiranju, još malo petljanja:
|
|
3.80000000004635 3.80000000004635 |
1.52002854747479e-11 1.52002854747479e-11 |
^C Traceback (click to the left of this block for traceback) ... __SAGE__ ^C Traceback (most recent call last): File "<stdin>", line 1, in <module> File "_sage_input_9.py", line 10, in <module> exec compile(u'open("___code___.py","w").write("# -*- coding: utf-8 -*-\\n" + _support_.preparse_worksheet_cell(base64.b64decode("bmV3dG9uX3JhcGhzb24gKGZwLCBkZnAsIDcuKQ=="),globals())+"\\n"); execfile(os.path.abspath("___code___.py")) File "", line 1, in <module> File "/tmp/tmpGs0UPG/___code___.py", line 3, in <module> exec compile(u'newton_raphson (fp, dfp, _sage_const_7p ) File "", line 1, in <module> File "/tmp/tmpg7toDj/___code___.py", line 10, in newton_raphson fk = f (xk) File "/tmp/tmpQP7g57/___code___.py", line 4, in fp return (x + _sage_const_1 )/sqrt((x + _sage_const_1 )**_sage_const_2 + _sage_const_16 ) + (x - _sage_const_5 )/sqrt((x - _sage_const_5 )**_sage_const_2 + _sage_const_1 ) File "/opt/SageMath/local/lib/python2.7/site-packages/sage/functions/other.py", line 864, in sqrt if isinstance(x, float): File "src/cysignals/signals.pyx", line 320, in cysignals.signals.python_check_interrupt KeyboardInterrupt __SAGE__ |
|
3.80000000004635 3.80000000004635 |
NaN + NaN*I NaN + NaN*I |
|
3.80000000004635 3.80000000004635 |
NaN + NaN*I NaN + NaN*I |
Izrazi s „nearitmetičkim” tipovima
'abcde' 'abcde' |
'abcde' 'abcde' |
'abcde' 'abcde' |
Traceback (click to the left of this block for traceback) ... TypeError: unsupported operand type(s) for -: 'str' and 'str' Traceback (most recent call last): File "<stdin>", line 1, in <module> File "_sage_input_9.py", line 10, in <module> exec compile(u'open("___code___.py","w").write("# -*- coding: utf-8 -*-\\n" + _support_.preparse_worksheet_cell(base64.b64decode("J2FiYycgLSAnYmMn"),globals())+"\\n"); execfile(os.path.abspath("___code___.py")) File "", line 1, in <module> File "/tmp/tmpqQUAw7/___code___.py", line 2, in <module> exec compile(u"'abc' - 'bc'" + '\n', '', 'single') File "", line 1, in <module> TypeError: unsupported operand type(s) for -: 'str' and 'str' |
'abcabc' 'abcabc' |
Traceback (click to the left of this block for traceback) ... TypeError: can't multiply sequence by non-int of type 'str' Traceback (most recent call last): File "<stdin>", line 1, in <module> File "_sage_input_13.py", line 10, in <module> exec compile(u'open("___code___.py","w").write("# -*- coding: utf-8 -*-\\n" + _support_.preparse_worksheet_cell(base64.b64decode("J2FiJyAqICdjZCc="),globals())+"\\n"); execfile(os.path.abspath("___code___.py")) File "", line 1, in <module> File "/tmp/tmpe9rpdU/___code___.py", line 2, in <module> exec compile(u"'ab' * 'cd'" + '\n', '', 'single') File "", line 1, in <module> TypeError: can't multiply sequence by non-int of type 'str' |
True True |
True True |
True True |
False False |
True True |
True True |
False False |
True True |
False False |
no no |
no no |
[1, 2, 3, 4, 5] [1, 2, 3, 4, 5] |
Traceback (click to the left of this block for traceback) ... TypeError: unsupported operand parent(s) for +: 'Integer Ring' and '<type 'list'>' Traceback (most recent call last): File "<stdin>", line 1, in <module> File "_sage_input_24.py", line 10, in <module> exec compile(u'open("___code___.py","w").write("# -*- coding: utf-8 -*-\\n" + _support_.preparse_worksheet_cell(base64.b64decode("MSArIFsyLCAzLCA0XQ=="),globals())+"\\n"); execfile(os.path.abspath("___code___.py")) File "", line 1, in <module> File "/tmp/tmpwgMstH/___code___.py", line 3, in <module> exec compile(u'_sage_const_1 + [_sage_const_2 , _sage_const_3 , _sage_const_4 ] File "", line 1, in <module> File "sage/rings/integer.pyx", line 1792, in sage.rings.integer.Integer.__add__ (build/cythonized/sage/rings/integer.c:12197) File "sage/structure/coerce.pyx", line 1207, in sage.structure.coerce.CoercionModel.bin_op (build/cythonized/sage/structure/coerce.c:10896) TypeError: unsupported operand parent(s) for +: 'Integer Ring' and '<type 'list'>' |
[1, 2, 3, 4] [1, 2, 3, 4] |
Traceback (click to the left of this block for traceback) ... TypeError: unsupported operand type(s) for -: 'list' and 'list' Traceback (most recent call last): File "<stdin>", line 1, in <module> File "_sage_input_26.py", line 10, in <module> exec compile(u'open("___code___.py","w").write("# -*- coding: utf-8 -*-\\n" + _support_.preparse_worksheet_cell(base64.b64decode("WzEsIDIsIDMsIDQsIDVdIC0gWzIsIDNd"),globals())+"\\n"); execfile(os.path.abspath("___code___.py")) File "", line 1, in <module> File "/tmp/tmpS7V9_M/___code___.py", line 3, in <module> exec compile(u'[_sage_const_1 , _sage_const_2 , _sage_const_3 , _sage_const_4 , _sage_const_5 ] - [_sage_const_2 , _sage_const_3 ] File "", line 1, in <module> TypeError: unsupported operand type(s) for -: 'list' and 'list' |
[7, 11, 13, 7, 11, 13] [7, 11, 13, 7, 11, 13] |
True True |
False False |
True True |
False False |
True True |
False False |
True True |
no no |
no no |
yes yes |
|