<?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=Andrija</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=Andrija"/>
	<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/Andrija"/>
	<updated>2026-06-04T03:15:30Z</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&amp;diff=8349</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=8349"/>
		<updated>2026-03-14T23:15:11Z</updated>

		<summary type="html">&lt;p&gt;Andrija: лабела &amp;quot;Табела симбола&amp;quot;&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;
* [https://docs.google.com/spreadsheets/d/1FhDa3-M4vlaFJOpblQJ_wJOiWLhIX1H6NKMOhdXCqE4/edit?gid=0#gid=0 Google tabela] листинг свих пронађених питања с рокова (последње ажурирано јануара 2024.) уз лабелирање по областима&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;
Поставка пројекта се не мења много кроз године. У јануарском и фебруарском року важи једна поставка, у јулском се на ту поставку дода још захтева и у августовском и септембарском још више захтева.&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;
&lt;br /&gt;
* [[Програмски преводиоци 1/Табела симбола|Табела симбола]]&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>Andrija</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%A2%D0%B0%D0%B1%D0%B5%D0%BB%D0%B0_%D1%81%D0%B8%D0%BC%D0%B1%D0%BE%D0%BB%D0%B0&amp;diff=8348</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%A2%D0%B0%D0%B1%D0%B5%D0%BB%D0%B0_%D1%81%D0%B8%D0%BC%D0%B1%D0%BE%D0%BB%D0%B0&amp;diff=8348"/>
		<updated>2026-03-14T23:09:06Z</updated>

		<summary type="html">&lt;p&gt;Andrija: Нова страница: {{tocright}} &amp;#039;&amp;#039;&amp;#039;Табела симбола&amp;#039;&amp;#039;&amp;#039;. {{Ознака задатка|Табела симбола}} Категорија:Програмски преводиоци 1&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;
[[Категорија:Програмски преводиоци 1]]&lt;/div&gt;</summary>
		<author><name>Andrija</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_2022&amp;diff=8347</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%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_2022&amp;diff=8347"/>
		<updated>2026-03-14T23:07:00Z</updated>

		<summary type="html">&lt;p&gt;Andrija: dodat tag&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&#039;&#039;&#039;Ispit u januarskom roku 2022. godine&#039;&#039;&#039; održan je 28. januara. Postavka roka je dostupna [http://ir4pp1.etf.rs/Rokovi/2021-2022/pp1-januar-2021-22.pdf sa stranice predmeta.]&lt;br /&gt;
&lt;br /&gt;
== 1. zadatak ==&lt;br /&gt;
{{delimično rešeno}}&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Odrediti minimalni konačni deterministički automat koji prihvata one i samo one ulazne sekvence koje NE prihvata konačni automat sa slike ali kada se čitaju sa desna u levo. Na primer, dati automat ne prihvata sekvencu ab, to znači da traženi automat treba da prihvati sekvencu ba. Postupak izložiti po koracima, na generalan način koji bi se mogao primeniti i na svaki drugi automat.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Stanje !! a !! b !! Prihvata&lt;br /&gt;
|-&lt;br /&gt;
| → A    || B ||   || 0&lt;br /&gt;
|-&lt;br /&gt;
| B      || C || D || 0&lt;br /&gt;
|-&lt;br /&gt;
| C      ||   ||   || 1&lt;br /&gt;
|-&lt;br /&gt;
| D      ||   || F || 0&lt;br /&gt;
|-&lt;br /&gt;
| F      || F || F || 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Prvi korak je da dodamo eksplictno stanje greške i da ga dodamo u prazna polja. &amp;lt;br&amp;gt;&lt;br /&gt;
Drugi korak je da izračunamo skup prethodnika za sva stanja (na grafu bi to bilo obrtanje strellica). &amp;lt;br&amp;gt;&lt;br /&gt;
Treći korak je konstruišemo DKA sa ovim novim funkcijama prelaza, gde će nam početno stanje biti stanja prihvatanja originalnog automata,&lt;br /&gt;
a stanje prihvatanja početno stanje originalnog automata.&lt;br /&gt;
&lt;br /&gt;
S0 = {B, F} &amp;lt;br&amp;gt;&lt;br /&gt;
δ(S0, a) = {B}∪{F} = S1 = {B,F} &amp;lt;br&amp;gt;&lt;br /&gt;
δ(S0, a) = ∅ ∪ {D,F} = S2={D,F} &amp;lt;br&amp;gt;&lt;br /&gt;
Analogno ćemo ovo uraditi za svako stanje. &amp;lt;br&amp;gt;&lt;br /&gt;
Svako stanje koje u sebi sadrži u sebi početno stanje originalnog automata je stanje prihvatanja.&lt;br /&gt;
I na kraju da bi dobili odgovarajući automat radimo komplement tj. obrnemo stanja prihvatanja.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Traženi automat:&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Stanje !! a !! b !! Prihvata&lt;br /&gt;
|-&lt;br /&gt;
| → S0={C,F}    || S1 || S2 || 1&lt;br /&gt;
|-&lt;br /&gt;
| S1={B,F}      || S5 || S2 || 1&lt;br /&gt;
|-&lt;br /&gt;
| S2={D,F}      || S3 || S4 || 1&lt;br /&gt;
|-&lt;br /&gt;
| S3={F}      || S3 || S2 || 1&lt;br /&gt;
|-&lt;br /&gt;
| S4={B,D,F}      || S5 || S4 || 1&lt;br /&gt;
|-&lt;br /&gt;
| S5={A,F}      || S3 || S2 || 0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 2. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Za smene 1 i 2 date gramatike navesti koje atribute treba računati i od kojih drugih atributa oni mogu da zavise da bi cela gramatika bila L-atributivna. Pravila navoditi u obliku aa = f(bb, cc, dd,..) gde je aa atribut koji mora da se računa, dok su bb, cc, dd, itd svi drugi atributi od kojih posmatrani može da zavisi. Neterminal &amp;amp;lt;S&amp;gt; ima sintetizovan atribut.&lt;br /&gt;
# Navesti pseudokod za proceduru A u parseru na bazi rekurzivnog spusta. Ostale delove parsera ne navoditi. Preimenovati promenljive da se minimizuje broj pravila kopiranja vrednosti atributa.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
# &amp;amp;lt;S&amp;gt;&amp;lt;sub&amp;gt;x&amp;lt;/sub&amp;gt; → a&amp;lt;sub&amp;gt;y&amp;lt;/sub&amp;gt; &amp;amp;lt;A&amp;gt;&amp;lt;sub&amp;gt;z,v,w&amp;lt;/sub&amp;gt; &amp;amp;lt;S&amp;gt;&amp;lt;sub&amp;gt;p&amp;lt;/sub&amp;gt; {b&amp;lt;sub&amp;gt;q&amp;lt;/sub&amp;gt;}&lt;br /&gt;
# &amp;amp;lt;S&amp;gt;&amp;lt;sub&amp;gt;x&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt; → d&amp;lt;sub&amp;gt;y&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt; {c&amp;lt;sub&amp;gt;z&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;} &amp;amp;lt;A&amp;gt;&amp;lt;sub&amp;gt;v&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, w&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;, p&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;&lt;br /&gt;
# &amp;amp;lt;A&amp;gt;&amp;lt;sub&amp;gt;x,y,z&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt; → a&amp;lt;sub&amp;gt;q&amp;lt;/sub&amp;gt; {c&amp;lt;sub&amp;gt;v&amp;lt;/sub&amp;gt;} &amp;amp;lt;A&amp;gt;&amp;lt;sub&amp;gt;x&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;,z,u&amp;lt;/sub&amp;gt; &amp;amp;lt;A&amp;gt;&amp;lt;sub&amp;gt;u,t,y&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;&lt;br /&gt;
## &amp;lt;math&amp;gt;v \larr x - q&amp;lt;/math&amp;gt;&lt;br /&gt;
## &amp;lt;math&amp;gt;x_1 \larr x&amp;lt;/math&amp;gt;&lt;br /&gt;
## &amp;lt;math&amp;gt;y \larr y_1&amp;lt;/math&amp;gt;&lt;br /&gt;
## &amp;lt;math&amp;gt;z_1 \larr z&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;amp;lt;A&amp;gt;&amp;lt;sub&amp;gt;t,s,s&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt; → d&amp;lt;sub&amp;gt;q&amp;lt;/sub&amp;gt; {b&amp;lt;sub&amp;gt;t&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;} a&amp;lt;sub&amp;gt;s&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;&amp;lt;/sub&amp;gt;&lt;br /&gt;
## &amp;lt;math&amp;gt;t_1 \larr t&amp;lt;/math&amp;gt;&lt;br /&gt;
## &amp;lt;math&amp;gt;(s,s_1) \larr s_2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Iz date gramatike možemo zaključiti sledeće o tipovima atributa:&lt;br /&gt;
* Akcije &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; i &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; sadrže nasleđene atribute.&lt;br /&gt;
* Neterminal &amp;lt;code&amp;gt;&amp;amp;lt;A&amp;gt;&amp;lt;/code&amp;gt; sadrži tri atributa, od kojih je prvi nasleđen a druga dva sintetizovana.&lt;br /&gt;
Na osnovu toga, u prvoj smeni vidimo da atributi mogu imati sledeće vrednosti:&lt;br /&gt;
* &amp;lt;math&amp;gt;x = f(y, z, v, w, p, q)&amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;z = f(y)&amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;q = f(y, z, v, w, p)&amp;lt;/math&amp;gt;&lt;br /&gt;
a u drugoj smeni sledeće:&lt;br /&gt;
* &amp;lt;math&amp;gt;x1 = f(y_1, z_1, v_1, w_1, p_1)&amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;z1 = f(y_1)&amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;v1 = f(y_1, z_1)&amp;lt;/math&amp;gt;&lt;br /&gt;
Kod parsera sa adekvatno preimenovanim atributima dat je ispod:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void A(int x, int&amp;amp; y, int&amp;amp; z) {&lt;br /&gt;
    switch (input) {&lt;br /&gt;
        case &#039;a&#039;:&lt;br /&gt;
            input = advance();&lt;br /&gt;
            int q = getInputValue();&lt;br /&gt;
            out(&#039;c&#039;, x - q);&lt;br /&gt;
            int u;&lt;br /&gt;
            A(x, z, u);&lt;br /&gt;
            int t;&lt;br /&gt;
            A(u, t, y);&lt;br /&gt;
            break;&lt;br /&gt;
        case &#039;d&#039;:&lt;br /&gt;
            input = advance();&lt;br /&gt;
            out(&#039;b&#039;, x);&lt;br /&gt;
            input = advance();&lt;br /&gt;
            y = z = getInputValue();&lt;br /&gt;
            break;&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;
Zadata je gramatika&lt;br /&gt;
# &amp;amp;lt;S&amp;gt; → &amp;amp;lt;S&amp;gt; b &amp;amp;lt;A&amp;gt;&lt;br /&gt;
# &amp;amp;lt;S&amp;gt; → &amp;amp;lt;A&amp;gt; a &amp;amp;lt;B&amp;gt; b&lt;br /&gt;
# &amp;amp;lt;A&amp;gt; → &amp;amp;lt;B&amp;gt; c &amp;amp;lt;B&amp;gt; d&lt;br /&gt;
# &amp;amp;lt;A&amp;gt; → ε&lt;br /&gt;
# &amp;amp;lt;B&amp;gt; → ε&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Konstruisati karaketristični&amp;lt;sup&amp;gt;[sic]&amp;lt;/sup&amp;gt; automat LR(0) parsera kao i odgovarajuću kontrolnu tabelu. Da li ima konflikata?&lt;br /&gt;
# Konstruisati kontrolnu tabelu SLR(1) parsera. Da li ima konflikata?&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
[[Датотека:PPR januar 2022 zadatak 3 automat.svg|thumb|Karakteristični LR(0) automat u trećem zadatku.]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Kontrolna tabela LR(0) parsera&lt;br /&gt;
! Stanje              !! Akcija&lt;br /&gt;
|-&lt;br /&gt;
| &amp;amp;lt;S&#039;&amp;gt;&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || &#039;&#039;&#039;R/R konflikt&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;amp;lt;A&amp;gt;&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;  || SHIFT&lt;br /&gt;
|-&lt;br /&gt;
| &amp;amp;lt;B&amp;gt;&amp;lt;sub&amp;gt;31&amp;lt;/sub&amp;gt; || SHIFT&lt;br /&gt;
|-&lt;br /&gt;
| &amp;amp;lt;S&amp;gt;&amp;lt;sub&amp;gt;x&amp;lt;/sub&amp;gt;  || SHIFT&lt;br /&gt;
|-&lt;br /&gt;
| c&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt;       || REDUCE(5)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;amp;lt;B&amp;gt;&amp;lt;sub&amp;gt;32&amp;lt;/sub&amp;gt; || SHIFT&lt;br /&gt;
|-&lt;br /&gt;
| d&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt;       || REDUCE(3)&lt;br /&gt;
|-&lt;br /&gt;
| a&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;       || REDUCE(5)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;amp;lt;B&amp;gt;&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;  || SHIFT&lt;br /&gt;
|-&lt;br /&gt;
| b&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;       || REDUCE(2)&lt;br /&gt;
|-&lt;br /&gt;
| ─┤&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;      || ACCEPT&lt;br /&gt;
|-&lt;br /&gt;
| b&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;       || &#039;&#039;&#039;R/R konflikt&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;amp;lt;A&amp;gt;&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;  || REDUCE(1)&lt;br /&gt;
|}&lt;br /&gt;
FOLLOW skupovi su sledeći:&lt;br /&gt;
* FOLLOW(&amp;amp;lt;S&amp;gt;) = {─┤, b}&lt;br /&gt;
* FOLLOW(&amp;amp;lt;B&amp;gt;) = {b, c, d}&lt;br /&gt;
* FOLLOW(&amp;amp;lt;A&amp;gt;) = {a} ∪ FOLLOW(&amp;amp;lt;S&amp;gt;) = {─┤, a, b}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Kontrolna tabela SLR(0) parsera&lt;br /&gt;
! Stanje              !! a         !! b                  !! c         !! d         !! ─┤&lt;br /&gt;
|-&lt;br /&gt;
| &amp;amp;lt;S&#039;&amp;gt;&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || REDUCE(4) || &#039;&#039;&#039;R/R konflikt&#039;&#039;&#039; || REDUCE(5) || REDUCE(5) || REDUCE(4)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;amp;lt;A&amp;gt;&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;  || SHIFT     ||                    ||           ||           ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;amp;lt;B&amp;gt;&amp;lt;sub&amp;gt;31&amp;lt;/sub&amp;gt; ||           ||                    || SHIFT     ||           ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;amp;lt;S&amp;gt;&amp;lt;sub&amp;gt;x&amp;lt;/sub&amp;gt;  ||           || SHIFT              ||           ||           || SHIFT&lt;br /&gt;
|-&lt;br /&gt;
| c&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt;       ||           || REDUCE(5)          || REDUCE(5) || REDUCE(5) ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;amp;lt;B&amp;gt;&amp;lt;sub&amp;gt;32&amp;lt;/sub&amp;gt; ||           ||                    ||           || SHIFT     ||&lt;br /&gt;
|-&lt;br /&gt;
| d&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt;       || REDUCE(3) || REDUCE(3)          ||           ||           || REDUCE(3)&lt;br /&gt;
|-&lt;br /&gt;
| a&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;       ||           || REDUCE(5)          || REDUCE(5) || REDUCE(5) ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;amp;lt;B&amp;gt;&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;  ||           || SHIFT              ||           ||           ||&lt;br /&gt;
|-&lt;br /&gt;
| b&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;       ||           || REDUCE(2)          ||           ||           || REDUCE(2)&lt;br /&gt;
|-&lt;br /&gt;
| ─┤&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;      ||           ||                    ||           ||           || ACCEPT&lt;br /&gt;
|-&lt;br /&gt;
| b&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;       || REDUCE(4) || &#039;&#039;&#039;R/R konflikt&#039;&#039;&#039; || REDUCE(5) || REDUCE(5) || REDUCE(4)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;amp;lt;A&amp;gt;&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;  ||           || REDUCE(1)          ||           ||           || REDUCE(1)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 4. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Dat je listing programa Januar2022, napisan na programskom jeziku Mikrojava. Sve metode unutrašnjih klasa su virtuelne. Globalne metode se pozivaju statički. Napisati kompletan Mikrojava bajtkod prevoda funkcije &amp;lt;code&amp;gt;f&amp;lt;/code&amp;gt; za dati program&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
program Januar2022&lt;br /&gt;
	const int K = 2;&lt;br /&gt;
	int add;&lt;br /&gt;
	class A {&lt;br /&gt;
		int fld;&lt;br /&gt;
	{&lt;br /&gt;
		int m(int a)&lt;br /&gt;
		{ return fld * 2; }&lt;br /&gt;
		void met()&lt;br /&gt;
		{ fld = fld + 3; }&lt;br /&gt;
	} }&lt;br /&gt;
	class B extends A {&lt;br /&gt;
	{&lt;br /&gt;
		int m(int b)&lt;br /&gt;
		{ /*T1*/&lt;br /&gt;
			return fld + b;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	}&lt;br /&gt;
	A arr[];&lt;br /&gt;
{&lt;br /&gt;
	int f(int index){&lt;br /&gt;
		add = arr[index].m(K);&lt;br /&gt;
		arr[index].met();&lt;br /&gt;
		return add + K;&lt;br /&gt;
	}&lt;br /&gt;
	void main()&lt;br /&gt;
		B b;&lt;br /&gt;
		int ret;&lt;br /&gt;
	{&lt;br /&gt;
		/*T2*/&lt;br /&gt;
		arr = new A[2];&lt;br /&gt;
		arr[0] = new B;&lt;br /&gt;
		arr[1] = new A;&lt;br /&gt;
		ret = f(0) + f(1);&lt;br /&gt;
		print(arr[0].m(ret));&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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
enter 1, 1&lt;br /&gt;
getstatic 1&lt;br /&gt;
load_0&lt;br /&gt;
aload&lt;br /&gt;
const_2&lt;br /&gt;
getstatic 1&lt;br /&gt;
load_0&lt;br /&gt;
aload&lt;br /&gt;
getfield 0&lt;br /&gt;
invokevirtual &#039;m&#039; -1&lt;br /&gt;
putstatic 0&lt;br /&gt;
getstatic 1&lt;br /&gt;
load_0&lt;br /&gt;
aload&lt;br /&gt;
dup&lt;br /&gt;
getfield 0&lt;br /&gt;
invokevirtual &#039;m&#039; &#039;e&#039; &#039;t&#039; -1&lt;br /&gt;
getstatic 0&lt;br /&gt;
const_2&lt;br /&gt;
add&lt;br /&gt;
exit&lt;br /&gt;
return&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 5. zadatak ==&lt;br /&gt;
{{ознака|5. zadatak|Табела симбола}}&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Prikazati izgled tabele simbola u trenucima T1 i T2 na osnovu izvornog koda iz zadatka 4 prema formatu čvorova tabele simbola iz priloga. Universe opseg ne treba crtati. Za T2 dovoljno je naznačiti izmene u odnosu na prethodno stanje tabele. &lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&amp;lt;gallery widths=&amp;quot;500&amp;quot; heights=&amp;quot;500&amp;quot; class=&amp;quot;transparent-svg&amp;quot;&amp;gt;&lt;br /&gt;
  PPR januar 2022 zadatak 5 T1.svg | Tabela simbola u stanju T1.&lt;br /&gt;
  PPR januar 2022 zadatak 5 T2.svg | Tabela simbola u stanju T2.&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 6. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Za dati programski fragment napisati odgovarajući međukod u SSA formi i nacrtati graf toka kontrole na nivou osnovnih blokova.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
a = 1;&lt;br /&gt;
b = 2;&lt;br /&gt;
c = 3;&lt;br /&gt;
for (a = 4; b &amp;lt; c || a &amp;lt; 10; a++) {&lt;br /&gt;
    if (a &amp;gt; b + c) {&lt;br /&gt;
        c++;&lt;br /&gt;
        break;&lt;br /&gt;
    } else if (a &amp;gt; b * c) {&lt;br /&gt;
        b--;&lt;br /&gt;
        continue;&lt;br /&gt;
    }&lt;br /&gt;
    else return a;&lt;br /&gt;
}&lt;br /&gt;
a = b * c;&lt;br /&gt;
return a;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
[[Датотека:PPR januar 2022 zadatak 6 graf.svg|thumb|Karakteristični LR(0) automat u trećem zadatku.]]&lt;br /&gt;
# a1 := 1&lt;br /&gt;
# b1 := 2&lt;br /&gt;
# c1 := 3&lt;br /&gt;
# a2 := 4&lt;br /&gt;
# t1 := Ф(b1, b2)&lt;br /&gt;
# if t1 &amp;lt; c1 goto 8&lt;br /&gt;
# if a2 &amp;gt;= 10 goto 17&lt;br /&gt;
# t2 := t1 + c1&lt;br /&gt;
# if a &amp;lt;= t2 goto 12&lt;br /&gt;
# c2 := c1 + 1&lt;br /&gt;
# goto 17&lt;br /&gt;
# t3 := t1 * c1&lt;br /&gt;
# if a &amp;lt;= t3 goto 16&lt;br /&gt;
# b2 := t1 - 1&lt;br /&gt;
# goto 5&lt;br /&gt;
# return a2&lt;br /&gt;
# t4 := Ф(b1, b2)&lt;br /&gt;
# t5 := Ф(c1, c2)&lt;br /&gt;
# t6 := t1 * t2&lt;br /&gt;
# a3 := t6&lt;br /&gt;
# return a3&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:Програмски преводиоци 1]]&lt;/div&gt;</summary>
		<author><name>Andrija</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:%D0%9E%D0%B7%D0%BD%D0%B0%D0%BA%D0%B0_%D0%B7%D0%B0%D0%B4%D0%B0%D1%82%D0%BA%D0%B0&amp;diff=8346</id>
		<title>Шаблон:Ознака задатка</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:%D0%9E%D0%B7%D0%BD%D0%B0%D0%BA%D0%B0_%D0%B7%D0%B0%D0%B4%D0%B0%D1%82%D0%BA%D0%B0&amp;diff=8346"/>
		<updated>2026-03-14T23:00:44Z</updated>

		<summary type="html">&lt;p&gt;Andrija: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;includeonly&amp;gt;{{#dpl:&lt;br /&gt;
| uses            = Шаблон:Ознака&lt;br /&gt;
| category        = {{ROOTPAGENAME}}&lt;br /&gt;
| category        = Рокови&lt;br /&gt;
| include         = {ознака}.dpl&lt;br /&gt;
| format          = ,²{#ifeq:{{{1|{{SUBPAGENAME}}}}}¦,}²\n,&lt;br /&gt;
| secseparators   = ,\n}²²{#ifeq:{{{1|{{SUBPAGENAME}}}}}¦,}²\n²{#ifeq:{{{1|{{SUBPAGENAME}}}}}¦,}²\n²{#ifeq:{{{1|{{SUBPAGENAME}}}}}¦,}²\n²{#ifeq:{{{1|{{SUBPAGENAME}}}}}¦,}²\n²{#ifeq:{{{1|{{SUBPAGENAME}}}}}¦,}²\n²{#ifeq:{{{1|{{SUBPAGENAME}}}}}¦,}²\n²{#ifeq:{{{1|{{SUBPAGENAME}}}}}¦,}²\n²{#ifeq:{{{1|{{SUBPAGENAME}}}}}¦,\n}²\n²{#ifeq:{{{1|{{SUBPAGENAME}}}}}¦&lt;br /&gt;
| ordermethod     = title&lt;br /&gt;
}}&amp;lt;/includeonly&amp;gt;&amp;lt;noinclude&amp;gt;&amp;lt;templatedata&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	&amp;quot;params&amp;quot;: {&lt;br /&gt;
		&amp;quot;1&amp;quot;: {&lt;br /&gt;
			&amp;quot;description&amp;quot;: &amp;quot;Назив ознаке чији задаци се приказују.&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;Ознака&amp;quot;,&lt;br /&gt;
			&amp;quot;example&amp;quot;: &amp;quot;C-Linda&amp;quot;,&lt;br /&gt;
			&amp;quot;default&amp;quot;: &amp;quot;Исто као назив подстранице на којој се шаблон позива.&amp;quot;,&lt;br /&gt;
			&amp;quot;autovalue&amp;quot;: &amp;quot;{{SUBPAGENAME}}&amp;quot;,&lt;br /&gt;
			&amp;quot;suggested&amp;quot;: true&lt;br /&gt;
		}&lt;br /&gt;
	},&lt;br /&gt;
	&amp;quot;description&amp;quot;: &amp;quot;Шаблон за исписивање задатака који садрже неку ознаку.&amp;quot;,&lt;br /&gt;
	&amp;quot;paramOrder&amp;quot;: [&lt;br /&gt;
		&amp;quot;1&amp;quot;&lt;br /&gt;
	],&lt;br /&gt;
	&amp;quot;format&amp;quot;: &amp;quot;inline&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/templatedata&amp;gt;[[Категорија:Шаблони]]&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Andrija</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:%D0%9E%D0%B7%D0%BD%D0%B0%D0%BA%D0%B0.dpl&amp;diff=8345</id>
		<title>Шаблон:Ознака.dpl</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:%D0%9E%D0%B7%D0%BD%D0%B0%D0%BA%D0%B0.dpl&amp;diff=8345"/>
		<updated>2026-03-14T22:59:09Z</updated>

		<summary type="html">&lt;p&gt;Andrija: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;includeonly&amp;gt;{{{2}}}|&lt;br /&gt;
== {{#invoke:String|replace|{{{%TITLE%}}}|^[^/]+/(.*)|%1|1|false}}, {{{1}}} ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: none;&amp;quot;&amp;gt;Debug: {{{%TITLE%}}} {{{1}}}&amp;lt;/div&amp;gt;&lt;br /&gt;
{{#dpl:|title = {{{%TITLE%}}}|include = ##.*{{{1}}}.*|format = ,²{#dplreplace:,¦/\[\[Категорија:.*?\x5d\x5d/¦}²,}}&lt;br /&gt;
&amp;lt;/includeonly&amp;gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
&amp;lt;templatedata&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	&amp;quot;params&amp;quot;: {&lt;br /&gt;
		&amp;quot;1&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;Одељак&amp;quot;,&lt;br /&gt;
			&amp;quot;description&amp;quot;: &amp;quot;Наслов одељка са задатком.&amp;quot;,&lt;br /&gt;
			&amp;quot;example&amp;quot;: &amp;quot;3. задатак&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
			&amp;quot;required&amp;quot;: true&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;2&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;Ознака&amp;quot;,&lt;br /&gt;
			&amp;quot;description&amp;quot;: &amp;quot;Назив ознаке задатка.&amp;quot;,&lt;br /&gt;
			&amp;quot;example&amp;quot;: &amp;quot;Семафори&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
			&amp;quot;required&amp;quot;: true&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;%TITLE%&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;Наслов странице&amp;quot;,&lt;br /&gt;
			&amp;quot;description&amp;quot;: &amp;quot;Наслов странице на којој се налази задатак. Овај параметар се прослеђује аутоматски од стране DPL.&amp;quot;,&lt;br /&gt;
			&amp;quot;example&amp;quot;: &amp;quot;КДП/Јун 2020&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;wiki-page-name&amp;quot;,&lt;br /&gt;
			&amp;quot;required&amp;quot;: true&lt;br /&gt;
		}&lt;br /&gt;
	},&lt;br /&gt;
	&amp;quot;description&amp;quot;: &amp;quot;Верзија [[Шаблон:Ознака]] за приказивање преко DPL.&amp;quot;,&lt;br /&gt;
	&amp;quot;paramOrder&amp;quot;: [&lt;br /&gt;
		&amp;quot;1&amp;quot;,&lt;br /&gt;
		&amp;quot;2&amp;quot;,&lt;br /&gt;
		&amp;quot;%TITLE%&amp;quot;&lt;br /&gt;
	]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/templatedata&amp;gt;[[Категорија:Шаблони]]&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Andrija</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:%D0%9E%D0%B7%D0%BD%D0%B0%D0%BA%D0%B0&amp;diff=8344</id>
		<title>Шаблон:Ознака</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:%D0%9E%D0%B7%D0%BD%D0%B0%D0%BA%D0%B0&amp;diff=8344"/>
		<updated>2026-03-14T22:57:35Z</updated>

		<summary type="html">&lt;p&gt;Andrija: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;includeonly&amp;gt;&amp;lt;/includeonly&amp;gt;&amp;lt;noinclude&amp;gt;&amp;lt;templatedata&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	&amp;quot;params&amp;quot;: {&lt;br /&gt;
		&amp;quot;1&amp;quot;: {&lt;br /&gt;
			&amp;quot;description&amp;quot;: &amp;quot;Назив одељка на страници на којој се задатак налази.&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
			&amp;quot;required&amp;quot;: true,&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;Одељак&amp;quot;,&lt;br /&gt;
			&amp;quot;example&amp;quot;: &amp;quot;3. задатак&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;2&amp;quot;: {&lt;br /&gt;
			&amp;quot;description&amp;quot;: &amp;quot;Назив ознаке која се додељује задатку.&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
			&amp;quot;required&amp;quot;: true,&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;Ознака&amp;quot;,&lt;br /&gt;
			&amp;quot;example&amp;quot;: &amp;quot;C-Linda&amp;quot;&lt;br /&gt;
		}&lt;br /&gt;
	},&lt;br /&gt;
	&amp;quot;description&amp;quot;: &amp;quot;Шаблон за категорисање задатка. За верзију која се приказује ради укључивања преко DPL, видети [[Шаблон:Ознака.dpl]].&amp;quot;,&lt;br /&gt;
	&amp;quot;paramOrder&amp;quot;: [&lt;br /&gt;
		&amp;quot;1&amp;quot;,&lt;br /&gt;
		&amp;quot;2&amp;quot;&lt;br /&gt;
	],&lt;br /&gt;
	&amp;quot;format&amp;quot;: &amp;quot;inline&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/templatedata&amp;gt;[[Категорија:Шаблони]]&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Andrija</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:%D0%9E%D0%B7%D0%BD%D0%B0%D0%BA%D0%B0_%D0%B7%D0%B0%D0%B4%D0%B0%D1%82%D0%BA%D0%B0&amp;diff=8343</id>
		<title>Шаблон:Ознака задатка</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:%D0%9E%D0%B7%D0%BD%D0%B0%D0%BA%D0%B0_%D0%B7%D0%B0%D0%B4%D0%B0%D1%82%D0%BA%D0%B0&amp;diff=8343"/>
		<updated>2026-03-14T21:12:39Z</updated>

		<summary type="html">&lt;p&gt;Andrija: Направљена празна страница&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Andrija</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:%D0%9E%D0%B7%D0%BD%D0%B0%D0%BA%D0%B0.dpl&amp;diff=8342</id>
		<title>Шаблон:Ознака.dpl</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:%D0%9E%D0%B7%D0%BD%D0%B0%D0%BA%D0%B0.dpl&amp;diff=8342"/>
		<updated>2026-03-14T21:12:31Z</updated>

		<summary type="html">&lt;p&gt;Andrija: Направљена празна страница&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Andrija</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:%D0%9E%D0%B7%D0%BD%D0%B0%D0%BA%D0%B0&amp;diff=8341</id>
		<title>Шаблон:Ознака</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:%D0%9E%D0%B7%D0%BD%D0%B0%D0%BA%D0%B0&amp;diff=8341"/>
		<updated>2026-03-14T21:11:42Z</updated>

		<summary type="html">&lt;p&gt;Andrija: Направљена празна страница&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Andrija</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%88%D1%83%D0%BB_2022&amp;diff=8130</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%88%D1%83%D0%BB_2022&amp;diff=8130"/>
		<updated>2025-10-25T17:09:15Z</updated>

		<summary type="html">&lt;p&gt;Andrija: Dopuna postavci zadatka&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&#039;&#039;&#039;Јулски испит 2022. године&#039;&#039;&#039; одржан је 10. јула и на њему је била доступна сва потребна документација и презентације са предавања. Поставка рока није доступна са странице предмета.&lt;br /&gt;
{{решења}}&lt;br /&gt;
&lt;br /&gt;
== Теорија ==&lt;br /&gt;
=== 1. задатак ===&lt;br /&gt;
На којој адреси се налази машинска инструкција коју микропроцесор &#039;&#039;Cortex-M3&#039;&#039; прву извршава након ресета?&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;
# 0x00000004&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;mem[0x00000004]&amp;lt;/span&amp;gt;&lt;br /&gt;
# Ниједна од понуђених&lt;br /&gt;
# mem[0x08000004]&lt;br /&gt;
# 0x08000004&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Објашњење:&#039;&#039;&#039; &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;explanation&amp;quot;&amp;gt;У &#039;&#039;Cortex-M3 Programming Manual&#039;&#039; пише на страни 15 како се у програмски бројач уписује вредност са адресе 0x00000004, тако да се прва инструкција извршава са адресе која пише на тој локацији у меморији.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. задатак ===&lt;br /&gt;
Која вредност се налази у регистру &#039;&#039;R1&#039;&#039; након извршавања дате секвенце асемблерских инструкција? Одговор унети према формату неозначених хексадецималних литерала у &#039;&#039;C&#039;&#039; програмском језику ширине 32 бита.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
mov r0, 3&lt;br /&gt;
mov r1, 8&lt;br /&gt;
cmp r1, r0&lt;br /&gt;
itttt gt&lt;br /&gt;
subgt r1, r1, r0&lt;br /&gt;
subgt r1, r1, 8&lt;br /&gt;
subsgt r1, r1, r0&lt;br /&gt;
subsgt r1, r1, 5&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Приказ очекиваног формата одговора за произвољно одабрану вредност 1 јесте:&lt;br /&gt;
 0x00000001&lt;br /&gt;
&#039;&#039;&#039;Одговор:&#039;&#039;&#039; &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;0xFFFFFFFA&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Објашњење:&#039;&#039;&#039; &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;explanation&amp;quot;&amp;gt;На почетку програма регистру &#039;&#039;R0&#039;&#039; додељује се вредност 3, а регистру &#039;&#039;R1&#039;&#039; вредност 8. Затим се та два регистра упоређују, па се прелази на извршавање инструкција које зависе од тога да ли је један број био већи од другог. Пошто јесте, прва инструкција &amp;lt;code&amp;gt;subgt&amp;lt;/code&amp;gt; мења &#039;&#039;R1&#039;&#039; на 5, а друга на -3. Пошто друга инструкција није имала суфикс &amp;lt;code&amp;gt;s&amp;lt;/code&amp;gt;, програмски статусни регистар се није ажурирао, па се наставља на извршавање инструкције &amp;lt;code&amp;gt;subsgt&amp;lt;/code&amp;gt;, након које &#039;&#039;R1&#039;&#039; има вредност -6, а програмска статусна реч се ажурира тако да се последња инструкција не извршава. Релевантна страница у &#039;&#039;Cortex-M3 Programming Manual&#039;&#039; је 56 (3.3.7 &#039;&#039;Conditional execution&#039;&#039;).&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. задатак ===&lt;br /&gt;
Колика је максимална радна фреквенција (&#039;&#039;HCLK&#039;&#039;) микроконтролера &#039;&#039;STM32F103R6&#039;&#039; уколико се користи &#039;&#039;HSE&#039;&#039; осцилатор који на свом излазу производи сигнал такта фреквенције 2MHz? Одговор унети у мегахерцима без навођења ознаке јединице.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Одговор:&#039;&#039;&#039; &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;32&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Објашњење:&#039;&#039;&#039; &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;explanation&amp;quot;&amp;gt;На слици са стране 93 од &#039;&#039;STM32F103 Reference Manual&#039;&#039; може се видети како &#039;&#039;HSE&#039;&#039; такт може проћи кроз PLL који може да његову фреквенцију помножи до 16 пута.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 4. задатак ===&lt;br /&gt;
: &#039;&#039;Исти задатак као са [[Микропроцесорски системи/К2 2022#3. задатак|другог колоквијума 2022. године]].&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== 5. задатак ===&lt;br /&gt;
Периферија &#039;&#039;USART&#039;&#039; микроконтролера &#039;&#039;STM32F103R6&#039;&#039; конфигурисана је тако да преноси осам (8) битова, користи парну парност и поставља један стоп бит. Са линије за пренос узорковани су следећи битови (сваки бит је добијен на основу одговарајућег броја узорака стања на линији):&lt;br /&gt;
 ...111111011011010000011111111...&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;
# Нема грешака&lt;br /&gt;
# Само &#039;&#039;Framing error&#039;&#039;&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;&#039;&#039;Framing error&#039;&#039; и &#039;&#039;Parity error&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
# Само &#039;&#039;Parity error&#039;&#039;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Објашњење:&#039;&#039;&#039; &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;explanation&amp;quot;&amp;gt;Док на жици нема пакета, стоји вредност 1. Наилазимо на почетни бит 0, а након њега долази осам битова од којих осми представља бит парности. Сабирањем тих осам битова добијамо број 5, што је непаран број а парност је парна, па се дешава &#039;&#039;Parity error&#039;&#039;. Након тих осам битова наилази бит са вредношћу 0, а очекује се завршни бит са вредношћу 1, тако да се такође дешава и &#039;&#039;Framing error&#039;&#039;.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Задатак ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
[[Датотека:MIPS jul 2022 referentna šema.jpeg|thumb|Референтна шема у задатку.]]&lt;br /&gt;
# &amp;lt;del&amp;gt;У систему постоји један микроконтролер који контролише вентилатор у складу са тренутном вредношћу температуре. У симулатору &#039;&#039;Proteus&#039;&#039; направити пројекат и инстанцирати микроконтролер &#039;&#039;STM32F103R6 (CM3_STM32)&#039;&#039;. Направити пројекат у алату &#039;&#039;CubeMX&#039;&#039; који ће служити за конфигурисање микроконтролера.&amp;lt;/del&amp;gt;&lt;br /&gt;
# &amp;lt;del&amp;gt;У симулатору &#039;&#039;Proteus&#039;&#039; додати следеће компоненте&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 (MOTORS)&#039;&#039; који представља вентилатор и чија ће брзина рада бити контролисана&amp;lt;/del&amp;gt; &#039;&#039;PWM&#039;&#039; сигналом канала 4 тајмера 1 &amp;lt;del&amp;gt;микроконтролера&amp;lt;/del&amp;gt;,&lt;br /&gt;
#* аналогни мултиплексер &#039;&#039;74HC4051 (74HC)&#039;&#039;, који један од аналогних сигнала са улаза пропушта непромењен на излаз, чији је излазни пин повезан на канал 7 аналогно-дигиталног конвертора микроконтролера; селекција излаза мултиплексера се врши преко његових пинова &#039;&#039;CBA&#039;&#039; где пин &#039;&#039;A&#039;&#039; има најмању тежину,&lt;br /&gt;
#* &amp;lt;del&amp;gt;температурни сензор &#039;&#039;LM35 (NATDAC)&#039;&#039; чији је излазни пин повезан&amp;lt;/del&amp;gt; на нулти улаз (&#039;&#039;X0&#039;&#039;) мултиплексера &amp;lt;del&amp;gt;(аналогна вредност напона на излазном пину сензора је линеарно пропорционална вредности температуре)&amp;lt;/del&amp;gt;,&lt;br /&gt;
#* анемометар &#039;&#039;ANEMOMETER (ACTIVE)&#039;&#039; повезан у складу са референтном шемом на канале 1 и 2 тајмера 1; излазни сигнал анемометра је периодична правоугаона поворка чија се фреквенција линеарно повећава са повећањем брзине ветра (брзина ветра једнака је производу фреквенције излазног сигнала анемометра и реалне константе 2.4),&lt;br /&gt;
#* ветроказ &#039;&#039;WINDVANE (ACTIVE)&#039;&#039; чији је излазни пин повезан у складу са референтном шемом (обратити пажњу на постојање отпорника) на први улаз (X1) мултиплексера; аналогна вредност напона на излазном пину ветроказа представља азимут односно правац ветра (функција за пресликавање вредности напона у азимут дата је у прилогу),&lt;br /&gt;
#* кишомер &#039;&#039;RAINGAUGE (ACTIVE)&#039;&#039; повезан у складу са референтном шемом на моностабилни мултивибратор &#039;&#039;74HC221 (74HC)&#039;&#039;; кишомер ради по принципу кофе са превртањем (кофа се пуни кишницом све док се не препуни, затим долази до њеног превртања и потпуног пражњења уз генерисање електричног импулса); моностабилни мултивибратор обезбеђује униформно трајање генерисаног електричног импулса; подесити на кишомеру ниво превртања кофе (&#039;&#039;Trigger Level&#039;&#039;) на вредност 0.01 милиметара услед чега ће кофа слати електрични импулс на сваких 1200 милисекунди при константном интензитету падавине од 30.0 милиметара по сат (за већи интензитет падавине импулс ће стизати брже и обрнуто); подесити на моностабилном мултивибратору временску константу (&#039;&#039;Monostable Time Constant&#039;&#039;) на једну милисекунду (1mS) услед чега ће сигнал на његовом излазу увек трајати тачно једну милисекунду,&lt;br /&gt;
#* &amp;lt;del&amp;gt;виртуелни терминал повезан на периферију &#039;&#039;USART1&#039;&#039; микроконтролера&amp;lt;/del&amp;gt; преко пинова &#039;&#039;PB6&#039;&#039; и &#039;&#039;PB7&#039;&#039; &amp;lt;del&amp;gt;и,&amp;lt;/del&amp;gt;&lt;br /&gt;
#* &#039;&#039;LCD&#039;&#039; дисплеј &#039;&#039;LM041L (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;
# [6 поена] Обезбедити могућност рада са LCD дисплејом и формирати карактере за LCD дисплеј који представљају &amp;lt;u&amp;gt;стрелицу на горе (↑)&amp;lt;/u&amp;gt; и &amp;lt;u&amp;gt;стрелицу на доле (↓)&amp;lt;/u&amp;gt; у складу са референтним снимком. Ови карактери користиће се као индикатори да ли се нека вредност повећала или смањила приликом њене последње промене.&lt;br /&gt;
# &amp;lt;del&amp;gt;Обезбедити приказ поруке &#039;&#039;&#039;&#039;&#039;&amp;lt;nowiki&amp;gt;/A=&amp;lt;a&amp;gt;/B=&amp;lt;b&amp;gt;/T=&amp;lt;t&amp;gt;/K=&amp;lt;k&amp;gt;&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;&#039;&#039; на виртуелном терминалу, где је &#039;&#039;&amp;lt;nowiki&amp;gt;&amp;lt;a&amp;gt;&amp;lt;/nowiki&amp;gt;&#039;&#039; тренутна вредност азимута ветра, &#039;&#039;&amp;lt;nowiki&amp;gt;&amp;lt;b&amp;gt;&amp;lt;/nowiki&amp;gt;&#039;&#039; тренутна вредност брзине ветра, &#039;&#039;&amp;lt;nowiki&amp;gt;&amp;lt;t&amp;gt;&amp;lt;/nowiki&amp;gt;&#039;&#039; тренутна вредност температуре изражено у степенима Целзијуса у опсегу [0, 60] и &#039;&#039;&amp;lt;nowiki&amp;gt;&amp;lt;k&amp;gt;&amp;lt;/nowiki&amp;gt;&#039;&#039; тренутна вредност интезитета падавине.&amp;lt;/del&amp;gt; Овај испис је предвиђен само ради могућности остваривања парцијалних поена за студенте који успешно очитају вредност са компоненте али не могу да је прикажу на &#039;&#039;LCD&#039;&#039; дисплеју као што је тражено у наредним ставкама. &amp;lt;del&amp;gt;За величине чије вредности нису успешно израчунате исписати ? (знак питања). Освежавање описане поруке вршити периодично на сваких 200 милисекунди уколико је дошло до промене вредности. Приликом освежавања поруке променити тренутне вредности у постојећој поруци уместо додавања нове поруке на виртуелном терминалу.&amp;lt;/del&amp;gt;&lt;br /&gt;
# &amp;lt;del&amp;gt;Обезбедити приказ поруке &#039;&#039;&#039;&#039;&#039;&amp;lt;nowiki&amp;gt;&amp;lt;i&amp;gt; Tem: &amp;lt;t&amp;gt;&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;&#039;&#039; у трећем реду &#039;&#039;LCD&#039;&#039; дисплеја, где &#039;&#039;&amp;lt;nowiki&amp;gt;&amp;lt;t&amp;gt;&amp;lt;/nowiki&amp;gt;&#039;&#039; представља тренутну вредност температуре изражено у степенима Целзијуса у опсегу [0, 60] &amp;lt;u&amp;gt;очитану са температурног сензора&amp;lt;/u&amp;gt;, а &#039;&#039;&amp;lt;nowiki&amp;gt;&amp;lt;i&amp;gt;&amp;lt;/nowiki&amp;gt;&#039;&#039; индикатор смера последње промене вредности у виду стрелице. Освежавање поруке вршити периодично на сваких 200 милисекунди уколико је дошло до промене вредности.&amp;lt;/del&amp;gt; Овај испис је предвиђен ради остваривања поена за студенте који успешно обезбеде могућност рада са &#039;&#039;LCD&#039;&#039; дисплејом.&lt;br /&gt;
# [6 поена] Обезбедити приказ поруке &#039;&#039;&#039;&#039;&#039;&amp;lt;nowiki&amp;gt;&amp;lt;i&amp;gt; Brz: &amp;lt;b&amp;gt;&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;&#039;&#039; у другом реду &#039;&#039;LCD&#039;&#039; дисплеја, где &#039;&#039;&amp;lt;nowiki&amp;gt;&amp;lt;b&amp;gt;&amp;lt;/nowiki&amp;gt;&#039;&#039; представља тренутну вредност брзине ветра &amp;lt;u&amp;gt;очитану са анемометра&amp;lt;/u&amp;gt;, а &#039;&#039;&amp;lt;nowiki&amp;gt;&amp;lt;i&amp;gt;&amp;lt;/nowiki&amp;gt;&#039;&#039; индикатор смера последње промене вредности у виду стрелице. Освежавање поруке вршити периодично на сваких 200 милисекунди уколико је дошло до промене вредности.&lt;br /&gt;
# [6 поена] Обезбедити приказ поруке &#039;&#039;&#039;&#039;&#039;&amp;lt;nowiki&amp;gt;&amp;lt;i&amp;gt; Azi: &amp;lt;a&amp;gt;&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;&#039;&#039; у првом реду &#039;&#039;LCD&#039;&#039; дисплеја, где &#039;&#039;&amp;lt;nowiki&amp;gt;&amp;lt;a&amp;gt;&amp;lt;/nowiki&amp;gt;&#039;&#039; представља тренутну вредност азимута ветра &amp;lt;u&amp;gt;очитану са ветроказа&amp;lt;/u&amp;gt;, а &#039;&#039;&amp;lt;nowiki&amp;gt;&amp;lt;i&amp;gt;&amp;lt;/nowiki&amp;gt;&#039;&#039; индикатор смера последње промене вредности у виду стрелице. Освежавање поруке вршити периодично на сваких 200 милисекунди уколико је дошло до промене вредности.&lt;br /&gt;
# [6 поена] Обезбедити приказ поруке &#039;&#039;&#039;&#039;&#039;&amp;lt;nowiki&amp;gt;&amp;lt;i&amp;gt; Kis: &amp;lt;k&amp;gt;&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;&#039;&#039; у четвртом реду &#039;&#039;LCD&#039;&#039; дисплеја, где &#039;&#039;&amp;lt;nowiki&amp;gt;&amp;lt;k&amp;gt;&amp;lt;/nowiki&amp;gt;&#039;&#039; представља тренутну вредност интензитета падавине изражено у милиметрима по сату очитану са кишомера, а &#039;&#039;&amp;lt;nowiki&amp;gt;&amp;lt;i&amp;gt;&amp;lt;/nowiki&amp;gt;&#039;&#039; индикатор смера последње промене вредности у виду стрелице. Освежавање поруке вршити периодично на сваких 200 милисекунди уколико је дошло до промене вредности.&lt;br /&gt;
# [6 поена] Обезбедити контролу вентилатора на начин описан у наставку. Зависно од тренутне вредности температуре вентилатор се врти одговарајућом брзином. Уколико тренутна вредност температуре припада опсегу:&lt;br /&gt;
#* [0, 30) вентилатор се не врти,&lt;br /&gt;
#* [30, 35) вентилатор се врти брзином једнаком 50% максималне брзине и&lt;br /&gt;
#* [35, 60] вентилатор се врти максималном брзином.&lt;br /&gt;
#:Ажурирање брзине вентилатора вршити периодично на 200 милисекунди.&lt;br /&gt;
&lt;br /&gt;
На року је поред текста задатка и референтне шеме био доступан и референтни снимак (изглед симулације урађеног задатка), као и фајл &amp;lt;code&amp;gt;voltage2WindBearing.c&amp;lt;/code&amp;gt; у коме је дефинисана помоћна функција &amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; inline&amp;gt;static float voltage2WindBearing(float voltage)&amp;lt;/syntaxhighlight&amp;gt;. Целокупна поставка задатка може се преузети [[Медиј:MIPS jul 2022 postavka.zip|овде]].&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Микропроцесорски системи]]&lt;br /&gt;
[[Категорија:Рокови]]&lt;/div&gt;</summary>
		<author><name>Andrija</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:MIPS_jul_2022_postavka.zip&amp;diff=8129</id>
		<title>Датотека:MIPS jul 2022 postavka.zip</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:MIPS_jul_2022_postavka.zip&amp;diff=8129"/>
		<updated>2025-10-25T17:03:07Z</updated>

		<summary type="html">&lt;p&gt;Andrija: Нова страница: {{file | description =  }}&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{file&lt;br /&gt;
| description = &lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Andrija</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%88%D1%83%D0%BB_2022&amp;diff=8128</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%88%D1%83%D0%BB_2022&amp;diff=8128"/>
		<updated>2025-10-25T16:41:56Z</updated>

		<summary type="html">&lt;p&gt;Andrija: Dodata postavka prakticnog dela (zadatka)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&#039;&#039;&#039;Јулски испит 2022. године&#039;&#039;&#039; одржан је 10. јула и на њему је била доступна сва потребна документација и презентације са предавања. Поставка рока није доступна са странице предмета.&lt;br /&gt;
{{решења}}&lt;br /&gt;
&lt;br /&gt;
== Теорија ==&lt;br /&gt;
=== 1. задатак ===&lt;br /&gt;
На којој адреси се налази машинска инструкција коју микропроцесор &#039;&#039;Cortex-M3&#039;&#039; прву извршава након ресета?&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;
# 0x00000004&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;mem[0x00000004]&amp;lt;/span&amp;gt;&lt;br /&gt;
# Ниједна од понуђених&lt;br /&gt;
# mem[0x08000004]&lt;br /&gt;
# 0x08000004&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Објашњење:&#039;&#039;&#039; &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;explanation&amp;quot;&amp;gt;У &#039;&#039;Cortex-M3 Programming Manual&#039;&#039; пише на страни 15 како се у програмски бројач уписује вредност са адресе 0x00000004, тако да се прва инструкција извршава са адресе која пише на тој локацији у меморији.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. задатак ===&lt;br /&gt;
Која вредност се налази у регистру &#039;&#039;R1&#039;&#039; након извршавања дате секвенце асемблерских инструкција? Одговор унети према формату неозначених хексадецималних литерала у &#039;&#039;C&#039;&#039; програмском језику ширине 32 бита.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
mov r0, 3&lt;br /&gt;
mov r1, 8&lt;br /&gt;
cmp r1, r0&lt;br /&gt;
itttt gt&lt;br /&gt;
subgt r1, r1, r0&lt;br /&gt;
subgt r1, r1, 8&lt;br /&gt;
subsgt r1, r1, r0&lt;br /&gt;
subsgt r1, r1, 5&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Приказ очекиваног формата одговора за произвољно одабрану вредност 1 јесте:&lt;br /&gt;
 0x00000001&lt;br /&gt;
&#039;&#039;&#039;Одговор:&#039;&#039;&#039; &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;0xFFFFFFFA&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Објашњење:&#039;&#039;&#039; &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;explanation&amp;quot;&amp;gt;На почетку програма регистру &#039;&#039;R0&#039;&#039; додељује се вредност 3, а регистру &#039;&#039;R1&#039;&#039; вредност 8. Затим се та два регистра упоређују, па се прелази на извршавање инструкција које зависе од тога да ли је један број био већи од другог. Пошто јесте, прва инструкција &amp;lt;code&amp;gt;subgt&amp;lt;/code&amp;gt; мења &#039;&#039;R1&#039;&#039; на 5, а друга на -3. Пошто друга инструкција није имала суфикс &amp;lt;code&amp;gt;s&amp;lt;/code&amp;gt;, програмски статусни регистар се није ажурирао, па се наставља на извршавање инструкције &amp;lt;code&amp;gt;subsgt&amp;lt;/code&amp;gt;, након које &#039;&#039;R1&#039;&#039; има вредност -6, а програмска статусна реч се ажурира тако да се последња инструкција не извршава. Релевантна страница у &#039;&#039;Cortex-M3 Programming Manual&#039;&#039; је 56 (3.3.7 &#039;&#039;Conditional execution&#039;&#039;).&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. задатак ===&lt;br /&gt;
Колика је максимална радна фреквенција (&#039;&#039;HCLK&#039;&#039;) микроконтролера &#039;&#039;STM32F103R6&#039;&#039; уколико се користи &#039;&#039;HSE&#039;&#039; осцилатор који на свом излазу производи сигнал такта фреквенције 2MHz? Одговор унети у мегахерцима без навођења ознаке јединице.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Одговор:&#039;&#039;&#039; &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;32&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Објашњење:&#039;&#039;&#039; &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;explanation&amp;quot;&amp;gt;На слици са стране 93 од &#039;&#039;STM32F103 Reference Manual&#039;&#039; може се видети како &#039;&#039;HSE&#039;&#039; такт може проћи кроз PLL који може да његову фреквенцију помножи до 16 пута.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 4. задатак ===&lt;br /&gt;
: &#039;&#039;Исти задатак као са [[Микропроцесорски системи/К2 2022#3. задатак|другог колоквијума 2022. године]].&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== 5. задатак ===&lt;br /&gt;
Периферија &#039;&#039;USART&#039;&#039; микроконтролера &#039;&#039;STM32F103R6&#039;&#039; конфигурисана је тако да преноси осам (8) битова, користи парну парност и поставља један стоп бит. Са линије за пренос узорковани су следећи битови (сваки бит је добијен на основу одговарајућег броја узорака стања на линији):&lt;br /&gt;
 ...111111011011010000011111111...&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;
# Нема грешака&lt;br /&gt;
# Само &#039;&#039;Framing error&#039;&#039;&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;&#039;&#039;Framing error&#039;&#039; и &#039;&#039;Parity error&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
# Само &#039;&#039;Parity error&#039;&#039;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Објашњење:&#039;&#039;&#039; &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;explanation&amp;quot;&amp;gt;Док на жици нема пакета, стоји вредност 1. Наилазимо на почетни бит 0, а након њега долази осам битова од којих осми представља бит парности. Сабирањем тих осам битова добијамо број 5, што је непаран број а парност је парна, па се дешава &#039;&#039;Parity error&#039;&#039;. Након тих осам битова наилази бит са вредношћу 0, а очекује се завршни бит са вредношћу 1, тако да се такође дешава и &#039;&#039;Framing error&#039;&#039;.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Задатак ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
[[Датотека:MIPS jul 2022 referentna šema.jpeg|thumb|Референтна шема у задатку.]]&lt;br /&gt;
# &amp;lt;del&amp;gt;У систему постоји један микроконтролер који контролише вентилатор у складу са тренутном вредношћу температуре. У симулатору &#039;&#039;Proteus&#039;&#039; направити пројекат и инстанцирати микроконтролер &#039;&#039;STM32F103R6 (CM3_STM32)&#039;&#039;. Направити пројекат у алату &#039;&#039;CubeMX&#039;&#039; који ће служити за конфигурисање микроконтролера.&amp;lt;/del&amp;gt;&lt;br /&gt;
# &amp;lt;del&amp;gt;У симулатору &#039;&#039;Proteus&#039;&#039; додати следеће компоненте&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 (MOTORS)&#039;&#039; који представља вентилатор и чија ће брзина рада бити контролисана&amp;lt;/del&amp;gt; &#039;&#039;PWM&#039;&#039; сигналом канала 4 тајмера 1 &amp;lt;del&amp;gt;микроконтролера&amp;lt;/del&amp;gt;,&lt;br /&gt;
#* аналогни мултиплексер &#039;&#039;74HC4051 (74HC)&#039;&#039;, који један од аналогних сигнала са улаза пропушта непромењен на излаз, чији је излазни пин повезан на канал 7 аналогно-дигиталног конвертора микроконтролера; селекција излаза мултиплексера се врши преко његових пинова &#039;&#039;CBA&#039;&#039; где пин &#039;&#039;A&#039;&#039; има најмању тежину,&lt;br /&gt;
#* &amp;lt;del&amp;gt;температурни сензор &#039;&#039;LM35 (NATDAC)&#039;&#039; чији је излазни пин повезан&amp;lt;/del&amp;gt; на нулти улаз (&#039;&#039;X0&#039;&#039;) мултиплексера &amp;lt;del&amp;gt;(аналогна вредност напона на излазном пину сензора је линеарно пропорционална вредности температуре)&amp;lt;/del&amp;gt;,&lt;br /&gt;
#* анемометар &#039;&#039;ANEMOMETER (ACTIVE)&#039;&#039; повезан у складу са референтном шемом на канале 1 и 2 тајмера 1; излазни сигнал анемометра је периодична правоугаона поворка чија се фреквенција линеарно повећава са повећањем брзине ветра (брзина ветра једнака је производу фреквенције излазног сигнала анемометра и реалне константе 2.4),&lt;br /&gt;
#* ветроказ &#039;&#039;WINDVANE (ACTIVE)&#039;&#039; чији је излазни пин повезан у складу са референтном шемом (обратити пажњу на постојање отпорника) на први улаз (X1) мултиплексера; аналогна вредност напона на излазном пину ветроказа представља азимут односно правац ветра (функција за пресликавање вредности напона у азимут дата је у прилогу),&lt;br /&gt;
#* кишомер &#039;&#039;RAINGAUGE (ACTIVE)&#039;&#039; повезан у складу са референтном шемом на моностабилни мултивибратор &#039;&#039;74HC221 (74HC)&#039;&#039;; кишомер ради по принципу кофе са превртањем (кофа се пуни кишницом све док се не препуни, затим долази до њеног превртања и потпуног пражњења уз генерисање електричног импулса); моностабилни мултивибратор обезбеђује униформно трајање генерисаног електричног импулса; подесити на кишомеру ниво превртања кофе (&#039;&#039;Trigger Level&#039;&#039;) на вредност 0.01 милиметара услед чега ће кофа слати електрични импулс на сваких 1200 милисекунди при константном интензитету падавине од 30.0 милиметара по сат (за већи интензитет падавине импулс ће стизати брже и обрнуто); подесити на моностабилном мултивибратору временску константу (&#039;&#039;Monostable Time Constant&#039;&#039;) на једну милисекунду (1mS) услед чега ће сигнал на његовом излазу увек трајати тачно једну милисекунду,&lt;br /&gt;
#* &amp;lt;del&amp;gt;виртуелни терминал повезан на периферију &#039;&#039;USART1&#039;&#039; микроконтролера&amp;lt;/del&amp;gt; преко пинова &#039;&#039;PB6&#039;&#039; и &#039;&#039;PB7&#039;&#039; &amp;lt;del&amp;gt;и,&amp;lt;/del&amp;gt;&lt;br /&gt;
#* &#039;&#039;LCD&#039;&#039; дисплеј &#039;&#039;LM041L (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;
# [6 поена] Обезбедити могућност рада са LCD дисплејом и формирати карактере за LCD дисплеј који представљају &amp;lt;u&amp;gt;стрелицу на горе (↑)&amp;lt;/u&amp;gt; и &amp;lt;u&amp;gt;стрелицу на доле (↓)&amp;lt;/u&amp;gt; у складу са референтним снимком. Ови карактери користиће се као индикатори да ли се нека вредност повећала или смањила приликом њене последње промене.&lt;br /&gt;
# &amp;lt;del&amp;gt;Обезбедити приказ поруке &#039;&#039;&#039;&#039;&#039;&amp;lt;nowiki&amp;gt;/A=&amp;lt;a&amp;gt;/B=&amp;lt;b&amp;gt;/T=&amp;lt;t&amp;gt;/K=&amp;lt;k&amp;gt;&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;&#039;&#039; на виртуелном терминалу, где је &#039;&#039;&amp;lt;nowiki&amp;gt;&amp;lt;a&amp;gt;&amp;lt;/nowiki&amp;gt;&#039;&#039; тренутна вредност азимута ветра, &#039;&#039;&amp;lt;nowiki&amp;gt;&amp;lt;b&amp;gt;&amp;lt;/nowiki&amp;gt;&#039;&#039; тренутна вредност брзине ветра, &#039;&#039;&amp;lt;nowiki&amp;gt;&amp;lt;t&amp;gt;&amp;lt;/nowiki&amp;gt;&#039;&#039; тренутна вредност температуре изражено у степенима Целзијуса у опсегу [0, 60] и &#039;&#039;&amp;lt;nowiki&amp;gt;&amp;lt;k&amp;gt;&amp;lt;/nowiki&amp;gt;&#039;&#039; тренутна вредност интезитета падавине.&amp;lt;/del&amp;gt; Овај испис је предвиђен само ради могућности остваривања парцијалних поена за студенте који успешно очитају вредност са компоненте али не могу да је прикажу на &#039;&#039;LCD&#039;&#039; дисплеју као што је тражено у наредним ставкама. &amp;lt;del&amp;gt;За величине чије вредности нису успешно израчунате исписати ? (знак питања). Освежавање описане поруке вршити периодично на сваких 200 милисекунди уколико је дошло до промене вредности. Приликом освежавања поруке променити тренутне вредности у постојећој поруци уместо додавања нове поруке на виртуелном терминалу.&amp;lt;/del&amp;gt;&lt;br /&gt;
# &amp;lt;del&amp;gt;Обезбедити приказ поруке &#039;&#039;&#039;&#039;&#039;&amp;lt;nowiki&amp;gt;&amp;lt;i&amp;gt; Tem: &amp;lt;t&amp;gt;&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;&#039;&#039; у трећем реду &#039;&#039;LCD&#039;&#039; дисплеја, где &#039;&#039;&amp;lt;nowiki&amp;gt;&amp;lt;t&amp;gt;&amp;lt;/nowiki&amp;gt;&#039;&#039; представља тренутну вредност температуре изражено у степенима Целзијуса у опсегу [0, 60] &amp;lt;u&amp;gt;очитану са температурног сензора&amp;lt;/u&amp;gt;, а &#039;&#039;&amp;lt;nowiki&amp;gt;&amp;lt;i&amp;gt;&amp;lt;/nowiki&amp;gt;&#039;&#039; индикатор смера последње промене вредности у виду стрелице. Освежавање поруке вршити периодично на сваких 200 милисекунди уколико је дошло до промене вредности.&amp;lt;/del&amp;gt; Овај испис је предвиђен ради остваривања поена за студенте који успешно обезбеде могућност рада са &#039;&#039;LCD&#039;&#039; дисплејом.&lt;br /&gt;
# [6 поена] Обезбедити приказ поруке &#039;&#039;&#039;&#039;&#039;&amp;lt;nowiki&amp;gt;&amp;lt;i&amp;gt; Brz: &amp;lt;b&amp;gt;&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;&#039;&#039; у другом реду &#039;&#039;LCD&#039;&#039; дисплеја, где &#039;&#039;&amp;lt;nowiki&amp;gt;&amp;lt;b&amp;gt;&amp;lt;/nowiki&amp;gt;&#039;&#039; представља тренутну вредност брзине ветра &amp;lt;u&amp;gt;очитану са анемометра&amp;lt;/u&amp;gt;, а &#039;&#039;&amp;lt;nowiki&amp;gt;&amp;lt;i&amp;gt;&amp;lt;/nowiki&amp;gt;&#039;&#039; индикатор смера последње промене вредности у виду стрелице. Освежавање поруке вршити периодично на сваких 200 милисекунди уколико је дошло до промене вредности.&lt;br /&gt;
# [6 поена] Обезбедити приказ поруке &#039;&#039;&#039;&#039;&#039;&amp;lt;nowiki&amp;gt;&amp;lt;i&amp;gt; Azi: &amp;lt;a&amp;gt;&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;&#039;&#039; у првом реду &#039;&#039;LCD&#039;&#039; дисплеја, где &#039;&#039;&amp;lt;nowiki&amp;gt;&amp;lt;a&amp;gt;&amp;lt;/nowiki&amp;gt;&#039;&#039; представља тренутну вредност азимута ветра &amp;lt;u&amp;gt;очитану са ветроказа&amp;lt;/u&amp;gt;, а &#039;&#039;&amp;lt;nowiki&amp;gt;&amp;lt;i&amp;gt;&amp;lt;/nowiki&amp;gt;&#039;&#039; индикатор смера последње промене вредности у виду стрелице. Освежавање поруке вршити периодично на сваких 200 милисекунди уколико је дошло до промене вредности.&lt;br /&gt;
# [6 поена] Обезбедити приказ поруке &#039;&#039;&#039;&#039;&#039;&amp;lt;nowiki&amp;gt;&amp;lt;i&amp;gt; Kis: &amp;lt;k&amp;gt;&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;&#039;&#039; у четвртом реду &#039;&#039;LCD&#039;&#039; дисплеја, где &#039;&#039;&amp;lt;nowiki&amp;gt;&amp;lt;k&amp;gt;&amp;lt;/nowiki&amp;gt;&#039;&#039; представља тренутну вредност интензитета падавине изражено у милиметрима по сату очитану са кишомера, а &#039;&#039;&amp;lt;nowiki&amp;gt;&amp;lt;i&amp;gt;&amp;lt;/nowiki&amp;gt;&#039;&#039; индикатор смера последње промене вредности у виду стрелице. Освежавање поруке вршити периодично на сваких 200 милисекунди уколико је дошло до промене вредности.&lt;br /&gt;
# [6 поена] Обезбедити контролу вентилатора на начин описан у наставку. Зависно од тренутне вредности температуре вентилатор се врти одговарајућом брзином. Уколико тренутна вредност температуре припада опсегу:&lt;br /&gt;
#* [0, 30) вентилатор се не врти,&lt;br /&gt;
#* [30, 35) вентилатор се врти брзином једнаком 50% максималне брзине и&lt;br /&gt;
#* [35, 60] вентилатор се врти максималном брзином.&lt;br /&gt;
#:Ажурирање брзине вентилатора вршити периодично на 200 милисекунди.&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Микропроцесорски системи]]&lt;br /&gt;
[[Категорија:Рокови]]&lt;/div&gt;</summary>
		<author><name>Andrija</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:MIPS_jul_2022_referentna_%C5%A1ema.jpeg&amp;diff=8127</id>
		<title>Датотека:MIPS jul 2022 referentna šema.jpeg</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:MIPS_jul_2022_referentna_%C5%A1ema.jpeg&amp;diff=8127"/>
		<updated>2025-10-25T16:36:39Z</updated>

		<summary type="html">&lt;p&gt;Andrija: Нова страница: {{file | description =  }}&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{file&lt;br /&gt;
| description = &lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Andrija</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=8126</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=8126"/>
		<updated>2025-10-23T07:26:07Z</updated>

		<summary type="html">&lt;p&gt;Andrija: Napomena oko naknadne prijave ispita&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;
## Закључану оцену (налази се у секцији &#039;&#039;Положени испити&#039;&#039;) из предмета који хоћете да поништите на студентским сервисима.&lt;br /&gt;
# Потврда о уплати изгледа овако:&lt;br /&gt;
#* &#039;&#039;&#039;Сврха:&#039;&#039;&#039; Поништавање испита&lt;br /&gt;
#* &#039;&#039;&#039;Износ:&#039;&#039;&#039; 2.000,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;
# У случају да немате новац (3.000,00 РСД) на студентском рачуну, морате га уплатити. На е-студенту, у одсеку &amp;quot;Школарине и уплате&amp;quot; постоји пример уплатнице (износ мора бити 3.000,00 РСД или више а сврху уплате можете променити у &amp;quot;Накнадна пријава испита&amp;quot;).&lt;br /&gt;
#* &#039;&#039;&#039;Препоручено је да се на рачун уплате паре најкасније два радна дана пред почетак рока (уколико рок почиње у понедељак, то је 4 дана пре почетка рока), јер је углавном потребан један дан да легну.&#039;&#039;&#039; У случају да вам је остао само један радни дан до почетка рока, &#039;&#039;&#039;морате однети доказ о уплати у студентску службу јер се новац неће прокњижити на време&#039;&#039;&#039;.&lt;br /&gt;
#* Имајте на уму да ако је у питању плаћена пријава испита (пријављиван више од три пута), треба уплатити &#039;&#039;&#039;и пријаву и накнадну пријаву&#039;&#039;&#039;, тј. треба имати 5.000,00 РСД на рачуну.&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; платформа прави излазак из тимова безразложно тешком операцијом. Уколико желите да напустите неки тим, потребно је следеће:&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>Andrija</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=8125</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=8125"/>
		<updated>2025-10-21T00:18:58Z</updated>

		<summary type="html">&lt;p&gt;Andrija: Korekcija cene za naknadnu prijavu ispita&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;
## Закључану оцену (налази се у секцији &#039;&#039;Положени испити&#039;&#039;) из предмета који хоћете да поништите на студентским сервисима.&lt;br /&gt;
# Потврда о уплати изгледа овако:&lt;br /&gt;
#* &#039;&#039;&#039;Сврха:&#039;&#039;&#039; Поништавање испита&lt;br /&gt;
#* &#039;&#039;&#039;Износ:&#039;&#039;&#039; 2.000,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;
# У случају да немате новац (3.000,00 РСД) на студентском рачуну, морате га уплатити. На е-студенту, у одсеку &amp;quot;Школарине и уплате&amp;quot; постоји пример уплатнице (износ мора бити 3.000,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; платформа прави излазак из тимова безразложно тешком операцијом. Уколико желите да напустите неки тим, потребно је следеће:&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>Andrija</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=8110</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=8110"/>
		<updated>2025-10-13T23:47:32Z</updated>

		<summary type="html">&lt;p&gt;Andrija: Link ka roku na stranici predmeta&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&#039;&#039;&#039;Ispit u septembarskom roku 2023. godine&#039;&#039;&#039; održan je 16. Septembra. Postavka roka je dostupna sa [http://ir4pp1.etf.rs/Rokovi/2022-2023/pp1-2223-septembar.pdf stranice predmeta].&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;
=== Rešenje ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public Set&amp;lt;Integer&amp;gt; firstPos() {&lt;br /&gt;
    Set&amp;lt;Integer&amp;gt; ret = new HashSet&amp;lt;Integer&amp;gt;();&lt;br /&gt;
&lt;br /&gt;
    switch (this.type) {&lt;br /&gt;
        case &#039;SYMBOL&#039;:&lt;br /&gt;
            ret.add(this.symbolPos);&lt;br /&gt;
            break;&lt;br /&gt;
&lt;br /&gt;
        case &#039;ASTERISK&#039;:&lt;br /&gt;
            return this.left.firstPos();&lt;br /&gt;
&lt;br /&gt;
        case &#039;OR&#039;:&lt;br /&gt;
            for (Integer pos : this.left.firstPos()) {&lt;br /&gt;
                ret.add(pos);&lt;br /&gt;
            }&lt;br /&gt;
            for (Integer pos : this.right.firstPos()) {&lt;br /&gt;
                ret.add(pos);&lt;br /&gt;
            }&lt;br /&gt;
            break;&lt;br /&gt;
&lt;br /&gt;
        case &#039;PERIOD&#039;:&lt;br /&gt;
            for (Integer pos : this.left.firstPos()) {&lt;br /&gt;
                ret.add(pos);&lt;br /&gt;
            }&lt;br /&gt;
            if (this.left.isNullable()) {&lt;br /&gt;
                for (Integer pos : this.right.firstPos()) {&lt;br /&gt;
                    ret.add(pos);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            break;&lt;br /&gt;
&lt;br /&gt;
        default:&lt;br /&gt;
            break;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return ret;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public Set&amp;lt;Integer&amp;gt; lastPos() {&lt;br /&gt;
    Set&amp;lt;Integer&amp;gt; ret = new HashSet&amp;lt;Integer&amp;gt;();&lt;br /&gt;
&lt;br /&gt;
    switch (this.type) {&lt;br /&gt;
        case &#039;SYMBOL&#039;:&lt;br /&gt;
            ret.add(this.symbolPos);&lt;br /&gt;
            break;&lt;br /&gt;
&lt;br /&gt;
        case &#039;ASTERISK&#039;:&lt;br /&gt;
            return this.left.lastPos();&lt;br /&gt;
&lt;br /&gt;
        case &#039;OR&#039;:&lt;br /&gt;
            for (Integer pos : this.left.lastPos()) {&lt;br /&gt;
                ret.add(pos);&lt;br /&gt;
            }&lt;br /&gt;
            for (Integer pos : this.right.lastPos()) {&lt;br /&gt;
                ret.add(pos);&lt;br /&gt;
            }&lt;br /&gt;
            break;&lt;br /&gt;
&lt;br /&gt;
        case &#039;PERIOD&#039;:&lt;br /&gt;
            for (Integer pos : this.right.lastPos()) {&lt;br /&gt;
                ret.add(pos);&lt;br /&gt;
            }&lt;br /&gt;
            if (this.right.isNullable()) {&lt;br /&gt;
                for (Integer pos : this.left.lastPos()) {&lt;br /&gt;
                    ret.add(pos);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            break;&lt;br /&gt;
&lt;br /&gt;
        default:&lt;br /&gt;
            break;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return ret;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public boolean isNullable(){&lt;br /&gt;
	switch(this.type){&lt;br /&gt;
		case &#039;SYMBOL&#039;:&lt;br /&gt;
			return false;&lt;br /&gt;
			&lt;br /&gt;
		case &#039;EPSILON&#039;:&lt;br /&gt;
		case &#039;ASTERISK&#039;:&lt;br /&gt;
			return true;&lt;br /&gt;
			&lt;br /&gt;
		case &#039;PERIOD&#039;:&lt;br /&gt;
			return this.left.isNullable() &amp;amp;&amp;amp; this.right.isNullable();&lt;br /&gt;
			&lt;br /&gt;
		case &#039;OR&#039;:&lt;br /&gt;
			return this.left.isNullable() || this.right.isNullable();&lt;br /&gt;
			&lt;br /&gt;
		default: return false;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2. zadatak ==&lt;br /&gt;
{{delimično rešeno}}&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;
{{delimično rešeno}}&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;
{{delimično rešeno}}&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;
{{delimično rešeno}}&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;
{{delimično rešeno}}&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>Andrija</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=8109</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=8109"/>
		<updated>2025-10-13T23:45:15Z</updated>

		<summary type="html">&lt;p&gt;Andrija: Postavka je dostupna na stranici predmeta&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&#039;&#039;&#039;Januarski ispit 2023. godine&#039;&#039;&#039; održan je 19. januara. Postavka roka je dostupna sa [http://ir4pp1.etf.rs/Rokovi/2022-2023/pp1-2223-januar.pdf 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;
a) Ispis: &amp;lt;br&amp;gt;&lt;br /&gt;
count = 100 &amp;lt;br&amp;gt;&lt;br /&gt;
count = 100 &amp;lt;br&amp;gt;&lt;br /&gt;
Objasnjenje: Statičko razrešavanje znači da veza između imena promenljive i deklaracije se pravi u vreme prevođenja (kompajliranja).&lt;br /&gt;
Dakle, kada se report kompajlira, kompajler već odluči: &amp;quot;ovo count u report se odnosi na count iz procX&amp;quot;, jer je to najbliži leksički obuhvatajući opseg.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
b) Ispis: &amp;lt;br&amp;gt;&lt;br /&gt;
count = 100 &amp;lt;br&amp;gt;&lt;br /&gt;
count = 200 &amp;lt;br&amp;gt;&lt;br /&gt;
Objasnjenje: Kod dinamičkog razrešavanja, nelokalna promenljiva se traži preko lanca aktivacionih zapisa na steku, počev od najbližeg pozivaoca.&lt;br /&gt;
c)&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;
{{delimično rešeno}}&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;
Ova postavka zadatka je gotovo sigurno pogrešna, jer se u stanju praznog steka kod LR(0) parsera ne može preći ni u jedno drugo stanje, a ne može ni da se uradi Reduce. Takođe, nejasno je kakve ulazne sekvence prihvata/odbija ovakva gramatika jer se one ne mogu ni generisati zbog toga što jedina smena za startni neterminal &amp;lt; S &amp;gt; sadrži levu rekurziju, pa je tako jedina moguća sekvenca ona u kojoj se &amp;lt; S &amp;gt; neprestano dodaje na početak.&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;
program Januar2023&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_2&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>Andrija</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=8108</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=8108"/>
		<updated>2025-10-13T23:36:02Z</updated>

		<summary type="html">&lt;p&gt;Andrija: Rok je delimicno resen&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&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;
=== Rešenje ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public Set&amp;lt;Integer&amp;gt; firstPos() {&lt;br /&gt;
    Set&amp;lt;Integer&amp;gt; ret = new HashSet&amp;lt;Integer&amp;gt;();&lt;br /&gt;
&lt;br /&gt;
    switch (this.type) {&lt;br /&gt;
        case &#039;SYMBOL&#039;:&lt;br /&gt;
            ret.add(this.symbolPos);&lt;br /&gt;
            break;&lt;br /&gt;
&lt;br /&gt;
        case &#039;ASTERISK&#039;:&lt;br /&gt;
            return this.left.firstPos();&lt;br /&gt;
&lt;br /&gt;
        case &#039;OR&#039;:&lt;br /&gt;
            for (Integer pos : this.left.firstPos()) {&lt;br /&gt;
                ret.add(pos);&lt;br /&gt;
            }&lt;br /&gt;
            for (Integer pos : this.right.firstPos()) {&lt;br /&gt;
                ret.add(pos);&lt;br /&gt;
            }&lt;br /&gt;
            break;&lt;br /&gt;
&lt;br /&gt;
        case &#039;PERIOD&#039;:&lt;br /&gt;
            for (Integer pos : this.left.firstPos()) {&lt;br /&gt;
                ret.add(pos);&lt;br /&gt;
            }&lt;br /&gt;
            if (this.left.isNullable()) {&lt;br /&gt;
                for (Integer pos : this.right.firstPos()) {&lt;br /&gt;
                    ret.add(pos);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            break;&lt;br /&gt;
&lt;br /&gt;
        default:&lt;br /&gt;
            break;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return ret;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public Set&amp;lt;Integer&amp;gt; lastPos() {&lt;br /&gt;
    Set&amp;lt;Integer&amp;gt; ret = new HashSet&amp;lt;Integer&amp;gt;();&lt;br /&gt;
&lt;br /&gt;
    switch (this.type) {&lt;br /&gt;
        case &#039;SYMBOL&#039;:&lt;br /&gt;
            ret.add(this.symbolPos);&lt;br /&gt;
            break;&lt;br /&gt;
&lt;br /&gt;
        case &#039;ASTERISK&#039;:&lt;br /&gt;
            return this.left.lastPos();&lt;br /&gt;
&lt;br /&gt;
        case &#039;OR&#039;:&lt;br /&gt;
            for (Integer pos : this.left.lastPos()) {&lt;br /&gt;
                ret.add(pos);&lt;br /&gt;
            }&lt;br /&gt;
            for (Integer pos : this.right.lastPos()) {&lt;br /&gt;
                ret.add(pos);&lt;br /&gt;
            }&lt;br /&gt;
            break;&lt;br /&gt;
&lt;br /&gt;
        case &#039;PERIOD&#039;:&lt;br /&gt;
            for (Integer pos : this.right.lastPos()) {&lt;br /&gt;
                ret.add(pos);&lt;br /&gt;
            }&lt;br /&gt;
            if (this.right.isNullable()) {&lt;br /&gt;
                for (Integer pos : this.left.lastPos()) {&lt;br /&gt;
                    ret.add(pos);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            break;&lt;br /&gt;
&lt;br /&gt;
        default:&lt;br /&gt;
            break;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return ret;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public boolean isNullable(){&lt;br /&gt;
	switch(this.type){&lt;br /&gt;
		case &#039;SYMBOL&#039;:&lt;br /&gt;
			return false;&lt;br /&gt;
			&lt;br /&gt;
		case &#039;EPSILON&#039;:&lt;br /&gt;
		case &#039;ASTERISK&#039;:&lt;br /&gt;
			return true;&lt;br /&gt;
			&lt;br /&gt;
		case &#039;PERIOD&#039;:&lt;br /&gt;
			return this.left.isNullable() &amp;amp;&amp;amp; this.right.isNullable();&lt;br /&gt;
			&lt;br /&gt;
		case &#039;OR&#039;:&lt;br /&gt;
			return this.left.isNullable() || this.right.isNullable();&lt;br /&gt;
			&lt;br /&gt;
		default: return false;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2. zadatak ==&lt;br /&gt;
{{delimično rešeno}}&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;
{{delimično rešeno}}&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;
{{delimično rešeno}}&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;
{{delimično rešeno}}&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;
{{delimično rešeno}}&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>Andrija</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_2024&amp;diff=8107</id>
		<title>Програмски преводиоци 1/Јануар 2024</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_2024&amp;diff=8107"/>
		<updated>2025-10-13T23:33:14Z</updated>

		<summary type="html">&lt;p&gt;Andrija: Rok je delimicno resen&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&#039;&#039;&#039;Januarski ispit 2024. godine&#039;&#039;&#039; održan je 18. januara i trajao je 150 minuta. Postavka roka nije dostupna sa stranice predmeta.&lt;br /&gt;
&lt;br /&gt;
== 1. zadatak ==&lt;br /&gt;
{{delimično rešeno}}&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Dat je sledeći kod na programskom jeziku C.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int f1(int a) {&lt;br /&gt;
    int b = a;&lt;br /&gt;
    b = b + 1;&lt;br /&gt;
    return b;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int f2(int a) {&lt;br /&gt;
    int b = a;&lt;br /&gt;
    b = b + f1(1);&lt;br /&gt;
    return b;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int m(int a, int n, int (*m1)(int), int(*m2)(int)) {&lt;br /&gt;
    int tmp1, int tmp2;&lt;br /&gt;
    tmp1 = f1(a);&lt;br /&gt;
    tmp2 = f2(a);&lt;br /&gt;
    &lt;br /&gt;
    if (n == 0) {&lt;br /&gt;
        return 1;&lt;br /&gt;
    } else {&lt;br /&gt;
        return tmp2 * m(tmp1, n - 1, m1, m2);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    printf(&amp;quot;%d&amp;quot;, m(1, 3, &amp;amp;f1, &amp;amp;f2));&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Dati ispis programa;&lt;br /&gt;
* Dati izgled steka nakon poslednjeg poziva funkcije &amp;lt;code&amp;gt;f2&amp;lt;/code&amp;gt;;&lt;br /&gt;
* Dati x86 kod za funkciju &amp;lt;code&amp;gt;f2&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&lt;br /&gt;
== 2. zadatak ==&lt;br /&gt;
{{delimično rešeno}}&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Data je sledeća gramatika:&lt;br /&gt;
* &amp;amp;lt;S&amp;gt; -&amp;gt; &amp;amp;lt;S&amp;gt;a&lt;br /&gt;
* &amp;amp;lt;S&amp;gt; -&amp;gt; &amp;amp;lt;S&amp;gt;&amp;amp;lt;A&amp;gt;b&lt;br /&gt;
* &amp;amp;lt;S&amp;gt; -&amp;gt; eps&lt;br /&gt;
* &amp;amp;lt;A&amp;gt; -&amp;gt; a&lt;br /&gt;
* &amp;amp;lt;A&amp;gt; -&amp;gt; b&lt;br /&gt;
&lt;br /&gt;
# Konstruisati automat i kontrolnu tabelu SLR(1) automata&lt;br /&gt;
# Ispraviti gramatiku tako da se ukloni konflikt ali semantika ostane ista.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&lt;br /&gt;
== 3. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Date su sledeće gramatike:&lt;br /&gt;
&lt;br /&gt;
Gramatika A:&lt;br /&gt;
# &amp;amp;lt;P&amp;gt; -&amp;gt; o &amp;amp;lt;P&amp;gt; &amp;amp;lt;P&amp;gt;&lt;br /&gt;
# &amp;amp;lt;P&amp;gt; -&amp;gt; v&lt;br /&gt;
&lt;br /&gt;
Gramatika B:&lt;br /&gt;
# &amp;amp;lt;P&amp;gt; -&amp;gt; &amp;amp;lt;P&amp;gt; o &amp;amp;lt;P&amp;gt; &lt;br /&gt;
# &amp;amp;lt;P&amp;gt; -&amp;gt; v&lt;br /&gt;
&lt;br /&gt;
Gramatika C:&lt;br /&gt;
# &amp;amp;lt;P&amp;gt; -&amp;gt; &amp;amp;lt;P&amp;gt; &amp;amp;lt;P&amp;gt; o&lt;br /&gt;
# &amp;amp;lt;P&amp;gt; -&amp;gt; v&lt;br /&gt;
&lt;br /&gt;
Gramatika D:&lt;br /&gt;
# &amp;amp;lt;P&amp;gt; -&amp;gt; v &amp;amp;lt;Q&amp;gt;&lt;br /&gt;
# &amp;amp;lt;Q&amp;gt; -&amp;gt; &amp;amp;lt;P&amp;gt; o &amp;amp;lt;Q&amp;gt;&lt;br /&gt;
# &amp;amp;lt;Q&amp;gt; -&amp;gt; eps&lt;br /&gt;
&lt;br /&gt;
Gramatika E&lt;br /&gt;
# &amp;amp;lt;P&amp;gt; -&amp;gt; v &amp;amp;lt;P&amp;gt; o&lt;br /&gt;
# &amp;amp;lt;P&amp;gt; -&amp;gt; v&lt;br /&gt;
&lt;br /&gt;
* Koje su dve gramatike iste?&lt;br /&gt;
* Dokazati na primeru neke sekvence da se ostale 3 gramatike razlikuju.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
a) Gramatika A jedina može počinjati sa O, pa ona sigurno nije ista kao neka druga. Gramatika B može prihvatiti sekvencu VOV, dok gramatika C ne može, pa ni one nisu iste. Gramatika C mora početi sa VV, što važi i za gramatiku E, pa su te dve gramatike iste.&lt;br /&gt;
&lt;br /&gt;
b) Ukoliko uzmemo sekvencu OVV, takva sekvenca je validna za gramatiku A, ali nije za gramatike B i D. U gramatici B vidimo da ukoliko je ulazna sekvenca duža od 1, posle V mora da sledi O, dok u gramatici D to nije slučaj. Na primer, za sekvencu VVO se vidi da se B i D razlikuju jer gramatika D prihvata takvu sekvencu dok je gramatika B odbija.&lt;br /&gt;
&lt;br /&gt;
== 4. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Napisati funkciju &amp;lt;code&amp;gt;static Obj find(String name, boolean isGlobal)&amp;lt;/code&amp;gt; za mikrojavu, koja se ponaša kao operator &amp;lt;code&amp;gt;::&amp;lt;/code&amp;gt; ako je &amp;lt;code&amp;gt;isGlobal=true&amp;lt;/code&amp;gt;. Traženu funkciju pisati od nule.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class Tab {&lt;br /&gt;
    public static final Struct&lt;br /&gt;
        noType = new Struct(Struct.None),&lt;br /&gt;
        intType = new Struct(Struct.Int),&lt;br /&gt;
        charType = new Struct(Struct.Char),&lt;br /&gt;
        nullType = new Struct(Struct.Class);&lt;br /&gt;
    public static final Obj noObj = new Obj(Obj.Var, &amp;quot;noObj&amp;quot;, noType);&lt;br /&gt;
    public static Obj chrObj, ordObj, lenObj;&lt;br /&gt;
    public static Scope currentScope; &lt;br /&gt;
    private static int currentLevel; //universe == -1&lt;br /&gt;
&lt;br /&gt;
    public static Obj find(String name, boolean isGlobal);&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;java&amp;quot;&amp;gt;&lt;br /&gt;
public static Obj find(String name, boolean isGlobal) {&lt;br /&gt;
    Obj result = null;&lt;br /&gt;
&lt;br /&gt;
    if (isGlobal == true) {&lt;br /&gt;
        Scope s = currentScope;&lt;br /&gt;
&lt;br /&gt;
        while (s.getOuter() != null) {&lt;br /&gt;
            s = s.getOuter();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if (s.getLocals() != null) {&lt;br /&gt;
            result = s.getLocals().searchKey(name);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
    } else {&lt;br /&gt;
        for (Scope s = currentScope; s != null; s = s.getOuter()) {&lt;br /&gt;
            if (s.getLocals() != null) {&lt;br /&gt;
                result = s.getLocals().searchKey(name);&lt;br /&gt;
                if (result != null) break;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return (result != null) ? result : noObj;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
Operator :: preskače sve opsege i traži ime direktno u universe opsegu. Pošto u fragmentu koda koji je dat nije navedeno da postoji pokazivač na universe opseg, onda se u if grani ide na gore sve dok se ne dođe do njega i zatim se u njemu pretražuje. Else grana je standardna implementacija koja je data u projektu.&lt;br /&gt;
&lt;br /&gt;
== 5. zadatak ==&lt;br /&gt;
{{delimično rešeno}}&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Za dati regularni izraz &amp;lt;code&amp;gt;(a | (bc)*)+  d  (c | ε)+&amp;lt;/code&amp;gt; konstruisati DKA.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&lt;br /&gt;
== 6. zadatak ==&lt;br /&gt;
{{delimično rešeno}}&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Za sledeći kod napisati Mikrojava bajtkod.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
int b;&lt;br /&gt;
const int one = 1;&lt;br /&gt;
&lt;br /&gt;
class A {&lt;br /&gt;
    int[] niz;&lt;br /&gt;
    int calc(int a) {&lt;br /&gt;
        ...nebitno&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
class B extends A {&lt;br /&gt;
    int calc(int a) {&lt;br /&gt;
        ...isto nebitno&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int f(int c) &lt;br /&gt;
{&lt;br /&gt;
    if (c &amp;gt; 10) return c;&lt;br /&gt;
    else return c + 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void main() &lt;br /&gt;
    int x, y; A c;&lt;br /&gt;
{&lt;br /&gt;
    read(b);&lt;br /&gt;
    b = f(b);&lt;br /&gt;
    c = new B;&lt;br /&gt;
    x = 0;&lt;br /&gt;
&lt;br /&gt;
    do {&lt;br /&gt;
        if (x % 2 == 0) y = c.calc(b);&lt;br /&gt;
        else y = y + (b + one);&lt;br /&gt;
        &lt;br /&gt;
        x++;&lt;br /&gt;
    } while (x &amp;lt; 5);&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;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:Програмски преводиоци 1]]&lt;/div&gt;</summary>
		<author><name>Andrija</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=8106</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=8106"/>
		<updated>2025-10-13T23:31:40Z</updated>

		<summary type="html">&lt;p&gt;Andrija: Rok je delimicno resen&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&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;
a) Ispis: &amp;lt;br&amp;gt;&lt;br /&gt;
count = 100 &amp;lt;br&amp;gt;&lt;br /&gt;
count = 100 &amp;lt;br&amp;gt;&lt;br /&gt;
Objasnjenje: Statičko razrešavanje znači da veza između imena promenljive i deklaracije se pravi u vreme prevođenja (kompajliranja).&lt;br /&gt;
Dakle, kada se report kompajlira, kompajler već odluči: &amp;quot;ovo count u report se odnosi na count iz procX&amp;quot;, jer je to najbliži leksički obuhvatajući opseg.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
b) Ispis: &amp;lt;br&amp;gt;&lt;br /&gt;
count = 100 &amp;lt;br&amp;gt;&lt;br /&gt;
count = 200 &amp;lt;br&amp;gt;&lt;br /&gt;
Objasnjenje: Kod dinamičkog razrešavanja, nelokalna promenljiva se traži preko lanca aktivacionih zapisa na steku, počev od najbližeg pozivaoca.&lt;br /&gt;
c)&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;
{{delimično rešeno}}&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;
Ova postavka zadatka je gotovo sigurno pogrešna, jer se u stanju praznog steka kod LR(0) parsera ne može preći ni u jedno drugo stanje, a ne može ni da se uradi Reduce. Takođe, nejasno je kakve ulazne sekvence prihvata/odbija ovakva gramatika jer se one ne mogu ni generisati zbog toga što jedina smena za startni neterminal &amp;lt; S &amp;gt; sadrži levu rekurziju, pa je tako jedina moguća sekvenca ona u kojoj se &amp;lt; S &amp;gt; neprestano dodaje na početak.&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_2&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>Andrija</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9A%D0%94%D0%9F/%D0%A1%D0%B5%D0%BF%D1%82%D0%B5%D0%BC%D0%B1%D0%B0%D1%80_2023&amp;diff=8006</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%A1%D0%B5%D0%BF%D1%82%D0%B5%D0%BC%D0%B1%D0%B0%D1%80_2023&amp;diff=8006"/>
		<updated>2025-09-15T15:28:07Z</updated>

		<summary type="html">&lt;p&gt;Andrija: Tekst zadatka ispravka&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&amp;lt;!-- Ово ставити уколико НИЈЕДАН задатак није решен, док уколико само неки задаци нису решени на првом месту у њиховој секцији поставити {{делимично решено}}. Уколико се користи било који од ова два шаблона, ОБАВЕЗНО проверити да ли постоји излиставање тих рокова коришћењем {{рокови}} шаблона на страници предмета у одељку за потребну помоћ (како би се знало да нерешени рокови постоје). --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== {{категорија|1. задатак|Синхронизациони_алгоритми}} ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Написати и објаснити CLH алгоритам за критичну секцију (coarse grain). Реализовати (fine grain) верзију алгоритма уколико би на датом процесору постојала операција SWAP која би недељиво обављала замену вердности два операнда (SWAP(var1, var2): &amp;lt;temp=var1; var1=var2; var2=temp;&amp;gt;). Објаснити зашто је то правична критична секција.  &lt;br /&gt;
=== Решење ===&lt;br /&gt;
CLH алгоритам процесе уланчава у уланчану листу по редоследу којим долазе. Самим тим та листа се понаша као ред и тиме је овај алгоритам правичан јер користи FIFO принцип.&lt;br /&gt;
&#039;&#039;Coarse-grain&#039;&#039; решење:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct Node {&lt;br /&gt;
    bool locked;&lt;br /&gt;
    Node() {&lt;br /&gt;
        locked = true;&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Node* tail = nullptr;&lt;br /&gt;
&lt;br /&gt;
void process() {&lt;br /&gt;
    while (true) {&lt;br /&gt;
        Node* new_node = new Node();&lt;br /&gt;
        Node* prev;&lt;br /&gt;
        &amp;lt; prev = tail; tail = new_node; &amp;gt;&lt;br /&gt;
        &amp;lt; await(tail == nullptr || !prev-&amp;gt;locked); &amp;gt;&lt;br /&gt;
        /* критична секција */&lt;br /&gt;
        new_node-&amp;gt;locked=false;&lt;br /&gt;
        /* некритична секција */&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&#039;&#039;Fine-grain&#039;&#039; решење: &lt;br /&gt;
Пошто су prev и new_node локални показивачи, можемо да их усмеримо на новокреирани чвор. Затим се недељиво позива функција SWAP која ће недељиво заменити вредност prev и tail показивача. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct Node {&lt;br /&gt;
    bool locked;&lt;br /&gt;
    Node() {&lt;br /&gt;
        locked = true;&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Node* tail = nullptr;&lt;br /&gt;
&lt;br /&gt;
void process() {&lt;br /&gt;
    while (true) {&lt;br /&gt;
        Node* new_node = new Node();&lt;br /&gt;
        Node* prev = new_node;&lt;br /&gt;
        SWAP(prev, tail);&lt;br /&gt;
        while(prev!= nullptr &amp;amp;&amp;amp; prev-&amp;gt;locked) skip();&lt;br /&gt;
        /* критична секција */&lt;br /&gt;
        new_node-&amp;gt;locked=false;&lt;br /&gt;
        /* некритична секција */&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== {{категорија|2. задатак|Монитори}} ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Трајект за превоз аутомобила, камиона и аутобуса превози возила са обале на обалу. Трајект поседује N позиција које су линеарлно постављене једна иза друге. Камиона заузима три, аутовус две а аутомобил једну позицију. Возила чекају на трајект у реду и на њега улазе једно по једно по редоследу у ком чекају у реду, док на трајекту има места. Када нема места да се наредно возило у реду укрца и трајект није у потпуности попуњен, преко реда се укрцавају мања возила док се трајект не попуни у потпуности. Када је комплетно пун, трајект започиње превоз возила на другу обалу. На другој обали возила се искрцавају у редоследу супротном од оног у којем су се укрцала. Када се сва возила искрцају, празан трајект се враћа на почетну обалу. Написати монитор са &#039;&#039;signal and wait&#039;&#039; дисциплином који решава дати проблем.&lt;br /&gt;
=== Решење ===&lt;br /&gt;
{{делимично решено}}&lt;br /&gt;
== {{категорија|3. задатак|Филтерски_процеси}} ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Филтерски процеси имају један улаз и један излаз и раде следеће: примају позитивне вредности на улазу и прослеђују их на излаз ако су веће од запамћеног минимума процеса. Процеси имају само две локације, за сачувани минимум и за последњу примљену вредност. Када на улаз стигне EOS, избацују минималну вредност на излаз а затим EOS. Направите проточну обраду (&#039;&#039;pipeline&#039;&#039;) од n процеса који опадајуће соритају до n улазних позитивних вредности које се убацују на почетак проточне обраде а завршавају се са EOS.&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void process() {&lt;br /&gt;
    chan&amp;lt;int&amp;gt; in;&lt;br /&gt;
    chan&amp;lt;int&amp;gt; out;&lt;br /&gt;
    int input;&lt;br /&gt;
    int min;&lt;br /&gt;
    while ((input = in.receive()) != EOS) {&lt;br /&gt;
        if (input &amp;lt; min) {&lt;br /&gt;
            out.send(min);&lt;br /&gt;
            min = input;&lt;br /&gt;
        } else out.send(input);&lt;br /&gt;
    }&lt;br /&gt;
    out.send(min);    &lt;br /&gt;
    out.send(EOS);&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;
Постоји N пчела и један гладан медвед (&#039;&#039;The bear and honeybees&#039;&#039;). Они користе заједничку кошницу. Кошница је иницијално празна, a може да прими H напрстака меда. Медвед спава док се кошница не напуни медом, када се напуни медом меда поједе сав мед након чега се враћа на спавање. Пчелице непрестано лете од света до света и сакупљају мед. Када прикупе један напрстак долазе и стављају га у кошницу. Она пчела која је попунила кошницу буди медведа. Решити проблем користећи CSP.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Наставити са копирањем одељака изнад уколико има још задатака. --&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
[Bee(i:1..N)::BEE || Bear::BEAR || BeeHive::BEEHIVE]&lt;br /&gt;
&lt;br /&gt;
BEE :: [&lt;br /&gt;
    full: boolean&lt;br /&gt;
    *[&lt;br /&gt;
		flyAndCollect()&lt;br /&gt;
		BeeHive!honneyCollected&lt;br /&gt;
    	BeeHive?isFull(full)&lt;br /&gt;
    	full == true -&amp;gt; Bear!hiveFull&lt;br /&gt;
    ]&lt;br /&gt;
]&lt;br /&gt;
&lt;br /&gt;
BEAR :: *[&lt;br /&gt;
	sleep()&lt;br /&gt;
    [&lt;br /&gt;
        (i:0..N) Bee(i)?hiveFull&lt;br /&gt;
    ]&lt;br /&gt;
    eat()&lt;br /&gt;
	BeeHive!honeyEaten&lt;br /&gt;
]&lt;br /&gt;
&lt;br /&gt;
BEEHIVE :: [&lt;br /&gt;
    H: integer&lt;br /&gt;
	size: integer := 0&lt;br /&gt;
	&lt;br /&gt;
	*[&lt;br /&gt;
		size &amp;lt; H, (i:0..N) Bee(i)?honneyCollected -&amp;gt; [&lt;br /&gt;
			size := size + 1&lt;br /&gt;
            Bee(i)!isFull(size == H)&lt;br /&gt;
		]&lt;br /&gt;
		□&lt;br /&gt;
		size == H; Bear?honeyEaten -&amp;gt; [&lt;br /&gt;
			size := 0&lt;br /&gt;
		]&lt;br /&gt;
	]&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>Andrija</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9A%D0%94%D0%9F/%D0%A1%D0%B5%D0%BF%D1%82%D0%B5%D0%BC%D0%B1%D0%B0%D1%80_2023&amp;diff=8005</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%A1%D0%B5%D0%BF%D1%82%D0%B5%D0%BC%D0%B1%D0%B0%D1%80_2023&amp;diff=8005"/>
		<updated>2025-09-15T15:25:55Z</updated>

		<summary type="html">&lt;p&gt;Andrija: Poboljsanje resenja&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&amp;lt;!-- Ово ставити уколико НИЈЕДАН задатак није решен, док уколико само неки задаци нису решени на првом месту у њиховој секцији поставити {{делимично решено}}. Уколико се користи било који од ова два шаблона, ОБАВЕЗНО проверити да ли постоји излиставање тих рокова коришћењем {{рокови}} шаблона на страници предмета у одељку за потребну помоћ (како би се знало да нерешени рокови постоје). --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== {{категорија|1. задатак|Синхронизациони_алгоритми}} ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Написати и објаснити CLH алгоритам за критичну секцију (coarse grain). Реализовати (fine grain) верзију алгоритма уколико би на датом процесору постојала операција SWAP која би недељиво обављала замену вердности два операнда (SWAP(var1, var2): &amp;lt;temp=var1; var1=var2; var2=temp;&amp;gt;). Објаснити зашто је то правична критична секција.  &lt;br /&gt;
=== Решење ===&lt;br /&gt;
CLH алгоритам процесе уланчава у уланчану листу по редоследу којим долазе. Самим тим та листа се понаша као ред и тиме је овај алгоритам правичан јер користи FIFO принцип.&lt;br /&gt;
&#039;&#039;Coarse-grain&#039;&#039; решење:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct Node {&lt;br /&gt;
    bool locked;&lt;br /&gt;
    Node() {&lt;br /&gt;
        locked = true;&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Node* tail = nullptr;&lt;br /&gt;
&lt;br /&gt;
void process() {&lt;br /&gt;
    while (true) {&lt;br /&gt;
        Node* new_node = new Node();&lt;br /&gt;
        Node* prev;&lt;br /&gt;
        &amp;lt; prev = tail; tail = new_node; &amp;gt;&lt;br /&gt;
        &amp;lt; await(tail == nullptr || !prev-&amp;gt;locked); &amp;gt;&lt;br /&gt;
        /* критична секција */&lt;br /&gt;
        new_node-&amp;gt;locked=false;&lt;br /&gt;
        /* некритична секција */&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&#039;&#039;Fine-grain&#039;&#039; решење: &lt;br /&gt;
Пошто су prev и new_node локални показивачи, можемо да их усмеримо на новокреирани чвор. Затим се недељиво позива функција SWAP која ће недељиво заменити вредност prev и tail показивача. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct Node {&lt;br /&gt;
    bool locked;&lt;br /&gt;
    Node() {&lt;br /&gt;
        locked = true;&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Node* tail = nullptr;&lt;br /&gt;
&lt;br /&gt;
void process() {&lt;br /&gt;
    while (true) {&lt;br /&gt;
        Node* new_node = new Node();&lt;br /&gt;
        Node* prev = new_node;&lt;br /&gt;
        SWAP(prev, tail);&lt;br /&gt;
        while(prev!= nullptr &amp;amp;&amp;amp; prev-&amp;gt;locked) skip();&lt;br /&gt;
        /* критична секција */&lt;br /&gt;
        new_node-&amp;gt;locked=false;&lt;br /&gt;
        /* некритична секција */&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== {{категорија|2. задатак|Монитори}} ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Трајект за превоз аутомобила, камиона и аутобуса превози возила са обале на обалу. Трајект поседује N позиција које су линеарлно постављене једна иза друге. Камиона заузима три, аутовус две а аутомобил једну позицију. Возила чекају на трајект у реду и на њега улазе једно по једно по редоследу у ком чекају у реду, док на трајекту има места. Када нема места да се наредно возило у реду укрца и трајект није у потпуности попуњен, преко реда се укрцавају мања возила док се трајект не попуни у потпуности. Када је комплетно пун, трајект започиње превоз возила на другу обалу. На другој обали возила се искрцавају у редоследу супротном од оног у којем су се укрцала. Када се сва возила искрцају, празан трајект се враћа на почетну обалу. Написати монитор са &#039;&#039;signal and wait&#039;&#039; дисциплином који решава дати проблем.&lt;br /&gt;
=== Решење ===&lt;br /&gt;
{{делимично решено}}&lt;br /&gt;
== {{категорија|3. задатак|Филтерски_процеси}} ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Филтерски процеси имају један улаз и један излаз и раде следеће: примају позитивне вредности на улазу и прослеђују их на излаз ако су веће од запамћеног минимума процеса. Процеси имају само две локације, за сачувани минимум и за последњу примљену вредност. Када на улаз стигне EOS, избацују минималну вредност на излаз а затим EOS. Направите проточну обраду (&#039;&#039;pipeline&#039;&#039;) од n процеса који опадајуће соритају до n улазних позитивних вредности које се убацују на почетак проточне обраде а завршавају се са EOS.&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void process() {&lt;br /&gt;
    chan&amp;lt;int&amp;gt; in;&lt;br /&gt;
    chan&amp;lt;int&amp;gt; out;&lt;br /&gt;
    int input;&lt;br /&gt;
    int min;&lt;br /&gt;
    while ((input = in.receive()) != EOS) {&lt;br /&gt;
        if (input &amp;lt; min) {&lt;br /&gt;
            out.send(min);&lt;br /&gt;
            min = input;&lt;br /&gt;
        } else out.send(input);&lt;br /&gt;
    }&lt;br /&gt;
    out.send(min);    &lt;br /&gt;
    out.send(EOS);&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;
Постоји N пчела и један гладан медвед (&#039;&#039;The bear and honeybees&#039;&#039;). Они користе заједничку кошницу. Кошница је иницијално празна и може да прими до N напрстака меда. Медвед спава док се кошница не напуни медом, када се напуни медом меда поједе сав мед након чега се враћа на спавање. Пчелице непрестано лете од света до света и сакупљају мед. Она пчела која је попунила кошницу буди медведа. Решити проблем користећи CSP.&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Наставити са копирањем одељака изнад уколико има још задатака. --&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
[Bee(i:1..N)::BEE || Bear::BEAR || BeeHive::BEEHIVE]&lt;br /&gt;
&lt;br /&gt;
BEE :: [&lt;br /&gt;
    full: boolean&lt;br /&gt;
    *[&lt;br /&gt;
		flyAndCollect()&lt;br /&gt;
		BeeHive!honneyCollected&lt;br /&gt;
    	BeeHive?isFull(full)&lt;br /&gt;
    	full == true -&amp;gt; Bear!hiveFull&lt;br /&gt;
    ]&lt;br /&gt;
]&lt;br /&gt;
&lt;br /&gt;
BEAR :: *[&lt;br /&gt;
	sleep()&lt;br /&gt;
    [&lt;br /&gt;
        (i:0..N) Bee(i)?hiveFull&lt;br /&gt;
    ]&lt;br /&gt;
    eat()&lt;br /&gt;
	BeeHive!honeyEaten&lt;br /&gt;
]&lt;br /&gt;
&lt;br /&gt;
BEEHIVE :: [&lt;br /&gt;
    H: integer&lt;br /&gt;
	size: integer := 0&lt;br /&gt;
	&lt;br /&gt;
	*[&lt;br /&gt;
		size &amp;lt; H, (i:0..N) Bee(i)?honneyCollected -&amp;gt; [&lt;br /&gt;
			size := size + 1&lt;br /&gt;
            Bee(i)!isFull(size == H)&lt;br /&gt;
		]&lt;br /&gt;
		□&lt;br /&gt;
		size == H; Bear?honeyEaten -&amp;gt; [&lt;br /&gt;
			size := 0&lt;br /&gt;
		]&lt;br /&gt;
	]&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>Andrija</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9A%D0%94%D0%9F/%D0%88%D1%83%D0%BB-1_2025&amp;diff=8003</id>
		<title>КДП/Јул-1 2025</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9A%D0%94%D0%9F/%D0%88%D1%83%D0%BB-1_2025&amp;diff=8003"/>
		<updated>2025-09-14T18:50:59Z</updated>

		<summary type="html">&lt;p&gt;Andrija: Ispravka resenja&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
Испит из КДП-а у року &#039;&#039;&#039;Јул-1 2025. године&#039;&#039;&#039; одржан је 20. августа. Поставка рока тренутно није доступна онлајн.&lt;br /&gt;
&lt;br /&gt;
== {{категорија|1. задатак|Штафетна_палица}} ==&lt;br /&gt;
{{делимично решено}}&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Потребно је реализовати семафор који поред стандардних атомских операција &amp;lt;code&amp;gt;signal()&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;wait()&amp;lt;/code&amp;gt; има и атомске операције &amp;lt;code&amp;gt;signal(n)&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;wait(n)&amp;lt;/code&amp;gt; које интерну семафорску променљиву атомски увећава односно умањује за n уколико је то могуће, уколико није чека док не буде било могуће. Потребно је решити проблем користећи расподељене бинарне семафоре и технику предаје штафетне палице. Процес који је раније упутио &amp;lt;code&amp;gt;wait&amp;lt;/code&amp;gt; захтев треба раније да обави своју операцију. Претпоставити да у било ком тренутку максимално N процеса може упутити захтев за приступ семафору.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&lt;br /&gt;
== {{категорија|2. задатак|Монитори}} ==&lt;br /&gt;
{{делимично решено}}&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Аутомобили који долазе са севера и југа морају да пређу реку преко моста (&#039;&#039;One lane bridge problem&#039;&#039;). На мосту постоји само једна возна трака. Значи, у било ком тренутку мостом може да прође један или више аутомобила који долазе из истог смера (али не и из супротног смера). Обезбедити да се смер саобраћаја мења сваки пут након што га пређе 10 аутомобила из истог смера, ако су за то време један или више аутомобила чекали да га пређу из супротног смера. Написати монитор са signal and wait дисциплином који решава дати проблем.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&lt;br /&gt;
== {{категорија|3. задатак|Филтерски_процеси}} ==&lt;br /&gt;
{{делимично решено}}&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Филтерска мрежа за тражење минимума низа. Елемент мреже на своје улазе прима две&amp;lt;sup&amp;gt;[sic]&amp;lt;/sup&amp;gt; низа целих бројева која се завршавају са вредношћу &#039;&#039;EOS&#039;&#039;. Елемент на једном излазу треба да генерише вредност која одговара минималној вредности из примљених низова, и након тога вредност &#039;&#039;EOS&#039;&#039;. Приказати филтерску мрежу која најбрже налази минимум 11 вредности.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&lt;br /&gt;
== {{категорија|4. задатак|C-Linda}} ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Претпоставити да постоји &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; путника и једно возило на тобогану (&#039;&#039;The roller coaster problem&#039;&#039;). Путници се наизменично шетају по луна парку и возе на тобогану. Тобоган може да прими највише &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; путника при чему је &amp;lt;math&amp;gt;K &amp;lt; N&amp;lt;/math&amp;gt;. Вожња тобоганом може да почне само уколико се сакупило тачно &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; путника. Користећи &#039;&#039;C-Lindu&#039;&#039; написати програм који решава овај проблем.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
const int N, K; // K &amp;lt; N&lt;br /&gt;
&lt;br /&gt;
void putnik(int i) {&lt;br /&gt;
    while (true) {&lt;br /&gt;
        // setnja&lt;br /&gt;
        in(&amp;quot;onboard&amp;quot;);&lt;br /&gt;
        out(&amp;quot;onboarded&amp;quot;);&lt;br /&gt;
        // voznja&lt;br /&gt;
        in(&amp;quot;disembark&amp;quot;);&lt;br /&gt;
        out(&amp;quot;disembarked&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void tobogan() {&lt;br /&gt;
    while (true) {&lt;br /&gt;
        for (int i = 0; i &amp;lt; K; i++) out(&amp;quot;onboard&amp;quot;);&lt;br /&gt;
        for (int i = 0; i &amp;lt; K; i++) in(&amp;quot;onboarded&amp;quot;);&lt;br /&gt;
        // voznja&lt;br /&gt;
        for (int i = 0; i &amp;lt; K; i++) out(&amp;quot;disembark&amp;quot;);&lt;br /&gt;
        for (int i = 0; i &amp;lt; K; i++) in(&amp;quot;disembarked&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void init() {&lt;br /&gt;
    eval(tobogan);&lt;br /&gt;
    for (int i = 0; i &amp;lt; N; i++) {&lt;br /&gt;
        eval(putnik, i);&lt;br /&gt;
    }&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>Andrija</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9A%D0%94%D0%9F/%D0%88%D1%83%D0%BB-1_2025&amp;diff=8002</id>
		<title>КДП/Јул-1 2025</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9A%D0%94%D0%9F/%D0%88%D1%83%D0%BB-1_2025&amp;diff=8002"/>
		<updated>2025-09-14T17:40:16Z</updated>

		<summary type="html">&lt;p&gt;Andrija: Решење 4. задатка&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
Испит из КДП-а у року &#039;&#039;&#039;Јул-1 2025. године&#039;&#039;&#039; одржан је 20. августа. Поставка рока тренутно није доступна онлајн.&lt;br /&gt;
&lt;br /&gt;
== {{категорија|1. задатак|Штафетна_палица}} ==&lt;br /&gt;
{{делимично решено}}&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Потребно је реализовати семафор који поред стандардних атомских операција &amp;lt;code&amp;gt;signal()&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;wait()&amp;lt;/code&amp;gt; има и атомске операције &amp;lt;code&amp;gt;signal(n)&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;wait(n)&amp;lt;/code&amp;gt; које интерну семафорску променљиву атомски увећава односно умањује за n уколико је то могуће, уколико није чека док не буде било могуће. Потребно је решити проблем користећи расподељене бинарне семафоре и технику предаје штафетне палице. Процес који је раније упутио &amp;lt;code&amp;gt;wait&amp;lt;/code&amp;gt; захтев треба раније да обави своју операцију. Претпоставити да у било ком тренутку максимално N процеса може упутити захтев за приступ семафору.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&lt;br /&gt;
== {{категорија|2. задатак|Монитори}} ==&lt;br /&gt;
{{делимично решено}}&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Аутомобили који долазе са севера и југа морају да пређу реку преко моста (&#039;&#039;One lane bridge problem&#039;&#039;). На мосту постоји само једна возна трака. Значи, у било ком тренутку мостом може да прође један или више аутомобила који долазе из истог смера (али не и из супротног смера). Обезбедити да се смер саобраћаја мења сваки пут након што га пређе 10 аутомобила из истог смера, ако су за то време један или више аутомобила чекали да га пређу из супротног смера. Написати монитор са signal and wait дисциплином који решава дати проблем.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&lt;br /&gt;
== {{категорија|3. задатак|Филтерски_процеси}} ==&lt;br /&gt;
{{делимично решено}}&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Филтерска мрежа за тражење минимума низа. Елемент мреже на своје улазе прима две&amp;lt;sup&amp;gt;[sic]&amp;lt;/sup&amp;gt; низа целих бројева која се завршавају са вредношћу &#039;&#039;EOS&#039;&#039;. Елемент на једном излазу треба да генерише вредност која одговара минималној вредности из примљених низова, и након тога вредност &#039;&#039;EOS&#039;&#039;. Приказати филтерску мрежу која најбрже налази минимум 11 вредности.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&lt;br /&gt;
== {{категорија|4. задатак|C-Linda}} ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Претпоставити да постоји &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; путника и једно возило на тобогану (&#039;&#039;The roller coaster problem&#039;&#039;). Путници се наизменично шетају по луна парку и возе на тобогану. Тобоган може да прими највише &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; путника при чему је &amp;lt;math&amp;gt;K &amp;lt; N&amp;lt;/math&amp;gt;. Вожња тобоганом може да почне само уколико се сакупило тачно &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; путника. Користећи &#039;&#039;C-Lindu&#039;&#039; написати програм који решава овај проблем.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
const int N, K; // K &amp;lt; N&lt;br /&gt;
&lt;br /&gt;
void putnik(int i) {&lt;br /&gt;
    while (true) {&lt;br /&gt;
        // setnja&lt;br /&gt;
        in(&amp;quot;ticket&amp;quot;);&lt;br /&gt;
        out(&amp;quot;ready&amp;quot;);&lt;br /&gt;
        in(&amp;quot;start_ride&amp;quot;);&lt;br /&gt;
        // voznja&lt;br /&gt;
        in(&amp;quot;end_ride&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void tobogan() {&lt;br /&gt;
    while (true) {&lt;br /&gt;
        for (int i = 0; i &amp;lt; K; i++) out(&amp;quot;ticket&amp;quot;);&lt;br /&gt;
        for (int i = 0; i &amp;lt; K; i++) in(&amp;quot;ready&amp;quot;);&lt;br /&gt;
        for (int i = 0; i &amp;lt; K; i++) out(&amp;quot;start_ride&amp;quot;);&lt;br /&gt;
        // voznja&lt;br /&gt;
        for (int i = 0; i &amp;lt; K; i++) out(&amp;quot;end_ride&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void init() {&lt;br /&gt;
    eval(tobogan);&lt;br /&gt;
    for (int i = 0; i &amp;lt; N; i++) {&lt;br /&gt;
        eval(putnik, i);&lt;br /&gt;
    }&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>Andrija</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9A%D0%94%D0%9F/%D0%88%D1%83%D0%BB-1_2025&amp;diff=8001</id>
		<title>КДП/Јул-1 2025</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9A%D0%94%D0%9F/%D0%88%D1%83%D0%BB-1_2025&amp;diff=8001"/>
		<updated>2025-09-14T14:31:38Z</updated>

		<summary type="html">&lt;p&gt;Andrija: Ispravka kategorija&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&lt;br /&gt;
Испит из КДП-а у року &#039;&#039;&#039;Јул-1 2025. године&#039;&#039;&#039; одржан је 20. августа. Поставка рока није доступна онлајн.&lt;br /&gt;
&lt;br /&gt;
== {{категорија|1. задатак|Штафетна_палица}} ==&lt;br /&gt;
{{нерешено}}&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Потребно је реализовати семафор који поред стандардних атомских операција &amp;lt;code&amp;gt;signal()&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;wait()&amp;lt;/code&amp;gt; има и атомске операције &amp;lt;code&amp;gt;signal(n)&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;wait(n)&amp;lt;/code&amp;gt; које интерну семафорску променљиву атомски увећава односно умањује за n уколико је то могуће, уколико није чека док не буде било могуће. Потребно је решити проблем користећи расподељене бинарне семафоре и технику предаје штафетне палице. Процес који је раније упутио &amp;lt;code&amp;gt;wait&amp;lt;/code&amp;gt; захтев треба раније да обави своју операцију. Претпоставити да у било ком тренутку максимално N процеса може упутити захтев за приступ семафору.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&lt;br /&gt;
== {{категорија|2. задатак|Монитори}} ==&lt;br /&gt;
{{нерешено}}&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Аутомобили који долазе са севера и југа морају да пређу реку преко моста (&#039;&#039;One lane bridge problem&#039;&#039;). На мосту постоји само једна возна трака. Значи, у било ком тренутку мостом може да прође један или више аутомобила који долазе из истог смера (али не и из супротног смера). Обезбедити да се смер саобраћаја мења сваки пут након што га пређе 10 аутомобила из истог смера, ако су за то време један или више аутомобила чекали да га пређу из супротног смера. Написати монитор са signal and wait дисциплином који решава дати проблем.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&lt;br /&gt;
== {{категорија|3. задатак|Филтерски_процеси}} ==&lt;br /&gt;
{{нерешено}}&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Филтерска мрежа за тражење минимума низа. Елемент мреже на своје улазе прима две&amp;lt;sup&amp;gt;[sic]&amp;lt;/sup&amp;gt; низа целих бројева која се завршавају са вредношћу &#039;&#039;EOS&#039;&#039;. Елемент на једном излазу треба да генерише вредност која одговара минималној вредности из примљених низова, и након тога вредност &#039;&#039;EOS&#039;&#039;. Приказати филтерску мрежу која најбрже налази минимум 11 вредности.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&lt;br /&gt;
== {{категорија|4. задатак|C-Linda}} ==&lt;br /&gt;
{{нерешено}}&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Претпоставити да постоји &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; путника и једно возило на тобогану (&#039;&#039;The roller coaster problem&#039;&#039;). Путници се наизменично шетају по луна парку и возе на тобогану. Тобоган може да прими највише &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; путника при чему је &amp;lt;math&amp;gt;K &amp;lt; N&amp;lt;/math&amp;gt;. Вожња тобоганом може да почне само уколико се сакупило тачно &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; путника. Користећи &#039;&#039;C-Lindu&#039;&#039; написати програм који решава овај проблем.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:КДП]]&lt;/div&gt;</summary>
		<author><name>Andrija</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9A%D0%94%D0%9F/%D0%88%D1%83%D0%BB-1_2025&amp;diff=8000</id>
		<title>КДП/Јул-1 2025</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9A%D0%94%D0%9F/%D0%88%D1%83%D0%BB-1_2025&amp;diff=8000"/>
		<updated>2025-09-14T14:24:58Z</updated>

		<summary type="html">&lt;p&gt;Andrija: Math tagovi&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&lt;br /&gt;
Испит из КДП-а у року &#039;&#039;&#039;Јул-1 2025. године&#039;&#039;&#039; одржан је 20. августа. Поставка рока није доступна онлајн.&lt;br /&gt;
&lt;br /&gt;
== {{категорија|1. задатак|Штафетна палица}} ==&lt;br /&gt;
{{нерешено}}&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Потребно је реализовати семафор који поред стандардних атомских операција &amp;lt;code&amp;gt;signal()&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;wait()&amp;lt;/code&amp;gt; има и атомске операције &amp;lt;code&amp;gt;signal(n)&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;wait(n)&amp;lt;/code&amp;gt; које интерну семафорску променљиву атомски увећава односно умањује за n уколико је то могуће, уколико није чека док не буде било могуће. Потребно је решити проблем користећи расподељене бинарне семафоре и технику предаје штафетне палице. Процес који је раније упутио &amp;lt;code&amp;gt;wait&amp;lt;/code&amp;gt; захтев треба раније да обави своју операцију. Претпоставити да у било ком тренутку максимално N процеса може упутити захтев за приступ семафору.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&lt;br /&gt;
== {{категорија|2. задатак|Монитори}} ==&lt;br /&gt;
{{нерешено}}&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Аутомобили који долазе са севера и југа морају да пређу реку преко моста (&#039;&#039;One lane bridge problem&#039;&#039;). На мосту постоји само једна возна трака. Значи, у било ком тренутку мостом може да прође један или више аутомобила који долазе из истог смера (али не и из супротног смера). Обезбедити да се смер саобраћаја мења сваки пут након што га пређе 10 аутомобила из истог смера, ако су за то време један или више аутомобила чекали да га пређу из супротног смера. Написати монитор са signal and wait дисциплином који решава дати проблем.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&lt;br /&gt;
== {{категорија|3. задатак|Филтерски процеси}} ==&lt;br /&gt;
{{нерешено}}&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Филтерска мрежа за тражење минимума низа. Елемент мреже на своје улазе прима две&amp;lt;sup&amp;gt;[sic]&amp;lt;/sup&amp;gt; низа целих бројева која се завршавају са вредношћу &#039;&#039;EOS&#039;&#039;. Елемент на једном излазу треба да генерише вредност која одговара минималној вредности из примљених низова, и након тога вредност &#039;&#039;EOS&#039;&#039;. Приказати филтерску мрежу која најбрже налази минимум 11 вредности.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&lt;br /&gt;
== {{категорија|4. задатак|C-Linda}} ==&lt;br /&gt;
{{нерешено}}&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Претпоставити да постоји &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; путника и једно возило на тобогану (&#039;&#039;The roller coaster problem&#039;&#039;). Путници се наизменично шетају по луна парку и возе на тобогану. Тобоган може да прими највише &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; путника при чему је &amp;lt;math&amp;gt;K &amp;lt; N&amp;lt;/math&amp;gt;. Вожња тобоганом може да почне само уколико се сакупило тачно &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; путника. Користећи &#039;&#039;C-Lindu&#039;&#039; написати програм који решава овај проблем.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:КДП]]&lt;/div&gt;</summary>
		<author><name>Andrija</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9A%D0%94%D0%9F/%D0%88%D1%83%D0%BB-1_2025&amp;diff=7999</id>
		<title>КДП/Јул-1 2025</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9A%D0%94%D0%9F/%D0%88%D1%83%D0%BB-1_2025&amp;diff=7999"/>
		<updated>2025-09-14T14:21:54Z</updated>

		<summary type="html">&lt;p&gt;Andrija: Dodat rok Jul-1 2025&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&lt;br /&gt;
Испит из КДП-а у року &#039;&#039;&#039;Јул-1 2025. године&#039;&#039;&#039; одржан је 20. августа. Поставка рока није доступна онлајн.&lt;br /&gt;
&lt;br /&gt;
== {{категорија|1. задатак|Штафетна палица}} ==&lt;br /&gt;
{{нерешено}}&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Потребно је реализовати семафор који поред стандардних атомских операција &amp;lt;code&amp;gt;signal()&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;wait()&amp;lt;/code&amp;gt; има и атомске операције &amp;lt;code&amp;gt;signal(n)&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;wait(n)&amp;lt;/code&amp;gt; које интерну семафорску променљиву атомски увећава односно умањује за n уколико је то могуће, уколико није чека док не буде било могуће. Потребно је решити проблем користећи расподељене бинарне семафоре и технику предаје штафетне палице. Процес који је раније упутио &amp;lt;code&amp;gt;wait&amp;lt;/code&amp;gt; захтев треба раније да обави своју операцију. Претпоставити да у било ком тренутку максимално N процеса може упутити захтев за приступ семафору.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&lt;br /&gt;
== {{категорија|2. задатак|Монитори}} ==&lt;br /&gt;
{{нерешено}}&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Аутомобили који долазе са севера и југа морају да пређу реку преко моста (&#039;&#039;One lane bridge problem&#039;&#039;). На мосту постоји само једна возна трака. Значи, у било ком тренутку мостом може да прође један или више аутомобила који долазе из истог смера (али не и из супротног смера). Обезбедити да се смер саобраћаја мења сваки пут након што га пређе 10 аутомобила из истог смера, ако су за то време један или више аутомобила чекали да га пређу из супротног смера. Написати монитор са signal and wait дисциплином који решава дати проблем.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&lt;br /&gt;
== {{категорија|3. задатак|Филтерски процеси}} ==&lt;br /&gt;
{{нерешено}}&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Филтерска мрежа за тражење минимума низа. Елемент мреже на своје улазе прима две&amp;lt;sup&amp;gt;[sic]&amp;lt;/sup&amp;gt; низа целих бројева која се завршавају са вредношћу &#039;&#039;EOS&#039;&#039;. Елемент на једном излазу треба да генерише вредност која одговара минималној вредности из примљених низова, и након тога вредност &#039;&#039;EOS&#039;&#039;. Приказати филтерску мрежу која најбрже налази минимум 11 вредности.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&lt;br /&gt;
== {{категорија|4. задатак|C-Linda}} ==&lt;br /&gt;
{{нерешено}}&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Претпоставити да постоји N путника и једно возило на тобогану (&#039;&#039;The roller coaster problem&#039;&#039;). Путници се наизменично шетају по луна парку и возе на тобогану. Тобоган може да прими највише K путника при чему је K &amp;lt; N. Вожња тобоганом може да почне само уколико се сакупило тачно K путника. Користећи &#039;&#039;C-Lindu&#039;&#039; написати програм који решава овај проблем.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:КДП]]&lt;/div&gt;</summary>
		<author><name>Andrija</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_2024&amp;diff=7998</id>
		<title>КДП/Фебруар 2024</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_2024&amp;diff=7998"/>
		<updated>2025-09-14T13:35:54Z</updated>

		<summary type="html">&lt;p&gt;Andrija: Tagovi za delimicno reseno&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&lt;br /&gt;
== {{категорија|1. задатак|Синхронизациони_алгоритми}} ==&lt;br /&gt;
{{делимично решено}}&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Написати и објаснити &#039;&#039;Test and set&#039;&#039; решење за критичну секцију (&#039;&#039;coarse grain&#039;&#039; и &#039;&#039;fine grain&#039;&#039;). Дати решење за смањење инвалидације кеш меморија у том случају.&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&lt;br /&gt;
== {{категорија|2. задатак|Региони}} ==&lt;br /&gt;
{{делимично решено}}&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Користећи условне критичне регионе написати програм који решава проблем путовања лифтом. Путник позива лифт са произвољног спрата. Када лифт стигне на неки спрат сви путници који су изразили жељу да сиђу на том спрату обавезно изађу. Након изласка путника сви путници који су чекали на улазак уђу у лифт и кажу на који спрат желе да пређу. Тек када се сви изјасне лифт прелази даље. Није потребно оптимизовати пут лифта и путника.&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&lt;br /&gt;
== {{категорија|3. задатак|Активни_монитори}} ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Решити проблем читалаца и писаца (&#039;&#039;Readers-Writers problem&#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;
const int N; // broj citalaca + broj pisaca&lt;br /&gt;
enum op_kind { START_READ, END_READ, START_WRITE, END_WRITE };&lt;br /&gt;
chan request(int id, op_kind op);&lt;br /&gt;
chan reply[N](bool);&lt;br /&gt;
&lt;br /&gt;
void reader(int id) {&lt;br /&gt;
    bool status;&lt;br /&gt;
    while (true) {&lt;br /&gt;
        send request(id, START_READ);&lt;br /&gt;
        receive reply[id](status);&lt;br /&gt;
        // read&lt;br /&gt;
        send request(id, END_READ);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void writer(int id) {&lt;br /&gt;
    bool status;&lt;br /&gt;
    while (true) {&lt;br /&gt;
        send request(id, START_WRITE);&lt;br /&gt;
        receive reply[id](status);&lt;br /&gt;
        // write&lt;br /&gt;
        send request(id, END_WRITE);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void monitor() {&lt;br /&gt;
    int numR = 0, numW = 0;&lt;br /&gt;
    queue buffer(int, int);&lt;br /&gt;
&lt;br /&gt;
    while (true) {&lt;br /&gt;
        int id, op;&lt;br /&gt;
        receive s(id, op);&lt;br /&gt;
&lt;br /&gt;
        if (op == START_READ || op == START_WRITE) {&lt;br /&gt;
            buffer.push(id, op);&lt;br /&gt;
        }&lt;br /&gt;
        if (op == END_READ) numR--;&lt;br /&gt;
        if (op == END_WRITE) numW--;&lt;br /&gt;
&lt;br /&gt;
        if (numW == 0 &amp;amp;&amp;amp; numR == 0 &amp;amp;&amp;amp; !buffer.empty()) {&lt;br /&gt;
            id, op = buffer.pop();&lt;br /&gt;
            if (op == START_READ) numR++;&lt;br /&gt;
            if (op == START_WRITE) numW++;&lt;br /&gt;
            send reply[id](true);&lt;br /&gt;
        }&lt;br /&gt;
        while (numW == 0 &amp;amp;&amp;amp; !buffer.empty() &amp;amp;&amp;amp; buffer.front().op == START_READ) {&lt;br /&gt;
            id, op = buffer.pop();&lt;br /&gt;
            numR++;&lt;br /&gt;
            send reply[id](true);&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;
{{делимично решено}}&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Посматра се шпил од 24 карте, подељене у 4 боје, са по 6 различитих бројева. Игру играју 4 играча, која седе за округлим столом и сваки од њих иницијално држи по 4 карте. Између сва суседна играча се налази гомила са картама, која може у неком тренутку бити празна, а иницијално садржи 2 карте. Игра се завршава када бар један играч објави да има све 4 карте истог броја, у различитим бојама, о тада сви играчи прекидају игру. Сваки играч, док год нема 4 карте исте и нико није објавио да је победник, избацује једну карту из своје руке и ставља је на гомилу са своје леве стране, потом узима једну карту са врха из гомиле са своје десне стране. Претпоставити да су играчима иницијално подељене карте на случајан начин. Користећи CSP написати програме за играче и гомиле са картама.&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:КДП]]&lt;/div&gt;</summary>
		<author><name>Andrija</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_2024&amp;diff=7997</id>
		<title>КДП/Фебруар 2024</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_2024&amp;diff=7997"/>
		<updated>2025-09-13T23:09:01Z</updated>

		<summary type="html">&lt;p&gt;Andrija: Ispravka resenja&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
{{нерешено}}&amp;lt;!-- Ово ставити уколико НИЈЕДАН задатак није решен, док уколико само неки задаци нису решени на првом месту у њиховој секцији поставити {{делимично решено}}. Уколико се користи било који од ова два шаблона, ОБАВЕЗНО проверити да ли постоји излиставање тих рокова коришћењем {{рокови}} шаблона на страници предмета у одељку за потребну помоћ (како би се знало да нерешени рокови постоје). --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== {{категорија|1. задатак|Синхронизациони_алгоритми}} ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Написати и објаснити &#039;&#039;Test and set&#039;&#039; решење за критичну секцију (&#039;&#039;coarse grain&#039;&#039; и &#039;&#039;fine grain&#039;&#039;). Дати решење за смањење инвалидације кеш меморија у том случају.&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&lt;br /&gt;
== {{категорија|2. задатак|Региони}} ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Користећи условне критичне регионе написати програм који решава проблем путовања лифтом. Путник позива лифт са произвољног спрата. Када лифт стигне на неки спрат сви путници који су изразили жељу да сиђу на том спрату обавезно изађу. Након изласка путника сви путници који су чекали на улазак уђу у лифт и кажу на који спрат желе да пређу. Тек када се сви изјасне лифт прелази даље. Није потребно оптимизовати пут лифта и путника.&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&lt;br /&gt;
== {{категорија|3. задатак|Активни_монитори}} ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Решити проблем читалаца и писаца (&#039;&#039;Readers-Writers problem&#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;
const int N; // broj citalaca + broj pisaca&lt;br /&gt;
enum op_kind { START_READ, END_READ, START_WRITE, END_WRITE };&lt;br /&gt;
chan request(int id, op_kind op);&lt;br /&gt;
chan reply[N](bool);&lt;br /&gt;
&lt;br /&gt;
void reader(int id) {&lt;br /&gt;
    bool status;&lt;br /&gt;
    while (true) {&lt;br /&gt;
        send request(id, START_READ);&lt;br /&gt;
        receive reply[id](status);&lt;br /&gt;
        // read&lt;br /&gt;
        send request(id, END_READ);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void writer(int id) {&lt;br /&gt;
    bool status;&lt;br /&gt;
    while (true) {&lt;br /&gt;
        send request(id, START_WRITE);&lt;br /&gt;
        receive reply[id](status);&lt;br /&gt;
        // write&lt;br /&gt;
        send request(id, END_WRITE);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void monitor() {&lt;br /&gt;
    int numR = 0, numW = 0;&lt;br /&gt;
    queue buffer(int, int);&lt;br /&gt;
&lt;br /&gt;
    while (true) {&lt;br /&gt;
        int id, op;&lt;br /&gt;
        receive s(id, op);&lt;br /&gt;
&lt;br /&gt;
        if (op == START_READ || op == START_WRITE) {&lt;br /&gt;
            buffer.push(id, op);&lt;br /&gt;
        }&lt;br /&gt;
        if (op == END_READ) numR--;&lt;br /&gt;
        if (op == END_WRITE) numW--;&lt;br /&gt;
&lt;br /&gt;
        if (numW == 0 &amp;amp;&amp;amp; numR == 0 &amp;amp;&amp;amp; !buffer.empty()) {&lt;br /&gt;
            id, op = buffer.pop();&lt;br /&gt;
            if (op == START_READ) numR++;&lt;br /&gt;
            if (op == START_WRITE) numW++;&lt;br /&gt;
            send reply[id](true);&lt;br /&gt;
        }&lt;br /&gt;
        while (numW == 0 &amp;amp;&amp;amp; !buffer.empty() &amp;amp;&amp;amp; buffer.front().op == START_READ) {&lt;br /&gt;
            id, op = buffer.pop();&lt;br /&gt;
            numR++;&lt;br /&gt;
            send reply[id](true);&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;
=== Поставка ===&lt;br /&gt;
Посматра се шпил од 24 карте, подељене у 4 боје, са по 6 различитих бројева. Игру играју 4 играча, која седе за округлим столом и сваки од њих иницијално држи по 4 карте. Између сва суседна играча се налази гомила са картама, која може у неком тренутку бити празна, а иницијално садржи 2 карте. Игра се завршава када бар један играч објави да има све 4 карте истог броја, у различитим бојама, о тада сви играчи прекидају игру. Сваки играч, док год нема 4 карте исте и нико није објавио да је победник, избацује једну карту из своје руке и ставља је на гомилу са своје леве стране, потом узима једну карту са врха из гомиле са своје десне стране. Претпоставити да су играчима иницијално подељене карте на случајан начин. Користећи CSP написати програме за играче и гомиле са картама.&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Наставити са копирањем одељака изнад уколико има још задатака. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:КДП]]&lt;/div&gt;</summary>
		<author><name>Andrija</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9A%D0%94%D0%9F/%D0%88%D1%83%D0%BB_2020&amp;diff=7986</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%D1%83%D0%BB_2020&amp;diff=7986"/>
		<updated>2025-09-12T17:13:03Z</updated>

		<summary type="html">&lt;p&gt;Andrija: Mala poboljsanja radi citljivosti&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
Поставка овог рока може се наћи са [https://rti.etf.bg.ac.rs/rti/ir3kdp/rokovi/2122/KDP_2022_feb.pdf странице предмета.]&lt;br /&gt;
&lt;br /&gt;
== {{категорија|1. задатак|Штафетна_палица}} ==&lt;br /&gt;
{{делимично решено}}&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Користећи расподељене бинарне семафоре и технику предаје штафетне палице решити проблем читалаца и писаца (&#039;&#039;Readers - Writers Problem&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== {{категорија|2. задатак|Монитори}} ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Проблем изградње молекула воде (&#039;&#039;The H2O Problem&#039;&#039;). Написати монитор са &#039;&#039;signal and continue&#039;&#039; дисциплином за решавање овог проблема, под следећим условима. Атоми водоника, када желе да направе молекул воде, позивају мониторску процедуру &amp;lt;code&amp;gt;hReady()&amp;lt;/code&amp;gt;, атоми кисеоника позивају мониторску процедуру &amp;lt;code&amp;gt;oReady()&amp;lt;/code&amp;gt;. Последњи пристигли атом треба да позове мониторску процедуру &amp;lt;code&amp;gt;makeWater()&amp;lt;/code&amp;gt;, након чијег завршетка сва три атома треба да заврше своје одговарајуће &amp;lt;code&amp;gt;hReady()&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;oReady()&amp;lt;/code&amp;gt; процедуре. Не сме бити изгладњивања.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
class TheH2OProblem {&lt;br /&gt;
    private Condition hQueue = new Condition();&lt;br /&gt;
    private Condition oQueue = new Condition();&lt;br /&gt;
    private int hCount = 0;&lt;br /&gt;
    private int oCount = 0;&lt;br /&gt;
    private int hTicket = 1;&lt;br /&gt;
    private int oTicket = 1;&lt;br /&gt;
    public synchronized void hReady() {&lt;br /&gt;
        ++hCount;&lt;br /&gt;
        if (hCount &amp;gt;= 2 &amp;amp;&amp;amp; oCount &amp;gt;= 1) {&lt;br /&gt;
            makeWater();&lt;br /&gt;
            hCount -= 2;&lt;br /&gt;
            oCount -= 1;&lt;br /&gt;
            hQueue.signal();&lt;br /&gt;
            oQueue.signal();&lt;br /&gt;
        } else {&lt;br /&gt;
            hQueue.wait(hTicket++);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    public synchronized void oReady() {&lt;br /&gt;
        ++oCount;&lt;br /&gt;
        if (hCount &amp;gt;= 2 &amp;amp;&amp;amp; oCount &amp;gt;= 1) {&lt;br /&gt;
            makeWater();&lt;br /&gt;
            hCount -= 2;&lt;br /&gt;
            oCount -= 1;&lt;br /&gt;
            hQueue.signal();&lt;br /&gt;
            hQueue.signal();&lt;br /&gt;
        } else {&lt;br /&gt;
            oQueue.wait(oTicket++);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    private void makeWater() {&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;The Dining Philosophers&#039;&#039;). Филозофи могу да комуницирају искључиво са процесом координатором (централизовано решење). Обезбедити да филозоф који је пре затражио да једе пре и започиње са јелом. Написати код за филозофе и за процес координатор&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
Напомена: Због захтева да филозоф који је пре затражио да једе пре и започне са јелом иде се по строго ФИФО редоследу, и филозофи који су се заблокирали на чекању виљушке неће је добити све док сви филозофи који су затражили виљушку пре њих не добију своју, и из тог разлога је потребна while петља код отпуштања виљушке.&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{ACQUIRE,RELEASE};&lt;br /&gt;
// Poslednji parametar ukazuje na to da li filozof trazi levu (true) ili desnu (false) viljusku&lt;br /&gt;
chan request(int, op_kind, bool);&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 philosopher;&lt;br /&gt;
        op_kind kind;&lt;br /&gt;
        bool left;&lt;br /&gt;
        queue&amp;lt;pair&amp;lt;int,int&amp;gt;&amp;gt; waiting;&lt;br /&gt;
        int forks[N] = {};&lt;br /&gt;
        while (true) {&lt;br /&gt;
            receive request(philosopher, kind, left);&lt;br /&gt;
            int fork = left ? philosopher : (philosopher + 1) % N;&lt;br /&gt;
            if (kind == ACQUIRE) {&lt;br /&gt;
                if (forks[fork] == 0) {&lt;br /&gt;
                    forks[fork] = 1;&lt;br /&gt;
                    send reply[philosopher](true);&lt;br /&gt;
                } else {&lt;br /&gt;
                    waiting.push({philosopher, fork});&lt;br /&gt;
                }&lt;br /&gt;
            } else if (kind == RELEASE) {&lt;br /&gt;
                forks[fork] = 0;&lt;br /&gt;
                while (!waiting.empty() &amp;amp;&amp;amp; forks[waiting.front().second] == 0) {&lt;br /&gt;
                    send reply[waiting.front().first](true);&lt;br /&gt;
                    waiting.pop();&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, ACQUIRE, id != 0);&lt;br /&gt;
        receive reply[id](status);&lt;br /&gt;
        send request(id, ACQUIRE, id == 0);&lt;br /&gt;
        receive reply[id](status);&lt;br /&gt;
        // Eat&lt;br /&gt;
        send request(id, RELEASE, id != 0);&lt;br /&gt;
        send request(id, RELEASE, id == 0);&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;
Посматра се семафор за регулацију саобраћаја на улици са једним пешачким прелазом. Када пешак стигне до пешачког прелаза, уколико је светло за пешаке зелено, он прелази улицу. Уколико је у моменту његовог доласка светло за пешаке црвено, он чека да се укључи зелено светло. Зелено светло за пешаке се укључује или након К секунди од појаве првог пешака који је затекао црвено светло, или након проласка C аутомобила од последњег активног зеленог светла за пешаке. Зелено светло за пешаке трајања G секунди се пали само уколико је испуњен неки од наведених услова и барем један пешак чека. Потребно је у језику CSP написати процесе пешака, аутомобила и семафора, уколико је познато да у систему постоји N аутомобила и T пешака. Доступна је функција &amp;lt;code&amp;gt;system_current_time&amp;lt;/code&amp;gt; која враћа тренутно време система.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&lt;br /&gt;
[[Категорија:КДП]]&lt;br /&gt;
[[Категорија:Рокови]]&lt;/div&gt;</summary>
		<author><name>Andrija</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_2023&amp;diff=7948</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%88%D0%B0%D0%BD%D1%83%D0%B0%D1%80_2023&amp;diff=7948"/>
		<updated>2025-08-20T02:57:32Z</updated>

		<summary type="html">&lt;p&gt;Andrija: Избачено &amp;quot;задатак није решен&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&#039;&#039;&#039;Испит у јануарском испитном року 2023. године&#039;&#039;&#039; одржан је 18. јанаура. Поставка је доступна на [https://rti.etf.bg.ac.rs/rti/ir3kdp/rokovi/2223/IR3KDP_2023_jan.pdf страници предмета].&lt;br /&gt;
&lt;br /&gt;
== {{категорија|1. задатак|Семафори}} ==&lt;br /&gt;
{{делимично решено}}&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Имплементирати и објасните основну разлику и разлоге за постојање те разлике између имплементација бафера коначног капацитета (&amp;lt;code&amp;gt;bounded buffer&amp;lt;/code&amp;gt;) за случајеве 1 произвођач и 1 потрошач, као и M произвођача и N потрошача помоћу семафора. У складу са објашњењем, прикажите разлике и за случајеве M произвођача и 1 потрошач, као и 1 произвођач и N потрошача.&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&lt;br /&gt;
== {{категорија|2. задатак|Монитори}} ==&lt;br /&gt;
{{делимично решено}}&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Аутомобили који долазе са севера и југа морају да пређу реку преко неког старог моста (&amp;lt;code&amp;gt;Old Bridge problem&amp;lt;/code&amp;gt;). На мосту постоји само једна возна трака, па сви аутомобили на мосту морају да се крећу у истом смеру. Због оптерећења моста које мост може да поднесе, број аутомобила који се налазе на мосту не сме да пређе K (K &amp;gt; 0). Написати монитор са &amp;lt;code&amp;gt;signal and continue&amp;lt;/code&amp;gt; дисциплином који решава дати проблем.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&lt;br /&gt;
== {{категорија|3. задатак|CSP}} ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Решити проблем читалаца и писаца користећи &#039;&#039;CSP&#039;&#039;. Решење треба да обезбеди да када стигне захтев од писца за тражење дозволе за започињање писања не треба прихватати захтеве за започињање било од читалаца било од писаца док тај писац не заврши са писањем.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
[reader(i:1..N)::READER || writer(i:1..M)::WRITER || conductor::CONDUCTOR]&lt;br /&gt;
&lt;br /&gt;
READER :: *[&lt;br /&gt;
    conductor!request&lt;br /&gt;
    conductor!pass&lt;br /&gt;
    // reading&lt;br /&gt;
    conductor!done&lt;br /&gt;
]&lt;br /&gt;
&lt;br /&gt;
WRITER :: *[&lt;br /&gt;
    conductor!request&lt;br /&gt;
    conductor!pass&lt;br /&gt;
    // writing&lt;br /&gt;
    conductor!done&lt;br /&gt;
]&lt;br /&gt;
&lt;br /&gt;
CONDUCTOR :: [&lt;br /&gt;
    read_count: integer = 0&lt;br /&gt;
    write_count: integer = 0&lt;br /&gt;
    queue: (0..C) integer&lt;br /&gt;
    who: (0..C) char&lt;br /&gt;
    head: integer = 0&lt;br /&gt;
    tail: integer = 0&lt;br /&gt;
    *[&lt;br /&gt;
        head == tail, write_count == 0, (i:1..N) reader(i)?request -&amp;gt;&lt;br /&gt;
            reader(i)!pass&lt;br /&gt;
            read_count++&lt;br /&gt;
        □&lt;br /&gt;
        head == tail, write_count == 0, read_count == 0, (i:1..M) writer(i)?request -&amp;gt;&lt;br /&gt;
            writer(i)!pass&lt;br /&gt;
            write_count++&lt;br /&gt;
        □&lt;br /&gt;
        (head + 1) % N != tail, write_count + read_count != 0, (i:1..N) reader(i)?request -&amp;gt;&lt;br /&gt;
            queue(head) = i&lt;br /&gt;
            who(head) = &#039;r&#039;&lt;br /&gt;
            head = (head + 1) % N&lt;br /&gt;
        □&lt;br /&gt;
        (head + 1) % N != tail, write_count + read_count != 0, (i:1..M) writer(i)?request -&amp;gt;&lt;br /&gt;
            queue(head) = i&lt;br /&gt;
            who(head) = &#039;w&#039;&lt;br /&gt;
            head = (head + 1) % N&lt;br /&gt;
        □&lt;br /&gt;
        read_count == 1, (i:1..N) reader(i)?done -&amp;gt;&lt;br /&gt;
            read_count--&lt;br /&gt;
            *[&lt;br /&gt;
                head != tail, write_count == 0, who[tail] == &#039;r&#039; -&amp;gt;&lt;br /&gt;
                    reader(queue(tail))!pass&lt;br /&gt;
                    tail = (tail + 1) % N&lt;br /&gt;
                    read_count++&lt;br /&gt;
                □&lt;br /&gt;
                head != tail, write_count == 0, read_count == 0, who[tail] == &#039;w&#039; -&amp;gt;&lt;br /&gt;
                    writer(queue(tail))!pass&lt;br /&gt;
                    tail = (tail + 1) % N&lt;br /&gt;
                    write_count++&lt;br /&gt;
            ]&lt;br /&gt;
        □&lt;br /&gt;
        read_count != 1, (i:1..N) reader(i)?done -&amp;gt;&lt;br /&gt;
            read_count--&lt;br /&gt;
        □&lt;br /&gt;
        (i:1..M) writer(i)?done -&amp;gt;&lt;br /&gt;
            write_count--&lt;br /&gt;
            *[&lt;br /&gt;
                head != tail, write_count == 0, who[tail] == &#039;r&#039; -&amp;gt;&lt;br /&gt;
                    reader(queue(tail))!pass&lt;br /&gt;
                    tail = (tail + 1) % N&lt;br /&gt;
                    read_count++&lt;br /&gt;
                □&lt;br /&gt;
                head != tail, write_count == 0, read_count == 0, who[tail] == &#039;w&#039; -&amp;gt;&lt;br /&gt;
                    writer(queue(tail))!pass&lt;br /&gt;
                    tail = (tail + 1) % N&lt;br /&gt;
                    write_count++&lt;br /&gt;
            ]&lt;br /&gt;
    ]&lt;br /&gt;
]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== {{категорија|4. задатак|C-Linda}} ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Трајект за превоз возила превози возила са обале на обалу. Трајект поседује M трака од којих свака има N позиција које су линеарно постављене једна иза друге. Возило заузима једну позицију. Возило приликом доласка стаје у ред за случајно изабрану траку и чека на укрцавање. Нема могућности за престројавањем. Возила улазе у своју траку једно по једно по редоследу у којем чекају у траци, док на трајекту има места. Када је пун, трајект започиње превоз возила на другу обалу. На другој обали возила се искрцавају из своје траке у редоследу супротном од редоследа у којем су се укрцала у своју траку. Када се сва возила искрцају, празан трајект се враћа на почетну обалу. Користећи &#039;&#039;C-Linda&#039;&#039; написати програм који решава овај проблем.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категорија:КДП]]&lt;br /&gt;
[[Категорија:Рокови]]&lt;/div&gt;</summary>
		<author><name>Andrija</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_2023&amp;diff=7947</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%88%D0%B0%D0%BD%D1%83%D0%B0%D1%80_2023&amp;diff=7947"/>
		<updated>2025-08-20T02:56:09Z</updated>

		<summary type="html">&lt;p&gt;Andrija: Решење 3. задатка&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&#039;&#039;&#039;Испит у јануарском испитном року 2023. године&#039;&#039;&#039; одржан је 18. јанаура. Поставка је доступна на [https://rti.etf.bg.ac.rs/rti/ir3kdp/rokovi/2223/IR3KDP_2023_jan.pdf страници предмета].&lt;br /&gt;
&lt;br /&gt;
== {{категорија|1. задатак|Семафори}} ==&lt;br /&gt;
{{делимично решено}}&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Имплементирати и објасните основну разлику и разлоге за постојање те разлике између имплементација бафера коначног капацитета (&amp;lt;code&amp;gt;bounded buffer&amp;lt;/code&amp;gt;) за случајеве 1 произвођач и 1 потрошач, као и M произвођача и N потрошача помоћу семафора. У складу са објашњењем, прикажите разлике и за случајеве M произвођача и 1 потрошач, као и 1 произвођач и N потрошача.&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&lt;br /&gt;
== {{категорија|2. задатак|Монитори}} ==&lt;br /&gt;
{{делимично решено}}&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Аутомобили који долазе са севера и југа морају да пређу реку преко неког старог моста (&amp;lt;code&amp;gt;Old Bridge problem&amp;lt;/code&amp;gt;). На мосту постоји само једна возна трака, па сви аутомобили на мосту морају да се крећу у истом смеру. Због оптерећења моста које мост може да поднесе, број аутомобила који се налазе на мосту не сме да пређе K (K &amp;gt; 0). Написати монитор са &amp;lt;code&amp;gt;signal and continue&amp;lt;/code&amp;gt; дисциплином који решава дати проблем.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&lt;br /&gt;
== {{категорија|3. задатак|CSP}} ==&lt;br /&gt;
{{делимично решено}}&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Решити проблем читалаца и писаца користећи &#039;&#039;CSP&#039;&#039;. Решење треба да обезбеди да када стигне захтев од писца за тражење дозволе за започињање писања не треба прихватати захтеве за започињање било од читалаца било од писаца док тај писац не заврши са писањем.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
[reader(i:1..N)::READER || writer(i:1..M)::WRITER || conductor::CONDUCTOR]&lt;br /&gt;
&lt;br /&gt;
READER :: *[&lt;br /&gt;
    conductor!request&lt;br /&gt;
    conductor!pass&lt;br /&gt;
    // reading&lt;br /&gt;
    conductor!done&lt;br /&gt;
]&lt;br /&gt;
&lt;br /&gt;
WRITER :: *[&lt;br /&gt;
    conductor!request&lt;br /&gt;
    conductor!pass&lt;br /&gt;
    // writing&lt;br /&gt;
    conductor!done&lt;br /&gt;
]&lt;br /&gt;
&lt;br /&gt;
CONDUCTOR :: [&lt;br /&gt;
    read_count: integer = 0&lt;br /&gt;
    write_count: integer = 0&lt;br /&gt;
    queue: (0..C) integer&lt;br /&gt;
    who: (0..C) char&lt;br /&gt;
    head: integer = 0&lt;br /&gt;
    tail: integer = 0&lt;br /&gt;
    *[&lt;br /&gt;
        head == tail, write_count == 0, (i:1..N) reader(i)?request -&amp;gt;&lt;br /&gt;
            reader(i)!pass&lt;br /&gt;
            read_count++&lt;br /&gt;
        □&lt;br /&gt;
        head == tail, write_count == 0, read_count == 0, (i:1..M) writer(i)?request -&amp;gt;&lt;br /&gt;
            writer(i)!pass&lt;br /&gt;
            write_count++&lt;br /&gt;
        □&lt;br /&gt;
        (head + 1) % N != tail, write_count + read_count != 0, (i:1..N) reader(i)?request -&amp;gt;&lt;br /&gt;
            queue(head) = i&lt;br /&gt;
            who(head) = &#039;r&#039;&lt;br /&gt;
            head = (head + 1) % N&lt;br /&gt;
        □&lt;br /&gt;
        (head + 1) % N != tail, write_count + read_count != 0, (i:1..M) writer(i)?request -&amp;gt;&lt;br /&gt;
            queue(head) = i&lt;br /&gt;
            who(head) = &#039;w&#039;&lt;br /&gt;
            head = (head + 1) % N&lt;br /&gt;
        □&lt;br /&gt;
        read_count == 1, (i:1..N) reader(i)?done -&amp;gt;&lt;br /&gt;
            read_count--&lt;br /&gt;
            *[&lt;br /&gt;
                head != tail, write_count == 0, who[tail] == &#039;r&#039; -&amp;gt;&lt;br /&gt;
                    reader(queue(tail))!pass&lt;br /&gt;
                    tail = (tail + 1) % N&lt;br /&gt;
                    read_count++&lt;br /&gt;
                □&lt;br /&gt;
                head != tail, write_count == 0, read_count == 0, who[tail] == &#039;w&#039; -&amp;gt;&lt;br /&gt;
                    writer(queue(tail))!pass&lt;br /&gt;
                    tail = (tail + 1) % N&lt;br /&gt;
                    write_count++&lt;br /&gt;
            ]&lt;br /&gt;
        □&lt;br /&gt;
        read_count != 1, (i:1..N) reader(i)?done -&amp;gt;&lt;br /&gt;
            read_count--&lt;br /&gt;
        □&lt;br /&gt;
        (i:1..M) writer(i)?done -&amp;gt;&lt;br /&gt;
            write_count--&lt;br /&gt;
            *[&lt;br /&gt;
                head != tail, write_count == 0, who[tail] == &#039;r&#039; -&amp;gt;&lt;br /&gt;
                    reader(queue(tail))!pass&lt;br /&gt;
                    tail = (tail + 1) % N&lt;br /&gt;
                    read_count++&lt;br /&gt;
                □&lt;br /&gt;
                head != tail, write_count == 0, read_count == 0, who[tail] == &#039;w&#039; -&amp;gt;&lt;br /&gt;
                    writer(queue(tail))!pass&lt;br /&gt;
                    tail = (tail + 1) % N&lt;br /&gt;
                    write_count++&lt;br /&gt;
            ]&lt;br /&gt;
    ]&lt;br /&gt;
]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== {{категорија|4. задатак|C-Linda}} ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Трајект за превоз возила превози возила са обале на обалу. Трајект поседује M трака од којих свака има N позиција које су линеарно постављене једна иза друге. Возило заузима једну позицију. Возило приликом доласка стаје у ред за случајно изабрану траку и чека на укрцавање. Нема могућности за престројавањем. Возила улазе у своју траку једно по једно по редоследу у којем чекају у траци, док на трајекту има места. Када је пун, трајект започиње превоз возила на другу обалу. На другој обали возила се искрцавају из своје траке у редоследу супротном од редоследа у којем су се укрцала у своју траку. Када се сва возила искрцају, празан трајект се враћа на почетну обалу. Користећи &#039;&#039;C-Linda&#039;&#039; написати програм који решава овај проблем.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категорија:КДП]]&lt;br /&gt;
[[Категорија:Рокови]]&lt;/div&gt;</summary>
		<author><name>Andrija</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_2020&amp;diff=7945</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%A4%D0%B5%D0%B1%D1%80%D1%83%D0%B0%D1%80_2020&amp;diff=7945"/>
		<updated>2025-08-18T20:19:57Z</updated>

		<summary type="html">&lt;p&gt;Andrija: Табулација&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&#039;&#039;&#039;Фебруарски испит 2020. године&#039;&#039;&#039; одржан је 8. фебруара. Поставка се може наћи са [https://rti.etf.bg.ac.rs/rti/ir3kdp/rokovi/kdp20.zip странице предмета] (зипована).&lt;br /&gt;
&lt;br /&gt;
== {{категорија|1. задатак|Семафори}} ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Користећи расподељене бинарне семафоре решити проблем произвођача и потрошача (&#039;&#039;Producer – Consumer Problem&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
Решење са бафером за M произвођача и N потрошача&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;semaphore&amp;gt;&lt;br /&gt;
&lt;br /&gt;
class ProducerConsumer {&lt;br /&gt;
&lt;br /&gt;
private:&lt;br /&gt;
	&lt;br /&gt;
	const int CAPACITY=...;&lt;br /&gt;
	int writeCursor=0;&lt;br /&gt;
	int readCursor = 0;&lt;br /&gt;
	&lt;br /&gt;
	int data[CAPACITY]; //Примера ради је узето да произвођач прави податке типа int&lt;br /&gt;
	&lt;br /&gt;
	std::binary_semaphore space_available(CAPACITY);&lt;br /&gt;
	std::binary_semaphore item_available(0);&lt;br /&gt;
	std::binary_semaphore mutexProducer(1);&lt;br /&gt;
	std::binary_semaphore mutexConsumer(1);&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
public:&lt;br /&gt;
&lt;br /&gt;
	void producer() {&lt;br /&gt;
	&lt;br /&gt;
		spaceAvailable.acquire(); //у std::binary_semaphore ово је еквивалент операцији wait&lt;br /&gt;
		mutexProducer.acquire();&lt;br /&gt;
		&lt;br /&gt;
		data[writeCursor] = this.produce(); //Нека метода која би враћала неки број&lt;br /&gt;
		&lt;br /&gt;
		writeCursor = (writeCursor + 1) % CAPACITY;&lt;br /&gt;
		&lt;br /&gt;
		mutexProducer.release();&lt;br /&gt;
		item_available.release(); //у std::binary_semaphore ово је еквивалент операцији signal&lt;br /&gt;
		&lt;br /&gt;
		&lt;br /&gt;
	&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	int consumer() {&lt;br /&gt;
		item_available.acquire();&lt;br /&gt;
		mutexConsumer.acquire()&lt;br /&gt;
		&lt;br /&gt;
		int i = data[readCursor];&lt;br /&gt;
		&lt;br /&gt;
		readCursor = (readCursor + 1) % CAPACITY;&lt;br /&gt;
		&lt;br /&gt;
		item_available.release();&lt;br /&gt;
		mutexConsumer.release()&lt;br /&gt;
		&lt;br /&gt;
		return i;&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;
== {{категорија|2. задатак|Региони}} ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Постоји група од N филозофа који проводи свој живот тако што наизменично филозофирају, чекају на пиће, и пију (&#039;&#039;The Drinking Philosophers Problem&#039;&#039;). Филозофи су тако распоређени да је по једна флаша са пићем постављенa између суседних филозофа. У неком тренутку филозоф може да постане жедан. Жедном филозофу је потребно неколико суседних флаша да би направио коктел и почео да га пије. Избор пића зависи од тренутног расположења и може се разликовати од прилике до прилике. Када прикупи сва потребна пића филозоф започиње са њиховим испијањем које траје извесно време. Када се напије, филозоф враћа флаше да и други уживају, а он прелази на филозофирање. Написати програм који симулира понашање филозофа користећи условне критичне регионе.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;queue&amp;gt;&lt;br /&gt;
#include &amp;lt;vector&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
const int N = 100;&lt;br /&gt;
&lt;br /&gt;
struct Table {&lt;br /&gt;
    int drinks[N] = {-1};&lt;br /&gt;
    queue&amp;lt;int&amp;gt; drinkQueues[N];&lt;br /&gt;
};&lt;br /&gt;
Table table;&lt;br /&gt;
&lt;br /&gt;
void philosophizing();&lt;br /&gt;
void drinking();&lt;br /&gt;
vector&amp;lt;int&amp;gt; getDrinkRound();&lt;br /&gt;
&lt;br /&gt;
void philosopher(int id) {&lt;br /&gt;
    while (true) {&lt;br /&gt;
        vector&amp;lt;int&amp;gt; drinks = getDrinkRound();&lt;br /&gt;
        region (table) {&lt;br /&gt;
            for (int drink : drinks) {&lt;br /&gt;
                if (table.drinks[drink] == -1) {&lt;br /&gt;
                    table.drinks[drink] = id;&lt;br /&gt;
                } else {&lt;br /&gt;
                    table.drinkQueues[drink].push(id);&lt;br /&gt;
                    await (table.drinks[drink] == id);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        drinking();&lt;br /&gt;
        region (table) {&lt;br /&gt;
            for (int drink : drinks) {&lt;br /&gt;
                if (table.drinkQueues[drink].empty()) {&lt;br /&gt;
                    table.drinks[drink] = -1;&lt;br /&gt;
                } else {&lt;br /&gt;
                    table.drinks[drink] = table.drinkQueues[drink].front();&lt;br /&gt;
                    table.drinkQueues[drink].pop();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        philosophizing();&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;
Филтерски процеси имају један улаз и један излаз. Процеси имају само три локације. Направите проточну обраду (pipeline) од n ових филтерских процеса који проналазе медијану: до n улазних позитивних вредности (непарно) које се убацују на почетак проточне обраде, а завршавају се са EOS. На излаз проточне обраде се шаље медијана па EOS.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
Пошто је у задатку речено да је дозвољено користити само три локације у процесу, једна ће бити одвојена за број који пристиже а друге две за локалне минимуме и максимуме. Памтиће се минимуми и максимуми јер је медијана непарног броја елемената управо она вредност која је тачно на средини листе у сортираном поретку. За разлику од других решења оваквог типа задатка на викију, ништа се не шаље на излаз осим EOS кад се исти прими јер је сва обрада за медијану већ разрешена унутар петље. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void process() {&lt;br /&gt;
&lt;br /&gt;
    chan&amp;lt;int&amp;gt; in;&lt;br /&gt;
    chan&amp;lt;int&amp;gt; out;&lt;br /&gt;
    int input;&lt;br /&gt;
    int mem[2];&lt;br /&gt;
    while ((input = in.receive()) != EOS) {       &lt;br /&gt;
        if (mem[0] &amp;lt;= input &amp;amp;&amp;amp; input &amp;lt;= mem[1]) {&lt;br /&gt;
            out.send(input);&lt;br /&gt;
        } else if (input &amp;lt; mem[0]) {&lt;br /&gt;
            out.send(mem[0]);&lt;br /&gt;
            mem[0] = input;&lt;br /&gt;
        } else if (input &amp;gt; mem[1]) {&lt;br /&gt;
            out.send(mem[1]);&lt;br /&gt;
            mem[1] = input;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    out.send(EOS);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== {{категорија|4. задатак|C-Linda}} ==&lt;br /&gt;
{{делимично решено}}&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Посматра се берберница у којој за три различите столице раде три берберина (&#039;&#039;The Hilzer&#039;s Barbershop problem&#039;&#039;). Поред ове три столице у берберници се налази и чекаоница која прима 10 муштерија које могу да седе и 10 које могу да стоје, укупно 20. Када муштерија дође до бербернице уколико на шишање чека више од 20 муштерија онда одлази, а уколико берберница није пуна онда остаје. Уколико барем један берберин спава муштерија која дође на ред за шишање буди оног берберина који је најдуже спавао и седа у његову столицу. На место те муштерије која је устала седа муштерија која је најдуже стајала. Уколико су сви бербери заузети онда муштерија чека, и то ако има места за седење седа, а ако не онда стоји. Муштерије се опслужују у редоследу по коме су приспеле, и седају у истом том редоследу. Када берберин заврши са шишањем муштерија му плаћа и излази из бербернице. Берберин све време или спава или шиша или наплаћује. Користећи C-Linda написати процесе берберина и муштерија.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&lt;br /&gt;
[[Категорија:КДП]]&lt;br /&gt;
[[Категорија:Рокови]]&lt;/div&gt;</summary>
		<author><name>Andrija</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9A%D0%94%D0%9F/%D0%A1%D0%B5%D0%BF%D1%82%D0%B5%D0%BC%D0%B1%D0%B0%D1%80_2023&amp;diff=7944</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%A1%D0%B5%D0%BF%D1%82%D0%B5%D0%BC%D0%B1%D0%B0%D1%80_2023&amp;diff=7944"/>
		<updated>2025-08-18T20:17:24Z</updated>

		<summary type="html">&lt;p&gt;Andrija: Недостајућа заграда&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&amp;lt;!-- Ово ставити уколико НИЈЕДАН задатак није решен, док уколико само неки задаци нису решени на првом месту у њиховој секцији поставити {{делимично решено}}. Уколико се користи било који од ова два шаблона, ОБАВЕЗНО проверити да ли постоји излиставање тих рокова коришћењем {{рокови}} шаблона на страници предмета у одељку за потребну помоћ (како би се знало да нерешени рокови постоје). --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== {{категорија|1. задатак|Синхронизациони_алгоритми}} ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Написати и објаснити CLH алгоритам за критичну секцију (coarse grain). Реализовати (fine grain) верзију алгоритма уколико би на датом процесору постојала операција SWAP која би недељиво обављала замену вердности два операнда (SWAP(var1, var2): &amp;lt;temp=var1; var1=var2; var2=temp;&amp;gt;). Објаснити зашто је то правична критична секција.  &lt;br /&gt;
=== Решење ===&lt;br /&gt;
CLH алгоритам процесе уланчава у уланчану листу по редоследу којим долазе. Самим тим та листа се понаша као ред и тиме је овај алгоритам правичан јер користи FIFO принцип.&lt;br /&gt;
&#039;&#039;Coarse-grain&#039;&#039; решење:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct Node {&lt;br /&gt;
    bool locked;&lt;br /&gt;
    Node() {&lt;br /&gt;
        locked = true;&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Node* tail = nullptr;&lt;br /&gt;
&lt;br /&gt;
void process() {&lt;br /&gt;
    while (true) {&lt;br /&gt;
        Node* new_node = new Node();&lt;br /&gt;
        Node* prev;&lt;br /&gt;
        &amp;lt; prev = tail; tail = new_node; &amp;gt;&lt;br /&gt;
        &amp;lt; await(tail == nullptr || !prev-&amp;gt;locked); &amp;gt;&lt;br /&gt;
        /* критична секција */&lt;br /&gt;
        new_node-&amp;gt;locked=false;&lt;br /&gt;
        /* некритична секција */&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&#039;&#039;Fine-grain&#039;&#039; решење: &lt;br /&gt;
Пошто су prev и new_node локални показивачи, можемо да их усмеримо на новокреирани чвор. Затим се недељиво позива функција SWAP која ће недељиво заменити вредност prev и tail показивача. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct Node {&lt;br /&gt;
    bool locked;&lt;br /&gt;
    Node() {&lt;br /&gt;
        locked = true;&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Node* tail = nullptr;&lt;br /&gt;
&lt;br /&gt;
void process() {&lt;br /&gt;
    while (true) {&lt;br /&gt;
        Node* new_node = new Node();&lt;br /&gt;
        Node* prev = new_node;&lt;br /&gt;
        SWAP(prev, tail);&lt;br /&gt;
        while(prev!= nullptr &amp;amp;&amp;amp; prev-&amp;gt;locked) skip();&lt;br /&gt;
        /* критична секција */&lt;br /&gt;
        new_node-&amp;gt;locked=false;&lt;br /&gt;
        /* некритична секција */&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== {{категорија|2. задатак|Монитори}} ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Трајект за превоз аутомобила, камиона и аутобуса превози возила са обале на обалу. Трајект поседује N позиција које су линеарлно постављене једна иза друге. Камиона заузима три, аутовус две а аутомобил једну позицију. Возила чекају на трајект у реду и на њега улазе једно по једно по редоследу у ком чекају у реду, док на трајекту има места. Када нема места да се наредно возило у реду укрца и трајект није у потпуности попуњен, преко реда се укрцавају мања возила док се трајект не попуни у потпуности. Када је комплетно пун, трајект започиње превоз возила на другу обалу. На другој обали возила се искрцавају у редоследу супротном од оног у којем су се укрцала. Када се сва возила искрцају, празан трајект се враћа на почетну обалу. Написати монитор са &#039;&#039;signal and wait&#039;&#039; дисциплином који решава дати проблем.&lt;br /&gt;
=== Решење ===&lt;br /&gt;
{{делимично решено}}&lt;br /&gt;
== {{категорија|3. задатак|Филтерски_процеси}} ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Филтерски процеси имају један улаз и један излаз и раде следеће: примају позитивне вредности на улазу и прослеђују их на излаз ако су веће од запамћеног минимума процеса. Процеси имају само две локације, за сачувани минимум и за последњу примљену вредност. Када на улаз стигне EOS, избацују минималну вредност на излаз а затим EOS. Направите проточну обраду (&#039;&#039;pipeline&#039;&#039;) од n процеса који опадајуће соритају до n улазних позитивних вредности које се убацују на почетак проточне обраде а завршавају се са EOS.&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void process() {&lt;br /&gt;
    chan&amp;lt;int&amp;gt; in;&lt;br /&gt;
    chan&amp;lt;int&amp;gt; out;&lt;br /&gt;
    int input;&lt;br /&gt;
    int min;&lt;br /&gt;
    while ((input = in.receive()) != EOS) {&lt;br /&gt;
        if (input &amp;lt; min) {&lt;br /&gt;
            out.send(min);&lt;br /&gt;
            min = input;&lt;br /&gt;
        } else out.send(input);&lt;br /&gt;
    }&lt;br /&gt;
    out.send(min);    &lt;br /&gt;
    out.send(EOS);&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;
Постоји N пчела и један гладан медвед (&#039;&#039;The bear and honeybees&#039;&#039;). Они користе заједничку кошницу. Кошница је иницијално празна и може да прими до N напрстака меда. Медвед спава док се кошница не напуни медом, када се напуни медом меда поједе сав мед након чега се враћа на спавање. Пчелице непрестано лете од света до света и сакупљају мед. Она пчела која је попунила кошницу буди медведа. Решити проблем користећи CSP.&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Наставити са копирањем одељака изнад уколико има још задатака. --&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
[Bee(i:1..N)::BEE || Bear::Bear || BeeHive::BeeHive]&lt;br /&gt;
&lt;br /&gt;
BEE:: *[&lt;br /&gt;
&lt;br /&gt;
	flyAndCollect();&lt;br /&gt;
	BeeHive!honneyCollected();&lt;br /&gt;
	BeeHive?goBackToCollecting();&lt;br /&gt;
]&lt;br /&gt;
&lt;br /&gt;
Bear:: * [&lt;br /&gt;
	&lt;br /&gt;
	sleep();&lt;br /&gt;
	BeeHive?bearEat();&lt;br /&gt;
	BeeHive!allIsEaten();&lt;br /&gt;
	BeeHive?okToSleep();&lt;br /&gt;
	&lt;br /&gt;
]&lt;br /&gt;
&lt;br /&gt;
BeeHive:: [&lt;br /&gt;
	size:integer; size:=0;&lt;br /&gt;
	N:integer; N:=...;&lt;br /&gt;
	&lt;br /&gt;
	*[&lt;br /&gt;
		size &amp;lt; N; Bees(i)?honneyCollected() -&amp;gt; [&lt;br /&gt;
			size := size + 1;&lt;br /&gt;
			&lt;br /&gt;
			size==N -&amp;gt; [BeeHive!bearEat();]&lt;br /&gt;
			[]&lt;br /&gt;
			size &amp;lt; N -&amp;gt; [Bees(i)!goBackToCollecting();]&lt;br /&gt;
			&lt;br /&gt;
		]&lt;br /&gt;
	&lt;br /&gt;
		[]&lt;br /&gt;
	&lt;br /&gt;
		size == N; BeeHive?allIsEaten() - &amp;gt; [&lt;br /&gt;
			size = 0;&lt;br /&gt;
			BeeHive!okToSleep();&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;
[[Категорија:КДП]]&lt;/div&gt;</summary>
		<author><name>Andrija</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9A%D0%94%D0%9F/%D0%88%D1%83%D0%BD_2022&amp;diff=7738</id>
		<title>КДП/Јун 2022</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9A%D0%94%D0%9F/%D0%88%D1%83%D0%BD_2022&amp;diff=7738"/>
		<updated>2024-08-28T00:44:33Z</updated>

		<summary type="html">&lt;p&gt;Andrija: исправка грешке&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&#039;&#039;&#039;Испит у јунском испитном року 2022. године&#039;&#039;&#039; одржан је 14. јуна. Поставка овог рока још увек није доступна са странице предмета.&lt;br /&gt;
&lt;br /&gt;
== {{категорија|1. задатак|Синхронизациони_алгоритми}} ==&lt;br /&gt;
{{делимично решено}}&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Објасните шта је &#039;&#039;At-Most-Once-Property&#039;&#039;. Објасните зашто, када је испуњена та особина, критична референца има особине атомске акције. Дати два примера у којима су по два процеса.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== {{категорија|2. задатак|Семафори}} ==&lt;br /&gt;
{{делимично решено}}&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Постоје три особе међу којима треба изабрати једну (&#039;&#039;The Odd Person Wins Game&#039;&#039;). Свака од тих особа поседује новчић који има две стране. Избор особе се одиграва тако што свака особа независно баца свој новчић. Уколико постоји особа којој је новчић пао на другу страну у односу на преостале особе, онда се та особа изабира. Уколико све особе имају исто постављен новчић, поступак се понавља све док се не изабере једна. Особе након сваког бацања морају да знају да ли су изабране или не или се поступак понавља. Користећи семафоре написати програм који описује понашање особе. Ниједној особи не треба давати предност на основу њиховог идентификатора.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&lt;br /&gt;
== {{категорија|3. задатак|Монитори}} ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Монитор треба да регулише распоред уласка пацијената на преглед код једног лекара. Сваки регуларно заказани пацијент је пре приступања том монитору добио један од 12 хронолошки поређаних полусатних интервала за тај дан (прављење распореда није део задатка). Пацијент када дође на преглед (не мора да буде тачан) позива мониторску процедуру &amp;lt;code&amp;gt;želim_da_se_pregledam&amp;lt;/code&amp;gt; и том приликом доставља ID и почетак полусатног интервала у коме је њему заказан преглед. Ако је лекар заузет, пацијенти на чекању ће се поређати на основу хронолошког редоследа у распореду за тај дан. Лекар позива мониторску процедуру &amp;lt;code&amp;gt;sledeći&amp;lt;/code&amp;gt;, која враћа идентификатор следећег пацијента, када жели да прегледа следећег пацијента. Ако нема пацијената у том случају, лекар се поствља у стање чекања из кога излази када наиђе први пацијент. Написати овакав монитор користећи дисциплину &#039;&#039;Signal and 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;
// pretpostavka da je ID 0-11&lt;br /&gt;
class Monitor {&lt;br /&gt;
    private Condition[] awaitPatient[12], awaitDoctor;&lt;br /&gt;
    private boolean[] patientChecked[12];  // da li je pacijent pregledan, potreban zbog signal&amp;amp;wait&lt;br /&gt;
    private PriorityQueue&amp;lt;&amp;lt;int,int&amp;gt;&amp;gt; pq;   // prioritetni red slot, ID, sortiran po slotu&lt;br /&gt;
    &lt;br /&gt;
    public synchronized void zelim_da_se_pregledam(int ID, int slot) {&lt;br /&gt;
        pq.add(slot,ID);&lt;br /&gt;
        awaitDoctor.signal();&lt;br /&gt;
        // potrebno jer signal&amp;amp;wait predaje kontrolu pa je pacijent u medjuvremenu mozda pregledan&lt;br /&gt;
        if (patientChecked[ID] == false) awaitPatient[ID].wait();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public synchronized int sledeci() {&lt;br /&gt;
        if (pq.size() == 0) awaitDoctor.wait();&lt;br /&gt;
        int id = pq.pop().first;&lt;br /&gt;
        pq.remove();&lt;br /&gt;
        patientChecked[id] = true;&lt;br /&gt;
        awaitPatient[id].signal();&lt;br /&gt;
        return id;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== {{категорија|4. задатак|Региони}} ==&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 Trajekt {&lt;br /&gt;
    int cap = N;&lt;br /&gt;
    int curr = 0, next = 0, ticketIn = 0, ticketOut = 0;&lt;br /&gt;
    bool ukrcavanje = false, iskrcavanje = false&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Trajekt t;&lt;br /&gt;
&lt;br /&gt;
void vozilo(int space) {&lt;br /&gt;
    int myTicketIn, myTicketOut;&lt;br /&gt;
    region(t) {&lt;br /&gt;
        myTicketIn = t.ticketIn++;&lt;br /&gt;
        await (t.ukrcavanje &amp;amp;&amp;amp; t.ticketIn == myTicketIn);&lt;br /&gt;
        if (t.cap - t.curr &amp;lt; space) {&lt;br /&gt;
            // ukoliko nema mesta za mene, posalji trajekt pa sacekaj da se vrati&lt;br /&gt;
            t.ukrcavanje = false;&lt;br /&gt;
            await (t.ukrcavanje);&lt;br /&gt;
        }&lt;br /&gt;
        t.curr += space;&lt;br /&gt;
        myTicketOut = ++t.ticketOut;&lt;br /&gt;
        t.next++;&lt;br /&gt;
        if (t.curr == t.cap)&lt;br /&gt;
            t.ukrcavanje = false;&lt;br /&gt;
    }&lt;br /&gt;
    // prevozimo se&lt;br /&gt;
    region(t) {&lt;br /&gt;
        await (t.iskrcavanje &amp;amp;&amp;amp; myTicketOut == t.ticketOut);&lt;br /&gt;
        if (--t.ticketOut == 0)&lt;br /&gt;
            // ukoliko sam poslednji, posalji trajekt nazad&lt;br /&gt;
            t.iskrcavanje = false&lt;br /&gt;
    }     &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void trajekt() {&lt;br /&gt;
    while (1) {&lt;br /&gt;
        region(t) {&lt;br /&gt;
            t.ukrcavanje = true&lt;br /&gt;
            await (!t.ukrcavanje);&lt;br /&gt;
        }&lt;br /&gt;
        preveziVozila();&lt;br /&gt;
        region(t) {&lt;br /&gt;
            t.iskrcavanje = true;&lt;br /&gt;
            await (!t.iskrcavanje);&lt;br /&gt;
        }&lt;br /&gt;
        vratiSeNazad();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== {{категорија|5. задатак|Размена_порука}} ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Користећи синхрону размену порука написати дистрибуирано решење за проблем филозофа који ручавају (&#039;&#039;The Dining Philosophers Problem&#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;
void philosopher(int ID, chan&amp;lt;string&amp;gt; release, chan&amp;lt;char&amp;gt; forkL, chan&amp;lt;char&amp;gt; forkR) {&lt;br /&gt;
    while (true) {&lt;br /&gt;
        // Филозофирамо&lt;br /&gt;
        if (ID % 2 == 0) {&lt;br /&gt;
            forkL.send(&#039;R&#039;);&lt;br /&gt;
            forkR.send(&#039;L&#039;);&lt;br /&gt;
        } else {&lt;br /&gt;
            forkR.send(&#039;L&#039;);&lt;br /&gt;
            forkL.send(&#039;R&#039;);&lt;br /&gt;
        }&lt;br /&gt;
        // Једемо&lt;br /&gt;
        release.receive();&lt;br /&gt;
        release.receive();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void fork(chan&amp;lt;char&amp;gt; acquire, chan&amp;lt;string&amp;gt; philL, chan&amp;lt;string&amp;gt; philR) {&lt;br /&gt;
    while (true) {&lt;br /&gt;
        char dir = acquire.receive();&lt;br /&gt;
        if (dir == &#039;L&#039;) {&lt;br /&gt;
            philL.send(&amp;quot;release&amp;quot;);&lt;br /&gt;
        } else {&lt;br /&gt;
            philR.send(&amp;quot;release&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== {{категорија|6. задатак|C-Linda}} ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Постоји P произвођача и C потрошача који деле заједнички бафер капацитета B (&#039;&#039;Atomic broadcast problem&#039;&#039;). Произвођачи генеришу производ по производ на које чекају свих C потрошача. Сваки потрошач мора да прими производе у тачно оном редоследу у коме су произведени, мада различити потрошачи могу у исто време да узимају различите производе. Решити проблем користећи &#039;&#039;C-Linda&#039;&#039;, тако да се ни у ком тренутку у заједничком простору не нађе више од B производа.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
Тагови коришћени у овој имплементацији су:&lt;br /&gt;
* &amp;lt;code&amp;gt;buffer empty&amp;lt;/code&amp;gt;: постоји места да произвођач убацује у бафер&lt;br /&gt;
* &amp;lt;code&amp;gt;buffer full&amp;lt;/code&amp;gt;: постоје производи у баферу које потрошачи могу да читају&lt;br /&gt;
* &amp;lt;code&amp;gt;product&amp;lt;/code&amp;gt;: производ са одређеним индексом у низу&lt;br /&gt;
* &amp;lt;code&amp;gt;size&amp;lt;/code&amp;gt;: величина бафера&lt;br /&gt;
* &amp;lt;code&amp;gt;producer index&amp;lt;/code&amp;gt;: индекс у баферу до ког су произвођачи стигли са попуњавањем&lt;br /&gt;
* &amp;lt;code&amp;gt;consumer count&amp;lt;/code&amp;gt;: број потрошача који је преостао да прочита производ на одређеном индексу&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
const int P = 100;&lt;br /&gt;
const int C = 100;&lt;br /&gt;
const int B = 100;&lt;br /&gt;
&lt;br /&gt;
struct Product {};&lt;br /&gt;
Product produce();&lt;br /&gt;
void consume(Product p);&lt;br /&gt;
&lt;br /&gt;
int producer() {&lt;br /&gt;
    while (true) {&lt;br /&gt;
        Product p = produce();&lt;br /&gt;
        in(&amp;quot;buffer empty&amp;quot;);&lt;br /&gt;
        int index;&lt;br /&gt;
        in(&amp;quot;producer index&amp;quot;, &amp;amp;index);&lt;br /&gt;
        out(&amp;quot;product&amp;quot;, index, p);&lt;br /&gt;
        out(&amp;quot;consumer count&amp;quot;, index, C);&lt;br /&gt;
        out(&amp;quot;producer index&amp;quot;, (index + 1) % B);&lt;br /&gt;
        int size;&lt;br /&gt;
        in(&amp;quot;size&amp;quot;, &amp;amp;size);&lt;br /&gt;
        if (size == 0) {&lt;br /&gt;
            out(&amp;quot;buffer full&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
        out(&amp;quot;size&amp;quot;, ++size);&lt;br /&gt;
        if (size &amp;lt; B) {&lt;br /&gt;
            out(&amp;quot;buffer empty&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void consumer() {&lt;br /&gt;
    int index = 0;&lt;br /&gt;
    while (true) {&lt;br /&gt;
        in(&amp;quot;buffer full&amp;quot;);&lt;br /&gt;
        Product p;&lt;br /&gt;
        int count;&lt;br /&gt;
        in(&amp;quot;consumer count&amp;quot;, index, &amp;amp;count);&lt;br /&gt;
        if (count == 1) {&lt;br /&gt;
            in(&amp;quot;product&amp;quot;, index, &amp;amp;p);&lt;br /&gt;
            int size;&lt;br /&gt;
            in(&amp;quot;size&amp;quot;, &amp;amp;size);&lt;br /&gt;
            if (size == B) {&lt;br /&gt;
                out(&amp;quot;buffer empty&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
            out(&amp;quot;size&amp;quot;, --size);&lt;br /&gt;
            if (size &amp;gt; 0) {&lt;br /&gt;
                out(&amp;quot;buffer full&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
        } else {&lt;br /&gt;
            rd(&amp;quot;product&amp;quot;, index, &amp;amp;p);&lt;br /&gt;
            out(&amp;quot;consumer count&amp;quot;, index, count-1);&lt;br /&gt;
            out(&amp;quot;buffer full&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
        index = (index + 1) % B;&lt;br /&gt;
        consume(p);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void initialize() {&lt;br /&gt;
    out(&amp;quot;buffer empty&amp;quot;);&lt;br /&gt;
    out(&amp;quot;size&amp;quot;, 0);&lt;br /&gt;
    out(&amp;quot;producer index&amp;quot;, 0);&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>Andrija</name></author>
	</entry>
</feed>