<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="sr">
	<id>https://siwiki.rs/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Fedja</id>
	<title>SI Wiki - Кориснички доприноси [sr]</title>
	<link rel="self" type="application/atom+xml" href="https://siwiki.rs/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Fedja"/>
	<link rel="alternate" type="text/html" href="https://siwiki.rs/wiki/%D0%9F%D0%BE%D1%81%D0%B5%D0%B1%D0%BD%D0%BE:%D0%94%D0%BE%D0%BF%D1%80%D0%B8%D0%BD%D0%BE%D1%81%D0%B8/Fedja"/>
	<updated>2026-06-04T02:29:48Z</updated>
	<subtitle>Кориснички доприноси</subtitle>
	<generator>MediaWiki 1.39.8</generator>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9F%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D1%81%D0%BA%D0%B8_%D0%BF%D1%80%D0%B5%D0%B2%D0%BE%D0%B4%D0%B8%D0%BE%D1%86%D0%B8_1/%D0%A1%D0%B5%D0%BF%D1%82%D0%B5%D0%BC%D0%B1%D0%B0%D1%80_2023&amp;diff=6723</id>
		<title>Програмски преводиоци 1/Септембар 2023</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9F%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D1%81%D0%BA%D0%B8_%D0%BF%D1%80%D0%B5%D0%B2%D0%BE%D0%B4%D0%B8%D0%BE%D1%86%D0%B8_1/%D0%A1%D0%B5%D0%BF%D1%82%D0%B5%D0%BC%D0%B1%D0%B0%D1%80_2023&amp;diff=6723"/>
		<updated>2023-10-23T10:29:05Z</updated>

		<summary type="html">&lt;p&gt;Fedja: syntaxhighlight -&amp;gt; pre za etf jezike&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
{{nerešeno}}&lt;br /&gt;
&#039;&#039;&#039;Ispit u septembarskom roku 2023. godine&#039;&#039;&#039; održan je 16. Septembra.&lt;br /&gt;
&lt;br /&gt;
== 1. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
&#039;&#039;&#039;(10p)&#039;&#039;&#039; Dat je deo implementacije klase &#039;&#039;Node&#039;&#039; u programskom jeziku &#039;&#039;Java&#039;&#039;, koja predstavlja čvor u sintaksnom stablu izgenerisanom za konstrukciju DKA korišćenjem metoda pozicije, gde su objašnjenja polja i metoda data u komentarima iznad njih (sva polja su inicijalizovana konstruktorom):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
    public class Node {&lt;br /&gt;
        private enum Type {&lt;br /&gt;
            ASTERISK,   // *&lt;br /&gt;
            PLUS,       // +&lt;br /&gt;
            PERIOD,     // .&lt;br /&gt;
            OR,         // |&lt;br /&gt;
            SYMBOL,     // s&lt;br /&gt;
            EPSILON     // ε&lt;br /&gt;
        }&lt;br /&gt;
        // left subtree of position node, null if leaf (symbol) node&lt;br /&gt;
        private Node left;&lt;br /&gt;
&lt;br /&gt;
        // right subtree of position node, null if unary operation or leaf (symbol) node&lt;br /&gt;
        private Node right;&lt;br /&gt;
&lt;br /&gt;
        // type of position node&lt;br /&gt;
        private Type type;&lt;br /&gt;
&lt;br /&gt;
        // position of symbol in regex, only valid for leaf (symbol) nodes, otherwise set to -1&lt;br /&gt;
        private int symbolPos;&lt;br /&gt;
&lt;br /&gt;
        // check whether the subsequence with the given node as root of the subtree can be empty&lt;br /&gt;
        public boolean isNullable();&lt;br /&gt;
&lt;br /&gt;
        // find sert of leaf (symbol) node positions which could be at the beginning of&lt;br /&gt;
        // subsequence with the given node as root of the subtree&lt;br /&gt;
        public Set&amp;lt;Integer&amp;gt; firstPos();&lt;br /&gt;
&lt;br /&gt;
        // find set of leaf (symbol) node positions which could be at the end of&lt;br /&gt;
        // subsequence with the given node as root of the subtree&lt;br /&gt;
        public Set&amp;lt;Integer&amp;gt; lastPos();&lt;br /&gt;
&lt;br /&gt;
        // returns a union of the two parameters&lt;br /&gt;
        public static Set&amp;lt;Integer&amp;gt; union(Set&amp;lt;Integer&amp;gt; first, Set&amp;lt;Integer&amp;gt; second);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Potrebno je napisati implementaciju metoda &amp;lt;code&amp;gt;firstPos()&amp;lt;/code&amp;gt; i &amp;lt;code&amp;gt;lastPos()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 1a. zadatak ===&lt;br /&gt;
Identičan ovakav zadatak (za isti broj poena) se pojavio u Avgustu 2023, samo se tražila implementacija &amp;lt;code&amp;gt;isNullable()&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== 2. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
&#039;&#039;&#039;(10p)&#039;&#039;&#039; Za rekurzivni spust koji opisuje navedenu gramatiku, koji su opisani ispod:&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Dopuniti delove rekurzivnog spusta obeleženih sa labelama PN (N označava labelu koja se može popuniti i može predstavljati jednu ili više linija koda), ukoliko je poznato da se sekvence &#039;&#039;aadddbb&#039;&#039;, &#039;&#039;dd&#039;&#039; i &#039;&#039;ab&#039;&#039; prihvataju.&lt;br /&gt;
# Napisati LL(1) gramatiku opisanu rekurzivnim spustom.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Glavni program:&lt;br /&gt;
IN = NEXTCHAR();&lt;br /&gt;
call PROCS;&lt;br /&gt;
if (INP&amp;lt;&amp;gt; &#039;˧&#039;)&lt;br /&gt;
    then REJECT;&lt;br /&gt;
    else ACCEPT;&lt;br /&gt;
end if;&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
procedure PROCS:&lt;br /&gt;
    case IN of&lt;br /&gt;
        &#039;a&#039;: goto P1;&lt;br /&gt;
        &#039;d&#039;, &#039;b&#039;, &#039;˧&#039;: goto P2;&lt;br /&gt;
        default: REJECT;&lt;br /&gt;
    end case;&lt;br /&gt;
P1: /* ... */&lt;br /&gt;
P2: /* ... */&lt;br /&gt;
end procedure;&lt;br /&gt;
&lt;br /&gt;
procedure PROCA:&lt;br /&gt;
    case IN of&lt;br /&gt;
        &#039;b&#039;, &#039;˧&#039;: goto P3;&lt;br /&gt;
        &#039;d&#039;: goto P4;&lt;br /&gt;
        default: REJECT;&lt;br /&gt;
    end case;&lt;br /&gt;
P3: /* ... */&lt;br /&gt;
P4: /* ... */&lt;br /&gt;
end procedure;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 3. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
&#039;&#039;&#039;(10p)&#039;&#039;&#039; Za dati Mikrojava bajtkod:&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Navesti izlaz programa.&lt;br /&gt;
# Rekonstruisati izvorni Mikrojava kod na osnovu datog bajtkoda.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0:      enter 2 2&lt;br /&gt;
3:      load_0&lt;br /&gt;
4:      load_1&lt;br /&gt;
5:      mul&lt;br /&gt;
6:      jmp 3 (=9)&lt;br /&gt;
9:      exit&lt;br /&gt;
10:     return&lt;br /&gt;
11:     enter 2 3&lt;br /&gt;
14:     const_0&lt;br /&gt;
15:     store_2&lt;br /&gt;
16:     load_2&lt;br /&gt;
17:     load_1&lt;br /&gt;
18:     jge 21 (=39)&lt;br /&gt;
21:     load_0&lt;br /&gt;
22:     load_2&lt;br /&gt;
23:     aload&lt;br /&gt;
24:     const_0&lt;br /&gt;
25:     print&lt;br /&gt;
26:     const 32&lt;br /&gt;
31:     const_0&lt;br /&gt;
32:     bprint&lt;br /&gt;
33:     inc 2,1&lt;br /&gt;
36:     jmp -20 (=16)&lt;br /&gt;
39:     const 10&lt;br /&gt;
44:     const_0&lt;br /&gt;
45:     bprint&lt;br /&gt;
46:     exit&lt;br /&gt;
47:     return&lt;br /&gt;
48:     enter 0 5&lt;br /&gt;
51:     const_0&lt;br /&gt;
52:     store_0&lt;br /&gt;
53:     const 10&lt;br /&gt;
58:     newarray 1&lt;br /&gt;
60:     store_1&lt;br /&gt;
61:     const 10&lt;br /&gt;
66:     newarray 1&lt;br /&gt;
68:     store_2&lt;br /&gt;
69:     load_0&lt;br /&gt;
70:     const 10&lt;br /&gt;
75:     jge 74 (=149)&lt;br /&gt;
78:     load_1&lt;br /&gt;
79:     load_0&lt;br /&gt;
80:     load_0&lt;br /&gt;
81:     const 10&lt;br /&gt;
86:     mul&lt;br /&gt;
87:     load_0&lt;br /&gt;
88:     const_3&lt;br /&gt;
89:     rem&lt;br /&gt;
90:     add&lt;br /&gt;
91:     astore&lt;br /&gt;
92:     load_0&lt;br /&gt;
93:     const_2&lt;br /&gt;
94:     rem&lt;br /&gt;
95:     const_1&lt;br /&gt;
96:     jne 12 (=108)&lt;br /&gt;
99:     load_1&lt;br /&gt;
100:    load_0&lt;br /&gt;
101:    const_1&lt;br /&gt;
102:    neg&lt;br /&gt;
103:    load_1&lt;br /&gt;
104:    load_0&lt;br /&gt;
105:    aload&lt;br /&gt;
106:    mul&lt;br /&gt;
107:    astore&lt;br /&gt;
108:    load_1&lt;br /&gt;
109:    load_0&lt;br /&gt;
110:    aload&lt;br /&gt;
111:    const_2&lt;br /&gt;
112:    call -112 (=0)&lt;br /&gt;
115:    store_3&lt;br /&gt;
116:    load_1&lt;br /&gt;
117:    load_0&lt;br /&gt;
118:    aload&lt;br /&gt;
119:    const_3&lt;br /&gt;
120:    call -120 (=0)&lt;br /&gt;
123:    store 4&lt;br /&gt;
125:    load_3&lt;br /&gt;
126:    load 4&lt;br /&gt;
128:    jle 10 (=138)&lt;br /&gt;
131:    load_2&lt;br /&gt;
132:    load_0&lt;br /&gt;
133:    load_3&lt;br /&gt;
134:    astore&lt;br /&gt;
135:    jmp 8 (=143)&lt;br /&gt;
138:    load_2&lt;br /&gt;
139:    load_0&lt;br /&gt;
140:    load 4&lt;br /&gt;
142:    astore&lt;br /&gt;
143:    inc 0,1&lt;br /&gt;
146:    jmp -77 (=69)&lt;br /&gt;
149:    load_1&lt;br /&gt;
150:    const 10&lt;br /&gt;
155:    call -144 (=11)&lt;br /&gt;
158:    load_2&lt;br /&gt;
159:    const 10&lt;br /&gt;
164:    call -153 (=11)&lt;br /&gt;
167:    exit&lt;br /&gt;
168:    return&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 4. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
&#039;&#039;&#039;(10p)&#039;&#039;&#039; Za datu gramatiku konstruisati:&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# LR(0) karakteristični automat&lt;br /&gt;
# LALR(1) karakteristični automat&lt;br /&gt;
# Za oba slučaja LR(0) i LALR(1) navesti stanja sa po jednim konfliktom i objasniti o kom se konfliktu radi, u slučaju da konflikt postoji. Nije potrebno konstruisati tabele parsera.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Oba automata prikazati u vidu grafa prelaza, unutar stanja napisati konfiguracije.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;&amp;amp;lt;S&amp;gt; → ( &amp;lt;X&amp;gt; )&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;&amp;amp;lt;S&amp;gt; → [ &amp;lt;X&amp;gt; ]&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;&amp;amp;lt;S&amp;gt; → ( &amp;lt;Y&amp;gt; ]&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;&amp;amp;lt;S&amp;gt; → [ &amp;lt;Y&amp;gt; )&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;&amp;amp;lt;X&amp;gt; → a&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;&amp;amp;lt;Y&amp;gt; → a&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 5. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
&#039;&#039;&#039;(10p)&#039;&#039;&#039; Nacrtati graf memorijske predstave objekata c, d1 i d2:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
class A { int x; }&lt;br /&gt;
class B { int y; }&lt;br /&gt;
class C extends A, B { int z; }&lt;br /&gt;
class D extends B, C { int v; }&lt;br /&gt;
C c; D d1, d2;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Ako je dozvoljen neiskorišćen prostor na nivou objekata.&lt;br /&gt;
# Ako neiskorišćen prostor može da postoji samo na nivou klase, a ne i objekata&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 6. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
&#039;&#039;&#039;(10p)&#039;&#039;&#039; Dat je sledeći program na jeziku sličnom Pascalu. Statičko okruženje za nelokalne promenljive je realizovano pomoću pristupnih veza. Glavni program poseduje sopstveni akcioni zapis na steku.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Prikazati jasno i precizno izgled steka poziva neposredno pre povratka iz procedure c. &amp;lt;u&amp;gt;Voditi računa o formatu aktivacionih zapisa&amp;lt;/u&amp;gt;&lt;br /&gt;
# Napisati kompletan 80x86 asemblerski kod koji bi kompajler izgenerisao za procedure c i d (enter i leave instrukcije ne postoje)&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
program Sep23 (output);&lt;br /&gt;
    var g, t: integer&lt;br /&gt;
&lt;br /&gt;
    procedure b(p: integer)&lt;br /&gt;
        var m: integer;&lt;br /&gt;
&lt;br /&gt;
        procedure c ()&lt;br /&gt;
        begin&lt;br /&gt;
            g := m+t;&lt;br /&gt;
        end; {c}&lt;br /&gt;
        procedure d (p: integer)&lt;br /&gt;
            t := p+2;&lt;br /&gt;
            c();&lt;br /&gt;
        end {d}&lt;br /&gt;
    begin&lt;br /&gt;
        m := p+1;&lt;br /&gt;
        d(m);&lt;br /&gt;
    end; {b}&lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
    g := 1&lt;br /&gt;
    b(g);&lt;br /&gt;
end. {Sep23}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:Програмски преводиоци 1]]&lt;/div&gt;</summary>
		<author><name>Fedja</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9F%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D1%81%D0%BA%D0%B8_%D0%BF%D1%80%D0%B5%D0%B2%D0%BE%D0%B4%D0%B8%D0%BE%D1%86%D0%B8_1/%D0%A1%D0%B5%D0%BF%D1%82%D0%B5%D0%BC%D0%B1%D0%B0%D1%80_2023&amp;diff=6722</id>
		<title>Програмски преводиоци 1/Септембар 2023</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9F%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D1%81%D0%BA%D0%B8_%D0%BF%D1%80%D0%B5%D0%B2%D0%BE%D0%B4%D0%B8%D0%BE%D1%86%D0%B8_1/%D0%A1%D0%B5%D0%BF%D1%82%D0%B5%D0%BC%D0%B1%D0%B0%D1%80_2023&amp;diff=6722"/>
		<updated>2023-10-23T09:59:47Z</updated>

		<summary type="html">&lt;p&gt;Fedja: sept 2023&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
{{nerešeno}}&lt;br /&gt;
&#039;&#039;&#039;Ispit u septembarskom roku 2023. godine&#039;&#039;&#039; održan je 16. Septembra.&lt;br /&gt;
&lt;br /&gt;
== 1. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
&#039;&#039;&#039;(10p)&#039;&#039;&#039; Dat je deo implementacije klase &#039;&#039;Node&#039;&#039; u programskom jeziku &#039;&#039;Java&#039;&#039;, koja predstavlja čvor u sintaksnom stablu izgenerisanom za konstrukciju DKA korišćenjem metoda pozicije, gde su objašnjenja polja i metoda data u komentarima iznad njih (sva polja su inicijalizovana konstruktorom):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
    public class Node {&lt;br /&gt;
        private enum Type {&lt;br /&gt;
            ASTERISK,   // *&lt;br /&gt;
            PLUS,       // +&lt;br /&gt;
            PERIOD,     // .&lt;br /&gt;
            OR,         // |&lt;br /&gt;
            SYMBOL,     // s&lt;br /&gt;
            EPSILON     // ε&lt;br /&gt;
        }&lt;br /&gt;
        // left subtree of position node, null if leaf (symbol) node&lt;br /&gt;
        private Node left;&lt;br /&gt;
&lt;br /&gt;
        // right subtree of position node, null if unary operation or leaf (symbol) node&lt;br /&gt;
        private Node right;&lt;br /&gt;
&lt;br /&gt;
        // type of position node&lt;br /&gt;
        private Type type;&lt;br /&gt;
&lt;br /&gt;
        // position of symbol in regex, only valid for leaf (symbol) nodes, otherwise set to -1&lt;br /&gt;
        private int symbolPos;&lt;br /&gt;
&lt;br /&gt;
        // check whether the subsequence with the given node as root of the subtree can be empty&lt;br /&gt;
        public boolean isNullable();&lt;br /&gt;
&lt;br /&gt;
        // find sert of leaf (symbol) node positions which could be at the beginning of&lt;br /&gt;
        // subsequence with the given node as root of the subtree&lt;br /&gt;
        public Set&amp;lt;Integer&amp;gt; firstPos();&lt;br /&gt;
&lt;br /&gt;
        // find set of leaf (symbol) node positions which could be at the end of&lt;br /&gt;
        // subsequence with the given node as root of the subtree&lt;br /&gt;
        public Set&amp;lt;Integer&amp;gt; lastPos();&lt;br /&gt;
&lt;br /&gt;
        // returns a union of the two parameters&lt;br /&gt;
        public static Set&amp;lt;Integer&amp;gt; union(Set&amp;lt;Integer&amp;gt; first, Set&amp;lt;Integer&amp;gt; second);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Potrebno je napisati implementaciju metoda &amp;lt;code&amp;gt;firstPos()&amp;lt;/code&amp;gt; i &amp;lt;code&amp;gt;lastPos()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 1a. zadatak ===&lt;br /&gt;
Identičan ovakav zadatak (za isti broj poena) se pojavio u Avgustu 2023, samo se tražila implementacija &amp;lt;code&amp;gt;isNullable()&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== 2. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
&#039;&#039;&#039;(10p)&#039;&#039;&#039; Za rekurzivni spust koji opisuje navedenu gramatiku, koji su opisani ispod:&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Dopuniti delove rekurzivnog spusta obeleženih sa labelama PN (N označava labelu koja se može popuniti i može predstavljati jednu ili više linija koda), ukoliko je poznato da se sekvence &#039;&#039;aadddbb&#039;&#039;, &#039;&#039;dd&#039;&#039; i &#039;&#039;ab&#039;&#039; prihvataju.&lt;br /&gt;
# Napisati LL(1) gramatiku opisanu rekurzivnim spustom.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
Glavni program:&lt;br /&gt;
IN = NEXTCHAR();&lt;br /&gt;
call PROCS;&lt;br /&gt;
if (INP&amp;lt;&amp;gt; &#039;˧&#039;)&lt;br /&gt;
    then REJECT;&lt;br /&gt;
    else ACCEPT;&lt;br /&gt;
end if;&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
procedure PROCS:&lt;br /&gt;
    case IN of&lt;br /&gt;
        &#039;a&#039;: goto P1;&lt;br /&gt;
        &#039;d&#039;, &#039;b&#039;, &#039;˧&#039;: goto P2;&lt;br /&gt;
        default: REJECT;&lt;br /&gt;
    end case;&lt;br /&gt;
P1: /* ... */&lt;br /&gt;
P2: /* ... */&lt;br /&gt;
end procedure;&lt;br /&gt;
&lt;br /&gt;
procedure PROCA:&lt;br /&gt;
    case IN of&lt;br /&gt;
        &#039;b&#039;, &#039;˧&#039;: goto P3;&lt;br /&gt;
        &#039;d&#039;: goto P4;&lt;br /&gt;
        default: REJECT;&lt;br /&gt;
    end case;&lt;br /&gt;
P3: /* ... */&lt;br /&gt;
P4: /* ... */&lt;br /&gt;
end procedure;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 3. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
&#039;&#039;&#039;(10p)&#039;&#039;&#039; Za dati Mikrojava bajtkod:&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Navesti izlaz programa.&lt;br /&gt;
# Rekonstruisati izvorni Mikrojava kod na osnovu datog bajtkoda.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
0:      enter 2 2&lt;br /&gt;
3:      load_0&lt;br /&gt;
4:      load_1&lt;br /&gt;
5:      mul&lt;br /&gt;
6:      jmp 3 (=9)&lt;br /&gt;
9:      exit&lt;br /&gt;
10:     return&lt;br /&gt;
11:     enter 2 3&lt;br /&gt;
14:     const_0&lt;br /&gt;
15:     store_2&lt;br /&gt;
16:     load_2&lt;br /&gt;
17:     load_1&lt;br /&gt;
18:     jge 21 (=39)&lt;br /&gt;
21:     load_0&lt;br /&gt;
22:     load_2&lt;br /&gt;
23:     aload&lt;br /&gt;
24:     const_0&lt;br /&gt;
25:     print&lt;br /&gt;
26:     const 32&lt;br /&gt;
31:     const_0&lt;br /&gt;
32:     bprint&lt;br /&gt;
33:     inc 2,1&lt;br /&gt;
36:     jmp -20 (=16)&lt;br /&gt;
39:     const 10&lt;br /&gt;
44:     const_0&lt;br /&gt;
45:     bprint&lt;br /&gt;
46:     exit&lt;br /&gt;
47:     return&lt;br /&gt;
48:     enter 0 5&lt;br /&gt;
51:     const_0&lt;br /&gt;
52:     store_0&lt;br /&gt;
53:     const 10&lt;br /&gt;
58:     newarray 1&lt;br /&gt;
60:     store_1&lt;br /&gt;
61:     const 10&lt;br /&gt;
66:     newarray 1&lt;br /&gt;
68:     store_2&lt;br /&gt;
69:     load_0&lt;br /&gt;
70:     const 10&lt;br /&gt;
75:     jge 74 (=149)&lt;br /&gt;
78:     load_1&lt;br /&gt;
79:     load_0&lt;br /&gt;
80:     load_0&lt;br /&gt;
81:     const 10&lt;br /&gt;
86:     mul&lt;br /&gt;
87:     load_0&lt;br /&gt;
88:     const_3&lt;br /&gt;
89:     rem&lt;br /&gt;
90:     add&lt;br /&gt;
91:     astore&lt;br /&gt;
92:     load_0&lt;br /&gt;
93:     const_2&lt;br /&gt;
94:     rem&lt;br /&gt;
95:     const_1&lt;br /&gt;
96:     jne 12 (=108)&lt;br /&gt;
99:     load_1&lt;br /&gt;
100:    load_0&lt;br /&gt;
101:    const_1&lt;br /&gt;
102:    neg&lt;br /&gt;
103:    load_1&lt;br /&gt;
104:    load_0&lt;br /&gt;
105:    aload&lt;br /&gt;
106:    mul&lt;br /&gt;
107:    astore&lt;br /&gt;
108:    load_1&lt;br /&gt;
109:    load_0&lt;br /&gt;
110:    aload&lt;br /&gt;
111:    const_2&lt;br /&gt;
112:    call -112 (=0)&lt;br /&gt;
115:    store_3&lt;br /&gt;
116:    load_1&lt;br /&gt;
117:    load_0&lt;br /&gt;
118:    aload&lt;br /&gt;
119:    const_3&lt;br /&gt;
120:    call -120 (=0)&lt;br /&gt;
123:    store 4&lt;br /&gt;
125:    load_3&lt;br /&gt;
126:    load 4&lt;br /&gt;
128:    jle 10 (=138)&lt;br /&gt;
131:    load_2&lt;br /&gt;
132:    load_0&lt;br /&gt;
133:    load_3&lt;br /&gt;
134:    astore&lt;br /&gt;
135:    jmp 8 (=143)&lt;br /&gt;
138:    load_2&lt;br /&gt;
139:    load_0&lt;br /&gt;
140:    load 4&lt;br /&gt;
142:    astore&lt;br /&gt;
143:    inc 0,1&lt;br /&gt;
146:    jmp -77 (=69)&lt;br /&gt;
149:    load_1&lt;br /&gt;
150:    const 10&lt;br /&gt;
155:    call -144 (=11)&lt;br /&gt;
158:    load_2&lt;br /&gt;
159:    const 10&lt;br /&gt;
164:    call -153 (=11)&lt;br /&gt;
167:    exit&lt;br /&gt;
168:    return&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 4. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
&#039;&#039;&#039;(10p)&#039;&#039;&#039; Za datu gramatiku konstruisati:&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# LR(0) karakteristični automat&lt;br /&gt;
# LALR(1) karakteristični automat&lt;br /&gt;
# Za oba slučaja LR(0) i LALR(1) navesti stanja sa po jednim konfliktom i objasniti o kom se konfliktu radi, u slučaju da konflikt postoji. Nije potrebno konstruisati tabele parsera.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Oba automata prikazati u vidu grafa prelaza, unutar stanja napisati konfiguracije.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;&amp;amp;lt;S&amp;gt; → ( &amp;lt;X&amp;gt; )&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;&amp;amp;lt;S&amp;gt; → [ &amp;lt;X&amp;gt; ]&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;&amp;amp;lt;S&amp;gt; → ( &amp;lt;Y&amp;gt; ]&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;&amp;amp;lt;S&amp;gt; → [ &amp;lt;Y&amp;gt; )&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;&amp;amp;lt;X&amp;gt; → a&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;&amp;amp;lt;Y&amp;gt; → a&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 5. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
&#039;&#039;&#039;(10p)&#039;&#039;&#039; Nacrtati graf memorijske predstave objekata c, d1 i d2:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
class A { int x; }&lt;br /&gt;
class B { int y; }&lt;br /&gt;
class C extends A, B { int z; }&lt;br /&gt;
class D extends B, C { int v; }&lt;br /&gt;
C c; D d1, d2;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Ako je dozvoljen neiskorišćen prostor na nivou objekata.&lt;br /&gt;
# Ako neiskorišćen prostor može da postoji samo na nivou klase, a ne i objekata&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 6. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
&#039;&#039;&#039;(10p)&#039;&#039;&#039; Dat je sledeći program na jeziku sličnom Pascalu. Statičko okruženje za nelokalne promenljive je realizovano pomoću pristupnih veza. Glavni program poseduje sopstveni akcioni zapis na steku.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Prikazati jasno i precizno izgled steka poziva neposredno pre povratka iz procedure c. &amp;lt;u&amp;gt;Voditi računa o formatu aktivacionih zapisa&amp;lt;/u&amp;gt;&lt;br /&gt;
# Napisati kompletan 80x86 asemblerski kod koji bi kompajler izgenerisao za procedure c i d (enter i leave instrukcije ne postoje)&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
program Sep23 (output);&lt;br /&gt;
    var g, t: integer&lt;br /&gt;
&lt;br /&gt;
    procedure b(p: integer)&lt;br /&gt;
        var m: integer;&lt;br /&gt;
&lt;br /&gt;
        procedure c ()&lt;br /&gt;
        begin&lt;br /&gt;
            g := m+t;&lt;br /&gt;
        end; {c}&lt;br /&gt;
        procedure d (p: integer)&lt;br /&gt;
            t := p+2;&lt;br /&gt;
            c();&lt;br /&gt;
        end {d}&lt;br /&gt;
    begin&lt;br /&gt;
        m := p+1;&lt;br /&gt;
        d(m);&lt;br /&gt;
    end; {b}&lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
    g := 1&lt;br /&gt;
    b(g);&lt;br /&gt;
end. {Sep23}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:Програмски преводиоци 1]]&lt;/div&gt;</summary>
		<author><name>Fedja</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9F%D1%80%D0%BE%D1%98%D0%B5%D0%BA%D1%82%D0%BE%D0%B2%D0%B0%D1%9A%D0%B5_%D1%81%D0%BE%D1%84%D1%82%D0%B2%D0%B5%D1%80%D0%B0/%D0%9A1_2022&amp;diff=6720</id>
		<title>Пројектовање софтвера/К1 2022</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9F%D1%80%D0%BE%D1%98%D0%B5%D0%BA%D1%82%D0%BE%D0%B2%D0%B0%D1%9A%D0%B5_%D1%81%D0%BE%D1%84%D1%82%D0%B2%D0%B5%D1%80%D0%B0/%D0%9A1_2022&amp;diff=6720"/>
		<updated>2023-10-22T16:16:10Z</updated>

		<summary type="html">&lt;p&gt;Fedja: greška u prepisivanju&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&#039;&#039;&#039;Prvi kolokvijum 2022. godine&#039;&#039;&#039; održan je regularno u prvoj kolokvijumskoj nedelji (5. nedelja semestra) i trajao je 20 minuta.&lt;br /&gt;
{{rešenja}}&lt;br /&gt;
&lt;br /&gt;
== 1. zadatak ==&lt;br /&gt;
Koji od sledećih principa predstavljaju obavezne principe objektno orijentisanog modela?&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot; data-solution=&amp;quot;multiple&amp;quot;&amp;gt;&lt;br /&gt;
# Konkurentnost&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Hijerarhija&amp;lt;/span&amp;gt;&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Modularnost&amp;lt;/span&amp;gt;&lt;br /&gt;
# Jednostavnost&lt;br /&gt;
# Perzistencija&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Kapsulacija&amp;lt;/span&amp;gt;&lt;br /&gt;
# Prenosivost&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Apstrakcija&amp;lt;/span&amp;gt;&lt;br /&gt;
# Fleksibilnost&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2. zadatak ==&lt;br /&gt;
Izaberite jedan ili više odgovora:&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot; data-solution=&amp;quot;multiple&amp;quot;&amp;gt;&lt;br /&gt;
# Artefakt je stvar organizacije.&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Paket i radni okvir (eng. &#039;&#039;framework&#039;&#039;) su stvari organizacije.&amp;lt;/span&amp;gt;&lt;br /&gt;
# Slučaj korišćenja (eng. &#039;&#039;use-case&#039;&#039;) je stvar ponašanja.&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Automat stanja je stvar ponašanja.&amp;lt;/span&amp;gt;&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Klasa, aktivna klasa i interfejs su stvari strukure&amp;lt;sup&amp;gt;[sic]&amp;lt;/sup&amp;gt;.&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 3. zadatak ==&lt;br /&gt;
Za relacije koje se pojavljuju na dijagramima klasa izabrati opis koji ih najbolje određuje:&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot; data-solution=&amp;quot;select&amp;quot; data-options=&amp;quot;Povezuje stvari kod kojih izmena jedne stvari utiče na ponašanje druge stvari, Povezuje specijalizovane stvari sa opštijim, Apstrakcija veza između objekata odgovarajućih klasa u relaciji, Semantička relacija između klasifikatora od kojih jedan specificira ugovor a drugi garantuje njegovu implementaciju&amp;quot;&amp;gt;&lt;br /&gt;
# Zavisnost &amp;lt;span class=&amp;quot;spoiler&amp;quot;&amp;gt;Povezuje stvari kod kojih izmena jedne stvari utiče na ponašanje druge stvari&amp;lt;/span&amp;gt;&lt;br /&gt;
# Asocijacija &amp;lt;span class=&amp;quot;spoiler&amp;quot;&amp;gt;Apstrakcija veza između objekata odgovarajućih klasa u relaciji&amp;lt;/span&amp;gt;&lt;br /&gt;
# Generalizacija &amp;lt;span class=&amp;quot;spoiler&amp;quot;&amp;gt;Povezuje specijalizovane stvari sa opštijim&amp;lt;/span&amp;gt;&lt;br /&gt;
# Realizacija &amp;lt;span class=&amp;quot;spoiler&amp;quot;&amp;gt;Semantička relacija između klasifikatora od kojih jedan specificira ugovor a drugi garantuje njegovu implementaciju&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Napomena: &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;explanation&amp;quot;&amp;gt;Bilo je ponuđeno još 3 odgovora, ali izgubljeni su zubom vremena. Neformalno rečeno nešto kao &amp;quot;povezuje stvari tako da jedna igra ulogu celine a druge ulogu dela&amp;quot; (misli se na agregaciju) i &amp;quot;povezuje stvari tako da postoji odnos celina/deo ali je celina odgovorna za životni vek dela&amp;quot; (misli se na kompoziciju)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 4. zadatak ==&lt;br /&gt;
Koja ključna reč treba da stoji umesto znakova pitanja &amp;amp;lt;&amp;amp;lt;???&amp;gt;&amp;gt; kao oznaka relacije privatnog uvoza između dva paketa?&lt;br /&gt;
&lt;br /&gt;
Odgovor: &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;access&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 5. zadatak ==&lt;br /&gt;
Koji ukrasi mogu da se pojave na vezama, na dijagramu objekata?&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot; data-solution=&amp;quot;multiple&amp;quot;&amp;gt;&lt;br /&gt;
# multiplikativnost 1..*&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;simbol agregacije ili kompozicije&amp;lt;/span&amp;gt;&lt;br /&gt;
# ugnežđivanje (+ u kružiću)&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;vidljivost (pravo pristupa) uloge na kraju veze, preko objekta na drugom kraju veze&amp;lt;/span&amp;gt;&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;jednosmerna ili dvosmerna navigabilnost (strelice)&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 6. zadatak ==&lt;br /&gt;
Koje tvrdnje o projektnim uzorcima su tačne?&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot; data-solution=&amp;quot;multiple&amp;quot;&amp;gt;&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Svaki objektno orijentisani projektni uzorak je zabeleženo iskustvo projektovanja.&amp;lt;/span&amp;gt;&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Svaki objektno orijentisani projektni uzorak sistematično imenuje, objašnjava i ocenjuje važno projektno rešenje.&amp;lt;/span&amp;gt;&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Svaki objektno orijentisani projektni uzorak identifikuje učestvujuće klase i objekte, njihove relacije, njihove uloge u saradnji i raspodelu odgovornosti.&amp;lt;/span&amp;gt;&lt;br /&gt;
# Svaki objektno orijentisani projektni uzorak pozitivno doprinosi portabilnosti (prenosivosti) implementiranog softvera.&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Svaki objektno orijentisani projektni uzorak opisuje reupotrebljivo jezgro rešenja ponavljajućeg problema.&amp;lt;/span&amp;gt;&lt;br /&gt;
# Svaki objektno orijentisani projektni uzorak predstavlja gotovo rešenje problema koje se nalazi u biblioteci klasa ili radnom okviru.&lt;br /&gt;
# Svaki objektno orijentisani projektni uzorak pozitivno doprinosi efikasnosti (brzini) implementiranog softvera.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 7. zadatak ==&lt;br /&gt;
Koje tvrdnje u vezi sa projektnim uzorkom &#039;&#039;Šablonski metod&#039;&#039; su tačne?&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot; data-solution=&amp;quot;multiple&amp;quot;&amp;gt;&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Podrazumevane (&#039;&#039;hook&#039;&#039;) metode implementiraju podrazumevano ponašanje u apstraktnoj klasi i ne moraju da budu implementirane u konkretnim klasama.&amp;lt;/span&amp;gt;&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Dozvoljeno je da šablonski metod sadrži pozive samo apstraktnih metoda.&amp;lt;/span&amp;gt;&lt;br /&gt;
# U klasama koje implementiraju projektni uzorak &#039;&#039;Šablonski metod&#039;&#039; ključno je pozivanje metoda osnovne klase iz metoda izvedene klase.&lt;br /&gt;
# &#039;&#039;Šablonski metod&#039;&#039; omogućava dinamičku promenu koraka nekog algoritma.&lt;br /&gt;
# &#039;&#039;Šablonski metod&#039;&#039; je objektni uzorak ponašanja.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 8. zadatak ==&lt;br /&gt;
Koje od navedenih tvrdnji su tačne za projektni uzorak &#039;&#039;Prototip&#039;&#039;?&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot; data-solution=&amp;quot;multiple&amp;quot;&amp;gt; &lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Uzorak treba koristiti kada sistem treba da bude nezavisan od toga kako se njegovi proizvodi stvaraju i predstavljaju.&amp;lt;/span&amp;gt;&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Uzorak je namenjen stvaranju novih primeraka (objekata) kloniranjem postojećeg primerka.&amp;lt;/span&amp;gt;&lt;br /&gt;
# Uzorak se često koristi u kombinaciji sa projektnim uzorkom &#039;&#039;Unikat&#039;&#039;.&lt;br /&gt;
# Ne mora svaka potklasa koja predstavlja učesnika apstraktne klase &#039;&#039;Prototip&#039;&#039; da implementira operaciju za kopiranje.&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Uzorak treba koristiti kada se klase specificiraju u vreme izvršavanja.&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 9. zadatak ==&lt;br /&gt;
Koje od navedenih tvrdnji su tačne za projektni uzorak &#039;&#039;Sastav&#039;&#039;?&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot; data-solution=&amp;quot;multiple&amp;quot;&amp;gt; &lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Uzorak čini jednostavnim dodavanje nove vrste elemenata.&amp;lt;/span&amp;gt;&lt;br /&gt;
# Projektni uzorak &#039;&#039;Sastav&#039;&#039; omogućuje jednostavno ograničavanje vrste elemenata koje neki sastavi sadrže.&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Omogućava klijentima da uniformno tretiraju individualne objekte i njihove kompozicije.&amp;lt;/span&amp;gt;&lt;br /&gt;
# Projektni uzorak &#039;&#039;Sastav&#039;&#039; predstavlja objektni uzorak kreiranja.&lt;br /&gt;
# Klasa koja predstavlja učesnika apstraktnog tipa &#039;&#039;&#039;&#039;&#039;Element&#039;&#039;&#039;&#039;&#039; ne treba da sadrži u ugovoru sve metode učesnika konkretnog tipa &#039;&#039;&#039;Sastav&#039;&#039;&#039;.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 10. zadatak ==&lt;br /&gt;
Koliko bi se ukupno objekata napravilo ukoliko bi bilo potrebno napraviti tekst komponentu sa dva klizača i jednim okvirom? Uzeti da se za stvaranje objekata koriste klase koje su prikazane na klasnom dijagramu ispod.&lt;br /&gt;
&lt;br /&gt;
[[Датотека:PS K1 2022 zadatak 10.svg|center|frame|Slika uz deseti zadatak.]]&lt;br /&gt;
&lt;br /&gt;
Odgovor: &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;4&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:Пројектовање софтвера]]&lt;/div&gt;</summary>
		<author><name>Fedja</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9C%D0%B8%D0%BA%D1%80%D0%BE%D0%BF%D1%80%D0%BE%D1%86%D0%B5%D1%81%D0%BE%D1%80%D1%81%D0%BA%D0%B8_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B8/%D0%A4%D0%B5%D0%B1%D1%80%D1%83%D0%B0%D1%80_2022&amp;diff=6495</id>
		<title>Микропроцесорски системи/Фебруар 2022</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9C%D0%B8%D0%BA%D1%80%D0%BE%D0%BF%D1%80%D0%BE%D1%86%D0%B5%D1%81%D0%BE%D1%80%D1%81%D0%BA%D0%B8_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B8/%D0%A4%D0%B5%D0%B1%D1%80%D1%83%D0%B0%D1%80_2022&amp;diff=6495"/>
		<updated>2023-09-17T16:30:24Z</updated>

		<summary type="html">&lt;p&gt;Fedja: /* homework.h */ nije homework.h nego homework.c&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&#039;&#039;&#039;Фебруарски рок 2022. године&#039;&#039;&#039; нема поставку доступну са странице предмета. Није много познато о овом року, осим задатка наведеног испод.&lt;br /&gt;
&lt;br /&gt;
== Задатак ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
[[Датотека:MIPS februar 2022 referentna šema.svg|thumb|Референтна шема у задатку.]]&lt;br /&gt;
# &amp;lt;del&amp;gt;У систему постоји један микроконтролер који контролише вентилатор у складу са тренутном вредношћу температуре. У симулатору Proteus направити пројекат и инстанцирати микроконтролер &#039;&#039;STM32F103R6&#039;&#039; (&#039;&#039;CM3_STM32&#039;&#039;). Направити пројекат у алату &#039;&#039;CubeMX&#039;&#039; који ће служити за конфигурисање микроконтролера.&amp;lt;/del&amp;gt;&lt;br /&gt;
# &amp;lt;del&amp;gt;У симулатору Proteus додати следеће компоненте&amp;lt;/del&amp;gt; &amp;lt;u&amp;gt;строго према датој референтној шеми&amp;lt;/u&amp;gt;:&lt;br /&gt;
#* &amp;lt;del&amp;gt;електромотор &#039;&#039;MOTOR&#039;&#039; (&#039;&#039;MOTORS&#039;&#039;) који представља вентилатор и чија ће брзина рада бити контролисана PWM сигналом канала 1 тајмера 3 микроконтролера,&amp;lt;/del&amp;gt;&lt;br /&gt;
#* тастатуру &#039;&#039;KEYPAD-PHONE&#039;&#039; (&#039;&#039;ACTIVE&#039;&#039;) повезану у складу са референтном шемом,&lt;br /&gt;
#* &amp;lt;del&amp;gt;температурни сензор &#039;&#039;LM35&#039;&#039; (&#039;&#039;NATDAC&#039;&#039;) чији је излазни пин повезан на канал 7 аналогно-дигиталног конвертора микроконтролера (аналогна вредност напона на излазном пину сензора је линеарно пропорционална вредности температуре),&amp;lt;/del&amp;gt;&lt;br /&gt;
#* кишомер &#039;&#039;RAINGAUGE&#039;&#039; (&#039;&#039;ACTIVE&#039;&#039;) повезан у складу са референтном шемом на моностабилни мултивибратор &#039;&#039;74HC221&#039;&#039; (&#039;&#039;74HC&#039;&#039;); кишомер ради по принципу кофе са превртањем (кофа се пуни кишницом све док се не препуни, затим долази до њеног превртања и потпуног пражњења уз генерисање електричног импулса); моностабилни мултивибратор обезбеђује униформно трајање генерисаног електричног импулса; подесити на кишомеру ниво превртања кофе (&#039;&#039;Trigger Level&#039;&#039;) на вредност 0.01 милиметара услед чега ће кофа слати електрични импулс на сваких 1200 милисекунди при константном интензитету падавине од 30.0 милиметара по сат (за већи интензитет падавине импулс ће стизати брже и обрнуто); подесити на моностабилном мултивибратору временску константу (&#039;&#039;Monostable Time Constant&#039;&#039;) на једну милисекунду (&amp;lt;code&amp;gt;1mS&amp;lt;/code&amp;gt;) услед чега ће сигнал на његовом излазу увек трајати тачно једну милисекунду,&lt;br /&gt;
#* &amp;lt;del&amp;gt;виртуелни терминал повезан на периферију &#039;&#039;USART1&#039;&#039; микроконтролера,&amp;lt;/del&amp;gt;&lt;br /&gt;
#* LCD дисплеј &#039;&#039;LM041L&#039;&#039; (&#039;&#039;DISPLAY&#039;&#039;) са четири линије, којима редом одговарају почетне адресе &amp;lt;code&amp;gt;0x80&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;0xC0&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;0x90&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;0xD0&amp;lt;/code&amp;gt; у &#039;&#039;DDRAM&#039;&#039; меморији контролера &#039;&#039;HD44780&#039;&#039;, &amp;lt;del&amp;gt;повезан на пинове &#039;&#039;PC0&#039;&#039;-&#039;&#039;PC6&#039;&#039; микроконтролера и&amp;lt;/del&amp;gt;&lt;br /&gt;
#* двобојну &#039;&#039;LED-BIRG&#039;&#039; (&#039;&#039;ACTIVE&#039;&#039;), повезану у складу са референтном шемом, којој треба подесити јачину струје пуног провода (&#039;&#039;Full drive current&#039;&#039;) на један микро ампер (&amp;lt;code&amp;gt;1uA&amp;lt;/code&amp;gt;); ова диода дозвољава проток струје у оба смера при чему светли различитом бојом у зависности од смера протока струје.&lt;br /&gt;
# Обезбедити приказ поруке &#039;&#039;&#039;&#039;&#039;Temp: &amp;amp;lt;t&amp;gt;&#039;&#039;&#039;&#039;&#039; на виртуелном терминалу, где је &#039;&#039;&amp;amp;lt;t&amp;gt;&#039;&#039; тренутна вредност температуре изражено у степенима Целзијуса у опсегу [0, 60] &amp;lt;u&amp;gt;очитана са температурног сензора&amp;lt;/u&amp;gt;. Освежавање описане поруке вршити периодично на сваких 200 милисекунди уколико је дошло до промене вредности. Приликом освежавања поруке променити тренутне вредности у постојећој поруци уместо додавања нове поруке на виртуелном терминалу.&lt;br /&gt;
# Обезбедити приказ поруке &#039;&#039;&#039;&#039;&#039;Kisa: &amp;amp;lt;k&amp;gt;&#039;&#039;&#039;&#039;&#039; у првом реду &#039;&#039;LCD&#039;&#039; дисплеја, где &#039;&#039;&amp;amp;lt;k&amp;gt;&#039;&#039; представља тренутну вредност интензитета падавине изражено у милиметрима по сату &amp;lt;u&amp;gt;очитану са кишомера&amp;lt;/u&amp;gt;. Освежавање поруке вршити периодично на сваких 200 милисекунди уколико је дошло до промене вредности.&lt;br /&gt;
# Обезбедити могућност уноса вредности &#039;&#039;temp_granica&#039;&#039;, која представља границу температуре за укључивање вентилатора, преко тастатуре и приказ поруке &#039;&#039;&#039;&#039;&#039;Thld:(??)=&amp;gt;&amp;amp;lt;thld&amp;gt;&#039;&#039;&#039;&#039;&#039; у четвртом реду &#039;&#039;LCD&#039;&#039; дисплеја у складу са референтним снимком, где &amp;lt;thld&amp;gt; представља тренутно важећу вредност границе (иницијална вредност границе је 30) а на месту знакова питања се приказују притиснути тастери до тренутка када се притисне други по реду тастер услед чега се поставља нова вредност границе и враћају знакови питања. Освежавање поруке вршити периодично на сваких 200 милисекунди уколико је дошло до промене вредности.&lt;br /&gt;
# Обезбедити понашање двобојне &#039;&#039;LED&#039;&#039; описано у наставку. Двобојна &#039;&#039;LED&#039;&#039; константно светли зеленом бојом када је тренутна температура нижа од &#039;&#039;temp_granica&#039;&#039;, док уколико је тренутна температура једнака или већа од &#039;&#039;temp_granica&#039;&#039; двобојна &#039;&#039;LED&#039;&#039; трепери црвеном бојом са периодом од једне секунде (пола секунде светли, пола секунде не светли).&lt;br /&gt;
# Обезбедити контролу вентилатора на начин описан у наставку. Зависно од тренутне вредности температуре вентилатор се врти одговарајућом брзином. Уколико тренутна вредност температуре припада опсегу:&lt;br /&gt;
#* [0, &#039;&#039;temp_granica&#039;&#039;) вентилатор се не врти и&lt;br /&gt;
#* [&#039;&#039;temp_granica&#039;&#039;, 60] вентилатор се врти брзином једнаком 50% максималне брзине&lt;br /&gt;
#: Ажурирање брзине вентилатора вршити периодично на 200 милисекунди.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
Цело решење може се преузети [[Медиј:MIPS februar 2022 projekat.zip|одавде]]. Решење је засновано на [[Медиј:MIPS domaći zadatak 2023.zip|решењу домаћег задатка из 2023. године]], па ће испод бити наведени фајлови измењени у односу на то решење.&lt;br /&gt;
&lt;br /&gt;
Сви релевантни измењени фајлови са кодом налазе се у &amp;lt;code&amp;gt;cubemx/code/Core/Src&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;cubemx/code/Core/Inc&amp;lt;/code&amp;gt; директоријумима.&lt;br /&gt;
&lt;br /&gt;
==== &#039;&#039;CubeMX&#039;&#039; ====&lt;br /&gt;
У алату &#039;&#039;CubeMX&#039;&#039; направљене су следеће измене на пројекту из домаћег задатка:&lt;br /&gt;
* Омогућени су прекиди од EXTI.&lt;br /&gt;
* Пинови PB&amp;lt;sub&amp;gt;3..0&amp;lt;/sub&amp;gt; и PB&amp;lt;sub&amp;gt;9..8&amp;lt;/sub&amp;gt; су подешени као GPIO_Output, пинови PB&amp;lt;sub&amp;gt;4..6&amp;lt;/sub&amp;gt; као GPIO_Input, док су пинови PB&amp;lt;sub&amp;gt;7&amp;lt;/sub&amp;gt; и PB&amp;lt;sub&amp;gt;10&amp;lt;/sub&amp;gt; подешени као EXTI.&lt;br /&gt;
Након генерисања, линија 310 у &amp;lt;code&amp;gt;Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM3/port.c&amp;lt;/code&amp;gt; је закоментарисана.&lt;br /&gt;
&lt;br /&gt;
==== &#039;&#039;Makefile&#039;&#039; ====&lt;br /&gt;
У односу на пројекат из домаћег задатка, у &#039;&#039;Makefile&#039;&#039; је додат &amp;lt;code&amp;gt;keypad.c&amp;lt;/code&amp;gt; фајл.&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;keypad.h&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#ifndef CORE_INC_KEYPAD_H_&lt;br /&gt;
#define CORE_INC_KEYPAD_H_&lt;br /&gt;
&lt;br /&gt;
extern char keys[2];&lt;br /&gt;
extern unsigned temp_granica;&lt;br /&gt;
extern int keysChanged;&lt;br /&gt;
&lt;br /&gt;
void KEY_Init();&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;keypad.c&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;keypad.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;FreeRTOS.h&amp;quot;&lt;br /&gt;
#include &amp;quot;task.h&amp;quot;&lt;br /&gt;
#include &amp;quot;timers.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;gpio.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
char keys[2];&lt;br /&gt;
unsigned temp_granica = 30;&lt;br /&gt;
int keysChanged = 1;&lt;br /&gt;
&lt;br /&gt;
static int keyCount = 0;&lt;br /&gt;
static int keyReleased = 1;&lt;br /&gt;
&lt;br /&gt;
TaskHandle_t KEY_TaskHandle;&lt;br /&gt;
TimerHandle_t KEY_TimerHandle;&lt;br /&gt;
&lt;br /&gt;
const char KEY_MATRIX[4][3] = {&lt;br /&gt;
	{ &#039;1&#039;, &#039;2&#039;, &#039;3&#039; },&lt;br /&gt;
	{ &#039;4&#039;, &#039;5&#039;, &#039;6&#039; },&lt;br /&gt;
	{ &#039;7&#039;, &#039;8&#039;, &#039;9&#039; },&lt;br /&gt;
	{ &#039;*&#039;, &#039;0&#039;, &#039;#&#039; }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
extern void homeworkOverflow();&lt;br /&gt;
&lt;br /&gt;
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) {&lt;br /&gt;
	if (GPIO_Pin == GPIO_PIN_7) {&lt;br /&gt;
		BaseType_t wokenTask = pdFALSE;&lt;br /&gt;
		vTaskNotifyGiveFromISR(KEY_TaskHandle, &amp;amp;wokenTask);&lt;br /&gt;
		portYIELD_FROM_ISR(wokenTask);&lt;br /&gt;
	} else if (GPIO_Pin == GPIO_PIN_10) {&lt;br /&gt;
		homeworkOverflow();&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
static void KEY_Task(void *parameters) {&lt;br /&gt;
	UNUSED(parameters);&lt;br /&gt;
	keys[0] = &#039;?&#039;;&lt;br /&gt;
	keys[1] = &#039;?&#039;;&lt;br /&gt;
	while (1) {&lt;br /&gt;
		for (int row = 0; row &amp;lt; 4; ++row) {&lt;br /&gt;
			HAL_GPIO_WritePin(GPIOB, 1u &amp;lt;&amp;lt; row, GPIO_PIN_SET);&lt;br /&gt;
		}&lt;br /&gt;
		vTaskDelay(pdMS_TO_TICKS(10));&lt;br /&gt;
		if (!keyReleased) {&lt;br /&gt;
			continue;&lt;br /&gt;
		}&lt;br /&gt;
		for (int row = 0; row &amp;lt; 4; ++row) {&lt;br /&gt;
			HAL_GPIO_WritePin(GPIOB, 1u &amp;lt;&amp;lt; row, GPIO_PIN_RESET);&lt;br /&gt;
		}&lt;br /&gt;
		for (int row = 0; row &amp;lt; 4; ++row) {&lt;br /&gt;
			HAL_GPIO_WritePin(GPIOB, 1u &amp;lt;&amp;lt; row, GPIO_PIN_SET);&lt;br /&gt;
			for (int column = 0; column &amp;lt; 3; ++column) {&lt;br /&gt;
				if (HAL_GPIO_ReadPin(GPIOB, 1u &amp;lt;&amp;lt; (4 + column))&lt;br /&gt;
						== GPIO_PIN_SET) {&lt;br /&gt;
					keys[keyCount] = KEY_MATRIX[row][column];&lt;br /&gt;
					if (keyCount == 1) {&lt;br /&gt;
						temp_granica = (keys[0] - &#039;0&#039;) * 10 + keys[1] - &#039;0&#039;;&lt;br /&gt;
						keys[0] = &#039;?&#039;;&lt;br /&gt;
						keys[1] = &#039;?&#039;;&lt;br /&gt;
					}&lt;br /&gt;
					keyCount = 1 - keyCount;&lt;br /&gt;
					keysChanged = 1;&lt;br /&gt;
					keyReleased = 0;&lt;br /&gt;
					xTimerStart(KEY_TimerHandle, portMAX_DELAY);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			HAL_GPIO_WritePin(GPIOB, 1u &amp;lt;&amp;lt; row, GPIO_PIN_RESET);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void KEY_Timer(TimerHandle_t xTimer) {&lt;br /&gt;
	UNUSED(xTimer);&lt;br /&gt;
	if (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_7) == GPIO_PIN_SET) {&lt;br /&gt;
		xTimerStart(KEY_TimerHandle, portMAX_DELAY);&lt;br /&gt;
	} else {&lt;br /&gt;
		keyReleased = 1;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void KEY_Init() {&lt;br /&gt;
	xTaskCreate(KEY_Task, &amp;quot;KEY_Task&amp;quot;, 128, NULL, 5, &amp;amp;KEY_TaskHandle);&lt;br /&gt;
	KEY_TimerHandle = xTimerCreate(&amp;quot;KEY_Timer&amp;quot;, pdMS_TO_TICKS(10), pdFALSE,&lt;br /&gt;
	NULL, KEY_Timer);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;homework.h&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#ifndef CORE_INC_HOMEWORK_H_&lt;br /&gt;
#define CORE_INC_HOMEWORK_H_&lt;br /&gt;
&lt;br /&gt;
typedef enum&lt;br /&gt;
{&lt;br /&gt;
	TURNED_OFF, SLOW, FAST&lt;br /&gt;
} FanState;&lt;br /&gt;
&lt;br /&gt;
extern void homeworkInit();&lt;br /&gt;
extern void homeworkOverflow();&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;homework.c&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;homework.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;FreeRTOS.h&amp;quot;&lt;br /&gt;
#include &amp;quot;task.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;FreeRTOS.h&amp;quot;&lt;br /&gt;
#include &amp;quot;timers.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;driver_lcd.h&amp;quot;&lt;br /&gt;
#include &amp;quot;driver_uart.h&amp;quot;&lt;br /&gt;
#include &amp;quot;driver_motor.h&amp;quot;&lt;br /&gt;
#include &amp;quot;driver_temp.h&amp;quot;&lt;br /&gt;
#include &amp;quot;keypad.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;gpio.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
FanState fanState = TURNED_OFF;&lt;br /&gt;
TimerHandle_t homeworkTimer;&lt;br /&gt;
TimerHandle_t ledTimer;&lt;br /&gt;
&lt;br /&gt;
unsigned passedMs = 0;&lt;br /&gt;
unsigned rainfall = 0;&lt;br /&gt;
&lt;br /&gt;
static uint32_t tempValue;&lt;br /&gt;
static char tempText[4];&lt;br /&gt;
static void homeworkTask(void *parameters) {&lt;br /&gt;
	UNUSED(parameters);&lt;br /&gt;
	char messageTemp[9] = &amp;quot;Temp:   &amp;quot;;&lt;br /&gt;
	char messageKisa[7] = &amp;quot;Kisa: &amp;quot;;&lt;br /&gt;
#pragma GCC diagnostic ignored &amp;quot;-Wtrigraphs&amp;quot;&lt;br /&gt;
	char messageThld[14] = &amp;quot;Thld:(??)=&amp;gt;30&amp;quot;;&lt;br /&gt;
	// Ekvivalentna adresa: 0x80&lt;br /&gt;
	LCD_CommandEnqueue(LCD_INSTRUCTION,&lt;br /&gt;
	LCD_SET_DD_RAM_ADDRESS_INSTRUCTION | 0x00);&lt;br /&gt;
	for (uint32_t i = 0; i &amp;lt; 8; i++) {&lt;br /&gt;
		UART_AsyncTransmitCharacter(messageTemp[i]);&lt;br /&gt;
	}&lt;br /&gt;
	for (uint32_t i = 0; i &amp;lt; 6; i++) {&lt;br /&gt;
		LCD_CommandEnqueue(LCD_DATA, messageKisa[i]);&lt;br /&gt;
	}&lt;br /&gt;
	// Ekvivalentna adresa: 0xD0&lt;br /&gt;
	LCD_CommandEnqueue(LCD_INSTRUCTION,&lt;br /&gt;
	LCD_SET_DD_RAM_ADDRESS_INSTRUCTION | 0x50);&lt;br /&gt;
	for (uint32_t i = 0; i &amp;lt; 13; i++) {&lt;br /&gt;
		LCD_CommandEnqueue(LCD_DATA, messageThld[i]);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	while (1) {&lt;br /&gt;
		tempValue = TEMP_GetCurrentValue();&lt;br /&gt;
		itoa(rainfall, tempText, 10);&lt;br /&gt;
&lt;br /&gt;
		FanState fanStateTarget;&lt;br /&gt;
		if (tempValue &amp;lt; temp_granica) {&lt;br /&gt;
			fanStateTarget = TURNED_OFF;&lt;br /&gt;
		} else {&lt;br /&gt;
			fanStateTarget = SLOW;&lt;br /&gt;
		}&lt;br /&gt;
		for (uint32_t i = 0; i &amp;lt; abs(fanStateTarget - fanState); i++) {&lt;br /&gt;
			if (fanStateTarget &amp;gt; fanState) {&lt;br /&gt;
				MOTOR_SpeedIncrease();&lt;br /&gt;
			} else {&lt;br /&gt;
				MOTOR_SpeedDecrease();&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		fanState = fanStateTarget;&lt;br /&gt;
&lt;br /&gt;
		LCD_CommandEnqueue(LCD_INSTRUCTION,&lt;br /&gt;
		LCD_SET_DD_RAM_ADDRESS_INSTRUCTION | 0x06);&lt;br /&gt;
		for (uint32_t i = 0; i &amp;lt; strlen(tempText); i++) {&lt;br /&gt;
			LCD_CommandEnqueue(LCD_DATA, tempText[i]);&lt;br /&gt;
		}&lt;br /&gt;
		UART_AsyncTransmitCharacter(&#039;\b&#039;);&lt;br /&gt;
		UART_AsyncTransmitCharacter(&#039;\b&#039;);&lt;br /&gt;
		if (tempValue &amp;lt; 10) {&lt;br /&gt;
			UART_AsyncTransmitCharacter(&#039; &#039;);&lt;br /&gt;
		} else {&lt;br /&gt;
			UART_AsyncTransmitCharacter(tempValue / 10 + &#039;0&#039;);&lt;br /&gt;
		}&lt;br /&gt;
		UART_AsyncTransmitCharacter(tempValue % 10 + &#039;0&#039;);&lt;br /&gt;
&lt;br /&gt;
		if (keysChanged) {&lt;br /&gt;
			keysChanged = 0;&lt;br /&gt;
			LCD_CommandEnqueue(LCD_INSTRUCTION,&lt;br /&gt;
			LCD_SET_DD_RAM_ADDRESS_INSTRUCTION | 0x56);&lt;br /&gt;
			LCD_CommandEnqueue(LCD_DATA, keys[0]);&lt;br /&gt;
			LCD_CommandEnqueue(LCD_DATA, keys[1]);&lt;br /&gt;
			LCD_CommandEnqueue(LCD_INSTRUCTION,&lt;br /&gt;
			LCD_SET_DD_RAM_ADDRESS_INSTRUCTION | 0x5B);&lt;br /&gt;
			LCD_CommandEnqueue(LCD_DATA,&lt;br /&gt;
					(temp_granica &amp;lt; 10) ? &#039; &#039; : (temp_granica / 10) + &#039;0&#039;);&lt;br /&gt;
			LCD_CommandEnqueue(LCD_DATA, (temp_granica % 10) + &#039;0&#039;);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		vTaskDelay(pdMS_TO_TICKS(200));&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void homeworkOverflow() {&lt;br /&gt;
	rainfall = 36000 / passedMs;&lt;br /&gt;
	passedMs = 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void homeworkCounter(TimerHandle_t xTimer) {&lt;br /&gt;
	UNUSED(xTimer);&lt;br /&gt;
	++passedMs;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void ledCounter(TimerHandle_t xTimer) {&lt;br /&gt;
	UNUSED(xTimer);&lt;br /&gt;
	if (TEMP_GetCurrentValue() &amp;lt; temp_granica) {&lt;br /&gt;
		HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9, GPIO_PIN_RESET);&lt;br /&gt;
		HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_SET);&lt;br /&gt;
	} else {&lt;br /&gt;
		HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_RESET);&lt;br /&gt;
		HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_9);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void homeworkInit() {&lt;br /&gt;
	LCD_Init();&lt;br /&gt;
	UART_Init();&lt;br /&gt;
	MOTOR_Init();&lt;br /&gt;
	TEMP_Init();&lt;br /&gt;
	KEY_Init();&lt;br /&gt;
	xTaskCreate(homeworkTask, &amp;quot;homeworkTask&amp;quot;, 64, NULL, 5, NULL);&lt;br /&gt;
	homeworkTimer = xTimerCreate(&amp;quot;homeworkTimer&amp;quot;, pdMS_TO_TICKS(1), pdTRUE,&lt;br /&gt;
	NULL, homeworkCounter);&lt;br /&gt;
	xTimerStart(homeworkTimer, portMAX_DELAY);&lt;br /&gt;
	ledTimer = xTimerCreate(&amp;quot;ledTimer&amp;quot;, pdMS_TO_TICKS(500), pdTRUE,&lt;br /&gt;
	NULL, ledCounter);&lt;br /&gt;
	xTimerStart(ledTimer, portMAX_DELAY);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:Микропроцесорски системи]]&lt;/div&gt;</summary>
		<author><name>Fedja</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9C%D0%B8%D0%BA%D1%80%D0%BE%D0%BF%D1%80%D0%BE%D1%86%D0%B5%D1%81%D0%BE%D1%80%D1%81%D0%BA%D0%B8_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B8/%D0%A4%D0%B5%D0%B1%D1%80%D1%83%D0%B0%D1%80_2022&amp;diff=6494</id>
		<title>Микропроцесорски системи/Фебруар 2022</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9C%D0%B8%D0%BA%D1%80%D0%BE%D0%BF%D1%80%D0%BE%D1%86%D0%B5%D1%81%D0%BE%D1%80%D1%81%D0%BA%D0%B8_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B8/%D0%A4%D0%B5%D0%B1%D1%80%D1%83%D0%B0%D1%80_2022&amp;diff=6494"/>
		<updated>2023-09-17T16:28:26Z</updated>

		<summary type="html">&lt;p&gt;Fedja: /* CubeMX */ PB4..6 se koriste kao input radi provere iz koje je kolone kliknuto dugme&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&#039;&#039;&#039;Фебруарски рок 2022. године&#039;&#039;&#039; нема поставку доступну са странице предмета. Није много познато о овом року, осим задатка наведеног испод.&lt;br /&gt;
&lt;br /&gt;
== Задатак ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
[[Датотека:MIPS februar 2022 referentna šema.svg|thumb|Референтна шема у задатку.]]&lt;br /&gt;
# &amp;lt;del&amp;gt;У систему постоји један микроконтролер који контролише вентилатор у складу са тренутном вредношћу температуре. У симулатору Proteus направити пројекат и инстанцирати микроконтролер &#039;&#039;STM32F103R6&#039;&#039; (&#039;&#039;CM3_STM32&#039;&#039;). Направити пројекат у алату &#039;&#039;CubeMX&#039;&#039; који ће служити за конфигурисање микроконтролера.&amp;lt;/del&amp;gt;&lt;br /&gt;
# &amp;lt;del&amp;gt;У симулатору Proteus додати следеће компоненте&amp;lt;/del&amp;gt; &amp;lt;u&amp;gt;строго према датој референтној шеми&amp;lt;/u&amp;gt;:&lt;br /&gt;
#* &amp;lt;del&amp;gt;електромотор &#039;&#039;MOTOR&#039;&#039; (&#039;&#039;MOTORS&#039;&#039;) који представља вентилатор и чија ће брзина рада бити контролисана PWM сигналом канала 1 тајмера 3 микроконтролера,&amp;lt;/del&amp;gt;&lt;br /&gt;
#* тастатуру &#039;&#039;KEYPAD-PHONE&#039;&#039; (&#039;&#039;ACTIVE&#039;&#039;) повезану у складу са референтном шемом,&lt;br /&gt;
#* &amp;lt;del&amp;gt;температурни сензор &#039;&#039;LM35&#039;&#039; (&#039;&#039;NATDAC&#039;&#039;) чији је излазни пин повезан на канал 7 аналогно-дигиталног конвертора микроконтролера (аналогна вредност напона на излазном пину сензора је линеарно пропорционална вредности температуре),&amp;lt;/del&amp;gt;&lt;br /&gt;
#* кишомер &#039;&#039;RAINGAUGE&#039;&#039; (&#039;&#039;ACTIVE&#039;&#039;) повезан у складу са референтном шемом на моностабилни мултивибратор &#039;&#039;74HC221&#039;&#039; (&#039;&#039;74HC&#039;&#039;); кишомер ради по принципу кофе са превртањем (кофа се пуни кишницом све док се не препуни, затим долази до њеног превртања и потпуног пражњења уз генерисање електричног импулса); моностабилни мултивибратор обезбеђује униформно трајање генерисаног електричног импулса; подесити на кишомеру ниво превртања кофе (&#039;&#039;Trigger Level&#039;&#039;) на вредност 0.01 милиметара услед чега ће кофа слати електрични импулс на сваких 1200 милисекунди при константном интензитету падавине од 30.0 милиметара по сат (за већи интензитет падавине импулс ће стизати брже и обрнуто); подесити на моностабилном мултивибратору временску константу (&#039;&#039;Monostable Time Constant&#039;&#039;) на једну милисекунду (&amp;lt;code&amp;gt;1mS&amp;lt;/code&amp;gt;) услед чега ће сигнал на његовом излазу увек трајати тачно једну милисекунду,&lt;br /&gt;
#* &amp;lt;del&amp;gt;виртуелни терминал повезан на периферију &#039;&#039;USART1&#039;&#039; микроконтролера,&amp;lt;/del&amp;gt;&lt;br /&gt;
#* LCD дисплеј &#039;&#039;LM041L&#039;&#039; (&#039;&#039;DISPLAY&#039;&#039;) са четири линије, којима редом одговарају почетне адресе &amp;lt;code&amp;gt;0x80&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;0xC0&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;0x90&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;0xD0&amp;lt;/code&amp;gt; у &#039;&#039;DDRAM&#039;&#039; меморији контролера &#039;&#039;HD44780&#039;&#039;, &amp;lt;del&amp;gt;повезан на пинове &#039;&#039;PC0&#039;&#039;-&#039;&#039;PC6&#039;&#039; микроконтролера и&amp;lt;/del&amp;gt;&lt;br /&gt;
#* двобојну &#039;&#039;LED-BIRG&#039;&#039; (&#039;&#039;ACTIVE&#039;&#039;), повезану у складу са референтном шемом, којој треба подесити јачину струје пуног провода (&#039;&#039;Full drive current&#039;&#039;) на један микро ампер (&amp;lt;code&amp;gt;1uA&amp;lt;/code&amp;gt;); ова диода дозвољава проток струје у оба смера при чему светли различитом бојом у зависности од смера протока струје.&lt;br /&gt;
# Обезбедити приказ поруке &#039;&#039;&#039;&#039;&#039;Temp: &amp;amp;lt;t&amp;gt;&#039;&#039;&#039;&#039;&#039; на виртуелном терминалу, где је &#039;&#039;&amp;amp;lt;t&amp;gt;&#039;&#039; тренутна вредност температуре изражено у степенима Целзијуса у опсегу [0, 60] &amp;lt;u&amp;gt;очитана са температурног сензора&amp;lt;/u&amp;gt;. Освежавање описане поруке вршити периодично на сваких 200 милисекунди уколико је дошло до промене вредности. Приликом освежавања поруке променити тренутне вредности у постојећој поруци уместо додавања нове поруке на виртуелном терминалу.&lt;br /&gt;
# Обезбедити приказ поруке &#039;&#039;&#039;&#039;&#039;Kisa: &amp;amp;lt;k&amp;gt;&#039;&#039;&#039;&#039;&#039; у првом реду &#039;&#039;LCD&#039;&#039; дисплеја, где &#039;&#039;&amp;amp;lt;k&amp;gt;&#039;&#039; представља тренутну вредност интензитета падавине изражено у милиметрима по сату &amp;lt;u&amp;gt;очитану са кишомера&amp;lt;/u&amp;gt;. Освежавање поруке вршити периодично на сваких 200 милисекунди уколико је дошло до промене вредности.&lt;br /&gt;
# Обезбедити могућност уноса вредности &#039;&#039;temp_granica&#039;&#039;, која представља границу температуре за укључивање вентилатора, преко тастатуре и приказ поруке &#039;&#039;&#039;&#039;&#039;Thld:(??)=&amp;gt;&amp;amp;lt;thld&amp;gt;&#039;&#039;&#039;&#039;&#039; у четвртом реду &#039;&#039;LCD&#039;&#039; дисплеја у складу са референтним снимком, где &amp;lt;thld&amp;gt; представља тренутно важећу вредност границе (иницијална вредност границе је 30) а на месту знакова питања се приказују притиснути тастери до тренутка када се притисне други по реду тастер услед чега се поставља нова вредност границе и враћају знакови питања. Освежавање поруке вршити периодично на сваких 200 милисекунди уколико је дошло до промене вредности.&lt;br /&gt;
# Обезбедити понашање двобојне &#039;&#039;LED&#039;&#039; описано у наставку. Двобојна &#039;&#039;LED&#039;&#039; константно светли зеленом бојом када је тренутна температура нижа од &#039;&#039;temp_granica&#039;&#039;, док уколико је тренутна температура једнака или већа од &#039;&#039;temp_granica&#039;&#039; двобојна &#039;&#039;LED&#039;&#039; трепери црвеном бојом са периодом од једне секунде (пола секунде светли, пола секунде не светли).&lt;br /&gt;
# Обезбедити контролу вентилатора на начин описан у наставку. Зависно од тренутне вредности температуре вентилатор се врти одговарајућом брзином. Уколико тренутна вредност температуре припада опсегу:&lt;br /&gt;
#* [0, &#039;&#039;temp_granica&#039;&#039;) вентилатор се не врти и&lt;br /&gt;
#* [&#039;&#039;temp_granica&#039;&#039;, 60] вентилатор се врти брзином једнаком 50% максималне брзине&lt;br /&gt;
#: Ажурирање брзине вентилатора вршити периодично на 200 милисекунди.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
Цело решење може се преузети [[Медиј:MIPS februar 2022 projekat.zip|одавде]]. Решење је засновано на [[Медиј:MIPS domaći zadatak 2023.zip|решењу домаћег задатка из 2023. године]], па ће испод бити наведени фајлови измењени у односу на то решење.&lt;br /&gt;
&lt;br /&gt;
Сви релевантни измењени фајлови са кодом налазе се у &amp;lt;code&amp;gt;cubemx/code/Core/Src&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;cubemx/code/Core/Inc&amp;lt;/code&amp;gt; директоријумима.&lt;br /&gt;
&lt;br /&gt;
==== &#039;&#039;CubeMX&#039;&#039; ====&lt;br /&gt;
У алату &#039;&#039;CubeMX&#039;&#039; направљене су следеће измене на пројекту из домаћег задатка:&lt;br /&gt;
* Омогућени су прекиди од EXTI.&lt;br /&gt;
* Пинови PB&amp;lt;sub&amp;gt;3..0&amp;lt;/sub&amp;gt; и PB&amp;lt;sub&amp;gt;9..8&amp;lt;/sub&amp;gt; су подешени као GPIO_Output, пинови PB&amp;lt;sub&amp;gt;4..6&amp;lt;/sub&amp;gt; као GPIO_Input, док су пинови PB&amp;lt;sub&amp;gt;7&amp;lt;/sub&amp;gt; и PB&amp;lt;sub&amp;gt;10&amp;lt;/sub&amp;gt; подешени као EXTI.&lt;br /&gt;
Након генерисања, линија 310 у &amp;lt;code&amp;gt;Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM3/port.c&amp;lt;/code&amp;gt; је закоментарисана.&lt;br /&gt;
&lt;br /&gt;
==== &#039;&#039;Makefile&#039;&#039; ====&lt;br /&gt;
У односу на пројекат из домаћег задатка, у &#039;&#039;Makefile&#039;&#039; је додат &amp;lt;code&amp;gt;keypad.c&amp;lt;/code&amp;gt; фајл.&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;keypad.h&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#ifndef CORE_INC_KEYPAD_H_&lt;br /&gt;
#define CORE_INC_KEYPAD_H_&lt;br /&gt;
&lt;br /&gt;
extern char keys[2];&lt;br /&gt;
extern unsigned temp_granica;&lt;br /&gt;
extern int keysChanged;&lt;br /&gt;
&lt;br /&gt;
void KEY_Init();&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;keypad.c&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;keypad.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;FreeRTOS.h&amp;quot;&lt;br /&gt;
#include &amp;quot;task.h&amp;quot;&lt;br /&gt;
#include &amp;quot;timers.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;gpio.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
char keys[2];&lt;br /&gt;
unsigned temp_granica = 30;&lt;br /&gt;
int keysChanged = 1;&lt;br /&gt;
&lt;br /&gt;
static int keyCount = 0;&lt;br /&gt;
static int keyReleased = 1;&lt;br /&gt;
&lt;br /&gt;
TaskHandle_t KEY_TaskHandle;&lt;br /&gt;
TimerHandle_t KEY_TimerHandle;&lt;br /&gt;
&lt;br /&gt;
const char KEY_MATRIX[4][3] = {&lt;br /&gt;
	{ &#039;1&#039;, &#039;2&#039;, &#039;3&#039; },&lt;br /&gt;
	{ &#039;4&#039;, &#039;5&#039;, &#039;6&#039; },&lt;br /&gt;
	{ &#039;7&#039;, &#039;8&#039;, &#039;9&#039; },&lt;br /&gt;
	{ &#039;*&#039;, &#039;0&#039;, &#039;#&#039; }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
extern void homeworkOverflow();&lt;br /&gt;
&lt;br /&gt;
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) {&lt;br /&gt;
	if (GPIO_Pin == GPIO_PIN_7) {&lt;br /&gt;
		BaseType_t wokenTask = pdFALSE;&lt;br /&gt;
		vTaskNotifyGiveFromISR(KEY_TaskHandle, &amp;amp;wokenTask);&lt;br /&gt;
		portYIELD_FROM_ISR(wokenTask);&lt;br /&gt;
	} else if (GPIO_Pin == GPIO_PIN_10) {&lt;br /&gt;
		homeworkOverflow();&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
static void KEY_Task(void *parameters) {&lt;br /&gt;
	UNUSED(parameters);&lt;br /&gt;
	keys[0] = &#039;?&#039;;&lt;br /&gt;
	keys[1] = &#039;?&#039;;&lt;br /&gt;
	while (1) {&lt;br /&gt;
		for (int row = 0; row &amp;lt; 4; ++row) {&lt;br /&gt;
			HAL_GPIO_WritePin(GPIOB, 1u &amp;lt;&amp;lt; row, GPIO_PIN_SET);&lt;br /&gt;
		}&lt;br /&gt;
		vTaskDelay(pdMS_TO_TICKS(10));&lt;br /&gt;
		if (!keyReleased) {&lt;br /&gt;
			continue;&lt;br /&gt;
		}&lt;br /&gt;
		for (int row = 0; row &amp;lt; 4; ++row) {&lt;br /&gt;
			HAL_GPIO_WritePin(GPIOB, 1u &amp;lt;&amp;lt; row, GPIO_PIN_RESET);&lt;br /&gt;
		}&lt;br /&gt;
		for (int row = 0; row &amp;lt; 4; ++row) {&lt;br /&gt;
			HAL_GPIO_WritePin(GPIOB, 1u &amp;lt;&amp;lt; row, GPIO_PIN_SET);&lt;br /&gt;
			for (int column = 0; column &amp;lt; 3; ++column) {&lt;br /&gt;
				if (HAL_GPIO_ReadPin(GPIOB, 1u &amp;lt;&amp;lt; (4 + column))&lt;br /&gt;
						== GPIO_PIN_SET) {&lt;br /&gt;
					keys[keyCount] = KEY_MATRIX[row][column];&lt;br /&gt;
					if (keyCount == 1) {&lt;br /&gt;
						temp_granica = (keys[0] - &#039;0&#039;) * 10 + keys[1] - &#039;0&#039;;&lt;br /&gt;
						keys[0] = &#039;?&#039;;&lt;br /&gt;
						keys[1] = &#039;?&#039;;&lt;br /&gt;
					}&lt;br /&gt;
					keyCount = 1 - keyCount;&lt;br /&gt;
					keysChanged = 1;&lt;br /&gt;
					keyReleased = 0;&lt;br /&gt;
					xTimerStart(KEY_TimerHandle, portMAX_DELAY);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			HAL_GPIO_WritePin(GPIOB, 1u &amp;lt;&amp;lt; row, GPIO_PIN_RESET);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void KEY_Timer(TimerHandle_t xTimer) {&lt;br /&gt;
	UNUSED(xTimer);&lt;br /&gt;
	if (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_7) == GPIO_PIN_SET) {&lt;br /&gt;
		xTimerStart(KEY_TimerHandle, portMAX_DELAY);&lt;br /&gt;
	} else {&lt;br /&gt;
		keyReleased = 1;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void KEY_Init() {&lt;br /&gt;
	xTaskCreate(KEY_Task, &amp;quot;KEY_Task&amp;quot;, 128, NULL, 5, &amp;amp;KEY_TaskHandle);&lt;br /&gt;
	KEY_TimerHandle = xTimerCreate(&amp;quot;KEY_Timer&amp;quot;, pdMS_TO_TICKS(10), pdFALSE,&lt;br /&gt;
	NULL, KEY_Timer);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;homework.h&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#ifndef CORE_INC_HOMEWORK_H_&lt;br /&gt;
#define CORE_INC_HOMEWORK_H_&lt;br /&gt;
&lt;br /&gt;
typedef enum&lt;br /&gt;
{&lt;br /&gt;
	TURNED_OFF, SLOW, FAST&lt;br /&gt;
} FanState;&lt;br /&gt;
&lt;br /&gt;
extern void homeworkInit();&lt;br /&gt;
extern void homeworkOverflow();&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;homework.h&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;homework.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;FreeRTOS.h&amp;quot;&lt;br /&gt;
#include &amp;quot;task.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;FreeRTOS.h&amp;quot;&lt;br /&gt;
#include &amp;quot;timers.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;driver_lcd.h&amp;quot;&lt;br /&gt;
#include &amp;quot;driver_uart.h&amp;quot;&lt;br /&gt;
#include &amp;quot;driver_motor.h&amp;quot;&lt;br /&gt;
#include &amp;quot;driver_temp.h&amp;quot;&lt;br /&gt;
#include &amp;quot;keypad.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;gpio.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
FanState fanState = TURNED_OFF;&lt;br /&gt;
TimerHandle_t homeworkTimer;&lt;br /&gt;
TimerHandle_t ledTimer;&lt;br /&gt;
&lt;br /&gt;
unsigned passedMs = 0;&lt;br /&gt;
unsigned rainfall = 0;&lt;br /&gt;
&lt;br /&gt;
static uint32_t tempValue;&lt;br /&gt;
static char tempText[4];&lt;br /&gt;
static void homeworkTask(void *parameters) {&lt;br /&gt;
	UNUSED(parameters);&lt;br /&gt;
	char messageTemp[9] = &amp;quot;Temp:   &amp;quot;;&lt;br /&gt;
	char messageKisa[7] = &amp;quot;Kisa: &amp;quot;;&lt;br /&gt;
#pragma GCC diagnostic ignored &amp;quot;-Wtrigraphs&amp;quot;&lt;br /&gt;
	char messageThld[14] = &amp;quot;Thld:(??)=&amp;gt;30&amp;quot;;&lt;br /&gt;
	// Ekvivalentna adresa: 0x80&lt;br /&gt;
	LCD_CommandEnqueue(LCD_INSTRUCTION,&lt;br /&gt;
	LCD_SET_DD_RAM_ADDRESS_INSTRUCTION | 0x00);&lt;br /&gt;
	for (uint32_t i = 0; i &amp;lt; 8; i++) {&lt;br /&gt;
		UART_AsyncTransmitCharacter(messageTemp[i]);&lt;br /&gt;
	}&lt;br /&gt;
	for (uint32_t i = 0; i &amp;lt; 6; i++) {&lt;br /&gt;
		LCD_CommandEnqueue(LCD_DATA, messageKisa[i]);&lt;br /&gt;
	}&lt;br /&gt;
	// Ekvivalentna adresa: 0xD0&lt;br /&gt;
	LCD_CommandEnqueue(LCD_INSTRUCTION,&lt;br /&gt;
	LCD_SET_DD_RAM_ADDRESS_INSTRUCTION | 0x50);&lt;br /&gt;
	for (uint32_t i = 0; i &amp;lt; 13; i++) {&lt;br /&gt;
		LCD_CommandEnqueue(LCD_DATA, messageThld[i]);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	while (1) {&lt;br /&gt;
		tempValue = TEMP_GetCurrentValue();&lt;br /&gt;
		itoa(rainfall, tempText, 10);&lt;br /&gt;
&lt;br /&gt;
		FanState fanStateTarget;&lt;br /&gt;
		if (tempValue &amp;lt; temp_granica) {&lt;br /&gt;
			fanStateTarget = TURNED_OFF;&lt;br /&gt;
		} else {&lt;br /&gt;
			fanStateTarget = SLOW;&lt;br /&gt;
		}&lt;br /&gt;
		for (uint32_t i = 0; i &amp;lt; abs(fanStateTarget - fanState); i++) {&lt;br /&gt;
			if (fanStateTarget &amp;gt; fanState) {&lt;br /&gt;
				MOTOR_SpeedIncrease();&lt;br /&gt;
			} else {&lt;br /&gt;
				MOTOR_SpeedDecrease();&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		fanState = fanStateTarget;&lt;br /&gt;
&lt;br /&gt;
		LCD_CommandEnqueue(LCD_INSTRUCTION,&lt;br /&gt;
		LCD_SET_DD_RAM_ADDRESS_INSTRUCTION | 0x06);&lt;br /&gt;
		for (uint32_t i = 0; i &amp;lt; strlen(tempText); i++) {&lt;br /&gt;
			LCD_CommandEnqueue(LCD_DATA, tempText[i]);&lt;br /&gt;
		}&lt;br /&gt;
		UART_AsyncTransmitCharacter(&#039;\b&#039;);&lt;br /&gt;
		UART_AsyncTransmitCharacter(&#039;\b&#039;);&lt;br /&gt;
		if (tempValue &amp;lt; 10) {&lt;br /&gt;
			UART_AsyncTransmitCharacter(&#039; &#039;);&lt;br /&gt;
		} else {&lt;br /&gt;
			UART_AsyncTransmitCharacter(tempValue / 10 + &#039;0&#039;);&lt;br /&gt;
		}&lt;br /&gt;
		UART_AsyncTransmitCharacter(tempValue % 10 + &#039;0&#039;);&lt;br /&gt;
&lt;br /&gt;
		if (keysChanged) {&lt;br /&gt;
			keysChanged = 0;&lt;br /&gt;
			LCD_CommandEnqueue(LCD_INSTRUCTION,&lt;br /&gt;
			LCD_SET_DD_RAM_ADDRESS_INSTRUCTION | 0x56);&lt;br /&gt;
			LCD_CommandEnqueue(LCD_DATA, keys[0]);&lt;br /&gt;
			LCD_CommandEnqueue(LCD_DATA, keys[1]);&lt;br /&gt;
			LCD_CommandEnqueue(LCD_INSTRUCTION,&lt;br /&gt;
			LCD_SET_DD_RAM_ADDRESS_INSTRUCTION | 0x5B);&lt;br /&gt;
			LCD_CommandEnqueue(LCD_DATA,&lt;br /&gt;
					(temp_granica &amp;lt; 10) ? &#039; &#039; : (temp_granica / 10) + &#039;0&#039;);&lt;br /&gt;
			LCD_CommandEnqueue(LCD_DATA, (temp_granica % 10) + &#039;0&#039;);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		vTaskDelay(pdMS_TO_TICKS(200));&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void homeworkOverflow() {&lt;br /&gt;
	rainfall = 36000 / passedMs;&lt;br /&gt;
	passedMs = 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void homeworkCounter(TimerHandle_t xTimer) {&lt;br /&gt;
	UNUSED(xTimer);&lt;br /&gt;
	++passedMs;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void ledCounter(TimerHandle_t xTimer) {&lt;br /&gt;
	UNUSED(xTimer);&lt;br /&gt;
	if (TEMP_GetCurrentValue() &amp;lt; temp_granica) {&lt;br /&gt;
		HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9, GPIO_PIN_RESET);&lt;br /&gt;
		HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_SET);&lt;br /&gt;
	} else {&lt;br /&gt;
		HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_RESET);&lt;br /&gt;
		HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_9);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void homeworkInit() {&lt;br /&gt;
	LCD_Init();&lt;br /&gt;
	UART_Init();&lt;br /&gt;
	MOTOR_Init();&lt;br /&gt;
	TEMP_Init();&lt;br /&gt;
	KEY_Init();&lt;br /&gt;
	xTaskCreate(homeworkTask, &amp;quot;homeworkTask&amp;quot;, 64, NULL, 5, NULL);&lt;br /&gt;
	homeworkTimer = xTimerCreate(&amp;quot;homeworkTimer&amp;quot;, pdMS_TO_TICKS(1), pdTRUE,&lt;br /&gt;
	NULL, homeworkCounter);&lt;br /&gt;
	xTimerStart(homeworkTimer, portMAX_DELAY);&lt;br /&gt;
	ledTimer = xTimerCreate(&amp;quot;ledTimer&amp;quot;, pdMS_TO_TICKS(500), pdTRUE,&lt;br /&gt;
	NULL, ledCounter);&lt;br /&gt;
	xTimerStart(ledTimer, portMAX_DELAY);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:Микропроцесорски системи]]&lt;/div&gt;</summary>
		<author><name>Fedja</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9F%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D1%81%D0%BA%D0%B8_%D0%BF%D1%80%D0%B5%D0%B2%D0%BE%D0%B4%D0%B8%D0%BE%D1%86%D0%B8_1/%D0%88%D0%B0%D0%BD%D1%83%D0%B0%D1%80_2023&amp;diff=6442</id>
		<title>Програмски преводиоци 1/Јануар 2023</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9F%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D1%81%D0%BA%D0%B8_%D0%BF%D1%80%D0%B5%D0%B2%D0%BE%D0%B4%D0%B8%D0%BE%D1%86%D0%B8_1/%D0%88%D0%B0%D0%BD%D1%83%D0%B0%D1%80_2023&amp;diff=6442"/>
		<updated>2023-08-26T08:54:18Z</updated>

		<summary type="html">&lt;p&gt;Fedja: /* Rešenje 6. zadatka */ inverzno od (x &amp;lt; t) je jge, ne jgt. 87-75=12, ne 13&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
{{nerešeno}}&lt;br /&gt;
&#039;&#039;&#039;Januarski ispit 2023. godine&#039;&#039;&#039; održan je 19. januara. Postavka roka nije dostupna sa stranice predmeta.&lt;br /&gt;
&lt;br /&gt;
== 1. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Dat je sledeći program:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
int main() {&lt;br /&gt;
    int count;&lt;br /&gt;
    void procX() {&lt;br /&gt;
        void report() {&lt;br /&gt;
            writeln(&amp;quot;count = &amp;quot; + count);&lt;br /&gt;
        }&lt;br /&gt;
        void proxY() {&lt;br /&gt;
            int count;&lt;br /&gt;
            count = 200;&lt;br /&gt;
            report();&lt;br /&gt;
        }&lt;br /&gt;
        count = 100;&lt;br /&gt;
        report();&lt;br /&gt;
        procY();&lt;br /&gt;
    }&lt;br /&gt;
    count = 300;&lt;br /&gt;
    procX();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Ukoliko se koristi statičko razrešavanje dosega, šta će ispisati dati program?&lt;br /&gt;
# Ukoliko se koristi dinamičko razrešavanje dosega, šta će ispisati dati program?&lt;br /&gt;
# Ukoliko se za nelokalne promenljive koriste displeji, nacrtati poslednje stanje steka i displeja nakon što je &amp;lt;code&amp;gt;report&amp;lt;/code&amp;gt; funkcija pozvana poslednji put.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&lt;br /&gt;
== 2. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Dat je isečak koda klase &amp;lt;code&amp;gt;Struct&amp;lt;/code&amp;gt;. Dopuniti metodu &amp;lt;code&amp;gt;AssignableTo&amp;lt;/code&amp;gt; kodom koji fali.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class Struct {&lt;br /&gt;
    private int kind;&lt;br /&gt;
    private Struct elemType;&lt;br /&gt;
    public boolean Equals(Struct other) {&lt;br /&gt;
        return (this == other) || (kind == Kinds.Array &amp;amp;&amp;amp; other.kind == Kinds.Array &amp;amp;&amp;amp; elemType.Equals(other.ElemType));&lt;br /&gt;
    }&lt;br /&gt;
    public boolean IsRefType() {&lt;br /&gt;
        return kind == Kinds.Class || kind == Kinds.Array;&lt;br /&gt;
    }&lt;br /&gt;
    public boolean AssignableTo(Struct dest) {&lt;br /&gt;
        if (this.Equals(dest) || &lt;br /&gt;
                || (kind == Kinds.Array &amp;amp;&amp;amp; dest.kind == Kinds.Array &amp;amp;&amp;amp; dest.elemType == Tab.noType)) {&lt;br /&gt;
            return true;&lt;br /&gt;
        }&lt;br /&gt;
        return false;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Preuzeto iz [http://ir4pp1.etf.rs/Predavanja/pp1_udzbenik.pdf udžbenika Programski prevodioci 1] (Dragan Bojić, Maja Vukasović) sa strane 209.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
class Struct {&lt;br /&gt;
    ...&lt;br /&gt;
    // checks, if this can be assigned to dest (explicit. assignment, parameters)&lt;br /&gt;
    public bool AssignableTo (Struct dest) {&lt;br /&gt;
        if ( this.Equals(dest) || this == Tab.nullType &amp;amp;&amp;amp; dest.IsRefType() ||&lt;br /&gt;
            kind == Kinds.Arr &amp;amp;&amp;amp; dest.kind == Kinds.Arr &amp;amp;&amp;amp; // for len()&lt;br /&gt;
            dest.elemType == Tab.noType) return true;&lt;br /&gt;
        for (Struct s = elemType; s != null; s = s.elemType) {&lt;br /&gt;
            if (s.equals(dest)) return true;&lt;br /&gt;
        }&lt;br /&gt;
        return false;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 3. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Za dati blok koda napisati međukod a zatim nacrtati graf toka kontrole sa međukodom u SSA formi.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
int res = 10;&lt;br /&gt;
for (int i = 0; i &amp;lt; 10; i++) {&lt;br /&gt;
    int n = res;&lt;br /&gt;
    for (int j = i + 1; j &amp;lt; n; j++) {&lt;br /&gt;
        if ((i + j) % 2 == 0) {&lt;br /&gt;
           res++;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&lt;br /&gt;
== 4. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Za datu gramatiku konstruisati karakteristički LR(0) automat i kontrolnu tabelu, a zatim dodati LALR(1) predikcione skupove.&lt;br /&gt;
# &amp;amp;lt;S&amp;gt; → &amp;amp;lt;S&amp;gt; &amp;amp;lt;A&amp;gt;&lt;br /&gt;
# &amp;amp;lt;A&amp;gt; → &amp;amp;lt;A&amp;gt; a &amp;amp;lt;A&amp;gt; b&lt;br /&gt;
# &amp;amp;lt;A&amp;gt; → &amp;amp;lt;S&amp;gt; a&lt;br /&gt;
# &amp;amp;lt;A&amp;gt; → c&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&lt;br /&gt;
== 5. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
U datoj gramatici neterminalu &amp;lt;code&amp;gt;&amp;amp;lt;list&amp;gt;&amp;lt;/code&amp;gt; dodati sintetizovani atribut koji naizmenično sadrži cifre najvećih i najmanjih brojeva iz niza. Na primer, ukoliko je sekvenca koja se prepoznaje [1, 2, 3] [4, 5, 6] [7, 8, 9], taj atribut bi imao vrednost 349. Smatrati da terminal &amp;lt;code&amp;gt;INT&amp;lt;/code&amp;gt; ima sintetizovani simbol sa svojom vrednošću.&lt;br /&gt;
# &amp;amp;lt;list&amp;gt; → &amp;amp;lt;list&amp;gt; &amp;amp;lt;item&amp;gt;&lt;br /&gt;
# &amp;amp;lt;list&amp;gt; → &amp;amp;lt;item&amp;gt;&lt;br /&gt;
# &amp;amp;lt;item&amp;gt; → [ &amp;amp;lt;num_arr&amp;gt; ]&lt;br /&gt;
# &amp;amp;lt;num_arr&amp;gt; → &amp;amp;lt;num_arr&amp;gt;, INT&lt;br /&gt;
# &amp;amp;lt;num_arr&amp;gt; → INT&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Uvodimo sledeće sintetizovane atribute:&lt;br /&gt;
* INT&amp;lt;sub&amp;gt;digit&amp;lt;/sub&amp;gt; - digit predstavlja cifru opisanu terminalom INT&lt;br /&gt;
* &amp;lt;num_arr&amp;gt;&amp;lt;sub&amp;gt;minDigit, maxDigit&amp;lt;/sub&amp;gt; - minDigit predstavlja minimalnu cifru sadržanu u nizu cifara &amp;lt;num_arr&amp;gt;, a maxDigit maksimalnu cifru sadržanu u nizu cifara &amp;lt;num_arr&amp;gt;&lt;br /&gt;
* &amp;lt;item&amp;gt;&amp;lt;sub&amp;gt;minDigit, maxDigit&amp;lt;/sub&amp;gt; - minDigit predstavlja minimalnu cifru sadržanu u nizu cifara koji se nalazi u neterminalu &amp;lt;item&amp;gt;, a maxDigit maksimalnu cifru sadržanu u nizu cifara koji se nalazi u neterminalu &amp;lt;item&amp;gt;&lt;br /&gt;
* &amp;lt;list&amp;gt;&amp;lt;sub&amp;gt;value, takeMinDigit&amp;lt;/sub&amp;gt; - value predstavlja vrednost koju treba izračunati po postavci zadatka, a takeMinDigit da li u sledećem koraku treba uzeti minimalnu ili maksimalnu cifru (ovo posmatramo kao neki flag kome u svakom koraku invertujemo vrednost, a čija je početna vrednost 1 jer u prvom koraku uzimamo maksimalnu, a u drugom minimalnu cifru)&lt;br /&gt;
&lt;br /&gt;
Atributivno translaciona gramatika izgleda ovako (stvari koje su dodate u odnosu na gramatiku iz postavke su prikazane &#039;&#039;&#039;podebljanim slovima&#039;&#039;&#039;):&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;list&amp;gt;&amp;lt;sub&amp;gt;&#039;&#039;&#039;value, takeMinDigit&#039;&#039;&#039;&amp;lt;/sub&amp;gt; -&amp;gt; &amp;lt;list&amp;gt;&amp;lt;sub&amp;gt;&#039;&#039;&#039;valueRHS, takeMinDigitRHS&#039;&#039;&#039;&amp;lt;/sub&amp;gt; &amp;lt;item&amp;gt;&amp;lt;sub&amp;gt;&#039;&#039;&#039;minDigit, maxDigit&#039;&#039;&#039;&amp;lt;/sub&amp;gt; &#039;&#039;&#039;{ value = valueRHS * 10 + (takeMinDigitRHS == 1) ? minDigit : maxDigit; takeMinDigit = 1 - takeMinDigitRHS; }&#039;&#039;&#039;&lt;br /&gt;
# &amp;lt;list&amp;gt;&amp;lt;sub&amp;gt;&#039;&#039;&#039;value, takeMinDigit&#039;&#039;&#039;&amp;lt;/sub&amp;gt; -&amp;gt; &amp;lt;item&amp;gt;&amp;lt;sub&amp;gt;&#039;&#039;&#039;minDigit, maxDigit&#039;&#039;&#039;&amp;lt;/sub&amp;gt; &#039;&#039;&#039;{ value = maxDigit; takeMinDigit = 1; }&#039;&#039;&#039;&lt;br /&gt;
# &amp;lt;item&amp;gt;&amp;lt;sub&amp;gt;&#039;&#039;&#039;minDigit, maxDigit&#039;&#039;&#039;&amp;lt;/sub&amp;gt; -&amp;gt; [ &amp;lt;num_arr&amp;gt;&amp;lt;sub&amp;gt;&#039;&#039;&#039;minDigitRHS, maxDigitRHS&#039;&#039;&#039;&amp;lt;/sub&amp;gt; ] &#039;&#039;&#039;{ minDigit = minDigitRHS; maxDigit = maxDigitRHS; }&#039;&#039;&#039;&lt;br /&gt;
# &amp;lt;num_arr&amp;gt;&amp;lt;sub&amp;gt;&#039;&#039;&#039;minDigit, maxDigit&#039;&#039;&#039;&amp;lt;/sub&amp;gt; -&amp;gt; &amp;lt;num_arr&amp;gt;&amp;lt;sub&amp;gt;&#039;&#039;&#039;minDigitRHS, maxDigitRHS&#039;&#039;&#039;&amp;lt;/sub&amp;gt; , INT&amp;lt;sub&amp;gt;&#039;&#039;&#039;digit&#039;&#039;&#039;&amp;lt;/sub&amp;gt; &#039;&#039;&#039;{ minDigit = min(minDigitRHS, digit); maxDigit = max(maxDigitRHS, digit); }&#039;&#039;&#039;&lt;br /&gt;
# &amp;lt;num_arr&amp;gt;&amp;lt;sub&amp;gt;&#039;&#039;&#039;minDigit, maxDigit&#039;&#039;&#039;&amp;lt;/sub&amp;gt; -&amp;gt; INT&amp;lt;sub&amp;gt;&#039;&#039;&#039;digit&#039;&#039;&#039;&amp;lt;/sub&amp;gt; &#039;&#039;&#039;{ minDigit = digit; maxDigit = digit; }&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== 6. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Napisati kompletan prevod funkcija &amp;lt;code&amp;gt;f1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;f2&amp;lt;/code&amp;gt; i &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt; na Mikrojava bajtkod. Smatrati da prevod &amp;lt;code&amp;gt;f1&amp;lt;/code&amp;gt; kreće od adrese 0. Sekciju označenu sa &amp;lt;code&amp;gt;// ...&amp;lt;/code&amp;gt; nije potrebno prevoditi i smatrati da je njena dužina jedna instrukcija.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
int b;&lt;br /&gt;
class A {&lt;br /&gt;
    int fun1(int p) {...}&lt;br /&gt;
}&lt;br /&gt;
class B {&lt;br /&gt;
    A[] arr;&lt;br /&gt;
}&lt;br /&gt;
B bObj;&lt;br /&gt;
int f1() {&lt;br /&gt;
    return 1;&lt;br /&gt;
}&lt;br /&gt;
int f2() {&lt;br /&gt;
    return 2;&lt;br /&gt;
}&lt;br /&gt;
void main() int x; {&lt;br /&gt;
    bObj = new B;&lt;br /&gt;
    // ...&lt;br /&gt;
    b = bObj.arr[1].fun1(3);&lt;br /&gt;
    if (b &amp;lt; x) {&lt;br /&gt;
        b = f1();&lt;br /&gt;
    }&lt;br /&gt;
    else b = f2();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
00: enter 0 0&lt;br /&gt;
03: const_1&lt;br /&gt;
04: exit&lt;br /&gt;
05: return&lt;br /&gt;
06: enter 0 0&lt;br /&gt;
09: const_2&lt;br /&gt;
10: exit&lt;br /&gt;
11: return&lt;br /&gt;
12: enter 0 1&lt;br /&gt;
15: new 4&lt;br /&gt;
18: dup&lt;br /&gt;
19: const_0&lt;br /&gt;
20: putfield 0&lt;br /&gt;
23: putstatic 1&lt;br /&gt;
26: ...&lt;br /&gt;
27: getstatic 1&lt;br /&gt;
30: getfield 1&lt;br /&gt;
33: const_1&lt;br /&gt;
34: aload&lt;br /&gt;
35: const_3&lt;br /&gt;
36: getstatic 1&lt;br /&gt;
39: getfield 1&lt;br /&gt;
42: const_1&lt;br /&gt;
43: aload&lt;br /&gt;
44: getfield 0&lt;br /&gt;
47: invokevirtual &#039;f&#039; &#039;u&#039; &#039;n&#039; &#039;1&#039; -1&lt;br /&gt;
68: putstatic 0&lt;br /&gt;
71: getstatic 0&lt;br /&gt;
74: load_0&lt;br /&gt;
75: jge 12&lt;br /&gt;
78: call -78&lt;br /&gt;
81: putstatic 0&lt;br /&gt;
84: jmp 9&lt;br /&gt;
87: call -81&lt;br /&gt;
90: putstatic 0&lt;br /&gt;
93: exit&lt;br /&gt;
94: return&lt;br /&gt;
95: ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:Програмски преводиоци 1]]&lt;/div&gt;</summary>
		<author><name>Fedja</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9F%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D1%81%D0%BA%D0%B8_%D0%BF%D1%80%D0%B5%D0%B2%D0%BE%D0%B4%D0%B8%D0%BE%D1%86%D0%B8_1/%D0%9A1_2012&amp;diff=6433</id>
		<title>Програмски преводиоци 1/К1 2012</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9F%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D1%81%D0%BA%D0%B8_%D0%BF%D1%80%D0%B5%D0%B2%D0%BE%D0%B4%D0%B8%D0%BE%D1%86%D0%B8_1/%D0%9A1_2012&amp;diff=6433"/>
		<updated>2023-08-24T15:27:25Z</updated>

		<summary type="html">&lt;p&gt;Fedja: Поништена измена бр. 6432 корисника KockaAdmiralac (разговор)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&#039;&#039;&#039;Prvi kolokvijum 2012. godine&#039;&#039;&#039; održan je 26. oktobra i trajao je 1.5 sat. Postavka roka dostupna je [http://ir4pp1.etf.rs/Rokovi/si4pp1-zadaci-2012_2013-k1.pdf sa stranice predmeta.]&lt;br /&gt;
&lt;br /&gt;
== 1. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Robot se kreće po pravougaonoj rešetki. Može da ide napred (f), skrene levo (l), ili skrene desno (r).&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Konstruisati konačni automat koji opisuje one i samo one sekvence pokreta koje robota dovode u isti pravac i smer kretanja kao i na početku.&lt;br /&gt;
# Konstruisati bezkontekstnu gramatiku koja opisuje isti skup sekvenci kao i pod a).&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Deterministički konačni automat u stavci pod a&lt;br /&gt;
!&lt;br /&gt;
! f&lt;br /&gt;
! l&lt;br /&gt;
! r&lt;br /&gt;
! Prihvata&lt;br /&gt;
|-&lt;br /&gt;
! N&lt;br /&gt;
| N&lt;br /&gt;
| W&lt;br /&gt;
| E&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
! W&lt;br /&gt;
| W&lt;br /&gt;
| S&lt;br /&gt;
| N&lt;br /&gt;
| 0&lt;br /&gt;
|-&lt;br /&gt;
! E&lt;br /&gt;
| E&lt;br /&gt;
| N&lt;br /&gt;
| S&lt;br /&gt;
| 0&lt;br /&gt;
|-&lt;br /&gt;
! S&lt;br /&gt;
| S&lt;br /&gt;
| E&lt;br /&gt;
| W&lt;br /&gt;
| 0&lt;br /&gt;
|}&lt;br /&gt;
Bezkontekstna gramatika je:&lt;br /&gt;
* &amp;amp;lt;N&amp;gt; → ε&lt;br /&gt;
* &amp;amp;lt;N&amp;gt; → f &amp;amp;lt;N&amp;gt;&lt;br /&gt;
* &amp;amp;lt;N&amp;gt; → l &amp;amp;lt;W&amp;gt;&lt;br /&gt;
* &amp;amp;lt;N&amp;gt; → r &amp;amp;lt;E&amp;gt;&lt;br /&gt;
* &amp;amp;lt;W&amp;gt; → f &amp;amp;lt;W&amp;gt;&lt;br /&gt;
* &amp;amp;lt;W&amp;gt; → l &amp;amp;lt;S&amp;gt;&lt;br /&gt;
* &amp;amp;lt;W&amp;gt; → r &amp;amp;lt;N&amp;gt;&lt;br /&gt;
* &amp;amp;lt;E&amp;gt; → f &amp;amp;lt;E&amp;gt;&lt;br /&gt;
* &amp;amp;lt;E&amp;gt; → l &amp;amp;lt;N&amp;gt;&lt;br /&gt;
* &amp;amp;lt;E&amp;gt; → r &amp;amp;lt;S&amp;gt;&lt;br /&gt;
* &amp;amp;lt;S&amp;gt; → f &amp;amp;lt;S&amp;gt;&lt;br /&gt;
* &amp;amp;lt;S&amp;gt; → l &amp;amp;lt;E&amp;gt;&lt;br /&gt;
* &amp;amp;lt;S&amp;gt; → r &amp;amp;lt;W&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Napisati regularni izraz kojim se opisuju sve sekvence koje:&lt;br /&gt;
* počinju jednim ili više malih slova engleske abecede, nakon kojih se pojavljuje&lt;br /&gt;
** ili nula ili više znakova iz skupa cifara od 5 do 9 i velikih slova engleske abecede (poređanih u proizvoljnom redosledu, tj. mešaju se slova i cifre).&lt;br /&gt;
** ili se pojavljuje jedan ili više brojeva iz opsega od 0 do 4.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&amp;lt;code&amp;gt;[a-z]+([5-9A-Z]*|[0-4]+)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 3. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Napisati gramatiku kojom se definišu pravila formiranja izraza u hipotetičkom programskom jeziku. Postoje dva binarna operatora: operator &amp;quot;$&amp;quot; i operator &amp;quot;#&amp;quot;. Operator &amp;quot;$&amp;quot; je levo asocijativan i ima veći prioritet od operatora &amp;quot;#&amp;quot;, koji je desno asocijativan. Izrazi se sastoje od identifikatora (IDENT) i konstanti (CONST) između kojih se navode dati operatori. Binarni operator se piše između svoja dva operanda. IDENT i CONST su terminalni simboli. Gramatika ne sme biti višeznačna.&lt;br /&gt;
&lt;br /&gt;
Primer izraza: a$2$3 # b$3 # c&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
* &amp;amp;lt;expr&amp;gt; → &amp;amp;lt;dollar_expr&amp;gt; # &amp;amp;lt;expr&amp;gt;&lt;br /&gt;
* &amp;amp;lt;expr&amp;gt; → &amp;amp;lt;dollar_expr&amp;gt;&lt;br /&gt;
* &amp;amp;lt;dollar_expr&amp;gt; → &amp;amp;lt;dollar_expr&amp;gt; $ &amp;amp;lt;term&amp;gt;&lt;br /&gt;
* &amp;amp;lt;dollar_expr&amp;gt; → &amp;amp;lt;term&amp;gt;&lt;br /&gt;
* &amp;amp;lt;term&amp;gt; → &amp;amp;lt;IDENT&amp;gt;&lt;br /&gt;
* &amp;amp;lt;term&amp;gt; → &amp;amp;lt;CONST&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 4. zadatak ==&lt;br /&gt;
{{delimično rešeno}}&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Na osnovu zadate gramatike konstruisati LR(0) parser. Nacrtati LR(0) karakteristični automat (prepoznavač ručki), nacrtati potisnu i kontrolnu tabelu.&lt;br /&gt;
* &amp;amp;lt;S&amp;gt; → (&amp;amp;lt;A&amp;gt;)&lt;br /&gt;
* &amp;amp;lt;A&amp;gt; → &amp;amp;lt;S&amp;gt;, b&lt;br /&gt;
* &amp;amp;lt;A&amp;gt; → a&lt;br /&gt;
Prikazati rad parsera kada se na ulaz dovede sledeća ulazna sekvenca: ((a),b)&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Potisna tabela&lt;br /&gt;
! Stanje&lt;br /&gt;
! &amp;amp;lt;S&amp;gt;             !! ─┤                  !! (             !! &amp;amp;lt;A&amp;gt;        !! )             !! ,             !! b             !! a&lt;br /&gt;
|-&lt;br /&gt;
! ∇&lt;br /&gt;
| &amp;amp;lt;S&amp;gt;&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; ||                     || (&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; ||               ||               || || ||&lt;br /&gt;
|-&lt;br /&gt;
! &amp;amp;lt;S&amp;gt;&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|                    || ─┤&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;      ||               ||               ||               || || ||&lt;br /&gt;
|-&lt;br /&gt;
! ─┤&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|                    ||                     ||               ||               ||               || || ||&lt;br /&gt;
|-&lt;br /&gt;
! (&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;&lt;br /&gt;
| &amp;amp;lt;S&amp;gt;&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; ||  || (&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || &amp;amp;lt;A&amp;gt;&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; ||               || || || a&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! &amp;amp;lt;A&amp;gt;&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;&lt;br /&gt;
|                    ||                     ||               ||                    || )&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || || ||&lt;br /&gt;
|-&lt;br /&gt;
! )&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;&lt;br /&gt;
|                    ||                     ||               ||                    ||               || || ||&lt;br /&gt;
|-&lt;br /&gt;
! &amp;amp;lt;S&amp;gt;&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;&lt;br /&gt;
|                    ||                     ||               ||                    ||               || ,&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; || ||&lt;br /&gt;
|-&lt;br /&gt;
! ,&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;&lt;br /&gt;
|                    ||                     ||               ||                    ||               || || b&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; ||&lt;br /&gt;
|-&lt;br /&gt;
! b&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;&lt;br /&gt;
|                    ||                     ||               ||                    ||               || || ||&lt;br /&gt;
|-&lt;br /&gt;
! a&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt;&lt;br /&gt;
|                    ||                     ||               ||                    ||               || || ||&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Kontrolna tabela&lt;br /&gt;
! Stanje&lt;br /&gt;
! Akcija&lt;br /&gt;
|-&lt;br /&gt;
! ∇&lt;br /&gt;
| SHIFT&lt;br /&gt;
|-&lt;br /&gt;
! &amp;amp;lt;S&amp;gt;&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
| SHIFT&lt;br /&gt;
|-&lt;br /&gt;
! ─┤&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
| ACCEPT&lt;br /&gt;
|-&lt;br /&gt;
! (&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;&lt;br /&gt;
| SHIFT&lt;br /&gt;
|-&lt;br /&gt;
! &amp;amp;lt;A&amp;gt;&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;&lt;br /&gt;
| SHIFT&lt;br /&gt;
|-&lt;br /&gt;
! )&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;&lt;br /&gt;
| REDUCE(1)&lt;br /&gt;
|-&lt;br /&gt;
! &amp;amp;lt;S&amp;gt;&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;&lt;br /&gt;
| SHIFT&lt;br /&gt;
|-&lt;br /&gt;
! ,&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;&lt;br /&gt;
| SHIFT&lt;br /&gt;
|-&lt;br /&gt;
! b&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;&lt;br /&gt;
| REDUCE(2)&lt;br /&gt;
|-&lt;br /&gt;
! a&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt;&lt;br /&gt;
| REDUCE(3)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:Програмски преводиоци 1]]&lt;/div&gt;</summary>
		<author><name>Fedja</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9F%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D1%81%D0%BA%D0%B8_%D0%BF%D1%80%D0%B5%D0%B2%D0%BE%D0%B4%D0%B8%D0%BE%D1%86%D0%B8_1/%D0%9A1_2012&amp;diff=6430</id>
		<title>Програмски преводиоци 1/К1 2012</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9F%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D1%81%D0%BA%D0%B8_%D0%BF%D1%80%D0%B5%D0%B2%D0%BE%D0%B4%D0%B8%D0%BE%D1%86%D0%B8_1/%D0%9A1_2012&amp;diff=6430"/>
		<updated>2023-08-24T13:00:10Z</updated>

		<summary type="html">&lt;p&gt;Fedja: /* 4. zadatak */ potisna i kontrolna tabela&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&#039;&#039;&#039;Prvi kolokvijum 2012. godine&#039;&#039;&#039; održan je 26. oktobra i trajao je 1.5 sat. Postavka roka dostupna je [http://ir4pp1.etf.rs/Rokovi/si4pp1-zadaci-2012_2013-k1.pdf sa stranice predmeta.]&lt;br /&gt;
&lt;br /&gt;
== 1. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Robot se kreće po pravougaonoj rešetki. Može da ide napred (f), skrene levo (l), ili skrene desno (r).&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Konstruisati konačni automat koji opisuje one i samo one sekvence pokreta koje robota dovode u isti pravac i smer kretanja kao i na početku.&lt;br /&gt;
# Konstruisati bezkontekstnu gramatiku koja opisuje isti skup sekvenci kao i pod a).&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Deterministički konačni automat u stavci pod a&lt;br /&gt;
!&lt;br /&gt;
! f&lt;br /&gt;
! l&lt;br /&gt;
! r&lt;br /&gt;
! Prihvata&lt;br /&gt;
|-&lt;br /&gt;
! N&lt;br /&gt;
| N&lt;br /&gt;
| W&lt;br /&gt;
| E&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
! W&lt;br /&gt;
| W&lt;br /&gt;
| S&lt;br /&gt;
| N&lt;br /&gt;
| 0&lt;br /&gt;
|-&lt;br /&gt;
! E&lt;br /&gt;
| E&lt;br /&gt;
| N&lt;br /&gt;
| S&lt;br /&gt;
| 0&lt;br /&gt;
|-&lt;br /&gt;
! S&lt;br /&gt;
| S&lt;br /&gt;
| E&lt;br /&gt;
| W&lt;br /&gt;
| 0&lt;br /&gt;
|}&lt;br /&gt;
Bezkontekstna gramatika je:&lt;br /&gt;
* &amp;amp;lt;N&amp;gt; → ε&lt;br /&gt;
* &amp;amp;lt;N&amp;gt; → f &amp;amp;lt;N&amp;gt;&lt;br /&gt;
* &amp;amp;lt;N&amp;gt; → l &amp;amp;lt;W&amp;gt;&lt;br /&gt;
* &amp;amp;lt;N&amp;gt; → r &amp;amp;lt;E&amp;gt;&lt;br /&gt;
* &amp;amp;lt;W&amp;gt; → f &amp;amp;lt;W&amp;gt;&lt;br /&gt;
* &amp;amp;lt;W&amp;gt; → l &amp;amp;lt;S&amp;gt;&lt;br /&gt;
* &amp;amp;lt;W&amp;gt; → r &amp;amp;lt;N&amp;gt;&lt;br /&gt;
* &amp;amp;lt;E&amp;gt; → f &amp;amp;lt;E&amp;gt;&lt;br /&gt;
* &amp;amp;lt;E&amp;gt; → l &amp;amp;lt;N&amp;gt;&lt;br /&gt;
* &amp;amp;lt;E&amp;gt; → r &amp;amp;lt;S&amp;gt;&lt;br /&gt;
* &amp;amp;lt;S&amp;gt; → f &amp;amp;lt;S&amp;gt;&lt;br /&gt;
* &amp;amp;lt;S&amp;gt; → l &amp;amp;lt;E&amp;gt;&lt;br /&gt;
* &amp;amp;lt;S&amp;gt; → r &amp;amp;lt;W&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Napisati regularni izraz kojim se opisuju sve sekvence koje:&lt;br /&gt;
* počinju jednim ili više malih slova engleske abecede, nakon kojih se pojavljuje&lt;br /&gt;
** ili nula ili više znakova iz skupa cifara od 5 do 9 i velikih slova engleske abecede (poređanih u proizvoljnom redosledu, tj. mešaju se slova i cifre).&lt;br /&gt;
** ili se pojavljuje jedan ili više brojeva iz opsega od 0 do 4.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&amp;lt;code&amp;gt;[a-z]+([5-9A-Z]*|[0-4]+)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 3. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Napisati gramatiku kojom se definišu pravila formiranja izraza u hipotetičkom programskom jeziku. Postoje dva binarna operatora: operator &amp;quot;$&amp;quot; i operator &amp;quot;#&amp;quot;. Operator &amp;quot;$&amp;quot; je levo asocijativan i ima veći prioritet od operatora &amp;quot;#&amp;quot;, koji je desno asocijativan. Izrazi se sastoje od identifikatora (IDENT) i konstanti (CONST) između kojih se navode dati operatori. Binarni operator se piše između svoja dva operanda. IDENT i CONST su terminalni simboli. Gramatika ne sme biti višeznačna.&lt;br /&gt;
&lt;br /&gt;
Primer izraza: a$2$3 # b$3 # c&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
* &amp;amp;lt;expr&amp;gt; → &amp;amp;lt;dollar_expr&amp;gt; # &amp;amp;lt;expr&amp;gt;&lt;br /&gt;
* &amp;amp;lt;expr&amp;gt; → &amp;amp;lt;dollar_expr&amp;gt;&lt;br /&gt;
* &amp;amp;lt;dollar_expr&amp;gt; → &amp;amp;lt;dollar_expr&amp;gt; $ &amp;amp;lt;term&amp;gt;&lt;br /&gt;
* &amp;amp;lt;dollar_expr&amp;gt; → &amp;amp;lt;term&amp;gt;&lt;br /&gt;
* &amp;amp;lt;term&amp;gt; → &amp;amp;lt;IDENT&amp;gt;&lt;br /&gt;
* &amp;amp;lt;term&amp;gt; → &amp;amp;lt;CONST&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 4. zadatak ==&lt;br /&gt;
{{delimično rešeno}}&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Na osnovu zadate gramatike konstruisati LR(0) parser. Nacrtati LR(0) karakteristični automat (prepoznavač ručki), nacrtati potisnu i kontrolnu tabelu.&lt;br /&gt;
* &amp;amp;lt;S&amp;gt; → (&amp;amp;lt;A&amp;gt;)&lt;br /&gt;
* &amp;amp;lt;A&amp;gt; → &amp;amp;lt;S&amp;gt;, b&lt;br /&gt;
* &amp;amp;lt;A&amp;gt; → a&lt;br /&gt;
Prikazati rad parsera kada se na ulaz dovede sledeća ulazna sekvenca: ((a),b)&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Potisna tabela&lt;br /&gt;
! Stanje&lt;br /&gt;
! &amp;amp;lt;S&amp;gt;             !! ─┤                  !! (             !! &amp;amp;lt;A&amp;gt;        !! )             !! ,             !! b             !! a&lt;br /&gt;
|-&lt;br /&gt;
! ∇&lt;br /&gt;
| &amp;amp;lt;S&amp;gt;&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; ||                     || (&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; ||               ||               || || ||&lt;br /&gt;
|-&lt;br /&gt;
! &amp;amp;lt;S&amp;gt;&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|                    || ─┤&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;      ||               ||               ||               || || ||&lt;br /&gt;
|-&lt;br /&gt;
! ─┤&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|                    ||                     ||               ||               ||               || || ||&lt;br /&gt;
|-&lt;br /&gt;
! (&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;&lt;br /&gt;
| &amp;amp;lt;S&amp;gt;&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; ||  || (&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || &amp;amp;lt;A&amp;gt;&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; ||               || || || a&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! &amp;amp;lt;A&amp;gt;&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;&lt;br /&gt;
|                    ||                     ||               ||                    || )&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || || ||&lt;br /&gt;
|-&lt;br /&gt;
! )&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;&lt;br /&gt;
|                    ||                     ||               ||                    ||               || || ||&lt;br /&gt;
|-&lt;br /&gt;
! &amp;amp;lt;S&amp;gt;&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;&lt;br /&gt;
|                    ||                     ||               ||                    ||               || ,&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; || ||&lt;br /&gt;
|-&lt;br /&gt;
! ,&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;&lt;br /&gt;
|                    ||                     ||               ||                    ||               || || b&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; ||&lt;br /&gt;
|-&lt;br /&gt;
! b&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;&lt;br /&gt;
|                    ||                     ||               ||                    ||               || || ||&lt;br /&gt;
|-&lt;br /&gt;
! a&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt;&lt;br /&gt;
|                    ||                     ||               ||                    ||               || || ||&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Kontrolna tabela&lt;br /&gt;
! Stanje&lt;br /&gt;
! Akcija&lt;br /&gt;
|-&lt;br /&gt;
! ∇&lt;br /&gt;
| SHIFT&lt;br /&gt;
|-&lt;br /&gt;
! &amp;amp;lt;S&amp;gt;&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
| SHIFT&lt;br /&gt;
|-&lt;br /&gt;
! ─┤&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
| ACCEPT&lt;br /&gt;
|-&lt;br /&gt;
! (&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;&lt;br /&gt;
| SHIFT&lt;br /&gt;
|-&lt;br /&gt;
! &amp;amp;lt;A&amp;gt;&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;&lt;br /&gt;
| SHIFT&lt;br /&gt;
|-&lt;br /&gt;
! )&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;&lt;br /&gt;
| REDUCE(1)&lt;br /&gt;
|-&lt;br /&gt;
! &amp;amp;lt;S&amp;gt;&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;&lt;br /&gt;
| SHIFT&lt;br /&gt;
|-&lt;br /&gt;
! ,&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;&lt;br /&gt;
| SHIFT&lt;br /&gt;
|-&lt;br /&gt;
! b&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;&lt;br /&gt;
| REDUCE(2)&lt;br /&gt;
|-&lt;br /&gt;
! a&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt;&lt;br /&gt;
| REDUCE(3)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:Програмски преводиоци 1]]&lt;/div&gt;</summary>
		<author><name>Fedja</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9F%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D1%81%D0%BA%D0%B8_%D0%BF%D1%80%D0%B5%D0%B2%D0%BE%D0%B4%D0%B8%D0%BE%D1%86%D0%B8_1/%D0%9F%D1%80%D0%BE%D1%98%D0%B5%D0%BA%D0%B0%D1%82&amp;diff=6425</id>
		<title>Програмски преводиоци 1/Пројекат</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9F%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D1%81%D0%BA%D0%B8_%D0%BF%D1%80%D0%B5%D0%B2%D0%BE%D0%B4%D0%B8%D0%BE%D1%86%D0%B8_1/%D0%9F%D1%80%D0%BE%D1%98%D0%B5%D0%BA%D0%B0%D1%82&amp;diff=6425"/>
		<updated>2023-08-19T13:17:28Z</updated>

		<summary type="html">&lt;p&gt;Fedja: precizniji format&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&#039;&#039;&#039;Пројекат&#039;&#039;&#039; на предмету важи за једну од најтежих активности на њему због тога што захтева практичну примену знања стечених у трећем блоку (и понеких из првог и другог блока). Његова израда може захтевати око недељу дана константног рада (у зависности од нивоа за који радите) али се такође велики део тога може искористити из постојећих материјала са вежби и званичних видео водича за пројекат, на које ће се овај водич надаље ослањати.&lt;br /&gt;
&lt;br /&gt;
== Основно ==&lt;br /&gt;
Идеја пројекта јесте конструкција преводиоца за Микројаву — поједностављену, школску варијанту језика Јава чија се спецификација помало мења из године у годину (али неке суштинске ствари остају исте). Преводилац из једног фајла са изворним кодом чита Микројава код по спецификацији датој уз текст пројекта (а одвојеној од саме поставке), пролази кроз четири фазе превођења (лексичку анализу, синтаксну анализу, семантичку анализу и генерисање кода) и његов крајњи резултат јесте објектна датотека са Микројава бајткодом. Тај објектни фајл се затим може извршавати преко Микројава виртуелне машине (чија је имплементација већ дата и не може се мењати) и на основу неког уноса произвести неки излаз.&lt;br /&gt;
&lt;br /&gt;
За пројекат је потребно гледати вежбе трећег блока из табеле симбола и Микројава виртуелне машине, и евентуално вежбе првог и другог блока из JFlex и CUP. Такође су доступни видео водичи за пројекат са странице предмета, које је корисно погледати као увод у алате и нека генерална очекивања. Ти водичи су енкодовани неким јако застарелим кодеком, а реенкодовани снимци се могу наћи [https://studentetfbgacrs-my.sharepoint.com/:f:/g/personal/sa190595d_student_etf_bg_ac_rs/EvsffqNW2DBEhOcMqJ4xmFQBW5n-doL8EF58qMZ6qMbnDQ овде.]&lt;br /&gt;
&lt;br /&gt;
Пре него што пређете на даље одељке, &#039;&#039;&#039;препоручује се да прочитате поставку пројекта.&#039;&#039;&#039; Микројава спецификацију не морате читати, јер ће вам она највише значити приликом самог развијања пројекта.&lt;br /&gt;
&lt;br /&gt;
== Поставка ==&lt;br /&gt;
Сада када сте прочитали поставку, о њој је потребно рећи пар речи.&lt;br /&gt;
* Структура пројекта уопште не мора да буде онаква каква пише у поставци. То значи:&lt;br /&gt;
** Пакет не мора да се зове &amp;lt;code&amp;gt;rs.ac.bg.etf.pp1&amp;lt;/code&amp;gt;.&lt;br /&gt;
** Не постоји конкретан директоријум у који морате да сместите спецификације лексера и парсера.&lt;br /&gt;
** Није обавезно коришћење JDK 1.8 (мада је препоручено)&lt;br /&gt;
** Класе не морају да се зову &amp;lt;code&amp;gt;Compiler&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;SemanticAnalyzer&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;CodeGenerator&amp;lt;/code&amp;gt;.&lt;br /&gt;
* На одбрани се мање-више гледа само излаз преведеног Микројава програма за модификацију и за јавни тест одговарајућег нивоа за који радите. Ово у пракси значи:&lt;br /&gt;
** Нико неће проверавати формат грешке лексера.&lt;br /&gt;
** Нико неће проверавати да ли се успешно ради опоравак од грешке.&lt;br /&gt;
*** Ипак, препоручује се да пробате овај део да одрадите, али ако на неком месту не ради то није велики проблем.&lt;br /&gt;
** Нико неће проверавати да ли нисте користили &amp;lt;code&amp;gt;precedence&amp;lt;/code&amp;gt; (али нико неће ни објаснити како се користи).&lt;br /&gt;
** Нико неће проверавати како су именовани нетерминали нити класе које одговарају гранама тих нетерминала.&lt;br /&gt;
** Нико неће проверавати да ли сте додали акције у спецификацију парсера.&lt;br /&gt;
*** Свакако се препоручује да потребне акције обављате кроз одговарајуће посетиоце стабла, јер у спецификацији парсера није доступан IntelliSense.&lt;br /&gt;
** Није много вероватно да ће предметни сарадници погледати да ли користите њихову табелу симбола, да ли сте је распаковали и превели поново или користите неку потпуно другу имплементацију.&lt;br /&gt;
*** Ипак, коришћење њихове табеле симбола носи са собом погодност да ћете увежбати рад са њом па нећете много морати да обнављате за такве задатке на испиту.&lt;br /&gt;
** Нико неће проверавати да ли сте имплементирали методу &amp;lt;code&amp;gt;tsdump()&amp;lt;/code&amp;gt;.&lt;br /&gt;
** Нико неће проверавати да ли исписујете симболе при њиховој детекцији.&lt;br /&gt;
** Слабо ће се проверавати да ли се пријављују семантичке грешке.&lt;br /&gt;
*** Ипак, пошто током семантичке обраде свакако мора да се попуни табела симбола, вреди додати ове провере, у крајњем случају зато што ће вама значити уколико будете писали своје тест примере и напишете нешто семантички неисправно.&lt;br /&gt;
*** Може да се деси да неке ствари из јавних тестова или тестова за модификације које су закоментарисане морају да пријаве семантичке грешке, и да их предметни сарадници откоментаришу приликом одбране.&lt;br /&gt;
** Нико неће проверавати да ли се путање до улазних и излазних фајлова прослеђују кроз аргументе командне линије.&lt;br /&gt;
* На одбрани се не тражи да се било шта покреће из командне линије, нити преусмерава стандардни излаз и излаз за грешке.&lt;br /&gt;
* Примери Микројава кода из поставке и спецификације могу често бити синтаксно или семантички неисправни. Ово је због тога што предметни сарадници не напишу преводилац за спецификацију Микројаве коју су задали, а пример вероватно ископирају из поставке односно спецификације од претходне године, па не провере да ли је исправан.&lt;br /&gt;
* На одбрани нико не погледа извештај са пројекта.&lt;br /&gt;
* Нико неће тражити да се покрену студентски тестови пројекта.&lt;br /&gt;
* Супротно поставци, дорада пројеката на одбрани је дозвољена.&lt;br /&gt;
* У одељку за контекстне услове у оквиру спецификације могу бити описане ствари које се не раде у фази семантичке анализе, већ или описују генерално функционисање тог програмског конструкта, или описују ствари које се морају обезбедити у фази генерисања кода.&lt;br /&gt;
* Приликом спецификације синтаксе користи се [[wikipedia:Extended Backus–Naur form|EBNF нотација]].&lt;br /&gt;
* Подела функционалности по нивоима може бити јако конфузна. Спецификација Микројаве може посебно напоменути за само пар ствари да се имплементирају само на одређеним нивоима (остављајући утисак да је потребно препознати синтаксу за методе и класе чак и у пројекту А нивоа), док поставка може непотпуно излиставати смене које су потребне да се имплементирају за одређени ниво. Најбољи начин за одређивање шта се имплементира за који ниво јесу одговарајући јавни тестови.&lt;br /&gt;
&lt;br /&gt;
== Алати ==&lt;br /&gt;
У овом одељку наведене су све напомене у вези са алатима које ћете користити на пројекту, од којих ће неке имати смисла тек након што погледате видео водиче.&lt;br /&gt;
* Неколико ствари из видео водича урађено је на неоптималан начин:&lt;br /&gt;
** Једна од првих ствари поменутих у видео водичима јесте инсталирање &#039;&#039;Ant&#039;&#039;. За овиме нема потребе, јер је &#039;&#039;Ant&#039;&#039; већ инсталиран у оквиру &#039;&#039;Eclipse&#039;&#039;. Такође, &#039;&#039;Ant&#039;&#039; правила се доста лакше могу покретати одласком на &#039;&#039;Window&#039;&#039; → &#039;&#039;Show View&#039;&#039; → &#039;&#039;Ant&#039;&#039;, и затим бирањем &amp;lt;code&amp;gt;build.xml&amp;lt;/code&amp;gt; фајла из пројекта.&lt;br /&gt;
** Уколико крећете од кода из видео водича, могуће је да ће вам избацивати &#039;&#039;deprecation&#039;&#039; упозорења поводом коришћења &amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; inline&amp;gt;new Integer()&amp;lt;/syntaxhighlight&amp;gt; конструктора. Ово можете заменити са [https://docs.oracle.com/javase/8/docs/api/java/lang/Integer.html#parseInt-java.lang.String- &amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; inline&amp;gt;Integer.parseInt()&amp;lt;/syntaxhighlight&amp;gt;.]&lt;br /&gt;
** Бројање параметара и локалних променљивих коришћењем &amp;lt;code&amp;gt;VarCounter&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;FormParamCounter&amp;lt;/code&amp;gt; није заправо потребно, већ их можете бројати приликом обиласка тих чворова стабла.&lt;br /&gt;
** На неколико места се користи &amp;lt;code&amp;gt;Tab.insert()&amp;lt;/code&amp;gt; ради прављења &amp;lt;code&amp;gt;Obj&amp;lt;/code&amp;gt; чвора који нема потребе заправо убацивати у табелу симбола. Уместо овога, могу се користити регуларни конструктори за &amp;lt;code&amp;gt;Obj&amp;lt;/code&amp;gt;.&lt;br /&gt;
* У рачунарским лабораторијама би требало да је доступан и IntelliJ, па можете у њему такође радити пројекат.&lt;br /&gt;
* &#039;&#039;&#039;Обавезно&#039;&#039;&#039; преузети библиотеке са странице предмета уместо коришћења оних из шаблона пројекта или видео водича, јер њихове верзије могу бити застареле и проузроковати проблеме.&lt;br /&gt;
* Унос са стандардног улаза неће радити уколико се преведени Микројава програм покреће кроз &#039;&#039;Ant&#039;&#039;, па је потребно додати директиву &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; inline&amp;gt;&amp;lt;redirector input=&amp;quot;input.txt&amp;quot; /&amp;gt;&amp;lt;/syntaxhighlight&amp;gt; како би се стандардни улаз читао из датотеке &amp;lt;code&amp;gt;input.txt&amp;lt;/code&amp;gt; која се налази у кореном директоријуму пројекта.&lt;br /&gt;
** На овај исти начин могу се преусмерити стандардни излаз и излаз за грешке: &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; inline&amp;gt;&amp;lt;redirector input=&amp;quot;input.txt&amp;quot; output=&amp;quot;output.txt&amp;quot; error=&amp;quot;error.txt&amp;quot; /&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
** Уколико уместо овога програм покренете кроз командну линију, могуће је да ћете морати да различите податке за унос (преко &amp;lt;code&amp;gt;read&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;bread&amp;lt;/code&amp;gt; инструкција) пишете у истом реду (уместо у новим редовима).&lt;br /&gt;
* Није неопходно користити Log4j библиотеку за испис уколико не желите.&lt;br /&gt;
* Подразумевано, Log4j библиотека неће исписивати на излаз за грешке већ на стандардни излаз, чак и кад су у питање поруке са грешкама. Ово може да се конфигурише, али свакако нико неће обраћати пажњу на то на одбрани.&lt;br /&gt;
* Уколико добијете &#039;&#039;Cannot invoke &amp;quot;java.net.URL.toString()&amp;quot; because &amp;quot;this.val$url&amp;quot; is null&#039;&#039; грешку, пробајте да линију &amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; inline&amp;gt;DOMConfigurator.configure(Log4JUtils.instance().findLoggerConfigFile());&amp;lt;/syntaxhighlight&amp;gt; замените са &amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; inline&amp;gt;DOMConfigurator.configure(&amp;quot;config/log4j.xml&amp;quot;);&amp;lt;/syntaxhighlight&amp;gt;.&lt;br /&gt;
* Грешка за непостојећи &amp;lt;code&amp;gt;log4j.dtd&amp;lt;/code&amp;gt; се може игнорисати.&lt;br /&gt;
* Не заборавите да на све &amp;lt;code&amp;gt;&amp;amp;lt;java&amp;gt;&amp;lt;/code&amp;gt; елементе у &amp;lt;code&amp;gt;build.xml&amp;lt;/code&amp;gt; додате &amp;lt;code&amp;gt;fork=&amp;quot;true&amp;quot;&amp;lt;/code&amp;gt; атрибут, јер ће се иначе те ставке покретати из неког директоријума који није корени директоријум пројекта.&lt;br /&gt;
&lt;br /&gt;
== Фазе израде ==&lt;br /&gt;
=== Лексичка анализа ===&lt;br /&gt;
* Да бисте почели са развојем ове фазе не морате куцати свој &amp;lt;code&amp;gt;sym.java&amp;lt;/code&amp;gt; фајл, већ се он може генерисати из CUP спецификације чим покренете &amp;lt;code&amp;gt;parserGen&amp;lt;/code&amp;gt; правило у &#039;&#039;Ant&#039;&#039;, уколико сте све своје терминале написали у CUP спецификацији (&amp;lt;code&amp;gt;terminal&amp;lt;/code&amp;gt;).&lt;br /&gt;
* Ова фаза је најлакша и могуће ју је урадити за само пар сати, али је &#039;&#039;&#039;битно урадити је како треба.&#039;&#039;&#039; Грешке у лексеру могу изазвати проблеме приликом парсирања, само што лексер у том тренутку може бити место на којем ћете најмање посумњати да се налази грешка. Постоји неколико ствари на које треба обратити пажњу:&lt;br /&gt;
** &#039;&#039;&#039;Генералнија правила иду на дно.&#039;&#039;&#039; На пример, уколико се правило за &amp;lt;code&amp;gt;if&amp;lt;/code&amp;gt; налази испод правила за детекцију идентификатора, лексер ће &amp;lt;code&amp;gt;if&amp;lt;/code&amp;gt; препознати као идентификатор и зато ће парсер избацити грешку приликом парсирања &#039;&#039;if&#039;&#039; наредбе.&lt;br /&gt;
** На само дно убацити једно &#039;&#039;match-all&#039;&#039; правило (као што је урађено у видео водичу). Уколико то не урадите, лексер ће избацити &#039;&#039;Error: could not match input&#039;&#039; грешку уколико се наиђе на карактер који није у спецификацији Микројаве, што само по себи није проблем, али вам ваша сопствена грешка може дати више информација о томе где је тачно проблем.&lt;br /&gt;
** Уколико радите на оперативном систему &#039;&#039;Linux&#039;&#039; или &#039;&#039;macOS&#039;&#039;, потребно је одвојити правило за &amp;lt;code&amp;gt;\r\n&amp;lt;/code&amp;gt; на правила за &amp;lt;code&amp;gt;\r&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;\n&amp;lt;/code&amp;gt; како би их правилно игнорисао.&lt;br /&gt;
** У видео водичу се за препознавање идентификатора користи &amp;lt;code&amp;gt;([a-z]|[A-Z])[a-z|A-Z|0-9|_]*&amp;lt;/code&amp;gt; регуларни израз, где је карактер &amp;lt;code&amp;gt;|&amp;lt;/code&amp;gt; грешком дозвољен у оквиру идентификатора, док је правилно &amp;lt;code&amp;gt;[a-zA-Z][a-zA-Z0-9_]*&amp;lt;/code&amp;gt;. Ово је мала грешка, али може направити проблем приликом конструката попут &amp;lt;code&amp;gt;a||b&amp;lt;/code&amp;gt;, који ће бити препознати као један идентификатор уместо два идентификатора са оператором између њих.&lt;br /&gt;
&lt;br /&gt;
=== Синтаксна анализа ===&lt;br /&gt;
* Најважније правило током развоја ове фазе јесте да &#039;&#039;&#039;сва правила пишете корак по корак и са тестирањем између.&#039;&#039;&#039; Током развоја алати могу пријавити грешке које вам ни на који начин не сугеришу где је заправо проблем, и такве грешке је далеко лакше пронаћи уколико знате који део синтаксе је тестиран и ради, а који је новододат. Ово значи да када преузмете пројекат из видео водича &#039;&#039;&#039;обришете све смене из њега&#039;&#039;&#039; (осим једне, попут &amp;lt;code&amp;gt;Program ::= PROG;&amp;lt;/code&amp;gt;, како би генерисање парсера уопште радило) и кренете са додавањем смена редом по спецификацији. Кад видите да сте додали неку мању али потпуну целину, тестирајте да ли то што сте додали ради. Ако не ради, уклањањем и враћањем делова које сте додали можете лоцирати где је тачно изазвана грешка. Овакав начин развоја помоћи ће и вама и људима које питате за помоћ око евентуалних грешки.&lt;br /&gt;
* Када кренете са развојом ове фазе, најбоље је да уопште не постављате називе класа на нетерминалима. Ови називи класа се много лакше постављају након што сте већ развили целу граматику (пре следеће фазе) и имате цео контекст, а њихово додавање током развоја граматике може изазвати неке од честих грешки. Исто тако, нема потребе додељивати типове терминалима и нетерминалима док не стигнете до следеће фазе, већ је довољно само декларисати их.&lt;br /&gt;
** Уколико сте ово покушали да радите и наишли на грешке, њихова решења ће бити објашњавана у следећем одељку.&lt;br /&gt;
* Како се у оквиру ове фазе такође ради и опоравак од грешке, вредно је напоменути да је сврха тог опоравка да се пријаве све постојеће синтаксне грешке у програму (уместо да се пријави само једна и изађе), али да се при детекцији било какве грешке не наставља на следећу фазу, чак иако се од свих синтаксних грешки парсер успешно опоравио.&lt;br /&gt;
* Уколико се уместо реда за место синтаксне грешке од које се опоравља исписује колона, то је баг у алату и ангажовани на предмету неће то замерати. Ово се такође може десити у следећој фази.&lt;br /&gt;
* Грешка &#039;&#039;java.lang.NullPointerException: Cannot invoke &amp;quot;String.equals(Object)&amp;quot; because &amp;quot;X&amp;quot; is null&#039;&#039; обично значи да је негде заборављена тачка-зарез, али пошто је ово суштински грешка у имплементацији AST-CUP она не даје никаквих додатних информација о томе где би та грешка могла да буде.&lt;br /&gt;
* Грешка &#039;&#039;Syntax error X(Y)&#039;&#039; означава грешку у синтакси CUP фајла и може се десити из више разлога. Битно је напоменути да се &#039;&#039;&#039;број &#039;&#039;X&#039;&#039; односи на линију у аутогенерисаној CUP спецификацији која се налази у фајлу са суфиском &amp;lt;code&amp;gt;_astbuild.cup&amp;lt;/code&amp;gt;&#039;&#039;&#039;, а не у оригиналној CUP спецификацији, док се број &#039;&#039;Y&#039;&#039; односи на колону (карактер) у том реду где је пријављена синтаксна грешка (који није од велике користи). Разлози из којих се ова грешка дешава могу бити:&lt;br /&gt;
** заборављена тачка-зарез на крају смене,&lt;br /&gt;
** недостатак размака након зареза у декларацији терминала или нетерминала,&lt;br /&gt;
** коришћење &amp;lt;code&amp;gt;:=&amp;lt;/code&amp;gt; уместо &amp;lt;code&amp;gt;::=&amp;lt;/code&amp;gt;,&lt;br /&gt;
** и тако даље.&lt;br /&gt;
* Уколико добијате конфликте приликом имплементације &#039;&#039;if-else&#039;&#039;, поставка обично помене која тачно &amp;lt;code&amp;gt;precedence&amp;lt;/code&amp;gt; директива сме да се користи за то (и само то).&lt;br /&gt;
* Грешка која гласи &#039;&#039;java.lang.NullPointerException: Cannot invoke &amp;quot;java_cup.astext.AstSymInfo.getType()&amp;quot; because &amp;quot;this.lhInfo&amp;quot; is null&#039;&#039; значи да неки нетерминал који се користи &#039;&#039;&#039;са леве стране неке смене&#039;&#039;&#039; није претходно декларисан. За нетерминале који се користе са десне стране а нису декларисани се дешава другачија грешка која јасније каже да се ради о томе.&lt;br /&gt;
* Од користи може бити следећа скрипта за генерисање листе нетерминала које је потребно декларисати током ове фазе (која престаје да буде корисна у тренутку када нетерминалима треба додељивати типове), коју је потребно покренути &#039;&#039;Python&#039;&#039; интерпретером из кореног директоријума пројекта:&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from re import compile&lt;br /&gt;
&lt;br /&gt;
NTERM_REGEX = compile(r&#039;^(\w+)\s*::=&#039;)&lt;br /&gt;
&lt;br /&gt;
nterms = []&lt;br /&gt;
&lt;br /&gt;
with open(&#039;spec/mjparser.cup&#039;) as file:&lt;br /&gt;
    for line in file:&lt;br /&gt;
        match = NTERM_REGEX.match(line)&lt;br /&gt;
        if match:&lt;br /&gt;
            nterms.append(match.group(1))&lt;br /&gt;
&lt;br /&gt;
print(f&#039;nonterminal {&amp;quot;, &amp;quot;.join(nterms)};&#039;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Семантичка анализа ===&lt;br /&gt;
; Техничке напомене&lt;br /&gt;
* Пре почетка ове фазе не заборавите да свим терминалима који са собом носе неке смислене вредности (идентификатори, константе...) доделите тип (преко &amp;lt;code&amp;gt;terminal Tip naziv;&amp;lt;/code&amp;gt;). Уколико ово не урадите, у нетерминалима који садрже те терминале неће се изгенерисати поља са вредностима ових терминала.&lt;br /&gt;
* Такође пре почетка ове фазе потребно је свим нетерминалима доделити називе класа (уколико их не доделите, називи класа биће аутогенерисани па су као такви генерално непогодни за рад са њима). Када додељујете ове називе, битно је да се водите са два правила:&lt;br /&gt;
*# Уколико нетерминал има само једну грану, поставите да њен назив класе буде исти као и назив самог нетерминала. Ово ће генерисати једну конкретну класу за тај нетерминал.&lt;br /&gt;
*# Уколико нетерминал има више од једне гране, &#039;&#039;&#039;ниједна његова грана не сме да се зове исто као и сам нетерминал.&#039;&#039;&#039; Назив нетерминала користи се као назив апстрактне класе, а називи класа његових грана користе се за конкретне класе које су изведене из те апстрактне класе. Уколико нетерминал има више грана, и једна грана се зове исто као нетерминал, AST-CUP ће се збунити и неће знати да ли та класа треба да буде апстрактна и конкретна и ово ће испољити као грешка са конструкторима.&lt;br /&gt;
*#* Важно је напоменути да се левој и десној страни не смеју додељивати називи класа са различитом капитализацијом (&amp;lt;code&amp;gt;AssignOp&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;Assignop&amp;lt;/code&amp;gt;), јер се на фајл системима који се обично користе под &#039;&#039;Windows&#039;&#039; ови називи класа мапирају у исту Java датотеку. Ово је посебно опасно на оперативним системима &#039;&#039;Linux&#039;&#039; и &#039;&#039;macOS&#039;&#039;, где до грешки овог типа неће доћи (већ ће се оне десити тек у лабораторији).&lt;br /&gt;
* Уколико сте дошли до овог дела а потребно вам је да регенеришете парсер, не заборавите да након регенерисања парсера освежите пројекат десним кликом на пројекат и опцијом &#039;&#039;Refresh&#039;&#039;. Овај корак је потребан због тога што генерисање парсера позива спољашњи програм који без знања &#039;&#039;Eclipse&#039;&#039; мења фајлове унутар пројекта, и како би &#039;&#039;Eclipse&#039;&#039; знао да су се ти фајлови променили потребно је освежити их. Уколико ово не урадите, &#039;&#039;IntelliSense&#039;&#039; може пријављивати грешке које немају смисла и &#039;&#039;Eclipse&#039;&#039; може спречавати покретање компајлера због тога.&lt;br /&gt;
** Ово се у &#039;&#039;Eclipse&#039;&#039;-у може заобићи тако што се намести аутоматско освежавање након покретања спољашње &#039;&#039;Ant&#039;&#039; скрипте. То се ради тако што се у &#039;&#039;Project Explorer&#039;&#039;-у кликне десни клик на &#039;&#039;build.xml&#039;&#039; скрипту, онда &#039;&#039;Run as -&amp;gt; External Tools Configuration&#039;&#039;, онда се у искачућем прозору изабере таб &#039;&#039;Refresh&#039;&#039; и чекира се опција &#039;&#039;Refresh resources upon completion&#039;&#039; и &#039;&#039;The entire workspace&#039;&#039; у подменију.&lt;br /&gt;
* &amp;lt;code&amp;gt;Compiler&amp;lt;/code&amp;gt; класа је заправо скоро неизмењена &amp;lt;code&amp;gt;MJParserTest&amp;lt;/code&amp;gt; класа из видео водича, тако да можете само њу да преименујете/преместите.&lt;br /&gt;
; Табела симбола&lt;br /&gt;
* Пре рада са њиховом табелом симбола, не заборавите да у главној класи позовете &amp;lt;code&amp;gt;Tab.init()&amp;lt;/code&amp;gt;. Уколико то не урадите, грешка коју ћете добити може садржати &#039;&#039;&amp;quot;rs.etf.pp1.symboltable.Tab.currentScope&amp;quot; is null&#039;&#039;.&lt;br /&gt;
* Подразумевано, &amp;lt;code&amp;gt;Tab.dump()&amp;lt;/code&amp;gt; неће исписивати &#039;&#039;bool&#039;&#039; типове објектних чворова, јер то није имплементирано у &amp;lt;code&amp;gt;DumpSymbolTableVisitor&amp;lt;/code&amp;gt; (већ ће то место стајати празно). Пошто свакако нико није гледао испис табеле симбола на одбрани пројекта, ово никоме није ни било битно.&lt;br /&gt;
* Такође, &amp;lt;code&amp;gt;Tab.dump()&amp;lt;/code&amp;gt; може правити проблем када се као члан неке класе или као локални симбол члана неке класе нађе објекат те класе, јер тада долази до бесконачне рекурзије при испису. Једини случај кад неће доћи до ове бесконачне рекурзије јесте кад само симболи са називом &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; носе тип те класе (у том случају се њихов тип уопште не исписује). Пошто оваквих тест примера није било, ово никоме није правило проблем.&lt;br /&gt;
* Још један проблем са бесконачном рекурзијом у њиховој табели симбола може се десити уколико поредите класне типове са њиховом имплементацијом &amp;lt;code&amp;gt;equals&amp;lt;/code&amp;gt;. Ако два класна типа имају исти број поља и метода, и барем једну методу, &amp;lt;code&amp;gt;equals&amp;lt;/code&amp;gt; ће прећи на поређење тих метода и упасти у бесконачну рекурзију. Као и претходно, пошто оваквих тест примера генерално нема ово никоме не прави проблем. Са друге стране, пошто се на ову грешку најчешће наиђе приликом провере наткласа, може се специјално за случај када се ради о две класе користити оператор &amp;lt;code&amp;gt;==&amp;lt;/code&amp;gt; за поређење референци.&lt;br /&gt;
* &amp;lt;code&amp;gt;assignableTo&amp;lt;/code&amp;gt; метода у њиховој табели симбола не проверава да ли је једна класа подкласа друге, па је ову проверу потребно имплементирати (видети такође напомену изнад).&lt;br /&gt;
* Формат исписа чвора у &amp;lt;code&amp;gt;Tab.dump()&amp;lt;/code&amp;gt; јесте &amp;lt;code&amp;gt;&amp;amp;lt;kind&amp;gt; &amp;amp;lt;name&amp;gt;: &amp;amp;lt;type&amp;gt;, &amp;amp;lt;adr&amp;gt;, &amp;amp;lt;level&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Приликом постављања &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; поља објектним чворовима који представљају низове праве се нови &amp;lt;code&amp;gt;Struct&amp;lt;/code&amp;gt; чворови, тако да два објектна чвора са истим низовском типом неће показивати на исти објекат у позадини. Ово генерално не прави никакав проблем.&lt;br /&gt;
* Када се кроз &amp;lt;code&amp;gt;Tab.insert()&amp;lt;/code&amp;gt; убаци један објектни чвор у табелу симбола, његов &amp;lt;code&amp;gt;level&amp;lt;/code&amp;gt; се аутоматски поставља на 0 уколико се ради о глобалном досегу и 1 уколико се ради о локалном. Ово је пожељно понашање за променљиве, али за методе, чији &amp;lt;code&amp;gt;level&amp;lt;/code&amp;gt; треба да садржи број параметара, је прво потребно вратити &amp;lt;code&amp;gt;level&amp;lt;/code&amp;gt; на 0 а затим га приликом обиласка сваког чвора синтаксног стабла за параметре повећавати за 1.&lt;br /&gt;
* Уколико је потребно додати нешто у &#039;&#039;universe&#039;&#039; досег (а обично јесте), то се може обавити одмах након позивања &amp;lt;code&amp;gt;Tab.init()&amp;lt;/code&amp;gt;, и код из &amp;lt;code&amp;gt;Tab.init()&amp;lt;/code&amp;gt; се може искористити за то.&lt;br /&gt;
&lt;br /&gt;
=== Генерисање кода ===&lt;br /&gt;
* Уколико се неке варијанте &amp;lt;code&amp;gt;dup&amp;lt;/code&amp;gt; инструкције исписују као &amp;lt;code&amp;gt;???&amp;lt;/code&amp;gt; приликом дисасемблирања, то је нормално понашање.&lt;br /&gt;
* Уколико је негде потребно обилазити низ или из неког другог разлога дохватити дужину низа, то није могуће урадити током превођења, већ је потребно генерисати код који позива &amp;lt;code&amp;gt;arraylength&amp;lt;/code&amp;gt; инструкцију, која са стека скине низ а постави дужину тог низа, и затим искористити ту вредност са стека у остатку генерисаног кода.&lt;br /&gt;
* Ако су у поставци задатка дате неке глобалне функције, код за њих је потребно генерисати на неком месту (најбоље на почетку) а затим тим функцијама поставити адресу на та места где је изгенерисан код за њих.&lt;br /&gt;
* Уколико желите да након генерисања кода тај код покренете тако да се приказује ток извршења програма и стање стека, можете додати ново правило попут:&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;target name=&amp;quot;debug&amp;quot; depends=&amp;quot;disasm&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;java classname=&amp;quot;rs.etf.pp1.mj.runtime.Run&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;arg value=&amp;quot;test/program.obj&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;arg value=&amp;quot;-debug&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;redirector input=&amp;quot;input.txt&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;classpath&amp;gt;&lt;br /&gt;
            &amp;lt;pathelement location=&amp;quot;lib/mj-runtime.jar&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/classpath&amp;gt;&lt;br /&gt;
    &amp;lt;/java&amp;gt;&lt;br /&gt;
&amp;lt;/target&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
** Ово вам, додуше, неће приказати садржај меморије Микројава виртуелне машине након извршених инструкција. Уколико вас то занима, можете прекопирати &amp;lt;code&amp;gt;Run&amp;lt;/code&amp;gt; класу из JAR фајла са извршним окружењем у свој пројекат, променити му пакет, поставити аргументе и &#039;&#039;breakpoint&#039;&#039;-ове на одговарајућа места (највероватније у &amp;lt;code&amp;gt;interpret&amp;lt;/code&amp;gt; методи) и покренути у дебаг режиму.&lt;br /&gt;
&lt;br /&gt;
== Одбрана ==&lt;br /&gt;
* На одбрани, пројекат се подешава тако што се &#039;&#039;Eclipse&#039;&#039; пројекат отвори помоћу опције &#039;&#039;File&#039;&#039; → &#039;&#039;Open Projects from File System&#039;&#039; и затим покрене било кроз &#039;&#039;Ant&#039;&#039; прозор било на начин показан на видео водичу.&lt;br /&gt;
* У поставци пројекта је изричито речено да су студенти дужни да осигурају да њихово решење ради на лабораторијским рачунарима. Ово генерално није толико неопходно, јер су решења генерално преносива, али уколико желите да се уверите лабораторија П26 је отворена за студентски рад радним данима до 20 часова, када се не одржавају остале лабораторијске вежбе.&lt;br /&gt;
* Одбрана пројекта изгледа тако што ангажовани на предмету прво дају модификацију и од тада студенти имају три сата да ураде модификацију и одбране пројекат. Тест примери за модификације су генерално дати на дељеним дисковима (али могу бити погрешни, јер нису били тестирани на правом пројекту). Када студент уради модификацију, позове асистента или демонстратора и они покрену пројекат на тесту за модификацију (евентуално више пута са промењеним параметрима, откоментарисаним линијама које су закоментарисане), испитају студента како је урадио модификацију, покрену јавни тест и опционо питају неко питање о самом пројекту. Уколико нешто не ради, студент може да исправља пројекат док не истекне време.&lt;br /&gt;
* Дозвољено је дељење тестова између студената, тако да пре одбране можете поделити са осталима своје тестове како би сви заједно више багова ухватили у својим пројектима.&lt;br /&gt;
&lt;br /&gt;
== Референце ==&lt;br /&gt;
* [[github:ksendzo/PP1-Projekat|Водич за пројекат 2021/2022.]] на којем су делови овог водича засновани.&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Водичи]]&lt;br /&gt;
[[Категорија:Програмски преводиоци 1]]&lt;/div&gt;</summary>
		<author><name>Fedja</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9A%D0%94%D0%9F&amp;diff=6409</id>
		<title>КДП</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9A%D0%94%D0%9F&amp;diff=6409"/>
		<updated>2023-07-09T10:37:20Z</updated>

		<summary type="html">&lt;p&gt;Fedja: indikator rešenosti&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Предмет&lt;br /&gt;
| назив     = Конкурентно и дистрибуирано програмирање&lt;br /&gt;
| шифра     = 13С113КДП, 13Е113КДП&lt;br /&gt;
| семестар  = 6 (СИ), 5 (РТИ)&lt;br /&gt;
| статус    = обавезни&lt;br /&gt;
| страница  = [https://rti.etf.bg.ac.rs/rti/ir3kdp/ rti.etf.rs/rti/ir3kdp]&lt;br /&gt;
| одсек     = СИ, РТИ&lt;br /&gt;
}}&lt;br /&gt;
&#039;&#039;&#039;Конкурентно и дистрибуирано програмирање&#039;&#039;&#039; је обавезан предмет у шестом семестру за СИ, а петом семестру за РТИ.&lt;br /&gt;
&lt;br /&gt;
== Корисне везе ==&lt;br /&gt;
* [https://drive.google.com/open?id=1QmIZUSBKN0HFOy1OKWm5GJUn1e7BCkPG ETF SI] (решења, лабови, наставни материјали)&lt;br /&gt;
* [https://app.box.com/s/0r50je333z1qyypz0h3rm0iqb9s0d64f/folder/11532517441 ETF Materijali (Box)] (исправке књиге, лабови)&lt;br /&gt;
* [https://github.com/PavleSarenac/Concurrent_and_Distributed_Programming/tree/main/Beleske Beleske] (све са презентација, само много детаљније објашњено)&lt;br /&gt;
&lt;br /&gt;
== Настава ==&lt;br /&gt;
Настава се одржава у три блока (подељено по колоквијумима):&lt;br /&gt;
* &#039;&#039;&#039;Први блок:&#039;&#039;&#039; синхронизациони алгоритми (само на предавањима), семафори&lt;br /&gt;
* &#039;&#039;&#039;Други блок:&#039;&#039;&#039; региони, монитори, конкурентно програмирање у програмском језику Јава (само на вежбама)&lt;br /&gt;
* &#039;&#039;&#039;Трећи блок:&#039;&#039;&#039; дистрибуирано програмирање, мрежно програмирање у програмском језику Јава (само на вежбама)&lt;br /&gt;
Вежбе првих пар недеља могу да не буду одржане како би се на предавањима довољно напредовало са градивом, док се на предавањима држе четири уместо два часа недељно. Презентације са предавања и вежби могу се наћи на страници предмета, у одељку Литература.&lt;br /&gt;
&lt;br /&gt;
На РТИ одсеку градиво се дели на конкурентно (синхронизациони алгоритми, семафори, региони, монитори) и дистрибуирано програмирање, где конкурентно долази на колоквијуму а дистрибуирано на испиту. Из овог разлога се након јунског испитног рока (на СИ) области деле на два уместо на три дела (рокови су исти и за СИ и за РТИ).&lt;br /&gt;
&lt;br /&gt;
За припремање колоквијума од посебне користи може бити књига &#039;&#039;The little books of semaphores&#039;&#039; која се може наћи на драјву у секцији &#039;&#039;Корисне везе&#039;&#039;. Проблеми одадве често долазе када наставници желе да дају нешто ново, па није лоше видети идеје одатле.&lt;br /&gt;
&lt;br /&gt;
== Лабораторијске вежбе ==&lt;br /&gt;
Лабораторијске вежбе се обично одрже у трећем блоку предавања. Раде се у програмском језику Јава. На првој лабораторијској вежби ради се конкурентно, док се на другој ради дистрибуирано програмирање. Од развојних окружења на лабораторијској вежби су доступни &#039;&#039;Eclipse&#039;&#039; и &#039;&#039;IntelliJ&#039;&#039;, док се на вежбама углавном користи &#039;&#039;Eclipse&#039;&#039;. Вежбе у другом и трећем блоку се делом баве областима које дођу на лабораторијској вежби, док се такође организују и показне лабораторијске вежбе. На првој показној лабораторијској вежби ради се један [https://rti.etf.bg.ac.rs/rti/ir3kdp/laboratorija/_arhiva/KDP_2011_1.pdf задатак из 2011. године] чија поставка није директно доступна са странице предмета.&lt;br /&gt;
&lt;br /&gt;
За припрему за лабораторијске вежбе, поред гледања вежби и показних лабораторијских вежби, доступни су и пробни задатаци за лабораторијску вежбу са странице предмета који немају решења (често слични задаци дођу и на лабораторијској вежби). Поред тога, на викију су сакупљени следећи задаци са претходних лабораторијских вежби:&lt;br /&gt;
{{#dpl:&lt;br /&gt;
| category    = КДП&lt;br /&gt;
| category    = Лабораторијске вежбе&lt;br /&gt;
| format      = ,\n* [[%PAGE%|²{#invoke:String¦sub¦%PAGE%¦5¦-1}²]],,&lt;br /&gt;
| ordermethod = title&lt;br /&gt;
}}&lt;br /&gt;
Лабораторијске вежбе носе 20 бодова на предмету, свака по 10 бодова. Уколико се ради и пројекат, гледа се бољи резултат. Могуће је надокнадити једну лабораторијску вежбу.&lt;br /&gt;
&lt;br /&gt;
== Пројекат ==&lt;br /&gt;
Уместо лабораторијских вежби може да се ради пројекат, који исто носи 20 бодова. Може да се мења на свака два рока, тако да у јануару и фебруару буде један пројекат, у јуну и јулу други а у августу и септембру трећи.&lt;br /&gt;
&lt;br /&gt;
Додатне информације везане за пројекат се налазе у [[КДП/Пројекат|водичу]].&lt;br /&gt;
&lt;br /&gt;
== Испитни рокови ==&lt;br /&gt;
Поставке испитних рокова су доступне на страници предмета, док се њихова решења могу наћи на неком од драјвова из [[#Корисне везе|одељка са корисним везама]]. Следећи рокови су скупљени на викију:&lt;br /&gt;
{{#dpl:&lt;br /&gt;
| category    = КДП&lt;br /&gt;
| category    = Рокови&lt;br /&gt;
| format      = ,\n* &amp;lt;span class=&amp;quot;rok,&amp;quot;&amp;gt;[[%PAGE%|²{#invoke:String¦sub¦%PAGE%¦5¦-1}²]]&amp;lt;/span&amp;gt;,&lt;br /&gt;
| ordermethod = title&lt;br /&gt;
| include     = {nerešeno}.dpl, {delimično rešeno}.dpl, {нерешено}.dpl, {делимично решено}.dpl&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Категорије задатака ===&lt;br /&gt;
Овде су излистани различите категорије задатака које могу да дођу на испитима. Одласком на страницу категорије можете видети све задатке тог типа који су решени (или барем преписани) на викију. Уколико желите да уређујете решења, то је потребно радити преко страница рокова излистаних изнад.&lt;br /&gt;
&lt;br /&gt;
==== Конкуретно програмирање ====&lt;br /&gt;
* [[КДП/Монитори|Монитори]]&lt;br /&gt;
* [[КДП/Региони|Региони]]&lt;br /&gt;
* [[КДП/Семафори|Семафори]]&lt;br /&gt;
* [[КДП/Синхронизациони алгоритми|Синхронизациони алгоритми]]&lt;br /&gt;
* [[КДП/Штафетна палица|Штафетна палица]]&lt;br /&gt;
&lt;br /&gt;
==== Дистрибуирано програмирање ====&lt;br /&gt;
* [[КДП/Активни монитори|Активни монитори]]&lt;br /&gt;
* [[КДП/CSP|CSP]]&lt;br /&gt;
* [[КДП/C-Linda|C-Linda]]&lt;br /&gt;
* [[КДП/Прстен|Прстен]]&lt;br /&gt;
* [[КДП/Размена порука|Размена порука (канали: send/receive)]]&lt;br /&gt;
* [[КДП/Рандеву|Рандеву]]&lt;br /&gt;
* [[КДП/RPC|RPC]]&lt;br /&gt;
* [[КДП/Сандучићи|Сандучићи (msg_box)]]&lt;br /&gt;
* [[КДП/Филтерски процеси|Филтерски процеси]]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
Доступан је уџбеник из предмета од 2018. године:&lt;br /&gt;
* &#039;&#039;&#039;[https://akademska-misao.rs/product/konkurentno-i-distribuirano-programiranje-drugo-izdanje/ Конкурентно и дистрибуирано програмирање]&#039;&#039;&#039;, друго издање, З.Радивојевић, И.Икодиновић, З.Јовановић, &#039;&#039;Издавач: Академска мисао, Београд&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Начин оцењивања ==&lt;br /&gt;
=== СИ ===&lt;br /&gt;
; Предиспитне обавезе&lt;br /&gt;
* &amp;lt;math&amp;gt;L_1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;L_2&amp;lt;/math&amp;gt; — Бодови са прве и друге лабораторијске вежбе (0-10 свака, могућа надокнада једне вежбе)&lt;br /&gt;
* &amp;lt;math&amp;gt;Pr&amp;lt;/math&amp;gt; — Бодови са пројекта (0-20)&lt;br /&gt;
* &amp;lt;math&amp;gt;K_1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;K_2&amp;lt;/math&amp;gt; — Бодови са првог и другог колоквијума (0-25 сваки, могућа надокнада у јунском року)&lt;br /&gt;
; Јунски рок&lt;br /&gt;
* &amp;lt;math&amp;gt;K_3&amp;lt;/math&amp;gt; — бодови са трећег колоквијума (испитни део градива, дистрибуирано програмирање) у јунском року (0-30)&lt;br /&gt;
* &#039;&#039;&#039;Укупни бодови:&#039;&#039;&#039; &amp;lt;math&amp;gt;P = K_1 + K_2 + K_3 + max(L_1 + L_2, Pr)&amp;lt;/math&amp;gt;&lt;br /&gt;
; Остали рокови&lt;br /&gt;
* &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; — бодови са конкурентног дела испита (0-40), уколико се конкурентни део испита не ради онда је &amp;lt;math&amp;gt;K = (K_1 + K_2) \cdot 0.8&amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; — бодови са дистрибуираног дела испита (0-40)&lt;br /&gt;
* &#039;&#039;&#039;Укупни бодови:&#039;&#039;&#039; &amp;lt;math&amp;gt;P = K + D + max(L_1 + L_2, Pr)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== РТИ ===&lt;br /&gt;
; Предиспитне обавезе&lt;br /&gt;
* &amp;lt;math&amp;gt;L_1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;L_2&amp;lt;/math&amp;gt; — Бодови са прве и друге лабораторијске вежбе (0-10 свака, могућа надокнада једне вежбе у јануарском року)&lt;br /&gt;
* &amp;lt;math&amp;gt;Pr&amp;lt;/math&amp;gt; — Бодови са пројекта (0-20)&lt;br /&gt;
* &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; — Бодови са колоквијума (0-40, могућа надокнада у сваком року)&lt;br /&gt;
; Испитни рокови&lt;br /&gt;
* &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; — бодови са конкурентног дела испита (0-40), уколико се не ради овај део испита, важе поени са последњег изласка&lt;br /&gt;
* &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; — бодови са дистрибуираног дела испита (0-40)&lt;br /&gt;
* &#039;&#039;&#039;Укупни бодови:&#039;&#039;&#039; &amp;lt;math&amp;gt;P = K + D + max(L_1 + L_2, Pr)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Бодови&lt;br /&gt;
| &amp;lt;math&amp;gt;P \leq 50&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;50 &amp;lt; P \leq 60&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;60 &amp;lt; P \leq 70&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;70 &amp;lt; P \leq 80&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;80 &amp;lt; P \leq 90&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;90 &amp;lt; P&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Оцена&lt;br /&gt;
| 5 || 6 || 7 || 8 || 9 || 10&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Потребна помоћ ==&lt;br /&gt;
* {{zadaci|rešenja}}&lt;br /&gt;
*: Рокови којима недостаје понеко решење су: {{rokovi|делимично решени}}&lt;/div&gt;</summary>
		<author><name>Fedja</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9A%D0%94%D0%9F/%D0%88%D0%B0%D0%BD%D1%83%D0%B0%D1%80_2020&amp;diff=6408</id>
		<title>КДП/Јануар 2020</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9A%D0%94%D0%9F/%D0%88%D0%B0%D0%BD%D1%83%D0%B0%D1%80_2020&amp;diff=6408"/>
		<updated>2023-07-08T19:10:07Z</updated>

		<summary type="html">&lt;p&gt;Fedja: test za indikator rešenosti&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&#039;&#039;&#039;Јануарски испит 2020. године&#039;&#039;&#039; одржан је 18. јануара. Поставка овог рока може се наћи са [https://rti.etf.bg.ac.rs/rti/ir3kdp/rokovi/kdp20.zip странице предмета] (зипована).&lt;br /&gt;
&lt;br /&gt;
== {{категорија|1. задатак|Монитори}} ==&lt;br /&gt;
: &#039;&#039;Сличан задатак дошао је у [[КДП/Август 2021#1. zadatak|августу 2021. године]] са &#039;&#039;Signal and Continue&#039;&#039; дисциплином.&#039;&#039;&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Потребно је реализовати семафор који поред стандардних атомских операција &#039;&#039;signal()&#039;&#039; и &#039;&#039;wait()&#039;&#039; има и атомске операције &#039;&#039;signal(n)&#039;&#039; и &#039;&#039;wait(n)&#039;&#039; која интерну семафорску променљиву атомски увећава односно умањује за &#039;&#039;n&#039;&#039; уколико је то могуће, уколико није чека док не буде били могуће. Потребно је решити проблем користећи мониторе који имају &#039;&#039;Signal and Wait&#039;&#039; дисциплину. Процес који је раније упутио захтев треба раније да обави своју операцију. Број процеса и максимална вредност &#039;&#039;n&#039;&#039; нису унапред познати. Условне променљиве су &#039;&#039;FIFO&#039;&#039; према тренутку доласка и немају приоритетну методу &#039;&#039;wait&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
class Semaphore {&lt;br /&gt;
    private int value;&lt;br /&gt;
    private Queue&amp;lt;Integer&amp;gt; requests = new Queue&amp;lt;&amp;gt;();&lt;br /&gt;
    private Condition queue = new Condition();&lt;br /&gt;
    public Semaphore(int value) {&lt;br /&gt;
        this.value = value;&lt;br /&gt;
    }&lt;br /&gt;
    public synchronized void wait(int num) {&lt;br /&gt;
        if (value &amp;gt;= num) {&lt;br /&gt;
            value -= num;&lt;br /&gt;
        } else {&lt;br /&gt;
            requests.insert(num);&lt;br /&gt;
            queue.wait();&lt;br /&gt;
            internalSignal();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    public synchronized void signal(int num) {&lt;br /&gt;
        value += num;&lt;br /&gt;
        internalSignal();&lt;br /&gt;
    }&lt;br /&gt;
    public synchronized void wait() {&lt;br /&gt;
        wait(1);&lt;br /&gt;
    }&lt;br /&gt;
    public synchronized void signal() {&lt;br /&gt;
        signal(1);&lt;br /&gt;
    }&lt;br /&gt;
    private void internalSignal() {&lt;br /&gt;
        if (requests.size() &amp;gt; 0 &amp;amp;&amp;amp; value &amp;gt;= requests.top()) {&lt;br /&gt;
            value -= requests.pop();&lt;br /&gt;
            queue.signal();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== {{категорија|2. задатак|Семафори}} ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Користећи семафоре написати програм који решава проблем путовања лифтом. Путник позива лифт са произвољног спрата. Када лифт стигне на неки спрат сви путници који су изразили жељу да сиђу на том спрату обавезно изађу. Након изласка путника сви путници који су чекали на улазак уђу у лифт и кажу на који спрат желе да пређу. Тек када се сви изјасне лифт прелази даље. Лифт редом обилази спратове и стаје само на оне где има путника који улазе или излазе. Може се претпоставити да постоји N спратова.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct Floor {&lt;br /&gt;
    list&amp;lt;sem*&amp;gt; peopleEntering;&lt;br /&gt;
    sem mutexEntering = 1;&lt;br /&gt;
    list&amp;lt;sem*&amp;gt; peopleExiting;&lt;br /&gt;
    sem mutexExiting = 1;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
const int N = 10;&lt;br /&gt;
Floor floors[N];&lt;br /&gt;
sem liftSem = 0;&lt;br /&gt;
&lt;br /&gt;
void person() {&lt;br /&gt;
    sem personSem = 0;&lt;br /&gt;
    int currentFloorIndex = rand() % N;&lt;br /&gt;
    while (true) {&lt;br /&gt;
        // Особа може да каже да хоће да изађе на истом спрату као тренутном&lt;br /&gt;
        // Претпоставка: особа није глупа&lt;br /&gt;
        int nextFloorIndex = rand() % N;&lt;br /&gt;
        Floor&amp;amp; currentFloor = floors[currentFloorIndex];&lt;br /&gt;
        Floor&amp;amp; nextFloor = floors[nextFloorIndex];&lt;br /&gt;
        currentFloor.mutexEntering.wait();&lt;br /&gt;
        currentFloor.peopleEntering.push_back(&amp;amp;personSem);&lt;br /&gt;
        currentFloor.mutexEntering.signal();&lt;br /&gt;
        // Чекамо да дође лифт&lt;br /&gt;
        personSem.wait();&lt;br /&gt;
        // Улазимо у лифт и бирамо на којем спрату стајемо&lt;br /&gt;
        nextFloor.mutexExiting.wait();&lt;br /&gt;
        nextFloor.peopleExiting.push_back(&amp;amp;personSem);&lt;br /&gt;
        nextFloor.mutexExiting.signal();&lt;br /&gt;
        liftSem.signal();&lt;br /&gt;
        // Чекамо да лифт стигне на наш спрат&lt;br /&gt;
        personSem.wait();&lt;br /&gt;
        // Излазимо из лифта&lt;br /&gt;
        liftSem.signal();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void lift() {&lt;br /&gt;
    int currentFloorIndex = 0;&lt;br /&gt;
    bool goingUp = true;&lt;br /&gt;
    while (true) {&lt;br /&gt;
        // Одређивање следећег спрата&lt;br /&gt;
        // Претпоставка: лифт све време иде горе-доле, без обзира да ли га је неко звао&lt;br /&gt;
        if (goingUp) {&lt;br /&gt;
            if (++currentFloorIndex == N-1) {&lt;br /&gt;
                goingUp = false;&lt;br /&gt;
            }&lt;br /&gt;
        } else {&lt;br /&gt;
            if (--currentFloorIndex == 0) {&lt;br /&gt;
                goingUp = true;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        Floor&amp;amp; floor = floors[currentFloorIndex];&lt;br /&gt;
        // Не морамо да чекамо на mutexExiting, јер се он заузима само када путници улазе&lt;br /&gt;
        // што тренутно није случај&lt;br /&gt;
        int countPeopleExiting = floor.peopleExiting.size();&lt;br /&gt;
        // Задржавамо mutexEntering док не испразнимо листу, како нам не би ушао неочекивани путник&lt;br /&gt;
        floor.mutexEntering.wait();&lt;br /&gt;
        int countPeopleEntering = floor.peopleEntering.size();&lt;br /&gt;
        if (countPeopleExiting == 0 &amp;amp;&amp;amp; countPeopleEntering == 0) {&lt;br /&gt;
            // Не стајемо на овом спрату&lt;br /&gt;
            floor.mutexEntering.signal();&lt;br /&gt;
            continue;&lt;br /&gt;
        }&lt;br /&gt;
        // Стајемо на овом спрату&lt;br /&gt;
        // Пуштамо људе да изађу&lt;br /&gt;
        for (int i = 0; i &amp;lt; countPeopleExiting; ++i) {&lt;br /&gt;
            sem* personSem = floor.peopleExiting.front();&lt;br /&gt;
            personSem-&amp;gt;signal();&lt;br /&gt;
            floor.peopleExiting.pop_front();&lt;br /&gt;
        }&lt;br /&gt;
        for (int i = 0; i &amp;lt; countPeopleExiting; ++i) {&lt;br /&gt;
            liftSem.wait();&lt;br /&gt;
        }&lt;br /&gt;
        // Пуштамо људе да уђу&lt;br /&gt;
        for (int i = 0; i &amp;lt; countPeopleEntering; ++i) {&lt;br /&gt;
            sem* personSem = floor.peopleEntering.front();&lt;br /&gt;
            personSem-&amp;gt;signal();&lt;br /&gt;
            floor.peopleEntering.pop_front();&lt;br /&gt;
        }&lt;br /&gt;
        for (int i = 0; i &amp;lt; countPeopleEntering; ++i) {&lt;br /&gt;
            liftSem.wait();&lt;br /&gt;
        }&lt;br /&gt;
        floor.mutexEntering.signal();&lt;br /&gt;
        // Настављамо на следећи спрат&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== {{категорија|3. задатак|Активни_монитори}} ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Користећи технику активних монитора потребно је реализовати семафор који поред стандардних атомских операција &#039;&#039;signal()&#039;&#039; и &#039;&#039;wait()&#039;&#039; има и атомске операције &#039;&#039;signal(n)&#039;&#039; и &#039;&#039;wait(n)&#039;&#039; која интерну семафорску променљиву атомски увећава односно умањује за &#039;&#039;n&#039;&#039; уколико је то могуће, уколико није чека док не буде били могуће. Процес који је раније упутио захтев треба раније да обави своју операцију.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum op_kind { WAIT, SIGNAL, WAITN, SIGNALN };&lt;br /&gt;
chan request(int, op_kind, int);&lt;br /&gt;
chan reply[n](bool);&lt;br /&gt;
&lt;br /&gt;
class Semaphore {&lt;br /&gt;
public:&lt;br /&gt;
    void run() {&lt;br /&gt;
        int clientID;&lt;br /&gt;
        op_kind kind;&lt;br /&gt;
        int n;&lt;br /&gt;
        int tokens = 0;&lt;br /&gt;
        queue&amp;lt;pair&amp;lt;int,int&amp;gt;&amp;gt; pending;&lt;br /&gt;
        while (true) {&lt;br /&gt;
            receive request(clientID, kind, n);&lt;br /&gt;
            if (kind == WAIT) {&lt;br /&gt;
                if (tokens &amp;lt;= 0) {&lt;br /&gt;
                    pending.push(make_pair(clientID, 1));&lt;br /&gt;
                } else {&lt;br /&gt;
                    tokens--;&lt;br /&gt;
                    send reply[clientID](true);&lt;br /&gt;
                }&lt;br /&gt;
            } else if (kind == WAITN) {&lt;br /&gt;
                if (tokens &amp;lt;= n-1) {&lt;br /&gt;
                    pending.push(make_pair(clientID, n));&lt;br /&gt;
                } else {&lt;br /&gt;
                    tokens = tokens-n;&lt;br /&gt;
                    send reply[clientID](true);&lt;br /&gt;
                }&lt;br /&gt;
            } else if (kind == SIGNAL) {&lt;br /&gt;
                tokens++;&lt;br /&gt;
                if (!pending.empty() &amp;amp;&amp;amp; pending.front().second == tokens) {&lt;br /&gt;
                    tokens = 0;&lt;br /&gt;
                    send reply[pending.front().first](true);&lt;br /&gt;
                    pending.pop();&lt;br /&gt;
                }&lt;br /&gt;
            } else if (kind == SIGNALN) {&lt;br /&gt;
                tokens += n;&lt;br /&gt;
                while (!pending.empty() &amp;amp;&amp;amp; pending.front().second &amp;lt;= tokens) {&lt;br /&gt;
                    tokens -= pending.front().second;&lt;br /&gt;
                    send reply[pending.front().first](true);&lt;br /&gt;
                    pending.pop();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== {{категорија|4. задатак|CSP}} ==&lt;br /&gt;
{{delimično rešeno}}&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
У свемиру постоји N небеских тела која међусобно интерагују (&#039;&#039;N Body Gravitational Problem&#039;&#039;), по Њутновом закону гравитације. Свако тело интерагује са сваким, при чему размењују информације о позицији, брзини и вектору силе. Користећи CSP потребно је решити овај проблем користећи торбу послова за дохватање посла и синхронизацију на баријери у свакој итерацији. Потребно је реализовати следеће процесе: &#039;&#039;Worker&#039;&#039; (обавља израчунавање), &#039;&#039;Bag&#039;&#039; (обавља поделу посла) и &#039;&#039;Collector&#039;&#039; (обавља прикупљање резултата). Број процеса &#039;&#039;Worker&#039;&#039; није познат, али је познато да их има мање од N. Постоји тачно један процес &#039;&#039;Bag&#039;&#039; и тачно један процес &#039;&#039;Collector&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&lt;br /&gt;
[[Категорија:КДП]]&lt;br /&gt;
[[Категорија:Рокови]]&lt;/div&gt;</summary>
		<author><name>Fedja</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9F%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D1%81%D0%BA%D0%B8_%D0%BF%D1%80%D0%B5%D0%B2%D0%BE%D0%B4%D0%B8%D0%BE%D1%86%D0%B8_1&amp;diff=6403</id>
		<title>Програмски преводиоци 1</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9F%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D1%81%D0%BA%D0%B8_%D0%BF%D1%80%D0%B5%D0%B2%D0%BE%D0%B4%D0%B8%D0%BE%D1%86%D0%B8_1&amp;diff=6403"/>
		<updated>2023-07-06T13:50:52Z</updated>

		<summary type="html">&lt;p&gt;Fedja: indikator rešenosti&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Предмет&lt;br /&gt;
| шифра     = 13С114ПП1, 13Е114ПП1&lt;br /&gt;
| семестар  = 7&lt;br /&gt;
| статус    = обавезни&lt;br /&gt;
| страница  = [http://ir4pp1.etf.bg.ac.rs/ ir4pp1.etf.rs]&lt;br /&gt;
| одсек     = СИ, РТИ&lt;br /&gt;
}}&lt;br /&gt;
&#039;&#039;&#039;Програмски преводиоци 1&#039;&#039;&#039; је обавезни предмет у седмом семестру на СИ и РТИ.&lt;br /&gt;
&lt;br /&gt;
== Корисне везе ==&lt;br /&gt;
* [https://drive.google.com/open?id=107YMW0yq1ShVDAIyVtzLGwJ_H8Sm13D1 ETF SI] (модификације)&lt;br /&gt;
* [https://app.box.com/s/0r50je333z1qyypz0h3rm0iqb9s0d64f/folder/38797850748 ETF Materijali (Box)] (решења старијих рокова)&lt;br /&gt;
* [https://www.youtube.com/playlist?list=PLd4LFMwqLLCfy8fxg6cR6YAEC1jkaDWRt Студентски видео снимци решења задатака са вежби и рокова] (колоквијумско градиво)&lt;br /&gt;
* [https://drive.google.com/open?id=1ZZ8p48rhYnjIxiJaGCFzyRoQv7tc-Czx Слике презентација Кристијана Жиже] (снимљене вежбе 2020)&lt;br /&gt;
* [[github:ksendzo/PP1-Projekat|Неки савети за израду пројекта]]&lt;br /&gt;
&lt;br /&gt;
== Настава ==&lt;br /&gt;
Области се на следећи начин обрађују по блоковима:&lt;br /&gt;
* &#039;&#039;&#039;Први блок:&#039;&#039;&#039;&lt;br /&gt;
** лексичка анализа (коначни аутомати, минимизација аутомата, конверзија из недетерминистичког у детерминистички, конверзија регуларног израза у ДКА, лексички процесори),&lt;br /&gt;
** генератори лексичких анализатора (&#039;&#039;JFlex&#039;&#039;),&lt;br /&gt;
** синтаксна анализа (увод у граматике и језике),&lt;br /&gt;
** потисни аутомати&lt;br /&gt;
* &#039;&#039;&#039;Други блок:&#039;&#039;&#039;&lt;br /&gt;
** парсирање од дна ка врху (LR(0) парсери, SLR(1) парсери, LALR(1) парсери, опоравак од грешака),&lt;br /&gt;
** генератори парсера (&#039;&#039;CUP&#039;&#039;),&lt;br /&gt;
** парсирање од врха ка дну (LL(1) граматике, трансформација у LL(1), конструкција парсера по принципу рекурзивног спуста),&lt;br /&gt;
** атрибутивно-транслационе граматике (S-атрибутивне и L-атрибутивне граматике)&lt;br /&gt;
** апстрактна синтаксна стабла (&#039;&#039;AST-CUP&#039;&#039;)&lt;br /&gt;
* &#039;&#039;&#039;Трећи блок:&#039;&#039;&#039;&lt;br /&gt;
** табела симбола (конкретна реализација на пројекту, различите могуће организације, случај вишеструког наслеђивања),&lt;br /&gt;
** Микројава виртуелна машина (меморијски сегменти, инструкције, превођење израза, превођење контролних структура, превођење позива метода, наслеђивање и виртуелни механизам),&lt;br /&gt;
** генерисање међукода (четворке, тројке, граф тока контроле, SSA форма),&lt;br /&gt;
** извршно окружење (контролне и приступне везе, дисплеји, стабла активације),&lt;br /&gt;
** генерисање x86 кода (животни век променљивих, &#039;&#039;getreg&#039;&#039; алгоритам)&lt;br /&gt;
Градиво које се обрађује искључиво на предавањима укључује моделовање коначних аутомата у коду, S-атрибутивне и L-атрибутивне граматике, укључивање акција и атрибута у парсер конструисан по принципу рекурзивног спуста, апстрактна синтаксна стабла и вишеструко наслеђивање. Градиво из &#039;&#039;JFlex&#039;&#039;, &#039;&#039;CUP&#039;&#039; и апстрактних синтаксних стабала, иако теоретски може да дође на колоквијумима, се јако ретко појављује. Градиво S-атрибутивних и L-атрибутивних граматика се чешће појављује на испиту него на колоквијуму.&lt;br /&gt;
&lt;br /&gt;
Сви материјали са вежби и предавања могу се пронаћи на страници предмета, у несрећној комбинацији различитих формата (ZIP, RAR, DOC, PDF и PPT). Презентације Кристијана Жиже, чије су снимљене вежбе из 2020. године, нису доступне (обрисао их је када је одлазио са предмета), али су доступне слике тих презентација из одељка са [[#Корисне везе|корисним везама]]. На вежбама и предавањима се такође могу помињати збирка или уџбеник, оне су доступне са странице предмета (додуше тешко видљиве) и из одељка [[#Литература|са литературом]].&lt;br /&gt;
&lt;br /&gt;
== Пројекат ==&lt;br /&gt;
Пројекат на предмету носи 40 бодова и обавезан је. Услов за излазак на испит је барем 20 бодова освојених на одбрани пројекта. Предаје се до дан или два пред одбрану, са мало ранијом иницијалном предајом ради формирања распореда (као на [[ОО1]] и [[ОО2]]). Пројекат је подељен на 3 нивоа, где ниво А носи 20, ниво Б 30 и ниво Ц 40 бодова (могуће је освојити и број бодова између уколико пројекат испуњава део захтева за виши ниво, или уколико модификација на одбрани само делимично ради). Обично за сваки ниво буде по један захтев специфичан за ту школску годину, али се ниво Б генерално разликује од нивоа А по томе што захтева имплементацију функција, а ниво Ц од нивоа Б по томе што захтева имплементацију класа. На крају израде пројекта тражи се и документ са извештајем о пројекту.&lt;br /&gt;
&lt;br /&gt;
Поставка пројекта се не мења много кроз године. У јануарском и фебруарском року важи једна поставка, у јулском се на ту поставку дода још захтева и у августовском и септембарском још више захтева. &#039;&#039;&#039;Пројекат је могуће бранити само једном по поставци!&#039;&#039;&#039; Ово значи да уколико паднете одбрану у јануару, немате право на одбрану у фебруару, и слично за августовки рок.&lt;br /&gt;
&lt;br /&gt;
Од материјала за пројекат релевантне су вежбе из &#039;&#039;JFlex&#039;&#039;, &#039;&#039;CUP&#039;&#039;, табеле симбола и Микројава виртуелне машине. Поред тога, на страници предмета постоје снимци и изворни код једног студента који ради један мини-пројекат по фазама, који могу бити корисни као увод у алате за израду пројекта и примере имплементације одређених захтева. Већи део кода са тих снимака може се искористити ради имплементације захтева за ниво А на пројекту. На снимцима се као окружење за израду користи &#039;&#039;Eclipse&#039;&#039;, али било које окружење инсталирано у рачунарским лабораторијама на факултету је прихватљиво. Такође је доступан &#039;&#039;&#039;[[Програмски преводиоци 1/Пројекат|водич за израду пројекта]].&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Одбрана пројекта се организује неколико дана пре испита. На одбрани се прво раде модификације, затим асистенту или демонстратору покаже да модификација ради и потом брани основни пројекат. Одбрана основног пројекта обично није много детаљна, већ се покрену јавни тестови и види да ли раде (дају добар испис), евентуално откоментаришу неке линије које треба да изазову грешке. Том приликом се ретко тестира опоравак од синтаксних грешки и разне спецификације исписа прописане поставком. У извештај са пројекта се не улази. Структура пројекта која у поставци пише да је неопходна није заправо неопходна. Неке од модификација претходних година доступне су из одељка са [[#Корисне везе|корисним везама]].&lt;br /&gt;
&lt;br /&gt;
Стари пројекти доступни су са странице предмета (године 2021/2022 су доступни на http://ir4pp1.etf.rs/Domaci/2021-2022, претходне године на http://ir4pp1.etf.rs/Domaci/2020-2021 и тако даље, али не постоји лако доступна листа домаћих на једном месту).&lt;br /&gt;
&lt;br /&gt;
== Испитни рокови ==&lt;br /&gt;
Испитни рокови се понекад објављују [http://ir4pp1.etf.bg.ac.rs/Rokovi.html на страници предмета,] и понекад имају решења у виду сликаних вежбанки студената који су освојили максималан број бодова.&lt;br /&gt;
&lt;br /&gt;
Рокови који су решени на викију су:&lt;br /&gt;
{{#dpl:&lt;br /&gt;
| category    = Програмски преводиоци 1&lt;br /&gt;
| category    = Рокови&lt;br /&gt;
| format      = ,\n* &amp;lt;span class=&amp;quot;rok,&amp;quot;&amp;gt;[[%PAGE%|²{#invoke:String¦sub¦%PAGE%¦25¦-1}²]]&amp;lt;/span&amp;gt;,,&lt;br /&gt;
| ordermethod = title&lt;br /&gt;
| include     = {nerešeno}.dpl, {delimično rešeno}.dpl, {нерешено}.dpl, {делимично решено}.dpl&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Уколико желите да додате рок, посетите &#039;&#039;&#039;[[Project:Направи#Стандард (латиница)|страницу за прављење рока]]&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
Постоји једна збирка задатака и један уџбеник из предмета, доступни са странице предмета:&lt;br /&gt;
* &#039;&#039;&#039;[http://ir4pp1.etf.rs/zbirka/ppzbirka.pdf &amp;quot;Збирка задатака из Програмских преводилаца 1&amp;quot;]&#039;&#039;&#039;, Д.Велашевић, Д.Бојић, 2000 издавач: &#039;&#039;Електротехнички факултет Универзитета у Београду&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;[http://ir4pp1.etf.rs/Predavanja/pp1_udzbenik.pdf &amp;quot;Програмски преводиоци 1&amp;quot;]&#039;&#039;&#039;, Д.Бојић, М.Вукасовић, 2022 (верзија 0.9)&lt;br /&gt;
На збирку се обично позива из материјала са вежби. Уџбеник опширно покрива градиво са предавања, али како још увек није дошао до стабилне верзије уме имати чудне језичке конструкте који га чине неоптималним за спремање испита.&lt;br /&gt;
&lt;br /&gt;
== Начин оцењивања ==&lt;br /&gt;
=== СИ ===&lt;br /&gt;
* &amp;lt;math&amp;gt;K_1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;K_2&amp;lt;/math&amp;gt; — бодови са првог и другог колоквијума који се одржавају у првој и другој колоквијумској недељи и надокнађују се преко бодова са испита (0-20)&lt;br /&gt;
* &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; — бодови са пројекта (0-40)&lt;br /&gt;
* &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; — бодови са испита (0-60)&lt;br /&gt;
* Бодови са испита/колоквијума: &amp;lt;math&amp;gt;P_1 = max\left(\frac{1}{3} I + K_1 + K_2, \frac{2}{3} I + K_1, \frac{2}{3} I + K_2, I\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
* Бодови: &amp;lt;math&amp;gt;P = P_1 + D&amp;lt;/math&amp;gt;&lt;br /&gt;
* Услов: &amp;lt;math&amp;gt;D \geq 20&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;P_1 \geq 31&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;!-- Уколико је оцењивање другачије на РТИ, овде направити нови одељак за РТИ испод одељка за СИ. --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Информације које вреди поменути: да ли дозвољавају да се уместо поништавања оцене на увиду упише оцена 5, који бодови се преносе из једног у други испитни рок --&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Бодови&lt;br /&gt;
| &amp;lt;math&amp;gt;P \leq 51&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;50 &amp;lt; P \leq 61&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;60 &amp;lt; P \leq 71&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;70 &amp;lt; P \leq 81&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;80 &amp;lt; P \leq 91&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;91 &amp;lt; P&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Оцена&lt;br /&gt;
| 5 || 6 || 7 || 8 || 9 || 10&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== РТИ ===&lt;br /&gt;
Како на РТИ има само један колоквијум од 30 бодова, коначни бодови се рачунају по формули: &amp;lt;math&amp;gt;P = D + max\left(\frac{1}{2} I + K, I\right)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Потребна помоћ ==&lt;br /&gt;
* {{задаци|postavke}}&lt;br /&gt;
* {{задаци|rešenja}}&lt;br /&gt;
*: Рокови који су преписани а нису решени су: {{рокови|нерешени}}&lt;br /&gt;
*: Рокови којима недостаје понеко решење су: {{рокови|делимично решени}}&lt;/div&gt;</summary>
		<author><name>Fedja</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9E%D0%A12/%D0%88%D0%B0%D0%BD%D1%83%D0%B0%D1%80_2021&amp;diff=6402</id>
		<title>ОС2/Јануар 2021</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9E%D0%A12/%D0%88%D0%B0%D0%BD%D1%83%D0%B0%D1%80_2021&amp;diff=6402"/>
		<updated>2023-07-05T20:08:54Z</updated>

		<summary type="html">&lt;p&gt;Fedja: slika za 4. zadatak&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
[http://os.etf.bg.ac.rs/OS2/rokovi/2021/januar/Jan%202021.pdf Zadaci na stranici predmeta.]&lt;br /&gt;
&lt;br /&gt;
== 1. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Navesti osnovne elemente algoritama raspoređivanja procesa MFQS (&#039;&#039;Multi-level Feedback Queue Scheduling&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Isti kao MQS, samo je moguć prelazak procesa iz jednog u drugi red čekanja. Svaki red čekanja ima veći ili manji prioritet, prikazan vremenskim odsečkom koji mu se dodeljuje (niži prioritet - veći vremenski odsečak, viši prioritet - manji vremenski odsečak). Ako proces puno koristi CPU i &amp;quot;potroši&amp;quot; ceo odsečak koji mu je dodeljen, prebacuje se u red nižeg prioriteta. Ako proces dugo čeka na svoj red, prebacuje se u red višeg prioriteta.&lt;br /&gt;
&lt;br /&gt;
== 2. zadatak ==&lt;br /&gt;
: &#039;&#039;Isti zadatak se našao i na [[ОС2/Септембар 2015#2. zadatak|septembarskom roku iz 2015]].&#039;&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Korišćenjem klasičnih uslovnih promenljivih napisati kod monitora koji realizuje binarni semafor.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ada&amp;quot;&amp;gt;&lt;br /&gt;
monitor sem;&lt;br /&gt;
export wait, signal;&lt;br /&gt;
&lt;br /&gt;
var&lt;br /&gt;
    condvar : cond;&lt;br /&gt;
    count : int;&lt;br /&gt;
    &lt;br /&gt;
procedure signal();&lt;br /&gt;
begin&lt;br /&gt;
    count := 1;&lt;br /&gt;
    signal(condvar);&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
procedure wait();&lt;br /&gt;
begin&lt;br /&gt;
   while (count == 0) then&lt;br /&gt;
   begin&lt;br /&gt;
      wait(condvar);&lt;br /&gt;
   end;&lt;br /&gt;
   count := 0;&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
    count := 0;&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 3. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Objasniti razliku između sinhronog i asinhronog slanja poruke u međuprocesnoj komunikaciji.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Sinhrono slanje poruke blokira pozivaoca sve dok poruka nije primljena; asinhrono slanje poruke ne.&lt;br /&gt;
&lt;br /&gt;
== 4. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
U nekom sistemu primenjuje se mehanizam izbegavanja mrtve blokade (&#039;&#039;deadlock avoidance&#039;&#039;) zasnovan na grafu alokacije. Na slici je prikazan graf alokacije resursa za posmatrano stanje sistema. Ukoliko &#039;&#039;P2&#039;&#039; zatraži resurs &#039;&#039;R1&#039;&#039;, da li će mu taj resurs biti odmah dodeljen? Ako neće odmah, kada mu može biti dodeljen?&lt;br /&gt;
&lt;br /&gt;
[[Датотека:OS2 januar 2021 zadatak 4.svg|мини|Graf potražnje uz 4. zadatak]]&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Resurs &#039;&#039;R1&#039;&#039; neće biti odmah dodeljen procesu &#039;&#039;P2&#039;&#039; jer bi se u tom slučaju napravila petlja u grafu (R1-&amp;gt;P2-&amp;gt;R2-&amp;gt;P1-&amp;gt;R1). Ipak, &#039;&#039;R1&#039;&#039; može biti dodeljen procesu &#039;&#039;P2&#039;&#039; nakon što proces &#039;&#039;P1&#039;&#039; oslobodi resurs &#039;&#039;R2&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== 5. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Data je sekvenca referenciranja stranica. Koliki je broj straničnih grešaka za algoritam OPT zamene stranica ako je na raspolaganju 4 okvira?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;4, 1, 2, 3, 4, 5, 2, 1, 3, 7, 2, 3, 4, 5, 2, 3, 1, 4, 7&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Odgovor: &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;9&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 6. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Neki &#039;&#039;storage&#039;&#039; sistem sa više diskova, visoke pouzdanosti, označen je na sledeći način: RAID5+1 2x(9+1), pri čemu je kapacitet svakog diska 1TB. Koliki je efektivni kapacitet (za „korisne“ informacije koje koristi fajl sistem) ove strukture diskova? Da li je on otporan na otkaz dva diska? Ako nije, zašto nije? Ako jeste, pod kojim uslovima jeste?&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Efektivni kapacitet je &amp;lt;math&amp;gt;2*9*1TB = 18TB&amp;lt;/math&amp;gt;.&lt;br /&gt;
S obzirom da se radi o RAID5+1, svaki disk je &#039;&#039;mirror&#039;&#039;-ovan jedanput, tako da je sistem otporan na otkaz dva diska u slučaju da ta dva diska nisu &amp;quot;original&amp;quot; i njegov &#039;&#039;mirror&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 7. zadatak ==&lt;br /&gt;
: &#039;&#039;Isti zadatak se našao i na [[ОС2/Јануар 2020#9. zadatak|januarskom roku iz 2020]].&#039;&#039;&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Ukratko objasniti osnovne principe mikrokernel arhitekture operativnog sistema.&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:ОС2]]&lt;/div&gt;</summary>
		<author><name>Fedja</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%94%D0%B0%D1%82%D0%BE%D1%82%D0%B5%D0%BA%D0%B0:OS2_januar_2021_zadatak_4.svg&amp;diff=6401</id>
		<title>Датотека:OS2 januar 2021 zadatak 4.svg</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%94%D0%B0%D1%82%D0%BE%D1%82%D0%B5%D0%BA%D0%B0:OS2_januar_2021_zadatak_4.svg&amp;diff=6401"/>
		<updated>2023-07-05T20:08:14Z</updated>

		<summary type="html">&lt;p&gt;Fedja: Нова страница: {{file | description =  | author      = Predmetni profesori/asistenti | source      = http://os.etf.bg.ac.rs/OS2/rokovi/2021/januar/Jan%202021.pdf }}&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{file&lt;br /&gt;
| description = &lt;br /&gt;
| author      = Predmetni profesori/asistenti&lt;br /&gt;
| source      = http://os.etf.bg.ac.rs/OS2/rokovi/2021/januar/Jan%202021.pdf&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Fedja</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9E%D0%A12/%D0%A1%D0%B5%D0%BF%D1%82%D0%B5%D0%BC%D0%B1%D0%B0%D1%80_2015&amp;diff=6400</id>
		<title>ОС2/Септембар 2015</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9E%D0%A12/%D0%A1%D0%B5%D0%BF%D1%82%D0%B5%D0%BC%D0%B1%D0%B0%D1%80_2015&amp;diff=6400"/>
		<updated>2023-07-04T23:49:14Z</updated>

		<summary type="html">&lt;p&gt;Fedja: rešenje 5. zadatka&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
{{rešenja}}&lt;br /&gt;
[http://os.etf.rs/OS2/rokovi/2015/sep/Sep%202015.pdf Zadaci na stranici predmeta.]&lt;br /&gt;
&lt;br /&gt;
== 1. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Navesti i objasniti obrazac po kom se predviđa dužina narednog izvršavanja procesa na procesoru tehnikom eksponencijalnog usrednjavanja kod SJF raspoređivanja procesa.&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
* Formula: &amp;lt;math&amp;gt;\tau_{n+1} = \alpha t_n + (1 - \alpha)\tau_n&amp;lt;/math&amp;gt;, gde &amp;lt;math&amp;gt;0 \leq \alpha \leq 1&amp;lt;/math&amp;gt;&lt;br /&gt;
** &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; je koeficijent koji određuje koliko je istorija trajanja od značaja u aproksimaciji.&lt;br /&gt;
** &amp;lt;math&amp;gt;\tau_{n+1}&amp;lt;/math&amp;gt; je nova aproksimacija&lt;br /&gt;
** &amp;lt;math&amp;gt;t_n&amp;lt;/math&amp;gt; je pravo vreme naleta&lt;br /&gt;
** &amp;lt;math&amp;gt;\tau_{n}&amp;lt;/math&amp;gt; je prethodna aproksimacija naleta&lt;br /&gt;
&lt;br /&gt;
== 2. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Korišćenjem klasičnih uslovnih promenljivih, napisati kod za monitor koji realizuje binarni semafor (događaj).&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ada&amp;quot;&amp;gt;&lt;br /&gt;
monitor BinarySemaphore;&lt;br /&gt;
export wait, signal;&lt;br /&gt;
var&lt;br /&gt;
    locked : int;&lt;br /&gt;
    condition : cond;&lt;br /&gt;
    &lt;br /&gt;
procedure wait();&lt;br /&gt;
begin&lt;br /&gt;
    while locked = 0 do&lt;br /&gt;
    begin&lt;br /&gt;
        wait(condition);&lt;br /&gt;
    end;&lt;br /&gt;
    locked := 0;&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
procedure signal();&lt;br /&gt;
begin&lt;br /&gt;
    locked := 1;&lt;br /&gt;
    signal(condition);&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
    locked := 0;&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== 3. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Dati i kratko objasniti primer konstrukta za slanje i prijem poruke indirektnim imenovanjem.&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
* Primer su priključnice (&#039;&#039;sockets&#039;&#039;).&lt;br /&gt;
* Imaju asinhrono slanje i sinhroni prijem.&lt;br /&gt;
* Server neprestano osluškuje za zahteve klijenta preko TCP.&lt;br /&gt;
* Server može da prihvati vezu, komunicira sa klijentom i raskine vezu.&lt;br /&gt;
&lt;br /&gt;
== 4. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Koja od sledećih transformacija poruke se obavlja na strani primaoca poruke kod međuprocesne komunikacije: &#039;&#039;marshalling&#039;&#039; ili &#039;&#039;unmarshalling&#039;&#039;?&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot; data-solution=&amp;quot;single&amp;quot;&amp;gt;&lt;br /&gt;
# marshalling&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;unmarshalling&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 5. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
U nekom sistemu primenjuje se mehanizam izbegavanja mrtve blokade (deadlock) zasnovan na grafu alokacije. Na početku, procesi P1 i P3 su najavili korišćenje resursa R2, a P1, P2 i P3 korišćenje resursa R1. Trenutno stanje sistema je sledeće: P1 je zauzeo R1, a P2 čeka na R1.&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Nacrtati graf alokacije resursa u ovom stanju.&lt;br /&gt;
# Ukoliko i P1 i P3 sada zatraže resurs R2, da li i kome od ovih procesa treba dodeliti taj resurs?&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&lt;br /&gt;
[[Датотека:OS2 septembar 2015 zadatak 5 rešenje_graf zauzeća.svg|thumb|Graf zauzeća iz rešenja 5. zadatka.]]&lt;br /&gt;
&lt;br /&gt;
U slučaju da P1 zatraži resurs R2 sistem može da mu dozvoli, jer ne dolazi do petlje u grafu odnosno ne postoji opasnost od mrtve blokade.&lt;br /&gt;
Sa druge strane, sistem ne sme predati resurs R2 procesu P3 jer dolazi do petlje u grafu &amp;lt;code&amp;gt;P1-&amp;gt;R2-&amp;gt;P3-&amp;gt;R1-&amp;gt;P1&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== 6. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Data je sledeća sekvenca referenciranja stranica od strane nekog procesa: &lt;br /&gt;
&amp;lt;code&amp;gt;3, 2, 6, 8, 5, 6, 9, 8, 2, 6, 4, 9, 3, 6, 7, 9, 8, 6, 7, 8&amp;lt;/code&amp;gt;&lt;br /&gt;
Procesu su dodeljena 4 okvira, zamena se vrši lokalno, samo u skupu stranica dodeljenih tom procesu, a inicijalno nije učitana nijedna stranica ovog procesa. Koliko puta ovaj proces generiše straničnu grešku (page fault) ako je algoritam zamene stranica OPT?&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Odgovor: &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;9&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 7. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Šta je Beladijeva (&#039;&#039;Belady&#039;&#039;) anomalija?&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Beladijeva anomalija je problem u algoritmima zamene stranica gde za neke sekvence i neki broj okvira, broj straničnih grešaka se povećava sa porastom broja okvira. Pristuan je u FIFO algoritmu. &lt;br /&gt;
&lt;br /&gt;
== 8. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Na kom disku 0 do 15 se nalazi logički blok broj 67 (blokovi su numerisani počev od 0) kod strukture &#039;&#039;block-striping&#039;&#039; RAID0?&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Odgovor: &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;3&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 9. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Ukratko objasniti principe mikrokernel arhitekture operativnih sistema.&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
* Mikrokernel arhitektura izbacuje nepotrebne delove iz samog kernela i pretvara ih u sistemske programe.&lt;br /&gt;
* Svrha je učiniti kernel što manjim, tako da ima samo minimalne funkcionalnosti (promenu konteksta, raspoređivanje, sinhronizaciju).&lt;br /&gt;
* Prednost je fleksibilnost, mana su lošije performanse.&lt;br /&gt;
&lt;br /&gt;
== 10. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Šta je &#039;&#039;inode&#039;&#039;, a šta &#039;&#039;vnode&#039;&#039; u sistemu Linux?&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
* &#039;&#039;inode&#039;&#039; je deskriptor fajla koji sadrži informacije o fajlu specifične za fajl sistem (fizička pozicija na disku i sl.)&lt;br /&gt;
* &#039;&#039;vnode&#039;&#039; je deskriptor fajla koji je nezavisan od fajl sistema (&#039;&#039;virtual node&#039;&#039;) i sadrži skup operacija nad fajlom&lt;br /&gt;
* &#039;&#039;vnode&#039;&#039; ostvaruje polimorfizam u virtuelnom fajl sistemu, koji je nezavisan od konkretnog fajl sistema i njegovih &#039;&#039;inode&#039;&#039;-ova&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:ОС2]]&lt;/div&gt;</summary>
		<author><name>Fedja</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%94%D0%B0%D1%82%D0%BE%D1%82%D0%B5%D0%BA%D0%B0:OS2_septembar_2015_zadatak_5_re%C5%A1enje_graf_zauze%C4%87a.svg&amp;diff=6399</id>
		<title>Датотека:OS2 septembar 2015 zadatak 5 rešenje graf zauzeća.svg</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%94%D0%B0%D1%82%D0%BE%D1%82%D0%B5%D0%BA%D0%B0:OS2_septembar_2015_zadatak_5_re%C5%A1enje_graf_zauze%C4%87a.svg&amp;diff=6399"/>
		<updated>2023-07-04T23:48:32Z</updated>

		<summary type="html">&lt;p&gt;Fedja: Нова страница: {{file | description =  | author      = Otpremač | source      = Logički aparat otpremača }}&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{file&lt;br /&gt;
| description = &lt;br /&gt;
| author      = Otpremač&lt;br /&gt;
| source      = Logički aparat otpremača&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Fedja</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9E%D0%A12/%D0%88%D0%B0%D0%BD%D1%83%D0%B0%D1%80_2021&amp;diff=6398</id>
		<title>ОС2/Јануар 2021</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9E%D0%A12/%D0%88%D0%B0%D0%BD%D1%83%D0%B0%D1%80_2021&amp;diff=6398"/>
		<updated>2023-07-04T23:39:08Z</updated>

		<summary type="html">&lt;p&gt;Fedja: već postoji&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
[http://os.etf.bg.ac.rs/OS2/rokovi/2021/januar/Jan%202021.pdf Zadaci na stranici predmeta.]&lt;br /&gt;
&lt;br /&gt;
== 1. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Navesti osnovne elemente algoritama raspoređivanja procesa MFQS (&#039;&#039;Multi-level Feedback Queue Scheduling&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Isti kao MQS, samo je moguć prelazak procesa iz jednog u drugi red čekanja. Svaki red čekanja ima veći ili manji prioritet, prikazan vremenskim odsečkom koji mu se dodeljuje (niži prioritet - veći vremenski odsečak, viši prioritet - manji vremenski odsečak). Ako proces puno koristi CPU i &amp;quot;potroši&amp;quot; ceo odsečak koji mu je dodeljen, prebacuje se u red nižeg prioriteta. Ako proces dugo čeka na svoj red, prebacuje se u red višeg prioriteta.&lt;br /&gt;
&lt;br /&gt;
== 2. zadatak ==&lt;br /&gt;
: &#039;&#039;Isti zadatak se našao i na [[ОС2/Септембар 2015#2. zadatak|septembarskom roku iz 2015]].&#039;&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Korišćenjem klasičnih uslovnih promenljivih napisati kod monitora koji realizuje binarni semafor.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ada&amp;quot;&amp;gt;&lt;br /&gt;
monitor sem;&lt;br /&gt;
export wait, signal;&lt;br /&gt;
&lt;br /&gt;
var&lt;br /&gt;
    condvar : cond;&lt;br /&gt;
    count : int;&lt;br /&gt;
    &lt;br /&gt;
procedure signal();&lt;br /&gt;
begin&lt;br /&gt;
    count := 1;&lt;br /&gt;
    signal(condvar);&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
procedure wait();&lt;br /&gt;
begin&lt;br /&gt;
   while (count == 0) then&lt;br /&gt;
   begin&lt;br /&gt;
      wait(condvar);&lt;br /&gt;
   end;&lt;br /&gt;
   count := 0;&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
    count := 0;&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 3. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Objasniti razliku između sinhronog i asinhronog slanja poruke u međuprocesnoj komunikaciji.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Sinhrono slanje poruke blokira pozivaoca sve dok poruka nije primljena; asinhrono slanje poruke ne.&lt;br /&gt;
&lt;br /&gt;
== 4. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
U nekom sistemu primenjuje se mehanizam izbegavanja mrtve blokade (&#039;&#039;deadlock avoidance&#039;&#039;) zasnovan na grafu alokacije. Na slici je prikazan graf alokacije resursa za posmatrano stanje sistema. Ukoliko &#039;&#039;P2&#039;&#039; zatraži resurs &#039;&#039;R1&#039;&#039;, da li će mu taj resurs biti odmah dodeljen? Ako neće odmah, kada mu može biti dodeljen?&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Resurs &#039;&#039;R1&#039;&#039; neće biti odmah dodeljen procesu &#039;&#039;P2&#039;&#039; jer bi se u tom slučaju napravila petlja u grafu (R1-&amp;gt;P2-&amp;gt;R2-&amp;gt;P1-&amp;gt;R1). Ipak, &#039;&#039;R1&#039;&#039; može biti dodeljen procesu &#039;&#039;P2&#039;&#039; nakon što proces &#039;&#039;P1&#039;&#039; oslobodi resurs &#039;&#039;R2&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== 5. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Data je sekvenca referenciranja stranica. Koliki je broj straničnih grešaka za algoritam OPT zamene stranica ako je na raspolaganju 4 okvira?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;4, 1, 2, 3, 4, 5, 2, 1, 3, 7, 2, 3, 4, 5, 2, 3, 1, 4, 7&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Odgovor: &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;9&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 6. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Neki &#039;&#039;storage&#039;&#039; sistem sa više diskova, visoke pouzdanosti, označen je na sledeći način: RAID5+1 2x(9+1), pri čemu je kapacitet svakog diska 1TB. Koliki je efektivni kapacitet (za „korisne“ informacije koje koristi fajl sistem) ove strukture diskova? Da li je on otporan na otkaz dva diska? Ako nije, zašto nije? Ako jeste, pod kojim uslovima jeste?&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Efektivni kapacitet je &amp;lt;math&amp;gt;2*9*1TB = 18TB&amp;lt;/math&amp;gt;.&lt;br /&gt;
S obzirom da se radi o RAID5+1, svaki disk je &#039;&#039;mirror&#039;&#039;-ovan jedanput, tako da je sistem otporan na otkaz dva diska u slučaju da ta dva diska nisu &amp;quot;original&amp;quot; i njegov &#039;&#039;mirror&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 7. zadatak ==&lt;br /&gt;
: &#039;&#039;Isti zadatak se našao i na [[ОС2/Јануар 2020#9. zadatak|januarskom roku iz 2020]].&#039;&#039;&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Ukratko objasniti osnovne principe mikrokernel arhitekture operativnog sistema.&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:ОС2]]&lt;/div&gt;</summary>
		<author><name>Fedja</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9E%D0%A12/%D0%A4%D0%B5%D0%B1%D1%80%D1%83%D0%B0%D1%80_2019&amp;diff=6397</id>
		<title>ОС2/Фебруар 2019</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9E%D0%A12/%D0%A4%D0%B5%D0%B1%D1%80%D1%83%D0%B0%D1%80_2019&amp;diff=6397"/>
		<updated>2023-07-04T23:32:47Z</updated>

		<summary type="html">&lt;p&gt;Fedja: rešenje 5. zadatka&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
[http://os.etf.rs/OS2/rokovi/2019/februar/Feb%202019.pdf Zadaci na stranici predmeta.]&lt;br /&gt;
&lt;br /&gt;
== 1. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Kod &#039;&#039;Multilevel Feedback Queue&#039;&#039; raspoređivanja, precizno navesti u kojoj situaciji (na koji događaj u sistemu) raspoređivač „degradira“ proces (smešta ga u red spremnih procesa nižeg prioriteta od onog u kom je ranije bio), a kada ga „promoviše“ (smešta u red višeg prioriteta od onog u kom je bio)?&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
* Proces se degradira kada mu istekne vremenski kvant.&lt;br /&gt;
* Proces se promoviše kad je dugo čekao.&lt;br /&gt;
&lt;br /&gt;
== 2. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Na jeziku Java napisati kod serverskog procesa koji prihvata klijentski zahtev preko priključnice (&#039;&#039;socket&#039;&#039;) na portu 6060 i odmah raskida konekciju.&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import java.io.IOException;&lt;br /&gt;
import java.net.ServerSocket;&lt;br /&gt;
import java.net.Socket;&lt;br /&gt;
&lt;br /&gt;
public class Server {&lt;br /&gt;
	public static void main(String[] args) {&lt;br /&gt;
&lt;br /&gt;
		try {&lt;br /&gt;
			ServerSocket sock = new ServerSocket(6060);&lt;br /&gt;
			Socket client = sock.accept();&lt;br /&gt;
			sock.close();&lt;br /&gt;
		} catch (IOException e) {&lt;br /&gt;
			// ...&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 3. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Šta je SOAP, a šta WSDL?&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
* SOAP je protokol za razmenu poruka između aplikacija.&lt;br /&gt;
* WSDL je jezik za opisivanje web servisa, zasnovan na XML.&lt;br /&gt;
&lt;br /&gt;
== 4. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Šta je tehnika „starenja“ (engl. &#039;&#039;aging&#039;&#039;) i za šta se ona upotrebljava?&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Tehnika starenja je tehnika u algoritmima raspoređivanja zasnovanim na prioritetu koja sprečava izgladnjivanje. Što duže neki proces čeka, povećava mu se prioritet, i tako dolazi na red.&lt;br /&gt;
&lt;br /&gt;
== 5. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Tri uporedna procesa, A, B i C zauzimaju i oslobaˇaju tri nedeljiva resursa X, Y i Z po sledećem redosledu:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
A: request(X), release(X), request(Y), release(Y)&lt;br /&gt;
B: request(Y), release(Y), request(X), release(X)&lt;br /&gt;
C: request(Y), request(Z), release(Z), release(Y)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Da li ova tri procesa mogu da uđu u stanje mrtve blokade (&#039;&#039;deadlock&#039;&#039;)? Ako mogu, dati scenario po kome dolaze u ovo stanje i nacrtati graf zauzeća resursa u tom stanju. Ako ne mogu, precizno objasniti (dokazati) zašto ne mogu.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Ova tri procesa mogu da uđu u stanje mrtve blokade, ako proces &#039;&#039;A&#039;&#039; zauzme &#039;&#039;X&#039;&#039; a proces &#039;&#039;B&#039;&#039; zauzme &#039;&#039;Y&#039;&#039; resurs. Na grafu zauzeća se vidi petlja &amp;lt;code&amp;gt;A-&amp;gt;Y-&amp;gt;B-&amp;gt;X-&amp;gt;A&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Датотека:OS2 februar 2019 zadatak 5 rešenje_graf zauzeća.svg|thumb|Graf zauzeća iz rešenja 5. zadatka.]]&lt;br /&gt;
&lt;br /&gt;
== 6. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Neki sistem primenjuje algoritam časovnika (davanja nove šanse, &#039;&#039;clock&#039;&#039;, &#039;&#039;second-chance&#039;&#039;) za izbor stranice za izbacivanje. U donjoj tabeli date su različite situacije u kojima treba odabrati stranicu za zamenu. Date su vrednosti bita referenciranja za sve stranice koje učestvuju u izboru i pozicija „kazaljke“. Kazaljka se pomera u smeru prema višim brojevima stranica. Za svaku od datih situacija navesti koja stranica će biti zamenjena.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
|-&lt;br /&gt;
! &lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; | Situacija 1&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; | Situacija 2&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; | Situacija 3&lt;br /&gt;
|-&lt;br /&gt;
| Stranica&lt;br /&gt;
| Bit ref.&lt;br /&gt;
| Kazaljka&lt;br /&gt;
| Bit ref.&lt;br /&gt;
| Kazaljka&lt;br /&gt;
| Bit ref.&lt;br /&gt;
| Kazaljka&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| &lt;br /&gt;
| 1&lt;br /&gt;
| &lt;br /&gt;
| 1&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| &lt;br /&gt;
| 1&lt;br /&gt;
| &lt;br /&gt;
| 1&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 0&lt;br /&gt;
| X&lt;br /&gt;
| 0&lt;br /&gt;
| &lt;br /&gt;
| 1&lt;br /&gt;
| X&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| 0&lt;br /&gt;
| &lt;br /&gt;
| 0&lt;br /&gt;
| &lt;br /&gt;
| 1&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 1&lt;br /&gt;
| &lt;br /&gt;
| 0&lt;br /&gt;
| &lt;br /&gt;
| 1&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 5&lt;br /&gt;
| 0&lt;br /&gt;
| &lt;br /&gt;
| 1&lt;br /&gt;
| X&lt;br /&gt;
| 1&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| 1&lt;br /&gt;
| &lt;br /&gt;
| 1&lt;br /&gt;
| &lt;br /&gt;
| 1&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 7&lt;br /&gt;
| 1&lt;br /&gt;
| &lt;br /&gt;
| 1&lt;br /&gt;
| &lt;br /&gt;
| 1&lt;br /&gt;
| &lt;br /&gt;
|}&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
|-&lt;br /&gt;
! Situacija&lt;br /&gt;
! Stranica&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 2&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 2&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| 2&lt;br /&gt;
|}&lt;br /&gt;
== 7. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Kod &#039;&#039;slab&#039;&#039; alokatora, da li jedna struktura zvana &#039;&#039;cache&#039;&#039; sadrži alocirane strukture kernela istog ili različitih tipova?&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&#039;&#039;Cache&#039;&#039; sadrži ploče koje u sebi sadrže alocirane stukure jednog tipa, tako da jedan &#039;&#039;cache&#039;&#039; služi za jedan tip.&lt;br /&gt;
&lt;br /&gt;
== 8. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Da li struktura RAID0 povećava otpornost na otkaze? Obrazložiti kako/zašto.&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Ne, jer ne postoji nikakva redundansa. Otpornost se smanjuje jer se otkazom jednog diska trajno gube podaci celog sistema, pa se RAID 0 koristi tamo gde pouzdanost nije bitna.&lt;br /&gt;
&lt;br /&gt;
== 9. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Šta je &#039;&#039;journaling&#039;&#039; u fajl sistemu&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Beleženje ili &#039;&#039;journaling&#039;&#039; je funkcionalnost fajl sistema gde se sve modifikacije fajl sistema modeluju kao transakcije i ne vrše se sinhrono, već se zapisuju u &amp;quot;zapisnik&amp;quot; (&#039;&#039;journal&#039;&#039;) i izvršavaju asinhrono. U slučaju pada sistema, neizvršene transakcije se mogu izvršiti ili poništiti tako da sistem ostane u konzistentnom stanju. &lt;br /&gt;
&lt;br /&gt;
== 10. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Na kom jeziku su napisane biblioteke poput OpenGL i SQLite koje su sastavni deo Android sistema?&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Napisane su na C/C++.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:ОС2]]&lt;/div&gt;</summary>
		<author><name>Fedja</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%94%D0%B0%D1%82%D0%BE%D1%82%D0%B5%D0%BA%D0%B0:OS2_februar_2019_zadatak_5_re%C5%A1enje_graf_zauze%C4%87a.svg&amp;diff=6396</id>
		<title>Датотека:OS2 februar 2019 zadatak 5 rešenje graf zauzeća.svg</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%94%D0%B0%D1%82%D0%BE%D1%82%D0%B5%D0%BA%D0%B0:OS2_februar_2019_zadatak_5_re%C5%A1enje_graf_zauze%C4%87a.svg&amp;diff=6396"/>
		<updated>2023-07-04T23:31:12Z</updated>

		<summary type="html">&lt;p&gt;Fedja: Нова страница: {{file | description = Rešenje 5. zadatka iz ispita februara 2019 | author      = Otpremač | source      = Logički aparat otpremača }}&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{file&lt;br /&gt;
| description = Rešenje 5. zadatka iz ispita februara 2019&lt;br /&gt;
| author      = Otpremač&lt;br /&gt;
| source      = Logički aparat otpremača&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Fedja</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9E%D0%A12/%D0%88%D0%B0%D0%BD%D1%83%D0%B0%D1%80_2021&amp;diff=6395</id>
		<title>ОС2/Јануар 2021</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9E%D0%A12/%D0%88%D0%B0%D0%BD%D1%83%D0%B0%D1%80_2021&amp;diff=6395"/>
		<updated>2023-07-04T23:18:12Z</updated>

		<summary type="html">&lt;p&gt;Fedja: rešenja&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
[http://os.etf.bg.ac.rs/OS2/rokovi/2021/januar/Jan%202021.pdf Zadaci na stranici predmeta.]&lt;br /&gt;
&lt;br /&gt;
== 1. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Navesti osnovne elemente algoritama raspoređivanja procesa MFQS (&#039;&#039;Multi-level Feedback Queue Scheduling&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Isti kao MQS, samo je moguć prelazak procesa iz jednog u drugi red čekanja. Svaki red čekanja ima veći ili manji prioritet, prikazan vremenskim odsečkom koji mu se dodeljuje (niži prioritet - veći vremenski odsečak, viši prioritet - manji vremenski odsečak). Ako proces puno koristi CPU i &amp;quot;potroši&amp;quot; ceo odsečak koji mu je dodeljen, prebacuje se u red nižeg prioriteta. Ako proces dugo čeka na svoj red, prebacuje se u red višeg prioriteta.&lt;br /&gt;
&lt;br /&gt;
== 2. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Korišćenjem klasičnih uslovnih promenljivih napisati kod monitora koji realizuje binarni semafor.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ada&amp;quot;&amp;gt;&lt;br /&gt;
monitor sem;&lt;br /&gt;
export wait, signal;&lt;br /&gt;
&lt;br /&gt;
var&lt;br /&gt;
    condvar : cond;&lt;br /&gt;
    count : int;&lt;br /&gt;
    &lt;br /&gt;
procedure signal();&lt;br /&gt;
begin&lt;br /&gt;
    count := 1;&lt;br /&gt;
    signal(condvar);&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
procedure wait();&lt;br /&gt;
begin&lt;br /&gt;
   while (count == 0) then&lt;br /&gt;
   begin&lt;br /&gt;
      wait(condvar);&lt;br /&gt;
   end;&lt;br /&gt;
   count := 0;&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
    count := 0;&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 3. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Objasniti razliku između sinhronog i asinhronog slanja poruke u međuprocesnoj komunikaciji.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Sinhrono slanje poruke blokira pozivaoca sve dok poruka nije primljena; asinhrono slanje poruke ne.&lt;br /&gt;
&lt;br /&gt;
== 4. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
U nekom sistemu primenjuje se mehanizam izbegavanja mrtve blokade (&#039;&#039;deadlock avoidance&#039;&#039;) zasnovan na grafu alokacije. Na slici je prikazan graf alokacije resursa za posmatrano stanje sistema. Ukoliko &#039;&#039;P2&#039;&#039; zatraži resurs &#039;&#039;R1&#039;&#039;, da li će mu taj resurs biti odmah dodeljen? Ako neće odmah, kada mu može biti dodeljen?&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Resurs &#039;&#039;R1&#039;&#039; neće biti odmah dodeljen procesu &#039;&#039;P2&#039;&#039; jer bi se u tom slučaju napravila petlja u grafu (R1-&amp;gt;P2-&amp;gt;R2-&amp;gt;P1-&amp;gt;R1). Ipak, &#039;&#039;R1&#039;&#039; može biti dodeljen procesu &#039;&#039;P2&#039;&#039; nakon što proces &#039;&#039;P1&#039;&#039; oslobodi resurs &#039;&#039;R2&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== 5. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Data je sekvenca referenciranja stranica. Koliki je broj straničnih grešaka za algoritam OPT zamene stranica ako je na raspolaganju 4 okvira?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;4, 1, 2, 3, 4, 5, 2, 1, 3, 7, 2, 3, 4, 5, 2, 3, 1, 4, 7&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Odgovor: &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;9&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 6. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Neki &#039;&#039;storage&#039;&#039; sistem sa više diskova, visoke pouzdanosti, označen je na sledeći način: RAID5+1 2x(9+1), pri čemu je kapacitet svakog diska 1TB. Koliki je efektivni kapacitet (za „korisne“ informacije koje koristi fajl sistem) ove strukture diskova? Da li je on otporan na otkaz dva diska? Ako nije, zašto nije? Ako jeste, pod kojim uslovima jeste?&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Efektivni kapacitet je &amp;lt;math&amp;gt;2*9*1TB = 18TB&amp;lt;/math&amp;gt;.&lt;br /&gt;
S obzirom da se radi o RAID5+1, svaki disk je &#039;&#039;mirror&#039;&#039;-ovan jedanput, tako da je sistem otporan na otkaz dva diska u slučaju da ta dva diska nisu &amp;quot;original&amp;quot; i njegov &#039;&#039;mirror&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 7. zadatak ==&lt;br /&gt;
: &#039;&#039;Isti zadatak se našao i na [[ОС2/Јануар 2020#9. zadatak|januarskom roku iz 2020]].&#039;&#039;&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Ukratko objasniti osnovne principe mikrokernel arhitekture operativnog sistema.&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:ОС2]]&lt;/div&gt;</summary>
		<author><name>Fedja</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9E%D0%A12/%D0%88%D0%B0%D0%BD%D1%83%D0%B0%D1%80_2020&amp;diff=6394</id>
		<title>ОС2/Јануар 2020</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9E%D0%A12/%D0%88%D0%B0%D0%BD%D1%83%D0%B0%D1%80_2020&amp;diff=6394"/>
		<updated>2023-07-04T18:06:18Z</updated>

		<summary type="html">&lt;p&gt;Fedja: rešenja&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
[http://os.etf.bg.ac.rs/OS2/rokovi/2020/januar/OS2%20Jan%202020.pdf Zadaci na stranici predmeta.]&lt;br /&gt;
&lt;br /&gt;
== 1. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Ukratko objasniti tehniku predviđanja trajanja narednog naleta izvršavanja pomoću eksponencijalnog usrednjavanja kod SJF algoritma raspoređivanja procesa.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Tehnika predviđanja trajanja narednog naleta izvršavanja pomoću eksponencijalnog usrednjavanja teži da što preciznije proceni trajanje narednog naleta. To postiže težinskim faktorisanjem prethodnih procena i trajanja prethodnih naleta.&lt;br /&gt;
&lt;br /&gt;
Formula koja se koristi za predviđanje:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\tau_{n+1} = \alpha t_n + (1-\alpha)\tau_n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Gde je:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;\tau_n&amp;lt;/math&amp;gt;: predviđeno vreme izvršavanja &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;t_n&amp;lt;/math&amp;gt;: stvarno vreme izvršavanja &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;: koeficijent koji predstavlja uticaj istorije na naredna predviđanja.&lt;br /&gt;
:* Na primer, ako je &amp;lt;math&amp;gt;\alpha=0&amp;lt;/math&amp;gt;, istorija nema nikakvog značaja, a ako je &amp;lt;math&amp;gt;\alpha=1&amp;lt;/math&amp;gt;, samo poslednje izvršavanje se uzima u obzir procene. Generalno se koristi &amp;lt;math&amp;gt;\alpha=\frac{1}{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== 2. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Na jeziku Java implementirati monitor sa dve operacije, &#039;&#039;flip&#039;&#039; i &#039;&#039;flop&#039;&#039;, koje klijenti mogu da pozivaju strogo naizmenično.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class Monitor {&lt;br /&gt;
	public boolean flipIsNext = true;&lt;br /&gt;
&lt;br /&gt;
	public synchronized void flip() {&lt;br /&gt;
    	while (!flipIsNext) {&lt;br /&gt;
        	try {&lt;br /&gt;
            	wait();&lt;br /&gt;
            } catch (InterruptedException e) {}&lt;br /&gt;
        }&lt;br /&gt;
        flipIsNext ^= true;&lt;br /&gt;
        // execute flip operation&lt;br /&gt;
        notifyAll();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
	public synchronized void flop() {&lt;br /&gt;
    	while (flipIsNext) {&lt;br /&gt;
        	try {&lt;br /&gt;
            	wait();&lt;br /&gt;
            } catch (InterruptedException e) {}&lt;br /&gt;
        }&lt;br /&gt;
        flipIsNext ^= true;&lt;br /&gt;
        // execute flop operation&lt;br /&gt;
        notifyAll();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 3. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Šta je &#039;&#039;marshalling&#039;&#039;? Šta je SOAP?&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
* &#039;&#039;marshalling&#039;&#039; je serijalizacija strukture podataka nekog izvornog jezika u niz bajtova pogodnih za prenos.&lt;br /&gt;
* &#039;&#039;SOAP&#039;&#039; je &#039;&#039;message&#039;&#039; protokol koji postoji kao &amp;quot;međujezik&amp;quot; za komunikaciju između veb aplikacija napisanih u različitim izvornim jezicima.&lt;br /&gt;
&lt;br /&gt;
== 4. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Stanje zauzeća resursa nekog sistema u nekom trenutku definisano je sledećim strukturama:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
! colspan=&amp;quot;3&amp;quot; | Allocation&lt;br /&gt;
! colspan=&amp;quot;3&amp;quot; | Max&lt;br /&gt;
! colspan=&amp;quot;3&amp;quot; | Available&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
! A&lt;br /&gt;
! B&lt;br /&gt;
! C&lt;br /&gt;
! A&lt;br /&gt;
! B&lt;br /&gt;
! C&lt;br /&gt;
! A&lt;br /&gt;
! B&lt;br /&gt;
! C&lt;br /&gt;
|-&lt;br /&gt;
| P1&lt;br /&gt;
| 2&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 3&lt;br /&gt;
| 3&lt;br /&gt;
| 2&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| P2&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 2&lt;br /&gt;
| 3&lt;br /&gt;
| 3&lt;br /&gt;
! rowspan=&amp;quot;3&amp;quot; colspan=&amp;quot;3&amp;quot; | &lt;br /&gt;
|-&lt;br /&gt;
| P3&lt;br /&gt;
| 2&lt;br /&gt;
| 2&lt;br /&gt;
| 1&lt;br /&gt;
| 3&lt;br /&gt;
| 2&lt;br /&gt;
| 2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Da li u datom stanju treba odobriti zahtev (1,0,0) procesu &#039;&#039;P1&#039;&#039; (sprovesti ceo postupak i obrazložiti odgovor)?&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Stanje posle predloga:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
! colspan=&amp;quot;3&amp;quot; | Allocation&lt;br /&gt;
! colspan=&amp;quot;3&amp;quot; | Max&lt;br /&gt;
! colspan=&amp;quot;3&amp;quot; | Available&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
! A&lt;br /&gt;
! B&lt;br /&gt;
! C&lt;br /&gt;
! A&lt;br /&gt;
! B&lt;br /&gt;
! C&lt;br /&gt;
! A&lt;br /&gt;
! B&lt;br /&gt;
! C&lt;br /&gt;
|-&lt;br /&gt;
| P1&lt;br /&gt;
| 3&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 3&lt;br /&gt;
| 3&lt;br /&gt;
| 2&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| P2&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 2&lt;br /&gt;
| 3&lt;br /&gt;
| 3&lt;br /&gt;
! rowspan=&amp;quot;3&amp;quot; colspan=&amp;quot;3&amp;quot; | &lt;br /&gt;
|-&lt;br /&gt;
| P3&lt;br /&gt;
| 2&lt;br /&gt;
| 2&lt;br /&gt;
| 1&lt;br /&gt;
| 3&lt;br /&gt;
| 2&lt;br /&gt;
| 2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
U ovom stanju nije moguće završiti ni jedan proces - &#039;&#039;P1&#039;&#039; zahteva još 3xB (nedostupan) i 1xA. &#039;&#039;P2&#039;&#039; zahteva još 2xA, 2xB i 2xC (svi nedostupni). &#039;&#039;P3&#039;&#039; zahteva 1xA (nedostupan) i 1xC. To znači da je mrtva blokada moguća.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;P3&#039;&#039; bi mogao da se završi da procesu &#039;&#039;P1&#039;&#039; nije bio odobren zahtev. Zaključak je da ne treba odobriti zahtev &#039;&#039;P1(1,0,0)&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== 5. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Jedna realizacija protokola više čitalaca-jedan pisac (&#039;&#039;multiple readers – single writer&#039;&#039;) radi tako što pušta novog čitaoca ako već postoji čitalac koji čita. Koji problem postoji u toj realizaciji?&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Problem u ovoj realizaciji je slučaj u kome pisac dolazi i čeka da čitalac završi čitanje. Moguće je beskrajno izgladnjivanje pisca ako neprestano dolaze novi čitaoci dok god postoji makar jedan čitaoc u sistemu.&lt;br /&gt;
&lt;br /&gt;
Ovaj problem se može zaobići ako, dok neki čitaoc čita, ne puštamo nove čitaoce ako je u međuvremenu u red došao i pisac.&lt;br /&gt;
&lt;br /&gt;
== 6. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Data je sledeća sekvenca referenciranja stranica od strane nekog procesa:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;2, 5, 7, 4, 5, 7, 5, 3, 2, 5, 6, 7, 5, 6, 7, 2, 4, 5, 7&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Procesu su dodeljena 4 okvira, zamena se vrši lokalno, samo u skupu stranica dodeljenih tom procesu, a inicijalno nije učitana nijedna stranica ovog procesa. Koliko puta ovaj proces generiše straničnu grešku (&#039;&#039;page fault&#039;&#039;) ako je algoritam zamene stranica LRU, a koliko ako je OPT?&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Odgovor LRU: &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;10&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Odgovor OPT: &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;7&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 7. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Ukratko objasniti tehniku korišćenja rezervoara (&#039;&#039;pool&#039;&#039;) slobodnih okvira.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Sistemi obično održavaju rezervoar (&#039;&#039;pool&#039;&#039;) slobodnih okvira: kada se traži slobodan okvir, odmah je raspoloživ u bazenu, tako da se nova stranica učitava pre nego što se pokrene izbacivanje neke druge radi dopune rezervoara (što je moguće uraditi kasnije).&lt;br /&gt;
&lt;br /&gt;
== 8. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
U redu zahteva za pristup disku nalaze se zahtevi za pristup sledećim cilindrima (po redosledu pristizanja): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;57, 38, 90, 125, 65, 36, 46.&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Prethodno opsluženi zahtev je bio na cilindru 41, a glava se kreće prema cilindrima sa većim brojevima. Napisati redosled opsluživanja ovih zahteva ukoliko je algoritam raspoređivanja &#039;&#039;LOOK&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Odgovor: &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;46, 57, 65, 90, 125, 36, 38.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 9. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Ukratko opisati principe mikrokernel arhitekture operativnog sistema.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
* Motiv: svesti OS jezgro na minimum, sve nepotrebne delove pretvoriti u sistemske programe i procese koji rade u korisničkom modu.&lt;br /&gt;
:* U kernelu ostaje samo sistemi za upravljanje procesa i memorije.&lt;br /&gt;
* Prednosti: proširivost, promenljivost i prenosivost.&lt;br /&gt;
* Mane: lošije performanse.&lt;br /&gt;
&lt;br /&gt;
== 10. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Koji mehanizam koristi sistem Android da bi iz Java programa pozivao usluge iz C biblioteka?&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
JNI (&#039;&#039;Java Native Interface&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:ОС2]]&lt;/div&gt;</summary>
		<author><name>Fedja</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9E%D0%A12&amp;diff=6391</id>
		<title>ОС2</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9E%D0%A12&amp;diff=6391"/>
		<updated>2023-07-03T16:09:05Z</updated>

		<summary type="html">&lt;p&gt;Fedja: indikator rešenosti rokova&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Предмет&lt;br /&gt;
| назив     = Оперативни системи 1&lt;br /&gt;
| шифра     = 13С113ОС2, 13Е113ОС2&lt;br /&gt;
| семестар  = 5&lt;br /&gt;
| статус    = изборни&lt;br /&gt;
| страница  = [http://os.etf.bg.ac.rs/OS2/ os.etf.rs/OS2]&lt;br /&gt;
| одсек     = СИ, РТИ&lt;br /&gt;
| претходни = ОС1&lt;br /&gt;
}}&lt;br /&gt;
&#039;&#039;&#039;Оперативни системи 2&#039;&#039;&#039; је изборни предмет из петог семестра на СИ и РТИ и наставак [[ОС1|Оперативних система 1]].&lt;br /&gt;
&lt;br /&gt;
== Корисне везе ==&lt;br /&gt;
* &#039;&#039;&#039;[[github:KockaAdmiralac/OS-kolokvijumi|Сви колоквијуми спојени у један документ и категорисани по области, спремни за штампу]]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Настава ==&lt;br /&gt;
Као наставак [[ОС1#Настава|ОС1]], на предмету се обрађују следеће области:&lt;br /&gt;
* &#039;&#039;&#039;Први блок:&#039;&#039;&#039; Распоређивање процеса, синхронизација и комуникација између процеса (монитори, &#039;&#039;message passing&#039;&#039;, RPC), Java прикључнице (само на вежбама)&lt;br /&gt;
* &#039;&#039;&#039;Други блок:&#039;&#039;&#039; Управљање дељеним ресурсима (мртва блокада), виртуелна меморија&lt;br /&gt;
* &#039;&#039;&#039;Трећи блок:&#039;&#039;&#039; Управљање дисковима, архитектура оперативних система (&#039;&#039;Linux&#039;&#039;, &#039;&#039;Windows&#039;&#039;, &#039;&#039;Android&#039;&#039;), &#039;&#039;Bash&#039;&#039; (само на вежбама), међупроцесна комуникација на оперативном систему &#039;&#039;Linux&#039;&#039; (само на вежбама)&lt;br /&gt;
На вежбама се више прелази градиво са колоквијума и оне могу да буду корисније при спремању колоквијума, док су делови са предавања неопходни за спремање испита.&lt;br /&gt;
&lt;br /&gt;
== Пројекат ==&lt;br /&gt;
Од школске 2021/22. године, пројекат се ради на оперативном систему [[github:mit-pdos/xv6-riscv|xv6]] покренутом у &#039;&#039;Ubuntu&#039;&#039; виртуелној машини. Од корисних материјала за пројекат може да служи [https://pdos.csail.mit.edu/6.828/2021/xv6/book-riscv-rev2.pdf xv6 књига.] Бодовање је слично као на [[ОС1]], осим што се на одбрани пројекта не раде модификације већ се само покрећу тајни тестови и одговара на питања у вези са пројектом. Доступан је &#039;&#039;&#039;водич за [[ОС2/Пројекат 2022|пројекат из 2022.]]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Испитни рокови ==&lt;br /&gt;
Слична прича као за [[ОС1#Испитни рокови|ОС1]]. Уколико желите да додате рок, посетите &#039;&#039;&#039;[[Project:Направи#Стандард (латиница)|страницу за прављење рока]]&#039;&#039;&#039;.&lt;br /&gt;
{{#dpl:&lt;br /&gt;
| category        = ОС2&lt;br /&gt;
| category        = Рокови&lt;br /&gt;
| nottitleregexp  = ОС2/Пројекат \d+&lt;br /&gt;
| noresultsheader = Тренутно нема решених рокова.&lt;br /&gt;
| format          = ,\n* &amp;lt;span class=&amp;quot;rok,&amp;quot;&amp;gt;[[%PAGE%|²{#invoke:String¦sub¦%PAGE%¦5¦-1}²]]&amp;lt;/span&amp;gt;,,&lt;br /&gt;
| ordermethod     = title&lt;br /&gt;
| include     = {nerešeno}.dpl, {delimično rešeno}.dpl, {нерешено}.dpl, {делимично решено}.dpl&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Начин оцењивања ==&lt;br /&gt;
Као на [[ОС1#Начин оцењивања|ОС1]].&lt;br /&gt;
&lt;br /&gt;
== Потребна помоћ ==&lt;br /&gt;
* {{zadaci|rešenja}} (Ово се конкретно односи на испите, пошто су колоквијуми већ решени.)&lt;br /&gt;
*: Рокови код којих нису сви задаци решени су: {{rokovi|делимично решени}}&lt;br /&gt;
*: Рокови који су преписани а нису решени су: {{rokovi|нерешени}}&lt;/div&gt;</summary>
		<author><name>Fedja</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9E%D0%A12/%D0%88%D0%B0%D0%BD%D1%83%D0%B0%D1%80_2020&amp;diff=6390</id>
		<title>ОС2/Јануар 2020</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9E%D0%A12/%D0%88%D0%B0%D0%BD%D1%83%D0%B0%D1%80_2020&amp;diff=6390"/>
		<updated>2023-07-03T16:03:01Z</updated>

		<summary type="html">&lt;p&gt;Fedja: januar 2020&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
{{nerešeno}}&lt;br /&gt;
[http://os.etf.bg.ac.rs/OS2/rokovi/2020/januar/OS2%20Jan%202020.pdf Zadaci na stranici predmeta.]&lt;br /&gt;
&lt;br /&gt;
== 1. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Ukratko objasniti tehniku predviđanja trajanja narednog naleta izvršavanja pomoću eksponencijalnog usrednjavanja kod SJF algoritma raspoređivanja procesa.&lt;br /&gt;
&lt;br /&gt;
== 2. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Na jeziku Java implementirati monitor sa dve operacije, &#039;&#039;flip&#039;&#039; i &#039;&#039;flop&#039;&#039;, koje klijenti mogu da pozivaju strogo naizmenično.&lt;br /&gt;
&lt;br /&gt;
== 3. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Šta je &#039;&#039;marshalling&#039;&#039;? Šta je SOAP?&lt;br /&gt;
&lt;br /&gt;
== 4. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Stanje zauzeća resursa nekog sistema u nekom trenutku definisano je sledećim strukturama:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
! colspan=&amp;quot;3&amp;quot; | Allocation&lt;br /&gt;
! colspan=&amp;quot;3&amp;quot; | Max&lt;br /&gt;
! colspan=&amp;quot;3&amp;quot; | Available&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
! A&lt;br /&gt;
! B&lt;br /&gt;
! C&lt;br /&gt;
! A&lt;br /&gt;
! B&lt;br /&gt;
! C&lt;br /&gt;
! A&lt;br /&gt;
! B&lt;br /&gt;
! C&lt;br /&gt;
|-&lt;br /&gt;
| P1&lt;br /&gt;
| 2&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 3&lt;br /&gt;
| 3&lt;br /&gt;
| 2&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| P2&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 2&lt;br /&gt;
| 3&lt;br /&gt;
| 3&lt;br /&gt;
! rowspan=&amp;quot;3&amp;quot; colspan=&amp;quot;3&amp;quot; | &lt;br /&gt;
|-&lt;br /&gt;
| P3&lt;br /&gt;
| 2&lt;br /&gt;
| 2&lt;br /&gt;
| 1&lt;br /&gt;
| 3&lt;br /&gt;
| 2&lt;br /&gt;
| 2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Da li u datom stanju treba odobriti zahtev (1,0,0) procesu &#039;&#039;P1&#039;&#039; (sprovesti ceo postupak i obrazložiti odgovor)?&lt;br /&gt;
&lt;br /&gt;
== 5. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Jedna realizacija protokola više čitalaca-jedan pisac (&#039;&#039;multiple readers – single writer&#039;&#039;) radi tako što pušta novog čitaoca ako već postoji čitalac koji čita. Koji problem postoji u toj realizaciji?&lt;br /&gt;
&lt;br /&gt;
== 6. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Data je sledeća sekvenca referenciranja stranica od strane nekog procesa:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;2, 5, 7, 4, 5, 7, 5, 3, 2, 5, 6, 7, 5, 6, 7, 2, 4, 5, 7&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Procesu su dodeljena 4 okvira, zamena se vrši lokalno, samo u skupu stranica dodeljenih tom procesu, a inicijalno nije učitana nijedna stranica ovog procesa. Koliko puta ovaj proces generiše straničnu grešku (&#039;&#039;page fault&#039;&#039;) ako je algoritam zamene stranica LRU, a koliko ako je OPT?&lt;br /&gt;
&lt;br /&gt;
== 7. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Ukratko objasniti tehniku korišćenja rezervoara (&#039;&#039;pool&#039;&#039;) slobodnih okvira.&lt;br /&gt;
&lt;br /&gt;
== 8. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
U redu zahteva za pristup disku nalaze se zahtevi za pristup sledećim cilindrima (po redosledu pristizanja): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;57, 38, 90, 125, 65, 36, 46.&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Prethodno opsluženi zahtev je bio na cilindru 41, a glava se kreće prema cilindrima sa većim brojevima. Napisati redosled opsluživanja ovih zahteva ukoliko je algoritam raspoređivanja &#039;&#039;LOOK&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== 9. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Ukratko opisati principe mikrokernel arhitekture operativnog sistema&lt;br /&gt;
&lt;br /&gt;
== 10. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Koji mehanizam koristi sistem Android da bi iz Java programa pozivao usluge iz C biblioteka?&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:ОС2]]&lt;/div&gt;</summary>
		<author><name>Fedja</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9E%D0%A12/%D0%88%D0%B0%D0%BD%D1%83%D0%B0%D1%80_2021&amp;diff=6389</id>
		<title>ОС2/Јануар 2021</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9E%D0%A12/%D0%88%D0%B0%D0%BD%D1%83%D0%B0%D1%80_2021&amp;diff=6389"/>
		<updated>2023-07-03T15:56:06Z</updated>

		<summary type="html">&lt;p&gt;Fedja: popravljen link ka stranici predmeta&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
{{nerešeno}}&lt;br /&gt;
[http://os.etf.bg.ac.rs/OS2/rokovi/2021/januar/Jan%202021.pdf Zadaci na stranici predmeta.]&lt;br /&gt;
&lt;br /&gt;
== 1. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Navesti osnovne elemente algoritama raspoređivanja procesa MFQS (&#039;&#039;Multi-level Feedback Queue Scheduling&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
== 2. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Korišćenjem klasičnih uslovnih promenljivih napisati kod monitora koji realizuje binarni semafor.&lt;br /&gt;
&lt;br /&gt;
== 3. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Objasniti razliku između sinhronog i asinhronog slanja poruke u međuprocesnoj komunikaciji.&lt;br /&gt;
&lt;br /&gt;
== 4. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
U nekom sistemu primenjuje se mehanizam izbegavanja mrtve blokade (&#039;&#039;deadlock avoidance&#039;&#039;) zasnovan na grafu alokacije. Na slici je prikazan graf alokacije resursa za posmatrano stanje sistema. Ukoliko &#039;&#039;P2&#039;&#039; zatraži resurs &#039;&#039;R1&#039;&#039;, da li će mu taj resurs biti odmah dodeljen? Ako neće odmah, kada mu može biti dodeljen?&lt;br /&gt;
&lt;br /&gt;
== 5. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Data je sekvenca referenciranja stranica. Koliki je broj straničnih grešaka za algoritam OPT zamene stranica ako je na raspolaganju 4 okvira?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;4, 1, 2, 3, 4, 5, 2, 1, 3, 7, 2, 3, 4, 5, 2, 3, 1, 4, 7&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 6. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Neki &#039;&#039;storage&#039;&#039; sistem sa više diskova, visoke pouzdanosti, označen je na sledeći način: RAID5+1 2x(9+1), pri čemu je kapacitet svakog diska 1TB. Koliki je efektivni kapacitet (za „korisne“ informacije koje koristi fajl sistem) ove strukture diskova? Da li je on otporan na otkaz dva diska? Ako nije, zašto nije? Ako jeste, pod kojim uslovima jeste?&lt;br /&gt;
&lt;br /&gt;
== 7. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Ukratko objasniti osnovne principe mikrokernel arhitekture operativnog sistema.&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:ОС2]]&lt;/div&gt;</summary>
		<author><name>Fedja</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9E%D0%A12&amp;diff=6388</id>
		<title>ОС2</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9E%D0%A12&amp;diff=6388"/>
		<updated>2023-07-03T15:48:59Z</updated>

		<summary type="html">&lt;p&gt;Fedja: nerešeni&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Предмет&lt;br /&gt;
| назив     = Оперативни системи 1&lt;br /&gt;
| шифра     = 13С113ОС2, 13Е113ОС2&lt;br /&gt;
| семестар  = 5&lt;br /&gt;
| статус    = изборни&lt;br /&gt;
| страница  = [http://os.etf.bg.ac.rs/OS2/ os.etf.rs/OS2]&lt;br /&gt;
| одсек     = СИ, РТИ&lt;br /&gt;
| претходни = ОС1&lt;br /&gt;
}}&lt;br /&gt;
&#039;&#039;&#039;Оперативни системи 2&#039;&#039;&#039; је изборни предмет из петог семестра на СИ и РТИ и наставак [[ОС1|Оперативних система 1]].&lt;br /&gt;
&lt;br /&gt;
== Корисне везе ==&lt;br /&gt;
* &#039;&#039;&#039;[[github:KockaAdmiralac/OS-kolokvijumi|Сви колоквијуми спојени у један документ и категорисани по области, спремни за штампу]]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Настава ==&lt;br /&gt;
Као наставак [[ОС1#Настава|ОС1]], на предмету се обрађују следеће области:&lt;br /&gt;
* &#039;&#039;&#039;Први блок:&#039;&#039;&#039; Распоређивање процеса, синхронизација и комуникација између процеса (монитори, &#039;&#039;message passing&#039;&#039;, RPC), Java прикључнице (само на вежбама)&lt;br /&gt;
* &#039;&#039;&#039;Други блок:&#039;&#039;&#039; Управљање дељеним ресурсима (мртва блокада), виртуелна меморија&lt;br /&gt;
* &#039;&#039;&#039;Трећи блок:&#039;&#039;&#039; Управљање дисковима, архитектура оперативних система (&#039;&#039;Linux&#039;&#039;, &#039;&#039;Windows&#039;&#039;, &#039;&#039;Android&#039;&#039;), &#039;&#039;Bash&#039;&#039; (само на вежбама), међупроцесна комуникација на оперативном систему &#039;&#039;Linux&#039;&#039; (само на вежбама)&lt;br /&gt;
На вежбама се више прелази градиво са колоквијума и оне могу да буду корисније при спремању колоквијума, док су делови са предавања неопходни за спремање испита.&lt;br /&gt;
&lt;br /&gt;
== Пројекат ==&lt;br /&gt;
Од школске 2021/22. године, пројекат се ради на оперативном систему [[github:mit-pdos/xv6-riscv|xv6]] покренутом у &#039;&#039;Ubuntu&#039;&#039; виртуелној машини. Од корисних материјала за пројекат може да служи [https://pdos.csail.mit.edu/6.828/2021/xv6/book-riscv-rev2.pdf xv6 књига.] Бодовање је слично као на [[ОС1]], осим што се на одбрани пројекта не раде модификације већ се само покрећу тајни тестови и одговара на питања у вези са пројектом. Доступан је &#039;&#039;&#039;водич за [[ОС2/Пројекат 2022|пројекат из 2022.]]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Испитни рокови ==&lt;br /&gt;
Слична прича као за [[ОС1#Испитни рокови|ОС1]]. Уколико желите да додате рок, посетите &#039;&#039;&#039;[[Project:Направи#Стандард (латиница)|страницу за прављење рока]]&#039;&#039;&#039;.&lt;br /&gt;
{{#dpl:&lt;br /&gt;
| namespace       =&lt;br /&gt;
| titleregexp     = ОС2/[^ ]* \d+&lt;br /&gt;
| nottitleregexp  = ОС2/Пројекат \d+&lt;br /&gt;
| noresultsheader = Тренутно нема решених рокова.&lt;br /&gt;
| format          = ,\n* [[%PAGE%|²{#invoke:String¦sub¦%PAGE%¦5¦-1}²]],,&lt;br /&gt;
| ordermethod     = title&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Начин оцењивања ==&lt;br /&gt;
Као на [[ОС1#Начин оцењивања|ОС1]].&lt;br /&gt;
&lt;br /&gt;
== Потребна помоћ ==&lt;br /&gt;
* {{zadaci|rešenja}} (Ово се конкретно односи на испите, пошто су колоквијуми већ решени.)&lt;br /&gt;
*: Рокови код којих нису сви задаци решени су: {{rokovi|делимично решени}}&lt;br /&gt;
*: Рокови који су преписани а нису решени су: {{rokovi|нерешени}}&lt;/div&gt;</summary>
		<author><name>Fedja</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9E%D0%A12/%D0%88%D0%B0%D0%BD%D1%83%D0%B0%D1%80_2021&amp;diff=6386</id>
		<title>ОС2/Јануар 2021</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9E%D0%A12/%D0%88%D0%B0%D0%BD%D1%83%D0%B0%D1%80_2021&amp;diff=6386"/>
		<updated>2023-07-03T15:47:12Z</updated>

		<summary type="html">&lt;p&gt;Fedja: januar 2021 (fali slika u 4. zadatku)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
{{nerešeno}}&lt;br /&gt;
[http://os.etf.bg.ac.rs/OS2/rokovi/2023/januar/OS2%20Jan%202023.pdf Zadaci na stranici predmeta.]&lt;br /&gt;
&lt;br /&gt;
== 1. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Navesti osnovne elemente algoritama raspoređivanja procesa MFQS (&#039;&#039;Multi-level Feedback Queue Scheduling&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
== 2. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Korišćenjem klasičnih uslovnih promenljivih napisati kod monitora koji realizuje binarni semafor.&lt;br /&gt;
&lt;br /&gt;
== 3. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Objasniti razliku između sinhronog i asinhronog slanja poruke u međuprocesnoj komunikaciji.&lt;br /&gt;
&lt;br /&gt;
== 4. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
U nekom sistemu primenjuje se mehanizam izbegavanja mrtve blokade (&#039;&#039;deadlock avoidance&#039;&#039;) zasnovan na grafu alokacije. Na slici je prikazan graf alokacije resursa za posmatrano stanje sistema. Ukoliko &#039;&#039;P2&#039;&#039; zatraži resurs &#039;&#039;R1&#039;&#039;, da li će mu taj resurs biti odmah dodeljen? Ako neće odmah, kada mu može biti dodeljen?&lt;br /&gt;
&lt;br /&gt;
== 5. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Data je sekvenca referenciranja stranica. Koliki je broj straničnih grešaka za algoritam OPT zamene stranica ako je na raspolaganju 4 okvira?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;4, 1, 2, 3, 4, 5, 2, 1, 3, 7, 2, 3, 4, 5, 2, 3, 1, 4, 7&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 6. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Neki &#039;&#039;storage&#039;&#039; sistem sa više diskova, visoke pouzdanosti, označen je na sledeći način: RAID5+1 2x(9+1), pri čemu je kapacitet svakog diska 1TB. Koliki je efektivni kapacitet (za „korisne“ informacije koje koristi fajl sistem) ove strukture diskova? Da li je on otporan na otkaz dva diska? Ako nije, zašto nije? Ako jeste, pod kojim uslovima jeste?&lt;br /&gt;
&lt;br /&gt;
== 7. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Ukratko objasniti osnovne principe mikrokernel arhitekture operativnog sistema.&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:ОС2]]&lt;/div&gt;</summary>
		<author><name>Fedja</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9E%D0%A12/%D0%88%D0%B0%D0%BD%D1%83%D0%B0%D1%80_2023&amp;diff=6385</id>
		<title>ОС2/Јануар 2023</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9E%D0%A12/%D0%88%D0%B0%D0%BD%D1%83%D0%B0%D1%80_2023&amp;diff=6385"/>
		<updated>2023-07-03T15:38:38Z</updated>

		<summary type="html">&lt;p&gt;Fedja: januar 2023&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
{{rešenja}}&lt;br /&gt;
[http://os.etf.bg.ac.rs/OS2/rokovi/2023/januar/OS2%20Jan%202023.pdf Zadaci na stranici predmeta.]&lt;br /&gt;
&lt;br /&gt;
== 1. zadatak ==&lt;br /&gt;
{{delimično rešeno}}&lt;br /&gt;
Objasniti suštinu SJF raspoređivanja procesa i navesti po kom kriterijumu je ovo raspoređivanje optimalno (precizno formulisati iskaz o optimalnosti).&lt;br /&gt;
&lt;br /&gt;
== 2. zadatak ==&lt;br /&gt;
{{delimično rešeno}}&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Na jeziku Java realizovati ograničeni bafer.&lt;br /&gt;
&lt;br /&gt;
== 3. zadatak ==&lt;br /&gt;
{{delimično rešeno}}&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Šta je &#039;&#039;serijalizacija&#039;&#039; (&#039;&#039;marshalling&#039;&#039;), a šta &#039;&#039;deserijalizacija&#039;&#039; (&#039;&#039;unmarshalling&#039;&#039;)? Navesti barem dva standardna tekstualna formata za serijalizovan zapis.&lt;br /&gt;
&lt;br /&gt;
== 4. zadatak ==&lt;br /&gt;
{{delimično rešeno}}&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Stanje zauzeća resursa nekog sistema u nekom trenutku definisano je sledećim strukturama:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
! colspan=&amp;quot;3&amp;quot; | Allocation&lt;br /&gt;
! colspan=&amp;quot;3&amp;quot; | Max&lt;br /&gt;
! colspan=&amp;quot;3&amp;quot; | Available&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
! A&lt;br /&gt;
! B&lt;br /&gt;
! C&lt;br /&gt;
! A&lt;br /&gt;
! B&lt;br /&gt;
! C&lt;br /&gt;
! A&lt;br /&gt;
! B&lt;br /&gt;
! C&lt;br /&gt;
|-&lt;br /&gt;
| P1&lt;br /&gt;
| 2&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 3&lt;br /&gt;
| 3&lt;br /&gt;
| 2&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| P2&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 2&lt;br /&gt;
| 3&lt;br /&gt;
| 3&lt;br /&gt;
! rowspan=&amp;quot;3&amp;quot; colspan=&amp;quot;3&amp;quot; | &lt;br /&gt;
|-&lt;br /&gt;
| P3&lt;br /&gt;
| 2&lt;br /&gt;
| 2&lt;br /&gt;
| 1&lt;br /&gt;
| 3&lt;br /&gt;
| 2&lt;br /&gt;
| 2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Da li u datom stanju treba odobriti zahtev (1,0,0) procesu &#039;&#039;P2&#039;&#039; (sprovesti ceo postupak i obrazložiti odgovor)?&lt;br /&gt;
&lt;br /&gt;
== 5. zadatak ==&lt;br /&gt;
: &#039;&#039;Isti zadatak se našao i na [[ОС2/Септембар 2015#7. zadatak|septembarskom roku iz 2015]].&#039;&#039;&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Šta je Beladijeva anomalija? Koji algoritam zamene stranica je ispoljava?&lt;br /&gt;
&lt;br /&gt;
== 6. zadatak ==&lt;br /&gt;
{{delimično rešeno}}&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Navesti i objasniti barem jednu tehniku za sprečavanje zaglavljivanja (&#039;&#039;thrashing&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
== 7. zadatak ==&lt;br /&gt;
{{delimično rešeno}}&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
U čemu je razlika između RAID5 i RAID6 sistema? Koji od njih ima veću pouzdanost, a koji veći efektivan prostor za podatke (za isti broj istih diskova)?&lt;br /&gt;
&lt;br /&gt;
== 8. zadatak ==&lt;br /&gt;
{{delimično rešeno}}&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Ukratko objasniti suštinu mikrokernel arhitekture operativnog sistema.&lt;br /&gt;
&lt;br /&gt;
== 9. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
: &#039;&#039;Isti zadatak se našao i na [[ОС2/Јун 2016#10. zadatak|junskom roku iz 2016]].&#039;&#039;&lt;br /&gt;
Šta je &#039;&#039;vm_area_struct&#039;&#039; u sistemu Linux? Navesti značenje i svrhu ove strukture, kao i bar neku informaciju koja ona sadrži.&lt;br /&gt;
&lt;br /&gt;
== 10. zadatak ==&lt;br /&gt;
{{delimično rešeno}}&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Navesti osnovnu razliku u načinu implementacije grafičkog korisničkog interfejsa (GUI) u operativnim sistemima Linux i Windows NT serije.&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:ОС2]]&lt;/div&gt;</summary>
		<author><name>Fedja</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9F%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D1%81%D0%BA%D0%B8_%D0%BF%D1%80%D0%B5%D0%B2%D0%BE%D0%B4%D0%B8%D0%BE%D1%86%D0%B8_1/%D0%9F%D1%80%D0%BE%D1%98%D0%B5%D0%BA%D0%B0%D1%82&amp;diff=6329</id>
		<title>Програмски преводиоци 1/Пројекат</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9F%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D1%81%D0%BA%D0%B8_%D0%BF%D1%80%D0%B5%D0%B2%D0%BE%D0%B4%D0%B8%D0%BE%D1%86%D0%B8_1/%D0%9F%D1%80%D0%BE%D1%98%D0%B5%D0%BA%D0%B0%D1%82&amp;diff=6329"/>
		<updated>2023-06-22T18:27:19Z</updated>

		<summary type="html">&lt;p&gt;Fedja: netačno ime ant run targeta&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&#039;&#039;&#039;Пројекат&#039;&#039;&#039; на предмету важи за једну од најтежих активности на њему због тога што захтева практичну примену знања стечених у трећем блоку (и понеких из првог и другог блока). Његова израда може захтевати око недељу дана константног рада (у зависности од нивоа за који радите) али се такође велики део тога може искористити из постојећих материјала са вежби и званичних видео водича за пројекат, на које ће се овај водич надаље ослањати.&lt;br /&gt;
&lt;br /&gt;
== Основно ==&lt;br /&gt;
Идеја пројекта јесте конструкција преводиоца за Микројаву — поједностављену, школску варијанту језика Јава чија се спецификација помало мења из године у годину (али неке суштинске ствари остају исте). Преводилац из једног фајла са изворним кодом чита Микројава код по спецификацији датој уз текст пројекта (а одвојеној од саме поставке), пролази кроз четири фазе превођења (лексичку анализу, синтаксну анализу, семантичку анализу и генерисање кода) и његов крајњи резултат јесте објектна датотека са Микројава бајткодом. Тај објектни фајл се затим може извршавати преко Микројава виртуелне машине (чија је имплементација већ дата и не може се мењати) и на основу неког уноса произвести неки излаз.&lt;br /&gt;
&lt;br /&gt;
За пројекат је потребно гледати вежбе трећег блока из табеле симбола и Микројава виртуелне машине, и евентуално вежбе првог и другог блока из JFlex и CUP. Такође су доступни видео водичи за пројекат са странице предмета, које је корисно погледати као увод у алате и нека генерална очекивања. Ти водичи су енкодовани неким јако застарелим кодеком, а реенкодовани снимци се могу наћи [https://studentetfbgacrs-my.sharepoint.com/:f:/g/personal/sa190595d_student_etf_bg_ac_rs/EvsffqNW2DBEhOcMqJ4xmFQBW5n-doL8EF58qMZ6qMbnDQ овде.]&lt;br /&gt;
&lt;br /&gt;
Пре него што пређете на даље одељке, &#039;&#039;&#039;препоручује се да прочитате поставку пројекта.&#039;&#039;&#039; Микројава спецификацију не морате читати, јер ће вам она највише значити приликом самог развијања пројекта.&lt;br /&gt;
&lt;br /&gt;
== Поставка ==&lt;br /&gt;
Сада када сте прочитали поставку, о њој је потребно рећи пар речи.&lt;br /&gt;
* Структура пројекта уопште не мора да буде онаква каква пише у поставци. То значи:&lt;br /&gt;
** Пакет не мора да се зове &amp;lt;code&amp;gt;rs.ac.bg.etf.pp1&amp;lt;/code&amp;gt;.&lt;br /&gt;
** Не постоји конкретан директоријум у који морате да сместите спецификације лексера и парсера.&lt;br /&gt;
** Није обавезно коришћење JDK 1.8 (мада је препоручено)&lt;br /&gt;
** Класе не морају да се зову &amp;lt;code&amp;gt;Compiler&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;SemanticAnalyzer&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;CodeGenerator&amp;lt;/code&amp;gt;.&lt;br /&gt;
* На одбрани се мање-више гледа само излаз преведеног Микројава програма за модификацију и за јавни тест одговарајућег нивоа за који радите. Ово у пракси значи:&lt;br /&gt;
** Нико неће проверавати формат грешке лексера.&lt;br /&gt;
** Нико неће проверавати да ли се успешно ради опоравак од грешке.&lt;br /&gt;
*** Ипак, препоручује се да пробате овај део да одрадите, али ако на неком месту не ради то није велики проблем.&lt;br /&gt;
** Нико неће проверавати да ли нисте користили &amp;lt;code&amp;gt;precedence&amp;lt;/code&amp;gt; (али нико неће ни објаснити како се користи).&lt;br /&gt;
** Нико неће проверавати како су именовани нетерминали нити класе које одговарају гранама тих нетерминала.&lt;br /&gt;
** Нико неће проверавати да ли сте додали акције у спецификацију парсера.&lt;br /&gt;
*** Свакако се препоручује да потребне акције обављате кроз одговарајуће посетиоце стабла, јер у спецификацији парсера није доступан IntelliSense.&lt;br /&gt;
** Није много вероватно да ће предметни сарадници погледати да ли користите њихову табелу симбола, да ли сте је распаковали и превели поново или користите неку потпуно другу имплементацију.&lt;br /&gt;
*** Ипак, коришћење њихове табеле симбола носи са собом погодност да ћете увежбати рад са њом па нећете много морати да обнављате за такве задатке на испиту.&lt;br /&gt;
** Нико неће проверавати да ли сте имплементирали методу &amp;lt;code&amp;gt;tsdump()&amp;lt;/code&amp;gt;.&lt;br /&gt;
** Нико неће проверавати да ли исписујете симболе при њиховој детекцији.&lt;br /&gt;
** Слабо ће се проверавати да ли се пријављују семантичке грешке.&lt;br /&gt;
*** Ипак, пошто током семантичке обраде свакако мора да се попуни табела симбола, вреди додати ове провере, у крајњем случају зато што ће вама значити уколико будете писали своје тест примере и напишете нешто семантички неисправно.&lt;br /&gt;
*** Може да се деси да неке ствари из јавних тестова или тестова за модификације које су закоментарисане морају да пријаве семантичке грешке, и да их предметни сарадници откоментаришу приликом одбране.&lt;br /&gt;
** Нико неће проверавати да ли се путање до улазних и излазних фајлова прослеђују кроз аргументе командне линије.&lt;br /&gt;
* На одбрани се не тражи да се било шта покреће из командне линије, нити преусмерава стандардни излаз и излаз за грешке.&lt;br /&gt;
* Примери Микројава кода из поставке и спецификације могу често бити синтаксно или семантички неисправни. Ово је због тога што предметни сарадници не напишу преводилац за спецификацију Микројаве коју су задали, а пример вероватно ископирају из поставке односно спецификације од претходне године, па не провере да ли је исправан.&lt;br /&gt;
* На одбрани нико не погледа извештај са пројекта.&lt;br /&gt;
* Нико неће тражити да се покрену студентски тестови пројекта.&lt;br /&gt;
* Супротно поставци, дорада пројеката на одбрани је дозвољена.&lt;br /&gt;
* У одељку за контекстне услове у оквиру спецификације могу бити описане ствари које се не раде у фази семантичке анализе, већ или описују генерално функционисање тог програмског конструкта, или описују ствари које се морају обезбедити у фази генерисања кода.&lt;br /&gt;
* Приликом спецификације синтаксе користи се [[wikipedia:Extended Backus–Naur form|EBNF нотација]].&lt;br /&gt;
* Подела функционалности по нивоима може бити јако конфузна. Спецификација Микројаве може посебно напоменути за само пар ствари да се имплементирају само на одређеним нивоима (остављајући утисак да је потребно препознати синтаксу за методе и класе чак и у пројекту А нивоа), док поставка може непотпуно излиставати смене које су потребне да се имплементирају за одређени ниво. Најбољи начин за одређивање шта се имплементира за који ниво јесу одговарајући јавни тестови.&lt;br /&gt;
&lt;br /&gt;
== Алати ==&lt;br /&gt;
У овом одељку наведене су све напомене у вези са алатима које ћете користити на пројекту, од којих ће неке имати смисла тек након што погледате видео водиче.&lt;br /&gt;
* Неколико ствари из видео водича урађено је на неоптималан начин:&lt;br /&gt;
** Једна од првих ствари поменутих у видео водичима јесте инсталирање &#039;&#039;Ant&#039;&#039;. За овиме нема потребе, јер је &#039;&#039;Ant&#039;&#039; већ инсталиран у оквиру &#039;&#039;Eclipse&#039;&#039;. Такође, &#039;&#039;Ant&#039;&#039; правила се доста лакше могу покретати одласком на &#039;&#039;Window&#039;&#039; → &#039;&#039;Show View&#039;&#039; → &#039;&#039;Ant&#039;&#039;, и затим бирањем &amp;lt;code&amp;gt;build.xml&amp;lt;/code&amp;gt; фајла из пројекта.&lt;br /&gt;
** Уколико крећете од кода из видео водича, могуће је да ће вам избацивати &#039;&#039;deprecation&#039;&#039; упозорења поводом коришћења &amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; inline&amp;gt;new Integer()&amp;lt;/syntaxhighlight&amp;gt; конструктора. Ово можете заменити са [https://docs.oracle.com/javase/8/docs/api/java/lang/Integer.html#parseInt-java.lang.String- &amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; inline&amp;gt;Integer.parseInt()&amp;lt;/syntaxhighlight&amp;gt;.]&lt;br /&gt;
** Бројање параметара и локалних променљивих коришћењем &amp;lt;code&amp;gt;VarCounter&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;FormParamCounter&amp;lt;/code&amp;gt; није заправо потребно, већ их можете бројати приликом обиласка тих чворова стабла.&lt;br /&gt;
** На неколико места се користи &amp;lt;code&amp;gt;Tab.insert()&amp;lt;/code&amp;gt; ради прављења &amp;lt;code&amp;gt;Obj&amp;lt;/code&amp;gt; чвора који нема потребе заправо убацивати у табелу симбола. Уместо овога, могу се користити регуларни конструктори за &amp;lt;code&amp;gt;Obj&amp;lt;/code&amp;gt;.&lt;br /&gt;
* У рачунарским лабораторијама би требало да је доступан и IntelliJ, па можете у њему такође радити пројекат.&lt;br /&gt;
* &#039;&#039;&#039;Обавезно&#039;&#039;&#039; преузети библиотеке са странице предмета уместо коришћења оних из шаблона пројекта или видео водича, јер њихове верзије могу бити застареле и проузроковати проблеме.&lt;br /&gt;
* Унос са стандардног улаза неће радити уколико се преведени Микројава програм покреће кроз &#039;&#039;Ant&#039;&#039;, па је потребно додати директиву &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; inline&amp;gt;&amp;lt;redirector input=&amp;quot;input.txt&amp;quot; /&amp;gt;&amp;lt;/syntaxhighlight&amp;gt; како би се стандардни улаз читао из датотеке &amp;lt;code&amp;gt;input.txt&amp;lt;/code&amp;gt; која се налази у кореном директоријуму пројекта.&lt;br /&gt;
** На овај исти начин могу се преусмерити стандардни излаз и излаз за грешке: &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; inline&amp;gt;&amp;lt;redirector input=&amp;quot;input.txt&amp;quot; output=&amp;quot;output.txt&amp;quot; error=&amp;quot;error.txt&amp;quot; /&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
** Уколико уместо овога програм покренете кроз командну линију, могуће је да ћете морати да различите податке за унос (преко &amp;lt;code&amp;gt;read&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;bread&amp;lt;/code&amp;gt; инструкција) пишете у истом реду (уместо у новим редовима).&lt;br /&gt;
* Није неопходно користити Log4j библиотеку за испис уколико не желите.&lt;br /&gt;
* Подразумевано, Log4j библиотека неће исписивати на излаз за грешке већ на стандардни излаз, чак и кад су у питање поруке са грешкама. Ово може да се конфигурише, али свакако нико неће обраћати пажњу на то на одбрани.&lt;br /&gt;
* Уколико добијете &#039;&#039;Cannot invoke &amp;quot;java.net.URL.toString()&amp;quot; because &amp;quot;this.val$url&amp;quot; is null&#039;&#039; грешку, пробајте да линију &amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; inline&amp;gt;DOMConfigurator.configure(Log4JUtils.instance().findLoggerConfigFile());&amp;lt;/syntaxhighlight&amp;gt; замените са &amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; inline&amp;gt;DOMConfigurator.configure(&amp;quot;config/log4j.xml&amp;quot;);&amp;lt;/syntaxhighlight&amp;gt;.&lt;br /&gt;
* Грешка за непостојећи &amp;lt;code&amp;gt;log4j.dtd&amp;lt;/code&amp;gt; се може игнорисати.&lt;br /&gt;
* Не заборавите да на све &amp;lt;code&amp;gt;&amp;amp;lt;java&amp;gt;&amp;lt;/code&amp;gt; елементе у &amp;lt;code&amp;gt;build.xml&amp;lt;/code&amp;gt; додате &amp;lt;code&amp;gt;fork=&amp;quot;true&amp;quot;&amp;lt;/code&amp;gt; атрибут, јер ће се иначе те ставке покретати из неког директоријума који није корени директоријум пројекта.&lt;br /&gt;
&lt;br /&gt;
== Фазе израде ==&lt;br /&gt;
=== Лексичка анализа ===&lt;br /&gt;
* Да бисте почели са развојем ове фазе не морате куцати свој &amp;lt;code&amp;gt;sym.java&amp;lt;/code&amp;gt; фајл, већ се он може генерисати из CUP спецификације чим покренете &amp;lt;code&amp;gt;parserGen&amp;lt;/code&amp;gt; правило у &#039;&#039;Ant&#039;&#039;, уколико сте све своје терминале написали у CUP спецификацији (&amp;lt;code&amp;gt;terminal&amp;lt;/code&amp;gt;).&lt;br /&gt;
* Ова фаза је најлакша и могуће ју је урадити за само пар сати, али је &#039;&#039;&#039;битно урадити је како треба.&#039;&#039;&#039; Грешке у лексеру могу изазвати проблеме приликом парсирања, само што лексер у том тренутку може бити место на којем ћете најмање посумњати да се налази грешка. Постоји неколико ствари на које треба обратити пажњу:&lt;br /&gt;
** &#039;&#039;&#039;Генералнија правила иду на дно.&#039;&#039;&#039; На пример, уколико се правило за &amp;lt;code&amp;gt;if&amp;lt;/code&amp;gt; налази испод правила за детекцију идентификатора, лексер ће &amp;lt;code&amp;gt;if&amp;lt;/code&amp;gt; препознати као идентификатор и зато ће парсер избацити грешку приликом парсирања &#039;&#039;if&#039;&#039; наредбе.&lt;br /&gt;
** На само дно убацити једно &#039;&#039;match-all&#039;&#039; правило (као што је урађено у видео водичу). Уколико то не урадите, лексер ће избацити &#039;&#039;Error: could not match input&#039;&#039; грешку уколико се наиђе на карактер који није у спецификацији Микројаве, што само по себи није проблем, али вам ваша сопствена грешка може дати више информација о томе где је тачно проблем.&lt;br /&gt;
** Уколико радите на оперативном систему &#039;&#039;Linux&#039;&#039; или &#039;&#039;macOS&#039;&#039;, потребно је одвојити правило за &amp;lt;code&amp;gt;\r\n&amp;lt;/code&amp;gt; на правила за &amp;lt;code&amp;gt;\r&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;\n&amp;lt;/code&amp;gt; како би их правилно игнорисао.&lt;br /&gt;
** У видео водичу се за препознавање идентификатора користи &amp;lt;code&amp;gt;([a-z]|[A-Z])[a-z|A-Z|0-9|_]*&amp;lt;/code&amp;gt; регуларни израз, где је карактер &amp;lt;code&amp;gt;|&amp;lt;/code&amp;gt; грешком дозвољен у оквиру идентификатора, док је правилно &amp;lt;code&amp;gt;[a-zA-Z][a-zA-Z0-9_]*&amp;lt;/code&amp;gt;. Ово је мала грешка, али може направити проблем приликом конструката попут &amp;lt;code&amp;gt;a||b&amp;lt;/code&amp;gt;, који ће бити препознати као један идентификатор уместо два идентификатора са оператором између њих.&lt;br /&gt;
&lt;br /&gt;
=== Синтаксна анализа ===&lt;br /&gt;
* Најважније правило током развоја ове фазе јесте да &#039;&#039;&#039;сва правила пишете корак по корак и са тестирањем између.&#039;&#039;&#039; Током развоја алати могу пријавити грешке које вам ни на који начин не сугеришу где је заправо проблем, и такве грешке је далеко лакше пронаћи уколико знате који део синтаксе је тестиран и ради, а који је новододат. Ово значи да када преузмете пројекат из видео водича &#039;&#039;&#039;обришете све смене из њега&#039;&#039;&#039; (осим једне, попут &amp;lt;code&amp;gt;Program ::= PROG;&amp;lt;/code&amp;gt;, како би генерисање парсера уопште радило) и кренете са додавањем смена редом по спецификацији. Кад видите да сте додали неку мању али потпуну целину, тестирајте да ли то што сте додали ради. Ако не ради, уклањањем и враћањем делова које сте додали можете лоцирати где је тачно изазвана грешка. Овакав начин развоја помоћи ће и вама и људима које питате за помоћ око евентуалних грешки.&lt;br /&gt;
* Када кренете са развојом ове фазе, најбоље је да уопште не постављате називе класа на нетерминалима. Ови називи класа се много лакше постављају након што сте већ развили целу граматику (пре следеће фазе) и имате цео контекст, а њихово додавање током развоја граматике може изазвати неке од честих грешки. Исто тако, нема потребе додељивати типове терминалима и нетерминалима док не стигнете до следеће фазе, већ је довољно само декларисати их.&lt;br /&gt;
** Уколико сте ово покушали да радите и наишли на грешке, њихова решења ће бити објашњавана у следећем одељку.&lt;br /&gt;
* Како се у оквиру ове фазе такође ради и опоравак од грешке, вредно је напоменути да је сврха тог опоравка да се пријаве све постојеће синтаксне грешке у програму (уместо да се пријави само једна и изађе), али да се при детекцији било какве грешке не наставља на следећу фазу, чак иако се од свих синтаксних грешки парсер успешно опоравио.&lt;br /&gt;
* Уколико се уместо реда за место синтаксне грешке од које се опоравља исписује колона, то је баг у алату и ангажовани на предмету неће то замерати. Ово се такође може десити у следећој фази.&lt;br /&gt;
* Грешка &#039;&#039;java.lang.NullPointerException: Cannot invoke &amp;quot;String.equals(Object)&amp;quot; because &amp;quot;X&amp;quot; is null&#039;&#039; обично значи да је негде заборављена тачка-зарез, али пошто је ово суштински грешка у имплементацији AST-CUP она не даје никаквих додатних информација о томе где би та грешка могла да буде.&lt;br /&gt;
* Грешка &#039;&#039;Syntax error X(Y)&#039;&#039; означава грешку у синтакси CUP фајла и може се десити из више разлога. Битно је напоменути да се &#039;&#039;&#039;број &#039;&#039;X&#039;&#039; односи на линију у аутогенерисаној CUP спецификацији која се налази у фајлу са суфиском &amp;lt;code&amp;gt;_astbuild.cup&amp;lt;/code&amp;gt;&#039;&#039;&#039;, а не у оригиналној CUP спецификацији, док се број &#039;&#039;Y&#039;&#039; односи на колону (карактер) у том реду где је пријављена синтаксна грешка (који није од велике користи). Разлози из којих се ова грешка дешава могу бити:&lt;br /&gt;
** заборављена тачка-зарез на крају смене,&lt;br /&gt;
** недостатак размака након зареза у декларацији терминала или нетерминала,&lt;br /&gt;
** коришћење &amp;lt;code&amp;gt;:=&amp;lt;/code&amp;gt; уместо &amp;lt;code&amp;gt;::=&amp;lt;/code&amp;gt;,&lt;br /&gt;
** и тако даље.&lt;br /&gt;
* Уколико добијате конфликте приликом имплементације &#039;&#039;if-else&#039;&#039;, поставка обично помене која тачно &amp;lt;code&amp;gt;precedence&amp;lt;/code&amp;gt; директива сме да се користи за то (и само то).&lt;br /&gt;
* Грешка која гласи &#039;&#039;java.lang.NullPointerException: Cannot invoke &amp;quot;java_cup.astext.AstSymInfo.getType()&amp;quot; because &amp;quot;this.lhInfo&amp;quot; is null&#039;&#039; значи да неки нетерминал који се користи &#039;&#039;&#039;са леве стране неке смене&#039;&#039;&#039; није претходно декларисан. За нетерминале који се користе са десне стране а нису декларисани се дешава другачија грешка која јасније каже да се ради о томе.&lt;br /&gt;
* Од користи може бити следећа скрипта за генерисање листе нетерминала које је потребно декларисати током ове фазе (која престаје да буде корисна у тренутку када нетерминалима треба додељивати типове), коју је потребно покренути &#039;&#039;Python&#039;&#039; интерпретером из кореног директоријума пројекта:&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from re import compile&lt;br /&gt;
&lt;br /&gt;
NTERM_REGEX = compile(r&#039;^(\w+)\s*::=&#039;)&lt;br /&gt;
&lt;br /&gt;
nterms = []&lt;br /&gt;
&lt;br /&gt;
with open(&#039;spec/mjparser.cup&#039;) as file:&lt;br /&gt;
    for line in file:&lt;br /&gt;
        match = NTERM_REGEX.match(line)&lt;br /&gt;
        if match:&lt;br /&gt;
            nterms.append(match.group(1))&lt;br /&gt;
&lt;br /&gt;
print(f&#039;nonterminal {&amp;quot;, &amp;quot;.join(nterms)};&#039;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Семантичка анализа ===&lt;br /&gt;
; Техничке напомене&lt;br /&gt;
* Пре почетка ове фазе не заборавите да свим терминалима који са собом носе неке смислене вредности (идентификатори, константе...) доделите тип (преко &amp;lt;code&amp;gt;terminal Tip naziv;&amp;lt;/code&amp;gt;). Уколико ово не урадите, у нетерминалима који садрже те терминале неће се изгенерисати поља са вредностима ових терминала.&lt;br /&gt;
* Такође пре почетка ове фазе потребно је свим нетерминалима доделити називе класа (уколико их не доделите, називи класа биће аутогенерисани па су као такви генерално непогодни за рад са њима). Када додељујете ове називе, битно је да се водите са два правила:&lt;br /&gt;
*# Уколико нетерминал има само једну грану, поставите да њен назив класе буде исти као и назив самог нетерминала. Ово ће генерисати једну конкретну класу за тај нетерминал.&lt;br /&gt;
*# Уколико нетерминал има више од једне гране, &#039;&#039;&#039;ниједна његова грана не сме да се зове исто као и сам нетерминал.&#039;&#039;&#039; Назив нетерминала користи се као назив апстрактне класе, а називи класа његових грана користе се за конкретне класе које су изведене из те апстрактне класе. Уколико нетерминал има више грана, и једна грана се зове исто као нетерминал, AST-CUP ће се збунити и неће знати да ли та класа треба да буде апстрактна и конкретна и ово ће испољити као грешка са конструкторима.&lt;br /&gt;
*#* Важно је напоменути да се левој и десној страни не смеју додељивати називи класа са различитом капитализацијом (&amp;lt;code&amp;gt;AssignOp&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;Assignop&amp;lt;/code&amp;gt;), јер се на фајл системима који се обично користе под &#039;&#039;Windows&#039;&#039; ови називи класа мапирају у исту Java датотеку. Ово је посебно опасно на оперативним системима &#039;&#039;Linux&#039;&#039; и &#039;&#039;macOS&#039;&#039;, где до грешки овог типа неће доћи (већ ће се оне десити тек у лабораторији).&lt;br /&gt;
* Уколико сте дошли до овог дела а потребно вам је да регенеришете парсер, не заборавите да након регенерисања парсера освежите пројекат десним кликом на пројекат и опцијом &#039;&#039;Refresh&#039;&#039;. Овај корак је потребан због тога што генерисање парсера позива спољашњи програм који без знања &#039;&#039;Eclipse&#039;&#039; мења фајлове унутар пројекта, и како би &#039;&#039;Eclipse&#039;&#039; знао да су се ти фајлови променили потребно је освежити их. Уколико ово не урадите, &#039;&#039;IntelliSense&#039;&#039; може пријављивати грешке које немају смисла и &#039;&#039;Eclipse&#039;&#039; може спречавати покретање компајлера због тога.&lt;br /&gt;
** Ово се у &#039;&#039;Eclipse&#039;&#039;-у може заобићи тако што се намести аутоматско освежавање након покретања спољашње &#039;&#039;Ant&#039;&#039; скрипте. То се ради тако што се у &#039;&#039;Project Explorer&#039;&#039;-у кликне десни клик на &#039;&#039;build.xml&#039;&#039; скрипту, онда &#039;&#039;Run as -&amp;gt; External Tools Configuration&#039;&#039;, онда се у искачућем прозору изабере таб &#039;&#039;Refresh&#039;&#039; и чекира се опција &#039;&#039;Refresh resources upon completion&#039;&#039; и &#039;&#039;The entire workspace&#039;&#039; у подменију.&lt;br /&gt;
* &amp;lt;code&amp;gt;Compiler&amp;lt;/code&amp;gt; класа је заправо скоро неизмењена &amp;lt;code&amp;gt;MJParserTest&amp;lt;/code&amp;gt; класа из видео водича, тако да можете само њу да преименујете/преместите.&lt;br /&gt;
; Табела симбола&lt;br /&gt;
* Пре рада са њиховом табелом симбола, не заборавите да у главној класи позовете &amp;lt;code&amp;gt;Tab.init()&amp;lt;/code&amp;gt;. Уколико то не урадите, грешка коју ћете добити може садржати &#039;&#039;&amp;quot;rs.etf.pp1.symboltable.Tab.currentScope&amp;quot; is null&#039;&#039;.&lt;br /&gt;
* Подразумевано, &amp;lt;code&amp;gt;Tab.dump()&amp;lt;/code&amp;gt; неће исписивати &#039;&#039;bool&#039;&#039; типове објектних чворова, јер то није имплементирано у &amp;lt;code&amp;gt;DumpSymbolTableVisitor&amp;lt;/code&amp;gt; (већ ће то место стајати празно). Пошто свакако нико није гледао испис табеле симбола на одбрани пројекта, ово никоме није ни било битно.&lt;br /&gt;
* Такође, &amp;lt;code&amp;gt;Tab.dump()&amp;lt;/code&amp;gt; може правити проблем када се као члан неке класе или као локални симбол члана неке класе нађе објекат те класе, јер тада долази до бесконачне рекурзије при испису. Једини случај кад неће доћи до ове бесконачне рекурзије јесте кад само симболи са називом &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; носе тип те класе (у том случају се њихов тип уопште не исписује). Пошто оваквих тест примера није било, ово никоме није правило проблем.&lt;br /&gt;
* Још један проблем са бесконачном рекурзијом у њиховој табели симбола може се десити уколико поредите класне типове са њиховом имплементацијом &amp;lt;code&amp;gt;equals&amp;lt;/code&amp;gt;. Ако два класна типа имају исти број поља и метода, и барем једну методу, &amp;lt;code&amp;gt;equals&amp;lt;/code&amp;gt; ће прећи на поређење тих метода и упасти у бесконачну рекурзију. Као и претходно, пошто оваквих тест примера генерално нема ово никоме не прави проблем. Са друге стране, пошто се на ову грешку најчешће наиђе приликом провере наткласа, може се специјално за случај када се ради о две класе користити оператор &amp;lt;code&amp;gt;==&amp;lt;/code&amp;gt; за поређење референци.&lt;br /&gt;
* &amp;lt;code&amp;gt;assignableTo&amp;lt;/code&amp;gt; метода у њиховој табели симбола не проверава да ли је једна класа подкласа друге, па је ову проверу потребно имплементирати (видети такође напомену изнад).&lt;br /&gt;
* Формат исписа чвора у &amp;lt;code&amp;gt;Tab.dump()&amp;lt;/code&amp;gt; јесте &amp;lt;code&amp;gt;&amp;amp;lt;kind&amp;gt; &amp;amp;lt;name&amp;gt; &amp;amp;lt;type&amp;gt; &amp;amp;lt;adr&amp;gt; &amp;amp;lt;level&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Приликом постављања &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; поља објектним чворовима који представљају низове праве се нови &amp;lt;code&amp;gt;Struct&amp;lt;/code&amp;gt; чворови, тако да два објектна чвора са истим низовском типом неће показивати на исти објекат у позадини. Ово генерално не прави никакав проблем.&lt;br /&gt;
* Када се кроз &amp;lt;code&amp;gt;Tab.insert()&amp;lt;/code&amp;gt; убаци један објектни чвор у табелу симбола, његов &amp;lt;code&amp;gt;level&amp;lt;/code&amp;gt; се аутоматски поставља на 0 уколико се ради о глобалном досегу и 1 уколико се ради о локалном. Ово је пожељно понашање за променљиве, али за методе, чији &amp;lt;code&amp;gt;level&amp;lt;/code&amp;gt; треба да садржи број параметара, је прво потребно вратити &amp;lt;code&amp;gt;level&amp;lt;/code&amp;gt; на 0 а затим га приликом обиласка сваког чвора синтаксног стабла за параметре повећавати за 1.&lt;br /&gt;
* Уколико је потребно додати нешто у &#039;&#039;universe&#039;&#039; досег (а обично јесте), то се може обавити одмах након позивања &amp;lt;code&amp;gt;Tab.init()&amp;lt;/code&amp;gt;, и код из &amp;lt;code&amp;gt;Tab.init()&amp;lt;/code&amp;gt; се може искористити за то.&lt;br /&gt;
&lt;br /&gt;
=== Генерисање кода ===&lt;br /&gt;
* Уколико се неке варијанте &amp;lt;code&amp;gt;dup&amp;lt;/code&amp;gt; инструкције исписују као &amp;lt;code&amp;gt;???&amp;lt;/code&amp;gt; приликом дисасемблирања, то је нормално понашање.&lt;br /&gt;
* Уколико је негде потребно обилазити низ или из неког другог разлога дохватити дужину низа, то није могуће урадити током превођења, већ је потребно генерисати код који позива &amp;lt;code&amp;gt;arraylength&amp;lt;/code&amp;gt; инструкцију, која са стека скине низ а постави дужину тог низа, и затим искористити ту вредност са стека у остатку генерисаног кода.&lt;br /&gt;
* Ако су у поставци задатка дате неке глобалне функције, код за њих је потребно генерисати на неком месту (најбоље на почетку) а затим тим функцијама поставити адресу на та места где је изгенерисан код за њих.&lt;br /&gt;
* Уколико желите да након генерисања кода тај код покренете тако да се приказује ток извршења програма и стање стека, можете додати ново правило попут:&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;target name=&amp;quot;debug&amp;quot; depends=&amp;quot;disasm&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;java classname=&amp;quot;rs.etf.pp1.mj.runtime.Run&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;arg value=&amp;quot;test/program.obj&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;arg value=&amp;quot;-debug&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;redirector input=&amp;quot;input.txt&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;classpath&amp;gt;&lt;br /&gt;
            &amp;lt;pathelement location=&amp;quot;lib/mj-runtime.jar&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/classpath&amp;gt;&lt;br /&gt;
    &amp;lt;/java&amp;gt;&lt;br /&gt;
&amp;lt;/target&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
** Ово вам, додуше, неће приказати садржај меморије Микројава виртуелне машине након извршених инструкција. Уколико вас то занима, можете прекопирати &amp;lt;code&amp;gt;Run&amp;lt;/code&amp;gt; класу из JAR фајла са извршним окружењем у свој пројекат, променити му пакет, поставити аргументе и &#039;&#039;breakpoint&#039;&#039;-ове на одговарајућа места (највероватније у &amp;lt;code&amp;gt;interpret&amp;lt;/code&amp;gt; методи) и покренути у дебаг режиму.&lt;br /&gt;
&lt;br /&gt;
== Одбрана ==&lt;br /&gt;
* На одбрани, пројекат се подешава тако што се &#039;&#039;Eclipse&#039;&#039; пројекат отвори помоћу опције &#039;&#039;File&#039;&#039; → &#039;&#039;Open Projects from File System&#039;&#039; и затим покрене било кроз &#039;&#039;Ant&#039;&#039; прозор било на начин показан на видео водичу.&lt;br /&gt;
* У поставци пројекта је изричито речено да су студенти дужни да осигурају да њихово решење ради на лабораторијским рачунарима. Ово генерално није толико неопходно, јер су решења генерално преносива, али уколико желите да се уверите лабораторија П26 је отворена за студентски рад радним данима до 20 часова, када се не одржавају остале лабораторијске вежбе.&lt;br /&gt;
* Одбрана пројекта изгледа тако што ангажовани на предмету прво дају модификацију и од тада студенти имају три сата да ураде модификацију и одбране пројекат. Тест примери за модификације су генерално дати на дељеним дисковима (али могу бити погрешни, јер нису били тестирани на правом пројекту). Када студент уради модификацију, позове асистента или демонстратора и они покрену пројекат на тесту за модификацију (евентуално више пута са промењеним параметрима, откоментарисаним линијама које су закоментарисане), испитају студента како је урадио модификацију, покрену јавни тест и опционо питају неко питање о самом пројекту. Уколико нешто не ради, студент може да исправља пројекат док не истекне време.&lt;br /&gt;
* Дозвољено је дељење тестова између студената, тако да пре одбране можете поделити са осталима своје тестове како би сви заједно више багова ухватили у својим пројектима.&lt;br /&gt;
&lt;br /&gt;
== Референце ==&lt;br /&gt;
* [[github:ksendzo/PP1-Projekat|Водич за пројекат 2021/2022.]] на којем су делови овог водича засновани.&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Водичи]]&lt;br /&gt;
[[Категорија:Програмски преводиоци 1]]&lt;/div&gt;</summary>
		<author><name>Fedja</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9F%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D1%81%D0%BA%D0%B8_%D0%BF%D1%80%D0%B5%D0%B2%D0%BE%D0%B4%D0%B8%D0%BE%D1%86%D0%B8_1/%D0%9F%D1%80%D0%BE%D1%98%D0%B5%D0%BA%D0%B0%D1%82&amp;diff=6328</id>
		<title>Програмски преводиоци 1/Пројекат</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9F%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D1%81%D0%BA%D0%B8_%D0%BF%D1%80%D0%B5%D0%B2%D0%BE%D0%B4%D0%B8%D0%BE%D1%86%D0%B8_1/%D0%9F%D1%80%D0%BE%D1%98%D0%B5%D0%BA%D0%B0%D1%82&amp;diff=6328"/>
		<updated>2023-06-22T10:32:30Z</updated>

		<summary type="html">&lt;p&gt;Fedja: воркароунд за освежавање&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&#039;&#039;&#039;Пројекат&#039;&#039;&#039; на предмету важи за једну од најтежих активности на њему због тога што захтева практичну примену знања стечених у трећем блоку (и понеких из првог и другог блока). Његова израда може захтевати око недељу дана константног рада (у зависности од нивоа за који радите) али се такође велики део тога може искористити из постојећих материјала са вежби и званичних видео водича за пројекат, на које ће се овај водич надаље ослањати.&lt;br /&gt;
&lt;br /&gt;
== Основно ==&lt;br /&gt;
Идеја пројекта јесте конструкција преводиоца за Микројаву — поједностављену, школску варијанту језика Јава чија се спецификација помало мења из године у годину (али неке суштинске ствари остају исте). Преводилац из једног фајла са изворним кодом чита Микројава код по спецификацији датој уз текст пројекта (а одвојеној од саме поставке), пролази кроз четири фазе превођења (лексичку анализу, синтаксну анализу, семантичку анализу и генерисање кода) и његов крајњи резултат јесте објектна датотека са Микројава бајткодом. Тај објектни фајл се затим може извршавати преко Микројава виртуелне машине (чија је имплементација већ дата и не може се мењати) и на основу неког уноса произвести неки излаз.&lt;br /&gt;
&lt;br /&gt;
За пројекат је потребно гледати вежбе трећег блока из табеле симбола и Микројава виртуелне машине, и евентуално вежбе првог и другог блока из JFlex и CUP. Такође су доступни видео водичи за пројекат са странице предмета, које је корисно погледати као увод у алате и нека генерална очекивања. Ти водичи су енкодовани неким јако застарелим кодеком, а реенкодовани снимци се могу наћи [https://studentetfbgacrs-my.sharepoint.com/:f:/g/personal/sa190595d_student_etf_bg_ac_rs/EvsffqNW2DBEhOcMqJ4xmFQBW5n-doL8EF58qMZ6qMbnDQ овде.]&lt;br /&gt;
&lt;br /&gt;
Пре него што пређете на даље одељке, &#039;&#039;&#039;препоручује се да прочитате поставку пројекта.&#039;&#039;&#039; Микројава спецификацију не морате читати, јер ће вам она највише значити приликом самог развијања пројекта.&lt;br /&gt;
&lt;br /&gt;
== Поставка ==&lt;br /&gt;
Сада када сте прочитали поставку, о њој је потребно рећи пар речи.&lt;br /&gt;
* Структура пројекта уопште не мора да буде онаква каква пише у поставци. То значи:&lt;br /&gt;
** Пакет не мора да се зове &amp;lt;code&amp;gt;rs.ac.bg.etf.pp1&amp;lt;/code&amp;gt;.&lt;br /&gt;
** Не постоји конкретан директоријум у који морате да сместите спецификације лексера и парсера.&lt;br /&gt;
** Није обавезно коришћење JDK 1.8 (мада је препоручено)&lt;br /&gt;
** Класе не морају да се зову &amp;lt;code&amp;gt;Compiler&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;SemanticAnalyzer&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;CodeGenerator&amp;lt;/code&amp;gt;.&lt;br /&gt;
* На одбрани се мање-више гледа само излаз преведеног Микројава програма за модификацију и за јавни тест одговарајућег нивоа за који радите. Ово у пракси значи:&lt;br /&gt;
** Нико неће проверавати формат грешке лексера.&lt;br /&gt;
** Нико неће проверавати да ли се успешно ради опоравак од грешке.&lt;br /&gt;
*** Ипак, препоручује се да пробате овај део да одрадите, али ако на неком месту не ради то није велики проблем.&lt;br /&gt;
** Нико неће проверавати да ли нисте користили &amp;lt;code&amp;gt;precedence&amp;lt;/code&amp;gt; (али нико неће ни објаснити како се користи).&lt;br /&gt;
** Нико неће проверавати како су именовани нетерминали нити класе које одговарају гранама тих нетерминала.&lt;br /&gt;
** Нико неће проверавати да ли сте додали акције у спецификацију парсера.&lt;br /&gt;
*** Свакако се препоручује да потребне акције обављате кроз одговарајуће посетиоце стабла, јер у спецификацији парсера није доступан IntelliSense.&lt;br /&gt;
** Није много вероватно да ће предметни сарадници погледати да ли користите њихову табелу симбола, да ли сте је распаковали и превели поново или користите неку потпуно другу имплементацију.&lt;br /&gt;
*** Ипак, коришћење њихове табеле симбола носи са собом погодност да ћете увежбати рад са њом па нећете много морати да обнављате за такве задатке на испиту.&lt;br /&gt;
** Нико неће проверавати да ли сте имплементирали методу &amp;lt;code&amp;gt;tsdump()&amp;lt;/code&amp;gt;.&lt;br /&gt;
** Нико неће проверавати да ли исписујете симболе при њиховој детекцији.&lt;br /&gt;
** Слабо ће се проверавати да ли се пријављују семантичке грешке.&lt;br /&gt;
*** Ипак, пошто током семантичке обраде свакако мора да се попуни табела симбола, вреди додати ове провере, у крајњем случају зато што ће вама значити уколико будете писали своје тест примере и напишете нешто семантички неисправно.&lt;br /&gt;
*** Може да се деси да неке ствари из јавних тестова или тестова за модификације које су закоментарисане морају да пријаве семантичке грешке, и да их предметни сарадници откоментаришу приликом одбране.&lt;br /&gt;
** Нико неће проверавати да ли се путање до улазних и излазних фајлова прослеђују кроз аргументе командне линије.&lt;br /&gt;
* На одбрани се не тражи да се било шта покреће из командне линије, нити преусмерава стандардни излаз и излаз за грешке.&lt;br /&gt;
* Примери Микројава кода из поставке и спецификације могу често бити синтаксно или семантички неисправни. Ово је због тога што предметни сарадници не напишу преводилац за спецификацију Микројаве коју су задали, а пример вероватно ископирају из поставке односно спецификације од претходне године, па не провере да ли је исправан.&lt;br /&gt;
* На одбрани нико не погледа извештај са пројекта.&lt;br /&gt;
* Нико неће тражити да се покрену студентски тестови пројекта.&lt;br /&gt;
* Супротно поставци, дорада пројеката на одбрани је дозвољена.&lt;br /&gt;
* У одељку за контекстне услове у оквиру спецификације могу бити описане ствари које се не раде у фази семантичке анализе, већ или описују генерално функционисање тог програмског конструкта, или описују ствари које се морају обезбедити у фази генерисања кода.&lt;br /&gt;
* Приликом спецификације синтаксе користи се [[wikipedia:Extended Backus–Naur form|EBNF нотација]].&lt;br /&gt;
* Подела функционалности по нивоима може бити јако конфузна. Спецификација Микројаве може посебно напоменути за само пар ствари да се имплементирају само на одређеним нивоима (остављајући утисак да је потребно препознати синтаксу за методе и класе чак и у пројекту А нивоа), док поставка може непотпуно излиставати смене које су потребне да се имплементирају за одређени ниво. Најбољи начин за одређивање шта се имплементира за који ниво јесу одговарајући јавни тестови.&lt;br /&gt;
&lt;br /&gt;
== Алати ==&lt;br /&gt;
У овом одељку наведене су све напомене у вези са алатима које ћете користити на пројекту, од којих ће неке имати смисла тек након што погледате видео водиче.&lt;br /&gt;
* Неколико ствари из видео водича урађено је на неоптималан начин:&lt;br /&gt;
** Једна од првих ствари поменутих у видео водичима јесте инсталирање &#039;&#039;Ant&#039;&#039;. За овиме нема потребе, јер је &#039;&#039;Ant&#039;&#039; већ инсталиран у оквиру &#039;&#039;Eclipse&#039;&#039;. Такође, &#039;&#039;Ant&#039;&#039; правила се доста лакше могу покретати одласком на &#039;&#039;Window&#039;&#039; → &#039;&#039;Show View&#039;&#039; → &#039;&#039;Ant&#039;&#039;, и затим бирањем &amp;lt;code&amp;gt;build.xml&amp;lt;/code&amp;gt; фајла из пројекта.&lt;br /&gt;
** Уколико крећете од кода из видео водича, могуће је да ће вам избацивати &#039;&#039;deprecation&#039;&#039; упозорења поводом коришћења &amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; inline&amp;gt;new Integer()&amp;lt;/syntaxhighlight&amp;gt; конструктора. Ово можете заменити са [https://docs.oracle.com/javase/8/docs/api/java/lang/Integer.html#parseInt-java.lang.String- &amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; inline&amp;gt;Integer.parseInt()&amp;lt;/syntaxhighlight&amp;gt;.]&lt;br /&gt;
** Бројање параметара и локалних променљивих коришћењем &amp;lt;code&amp;gt;VarCounter&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;FormParamCounter&amp;lt;/code&amp;gt; није заправо потребно, већ их можете бројати приликом обиласка тих чворова стабла.&lt;br /&gt;
** На неколико места се користи &amp;lt;code&amp;gt;Tab.insert()&amp;lt;/code&amp;gt; ради прављења &amp;lt;code&amp;gt;Obj&amp;lt;/code&amp;gt; чвора који нема потребе заправо убацивати у табелу симбола. Уместо овога, могу се користити регуларни конструктори за &amp;lt;code&amp;gt;Obj&amp;lt;/code&amp;gt;.&lt;br /&gt;
* У рачунарским лабораторијама би требало да је доступан и IntelliJ, па можете у њему такође радити пројекат.&lt;br /&gt;
* &#039;&#039;&#039;Обавезно&#039;&#039;&#039; преузети библиотеке са странице предмета уместо коришћења оних из шаблона пројекта или видео водича, јер њихове верзије могу бити застареле и проузроковати проблеме.&lt;br /&gt;
* Унос са стандардног улаза неће радити уколико се преведени Микројава програм покреће кроз &#039;&#039;Ant&#039;&#039;, па је потребно додати директиву &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; inline&amp;gt;&amp;lt;redirector input=&amp;quot;input.txt&amp;quot; /&amp;gt;&amp;lt;/syntaxhighlight&amp;gt; како би се стандардни улаз читао из датотеке &amp;lt;code&amp;gt;input.txt&amp;lt;/code&amp;gt; која се налази у кореном директоријуму пројекта.&lt;br /&gt;
** На овај исти начин могу се преусмерити стандардни излаз и излаз за грешке: &amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; inline&amp;gt;&amp;lt;redirector input=&amp;quot;input.txt&amp;quot; output=&amp;quot;output.txt&amp;quot; error=&amp;quot;error.txt&amp;quot; /&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
** Уколико уместо овога програм покренете кроз командну линију, могуће је да ћете морати да различите податке за унос (преко &amp;lt;code&amp;gt;read&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;bread&amp;lt;/code&amp;gt; инструкција) пишете у истом реду (уместо у новим редовима).&lt;br /&gt;
* Није неопходно користити Log4j библиотеку за испис уколико не желите.&lt;br /&gt;
* Подразумевано, Log4j библиотека неће исписивати на излаз за грешке већ на стандардни излаз, чак и кад су у питање поруке са грешкама. Ово може да се конфигурише, али свакако нико неће обраћати пажњу на то на одбрани.&lt;br /&gt;
* Уколико добијете &#039;&#039;Cannot invoke &amp;quot;java.net.URL.toString()&amp;quot; because &amp;quot;this.val$url&amp;quot; is null&#039;&#039; грешку, пробајте да линију &amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; inline&amp;gt;DOMConfigurator.configure(Log4JUtils.instance().findLoggerConfigFile());&amp;lt;/syntaxhighlight&amp;gt; замените са &amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; inline&amp;gt;DOMConfigurator.configure(&amp;quot;config/log4j.xml&amp;quot;);&amp;lt;/syntaxhighlight&amp;gt;.&lt;br /&gt;
* Грешка за непостојећи &amp;lt;code&amp;gt;log4j.dtd&amp;lt;/code&amp;gt; се може игнорисати.&lt;br /&gt;
* Не заборавите да на све &amp;lt;code&amp;gt;&amp;amp;lt;java&amp;gt;&amp;lt;/code&amp;gt; елементе у &amp;lt;code&amp;gt;build.xml&amp;lt;/code&amp;gt; додате &amp;lt;code&amp;gt;fork=&amp;quot;true&amp;quot;&amp;lt;/code&amp;gt; атрибут, јер ће се иначе те ставке покретати из неког директоријума који није корени директоријум пројекта.&lt;br /&gt;
&lt;br /&gt;
== Фазе израде ==&lt;br /&gt;
=== Лексичка анализа ===&lt;br /&gt;
* Да бисте почели са развојем ове фазе не морате куцати свој &amp;lt;code&amp;gt;sym.java&amp;lt;/code&amp;gt; фајл, већ се он може генерисати из CUP спецификације чим покренете &amp;lt;code&amp;gt;parserGen&amp;lt;/code&amp;gt; правило у &#039;&#039;Ant&#039;&#039;, уколико сте све своје терминале написали у CUP спецификацији (&amp;lt;code&amp;gt;terminal&amp;lt;/code&amp;gt;).&lt;br /&gt;
* Ова фаза је најлакша и могуће ју је урадити за само пар сати, али је &#039;&#039;&#039;битно урадити је како треба.&#039;&#039;&#039; Грешке у лексеру могу изазвати проблеме приликом парсирања, само што лексер у том тренутку може бити место на којем ћете најмање посумњати да се налази грешка. Постоји неколико ствари на које треба обратити пажњу:&lt;br /&gt;
** &#039;&#039;&#039;Генералнија правила иду на дно.&#039;&#039;&#039; На пример, уколико се правило за &amp;lt;code&amp;gt;if&amp;lt;/code&amp;gt; налази испод правила за детекцију идентификатора, лексер ће &amp;lt;code&amp;gt;if&amp;lt;/code&amp;gt; препознати као идентификатор и зато ће парсер избацити грешку приликом парсирања &#039;&#039;if&#039;&#039; наредбе.&lt;br /&gt;
** На само дно убацити једно &#039;&#039;match-all&#039;&#039; правило (као што је урађено у видео водичу). Уколико то не урадите, лексер ће избацити &#039;&#039;Error: could not match input&#039;&#039; грешку уколико се наиђе на карактер који није у спецификацији Микројаве, што само по себи није проблем, али вам ваша сопствена грешка може дати више информација о томе где је тачно проблем.&lt;br /&gt;
** Уколико радите на оперативном систему &#039;&#039;Linux&#039;&#039; или &#039;&#039;macOS&#039;&#039;, потребно је одвојити правило за &amp;lt;code&amp;gt;\r\n&amp;lt;/code&amp;gt; на правила за &amp;lt;code&amp;gt;\r&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;\n&amp;lt;/code&amp;gt; како би их правилно игнорисао.&lt;br /&gt;
** У видео водичу се за препознавање идентификатора користи &amp;lt;code&amp;gt;([a-z]|[A-Z])[a-z|A-Z|0-9|_]*&amp;lt;/code&amp;gt; регуларни израз, где је карактер &amp;lt;code&amp;gt;|&amp;lt;/code&amp;gt; грешком дозвољен у оквиру идентификатора, док је правилно &amp;lt;code&amp;gt;[a-zA-Z][a-zA-Z0-9_]*&amp;lt;/code&amp;gt;. Ово је мала грешка, али може направити проблем приликом конструката попут &amp;lt;code&amp;gt;a||b&amp;lt;/code&amp;gt;, који ће бити препознати као један идентификатор уместо два идентификатора са оператором између њих.&lt;br /&gt;
&lt;br /&gt;
=== Синтаксна анализа ===&lt;br /&gt;
* Најважније правило током развоја ове фазе јесте да &#039;&#039;&#039;сва правила пишете корак по корак и са тестирањем између.&#039;&#039;&#039; Током развоја алати могу пријавити грешке које вам ни на који начин не сугеришу где је заправо проблем, и такве грешке је далеко лакше пронаћи уколико знате који део синтаксе је тестиран и ради, а који је новододат. Ово значи да када преузмете пројекат из видео водича &#039;&#039;&#039;обришете све смене из њега&#039;&#039;&#039; (осим једне, попут &amp;lt;code&amp;gt;Program ::= PROG;&amp;lt;/code&amp;gt;, како би генерисање парсера уопште радило) и кренете са додавањем смена редом по спецификацији. Кад видите да сте додали неку мању али потпуну целину, тестирајте да ли то што сте додали ради. Ако не ради, уклањањем и враћањем делова које сте додали можете лоцирати где је тачно изазвана грешка. Овакав начин развоја помоћи ће и вама и људима које питате за помоћ око евентуалних грешки.&lt;br /&gt;
* Када кренете са развојом ове фазе, најбоље је да уопште не постављате називе класа на нетерминалима. Ови називи класа се много лакше постављају након што сте већ развили целу граматику (пре следеће фазе) и имате цео контекст, а њихово додавање током развоја граматике може изазвати неке од честих грешки. Исто тако, нема потребе додељивати типове терминалима и нетерминалима док не стигнете до следеће фазе, већ је довољно само декларисати их.&lt;br /&gt;
** Уколико сте ово покушали да радите и наишли на грешке, њихова решења ће бити објашњавана у следећем одељку.&lt;br /&gt;
* Како се у оквиру ове фазе такође ради и опоравак од грешке, вредно је напоменути да је сврха тог опоравка да се пријаве све постојеће синтаксне грешке у програму (уместо да се пријави само једна и изађе), али да се при детекцији било какве грешке не наставља на следећу фазу, чак иако се од свих синтаксних грешки парсер успешно опоравио.&lt;br /&gt;
* Уколико се уместо реда за место синтаксне грешке од које се опоравља исписује колона, то је баг у алату и ангажовани на предмету неће то замерати. Ово се такође може десити у следећој фази.&lt;br /&gt;
* Грешка &#039;&#039;java.lang.NullPointerException: Cannot invoke &amp;quot;String.equals(Object)&amp;quot; because &amp;quot;X&amp;quot; is null&#039;&#039; обично значи да је негде заборављена тачка-зарез, али пошто је ово суштински грешка у имплементацији AST-CUP она не даје никаквих додатних информација о томе где би та грешка могла да буде.&lt;br /&gt;
* Грешка &#039;&#039;Syntax error X(Y)&#039;&#039; означава грешку у синтакси CUP фајла и може се десити из више разлога. Битно је напоменути да се &#039;&#039;&#039;број &#039;&#039;X&#039;&#039; односи на линију у аутогенерисаној CUP спецификацији која се налази у фајлу са суфиском &amp;lt;code&amp;gt;_astbuild.cup&amp;lt;/code&amp;gt;&#039;&#039;&#039;, а не у оригиналној CUP спецификацији, док се број &#039;&#039;Y&#039;&#039; односи на колону (карактер) у том реду где је пријављена синтаксна грешка (који није од велике користи). Разлози из којих се ова грешка дешава могу бити:&lt;br /&gt;
** заборављена тачка-зарез на крају смене,&lt;br /&gt;
** недостатак размака након зареза у декларацији терминала или нетерминала,&lt;br /&gt;
** коришћење &amp;lt;code&amp;gt;:=&amp;lt;/code&amp;gt; уместо &amp;lt;code&amp;gt;::=&amp;lt;/code&amp;gt;,&lt;br /&gt;
** и тако даље.&lt;br /&gt;
* Уколико добијате конфликте приликом имплементације &#039;&#039;if-else&#039;&#039;, поставка обично помене која тачно &amp;lt;code&amp;gt;precedence&amp;lt;/code&amp;gt; директива сме да се користи за то (и само то).&lt;br /&gt;
* Грешка која гласи &#039;&#039;java.lang.NullPointerException: Cannot invoke &amp;quot;java_cup.astext.AstSymInfo.getType()&amp;quot; because &amp;quot;this.lhInfo&amp;quot; is null&#039;&#039; значи да неки нетерминал који се користи &#039;&#039;&#039;са леве стране неке смене&#039;&#039;&#039; није претходно декларисан. За нетерминале који се користе са десне стране а нису декларисани се дешава другачија грешка која јасније каже да се ради о томе.&lt;br /&gt;
* Од користи може бити следећа скрипта за генерисање листе нетерминала које је потребно декларисати током ове фазе (која престаје да буде корисна у тренутку када нетерминалима треба додељивати типове), коју је потребно покренути &#039;&#039;Python&#039;&#039; интерпретером из кореног директоријума пројекта:&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from re import compile&lt;br /&gt;
&lt;br /&gt;
NTERM_REGEX = compile(r&#039;^(\w+)\s*::=&#039;)&lt;br /&gt;
&lt;br /&gt;
nterms = []&lt;br /&gt;
&lt;br /&gt;
with open(&#039;spec/mjparser.cup&#039;) as file:&lt;br /&gt;
    for line in file:&lt;br /&gt;
        match = NTERM_REGEX.match(line)&lt;br /&gt;
        if match:&lt;br /&gt;
            nterms.append(match.group(1))&lt;br /&gt;
&lt;br /&gt;
print(f&#039;nonterminal {&amp;quot;, &amp;quot;.join(nterms)};&#039;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Семантичка анализа ===&lt;br /&gt;
; Техничке напомене&lt;br /&gt;
* Пре почетка ове фазе не заборавите да свим терминалима који са собом носе неке смислене вредности (идентификатори, константе...) доделите тип (преко &amp;lt;code&amp;gt;terminal Tip naziv;&amp;lt;/code&amp;gt;). Уколико ово не урадите, у нетерминалима који садрже те терминале неће се изгенерисати поља са вредностима ових терминала.&lt;br /&gt;
* Такође пре почетка ове фазе потребно је свим нетерминалима доделити називе класа (уколико их не доделите, називи класа биће аутогенерисани па су као такви генерално непогодни за рад са њима). Када додељујете ове називе, битно је да се водите са два правила:&lt;br /&gt;
*# Уколико нетерминал има само једну грану, поставите да њен назив класе буде исти као и назив самог нетерминала. Ово ће генерисати једну конкретну класу за тај нетерминал.&lt;br /&gt;
*# Уколико нетерминал има више од једне гране, &#039;&#039;&#039;ниједна његова грана не сме да се зове исто као и сам нетерминал.&#039;&#039;&#039; Назив нетерминала користи се као назив апстрактне класе, а називи класа његових грана користе се за конкретне класе које су изведене из те апстрактне класе. Уколико нетерминал има више грана, и једна грана се зове исто као нетерминал, AST-CUP ће се збунити и неће знати да ли та класа треба да буде апстрактна и конкретна и ово ће испољити као грешка са конструкторима.&lt;br /&gt;
*#* Важно је напоменути да се левој и десној страни не смеју додељивати називи класа са различитом капитализацијом (&amp;lt;code&amp;gt;AssignOp&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;Assignop&amp;lt;/code&amp;gt;), јер се на фајл системима који се обично користе под &#039;&#039;Windows&#039;&#039; ови називи класа мапирају у исту Java датотеку. Ово је посебно опасно на оперативним системима &#039;&#039;Linux&#039;&#039; и &#039;&#039;macOS&#039;&#039;, где до грешки овог типа неће доћи (већ ће се оне десити тек у лабораторији).&lt;br /&gt;
* Уколико сте дошли до овог дела а потребно вам је да регенеришете парсер, не заборавите да након регенерисања парсера освежите пројекат десним кликом на пројекат и опцијом &#039;&#039;Refresh&#039;&#039;. Овај корак је потребан због тога што генерисање парсера позива спољашњи програм који без знања &#039;&#039;Eclipse&#039;&#039; мења фајлове унутар пројекта, и како би &#039;&#039;Eclipse&#039;&#039; знао да су се ти фајлови променили потребно је освежити их. Уколико ово не урадите, &#039;&#039;IntelliSense&#039;&#039; може пријављивати грешке које немају смисла и &#039;&#039;Eclipse&#039;&#039; може спречавати покретање компајлера због тога.&lt;br /&gt;
** Ово се у &#039;&#039;Eclipse&#039;&#039;-у може заобићи тако што се намести аутоматско освежавање након покретања спољашње &#039;&#039;Ant&#039;&#039; скрипте. То се ради тако што се у &#039;&#039;Project Explorer&#039;&#039;-у кликне десни клик на &#039;&#039;build.xml&#039;&#039; скрипту, онда &#039;&#039;Run as -&amp;gt; External Tools Configuration&#039;&#039;, онда се у искачућем прозору изабере таб &#039;&#039;Refresh&#039;&#039; и чекира се опција &#039;&#039;Refresh resources upon completion&#039;&#039; и &#039;&#039;The entire workspace&#039;&#039; у подменију.&lt;br /&gt;
* &amp;lt;code&amp;gt;Compiler&amp;lt;/code&amp;gt; класа је заправо скоро неизмењена &amp;lt;code&amp;gt;MJParserTest&amp;lt;/code&amp;gt; класа из видео водича, тако да можете само њу да преименујете/преместите.&lt;br /&gt;
; Табела симбола&lt;br /&gt;
* Пре рада са њиховом табелом симбола, не заборавите да у главној класи позовете &amp;lt;code&amp;gt;Tab.init()&amp;lt;/code&amp;gt;. Уколико то не урадите, грешка коју ћете добити може садржати &#039;&#039;&amp;quot;rs.etf.pp1.symboltable.Tab.currentScope&amp;quot; is null&#039;&#039;.&lt;br /&gt;
* Подразумевано, &amp;lt;code&amp;gt;Tab.dump()&amp;lt;/code&amp;gt; неће исписивати &#039;&#039;bool&#039;&#039; типове објектних чворова, јер то није имплементирано у &amp;lt;code&amp;gt;DumpSymbolTableVisitor&amp;lt;/code&amp;gt; (већ ће то место стајати празно). Пошто свакако нико није гледао испис табеле симбола на одбрани пројекта, ово никоме није ни било битно.&lt;br /&gt;
* Такође, &amp;lt;code&amp;gt;Tab.dump()&amp;lt;/code&amp;gt; може правити проблем када се као члан неке класе или као локални симбол члана неке класе нађе објекат те класе, јер тада долази до бесконачне рекурзије при испису. Једини случај кад неће доћи до ове бесконачне рекурзије јесте кад само симболи са називом &amp;lt;code&amp;gt;this&amp;lt;/code&amp;gt; носе тип те класе (у том случају се њихов тип уопште не исписује). Пошто оваквих тест примера није било, ово никоме није правило проблем.&lt;br /&gt;
* Још један проблем са бесконачном рекурзијом у њиховој табели симбола може се десити уколико поредите класне типове са њиховом имплементацијом &amp;lt;code&amp;gt;equals&amp;lt;/code&amp;gt;. Ако два класна типа имају исти број поља и метода, и барем једну методу, &amp;lt;code&amp;gt;equals&amp;lt;/code&amp;gt; ће прећи на поређење тих метода и упасти у бесконачну рекурзију. Као и претходно, пошто оваквих тест примера генерално нема ово никоме не прави проблем. Са друге стране, пошто се на ову грешку најчешће наиђе приликом провере наткласа, може се специјално за случај када се ради о две класе користити оператор &amp;lt;code&amp;gt;==&amp;lt;/code&amp;gt; за поређење референци.&lt;br /&gt;
* &amp;lt;code&amp;gt;assignableTo&amp;lt;/code&amp;gt; метода у њиховој табели симбола не проверава да ли је једна класа подкласа друге, па је ову проверу потребно имплементирати (видети такође напомену изнад).&lt;br /&gt;
* Формат исписа чвора у &amp;lt;code&amp;gt;Tab.dump()&amp;lt;/code&amp;gt; јесте &amp;lt;code&amp;gt;&amp;amp;lt;kind&amp;gt; &amp;amp;lt;name&amp;gt; &amp;amp;lt;type&amp;gt; &amp;amp;lt;adr&amp;gt; &amp;amp;lt;level&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Приликом постављања &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; поља објектним чворовима који представљају низове праве се нови &amp;lt;code&amp;gt;Struct&amp;lt;/code&amp;gt; чворови, тако да два објектна чвора са истим низовском типом неће показивати на исти објекат у позадини. Ово генерално не прави никакав проблем.&lt;br /&gt;
* Када се кроз &amp;lt;code&amp;gt;Tab.insert()&amp;lt;/code&amp;gt; убаци један објектни чвор у табелу симбола, његов &amp;lt;code&amp;gt;level&amp;lt;/code&amp;gt; се аутоматски поставља на 0 уколико се ради о глобалном досегу и 1 уколико се ради о локалном. Ово је пожељно понашање за променљиве, али за методе, чији &amp;lt;code&amp;gt;level&amp;lt;/code&amp;gt; треба да садржи број параметара, је прво потребно вратити &amp;lt;code&amp;gt;level&amp;lt;/code&amp;gt; на 0 а затим га приликом обиласка сваког чвора синтаксног стабла за параметре повећавати за 1.&lt;br /&gt;
* Уколико је потребно додати нешто у &#039;&#039;universe&#039;&#039; досег (а обично јесте), то се може обавити одмах након позивања &amp;lt;code&amp;gt;Tab.init()&amp;lt;/code&amp;gt;, и код из &amp;lt;code&amp;gt;Tab.init()&amp;lt;/code&amp;gt; се може искористити за то.&lt;br /&gt;
&lt;br /&gt;
=== Генерисање кода ===&lt;br /&gt;
* Уколико се неке варијанте &amp;lt;code&amp;gt;dup&amp;lt;/code&amp;gt; инструкције исписују као &amp;lt;code&amp;gt;???&amp;lt;/code&amp;gt; приликом дисасемблирања, то је нормално понашање.&lt;br /&gt;
* Уколико је негде потребно обилазити низ или из неког другог разлога дохватити дужину низа, то није могуће урадити током превођења, већ је потребно генерисати код који позива &amp;lt;code&amp;gt;arraylength&amp;lt;/code&amp;gt; инструкцију, која са стека скине низ а постави дужину тог низа, и затим искористити ту вредност са стека у остатку генерисаног кода.&lt;br /&gt;
* Ако су у поставци задатка дате неке глобалне функције, код за њих је потребно генерисати на неком месту (најбоље на почетку) а затим тим функцијама поставити адресу на та места где је изгенерисан код за њих.&lt;br /&gt;
* Уколико желите да након генерисања кода тај код покренете тако да се приказује ток извршења програма и стање стека, можете додати ново правило попут:&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;target name=&amp;quot;runObj debug&amp;quot; depends=&amp;quot;disasm&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;java classname=&amp;quot;rs.etf.pp1.mj.runtime.Run&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;arg value=&amp;quot;test/program.obj&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;arg value=&amp;quot;-debug&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;redirector input=&amp;quot;input.txt&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;classpath&amp;gt;&lt;br /&gt;
            &amp;lt;pathelement location=&amp;quot;lib/mj-runtime.jar&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/classpath&amp;gt;&lt;br /&gt;
    &amp;lt;/java&amp;gt;&lt;br /&gt;
&amp;lt;/target&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
** Ово вам, додуше, неће приказати садржај меморије Микројава виртуелне машине након извршених инструкција. Уколико вас то занима, можете прекопирати &amp;lt;code&amp;gt;Run&amp;lt;/code&amp;gt; класу из JAR фајла са извршним окружењем у свој пројекат, променити му пакет, поставити аргументе и &#039;&#039;breakpoint&#039;&#039;-ове на одговарајућа места (највероватније у &amp;lt;code&amp;gt;interpret&amp;lt;/code&amp;gt; методи) и покренути у дебаг режиму.&lt;br /&gt;
&lt;br /&gt;
== Одбрана ==&lt;br /&gt;
* На одбрани, пројекат се подешава тако што се &#039;&#039;Eclipse&#039;&#039; пројекат отвори помоћу опције &#039;&#039;File&#039;&#039; → &#039;&#039;Open Projects from File System&#039;&#039; и затим покрене било кроз &#039;&#039;Ant&#039;&#039; прозор било на начин показан на видео водичу.&lt;br /&gt;
* У поставци пројекта је изричито речено да су студенти дужни да осигурају да њихово решење ради на лабораторијским рачунарима. Ово генерално није толико неопходно, јер су решења генерално преносива, али уколико желите да се уверите лабораторија П26 је отворена за студентски рад радним данима до 20 часова, када се не одржавају остале лабораторијске вежбе.&lt;br /&gt;
* Одбрана пројекта изгледа тако што ангажовани на предмету прво дају модификацију и од тада студенти имају три сата да ураде модификацију и одбране пројекат. Тест примери за модификације су генерално дати на дељеним дисковима (али могу бити погрешни, јер нису били тестирани на правом пројекту). Када студент уради модификацију, позове асистента или демонстратора и они покрену пројекат на тесту за модификацију (евентуално више пута са промењеним параметрима, откоментарисаним линијама које су закоментарисане), испитају студента како је урадио модификацију, покрену јавни тест и опционо питају неко питање о самом пројекту. Уколико нешто не ради, студент може да исправља пројекат док не истекне време.&lt;br /&gt;
* Дозвољено је дељење тестова између студената, тако да пре одбране можете поделити са осталима своје тестове како би сви заједно више багова ухватили у својим пројектима.&lt;br /&gt;
&lt;br /&gt;
== Референце ==&lt;br /&gt;
* [[github:ksendzo/PP1-Projekat|Водич за пројекат 2021/2022.]] на којем су делови овог водича засновани.&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Водичи]]&lt;br /&gt;
[[Категорија:Програмски преводиоци 1]]&lt;/div&gt;</summary>
		<author><name>Fedja</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%97%D0%B0%D1%88%D1%82%D0%B8%D1%82%D0%B0_%D0%BF%D0%BE%D0%B4%D0%B0%D1%82%D0%B0%D0%BA%D0%B0/%D0%9A2_2023&amp;diff=6158</id>
		<title>Заштита података/К2 2023</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%97%D0%B0%D1%88%D1%82%D0%B8%D1%82%D0%B0_%D0%BF%D0%BE%D0%B4%D0%B0%D1%82%D0%B0%D0%BA%D0%B0/%D0%9A2_2023&amp;diff=6158"/>
		<updated>2023-05-05T17:52:32Z</updated>

		<summary type="html">&lt;p&gt;Fedja: dodata šema (((bez ikonica)))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&#039;&#039;&#039;Drugi kolokvijum 2023. godine&#039;&#039;&#039; održan je 5. maja i trajao je sat vremena. Na kolokvijumu su bili dostupni Windows 7 kalkulator, Notepad, Notepad++ i pretraživač.&lt;br /&gt;
&lt;br /&gt;
== 1. grupa ==&lt;br /&gt;
=== 1. zadatak ===&lt;br /&gt;
{{delimično rešeno}}&lt;br /&gt;
&#039;&#039;&#039;[3? poena]&#039;&#039;&#039; U šemi za distribuciju ključeva korišćenjem centra za dostavljanje ključeva (KDC) prikazanoj na slici:&lt;br /&gt;
&lt;br /&gt;
Šta predstavlja ključ &amp;lt;math&amp;gt;K_s&amp;lt;/math&amp;gt;, čemu služi, ko ga sve poseduje i ako ga poseduje više učesnika na koji način je razmenjen?&lt;br /&gt;
&lt;br /&gt;
# [[Датотека:ZP K2 2023 grupa 1 zadatak 1.svg|Šema za distribuciju ključeva|link=|class=transparent-svg]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Odgovor:&#039;&#039;&#039; &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;plain&amp;quot;&amp;gt;Odgovor na pitanje ide ovde.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. zadatak ===&lt;br /&gt;
{{delimično rešeno}}&lt;br /&gt;
&#039;&#039;&#039;[2? poena]&#039;&#039;&#039; Gmail servis danas ima 1.5 milijardi korisnika koji pristup mejlu obezbeđuje pomoću korisničkog imena i lozinke. Ako bi sistem čuvao lozinke tako što bi se čuvale kao &#039;&#039;hash&#039;&#039; (&#039;&#039;password&#039;&#039;+&#039;&#039;salt&#039;&#039;), i ako bi se koristila &#039;&#039;hash&#039;&#039; funkcija čiji je izlaz 64 bita, verovatnoća da će dve lozinke dati isti &#039;&#039;hash&#039;&#039; u ovom slučaju je (netačan odgovori nosi -25%, &amp;quot;Ne znam&amp;quot; nosi 0)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot; data-solution=&amp;quot;single&amp;quot;&amp;gt;&lt;br /&gt;
# Tačno 50%&lt;br /&gt;
# Manja od 50%&lt;br /&gt;
# Veća od 50%&lt;br /&gt;
# Ne znam&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. zadatak (3p?) ===&lt;br /&gt;
{{delimično rešeno}}&lt;br /&gt;
Ana je kreirala poruku &#039;&#039;M&#039;&#039; koja je poslala Branku dva puta. Uz poruku je oba puta poslala El Gamalov digitalni potpis poruke &#039;&#039;M&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Branko je dobio poruku i digitalne potpise, prvi put je vrednost digitalnog potpisa koju je dobio Branko bila (&amp;lt;math&amp;gt;S1=3357, S2=3376&amp;lt;/math&amp;gt;), a drugi put (&amp;lt;math&amp;gt;S1=486, S2=751&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Branko je izračunao &#039;&#039;hash&#039;&#039; dobijene poruke &#039;&#039;M&#039;&#039; i oba puta dobio vrednost &amp;lt;math&amp;gt;M=3333&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Javni elementi digitalnog potpisa su broj &amp;lt;math&amp;gt;q=4001&amp;lt;/math&amp;gt; i njegov primitivni koren &amp;lt;math&amp;gt;a=3998&amp;lt;/math&amp;gt;. Anin javni ključ je &amp;lt;math&amp;gt;T_a = 1304&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Provera El Gamalovog digitalnog potpisa se obavlja korišćenjem sledećih formula:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;V_1 = a^m \mod q&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;V_2 = T_a^{S1}S1^{S2} \mod q&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Koliko je &amp;lt;math&amp;gt;V_2&amp;lt;/math&amp;gt; koje je Branko izračunao za prvu poruku? &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;Ovaj zadatak nije rešen&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Koliko je &amp;lt;math&amp;gt;V_2&amp;lt;/math&amp;gt; koje je Branko izračunao za drugu poruku? &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;Ovaj zadatak nije rešen&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Branko može iz ovoga da zaključi (netačan odgovor nosi -1, &amp;quot;Ne znam&amp;quot; nosi 0):&lt;br /&gt;
(Napomena: Ovo pitanje nije stvarno ovako izgledalo, ali ovo je najpribližnije što se autor seća.)&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot; data-solution=&amp;quot;single&amp;quot;&amp;gt;&lt;br /&gt;
# Oba digitalna potpisa su ispravna.&lt;br /&gt;
# Ni jedan digitalni potpis nije ispravan.&lt;br /&gt;
# Prvi digitalni potpis je ispravan a drugi nije.&lt;br /&gt;
# Drugi digitalni potpis je ispravan a prvi nije.&lt;br /&gt;
# Ne znam&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 4. zadatak ===&lt;br /&gt;
{{delimično rešeno}}&lt;br /&gt;
&#039;&#039;&#039;[4? poena]&#039;&#039;&#039; Da li je u ECB (&#039;&#039;Electronic CodeBook&#039;&#039;) modu funkcionisanja moguće izvršiti enkripciju nad više blokova originalnog teksta u paraleli? A dekripciju?&lt;br /&gt;
&lt;br /&gt;
Kako na ECB mod funkcionisanja utiče greška u jednom bitu prilikom transporta nekog bloka šifrovanog teksta?&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Odgovor:&#039;&#039;&#039; &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;plain&amp;quot;&amp;gt;Odgovor na pitanje ide ovde.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 5. zadatak ===&lt;br /&gt;
{{delimično rešeno}}&lt;br /&gt;
&#039;&#039;&#039;[4? poena]&#039;&#039;&#039; TBA&lt;br /&gt;
&lt;br /&gt;
=== 6. zadatak ===&lt;br /&gt;
{{delimično rešeno}}&lt;br /&gt;
&#039;&#039;&#039;[4 poena]&#039;&#039;&#039; Šta je sve od navedenog deo PGP poruka za koju se obezbeđuje isključivo autentikacija?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot; data-solution=&amp;quot;multiple&amp;quot;&amp;gt;&lt;br /&gt;
# Sesijski ključ kojim je šifrovan potpis, šifrovan javnim ključem pošiljaoca&lt;br /&gt;
# Sesijski ključ kojim je šifrovan potpis, šifrovan privatnim ključem pošiljaoca&lt;br /&gt;
# Sesijski ključ kojim je šifrovan potpis, šifrovan javnim ključem primaoca&lt;br /&gt;
# Sesijski ključ kojim je šifrovan potpis, šifrovan privatnim ključem primaoca&lt;br /&gt;
# Identifikator javnog ključa pošiljaoca&lt;br /&gt;
# Identifikator privatnog ključa pošiljaoca&lt;br /&gt;
# Identifikator javnog ključa primaoca&lt;br /&gt;
# Identifikator privatnog ključa primaoca&lt;br /&gt;
# Identifikator algoritma za asimetrične ključeve&lt;br /&gt;
# Identifikator algoritma za simetrične ključeve&lt;br /&gt;
# Identifikator algoritma za hash&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:Заштита података]]&lt;/div&gt;</summary>
		<author><name>Fedja</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%94%D0%B0%D1%82%D0%BE%D1%82%D0%B5%D0%BA%D0%B0:ZP_K2_2023_grupa_1_zadatak_1.svg&amp;diff=6157</id>
		<title>Датотека:ZP K2 2023 grupa 1 zadatak 1.svg</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%94%D0%B0%D1%82%D0%BE%D1%82%D0%B5%D0%BA%D0%B0:ZP_K2_2023_grupa_1_zadatak_1.svg&amp;diff=6157"/>
		<updated>2023-05-05T17:49:43Z</updated>

		<summary type="html">&lt;p&gt;Fedja: Нова страница: {{file | description = Шема из првог задатка за другу групу на другом колоквијуму 2023. године (без иконица `:pensive:`). | author      = Предметни професори и сарадници | source      = Памћење }}&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{file&lt;br /&gt;
| description = Шема из [[Заштита података/К2 2023#1. zadatak 2|првог задатка за другу групу на другом колоквијуму 2023. године (без иконица `:pensive:`)]].&lt;br /&gt;
| author      = Предметни професори и сарадници&lt;br /&gt;
| source      = Памћење&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Fedja</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%97%D0%B0%D1%88%D1%82%D0%B8%D1%82%D0%B0_%D0%BF%D0%BE%D0%B4%D0%B0%D1%82%D0%B0%D0%BA%D0%B0/%D0%9A2_2023&amp;diff=6154</id>
		<title>Заштита података/К2 2023</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%97%D0%B0%D1%88%D1%82%D0%B8%D1%82%D0%B0_%D0%BF%D0%BE%D0%B4%D0%B0%D1%82%D0%B0%D0%BA%D0%B0/%D0%9A2_2023&amp;diff=6154"/>
		<updated>2023-05-05T17:13:56Z</updated>

		<summary type="html">&lt;p&gt;Fedja: plaintext solution za 1. i 4. zadatak&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{nerešeno}}&lt;br /&gt;
{{tocright}}&lt;br /&gt;
&#039;&#039;&#039;Drugi kolokvijum 2023. godine&#039;&#039;&#039; održan je 5. maja i trajao je sat vremena.&lt;br /&gt;
&lt;br /&gt;
== 1. grupa ==&lt;br /&gt;
=== 1. zadatak (3p?) ===&lt;br /&gt;
U šemi za distribuciju ključeva korišćenjem centra za dostavljanje ključeva (KDC) prikazanoj na slici:&lt;br /&gt;
&lt;br /&gt;
Šta predstavlja ključ &amp;lt;math&amp;gt;K_s&amp;lt;/math&amp;gt;, čemu služi, ko ga sve poseduje i ako ga poseduje više učesnika na koji način je razmenjen?&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Odgovor:&#039;&#039;&#039; &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;plain&amp;quot;&amp;gt;Odgovor na pitanje ide ovde.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. zadatak (2p?) ===&lt;br /&gt;
Gmail servis danas ima 1.5 milijardi korisnika koji pristup mejlu obezbeđuje pomoću korisničkog imena i lozinke. Ako bi sistem čuvao lozinke tako što bi se čuvale kao &#039;&#039;hash&#039;&#039; (&#039;&#039;password&#039;&#039;+&#039;&#039;salt&#039;&#039;), i ako bi se koristila &#039;&#039;hash&#039;&#039; funkcija čiji je izlaz 64 bita, verovatnoća da će dve lozinke dati isti &#039;&#039;hash&#039;&#039; u ovom slučaju je (netačan odgovori nosi -25%, &amp;quot;Ne znam&amp;quot; nosi 0)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot; data-solution=&amp;quot;single&amp;quot;&amp;gt;&lt;br /&gt;
# Tačno 50%&lt;br /&gt;
# Manja od 50%&lt;br /&gt;
# Veća od 50%&lt;br /&gt;
# Ne znam&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. zadatak (3p?) ===&lt;br /&gt;
Ana je kreirala poruku &#039;&#039;M&#039;&#039; koja je poslala Branku dva puta. Uz poruku je oba puta poslala El Gamalov digitalni potpis poruke &#039;&#039;M&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Branko je dobio poruku i digitalne potpise, prvi put je vrednost digitalnog potpisa koju je dobio Branko bila (&amp;lt;math&amp;gt;S1=3357, S2=3376&amp;lt;/math&amp;gt;), a drugi put (&amp;lt;math&amp;gt;S1=486, S2=751&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Branko je izračunao &#039;&#039;hash&#039;&#039; dobijene poruke &#039;&#039;M&#039;&#039; i oba puta dobio vrednost &amp;lt;math&amp;gt;M=3333&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Javni elementi digitalnog potpisa su broj &amp;lt;math&amp;gt;q=4001&amp;lt;/math&amp;gt; i njegov primitivni koren &amp;lt;math&amp;gt;a=3998&amp;lt;/math&amp;gt;. Anin javni ključ je &amp;lt;math&amp;gt;T_a = 1304&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Provera El Gamalovog digitalnog potpisa se obavlja korišćenjem sledećih formula:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;V_1 = a^m \mod q&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;V_2 = T_a^{S1}S1^{S2} \mod q&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Koliko je &amp;lt;math&amp;gt;V_2&amp;lt;/math&amp;gt; koje je Branko izračunao za prvu poruku? &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;Ovaj zadatak nije rešen&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Koliko je &amp;lt;math&amp;gt;V_2&amp;lt;/math&amp;gt; koje je Branko izračunao za drugu poruku? &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;Ovaj zadatak nije rešen&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Branko može iz ovoga da zaključi (netačan odgovor nosi -1, &amp;quot;Ne znam&amp;quot; nosi 0):&lt;br /&gt;
(Napomena: Ovo pitanje nije stvarno ovako izgledalo, ali ovo je najpribližnije što se autor seća.)&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot; data-solution=&amp;quot;single&amp;quot;&amp;gt;&lt;br /&gt;
# Oba digitalna potpisa su ispravna.&lt;br /&gt;
# Ni jedan digitalni potpis nije ispravan.&lt;br /&gt;
# Prvi digitalni potpis je ispravan a drugi nije.&lt;br /&gt;
# Drugi digitalni potpis je ispravan a prvi nije.&lt;br /&gt;
# Ne znam&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 4. zadatak (4p?) ===&lt;br /&gt;
Da li je u ECB (&#039;&#039;Electronic CodeBook&#039;&#039;) modu funkcionisanja moguće izvršiti enkripciju nad više blokova originalnog teksta u paraleli? A dekripciju?&lt;br /&gt;
&lt;br /&gt;
Kako na ECB mod funkcionisanja utiče greška u jednom bitu prilikom transporta nekog bloka šifrovanog teksta?&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Odgovor:&#039;&#039;&#039; &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;plain&amp;quot;&amp;gt;Odgovor na pitanje ide ovde.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 5. zadatak (4p?) ===&lt;br /&gt;
TBA&lt;br /&gt;
&lt;br /&gt;
=== 6. zadatak (4p?) ===&lt;br /&gt;
Šta je sve od navedenog deo PGP poruka za koju se obezbeđuje isključivo autentikacija?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot; data-solution=&amp;quot;multiple&amp;quot;&amp;gt;&lt;br /&gt;
# Sesijski ključ kojim je šifrovan potpis, šifrovan javnim ključem pošiljaoca&lt;br /&gt;
# Sesijski ključ kojim je šifrovan potpis, šifrovan privatnim ključem pošiljaoca&lt;br /&gt;
# Sesijski ključ kojim je šifrovan potpis, šifrovan javnim ključem primaoca&lt;br /&gt;
# Sesijski ključ kojim je šifrovan potpis, šifrovan privatnim ključem primaoca&lt;br /&gt;
# Identifikator javnog ključa pošiljaoca&lt;br /&gt;
# Identifikator privatnog ključa pošiljaoca&lt;br /&gt;
# Identifikator javnog ključa primaoca&lt;br /&gt;
# Identifikator privatnog ključa primaoca&lt;br /&gt;
# Identifikator algoritma za asimetrične ključeve&lt;br /&gt;
# Identifikator algoritma za simetrične ključeve&lt;br /&gt;
# Identifikator algoritma za hash&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:Заштита података]]&lt;/div&gt;</summary>
		<author><name>Fedja</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%97%D0%B0%D1%88%D1%82%D0%B8%D1%82%D0%B0_%D0%BF%D0%BE%D0%B4%D0%B0%D1%82%D0%B0%D0%BA%D0%B0/%D0%9A2_2023&amp;diff=6153</id>
		<title>Заштита података/К2 2023</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%97%D0%B0%D1%88%D1%82%D0%B8%D1%82%D0%B0_%D0%BF%D0%BE%D0%B4%D0%B0%D1%82%D0%B0%D0%BA%D0%B0/%D0%9A2_2023&amp;diff=6153"/>
		<updated>2023-05-05T17:12:20Z</updated>

		<summary type="html">&lt;p&gt;Fedja: k2 2023&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{nerešeno}}&lt;br /&gt;
{{tocright}}&lt;br /&gt;
&#039;&#039;&#039;Drugi kolokvijum 2023. godine&#039;&#039;&#039; održan je 5. maja i trajao je sat vremena.&lt;br /&gt;
&lt;br /&gt;
== 1. grupa ==&lt;br /&gt;
=== 1. zadatak (3p?) ===&lt;br /&gt;
U šemi za distribuciju ključeva korišćenjem centra za dostavljanje ključeva (KDC) prikazanoj na slici:&lt;br /&gt;
&lt;br /&gt;
Šta predstavlja ključ &amp;lt;math&amp;gt;K_s&amp;lt;/math&amp;gt;, čemu služi, ko ga sve poseduje i ako ga poseduje više učesnika na koji način je razmenjen?&lt;br /&gt;
&lt;br /&gt;
Odgovor: &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;Odgovor na pitanje iznad ide ovde&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. zadatak (2p?) ===&lt;br /&gt;
Gmail servis danas ima 1.5 milijardi korisnika koji pristup mejlu obezbeđuje pomoću korisničkog imena i lozinke. Ako bi sistem čuvao lozinke tako što bi se čuvale kao &#039;&#039;hash&#039;&#039; (&#039;&#039;password&#039;&#039;+&#039;&#039;salt&#039;&#039;), i ako bi se koristila &#039;&#039;hash&#039;&#039; funkcija čiji je izlaz 64 bita, verovatnoća da će dve lozinke dati isti &#039;&#039;hash&#039;&#039; u ovom slučaju je (netačan odgovori nosi -25%, &amp;quot;Ne znam&amp;quot; nosi 0)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot; data-solution=&amp;quot;single&amp;quot;&amp;gt;&lt;br /&gt;
# Tačno 50%&lt;br /&gt;
# Manja od 50%&lt;br /&gt;
# Veća od 50%&lt;br /&gt;
# Ne znam&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. zadatak (3p?) ===&lt;br /&gt;
Ana je kreirala poruku &#039;&#039;M&#039;&#039; koja je poslala Branku dva puta. Uz poruku je oba puta poslala El Gamalov digitalni potpis poruke &#039;&#039;M&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Branko je dobio poruku i digitalne potpise, prvi put je vrednost digitalnog potpisa koju je dobio Branko bila (&amp;lt;math&amp;gt;S1=3357, S2=3376&amp;lt;/math&amp;gt;), a drugi put (&amp;lt;math&amp;gt;S1=486, S2=751&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Branko je izračunao &#039;&#039;hash&#039;&#039; dobijene poruke &#039;&#039;M&#039;&#039; i oba puta dobio vrednost &amp;lt;math&amp;gt;M=3333&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Javni elementi digitalnog potpisa su broj &amp;lt;math&amp;gt;q=4001&amp;lt;/math&amp;gt; i njegov primitivni koren &amp;lt;math&amp;gt;a=3998&amp;lt;/math&amp;gt;. Anin javni ključ je &amp;lt;math&amp;gt;T_a = 1304&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Provera El Gamalovog digitalnog potpisa se obavlja korišćenjem sledećih formula:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;V_1 = a^m \mod q&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;V_2 = T_a^{S1}S1^{S2} \mod q&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Koliko je &amp;lt;math&amp;gt;V_2&amp;lt;/math&amp;gt; koje je Branko izračunao za prvu poruku? &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;Ovaj zadatak nije rešen&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Koliko je &amp;lt;math&amp;gt;V_2&amp;lt;/math&amp;gt; koje je Branko izračunao za drugu poruku? &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;Ovaj zadatak nije rešen&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Branko može iz ovoga da zaključi (netačan odgovor nosi -1, &amp;quot;Ne znam&amp;quot; nosi 0):&lt;br /&gt;
(Napomena: Ovo pitanje nije stvarno ovako izgledalo, ali ovo je najpribližnije što se autor seća.)&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot; data-solution=&amp;quot;single&amp;quot;&amp;gt;&lt;br /&gt;
# Oba digitalna potpisa su ispravna.&lt;br /&gt;
# Ni jedan digitalni potpis nije ispravan.&lt;br /&gt;
# Prvi digitalni potpis je ispravan a drugi nije.&lt;br /&gt;
# Drugi digitalni potpis je ispravan a prvi nije.&lt;br /&gt;
# Ne znam&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 4. zadatak (4p?) ===&lt;br /&gt;
Da li je u ECB (&#039;&#039;Electronic CodeBook&#039;&#039;) modu funkcionisanja moguće izvršiti enkripciju nad više blokova originalnog teksta u paraleli? A dekripciju?&lt;br /&gt;
&lt;br /&gt;
Kako na ECB mod funkcionisanja utiče greška u jednom bitu prilikom transporta nekog bloka šifrovanog teksta?&lt;br /&gt;
&lt;br /&gt;
Odgovor: &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;Odgovor na pitanje iznad ide ovde&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 5. zadatak (4p?) ===&lt;br /&gt;
TBA&lt;br /&gt;
&lt;br /&gt;
=== 6. zadatak (4p?) ===&lt;br /&gt;
Šta je sve od navedenog deo PGP poruka za koju se obezbeđuje isključivo autentikacija?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot; data-solution=&amp;quot;multiple&amp;quot;&amp;gt;&lt;br /&gt;
# Sesijski ključ kojim je šifrovan potpis, šifrovan javnim ključem pošiljaoca&lt;br /&gt;
# Sesijski ključ kojim je šifrovan potpis, šifrovan privatnim ključem pošiljaoca&lt;br /&gt;
# Sesijski ključ kojim je šifrovan potpis, šifrovan javnim ključem primaoca&lt;br /&gt;
# Sesijski ključ kojim je šifrovan potpis, šifrovan privatnim ključem primaoca&lt;br /&gt;
# Identifikator javnog ključa pošiljaoca&lt;br /&gt;
# Identifikator privatnog ključa pošiljaoca&lt;br /&gt;
# Identifikator javnog ključa primaoca&lt;br /&gt;
# Identifikator privatnog ključa primaoca&lt;br /&gt;
# Identifikator algoritma za asimetrične ključeve&lt;br /&gt;
# Identifikator algoritma za simetrične ključeve&lt;br /&gt;
# Identifikator algoritma za hash&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:Заштита података]]&lt;/div&gt;</summary>
		<author><name>Fedja</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9E%D0%9E2/%D0%9A_2023&amp;diff=6101</id>
		<title>ОО2/К 2023</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9E%D0%9E2/%D0%9A_2023&amp;diff=6101"/>
		<updated>2023-04-22T17:00:39Z</updated>

		<summary type="html">&lt;p&gt;Fedja: Fedja преместио је страницу K 2023 на ОО2/К 2023: smotan op&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&#039;&#039;&#039;Колоквијум 2023. godine&#039;&#039;&#039; на РТИ (и осталим ЕР одсецима) одржан је 22. арпила У 9:15 часова (постојала је само једна група). Од области дошли су увод, преглед, класе, пакети, извођење, интерфејси, изузеци и угњеждени типови на програмском језику Java.&lt;br /&gt;
{{rešenja}}&lt;br /&gt;
&lt;br /&gt;
== 1. zadatak ==&lt;br /&gt;
Којом командом се следећи програмски код написан у фајлу са именом &amp;quot;Pozdrav.java&amp;quot; преводи и креира бајткод &amp;quot;Pozdrav.class&amp;quot;?&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
//Pozdrav.java&lt;br /&gt;
public class Pozdrav {&lt;br /&gt;
     public static void main(String[] args) {&lt;br /&gt;
          System.out.print(&amp;quot;Zdravo!&amp;quot;);&lt;br /&gt;
     }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot; data-solution=&amp;quot;single&amp;quot;&amp;gt;&lt;br /&gt;
# java Pozdrav&lt;br /&gt;
# java Pozdrav.java&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;javac Pozdrav.java&amp;lt;/span&amp;gt;&lt;br /&gt;
# javac Pozdrav.class&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2. zadatak ==&lt;br /&gt;
Која од следећих тврђења су тачна за програмски језик &#039;&#039;Java&#039;&#039;?&lt;br /&gt;
&lt;br /&gt;
Изаберите један или више одговора:&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot; data-solution=&amp;quot;multiple&amp;quot;&amp;gt;&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;&#039;&#039;&#039;goto&#039;&#039;&#039; је резервисана реч и не може се користити за име порменљиве.&amp;lt;/span&amp;gt;&lt;br /&gt;
# &#039;&#039;&#039;foreach&#039;&#039;&#039; је резервисана реч и користи се у инструкцији петље за обилазак свих елемената низа.&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;&#039;&#039;&#039;final&#039;&#039;&#039; је резервисана реч и не може се користити за име порменљиве.&amp;lt;/span&amp;gt;&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;&#039;&#039;&#039;const&#039;&#039;&#039; је резервисана реч и не може се користити за име порменљиве.&amp;lt;/span&amp;gt;&lt;br /&gt;
# &#039;&#039;&#039;const&#039;&#039;&#039; је резервисана реч која може да се користи алтернативно са резервисаном речју &#039;&#039;&#039;final&#039;&#039;&#039;. &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 3. zadatak ==&lt;br /&gt;
Не узимајући у обзир угњеждене и обухватајуће (спољашње) класе, спојити наведене модификаторе права приступа са њиховим одговарајућим описом на програмском језику &#039;&#039;Java&#039;&#039;?&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot; data-solution=&amp;quot;select&amp;quot; data-options=&amp;quot;Изабери..., Члан је доступан само у коду датог пакета. , Члан је доступан само у класи у којој је дефенисан., Члан је доступан на свим местима на којима се може приступити и типу у којем је члан дефинисан., Члан је доступан само у изведеним поткласама и коду целог пакета у којем се налази класа у којој је члан дефинисан.&amp;quot;&amp;gt;&lt;br /&gt;
# (без модификатора, подразумевано) &amp;lt;span class=&amp;quot;spoiler&amp;quot;&amp;gt;Члан је доступан само у коду датог пакета.&amp;lt;/span&amp;gt;&lt;br /&gt;
# private &amp;lt;span class=&amp;quot;spoiler&amp;quot;&amp;gt;Члан је доступан само у класи у којој је дефенисан.&amp;lt;/span&amp;gt;&lt;br /&gt;
# public &amp;lt;span class=&amp;quot;spoiler&amp;quot;&amp;gt;Члан је доступан на свим местима на којима се може приступити и типу у којем је члан дефинисан.&amp;lt;/span&amp;gt;&lt;br /&gt;
# protected &amp;lt;span class=&amp;quot;spoiler&amp;quot;&amp;gt;Члан је доступан само у изведеним поткласама и коду целог пакета у којем се налази класа у којој је члан дефинисан.&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 4. zadatak ==&lt;br /&gt;
Која од следећих тврђења су тачна за кључну реч &#039;&#039;&#039;this&#039;&#039;&#039; на програмском језику &#039;&#039;Java&#039;&#039;?&lt;br /&gt;
&lt;br /&gt;
Изаберите један или више одговора:&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot; data-solution=&amp;quot;multiple&amp;quot;&amp;gt;&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Може да се користи за позив другог конструктора исте класе.&amp;lt;/span&amp;gt;&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Може да се проследи као ствaрни аргумент неком методу.&amp;lt;/span&amp;gt;&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Користи се имплицитно (без навођења) као референца на текући објекат приликом директног именовања нестатичких чланова класе.&amp;lt;/span&amp;gt;&lt;br /&gt;
# Може да се користи као референца унутар статичких метода.&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Представља референцу на објекат коме се управо приступа.&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
== 5. zadatak ==&lt;br /&gt;
Која од следећих тврђења су тачна на програмском језику &#039;&#039;Java&#039;&#039;?&lt;br /&gt;
&lt;br /&gt;
Изаберите један или више одговора:&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot; data-solution=&amp;quot;multiple&amp;quot;&amp;gt;&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;У неком фајлу са изворним кодом једног програма може да постоји декларација &#039;&#039;&#039;package p.sp;&#039;&#039;&#039; иако ни у једном фајлу истог програма не постоји декларација &#039;&#039;&#039;package p;&#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Могуће је дефинисати тип &#039;&#039;&#039;А&#039;&#039;&#039; у пакету &#039;&#039;&#039;p&#039;&#039;&#039; уколико је истоимени тип већ дефинисан у пакету &#039;&#039;&#039;p.sp&#039;&#039;&#039;.&amp;lt;/span&amp;gt;&lt;br /&gt;
# Уколико постоје пакети &#039;&#039;&#039;p&#039;&#039;&#039; и &#039;&#039;&#039;p.sp&#039;&#039;&#039; увођењем свих чланова пакета &#039;&#039;&#039;p&#039;&#039;&#039; наредбом &#039;&#039;&#039;import p.*;&#039;&#039;&#039; уводе се и сви чланови пакета &#039;&#039;&#039;p.sp&#039;&#039;&#039;.&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Типови подата у изворној датотеци без декларације пакета биће смештани у безимени (&#039;&#039;default&#039;&#039;) пакет.&amp;lt;/span&amp;gt;&lt;br /&gt;
#Могуће је приступити члану са пакетски правом приступа класе &#039;&#039;&#039;А&#039;&#039;&#039; дефинисане у пакету &#039;&#039;&#039;p&#039;&#039;&#039; из метода класе &#039;&#039;&#039;В&#039;&#039;&#039; дефинисане у пакету &#039;&#039;&#039;p.sp&#039;&#039;&#039;.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
== 6. zadatak ==&lt;br /&gt;
Шта исписује следећи програм на прогрмаском језику &#039;&#039;Java&#039;&#039;?Уписати &#039;&#039;&#039;NP&#039;&#039;&#039; ако се програм не преводи.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
class Б {&lt;br /&gt;
    public void f(B x) {&lt;br /&gt;
        System.out.println(1);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
class D extends B {&lt;br /&gt;
    public void f(D x) {&lt;br /&gt;
        System.out.println(2);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class Test {&lt;br /&gt;
    public static void main(String args[]) {&lt;br /&gt;
        B b = new B();&lt;br /&gt;
        b.f(new D());&lt;br /&gt;
        b = new D();&lt;br /&gt;
        b.f(new D());&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Odgovor: &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;11&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Objašnjenje: &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;explanation&amp;quot;&amp;gt;Ovde se primenjuje overloading, a ne overriding.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 7. zadatak ==&lt;br /&gt;
Шта исписује следећи програм на прогрмаском језику &#039;&#039;Java&#039;&#039;?Уписати &#039;&#039;&#039;NP&#039;&#039;&#039; ако се програм не преводи.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
interface I {&lt;br /&gt;
    static void f() {&lt;br /&gt;
        System.out.println(1);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
class Б {&lt;br /&gt;
    public void f() {&lt;br /&gt;
        System.out.println(2);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
class D extends B implements I {&lt;br /&gt;
    public D() {&lt;br /&gt;
        I.f();&lt;br /&gt;
        f();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class Test {&lt;br /&gt;
    public static void main(String args[]) {&lt;br /&gt;
        new D();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Odgovor: &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;12&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 8. zadatak ==&lt;br /&gt;
&lt;br /&gt;
== 9. zadatak ==&lt;br /&gt;
Које дефиниције угњеждених типова на језику &#039;&#039;Java&#039;&#039; су исправне?&lt;br /&gt;
&lt;br /&gt;
Изаберите један или више одговора:&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot; data-solution=&amp;quot;multiple&amp;quot;&amp;gt;&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;static class C {}&amp;lt;/span&amp;gt;&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;abstract class C {}&amp;lt;/span&amp;gt;&lt;br /&gt;
# local class C {}&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt; class C {}&amp;lt;/span&amp;gt;&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt; final class C {}&amp;lt;/span&amp;gt;&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt; static interface I {}&amp;lt;/span&amp;gt;&lt;br /&gt;
# annonymous class {}&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt; interface I {}&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
== 10. zadatak ==&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:ОО2]]&lt;/div&gt;</summary>
		<author><name>Fedja</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%91%D0%B0%D0%B7%D0%B5_%D0%BF%D0%BE%D0%B4%D0%B0%D1%82%D0%B0%D0%BA%D0%B0_2/%D0%9A1_2023&amp;diff=6078</id>
		<title>Базе података 2/К1 2023</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%91%D0%B0%D0%B7%D0%B5_%D0%BF%D0%BE%D0%B4%D0%B0%D1%82%D0%B0%D0%BA%D0%B0_2/%D0%9A1_2023&amp;diff=6078"/>
		<updated>2023-04-12T15:21:12Z</updated>

		<summary type="html">&lt;p&gt;Fedja: које године&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&#039;&#039;&#039;Први колоквијум 2023. године&#039;&#039;&#039; је први колоквијум икад, одржан 8. априла 2023. године.&lt;br /&gt;
&lt;br /&gt;
== Поставка ==&lt;br /&gt;
Компанија уговара пројекте израде софтвера по наруџбинама клијента. У компанији су запослени програмери и менаџери.&lt;br /&gt;
У систему се води евиденција о сваком кораку рада (захтевима, развијеном коду, додели посла). За сваки пројекат неког клијента евидентирају се датум креирања, менаџер, као и сви кориснички захтеви. Пре него што пројекат почне он мора бити испланиран (статус I). Имплементација може почети тек након што се пројекат имплементира. Током имплементације, целокупан код који програмери развију се такође евидентира у систему и то тако што се за сваки код евидентира које корисничке захтеве имплементира. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Шема базе:&lt;br /&gt;
&lt;br /&gt;
 Klijent (&amp;lt;u&amp;gt;SifК&amp;lt;/u&amp;gt;, Naziv, Kontakt)&lt;br /&gt;
 Radnik (&amp;lt;u&amp;gt;SifR&amp;lt;/u&amp;gt;, Ime)&lt;br /&gt;
 Menadzer (&amp;lt;u&amp;gt;SifR&amp;lt;/u&amp;gt;, Iskustvo)&lt;br /&gt;
 Programer (&amp;lt;u&amp;gt;SifR&amp;lt;/u&amp;gt;, Specijalnost)&lt;br /&gt;
 Projekat (&amp;lt;u&amp;gt;SifP&amp;lt;/u&amp;gt;, Naziv, Status, Vrednost, DatumPocetka, BrojProgramera, MaksProgramera, SifK, SifR)&lt;br /&gt;
 Zahtev (&amp;lt;u&amp;gt;SifZ&amp;lt;/u&amp;gt;, Opis, SiP)&lt;br /&gt;
 Posao (&amp;lt;u&amp;gt;SifJ&amp;lt;/u&amp;gt;, DatumPocetka, DatumKraja, BrPlaniranihProgramera, SifP, SifZ)&lt;br /&gt;
 Angazman (&amp;lt;u&amp;gt;SifA&amp;lt;/u&amp;gt;, SifR, SifJ)&lt;br /&gt;
 Kod (&amp;lt;u&amp;gt;SifK&amp;lt;/u&amp;gt;, Kod)&lt;br /&gt;
 Implementira (&amp;lt;u&amp;gt;SifK&amp;lt;/u&amp;gt;, &amp;lt;u&amp;gt;SifZ&amp;lt;/u&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
Статус: K, I, Z - креиран, испланиран, завршен.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 1. задатак ==&lt;br /&gt;
Написати исказ релационе алгебре који даје шифре менаџера који су били надлежни за више од једног пројекта вредности преко 1000. Оператор груписања није дозвољен.&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\Pi_{\texttt{SifR}}\left(\sigma_{\texttt{Vrednost} &amp;gt; 1000}\left(\rho_{\texttt{P1}}(\texttt{Projekat}) \bowtie_{ \texttt{P1.SifP} &amp;gt; \texttt{P2.SifP} \land \texttt{P1.SifR} = \texttt{P2.SifR} } \rho_{\texttt{P2}}(\texttt{Projekat})\right)\right)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
== 2. задатак ==&lt;br /&gt;
{{делимично_решено}}&lt;br /&gt;
Написати исказ релационе алгебре који даје шифре менаџера који даје шифре програмера који су били ангажовани на свим пословима пројекта &amp;quot;ETФ&amp;quot;. Оператор груписања није дозвољен.&lt;br /&gt;
&lt;br /&gt;
== 3. задатак ==&lt;br /&gt;
За дати исказ релационе алгебре дати еквивалентат SQL упит: &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\Pi_{\texttt{SifR}} &lt;br /&gt;
\left( \texttt{Angazman} \bowtie &lt;br /&gt;
\left( \sigma_{\texttt{BrojPlaniranih} &amp;gt; 5} \left( \texttt{Posao} \right) \right)&lt;br /&gt;
- &lt;br /&gt;
\Pi_{\texttt{SifJ}} \left( \sigma_{\texttt{BrojPlaniranih} &amp;gt; 10} \left( \texttt{Posao} \right) \right)&lt;br /&gt;
\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT SifR&lt;br /&gt;
FROM Angazman NATURAL JOIN (SELECT * FROM Posao WHERE BrojPlaniranih &amp;gt; 5)&lt;br /&gt;
EXCEPT&lt;br /&gt;
SELECT SifJ&lt;br /&gt;
FROM Posao&lt;br /&gt;
WHERE BrojPlaniranih &amp;gt; 10&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:Базе података 2]]&lt;/div&gt;</summary>
		<author><name>Fedja</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%91%D0%B0%D0%B7%D0%B5_%D0%BF%D0%BE%D0%B4%D0%B0%D1%82%D0%B0%D0%BA%D0%B0_2&amp;diff=6077</id>
		<title>Базе података 2</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%91%D0%B0%D0%B7%D0%B5_%D0%BF%D0%BE%D0%B4%D0%B0%D1%82%D0%B0%D0%BA%D0%B0_2&amp;diff=6077"/>
		<updated>2023-04-12T15:20:23Z</updated>

		<summary type="html">&lt;p&gt;Fedja: dpl za klk/ispite&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Предмет&lt;br /&gt;
| шифра     = 13С113БП2, 13Е113БП2&lt;br /&gt;
| семестар  = 6 (СИ), 8&lt;br /&gt;
| статус    = изборни&lt;br /&gt;
| страница  = [https://bp2.etf.bg.ac.rs bp2.etf.rs]&lt;br /&gt;
| одсек     = СИ, РТИ&lt;br /&gt;
| претходни = Базе података 1&lt;br /&gt;
}}&lt;br /&gt;
&#039;&#039;&#039;Базе података 2&#039;&#039;&#039; је изборни предмет у шестом и осмом семестру на СИ, а само осмом на РТИ. &lt;br /&gt;
&lt;br /&gt;
== Корисне везе ==&lt;br /&gt;
{{непотпун одељак}}&lt;br /&gt;
&amp;lt;!-- Овде иде листа (спољашњих, не на викију) веза до свих корисних страница у вези са предметом, укључујући материјале поменуте на [[Остали материјали]].. --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Прво иду везе до званичних страница, па онда осталих, уређених по корисности --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Остале корисне везе, попут веза до развојних окружења која се користе на предмету --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Корисно је сумаризовати поред сваког линка какви се материјали налазе на њему (рокови, решења, белешке, водичи, лабови, модификације) --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Настава ==&lt;br /&gt;
{{непотпун одељак}}&lt;br /&gt;
&amp;lt;!-- Овде се наводе све битне информације у вези са предавањима и вежбама на предмету, као и потребни материјали. --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Информације које вреди поменути: које се области прелазе у којем блоку, која се развојна окружења користе, шта обично долази за који колоквијум, где могу да се нађу белешке и презентације, да ли се настава на предмету уопште држи (ако се не држи то треба назначити како би било јасно да викију не недостају информације по том питању), да ли су предавања или вежбе бескорисне --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Пројекат ==&lt;br /&gt;
{{непотпун одељак}}&lt;br /&gt;
&amp;lt;!-- Овде се наводе све битне информације у вези са пројектом на предмету, као и потребни материјали. --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Информације које вреди поменути: окружења за израду, шта се ради на домаћем, водичи за домаћи (уколико су довољно слични из године у годину), где наћи старе домаће, колико бодова носе, када се предају, како изгледа одбрана, да ли је обавезан, корисни материјали --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Лабораторијске вежбе ==&lt;br /&gt;
{{непотпун одељак}}&lt;br /&gt;
&amp;lt;!-- Овде се наводе све битне информације у вези са лабораторијским вежбама на предмету, као и потребни материјали. --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Информације које вреди поменути: када се одржавају, шта се на њима ради, шта се ради пре лабораторијске вежбе, у ком окружењу се ради, колико бодова носе, где наћи претходне лабораторијске вежбе, водичи за израду --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Испитни рокови ==&lt;br /&gt;
{{#dpl:&lt;br /&gt;
| category    = Базе података 2&lt;br /&gt;
| category    = Рокови&lt;br /&gt;
| format      = ,\n* [[%PAGE%|²{#invoke:String¦sub¦%PAGE%¦17¦-1}²]],,&lt;br /&gt;
| ordermethod = title&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Начин оцењивања ==&lt;br /&gt;
* &#039;&#039;&#039;K1&#039;&#039;&#039;, &#039;&#039;&#039;K2&#039;&#039;&#039; — Бодови са првог (0-10 бодова) и другог (0-15 бодова) колоквијума.&lt;br /&gt;
* &#039;&#039;&#039;I&#039;&#039;&#039; — Бодови са испита (0-30).&lt;br /&gt;
* &#039;&#039;&#039;L1&#039;&#039;&#039;, &#039;&#039;&#039;L2&#039;&#039;&#039; — Бодови са лабораторијских вежби, прва носи 5 а друга 10 бодова.&lt;br /&gt;
* &#039;&#039;&#039;Pr&#039;&#039;&#039; — Бодови са пројекта (0-30).&lt;br /&gt;
* &#039;&#039;&#039;P&#039;&#039;&#039; — Коначан број бодова: &amp;lt;math&amp;gt;P = K_1 + K_2 + I + L_1 + L_2 + Pr&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Бодови&lt;br /&gt;
| &amp;lt;math&amp;gt;P \leq 50&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;50 &amp;lt; P \leq 60&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;60 &amp;lt; P \leq 70&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;70 &amp;lt; P \leq 80&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;80 &amp;lt; P \leq 90&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;90 &amp;lt; P&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Оцена&lt;br /&gt;
| 5 || 6 || 7 || 8 || 9 || 10&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Рачунање ===&lt;br /&gt;
&amp;lt;div class=&amp;quot;calculator&amp;quot;&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;K_1&amp;lt;/math&amp;gt;: &amp;lt;span data-variable=&amp;quot;K1&amp;quot; data-max=&amp;quot;10&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;K_2&amp;lt;/math&amp;gt;: &amp;lt;span data-variable=&amp;quot;K2&amp;quot; data-max=&amp;quot;15&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt;: &amp;lt;span data-variable=&amp;quot;I&amp;quot; data-max=&amp;quot;30&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;L_1&amp;lt;/math&amp;gt;: &amp;lt;span data-variable=&amp;quot;L1&amp;quot; data-max=&amp;quot;5&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;L_2&amp;lt;/math&amp;gt;: &amp;lt;span data-variable=&amp;quot;L2&amp;quot; data-max=&amp;quot;10&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;Pr&amp;lt;/math&amp;gt;: &amp;lt;span data-variable=&amp;quot;Pr&amp;quot; data-max=&amp;quot;30&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;: &amp;lt;span data-variable=&amp;quot;P&amp;quot; data-expression=&amp;quot;Pr K1 K2 I L1 L2 + + + + +&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Оцена: &amp;lt;span data-expression=&amp;quot;P 10 / ceil 5 max 10 min&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Потребна помоћ ==&lt;br /&gt;
* {{задаци|postavke}}&lt;/div&gt;</summary>
		<author><name>Fedja</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%97%D0%B0%D1%88%D1%82%D0%B8%D1%82%D0%B0_%D0%BF%D0%BE%D0%B4%D0%B0%D1%82%D0%B0%D0%BA%D0%B0&amp;diff=5891</id>
		<title>Заштита података</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%97%D0%B0%D1%88%D1%82%D0%B8%D1%82%D0%B0_%D0%BF%D0%BE%D0%B4%D0%B0%D1%82%D0%B0%D0%BA%D0%B0&amp;diff=5891"/>
		<updated>2023-03-03T10:33:56Z</updated>

		<summary type="html">&lt;p&gt;Fedja: /* Потребна помоћ */ link do medija ne do poruke&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Предмет&lt;br /&gt;
| шифра     = 13С114ЗП&lt;br /&gt;
| семестар  = 8 (СИ), 6 (РТИ)&lt;br /&gt;
| статус    = обавезни&lt;br /&gt;
| страница  = [https://rti.etf.bg.ac.rs/rti/ir4zp/ rti.etf.rs/rti/ir4zp]&lt;br /&gt;
| одсек     = СИ, РТИ&lt;br /&gt;
}}&lt;br /&gt;
&#039;&#039;&#039;Заштита података&#039;&#039;&#039; је обавезни предмет у осмом семестру на СИ, а шестом на РТИ.&lt;br /&gt;
&lt;br /&gt;
== Корисне везе ==&lt;br /&gt;
* [https://drive.google.com/open?id=1-R7Q-cIox5MOMN2v6G10QchN1tccpKnT ETF SI] (рокови)&lt;br /&gt;
* [https://app.box.com/s/0r50je333z1qyypz0h3rm0iqb9s0d64f/folder/17682830648 ETF Materijali (Box)] (рокови)&lt;br /&gt;
&lt;br /&gt;
== Настава ==&lt;br /&gt;
{{непотпун одељак}}&lt;br /&gt;
&amp;lt;!-- Овде се наводе све битне информације у вези са предавањима и вежбама на предмету, као и потребни материјали. --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Информације које вреди поменути: које се области прелазе у којем блоку, која се развојна окружења користе, шта обично долази за који колоквијум, где могу да се нађу белешке и презентације, да ли се настава на предмету уопште држи (ако се не држи то треба назначити како би било јасно да викију не недостају информације по том питању), да ли су предавања или вежбе бескорисне --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Пројекат ==&lt;br /&gt;
{{непотпун одељак}}&lt;br /&gt;
&amp;lt;!-- Овде се наводе све битне информације у вези са пројектом на предмету, као и потребни материјали. --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Информације које вреди поменути: окружења за израду, шта се ради на домаћем, водичи за домаћи (уколико су довољно слични из године у годину), где наћи старе домаће, колико бодова носе, када се предају, како изгледа одбрана, да ли је обавезан, корисни материјали --&amp;gt;&lt;br /&gt;
Пројекат на предмету постоји само на СИ, где носи 20% оцене и брани се у јунском или августовском испитном року.&lt;br /&gt;
&lt;br /&gt;
== Лабораторијске вежбе ==&lt;br /&gt;
{{непотпун одељак}}&lt;br /&gt;
&amp;lt;!-- Овде се наводе све битне информације у вези са лабораторијским вежбама на предмету, као и потребни материјали. --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Информације које вреди поменути: када се одржавају, шта се на њима ради, шта се ради пре лабораторијске вежбе, у ком окружењу се ради, колико бодова носе, где наћи претходне лабораторијске вежбе, водичи за израду --&amp;gt;&lt;br /&gt;
Лабораторијске вежбе на предмету носе 15% оцене.&lt;br /&gt;
&lt;br /&gt;
== Испитни рокови ==&lt;br /&gt;
На страници предмета постоје рокови од школске 2019/2020. године, након чега је формат испита и колоквијума промењен и одржава се преко &#039;&#039;Moodle&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Рокови сачувани на викију су:&lt;br /&gt;
{{#dpl:&lt;br /&gt;
| category    = Заштита података&lt;br /&gt;
| category    = Рокови&lt;br /&gt;
| format      = ,\n* [[%PAGE%|²{#invoke:String¦sub¦%PAGE%¦18¦-1}²]],,&lt;br /&gt;
| ordermethod = title&lt;br /&gt;
}}&lt;br /&gt;
Уколико желите да додате рок, посетите &#039;&#039;&#039;[[Project:Направи#Moodle|страницу за прављење рока]]&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Начин оцењивања ==&lt;br /&gt;
=== СИ ===&lt;br /&gt;
* &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt; — бодови са лабораторијских вежби (0-10)&lt;br /&gt;
* &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; — бодови са пројекта (0-20)&lt;br /&gt;
* &amp;lt;math&amp;gt;K_1, K_2&amp;lt;/math&amp;gt; — бодови са првог и другог колоквијума, &#039;&#039;&#039;важе само у јунском испитном року&#039;&#039;&#039;, када је могућа и њихова надокнада (0-20 сваки)&lt;br /&gt;
* &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; — бодови са испита (0-30 у јунском року, 0-70 у свим осталим)&lt;br /&gt;
* &amp;lt;math&amp;gt;P = \left\{\begin{array}{ll}&lt;br /&gt;
    L + P + K_1 + K_2 + I, &amp;amp; \text{јунски рок} \\&lt;br /&gt;
    L + P + I,            &amp;amp; \text{остали рокови}&lt;br /&gt;
\end{array}\right.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== РТИ ===&lt;br /&gt;
На РТИ активности изгледају мало другачије:&lt;br /&gt;
* &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt; — бодови са лабораторијских вежби (0-15)&lt;br /&gt;
* &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; — бодови са колоквијума, могућа надокнада у јунском испитном року (0-40)&lt;br /&gt;
* &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; — бодови са испита (0-45 парцијално у сваком року, 0-85 интегрално од јулског рока)&lt;br /&gt;
* &amp;lt;math&amp;gt;P = \left\{\begin{array}{ll}&lt;br /&gt;
    L + K + I, &amp;amp; \text{ако се ради парцијални испит} \\&lt;br /&gt;
    L + I, &amp;amp; \text{ако се ради интегрални испит}&lt;br /&gt;
\end{array}\right.&amp;lt;/math&amp;gt;&lt;br /&gt;
* Бонус поени се стичу кроз додатне задатке који се шаљу на мејлинг листу. Биће послата порука коју је потребно дешифровати импленетацијом одређеног алгоритма у &amp;lt;em&amp;gt;Python&amp;lt;/em&amp;gt;-у. Бонус поени важе целу школску годину.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Бодови&lt;br /&gt;
| &amp;lt;math&amp;gt;P &amp;lt; 51&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;51 \leq P &amp;lt; 61&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;61 \leq P &amp;lt; 71&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;71 \leq P &amp;lt; 81&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;81 \leq P &amp;lt; 91&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;91 \leq P&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Оцена&lt;br /&gt;
| 5 || 6 || 7 || 8 || 9 || 10&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Калкулатор ===&lt;br /&gt;
{{непотпун одељак}}&lt;br /&gt;
&lt;br /&gt;
== Потребна помоћ ==&lt;br /&gt;
* {{задаци|postavke}}&lt;br /&gt;
* {{задаци|prepis}}&lt;br /&gt;
** Јун 2022 остало је још да се препишу задаци 2,4,8,9,10: [https://cdn.discordapp.com/attachments/725101870854570085/1081130124705013770/zp_2022_jun.zip]&lt;/div&gt;</summary>
		<author><name>Fedja</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%97%D0%B0%D1%88%D1%82%D0%B8%D1%82%D0%B0_%D0%BF%D0%BE%D0%B4%D0%B0%D1%82%D0%B0%D0%BA%D0%B0&amp;diff=5890</id>
		<title>Заштита података</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%97%D0%B0%D1%88%D1%82%D0%B8%D1%82%D0%B0_%D0%BF%D0%BE%D0%B4%D0%B0%D1%82%D0%B0%D0%BA%D0%B0&amp;diff=5890"/>
		<updated>2023-03-03T10:32:26Z</updated>

		<summary type="html">&lt;p&gt;Fedja: /* Потребна помоћ */ jun 2022 preostali zadaci&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Предмет&lt;br /&gt;
| шифра     = 13С114ЗП&lt;br /&gt;
| семестар  = 8 (СИ), 6 (РТИ)&lt;br /&gt;
| статус    = обавезни&lt;br /&gt;
| страница  = [https://rti.etf.bg.ac.rs/rti/ir4zp/ rti.etf.rs/rti/ir4zp]&lt;br /&gt;
| одсек     = СИ, РТИ&lt;br /&gt;
}}&lt;br /&gt;
&#039;&#039;&#039;Заштита података&#039;&#039;&#039; је обавезни предмет у осмом семестру на СИ, а шестом на РТИ.&lt;br /&gt;
&lt;br /&gt;
== Корисне везе ==&lt;br /&gt;
* [https://drive.google.com/open?id=1-R7Q-cIox5MOMN2v6G10QchN1tccpKnT ETF SI] (рокови)&lt;br /&gt;
* [https://app.box.com/s/0r50je333z1qyypz0h3rm0iqb9s0d64f/folder/17682830648 ETF Materijali (Box)] (рокови)&lt;br /&gt;
&lt;br /&gt;
== Настава ==&lt;br /&gt;
{{непотпун одељак}}&lt;br /&gt;
&amp;lt;!-- Овде се наводе све битне информације у вези са предавањима и вежбама на предмету, као и потребни материјали. --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Информације које вреди поменути: које се области прелазе у којем блоку, која се развојна окружења користе, шта обично долази за који колоквијум, где могу да се нађу белешке и презентације, да ли се настава на предмету уопште држи (ако се не држи то треба назначити како би било јасно да викију не недостају информације по том питању), да ли су предавања или вежбе бескорисне --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Пројекат ==&lt;br /&gt;
{{непотпун одељак}}&lt;br /&gt;
&amp;lt;!-- Овде се наводе све битне информације у вези са пројектом на предмету, као и потребни материјали. --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Информације које вреди поменути: окружења за израду, шта се ради на домаћем, водичи за домаћи (уколико су довољно слични из године у годину), где наћи старе домаће, колико бодова носе, када се предају, како изгледа одбрана, да ли је обавезан, корисни материјали --&amp;gt;&lt;br /&gt;
Пројекат на предмету постоји само на СИ, где носи 20% оцене и брани се у јунском или августовском испитном року.&lt;br /&gt;
&lt;br /&gt;
== Лабораторијске вежбе ==&lt;br /&gt;
{{непотпун одељак}}&lt;br /&gt;
&amp;lt;!-- Овде се наводе све битне информације у вези са лабораторијским вежбама на предмету, као и потребни материјали. --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Информације које вреди поменути: када се одржавају, шта се на њима ради, шта се ради пре лабораторијске вежбе, у ком окружењу се ради, колико бодова носе, где наћи претходне лабораторијске вежбе, водичи за израду --&amp;gt;&lt;br /&gt;
Лабораторијске вежбе на предмету носе 15% оцене.&lt;br /&gt;
&lt;br /&gt;
== Испитни рокови ==&lt;br /&gt;
На страници предмета постоје рокови од школске 2019/2020. године, након чега је формат испита и колоквијума промењен и одржава се преко &#039;&#039;Moodle&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Рокови сачувани на викију су:&lt;br /&gt;
{{#dpl:&lt;br /&gt;
| category    = Заштита података&lt;br /&gt;
| category    = Рокови&lt;br /&gt;
| format      = ,\n* [[%PAGE%|²{#invoke:String¦sub¦%PAGE%¦18¦-1}²]],,&lt;br /&gt;
| ordermethod = title&lt;br /&gt;
}}&lt;br /&gt;
Уколико желите да додате рок, посетите &#039;&#039;&#039;[[Project:Направи#Moodle|страницу за прављење рока]]&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Начин оцењивања ==&lt;br /&gt;
=== СИ ===&lt;br /&gt;
* &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt; — бодови са лабораторијских вежби (0-10)&lt;br /&gt;
* &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; — бодови са пројекта (0-20)&lt;br /&gt;
* &amp;lt;math&amp;gt;K_1, K_2&amp;lt;/math&amp;gt; — бодови са првог и другог колоквијума, &#039;&#039;&#039;важе само у јунском испитном року&#039;&#039;&#039;, када је могућа и њихова надокнада (0-20 сваки)&lt;br /&gt;
* &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; — бодови са испита (0-30 у јунском року, 0-70 у свим осталим)&lt;br /&gt;
* &amp;lt;math&amp;gt;P = \left\{\begin{array}{ll}&lt;br /&gt;
    L + P + K_1 + K_2 + I, &amp;amp; \text{јунски рок} \\&lt;br /&gt;
    L + P + I,            &amp;amp; \text{остали рокови}&lt;br /&gt;
\end{array}\right.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== РТИ ===&lt;br /&gt;
На РТИ активности изгледају мало другачије:&lt;br /&gt;
* &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt; — бодови са лабораторијских вежби (0-15)&lt;br /&gt;
* &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; — бодови са колоквијума, могућа надокнада у јунском испитном року (0-40)&lt;br /&gt;
* &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; — бодови са испита (0-45 парцијално у сваком року, 0-85 интегрално од јулског рока)&lt;br /&gt;
* &amp;lt;math&amp;gt;P = \left\{\begin{array}{ll}&lt;br /&gt;
    L + K + I, &amp;amp; \text{ако се ради парцијални испит} \\&lt;br /&gt;
    L + I, &amp;amp; \text{ако се ради интегрални испит}&lt;br /&gt;
\end{array}\right.&amp;lt;/math&amp;gt;&lt;br /&gt;
* Бонус поени се стичу кроз додатне задатке који се шаљу на мејлинг листу. Биће послата порука коју је потребно дешифровати импленетацијом одређеног алгоритма у &amp;lt;em&amp;gt;Python&amp;lt;/em&amp;gt;-у. Бонус поени важе целу школску годину.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Бодови&lt;br /&gt;
| &amp;lt;math&amp;gt;P &amp;lt; 51&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;51 \leq P &amp;lt; 61&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;61 \leq P &amp;lt; 71&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;71 \leq P &amp;lt; 81&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;81 \leq P &amp;lt; 91&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;91 \leq P&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Оцена&lt;br /&gt;
| 5 || 6 || 7 || 8 || 9 || 10&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Калкулатор ===&lt;br /&gt;
{{непотпун одељак}}&lt;br /&gt;
&lt;br /&gt;
== Потребна помоћ ==&lt;br /&gt;
* {{задаци|postavke}}&lt;br /&gt;
* {{задаци|prepis}}&lt;br /&gt;
** Јун 2022 остало је још да се препишу задаци 2,4,8,9,10: [https://discord.com/channels/639225220552720391/725101870854570085/1081130125048959009]&lt;/div&gt;</summary>
		<author><name>Fedja</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%97%D0%B0%D1%88%D1%82%D0%B8%D1%82%D0%B0_%D0%BF%D0%BE%D0%B4%D0%B0%D1%82%D0%B0%D0%BA%D0%B0/%D0%88%D1%83%D0%BD_2022&amp;diff=5889</id>
		<title>Заштита података/Јун 2022</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%97%D0%B0%D1%88%D1%82%D0%B8%D1%82%D0%B0_%D0%BF%D0%BE%D0%B4%D0%B0%D1%82%D0%B0%D0%BA%D0%B0/%D0%88%D1%83%D0%BD_2022&amp;diff=5889"/>
		<updated>2023-03-03T10:29:51Z</updated>

		<summary type="html">&lt;p&gt;Fedja: Fedja преместио је страницу Јун 2022 на Заштита података/Јун 2022 без остављања преусмерења: razlog što sam glup&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&#039;&#039;&#039;Ispit 2022. godine&#039;&#039;&#039; održan je u junu.&lt;br /&gt;
{{rešenja}}&lt;br /&gt;
&lt;br /&gt;
== 1. zadatak ==&lt;br /&gt;
Ana je kreirala poruku &#039;&#039;M&#039;&#039; koju je poslala Branku dva puta.&lt;br /&gt;
&lt;br /&gt;
Uz poruku je oba puta poslala El Gamalov digitalni potpis poruke &#039;&#039;M&#039;&#039;. Branko je oba puta dobio poruku i digitalne potpise. Prvi put je vrednost digitalnog potpisa koju je dobio Branko bila: (&#039;&#039;S1=110, S2=791&#039;&#039;), a drugi put (&#039;&#039;S1=1760, S2=640&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
Branko je izračunao hash dobijene poruke &#039;&#039;M&#039;&#039; i oba puta dobio vrednost &#039;&#039;m&#039;&#039;=3769.&lt;br /&gt;
&lt;br /&gt;
Javni elementi digitalnog potpisa su broj &#039;&#039;q&#039;&#039;=5003 i njegov primitivni koren &#039;&#039;a&#039;&#039;=4999.&lt;br /&gt;
&lt;br /&gt;
Anin javni ključ &#039;&#039;Ya&#039;&#039; je 1682. Provera El Gamalovog digitalnog potpisa se obavlja korišćenjem sledećih formula:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;V1=a^m \bmod q&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;V2=Y_a^{S1}S1^{S2}\bmod q&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Odrediti:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# &#039;&#039;&#039;(3 poena)&#039;&#039;&#039; Vrednost &amp;lt;math&amp;gt;V_2&amp;lt;/math&amp;gt; za prvi digitalni potpis: &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
# &#039;&#039;&#039;(1 poen)&#039;&#039;&#039; Vrednost &amp;lt;math&amp;gt;V_2&amp;lt;/math&amp;gt; za drugi digitalni potpis: &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
# &#039;&#039;&#039;(4 poena)&#039;&#039;&#039; Na osnovu vrednosti V1 i izračunatih vrednosti u tačkama a) i b), Branko može da zaključi:&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot; data-solution=&amp;quot;single&amp;quot;&amp;gt;&lt;br /&gt;
:# Oba digitalna potpisa su ispravna, poruka &#039;&#039;M&#039;&#039; u oba slučaja nije menjana tokom prenosa i oba puta ju je potpisala Ana&lt;br /&gt;
:# Ni jedan digitalni potpis nije ispravan i ne može da se utvrdi da je Ana potpisala tu poruku i da li je menjana tokom prenosa.&lt;br /&gt;
:# Samo drugi digitalni potpis je ispravan i samo druga poruka nije menjana tokom prenosa i nju je potpisala Ana&lt;br /&gt;
:# Samo prvi digitalni potpis je ispravan i samo prva poruka nije menjana tokom prenosa i nju je potpisala Ana&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 3. zadatak ==&lt;br /&gt;
Sledeći algoritmi omogućavaju dobijanje različitih kriptografskih ključeva u svakoj TLS razmeni i to takvih da je moguća verifikacija porekla ključeva.&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot; data-solution=&amp;quot;multiple&amp;quot;&amp;gt;&lt;br /&gt;
# RSA&lt;br /&gt;
# Ephemeral Diffie Hellman&lt;br /&gt;
# Anonymous Diffie Hellman&lt;br /&gt;
# Fixed Diffie Hellman&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ovom porukom se potvrđuju kriptografski algoritmi koji će biti korišćeni u toku TLS sesije:&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot; data-solution=&amp;quot;single&amp;quot;&amp;gt;&lt;br /&gt;
# Server Hello&lt;br /&gt;
# Server Hello Done&lt;br /&gt;
# Client Hello Done&lt;br /&gt;
# Certificate Verify&lt;br /&gt;
# Certificate Request&lt;br /&gt;
# Finished&lt;br /&gt;
# Client Key Exchange&lt;br /&gt;
# Client Hello&lt;br /&gt;
# Change Cipher Specification&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 5. zadatak ==&lt;br /&gt;
Za IKE razmenu ključeva je tačno sledeće:&lt;br /&gt;
&lt;br /&gt;
Izaberite jedan ili više odgovora:&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot; data-solution=&amp;quot;multiple&amp;quot;&amp;gt;&lt;br /&gt;
# Prvo se vrši razmena ključeva pa provera identiteta.&lt;br /&gt;
# Prvo se vrši provera identiteta pa razmena ključeva.&lt;br /&gt;
# Ključ dobijen u prvoj fazi IKE razmene se češće menja od ključa dobijenog u drugoj fazi&lt;br /&gt;
# U prvoj i drugoj fazi razmene ključeva moraju da se koriste isti kriptografski algoritmi&lt;br /&gt;
# U prvoj i drugoj fazi razmene ključeva mogu da se koriste različiti kriptografski algoritmi&lt;br /&gt;
# Ključ dobijen u drugoj fazi IKE razmene se češće menja od ključa dobijenog u prvoj fazi&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 6. zadatak ==&lt;br /&gt;
Kada korisnik A prebacuje X bitcoin-a korisniku B, korisnik A mora da uradi sledeće:&lt;br /&gt;
&lt;br /&gt;
Izaberite jedan odgovor:&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot; data-solution=&amp;quot;single&amp;quot;&amp;gt;&lt;br /&gt;
# da enkriptuje blok u kojem je ova transakcija&lt;br /&gt;
# da odredi nonce za potvrdu bloka u blockchainu&lt;br /&gt;
# da digitalno potpiše ovu transakciju DSA algoritmom&lt;br /&gt;
# da izračuna Merkleovo stablo transakcija&lt;br /&gt;
# da enkriptuje ovu transakciju RSA algoritmom&lt;br /&gt;
# da enkriptuje ovu transakciju AES algoritmom&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 7. zadatak ==&lt;br /&gt;
Odrediti optimalni poredak operacija u procesu prijema PGP poruke, ukoliko su svi servisi u upotrebi:&lt;br /&gt;
&amp;lt;div data-solution=&amp;quot;select&amp;quot; data-options=&amp;quot;Restauriranje poruke prema originalnom poretku, Skidanje email kompatibilnosti, Dešifrovanje poruke, Obezbeđivanje dekompresije, Provera autentikacije&amp;quot;&amp;gt;&lt;br /&gt;
# operacija &amp;lt;span class=&amp;quot;spoiler&amp;quot;&amp;gt;Restauriranje poruke prema originalnom poretku&amp;lt;/span&amp;gt;&lt;br /&gt;
# operacija &amp;lt;span class=&amp;quot;spoiler&amp;quot;&amp;gt;Restauriranje poruke prema originalnom poretku&amp;lt;/span&amp;gt;&lt;br /&gt;
# operacija &amp;lt;span class=&amp;quot;spoiler&amp;quot;&amp;gt;Restauriranje poruke prema originalnom poretku&amp;lt;/span&amp;gt;&lt;br /&gt;
# operacija &amp;lt;span class=&amp;quot;spoiler&amp;quot;&amp;gt;Restauriranje poruke prema originalnom poretku&amp;lt;/span&amp;gt;&lt;br /&gt;
# operacija &amp;lt;span class=&amp;quot;spoiler&amp;quot;&amp;gt;Restauriranje poruke prema originalnom poretku&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Napomena: &#039;&#039;&#039;&#039;&#039;REŠENJE NIJE TAČNO! PLACEHOLDER JE DA BI DROPDOWN LISTA RADILA!&#039;&#039;&#039;&#039;&#039;. Autor dakle ne podnosi odgovornost za ispadanje sa budžeta.&lt;br /&gt;
&lt;br /&gt;
Na slici je data šema PGP upravljanja ključem uz korišćenje poverenja. U korenu hijerarhije se nalazi korisnički čvor. Čvorovi označeni crvenom bojom su čvorovi kojima se u potpunosti veruje da potpisuju druge ključeve, dok su plavom bojom označeni čvorovi kojima se delimično veruje da potpisuju druge ključeve. Konfigurabilni parametri su &amp;lt;code&amp;gt;X = 1&amp;lt;/code&amp;gt; i &amp;lt;code&amp;gt;Y = 3&amp;lt;/code&amp;gt;.&lt;br /&gt;
[[Датотека:ZP jun 2022 zadatak 7 PGP šema.svg|PGP šema uz sedmi zadatak.|link=|class=transparent-svg]]&lt;br /&gt;
&lt;br /&gt;
Označiti sve čvorove koji su legitimni.&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot; data-solution=&amp;quot;multiple&amp;quot;&amp;gt;&lt;br /&gt;
# A&lt;br /&gt;
# B&lt;br /&gt;
# C&lt;br /&gt;
# D&lt;br /&gt;
# E&lt;br /&gt;
# F&lt;br /&gt;
# G&lt;br /&gt;
# H&lt;br /&gt;
# I&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:Заштита података]]&lt;/div&gt;</summary>
		<author><name>Fedja</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%97%D0%B0%D1%88%D1%82%D0%B8%D1%82%D0%B0_%D0%BF%D0%BE%D0%B4%D0%B0%D1%82%D0%B0%D0%BA%D0%B0/%D0%88%D1%83%D0%BD_2022&amp;diff=5888</id>
		<title>Заштита података/Јун 2022</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%97%D0%B0%D1%88%D1%82%D0%B8%D1%82%D0%B0_%D0%BF%D0%BE%D0%B4%D0%B0%D1%82%D0%B0%D0%BA%D0%B0/%D0%88%D1%83%D0%BD_2022&amp;diff=5888"/>
		<updated>2023-03-03T10:28:35Z</updated>

		<summary type="html">&lt;p&gt;Fedja: fale 2,4,8,9,10 smorio sam se&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&#039;&#039;&#039;Ispit 2022. godine&#039;&#039;&#039; održan je u junu.&lt;br /&gt;
{{rešenja}}&lt;br /&gt;
&lt;br /&gt;
== 1. zadatak ==&lt;br /&gt;
Ana je kreirala poruku &#039;&#039;M&#039;&#039; koju je poslala Branku dva puta.&lt;br /&gt;
&lt;br /&gt;
Uz poruku je oba puta poslala El Gamalov digitalni potpis poruke &#039;&#039;M&#039;&#039;. Branko je oba puta dobio poruku i digitalne potpise. Prvi put je vrednost digitalnog potpisa koju je dobio Branko bila: (&#039;&#039;S1=110, S2=791&#039;&#039;), a drugi put (&#039;&#039;S1=1760, S2=640&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
Branko je izračunao hash dobijene poruke &#039;&#039;M&#039;&#039; i oba puta dobio vrednost &#039;&#039;m&#039;&#039;=3769.&lt;br /&gt;
&lt;br /&gt;
Javni elementi digitalnog potpisa su broj &#039;&#039;q&#039;&#039;=5003 i njegov primitivni koren &#039;&#039;a&#039;&#039;=4999.&lt;br /&gt;
&lt;br /&gt;
Anin javni ključ &#039;&#039;Ya&#039;&#039; je 1682. Provera El Gamalovog digitalnog potpisa se obavlja korišćenjem sledećih formula:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;V1=a^m \bmod q&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;V2=Y_a^{S1}S1^{S2}\bmod q&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Odrediti:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# &#039;&#039;&#039;(3 poena)&#039;&#039;&#039; Vrednost &amp;lt;math&amp;gt;V_2&amp;lt;/math&amp;gt; za prvi digitalni potpis: &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
# &#039;&#039;&#039;(1 poen)&#039;&#039;&#039; Vrednost &amp;lt;math&amp;gt;V_2&amp;lt;/math&amp;gt; za drugi digitalni potpis: &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
# &#039;&#039;&#039;(4 poena)&#039;&#039;&#039; Na osnovu vrednosti V1 i izračunatih vrednosti u tačkama a) i b), Branko može da zaključi:&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot; data-solution=&amp;quot;single&amp;quot;&amp;gt;&lt;br /&gt;
:# Oba digitalna potpisa su ispravna, poruka &#039;&#039;M&#039;&#039; u oba slučaja nije menjana tokom prenosa i oba puta ju je potpisala Ana&lt;br /&gt;
:# Ni jedan digitalni potpis nije ispravan i ne može da se utvrdi da je Ana potpisala tu poruku i da li je menjana tokom prenosa.&lt;br /&gt;
:# Samo drugi digitalni potpis je ispravan i samo druga poruka nije menjana tokom prenosa i nju je potpisala Ana&lt;br /&gt;
:# Samo prvi digitalni potpis je ispravan i samo prva poruka nije menjana tokom prenosa i nju je potpisala Ana&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 3. zadatak ==&lt;br /&gt;
Sledeći algoritmi omogućavaju dobijanje različitih kriptografskih ključeva u svakoj TLS razmeni i to takvih da je moguća verifikacija porekla ključeva.&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot; data-solution=&amp;quot;multiple&amp;quot;&amp;gt;&lt;br /&gt;
# RSA&lt;br /&gt;
# Ephemeral Diffie Hellman&lt;br /&gt;
# Anonymous Diffie Hellman&lt;br /&gt;
# Fixed Diffie Hellman&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ovom porukom se potvrđuju kriptografski algoritmi koji će biti korišćeni u toku TLS sesije:&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot; data-solution=&amp;quot;single&amp;quot;&amp;gt;&lt;br /&gt;
# Server Hello&lt;br /&gt;
# Server Hello Done&lt;br /&gt;
# Client Hello Done&lt;br /&gt;
# Certificate Verify&lt;br /&gt;
# Certificate Request&lt;br /&gt;
# Finished&lt;br /&gt;
# Client Key Exchange&lt;br /&gt;
# Client Hello&lt;br /&gt;
# Change Cipher Specification&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 5. zadatak ==&lt;br /&gt;
Za IKE razmenu ključeva je tačno sledeće:&lt;br /&gt;
&lt;br /&gt;
Izaberite jedan ili više odgovora:&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot; data-solution=&amp;quot;multiple&amp;quot;&amp;gt;&lt;br /&gt;
# Prvo se vrši razmena ključeva pa provera identiteta.&lt;br /&gt;
# Prvo se vrši provera identiteta pa razmena ključeva.&lt;br /&gt;
# Ključ dobijen u prvoj fazi IKE razmene se češće menja od ključa dobijenog u drugoj fazi&lt;br /&gt;
# U prvoj i drugoj fazi razmene ključeva moraju da se koriste isti kriptografski algoritmi&lt;br /&gt;
# U prvoj i drugoj fazi razmene ključeva mogu da se koriste različiti kriptografski algoritmi&lt;br /&gt;
# Ključ dobijen u drugoj fazi IKE razmene se češće menja od ključa dobijenog u prvoj fazi&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 6. zadatak ==&lt;br /&gt;
Kada korisnik A prebacuje X bitcoin-a korisniku B, korisnik A mora da uradi sledeće:&lt;br /&gt;
&lt;br /&gt;
Izaberite jedan odgovor:&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot; data-solution=&amp;quot;single&amp;quot;&amp;gt;&lt;br /&gt;
# da enkriptuje blok u kojem je ova transakcija&lt;br /&gt;
# da odredi nonce za potvrdu bloka u blockchainu&lt;br /&gt;
# da digitalno potpiše ovu transakciju DSA algoritmom&lt;br /&gt;
# da izračuna Merkleovo stablo transakcija&lt;br /&gt;
# da enkriptuje ovu transakciju RSA algoritmom&lt;br /&gt;
# da enkriptuje ovu transakciju AES algoritmom&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 7. zadatak ==&lt;br /&gt;
Odrediti optimalni poredak operacija u procesu prijema PGP poruke, ukoliko su svi servisi u upotrebi:&lt;br /&gt;
&amp;lt;div data-solution=&amp;quot;select&amp;quot; data-options=&amp;quot;Restauriranje poruke prema originalnom poretku, Skidanje email kompatibilnosti, Dešifrovanje poruke, Obezbeđivanje dekompresije, Provera autentikacije&amp;quot;&amp;gt;&lt;br /&gt;
# operacija &amp;lt;span class=&amp;quot;spoiler&amp;quot;&amp;gt;Restauriranje poruke prema originalnom poretku&amp;lt;/span&amp;gt;&lt;br /&gt;
# operacija &amp;lt;span class=&amp;quot;spoiler&amp;quot;&amp;gt;Restauriranje poruke prema originalnom poretku&amp;lt;/span&amp;gt;&lt;br /&gt;
# operacija &amp;lt;span class=&amp;quot;spoiler&amp;quot;&amp;gt;Restauriranje poruke prema originalnom poretku&amp;lt;/span&amp;gt;&lt;br /&gt;
# operacija &amp;lt;span class=&amp;quot;spoiler&amp;quot;&amp;gt;Restauriranje poruke prema originalnom poretku&amp;lt;/span&amp;gt;&lt;br /&gt;
# operacija &amp;lt;span class=&amp;quot;spoiler&amp;quot;&amp;gt;Restauriranje poruke prema originalnom poretku&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Napomena: &#039;&#039;&#039;&#039;&#039;REŠENJE NIJE TAČNO! PLACEHOLDER JE DA BI DROPDOWN LISTA RADILA!&#039;&#039;&#039;&#039;&#039;. Autor dakle ne podnosi odgovornost za ispadanje sa budžeta.&lt;br /&gt;
&lt;br /&gt;
Na slici je data šema PGP upravljanja ključem uz korišćenje poverenja. U korenu hijerarhije se nalazi korisnički čvor. Čvorovi označeni crvenom bojom su čvorovi kojima se u potpunosti veruje da potpisuju druge ključeve, dok su plavom bojom označeni čvorovi kojima se delimično veruje da potpisuju druge ključeve. Konfigurabilni parametri su &amp;lt;code&amp;gt;X = 1&amp;lt;/code&amp;gt; i &amp;lt;code&amp;gt;Y = 3&amp;lt;/code&amp;gt;.&lt;br /&gt;
[[Датотека:ZP jun 2022 zadatak 7 PGP šema.svg|PGP šema uz sedmi zadatak.|link=|class=transparent-svg]]&lt;br /&gt;
&lt;br /&gt;
Označiti sve čvorove koji su legitimni.&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot; data-solution=&amp;quot;multiple&amp;quot;&amp;gt;&lt;br /&gt;
# A&lt;br /&gt;
# B&lt;br /&gt;
# C&lt;br /&gt;
# D&lt;br /&gt;
# E&lt;br /&gt;
# F&lt;br /&gt;
# G&lt;br /&gt;
# H&lt;br /&gt;
# I&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:Заштита података]]&lt;/div&gt;</summary>
		<author><name>Fedja</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%94%D0%B0%D1%82%D0%BE%D1%82%D0%B5%D0%BA%D0%B0:ZP_jun_2022_zadatak_7_PGP_%C5%A1ema.svg&amp;diff=5887</id>
		<title>Датотека:ZP jun 2022 zadatak 7 PGP šema.svg</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%94%D0%B0%D1%82%D0%BE%D1%82%D0%B5%D0%BA%D0%B0:ZP_jun_2022_zadatak_7_PGP_%C5%A1ema.svg&amp;diff=5887"/>
		<updated>2023-03-03T10:00:13Z</updated>

		<summary type="html">&lt;p&gt;Fedja: Нова страница: {{file | description = Преписано `https://discord.com/channels/639225220552720391/725101870854570085/1081130125048959009` одавде | author      = Предметни професори и сарадници | source      = Писмено предање старијих студената }}&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{file&lt;br /&gt;
| description = Преписано `https://discord.com/channels/639225220552720391/725101870854570085/1081130125048959009` одавде&lt;br /&gt;
| author      = Предметни професори и сарадници&lt;br /&gt;
| source      = Писмено предање старијих студената&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Fedja</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%97%D0%B0%D1%88%D1%82%D0%B8%D1%82%D0%B0_%D0%BF%D0%BE%D0%B4%D0%B0%D1%82%D0%B0%D0%BA%D0%B0&amp;diff=5884</id>
		<title>Заштита података</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%97%D0%B0%D1%88%D1%82%D0%B8%D1%82%D0%B0_%D0%BF%D0%BE%D0%B4%D0%B0%D1%82%D0%B0%D0%BA%D0%B0&amp;diff=5884"/>
		<updated>2023-03-03T09:09:06Z</updated>

		<summary type="html">&lt;p&gt;Fedja: /* Потребна помоћ */ prepis&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Fedja</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=SI_Wiki&amp;diff=5878</id>
		<title>SI Wiki</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=SI_Wiki&amp;diff=5878"/>
		<updated>2023-02-28T20:55:22Z</updated>

		<summary type="html">&lt;p&gt;Fedja: /* Остали чланци */ vodiči -&amp;gt; opšti vodiči&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Добродошли на СИ Вики! ==&lt;br /&gt;
Овај вики је намењен за размену материјала везаних за СИ одсек. Овде можете наћи предавања, вежбе, решења рокова и сл.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Тренутно имамо {{NUMBEROFUSERS}} корисника и одржавамо {{PAGESINCAT:Рокови}} {{plural:{{PAGESINCAT:Рокови}}|страница|странице|страница}} рокова, {{PAGESINCAT:Лабораторијске вежбе}} {{plural:{{PAGESINCAT:Лабораторијске вежбе}}|страница|странице|страница}} лабораторијских вежби и {{PAGESINCAT:Предмети}} {{plural:{{PAGESINCAT:Предмети}}|страница|странице|страница}} предмета.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Позивамо вас да [[Project:Потребна помоћ|допринесете]] овом викију. Неопходно је само &#039;&#039;&#039;[[Посебно:RequestAccount|послати захтев за налог]]&#039;&#039;&#039;, и можете да почнете са уређивањем.&lt;br /&gt;
&amp;lt;div class=&amp;quot;mainpage__columns&amp;quot;&amp;gt;&lt;br /&gt;
{{#dpl:&lt;br /&gt;
| category        = Семестри&lt;br /&gt;
| format          = ,&amp;lt;div class=&amp;quot;mainpage__column&amp;quot;&amp;gt;\n== %TITLE% ==\n²{#dpl:¦category = %TITLE%¦namespace = ¦noresultsheader = &amp;lt;nowiki /&amp;gt;¦format = ²{главна страна СИ линк}²}²²{#dpl:¦category = %TITLE% (РТИ)¦notcategory = %TITLE%¦namespace = ¦noresultsheader = &amp;lt;nowiki /&amp;gt;¦format = ²{главна страна РТИ линк}²}²,&amp;lt;/div&amp;gt;\n,&lt;br /&gt;
| noresultsheader = &amp;lt;nowiki /&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;div class=&amp;quot;mainpage__column&amp;quot;&amp;gt;&lt;br /&gt;
== Остали чланци ==&lt;br /&gt;
* [[Остали материјали]]&lt;br /&gt;
* [[Општи водичи]]&lt;br /&gt;
* [[Буџет]]&lt;br /&gt;
* [[Демонстратура]]&lt;br /&gt;
* [[:Категорија:Рокови|Рокови (категорија)]]&lt;br /&gt;
* [[:Категорија:Лабораторијске вежбе|Лабораторијске вежбе (категорија)]]&lt;br /&gt;
* [[:Категорија:Водичи|Водичи (категорија)]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mainpage__column&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== О пројекту ==&lt;br /&gt;
* [[Project:О нама|О пројекту]]&lt;br /&gt;
* &#039;&#039;&#039;[[Project:Потребна помоћ|Потребна помоћ]]&#039;&#039;&#039;&lt;br /&gt;
* [[Project:Упутства|Упутства]]&lt;br /&gt;
* [[Project:Направи|Направи страницу]]&lt;br /&gt;
* [[Project:Анкета|Резултати анкета]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
__NOTOC__&lt;br /&gt;
[[Категорија:SI Wiki]]&lt;/div&gt;</summary>
		<author><name>Fedja</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%92%D0%BE%D0%B4%D0%B8%D1%87%D0%B8&amp;diff=5877</id>
		<title>Водичи</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%92%D0%BE%D0%B4%D0%B8%D1%87%D0%B8&amp;diff=5877"/>
		<updated>2023-02-28T20:54:03Z</updated>

		<summary type="html">&lt;p&gt;Fedja: Fedja преместио је страницу Водичи на Општи водичи: diskusija odavde `https://discord.com/channels/639225220552720391/696381655933386832/1080129409706622976` &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#Преусмери [[Општи водичи]]&lt;/div&gt;</summary>
		<author><name>Fedja</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9E%D0%BF%D1%88%D1%82%D0%B8_%D0%B2%D0%BE%D0%B4%D0%B8%D1%87%D0%B8&amp;diff=5876</id>
		<title>Општи водичи</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9E%D0%BF%D1%88%D1%82%D0%B8_%D0%B2%D0%BE%D0%B4%D0%B8%D1%87%D0%B8&amp;diff=5876"/>
		<updated>2023-02-28T20:54:03Z</updated>

		<summary type="html">&lt;p&gt;Fedja: Fedja преместио је страницу Водичи на Општи водичи: diskusija odavde `https://discord.com/channels/639225220552720391/696381655933386832/1080129409706622976` &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
Овде се налазе &#039;&#039;&#039;водичи&#039;&#039;&#039; који нису у вези ни са једним [[:Категорија:Предмети|предметом]].&lt;br /&gt;
&lt;br /&gt;
== Поништавање испита ==&lt;br /&gt;
Испити се могу поништити најкасније дан пред испит, ако сте га пријавили за тај рок. Ако нисте, можете да поништите кад год. Испите које сте пали не поништавате. У најбољем случају можете питати професора да вам упише 5 како не бисте поништавали испит, али ово не функционише код свих професора (поготово оних са РТИ катедре).&lt;br /&gt;
# Пре поништавања испита потребно је да имате:&lt;br /&gt;
## Потврду о уплати накнаде за поништавање испита&lt;br /&gt;
## Молбу за поништавање испита (купује се у скриптарници, кошта 25 РСД)&lt;br /&gt;
## Уписану оцену из предмета који хоћете да поништите на студентским сервисима.&lt;br /&gt;
# Потврда о уплати изгледа овако:&lt;br /&gt;
#* &#039;&#039;&#039;Сврха:&#039;&#039;&#039; Поништавање испита&lt;br /&gt;
#* &#039;&#039;&#039;Износ:&#039;&#039;&#039; 1.500,00 РСД&lt;br /&gt;
#* &#039;&#039;&#039;Рачун:&#039;&#039;&#039; 840-0000001438666-48 (СОП. ПРИ. ЕТФ Београд)&lt;br /&gt;
#* &#039;&#039;&#039;Модел и позив на број:&#039;&#039;&#039; 97 89100 (ЕР) или 97 77201 (СИ)&lt;br /&gt;
# Молбу попуњавате са именом и презименом, бројем индекса, одсеком, предметом и оценом коју поништавате, и испитним роком у којем сте добили оцену. Уз њу прилажете индекс и уплатницу (спадају под &amp;quot;остала документа&amp;quot;).&lt;br /&gt;
# Молбу подносите у [https://www.etf.bg.ac.rs/sr/sluzbe/studentski-odsek студентској служби,] од 11 до 13 сати радним данима.&lt;br /&gt;
&lt;br /&gt;
== Накнадна пријава испита ==&lt;br /&gt;
Испити се могу накнадно пријавити &#039;&#039;&#039;пре рока у којем се одржава тај испит&#039;&#039;&#039;. Процес:&lt;br /&gt;
# У случају да немате новац (1.500,00дин) на студентском рачуну, морате га уплатити. На е-студенту, у одсеку &amp;quot;Школарине и уплате&amp;quot; постоји пример уплатнице (износ мора бити 1.500,00РСД или више а сврху уплате можете променити у &amp;quot;Накнадна пријава испита&amp;quot;). &#039;&#039;&#039;Препоручено је да се на рачун уплате паре најкасније два радна дана пред почетак рока (уколико рок почиње у понедељак, то је 4 дана пре почетка рока), јер је углавном потребан један дан да легну.&#039;&#039;&#039; У случају да вам је остао само један радни дан до почетка рока, &#039;&#039;&#039;морате однети доказ о уплати у студентску службу јер се новац неће прокњижити на време&#039;&#039;&#039;.&lt;br /&gt;
# Ако имате новац на рачуну, пошаљите мејл на [mailto:stud_sluzba@etf.rs stud_sluzba@etf.rs] са захтевом да пријавите одређен испит. Испуниће вам молбу током радног времена, од 11-13.&lt;br /&gt;
# &#039;&#039;&#039;НЕ ПРЕПОРУЧУЈЕ СЕ&#039;&#039;&#039; да одете у [https://www.etf.bg.ac.rs/sr/sluzbe/studentski-odsek студентску службу] од 11-13 и &#039;&#039;лично&#039;&#039; питате, јер одлазак до студентске службе често може да буде непријатно искуство.&lt;br /&gt;
&lt;br /&gt;
== Снимљена предавања ==&lt;br /&gt;
Сва предавања снимљена на &#039;&#039;Microsoft Teams&#039;&#039;-у налазе се на платформи &#039;&#039;Microsoft Stream&#039;&#039;. Приступате им тако што:&lt;br /&gt;
# Одете на [https://web.microsoftstream.com/studio/groups групе у &#039;&#039;Microsoft Stream&#039;&#039;]&lt;br /&gt;
# Изаберете предмет за који хоћете да гледате предавања&lt;br /&gt;
# Одете на &amp;quot;Videos&amp;quot; таб&lt;br /&gt;
# Уколико предавања хоћете да гледате у хронолошком редоследу, сортирајте листу по датуму постављања.&lt;br /&gt;
У већини случајева, професори ће сами покренути снимање предавања. Уколико то не ураде, опцију за снимање се налази под [...] → Покрени снимање.&lt;br /&gt;
&lt;br /&gt;
Уколико вам снимљена предавања требају у облику датотеке, можете урадити једно од следећег:&lt;br /&gt;
# Посетите једну од [[Остали материјали#Архиве|архива]] снимљених предавања и презуети снимљена предавања одатле&lt;br /&gt;
# Уколико сте ви снимали предавање, требало би да у хамбургер менију поред снимка предавања у листи снимака за предмет нађе и дугме за преузимање снимка&lt;br /&gt;
# Користити [[github:snobu/destreamer|софтвер за скидање снимака]] са &#039;&#039;Microsoft Stream&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Излазак из тима ==&lt;br /&gt;
&#039;&#039;Microsoft Teams&#039;&#039; платформа прави излазак из тимова безразложно тешком операцијом. Уколико желите да напустите неки тим, потребно је следеће:&lt;br /&gt;
# Да имате &#039;&#039;Android&#039;&#039; уређај&lt;br /&gt;
# Деинсталирате &#039;&#039;Microsoft Teams&#039;&#039; апликацију уколико је имате инсталирану&lt;br /&gt;
# Инсталирате [https://studentetfbgacrs-my.sharepoint.com/:u:/g/personal/sa190595d_student_etf_bg_ac_rs/ET1FuXmFjjRDkeUwCu4qzmoB1k4Lrw3hnZYam3iJgHnC9g старију верзију апликације за &#039;&#039;Android&#039;&#039;] (могуће је да ћете морати да у својим сигурносним подешавањима дозволите инсталацију апликација из непознатих извора)&lt;br /&gt;
# Пријавите се са студентским налогом&lt;br /&gt;
# На дну листе тимова изаберете опцију за преглед свих тимова&lt;br /&gt;
# На том екрану ћете у менију са десне стране сваког тима моћи да изаберете опцију за излазак из тима&lt;br /&gt;
# Можда ћете морати мало да сачекате да &#039;&#039;Teams&#039;&#039; региструје излазак из тима, а уколико ни након пола минута не уклони тим можете пробати опет&lt;br /&gt;
&lt;br /&gt;
== Одјављивање са листе предмета ==&lt;br /&gt;
Након што завршите са неким предметом, можда вас више не занимају обавештења о њему. Бићете аутоматски одјављени са листе тог предмета кад се поново формирају листе тог истог предмета, али можете и се унапред одјавити са листа:&lt;br /&gt;
# Посетите [https://lists.etf.bg.ac.rs/ страницу за ЕТФ мејлинг листе]&lt;br /&gt;
# Уколико нисте раније правили налог на тој страници, [https://lists.etf.bg.ac.rs/wws/sendpasswd/ направите га.] Лозинка ће вам бити послата на мејл адресу&lt;br /&gt;
# Пријавите се са вашом студентском адресом е-поште и добијеном лозинком&lt;br /&gt;
# Изаберите у левој траци листу предмета са које хоћете да се одјавите&lt;br /&gt;
# Изаберите у левој траци &amp;quot;Unsubscribe&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Водичи]]&lt;/div&gt;</summary>
		<author><name>Fedja</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%A1%D1%82%D1%80%D1%83%D1%87%D0%BD%D0%B0_%D0%BF%D1%80%D0%B0%D0%BA%D1%81%D0%B0&amp;diff=5874</id>
		<title>Стручна пракса</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%A1%D1%82%D1%80%D1%83%D1%87%D0%BD%D0%B0_%D0%BF%D1%80%D0%B0%D0%BA%D1%81%D0%B0&amp;diff=5874"/>
		<updated>2023-02-28T14:21:01Z</updated>

		<summary type="html">&lt;p&gt;Fedja: dodata kategorija vodiča&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Предмет&lt;br /&gt;
| шифра     = 13С004СП, 13Е004СП&lt;br /&gt;
| семестар  = 8&lt;br /&gt;
| статус    = обавезни&lt;br /&gt;
| ЕСПБ      = 2&lt;br /&gt;
| одсек     = СИ, РТИ, ОС, ОЕ, ОТ, ОФ&lt;br /&gt;
}}&lt;br /&gt;
&#039;&#039;&#039;Стручна пракса&#039;&#039;&#039; је обавезни &amp;quot;предмет&amp;quot; формално у осмом семестру. Ово заправо није предмет у конвенционалном смислу већ само активност која носи ЕСПБ (видети испод).&lt;br /&gt;
&lt;br /&gt;
== Процедура ==&lt;br /&gt;
Супротно очекивањима неких студената, факултетско особље заправо не помаже директно око проналаска праксе. Студенти праксу проналазе сами, а факултету је ту праксу потребно пријавити како би се урачунала као одрађена. Након што студент пронађе праксу, процедура њене пријаве је:&lt;br /&gt;
# На [https://student.etf.bg.ac.rs/ е-студент] под опцијом &amp;quot;Обавезе&amp;quot; у левом менију потребно је притиснути дугме &amp;quot;Пријави&amp;quot; и затим унети опис праксе. Опис праксе треба оквирно да садржи назив фирме, датум почетка и краја праксе и опис посла.&lt;br /&gt;
# Након слања пријаве, потребно је сачекати да руководилац пракси за одсек (Јелица Протић за СИ, Захарије Радивојевић за РТИ) потврди пријаву и са десне стране потврђене пријаве стајаће линк до PDF фајла са упутом који је потребно одштампати.&lt;br /&gt;
# Пред крај (или након краја) праксе, однети упут у фирму у којој се радила пракса како би потписали одељак са извештајем о урађеној стручној пракси.&lt;br /&gt;
# Након добијања потписаног упута, питати вашег руководиоца праксе како можете да му тај упут доставите (у наставку се претпоставља да ће вам рећи да упут предате у студентској служби, као што Јелица често каже).&lt;br /&gt;
# Написати на другом папиру на око пола стране кратак опис праксе (ово се може одрадити и у студентској служби).&lt;br /&gt;
# Потписани упут и папир са описом праксе однети у студентску службу, која би требало да означи праксу као завршену.&lt;br /&gt;
&lt;br /&gt;
=== Студент ментор ===&lt;br /&gt;
Уколико је студент учествовао у програму Студент ментор, то може да му се призна као пракса уколико је добио довољно високе оцене од својих студената као и написао извештај о менторству (руководиоци програма објаве пред крај године све потребне информације на релевантној Фејсбук групи). У том случају, измене процедуре изнад су следеће:&lt;br /&gt;
* Студент као датум почетка праксе уноси први дан у школској години, као датум краја датум до када је студент радио са својим бруцошима, као опис посла &amp;quot;Студент ментор&amp;quot; и као фирму ЕТФ. Пошто је форма за опис праксе слободног карактера, ове информације написати на слободан начин.&lt;br /&gt;
* Одштампан упут носи се Продекану за наставу у термину пријема студената.&lt;br /&gt;
* Не пише се папир са описом праксе.&lt;br /&gt;
&lt;br /&gt;
=== Демонстратура ===&lt;br /&gt;
{{непотпун одељак}}&lt;br /&gt;
Уколико демонстратор има преко 80 радних сати, могуће је пријавити демонстратуру као праксу, али још увек није позната тачна процедура за то.&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Водичи]]&lt;/div&gt;</summary>
		<author><name>Fedja</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9A%D0%94%D0%9F/%D0%A4%D0%B5%D0%B1%D1%80%D1%83%D0%B0%D1%80_2023&amp;diff=5740</id>
		<title>КДП/Фебруар 2023</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9A%D0%94%D0%9F/%D0%A4%D0%B5%D0%B1%D1%80%D1%83%D0%B0%D1%80_2023&amp;diff=5740"/>
		<updated>2023-02-18T10:46:23Z</updated>

		<summary type="html">&lt;p&gt;Fedja: /* Решење */ 3. zadatak&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
Поставка овог рока може се наћи са [https://rti.etf.bg.ac.rs/rti/ir3kdp/rokovi/2223/KDP_2023_feb.pdf странице предмета.]&lt;br /&gt;
&lt;br /&gt;
== {{категорија|1. задатак|Синхронизациони_алгоритми}} ==&lt;br /&gt;
{{делимично_решено}}&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
&#039;&#039;Fine grain Ticket&#039;&#039; алгоритам реализован помоћу &#039;&#039;addAndGet&#039;&#039; операције. Уколико би &#039;&#039;addAndGet&#039;&#039; операција имала следећи ефекат: &amp;lt;code&amp;gt;addAndGet(var, incr) : &amp;lt; var = var + incr; return(var);&amp;lt;/code&amp;gt;, да ли је могуће направити &#039;&#039;Fine grain&#039;&#039; решење, полазећи од &#039;&#039;Coarse grain&#039;&#039; решења, и ако је могуће - направите га. Написати и &#039;&#039;Coarse grain&#039;&#039; решење. &lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&lt;br /&gt;
== {{категорија|2. задатак|Монитори}} ==&lt;br /&gt;
{{делимично_решено}}&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Племе људождера једе заједничку вечеру из казана који може да прими M порција куваних мисионара (&#039;&#039;The Dining Savages Problem&#039;&#039;). Када људождер пожели да руча онда се он сам послужи из заједничког казана, уколико казан није празан. Уколико је казан празан људождер буди кувара и сачека док кувар не напуни казан и онда узима своју порцију, а тек након тога преостали могу јести. Није дозвољено будити кувара уколико се налази бар мало хране у казану. Написати монитор са &#039;&#039;signal and continue&#039;&#039; дисциплином који решава дати проблем.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&lt;br /&gt;
== {{категорија|3. задатак|Активни_монитори}} ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Користећи активне мониторе решити проблем филозофа који ручавају (&#039;&#039;The Dining Philosophers&#039;&#039;). Филозофи могу да комуницирају искључиво са процесом координатором (централизовано решење). Обезбедити да филозоф који је пре затражио да једе пре и започиње са јелом. Написати код за филозофе и за процес координатор.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
: &#039;&#039;Исти задатак дошао је у [[КДП/Јул 2020#3. задатак|јулу 2020. године]]. Ипак, аутор је одлучио да постави своје решење које је добило максималан број бодова.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
const int N = ...;&lt;br /&gt;
enum op_kind{REQUEST,RELEASE};&lt;br /&gt;
chan request(int, op_kind);&lt;br /&gt;
chan reply[N](bool);&lt;br /&gt;
&lt;br /&gt;
class Coordinator {&lt;br /&gt;
public:&lt;br /&gt;
    void run() {&lt;br /&gt;
        int id;&lt;br /&gt;
        op_kind op;&lt;br /&gt;
        queue&amp;lt;int&amp;gt; waiting;&lt;br /&gt;
        int forks[N] = {true};&lt;br /&gt;
        while (true) {&lt;br /&gt;
            receive request(id, op);&lt;br /&gt;
            int left = id, right = (id + 1) % N;&lt;br /&gt;
            if (op == REQUEST) {&lt;br /&gt;
                if (forks[left] &amp;amp;&amp;amp; forks[right]) {&lt;br /&gt;
                    forks[left] = forks[right] = false;&lt;br /&gt;
                    send reply[id](OK);&lt;br /&gt;
                } else {&lt;br /&gt;
                    waiting.push(id);&lt;br /&gt;
                }&lt;br /&gt;
            } else if (op == RELEASE) {&lt;br /&gt;
                forks[left] = forks[right] = true;&lt;br /&gt;
                send reply[id](OK);&lt;br /&gt;
                while (!waiting.empty()) {&lt;br /&gt;
                    id = waiting.top();&lt;br /&gt;
                    left = id, right = (id + 1) % N;&lt;br /&gt;
                    if (forks[left] &amp;amp;&amp;amp; forks[right]) {&lt;br /&gt;
                        forks[left] = forks[right] = false;&lt;br /&gt;
                        waiting.pop();&lt;br /&gt;
                        send reply[id](OK);&lt;br /&gt;
                    } else break;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void philosopher(int id) {&lt;br /&gt;
    bool status;&lt;br /&gt;
    while (true) {&lt;br /&gt;
        // Think&lt;br /&gt;
        send request(id, REQUEST);&lt;br /&gt;
        receive reply[id](status);&lt;br /&gt;
        // Eat&lt;br /&gt;
        send request(id, RELEASE);&lt;br /&gt;
        receive reply[id](status)&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== {{категорија|4. задатак|CSP}} ==&lt;br /&gt;
{{делимично_решено}}&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
На једној обали реке се налази чамац који превози путнике са једне на другу обалу и који може да прими тачно десет путника. Чамац могу да користе мушкарци, жене и деца. Чамац може да исплови само ако се у њему налази тачно онолико путника колики му је капацитет, али само под условом да се у чамцу налазе бар два мушкарца. Деца не смеју ући у чамац уколико се у њему не налазе бар једна одрасла особа и по завршетку вожње у чамцу не смеју да остану само деца. Сматрати да ће се чамац након искрцавања свих путника одмах бити спреман да прими наредну групу путника. Користећи &#039;&#039;CSP&#039;&#039; написати програм који решава овај проблем.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&lt;br /&gt;
[[Категорија:КДП]]&lt;br /&gt;
[[Категорија:Рокови]]&lt;/div&gt;</summary>
		<author><name>Fedja</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%90%D0%A1%D0%9F1&amp;diff=5724</id>
		<title>АСП1</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%90%D0%A1%D0%9F1&amp;diff=5724"/>
		<updated>2023-02-13T18:41:14Z</updated>

		<summary type="html">&lt;p&gt;Fedja: /* Потребна помоћ */ dodat prepis od anonimne brucoškinje `https://discord.com/channels/639225220552720391/696381655933386832/862805545671721002`&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Предмет&lt;br /&gt;
| назив     = Алгоритми и структуре података 1&lt;br /&gt;
| шифра     = 13С111АСП1&lt;br /&gt;
| семестар  = 2&lt;br /&gt;
| статус    = обавезни&lt;br /&gt;
| страница  = [https://rti.etf.bg.ac.rs/rti/ri3sp/index_si1.html rti.etf.rs/rti/ri3sp/index_si1.html]&lt;br /&gt;
| ЕСПБ      = 5&lt;br /&gt;
| одсек     = СИ&lt;br /&gt;
| следећи   = АСП2&lt;br /&gt;
}}&lt;br /&gt;
&#039;&#039;&#039;Алгоритми и структуре података 1&#039;&#039;&#039; је обавезан предмет у другом семестру на СИ. Слично градиво је такође обухваћено предметом треће године [[АСП|Алгоритми и структуре података]] РТИ одсека. [https://youtu.be/DAaqcpodgLE* Проблем је.]&lt;br /&gt;
&lt;br /&gt;
== Корисне везе ==&lt;br /&gt;
* [https://rti.etf.bg.ac.rs/rti/ri3sp/simulacije/VSA/VSA_01.02.15.zip Визуелни симулатор алгоритама] — за симулирање динамичког Хафмановог алгоритма по корацима&lt;br /&gt;
* [https://dcode.fr/lzw-compression LZW енкодер и декодер]&lt;br /&gt;
* [https://drive.google.com/open?id=1Jlb3o7zgITOTAUCdfNpD-rFRqDHrETB_ ETF SI] (питалице са лабораторијских вежби, наставни материјали, стари рокови)&lt;br /&gt;
&lt;br /&gt;
== Настава ==&lt;br /&gt;
На предмету се обрађују следеће области:&lt;br /&gt;
* &#039;&#039;&#039;Први блок:&#039;&#039;&#039; Линеарне структуре података (низови, уланчане листе, стекови, редови), генерисање псеудослучајних бројева (само на вежбама)&lt;br /&gt;
* &#039;&#039;&#039;Други блок:&#039;&#039;&#039; Стабла, увод у графове&lt;br /&gt;
* &#039;&#039;&#039;Трећи блок:&#039;&#039;&#039; Графови&lt;br /&gt;
Наставни материјали се налазе [https://rti.etf.bg.ac.rs/rti/ri3sp/materijali/index_si1.html на страници предмета.] Презентације са предавања се саме по себи не могу користити као литература, па се за то препоручује књига.&lt;br /&gt;
&lt;br /&gt;
== Домаћи ==&lt;br /&gt;
На предмету имају три домаћа задатка који заједно носе 20% оцене. Домаћи задаци се раде у програмском језику C (први и други домаћи могу и у програмском језику Python). Поставка домаћег задатка обично изађе 10 дана пре датума одбране и задаци су обично на тему градива обрађиваног у том блоку. Домаћи задаци од прошлих година се могу наћи на [https://web.archive.org/web/*/https://rti.etf.bg.ac.rs/rti/ri3sp/domaci/* Wayback Machine.]&lt;br /&gt;
&lt;br /&gt;
Домаћи задаци се бране на лабораторијским вежбама, и предају се обично до дан пред одбрану.&lt;br /&gt;
&lt;br /&gt;
== Лабораторијске вежбе ==&lt;br /&gt;
На лабораторијским вежбама се ради &#039;&#039;Moodle&#039;&#039; тест са 10 питања из градива тог блока од 20 минута, а затим се прелази на одбрану домаћег задатка код демонстратора. Демонстратор поред прегледања које ставке домаћег задатка раде, даје и модификације за домаћи задатак. Постоје три вежбе и оне носе укупно 10% оцене на предмету.&lt;br /&gt;
&lt;br /&gt;
== Испитни рокови ==&lt;br /&gt;
Испитни рокови су генерално доступни на страници предмета, али су последњих година из непознатих разлога престали да их поствљају. Свакако, решења ових рокова нису доступна, па се испод налазе нека решења. У јунском испитном року може се полагати само К3, К3 и К1 или К3 и К2. У свим осталим роковима, полаже се интегрални испит који садржи градиво сва три колоквијума.&lt;br /&gt;
&lt;br /&gt;
Уколико желите да додате рок, посетите &#039;&#039;&#039;[[Project:Направи#Стандард (латиница)|страницу за прављење рока]]&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Колоквијум 1 ===&lt;br /&gt;
{{#dpl:&lt;br /&gt;
| titleregexp     = АСП1/К1&lt;br /&gt;
| noresultsheader = Тренутно нема решених рокова.&lt;br /&gt;
| format          = ,\n* [[%PAGE%|²{#invoke:String¦sub¦%PAGE%¦6¦-1}²]],,&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Колоквијум 2 ===&lt;br /&gt;
{{#dpl:&lt;br /&gt;
| titleregexp     = АСП1/К2&lt;br /&gt;
| noresultsheader = Тренутно нема решених рокова.&lt;br /&gt;
| format          = ,\n* [[%PAGE%|²{#invoke:String¦sub¦%PAGE%¦6¦-1}²]],,&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Колоквијум 3 ===&lt;br /&gt;
{{#dpl:&lt;br /&gt;
| titleregexp     = АСП1/К3&lt;br /&gt;
| noresultsheader = Тренутно нема решених рокова.&lt;br /&gt;
| format          = ,\n* [[%PAGE%|²{#invoke:String¦sub¦%PAGE%¦6¦-1}²]],,&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Интегрални испит ===&lt;br /&gt;
{{#dpl:&lt;br /&gt;
| titleregexp     = АСП1/.* \d+$&lt;br /&gt;
| nottitleregexp  = АСП1/К\d&lt;br /&gt;
| noresultsheader = Тренутно нема решених рокова.&lt;br /&gt;
| format          = ,\n* [[%PAGE%|²{#invoke:String¦sub¦%PAGE%¦6¦-1}²]],,&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
За предмет је предвиђена књига:&lt;br /&gt;
* &#039;&#039;&#039;[https://akademska-misao.rs/product/algoritmi-i-strukture-podataka &amp;quot;Алгоритми и структуре података&amp;quot;]&#039;&#039;&#039;, Мило Томашевић, 2008. Издавач: &#039;&#039;Академска мисао, Београд&#039;&#039;&lt;br /&gt;
Градиво скоро у потпуности прати ову књигу, па је изузетно погодна за спремање испита и препоручује се њено коришћење.&lt;br /&gt;
&lt;br /&gt;
== Начин оцењивања ==&lt;br /&gt;
По [https://rti.etf.bg.ac.rs/rti/ri3sp/materijali/13S111ASP1_Propozicije.pdf пропозицијама] оцена се формира на основу:&lt;br /&gt;
* &#039;&#039;&#039;Л:&#039;&#039;&#039; Бодови са тестова знања са лабораторијских вежби.&lt;br /&gt;
* &#039;&#039;&#039;Д:&#039;&#039;&#039; Бодови са домаћих задатака.&lt;br /&gt;
* &#039;&#039;&#039;К1:&#039;&#039;&#039; Бодови са првог колоквијума.&lt;br /&gt;
* &#039;&#039;&#039;К2:&#039;&#039;&#039; Бодови са другог колоквијума.&lt;br /&gt;
* &#039;&#039;&#039;К3:&#039;&#039;&#039; Бодови са трећег колоквијума (само у јунском испитном року).&lt;br /&gt;
* &#039;&#039;&#039;И:&#039;&#039;&#039; Бодови са испита (у свим осталим испитним роковима, дакле бодови са колоквијума се важе само у јунском испитном року).&lt;br /&gt;
* &#039;&#039;&#039;П:&#039;&#039;&#039; Укупан број бодова. Формира се на два начина у зависности од тога да ли је испит рађен у јунском року или није:&lt;br /&gt;
** &#039;&#039;&#039;Ако јесте:&#039;&#039;&#039; &amp;lt;math&amp;gt;0.1 \cdot L + 0.2 \cdot D + 0.2 \cdot K_1 + 0.25 \cdot K_2 + 0.25 \cdot K_3&amp;lt;/math&amp;gt;&lt;br /&gt;
** &#039;&#039;&#039;Ако није:&#039;&#039;&#039; &amp;lt;math&amp;gt;0.1 \cdot L + 0.2 \cdot D + 0.7 \cdot I&amp;lt;/math&amp;gt;&lt;br /&gt;
На свакој активности се може освојити максимално 100 бодова. Коначна оцена се формира на основу:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Поена&lt;br /&gt;
! П ≤ 50&lt;br /&gt;
! 50 &amp;lt; П ≤ 60&lt;br /&gt;
! 60 &amp;lt; П ≤ 70&lt;br /&gt;
! 70 &amp;lt; П ≤ 80&lt;br /&gt;
! 80 &amp;lt; П ≤ 90&lt;br /&gt;
! 90 &amp;lt; П&lt;br /&gt;
|-&lt;br /&gt;
! Оцена&lt;br /&gt;
| 5&lt;br /&gt;
| 6&lt;br /&gt;
| 7&lt;br /&gt;
| 8&lt;br /&gt;
| 9&lt;br /&gt;
| 10&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Калкулатор ===&lt;br /&gt;
&amp;lt;div class=&amp;quot;calculator&amp;quot;&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;L1&amp;lt;/math&amp;gt;: &amp;lt;span data-variable=&amp;quot;L1&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;L2&amp;lt;/math&amp;gt;: &amp;lt;span data-variable=&amp;quot;L2&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;L3&amp;lt;/math&amp;gt;: &amp;lt;span data-variable=&amp;quot;L3&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;D1&amp;lt;/math&amp;gt;: &amp;lt;span data-variable=&amp;quot;D1&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;D2&amp;lt;/math&amp;gt;: &amp;lt;span data-variable=&amp;quot;D2&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;D3&amp;lt;/math&amp;gt;: &amp;lt;span data-variable=&amp;quot;D3&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;K1&amp;lt;/math&amp;gt;: &amp;lt;span data-variable=&amp;quot;K1&amp;quot;&amp;gt;&amp;lt;/span&amp;gt; (оставити празно уколико се ради интегрални испит)&lt;br /&gt;
* &amp;lt;math&amp;gt;K2&amp;lt;/math&amp;gt;: &amp;lt;span data-variable=&amp;quot;K2&amp;quot;&amp;gt;&amp;lt;/span&amp;gt; (оставити празно уколико се ради интегрални испит)&lt;br /&gt;
* &amp;lt;math&amp;gt;K3&amp;lt;/math&amp;gt;: &amp;lt;span data-variable=&amp;quot;K3&amp;quot;&amp;gt;&amp;lt;/span&amp;gt; (оставити празно уколико се ради интегрални испит)&lt;br /&gt;
* &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt;: &amp;lt;span data-variable=&amp;quot;I&amp;quot;&amp;gt;&amp;lt;/span&amp;gt; (оставити празно уколико се полаже преко колоквијума)&lt;br /&gt;
* &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;: &amp;lt;span data-variable=&amp;quot;P&amp;quot; data-expression=&amp;quot;L1 L2 L3 + + 3 / 0.1 * D1 D2 D3 + + 3 / 0.2 * K1 0.2 * K2 0.25 * K3 0.25 * + + I 0.7 * max + +&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Оцена: &amp;lt;span data-expression=&amp;quot;P 10 / ceil 5 max 10 min&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Потребна помоћ ==&lt;br /&gt;
* {{zadaci|rešenja}}&lt;br /&gt;
*: Рокови који су преписани а нису решени су: {{rokovi|нерешени}}&lt;br /&gt;
*: Рокови којима недостаје понеко решење су: {{rokovi|делимично решени}}&lt;br /&gt;
* {{zadaci|postavke}} (Уколико радите испит после јулског рока, покушајте да запамтите задатке пошто се они најчешће не објављују.)&lt;br /&gt;
* Наредним генерацијама би вероватно значиле питалице са лабораторијских вежби.&lt;br /&gt;
* {{zadaci|prepis}}&lt;br /&gt;
** Јул 2021 К3: [https://cdn.discordapp.com/attachments/696381655933386832/862805545845391400/jul_2021_K3.docx]&lt;/div&gt;</summary>
		<author><name>Fedja</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9D%D0%B5%D1%83%D1%80%D0%B0%D0%BB%D0%BD%D0%B5_%D0%BC%D1%80%D0%B5%D0%B6%D0%B5&amp;diff=5723</id>
		<title>Неуралне мреже</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9D%D0%B5%D1%83%D1%80%D0%B0%D0%BB%D0%BD%D0%B5_%D0%BC%D1%80%D0%B5%D0%B6%D0%B5&amp;diff=5723"/>
		<updated>2023-02-13T18:38:36Z</updated>

		<summary type="html">&lt;p&gt;Fedja: /* Потребна помоћ */ dodat prepis od `&amp;lt;@692464108091474012&amp;gt;`&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Предмет&lt;br /&gt;
| шифра     = 13С053НМ, 13Е054НМ&lt;br /&gt;
| семестар  = 5&lt;br /&gt;
| статус    = изборни&lt;br /&gt;
| страница  = [https://automatika.etf.bg.ac.rs/sr/13s053nm automatika.etf.rs/13s053nm]&lt;br /&gt;
| одсек     = СИ, ОС&lt;br /&gt;
}}&lt;br /&gt;
&#039;&#039;&#039;Неуралне мреже&#039;&#039;&#039; (и фази логика) је изборни предмет из петог семестра на СИ, и седмог семестра на Сигналима и системима.&lt;br /&gt;
&lt;br /&gt;
== Корисне везе ==&lt;br /&gt;
* [https://drive.google.com/open?id=1DJyxOlh-CM7649Y0j34wMkCjtvLr6dDW ETF SI] (белешке, рокови)&lt;br /&gt;
* [https://drive.google.com/open?id=1CUoqF2c9phQftTn190DjcA2_0WY-iCul &#039;&#039;Google Drive&#039;&#039; Јелене Медаревић] (белешке, рокови)&lt;br /&gt;
&lt;br /&gt;
== Настава ==&lt;br /&gt;
На предавањима се обрађује следеће градиво:&lt;br /&gt;
* &#039;&#039;&#039;Први блок:&#039;&#039;&#039; Појам неурона, активационе функције, основе обучавања, опште правило обучавања, трансфер функције, перцептрон, обучавање перцептрона, Адалина&lt;br /&gt;
* &#039;&#039;&#039;Други блок:&#039;&#039;&#039; Пропагација грешке уназад (понекад буде предавана у првом блоку), преобучавање, регуларизација, рано заустављање, поткресивање, конволуционе неуралне мреже&lt;br /&gt;
* &#039;&#039;&#039;Трећи блок:&#039;&#039;&#039; фази логика (фази променљиве, фази скупови, фази правила, фази закључивање, фази експертски системи, фази операције, фази релације, композиција)&lt;br /&gt;
Градиво са предавања је генерално потребно на колоквијумима, док се на вежбама више ради у Python (са &#039;&#039;TensorFlow&#039;&#039; библиотеком) и Simulink него за колоквијуме, и оне служе за рад на пројекту.&lt;br /&gt;
&lt;br /&gt;
Испит на предмету се састоји од дела из фази логике од 30 бодова, и дела из неуралних мрежа од 10 бодова (на коме може да дође било шта од претходног градива из неуралних мрежа).&lt;br /&gt;
&lt;br /&gt;
== Практични тест ==&lt;br /&gt;
{{непотпун одељак}}&lt;br /&gt;
На предмету постоји практични тест који носи 12 бодова и на коме долази градиво неуралних мрежа. Постоје два термина за практични тест.&lt;br /&gt;
&lt;br /&gt;
== Пројекат ==&lt;br /&gt;
Постоје два пројекта за укупно 18 бодова.&lt;br /&gt;
&lt;br /&gt;
Први пројекат је из неуралних мрежа, носи 11 бодова и може да се брани само у јануарском року. Пројекат се ради у Python и поступак рада је већ описан на претходним вежбама. Могуће је узети и специјални пројекат из неуралних мрежа уместо обичног, са темом којом предлаже студент, који може да се брани у сваком року.&lt;br /&gt;
&lt;br /&gt;
Други пројекат је из фази логике, носи 7 бодова и може да се брани у јануарском или фебруарском року. Ради се у Simulink, програму који долази уз MATLAB и служи за симулирање блок дијаграма. Поступак рада је обично описан међу последњим вежбама. Могуће је пренети бодове са испита у јануарском испитном року уколико се брани пројекат из фази логике у фебруару, с тим што се онда мора пријавити испит и за фебруар.&lt;br /&gt;
&lt;br /&gt;
== Испитни рокови ==&lt;br /&gt;
На страници предмета може се наћи мали број ранијих рокова. За вежбање се препоручују белешке студената са драјвова из [[#Корисне везе|одељка за корисне везе]], док се још неки сакупљени рокови на викију могу наћи испод:&lt;br /&gt;
{{#dpl:&lt;br /&gt;
| titleregexp     = Неуралне_мреже/.* \d+&lt;br /&gt;
| noresultsheader = Тренутно нема решених колоквијума.&lt;br /&gt;
| format          = ,\n* [[%PAGE%|²{#invoke:String¦sub¦%PAGE%¦16¦-1}²]],,&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Начин оцењивања ==&lt;br /&gt;
* &amp;lt;math&amp;gt;K_1&amp;lt;/math&amp;gt; — Први колоквијум (0-100)&lt;br /&gt;
* &amp;lt;math&amp;gt;K_2&amp;lt;/math&amp;gt; — Бодови са колоквијума (0-100)&lt;br /&gt;
* &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; — Бодови са практичног теста (неуралне мреже) (0-100)&lt;br /&gt;
* &amp;lt;math&amp;gt;P_1&amp;lt;/math&amp;gt; — Бодови са првог пројекта (неуралне мреже, одбрана само у јануарском року) (0-100)&lt;br /&gt;
* &amp;lt;math&amp;gt;P_2&amp;lt;/math&amp;gt; — Бодови са другог пројекта (fuzzy логика, одбрана у јануарском  и фебруарском року) (0-100)&lt;br /&gt;
* &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; — Бодови са испита (0-100)&lt;br /&gt;
* Надокнаде колоквијума могуће само у јануарском року&lt;br /&gt;
* &#039;&#039;&#039;Укупни бодови:&#039;&#039;&#039; &amp;lt;math&amp;gt;P = 0.2K_1 + 0.2K_2 + 0.11P_1 + 0.07P_2 + 0.12T + 0.3I&amp;lt;/math&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Бодови&lt;br /&gt;
| &amp;lt;math&amp;gt;P \leq 50&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;50 &amp;lt; P \leq 60&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;60 &amp;lt; P \leq 70&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;70 &amp;lt; P \leq 80&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;80 &amp;lt; P \leq 90&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;90 &amp;lt; P&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Оцена&lt;br /&gt;
| 5 || 6 || 7 || 8 || 9 || 10&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Потребна помоћ ==&lt;br /&gt;
* {{zadaci|rešenja}}&lt;br /&gt;
*: Рокови који су преписани а нису решени су: {{rokovi|нерешени}}&lt;br /&gt;
* {{zadaci|postavke}}&lt;br /&gt;
* {{zadaci|prepis}}&lt;br /&gt;
** Испит фебруар 2021: [https://cdn.discordapp.com/attachments/725100359403438141/941410133756506163/IMG-20220206-WA0014.jpg] [https://media.discordapp.net/attachments/725100359403438141/941410134033334333/IMG-20220206-WA0013.jpg?width=274&amp;amp;height=486] [https://media.discordapp.net/attachments/725100359403438141/941410134410813460/IMG-20220206-WA0011.jpg?width=864&amp;amp;height=486] [https://media.discordapp.net/attachments/725100359403438141/941410134696017930/IMG-20220206-WA0010.jpg?width=863&amp;amp;height=486] [https://media.discordapp.net/attachments/725100359403438141/941410134930915368/IMG-20220206-WA0012.jpg?width=273&amp;amp;height=485] [https://media.discordapp.net/attachments/725100359403438141/941410135153192980/IMG-20220206-WA0006.jpg?width=1017&amp;amp;height=221] [https://media.discordapp.net/attachments/725100359403438141/941410135421616189/IMG-20220206-WA0009.jpg?width=864&amp;amp;height=486] [https://media.discordapp.net/attachments/725100359403438141/941410135656517672/IMG-20220206-WA0008.jpg?width=274&amp;amp;height=486] [https://media.discordapp.net/attachments/725100359403438141/941410135924944976/IMG-20220206-WA0005.jpg?width=864&amp;amp;height=486] [https://media.discordapp.net/attachments/725100359403438141/941410136138842152/IMG-20220206-WA0004.jpg?width=864&amp;amp;height=486]&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Пети семестар]]&lt;br /&gt;
[[Категорија:Изборни предмети]]&lt;br /&gt;
[[Категорија:Неуралне мреже]]&lt;/div&gt;</summary>
		<author><name>Fedja</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9C%D0%B0%D1%82%D0%B5%D0%BC%D0%B0%D1%82%D0%B8%D0%BA%D0%B0_1&amp;diff=5722</id>
		<title>Математика 1</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9C%D0%B0%D1%82%D0%B5%D0%BC%D0%B0%D1%82%D0%B8%D0%BA%D0%B0_1&amp;diff=5722"/>
		<updated>2023-02-13T18:33:57Z</updated>

		<summary type="html">&lt;p&gt;Fedja: /* Потребна помоћ */ dodati rokovi od `https://discord.com/channels/639225220552720391/696381655933386832/1062362888976744509`&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Предмет&lt;br /&gt;
| шифра    = 13С081М1&lt;br /&gt;
| семестар = 1&lt;br /&gt;
| статус   = обавезни&lt;br /&gt;
| страница = [http://matematika.etf.bg.ac.rs/si/M1/SI%20Matematika%201.htm matematika.etf.rs/si/M1/SI Matematika 1.htm]&lt;br /&gt;
| ЕСПБ     = 5&lt;br /&gt;
| одсек    = СИ, ЕР&lt;br /&gt;
| следећи  = Математика 2&lt;br /&gt;
}}&lt;br /&gt;
&#039;&#039;&#039;Математика 1&#039;&#039;&#039; је обавезан предмет у првом семестру на оба студијска програма (али се сами предмети по градиву и организацији разликују између студијских програма).&lt;br /&gt;
&lt;br /&gt;
== Корисне везе ==&lt;br /&gt;
* [https://drive.google.com/open?id=0BwufrjuWVdV-Vk1MS1JlTE5vNzA&amp;amp;resourcekey=0-c3c-jM25LkCu6JQMi-gFLQ ETF SI] (рокови, наставни документи, стари домаћи задаци)&lt;br /&gt;
* [https://mega.nz/folder/MZI32CCQ#zBwhXjwBEJGcavSNS22AWA/folder/kAQHyQLJ (ER) BAZA (1. godina)] (рокови, наставни документи, додатна литература)&lt;br /&gt;
* [https://youtube.com/c/ElektronEtf/playlists?view=50&amp;amp;sort=dd&amp;amp;shelf_id=28 Електрон видео туторијали]&lt;br /&gt;
&lt;br /&gt;
== Настава ==&lt;br /&gt;
=== Предавања ===&lt;br /&gt;
На предавањима се обрађују следеће области:&lt;br /&gt;
* &#039;&#039;&#039;Први блок:&#039;&#039;&#039; Алгебарске структуре, матрице, детерминанте, системи линеарних једначина&lt;br /&gt;
* &#039;&#039;&#039;Други блок:&#039;&#039;&#039; Низови, граничне вредности (лимеси)&lt;br /&gt;
* &#039;&#039;&#039;Трећи блок:&#039;&#039;&#039; Функције, изводи, Тејлоров/Маклоренов полином&lt;br /&gt;
Предавања су углавном теоријска и не ради се много задатака, али су неопходна јер се сваки колоквијум састоји од дела са теоријом и дела са задацима, и на оба дела се појединачно мора добити довољан број бодова како би се положио предмет.&lt;br /&gt;
&lt;br /&gt;
Следећа три документа покривају градиво које је испредавао проф. др Бранко Малешевић на својим предавањима у групи П4 током 2019/20. школске године. Први документ покрива градиво првог колоквијума (алгебарске структуре и матрице), други документ градиво другог колоквијума (граничне вредности низова и функција) и трећи документ покрива део градива другог и градиво трећег колоквијума (непрекидност, изводи и примена извода). Четврти документ такође покрива градиво трећег колоквијума испредавано у групама П2 и П3.&lt;br /&gt;
* K1: [[{{ns:-2}}:M1 K1 - Malešević (P4) - Algebarske strukture, matrice.pdf|Малешевић (П4)]]&lt;br /&gt;
* K2: [[{{ns:-2}}:M1 K2 - Malešević (P4) - Granične vrednosti.pdf|Малешевић (П4)]]&lt;br /&gt;
* K3: [[{{ns:-2}}:M1 K3 - Malešević (P4) - Neprekidnost, izvodi, primene izvoda.pdf|Малешевић (П4)]], [[{{ns:-2}}:M1 K3 - Rašajski (P2-3).pdf|Рашајски (П2/П3)]]&lt;br /&gt;
На драјвовима из [[#Корисне везе|одељка за корисне везе]] се такође могу наћи неке белешке са предавања.&lt;br /&gt;
&lt;br /&gt;
=== Вежбе ===&lt;br /&gt;
На вежбама се раде задаци из теоријског дела слично онима који могу доћи на колоквијуму. Додатно, на вежбама у првом блоку се обрађује област полинома, која се не обрађује на предавањима и може доћи само на делу колоквијума за задатке.&lt;br /&gt;
&lt;br /&gt;
Разни материјали добијени на вежбама:&lt;br /&gt;
{{#dpl:&lt;br /&gt;
| namespace       = File&lt;br /&gt;
| titleregexp     = M1 Vežbe&lt;br /&gt;
| noresultsheader = Тренутно нема докумената.&lt;br /&gt;
| format          = ,\n* [[Медија:%TITLE%|²{#invoke:String¦sub¦%PAGE%¦20¦-5}²]],,&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Домаћи ==&lt;br /&gt;
Домаћи на предмету носе 10% оцене, има их три (за сваки блок по један) и сви бодови се добијају на одбрани домаћих организованој пре јануарског испитног рока. Професор објављује сваки домаћи на страници предмета током обрађивања теме у вези са тим домаћим на предмету.&lt;br /&gt;
&lt;br /&gt;
Почев од школске 2020/2021. године бодови са домаћег у групама којима предају професорке Марија Рашајски и Татјана Лутовац су се добијали тако што се након предавања преписивало градиво са презентација и слало до суботе увече. Свако преписано предавање вредело је 1 бод од укупно 10. Укупно има 12 презентација, па две презентације не морају да се препишу за максималан број бодова.&lt;br /&gt;
&lt;br /&gt;
== Испитни рокови ==&lt;br /&gt;
Испитни рокови нису званично доступни, али су претходне генерације студената чувале неке од претходних рокова. Старији (али и даље релевантни) рокови могу се наћи међу драјвовима у [[#Корисне везе|одељку за корисне везе]], док се рокови сачувани на викију могу наћи испод:&lt;br /&gt;
{{#dpl:&lt;br /&gt;
| titleregexp     = Математика 1/\S+ \d+&lt;br /&gt;
| noresultsheader = Тренутно нема рокова.&lt;br /&gt;
| format          = ,\n* [[%PAGE%|²{#invoke:String¦sub¦%PAGE%¦14¦-1}²]],,&lt;br /&gt;
}}&lt;br /&gt;
Уколико желите да додате рок, посетите &#039;&#039;&#039;[[Project:Направи#Математика|страницу за прављење рока]]&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
Овај предмет се може положити са највишом оценом без коришћења литературе. За темељно спремање корисне су следеће књиге:&lt;br /&gt;
* &#039;&#039;&#039;[https://akademska-misao.rs/product/linearna-algebra-2 &amp;quot;Линеарна алгебра&amp;quot;]&#039;&#039;&#039;, Марија Рашајски et al., Издавач: &#039;&#039;Академска мисао, Београд&#039;&#039; - за градиво за К1&lt;br /&gt;
* &#039;&#039;&#039;[https://akademska-misao.rs/product/matematicka-analiza-teorija-i-hiljadu-zadataka-iii-izmenjeno-i-dopunjeno-izdanje &amp;quot;Математичка анализа – теорија и хиљаду задатака&amp;quot;]&#039;&#039;&#039; – III измењено и допуњено издање, 2018, Милан Меркле, Издавач: &#039;&#039;Академска мисао, Београд&#039;&#039; (градиво за К2 и К3).&lt;br /&gt;
&lt;br /&gt;
== Начин оцењивања ==&lt;br /&gt;
* &#039;&#039;&#039;D&#039;&#039;&#039; — Бодови са домаћих задатака (макс. 10).&lt;br /&gt;
* &#039;&#039;&#039;K1, K2, K3&#039;&#039;&#039; — Бодови са првог, другог и трећег колоквијума. Први колоквијум је могуће поправити у другој колоквијумској недељи. Трећи колоквијум (парцијални испит) се одржава током испитног рока. Сваки колоквијум се састоји из теоријског дела (18 бодова) и задатака (12 бодова).&lt;br /&gt;
* &#039;&#039;&#039;I&#039;&#039;&#039; — Бодови са интегралног испита, који садржи градиво другог и трећег колоквијума и могуће га је радити у испитном року.&lt;br /&gt;
* &#039;&#039;&#039;P&#039;&#039;&#039; — Бодови за рачунање оцене, зависе од тога да ли је рађен интегрални испит или не. &amp;lt;math&amp;gt;P = \left\{\begin{array}{ll}&lt;br /&gt;
    D + K1 + I, &amp;amp; \text{ако јесте} \\&lt;br /&gt;
    D + K1 + K2 + K3, &amp;amp; \text{ако није}&lt;br /&gt;
\end{array}\right.&amp;lt;/math&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Услов за полагање:&#039;&#039;&#039;&lt;br /&gt;
** 27 или више бодова на свим теоријским деловима укупно&lt;br /&gt;
** 18 или више бодова на свим задацима укупно&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Бодови&lt;br /&gt;
| &amp;lt;math&amp;gt;P \leq 50&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;50 &amp;lt; P \leq 60&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;60 &amp;lt; P \leq 70&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;70 &amp;lt; P \leq 80&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;80 &amp;lt; P \leq 90&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;90 &amp;lt; P&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Оцена&lt;br /&gt;
| 5 || 6 || 7 || 8 || 9 || 10&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Калкулатор ===&lt;br /&gt;
&amp;lt;div class=&amp;quot;calculator&amp;quot;&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;: &amp;lt;span data-variable=&amp;quot;D&amp;quot; data-max=&amp;quot;10&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;K1&amp;lt;/math&amp;gt;:&lt;br /&gt;
** Теорија: &amp;lt;span data-variable=&amp;quot;K1T&amp;quot; data-max=&amp;quot;18&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
** Задаци: &amp;lt;span data-variable=&amp;quot;K1Z&amp;quot; data-max=&amp;quot;12&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
** Укупно: &amp;lt;span data-expression=&amp;quot;K1T K1Z +&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;K2&amp;lt;/math&amp;gt;:&lt;br /&gt;
** Теорија: &amp;lt;span data-variable=&amp;quot;K2T&amp;quot; data-max=&amp;quot;18&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
** Задаци: &amp;lt;span data-variable=&amp;quot;K2Z&amp;quot; data-max=&amp;quot;12&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
** Укупно: &amp;lt;span data-expression=&amp;quot;K2T K2Z +&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;K3&amp;lt;/math&amp;gt;:&lt;br /&gt;
** Теорија: &amp;lt;span data-variable=&amp;quot;K3T&amp;quot; data-max=&amp;quot;18&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
** Задаци: &amp;lt;span data-variable=&amp;quot;K3Z&amp;quot; data-max=&amp;quot;12&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
** Укупно: &amp;lt;span data-expression=&amp;quot;K3T K3Z +&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Укупно теорија: &amp;lt;span data-variable=&amp;quot;T&amp;quot; data-expression=&amp;quot;K1T K2T K3T + +&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Укупно задаци: &amp;lt;span data-variable=&amp;quot;Z&amp;quot; data-expression=&amp;quot;K1Z K2Z K3Z + +&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Укупно: &amp;lt;span data-variable=&amp;quot;P&amp;quot; data-expression=&amp;quot;T Z D + +&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Услов испуњен: &amp;lt;span data-variable=&amp;quot;U&amp;quot; data-expression=&amp;quot;T 26.999 - ceil 0 max 1 min  Z 17.999 - ceil 0 max 1 min + 1.999 - ceil 0 max 1 min&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Оцена: &amp;lt;span data-expression=&amp;quot;P U * 10 / ceil 5 max 10 min&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Потребна помоћ ==&lt;br /&gt;
* {{zadaci|rešenja}} Решења фале на следећим роковима: {{rokovi|нерешени}}&lt;br /&gt;
* {{zadaci|postavke}}&lt;br /&gt;
* {{zadaci|prepis}}&lt;br /&gt;
** &amp;quot;Гомила скорашњих М1 рокова у изворном формату&amp;quot;: [https://cdn.discordapp.com/attachments/696381655933386832/1062362888888651866/Primeri_ispita.zip]&lt;/div&gt;</summary>
		<author><name>Fedja</name></author>
	</entry>
</feed>