Processing math: 100%

PPPK_02

250 days ago by fresl

 

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:

  1. glavne su jedinice računala upravljačka i aritmetičko–logička jedinica (koje zajedno čine procesor), te memorija i ulazno–izlazni uređaji;
  2. program i podaci nalaze se u istoj memoriji kodirani na isti način, te se naredbe mogu smatrati podacima i obratno;
  3. program je sastavljen od niza naredaba koje se izvode nad podacima; u nekom trenutku izvodi se samo jedna naredba, a redoslijed izvođenja naredaba određuje upravljačka jedinica.

 

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:

  • pridruživanje
    • kombinirana pridruživanja
  • print
  • pozivi funkcija show(), plot() i drugih koje ne „vraćaju” vrijednosti, nego izazivaju popratne učinke 
  • return
  • break
  • import
  • [global, exec, continue, pass, yield, del, assert, raise, ...]


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:

  • mogu se upotrebljavati mala i velika slova engleske abecede  a...z  i  A...Z  (bez dijakritičkih znakova č, ć, đ, š, ž, ä, ë, ö, ü, å, æ, ...),  znamenke 0...9  i podvlaka _,
  • prvi znak mora biti slovo ili podvlaka.

Primjeri su ispravno oblikovanih naziva:  sevensedam_7__the_girl_who_cried_champagneTheGirlWhoCriedChampagne.

Primjeri su neispravnih naziva:  7_C++četvrtakThe Girl Who Cried Champagnethe-girl-who-cried-champagne.

Velika i mala slova se razlikuju, tako da su  utviklingssangUtviklingssang  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

  1. skup vrijednosti koje izraz može poprimiti i
  2. skup funkcija i operatora primjenjivih na njega.

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:

  • nizanje naredaba — naredbe se izvode jedna za drugom, redoslijedom kojim su navedene,
  • grananje — izbor jedne od dviju (od kojih jedna može biti i „prazna”) ili više naredaba,
  • petlja — ponavljanje jedne naredbe ili više njih, tako dugo dok je ispunjen određeni uvjet.

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:

  • grananja: if, if-else, if-elif, if-elif-else,
  • petlje: for, while

 

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

  • uvjetno izvođenje,
  • grananje (u užem smislu) i
  • višestruko grananje. 

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.

Logički operatori imaju niži prioritet od relacijskih. Između njih pak not ima najviši prioritet, a or najniži. 
 
       
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:

  • not (a and b)    not a or not b
  • not (a or b)    not a and not b
       
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:

       
  • izraz  ex1 and ex2  je istinit ako i samo ako su istinita oba podizraza ex1 i ex2:
       
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

 

  •  izraz  ex1 or ex2  je istinit ako i samo ako je istinit barem jedan od podizraza ex1 i ex2:
       
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

 

  • izraz  ex1 != ex2  (ex1 xor ex2)  je istinit ako i samo ako je istinit jedan i samo jedan od podizraza ex1 i ex2:
       
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

 

  • izraz  ex1 == ex2  (ex1 iff ex2)  je istinit ako i samo ako oba podizraza imaju istu istinosnu vrijednost
       
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