<?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=Sirenfia</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=Sirenfia"/>
	<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/Sirenfia"/>
	<updated>2026-06-04T01:08:07Z</updated>
	<subtitle>Кориснички доприноси</subtitle>
	<generator>MediaWiki 1.39.8</generator>
	<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=8261</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=8261"/>
		<updated>2026-02-17T12:18:10Z</updated>

		<summary type="html">&lt;p&gt;Sirenfia: /* Решење */&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;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// 1 произвођач и 1 потрошач&lt;br /&gt;
typeT buff[n];&lt;br /&gt;
int front = 0, rear = 0;&lt;br /&gt;
sem empty = n, full = 0;&lt;br /&gt;
// empty се користи као број празних места, а full као број попуњених места у баферу&lt;br /&gt;
&lt;br /&gt;
process Producer{&lt;br /&gt;
  while(true){&lt;br /&gt;
  ... //произведи податак&lt;br /&gt;
  wait(empty); //чекај да бафер има празних места&lt;br /&gt;
  buf[rear] = data; rear = (rear + 1)%n;&lt;br /&gt;
  signal(full); //попуни једно место у баферу&lt;br /&gt;
  ...&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
process Consumer{&lt;br /&gt;
  while(true){&lt;br /&gt;
  ... //потроши податак&lt;br /&gt;
  wait(full); //чекај да бафер није празан&lt;br /&gt;
  res = buf[front]; front = (front + 1)%n;&lt;br /&gt;
  signal(empty); //ослободи једно место у баферу&lt;br /&gt;
  ...&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//За M произвођача и N потрошача потребан нам је још један пар семафора - да се осигура да ће само један произвођач убацивати (deposit) у бафер, ерго да ће само један потрошач узимати (fetch) из бафера у било ком тренутку&lt;br /&gt;
typeT buff[n]; const M = ..., N = ...;&lt;br /&gt;
int front = 0, rear = 0;&lt;br /&gt;
sem empty = n, full = 0;&lt;br /&gt;
sem mutexD = 1, mutexF = 1; // за међусобно искључивање током deposit и fetch&lt;br /&gt;
&lt;br /&gt;
process Producer[i = 1 to M]{&lt;br /&gt;
  while(true){&lt;br /&gt;
  ... //произведи податак&lt;br /&gt;
  wait(mutexD); wait(empty); //чекај да сам једини који убацује у бафер и да бафер има празних места&lt;br /&gt;
  buf[rear] = data; rear = (rear + 1)%n;&lt;br /&gt;
  signal(mutexD); signal(full); //допусти да неки други поризвођач убацује у бафер и попуни једно место у баферу&lt;br /&gt;
  ...&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
process Consumer[i = 1 to N]{&lt;br /&gt;
  while(true){&lt;br /&gt;
  ... //потроши податак&lt;br /&gt;
  wait(mutexF); wait(full);&lt;br /&gt;
  res = buf[front]; front = (front + 1)%n;&lt;br /&gt;
  signal(mutexF); signal(empty);&lt;br /&gt;
  ...&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//За случај M произвођача и 1 потрошач није потребан семафор mutexF јер не постоји више потрошача који желе да узимају из бафера. Аналогно је за 1 произвођач и N потрошача.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;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;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
const K = ...;&lt;br /&gt;
&lt;br /&gt;
monitor Bridge {&lt;br /&gt;
  int waitingS = 0, waitingN = 0;&lt;br /&gt;
  int cnt = 0; // тренутан број аутића на мосту&lt;br /&gt;
  int dir = 0; // 0 - нико не чека и нико није на мосту, 1 - тренутно прелазе кола са севера, 2 - са југа&lt;br /&gt;
  cond go;&lt;br /&gt;
  &lt;br /&gt;
  void EnterNorth() {&lt;br /&gt;
    waitingN++;&lt;br /&gt;
    // Чекај ако прелазе кола са југа или ако је на мосту већ К аутића&lt;br /&gt;
    while(dir == 2 || cnt == K) wait(go);&lt;br /&gt;
    waitingN--; dir = 1; cnt++;&lt;br /&gt;
  }&lt;br /&gt;
    &lt;br /&gt;
  void ExitNorth() {&lt;br /&gt;
    cnt--;&lt;br /&gt;
    if(cnt == 0) { // мост је слободан&lt;br /&gt;
      if(waitingS &amp;gt; 0) dir = 2; // прво проверава супротан смер и препушта мост њима ако неко чека&lt;br /&gt;
      else if(waitingN &amp;gt; 0) dir = 1;&lt;br /&gt;
      else dir = 0;&lt;br /&gt;
      &lt;br /&gt;
      signal(go);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== {{категорија|3. задатак|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>Sirenfia</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_2021&amp;diff=8260</id>
		<title>КДП/Јануар 2021</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_2021&amp;diff=8260"/>
		<updated>2026-02-17T11:00:09Z</updated>

		<summary type="html">&lt;p&gt;Sirenfia: /* Решење */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
Поставка овог рока може се наћи са [https://rti.etf.bg.ac.rs/rti/ir3kdp/rokovi/2021/IR3KDP_2021_jan.pdf странице предмета.]&lt;br /&gt;
&lt;br /&gt;
== {{категорија|1. задатак|Штафетна_палица}} ==&lt;br /&gt;
{{делимично решено}}&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Потребно је реализовати тајмер користећи приватне семафоре и технику предаје штафетне палице. Тајмер има две методе, прва је метода &amp;lt;code&amp;gt;wakeme&amp;lt;/code&amp;gt; која омогућава да се дата нит блокирана &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; јединица времена (ово је аргумент), а друга је метода &amp;lt;code&amp;gt;tick&amp;lt;/code&amp;gt; која означава да је истекла једна јединица времена.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
const N = ...; // максималан бpој нити&lt;br /&gt;
&lt;br /&gt;
class Timer {&lt;br /&gt;
  sem mutex = 1;&lt;br /&gt;
  sem privSem[N];&lt;br /&gt;
  int timeLeft[N];&lt;br /&gt;
  bool sleeping[N];&lt;br /&gt;
  &lt;br /&gt;
  void wakeme(int id, int n) {&lt;br /&gt;
    wait(mutex);&lt;br /&gt;
    timeLeft[id] = n; sleeping[id] = true;&lt;br /&gt;
    signal(mutex);&lt;br /&gt;
    wait(privSem[id]); // блокира се на свом семафору&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  void tick(){&lt;br /&gt;
    wait(mutex);&lt;br /&gt;
    for(int i = 0 to N - 1){&lt;br /&gt;
      if(sleeping[i]) {&lt;br /&gt;
        timeLeft[i]--;&lt;br /&gt;
        if(timeLeft[i] == 0) {&lt;br /&gt;
          sleeping[i] = false;&lt;br /&gt;
          signal(privSem[i]);&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    signal(mutex);&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 (N &amp;gt; 1) који могу да користе жене, мушкарци, деца и домар (&#039;&#039;Single Bathroom Problem&#039;&#039;) такав да важе следећа правила коришћења: у исто време у тоалету не могу наћи и жене и мушкарци; деца могу да деле тоалет и са женама и са мушкарцима; дете може да се нађе у тоалету само ако се тамо налази барем једна жена или мушкарац; домар има ексклузивно право коришћења тоалета. Написати монитор са &#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;
class SingleBathroomProblem {&lt;br /&gt;
    public static final int capacity = 10;&lt;br /&gt;
    private int count = 0;&lt;br /&gt;
    private int childCount = 0;&lt;br /&gt;
    // Група која је тренутно у тоалету&lt;br /&gt;
    // -1 - нема никога, 0 - мушкарци, 1 - жене, 2 - домар&lt;br /&gt;
    private int group = -1;&lt;br /&gt;
    private final Condition queue = new Condition();&lt;br /&gt;
    private final Condition childrenQueue = new Condition();&lt;br /&gt;
    private final Condition waitingForChildren = new Condition();&lt;br /&gt;
    private int ticket = 1;&lt;br /&gt;
    private void signalPersonOrChild() {&lt;br /&gt;
        boolean personWaiting = queue.queue() &amp;amp;&amp;amp; queue.minrank() % 3 == group;&lt;br /&gt;
        boolean childWaiting = childrenQueue.queue();&lt;br /&gt;
        if (personWaiting &amp;amp;&amp;amp; childWaiting) {&lt;br /&gt;
            if (queue.minrank() &amp;gt; childrenQueue.minrank() * 3) {&lt;br /&gt;
                // Одрасла особа је стигла пре детета&lt;br /&gt;
                queue.signal();&lt;br /&gt;
            } else {&lt;br /&gt;
                // Дете је стигло пре одрасле особе&lt;br /&gt;
                childrenQueue.signal();&lt;br /&gt;
            }&lt;br /&gt;
        } else if (personWaiting) {&lt;br /&gt;
            queue.signal();&lt;br /&gt;
        } else if (childWaiting) {&lt;br /&gt;
            childrenQueue.signal();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    public synchronized void enterMan() {&lt;br /&gt;
        int myTicket = ticket++;&lt;br /&gt;
        if (count == capacity || group == 1 || group == 2 || queue.queue()) {&lt;br /&gt;
            // Пун тоалет, у њему су жене/домар или има других особа испред тоалета&lt;br /&gt;
            queue.wait(myTicket * 3);&lt;br /&gt;
        }&lt;br /&gt;
        ++count;&lt;br /&gt;
        if (group == -1) {&lt;br /&gt;
            // Означавамо да је тренутно активна група мушкараца&lt;br /&gt;
            group = 0;&lt;br /&gt;
        } else if (waitingForChildren.queue()) {&lt;br /&gt;
            // Ако има мушкарца који чека децу јавља му се да не мора више да чека&lt;br /&gt;
            waitingForChildren.signal();&lt;br /&gt;
        }&lt;br /&gt;
        if (count != capacity) {&lt;br /&gt;
            signalPersonOrChild();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    public synchronized void enterWoman() {&lt;br /&gt;
        int myTicket = ticket++;&lt;br /&gt;
        if (count == capacity || group == 0 || group == 2 || queue.queue()) {&lt;br /&gt;
            // Пун тоалет или су у њему мушкарци/домар&lt;br /&gt;
            queue.wait(myTicket * 3 + 1);&lt;br /&gt;
        }&lt;br /&gt;
        ++count;&lt;br /&gt;
        if (group == -1) {&lt;br /&gt;
            // Означавамо да је тренутно активна група жена&lt;br /&gt;
            group = 1;&lt;br /&gt;
        } else if (waitingForChildren.queue()) {&lt;br /&gt;
            // Ако има жена која чека децу јавља јој се да не мора више да чека&lt;br /&gt;
            waitingForChildren.signal();&lt;br /&gt;
        }&lt;br /&gt;
        if (count != capacity) {&lt;br /&gt;
            signalPersonOrChild();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    public synchronized void enterJanitor() {&lt;br /&gt;
        int myTicket = ticket++;&lt;br /&gt;
        if (group != -1) {&lt;br /&gt;
            // У тоалету или испред тоалета има било кога&lt;br /&gt;
            queue.wait(myTicket * 3 + 2);&lt;br /&gt;
        }&lt;br /&gt;
        ++count;&lt;br /&gt;
        // Означавамо да је домар тренутно у тоалету&lt;br /&gt;
        group = 2;&lt;br /&gt;
    }&lt;br /&gt;
    public synchronized void enterChild() {&lt;br /&gt;
        int myTicket = ticket++;&lt;br /&gt;
        if (count == capacity || group == 2 || group == -1 || queue.queue() || childrenQueue.queue() || waitingForChildren.queue()) {&lt;br /&gt;
            // Пун тоалет, у њему нема никога, у њему је домар, има других особа&lt;br /&gt;
            // испред тоалета или има особа која је унутра и чека да деца изађу&lt;br /&gt;
            childrenQueue.wait(myTicket);&lt;br /&gt;
        }&lt;br /&gt;
        ++count;&lt;br /&gt;
        ++childCount;&lt;br /&gt;
        if (count != capacity) {&lt;br /&gt;
            signalPersonOrChild();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    public synchronized void exitMan() {&lt;br /&gt;
        if (count == childCount + 1) {&lt;br /&gt;
            // Мушкарац не може да изађе док су деца сама у тоалету&lt;br /&gt;
            waitingForChildren.wait();&lt;br /&gt;
        }&lt;br /&gt;
        --count;&lt;br /&gt;
        if (count == 0) {&lt;br /&gt;
            // Нема више никог у тоалету, пусти следећу одраслу особу ако је има&lt;br /&gt;
            group = -1;&lt;br /&gt;
            if (queue.queue()) {&lt;br /&gt;
                queue.signal();&lt;br /&gt;
            }&lt;br /&gt;
        } else {&lt;br /&gt;
            signalPersonOrChild();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    public synchronized void exitWoman() {&lt;br /&gt;
        if (count == childCount + 1) {&lt;br /&gt;
            // Жена не може да изађе док су деца сама у тоалету&lt;br /&gt;
            waitingForChildren.wait();&lt;br /&gt;
        }&lt;br /&gt;
        --count;&lt;br /&gt;
        if (count == 0) {&lt;br /&gt;
            // Нема више никог у тоалету, пусти следећу одраслу особу ако је има&lt;br /&gt;
            group = -1;&lt;br /&gt;
            if (queue.queue()) {&lt;br /&gt;
                queue.signal();&lt;br /&gt;
            }&lt;br /&gt;
        } else  {&lt;br /&gt;
            signalPersonOrChild();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    public synchronized void exitJanitor() {&lt;br /&gt;
        --count;&lt;br /&gt;
        // Сигурно нема више никог у тоалету&lt;br /&gt;
        group = -1;&lt;br /&gt;
        if (queue.queue()) {&lt;br /&gt;
            queue.signal();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    public synchronized void exitChild() {&lt;br /&gt;
        --count;&lt;br /&gt;
        --childCount;&lt;br /&gt;
        if (waitingForChildren.queue() &amp;amp;&amp;amp; childCount == 0) {&lt;br /&gt;
            // Јави особи која чека на излазак детета да су сва деца изашла&lt;br /&gt;
            waitingForChildren.signal();&lt;br /&gt;
        }&lt;br /&gt;
        if (count == 0) {&lt;br /&gt;
            // Нема више никог у тоалету, пусти следећу одраслу особу ако је има&lt;br /&gt;
            group = -1;&lt;br /&gt;
            if (queue.queue()) {&lt;br /&gt;
                queue.signal();&lt;br /&gt;
            }&lt;br /&gt;
        } else {&lt;br /&gt;
            signalPersonOrChild();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== {{категорија|3. задатак|CSP}} ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Реализујте &#039;&#039;coarse grain ticket&#039;&#039; алгоритам за улазак у критичну секцију користећи CSP.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
Није јасно на шта се мисли под &#039;&#039;coarse grain&#039;&#039; реализацијом у овом случају, али је испод једна могућа имплементација &#039;&#039;ticket&#039;&#039; алгоритма за улазак у критичну секцију користећи CSP.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
[ticket::TICKET || user(i: 1..N)::USER]&lt;br /&gt;
&lt;br /&gt;
TICKET::&lt;br /&gt;
    users: (1..N) integer;&lt;br /&gt;
    head: integer;&lt;br /&gt;
    tail: integer;&lt;br /&gt;
    head := 0;&lt;br /&gt;
    tail := 0;&lt;br /&gt;
    *[&lt;br /&gt;
        head == tail; (i: 1..N) user(i)?enter -&amp;gt;&lt;br /&gt;
            // Нема никога, па пуштамо овог корисника&lt;br /&gt;
            user(i)!pass;&lt;br /&gt;
            tail := (tail + 1) mod N&lt;br /&gt;
        □&lt;br /&gt;
        head &amp;lt;&amp;gt; tail; (i: 1..N) user(i)?enter -&amp;gt;&lt;br /&gt;
            // Додајемо корисника у ред чекања&lt;br /&gt;
            users(tail) := i;&lt;br /&gt;
            tail := (tail + 1) mod N&lt;br /&gt;
        □&lt;br /&gt;
        (i: 1..N) user(i)?exit -&amp;gt;&lt;br /&gt;
            head := (head + 1) mod N;&lt;br /&gt;
            [&lt;br /&gt;
                // Пуштамо следећег корисника, уколико га има&lt;br /&gt;
                users(head) &amp;lt;&amp;gt; 0 -&amp;gt;&lt;br /&gt;
                    user(users(head))!pass;&lt;br /&gt;
                    users(head) := 0&lt;br /&gt;
            ]&lt;br /&gt;
        □&lt;br /&gt;
    ]&lt;br /&gt;
&lt;br /&gt;
USER::&lt;br /&gt;
    ticket!enter;&lt;br /&gt;
    ticket?pass;&lt;br /&gt;
    // У критичној секцији&lt;br /&gt;
    ticket!exit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== {{категорија|4. задатак|C-Linda}} ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
На уласку у једну железничку станицу са једном улазном пругом и једним слепим колосеком десио се квар, па се на улазу направила колона међународних и домаћих возова. Квар је отклоњен и треба пуштати возове. Да би међународни возови мање каснили, они се пуштају први, по редоследу доласка. Пошто постоји само једна пруга и возови се не могу „претицати”, сви домаћи возови који су били испред међународних у колони се пребацују на слепи колосек који је довољно велики да сви возови могу да стану. Када сви међународни возови оду, пуштају се прво возови са слепог колосека, па онда преостали домаћи возови из колоне. Сама станица има N перона, тј. N возова истовремено могу да укрцавају и искрцавају путнике. Возови који у међувремену пристижу треба да буду опслужени, али новопристигли међународни немају приоритет у односу на возове који су испред њих у колони. Решити проблем користећи C-Linda. Написати потребну иницијализацију која осликава стање након отклањања квара. Водити рачуна о томе да су композиције возова тешке и да је потребно време да се воз помери са једног места на друго.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
Следећи тагови су коришћени током реализације:&lt;br /&gt;
* &amp;lt;code&amp;gt;ticket&amp;lt;/code&amp;gt;: редослед воза по пристизању&lt;br /&gt;
* &amp;lt;code&amp;gt;current&amp;lt;/code&amp;gt;: воз који тренутно окупира улаз (било да излази из улаза и иде у слепи колосек, излази из улаза и иде на станицу или излази из слепог колосека и иде на станицу)&lt;br /&gt;
* &amp;lt;code&amp;gt;sidetrack&amp;lt;/code&amp;gt;: возови који се налазе у слепом колосеку, прва вредност је редослед у слепом колосеку а друга редослед пристизања воза&lt;br /&gt;
* &amp;lt;code&amp;gt;sidetrackHead&amp;lt;/code&amp;gt;: први воз који следећи треба да изађе из слепог колосека, по редоследу у слепом колосеку&lt;br /&gt;
* &amp;lt;code&amp;gt;sidetrackTail&amp;lt;/code&amp;gt;: број возова у слепом колосеку&lt;br /&gt;
* &amp;lt;code&amp;gt;station&amp;lt;/code&amp;gt;: возови који су тренутно на једном од регуларних N колосека&lt;br /&gt;
Начин на који је у овом решењу било одређено да ли је воз пристигао током квара или после је провера да ли је његов редослед пристизања већи или једнак константи &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt;, што је број возова који су пристигли током квара. Након почетне иницијализације стања након поправљања квара очекује се да новопристигли возови сами направе &amp;lt;code&amp;gt;train&amp;lt;/code&amp;gt; процес.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
const int N = 10;&lt;br /&gt;
const int M = 100;&lt;br /&gt;
&lt;br /&gt;
void setCurrentFromSidetrack() {&lt;br /&gt;
    int sidetrackTicket;&lt;br /&gt;
    int sidetrackHead;&lt;br /&gt;
    in(&amp;quot;sidetrackHead&amp;quot;, &amp;amp;sidetrackHead);&lt;br /&gt;
    in(&amp;quot;sidetrack&amp;quot;, sidetrackHead, &amp;amp;sidetrackTicket);&lt;br /&gt;
    out(&amp;quot;sidetrackHead&amp;quot;, sidetrackHead + 1);&lt;br /&gt;
    out(&amp;quot;current&amp;quot;, sidetrackTicket);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void train(bool isInternational) {&lt;br /&gt;
    int ticket;&lt;br /&gt;
    in(&amp;quot;ticket&amp;quot;, &amp;amp;ticket);&lt;br /&gt;
    out(&amp;quot;ticket&amp;quot;, ticket + 1);&lt;br /&gt;
    in(&amp;quot;current&amp;quot;, ticket);&lt;br /&gt;
    bool arrivedLater = ticket &amp;gt;= M;&lt;br /&gt;
    bool isSidetrack = !isInternational &amp;amp;&amp;amp; !arrivedLater;&lt;br /&gt;
    if (isSidetrack) {&lt;br /&gt;
        // Прво идемо у слепи колосек&lt;br /&gt;
        int sidetrackTail;&lt;br /&gt;
        in(&amp;quot;sidetrackTail&amp;quot;, &amp;amp;sidetrackTail);&lt;br /&gt;
        out(&amp;quot;sidetrack&amp;quot;, sidetrackTail, ticket);&lt;br /&gt;
        out(&amp;quot;sidetrackTail&amp;quot;, sidetrackTail + 1);&lt;br /&gt;
        if (ticket == M - 1) {&lt;br /&gt;
            // Ми смо последњи воз који је стигао током квара,&lt;br /&gt;
            // треба да предамо првом из слепог колосека&lt;br /&gt;
            setCurrentFromSidetrack();&lt;br /&gt;
            in(&amp;quot;current&amp;quot;, ticket);&lt;br /&gt;
        } else {&lt;br /&gt;
            // Предајемо следећем возу који је стигао током квара&lt;br /&gt;
            out(&amp;quot;current&amp;quot;, ticket + 1);&lt;br /&gt;
            in(&amp;quot;current&amp;quot;, ticket);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    int station;&lt;br /&gt;
    in(&amp;quot;station&amp;quot;, &amp;amp;station);&lt;br /&gt;
    // Идемо на станицу, па чим ослободимо улаз пуштамо следећег&lt;br /&gt;
    if (isSidetrack) {&lt;br /&gt;
        if (rdp(&amp;quot;sidetrack&amp;quot;)) {&lt;br /&gt;
            // Пуштамо следећег из слепог колосека&lt;br /&gt;
            setCurrentFromSidetrack();&lt;br /&gt;
        } else {&lt;br /&gt;
            // Нема више никог из слепог колосека, пуштамо обичну колону&lt;br /&gt;
            out(&amp;quot;current&amp;quot;, M);&lt;br /&gt;
        }&lt;br /&gt;
    } else {&lt;br /&gt;
        if (ticket == M - 1) {&lt;br /&gt;
            // Ми смо последњи воз који је стигао током квара,&lt;br /&gt;
            // треба да предамо возовима из слепог колосека, уколико постоје&lt;br /&gt;
            if (rdp(&amp;quot;sidetrack&amp;quot;)) {&lt;br /&gt;
                setCurrentFromSidetrack();&lt;br /&gt;
            } else {&lt;br /&gt;
                // Нико није ушао у слепи колосек&lt;br /&gt;
                out(&amp;quot;current&amp;quot;, ticket + 1);&lt;br /&gt;
            }&lt;br /&gt;
        } else {&lt;br /&gt;
            // Пуштамо следећи воз, пошто још увек колона која је стигла&lt;br /&gt;
            // током квара није изашла из улаза&lt;br /&gt;
            out(&amp;quot;current&amp;quot;, ticket + 1);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    // Одлазимо са станице&lt;br /&gt;
    out(&amp;quot;station&amp;quot;, station);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void initialize() {&lt;br /&gt;
    out(&amp;quot;ticket&amp;quot;, 0);&lt;br /&gt;
    for (int i = 0; i &amp;lt; M; ++i) {&lt;br /&gt;
        eval(train, rand() % 2 == 1);&lt;br /&gt;
        // Чекамо да воз покупи свој ticket&lt;br /&gt;
        rd(&amp;quot;ticket&amp;quot;, i + 1);&lt;br /&gt;
    }&lt;br /&gt;
    for (int i = 0; i &amp;lt; N; ++i) {&lt;br /&gt;
        out(&amp;quot;station&amp;quot;, i);&lt;br /&gt;
    }&lt;br /&gt;
    out(&amp;quot;current&amp;quot;, 0);&lt;br /&gt;
    out(&amp;quot;sidetrackHead&amp;quot;, 0);&lt;br /&gt;
    out(&amp;quot;sidetrackTail&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>Sirenfia</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_2021&amp;diff=8259</id>
		<title>КДП/Јануар 2021</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_2021&amp;diff=8259"/>
		<updated>2026-02-17T10:59:34Z</updated>

		<summary type="html">&lt;p&gt;Sirenfia: /* Решење */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
Поставка овог рока може се наћи са [https://rti.etf.bg.ac.rs/rti/ir3kdp/rokovi/2021/IR3KDP_2021_jan.pdf странице предмета.]&lt;br /&gt;
&lt;br /&gt;
== {{категорија|1. задатак|Штафетна_палица}} ==&lt;br /&gt;
{{делимично решено}}&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Потребно је реализовати тајмер користећи приватне семафоре и технику предаје штафетне палице. Тајмер има две методе, прва је метода &amp;lt;code&amp;gt;wakeme&amp;lt;/code&amp;gt; која омогућава да се дата нит блокирана &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; јединица времена (ово је аргумент), а друга је метода &amp;lt;code&amp;gt;tick&amp;lt;/code&amp;gt; која означава да је истекла једна јединица времена.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
const N = ...; // максималан бpој нити&lt;br /&gt;
&lt;br /&gt;
class Timer {&lt;br /&gt;
  sem mutex = 1;&lt;br /&gt;
  sem privSem[N];&lt;br /&gt;
  int timeLeft[N];&lt;br /&gt;
  bool sleeping[N];&lt;br /&gt;
  &lt;br /&gt;
  void wakeme(int id, int n) {&lt;br /&gt;
    wait(mutex);&lt;br /&gt;
    timeLeft[id] = n; sleeping[id] = true;&lt;br /&gt;
    signal(mutex);&lt;br /&gt;
    wait(privSem[id]); // блокира се на свом семафору&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  void tick(){&lt;br /&gt;
    wait(mutex);&lt;br /&gt;
    for(int i = 0 to N - 1){&lt;br /&gt;
      if(sleeping[i]) {&lt;br /&gt;
        timeLeft[i]--;&lt;br /&gt;
        if(timeLeft[i] == 0) {&lt;br /&gt;
          sleeping[i] = false;&lt;br /&gt;
          signal(privSem[i]);&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    signal(mutex);&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 (N &amp;gt; 1) који могу да користе жене, мушкарци, деца и домар (&#039;&#039;Single Bathroom Problem&#039;&#039;) такав да важе следећа правила коришћења: у исто време у тоалету не могу наћи и жене и мушкарци; деца могу да деле тоалет и са женама и са мушкарцима; дете може да се нађе у тоалету само ако се тамо налази барем једна жена или мушкарац; домар има ексклузивно право коришћења тоалета. Написати монитор са &#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;
class SingleBathroomProblem {&lt;br /&gt;
    public static final int capacity = 10;&lt;br /&gt;
    private int count = 0;&lt;br /&gt;
    private int childCount = 0;&lt;br /&gt;
    // Група која је тренутно у тоалету&lt;br /&gt;
    // -1 - нема никога, 0 - мушкарци, 1 - жене, 2 - домар&lt;br /&gt;
    private int group = -1;&lt;br /&gt;
    private final Condition queue = new Condition();&lt;br /&gt;
    private final Condition childrenQueue = new Condition();&lt;br /&gt;
    private final Condition waitingForChildren = new Condition();&lt;br /&gt;
    private int ticket = 1;&lt;br /&gt;
    private void signalPersonOrChild() {&lt;br /&gt;
        boolean personWaiting = queue.queue() &amp;amp;&amp;amp; queue.minrank() % 3 == group;&lt;br /&gt;
        boolean childWaiting = childrenQueue.queue();&lt;br /&gt;
        if (personWaiting &amp;amp;&amp;amp; childWaiting) {&lt;br /&gt;
            if (queue.minrank() &amp;gt; childrenQueue.minrank() * 3) {&lt;br /&gt;
                // Одрасла особа је стигла пре детета&lt;br /&gt;
                queue.signal();&lt;br /&gt;
            } else {&lt;br /&gt;
                // Дете је стигло пре одрасле особе&lt;br /&gt;
                childrenQueue.signal();&lt;br /&gt;
            }&lt;br /&gt;
        } else if (personWaiting) {&lt;br /&gt;
            queue.signal();&lt;br /&gt;
        } else if (childWaiting) {&lt;br /&gt;
            childrenQueue.signal();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    public synchronized void enterMan() {&lt;br /&gt;
        int myTicket = ticket++;&lt;br /&gt;
        if (count == capacity || group == 1 || group == 2 || queue.queue()) {&lt;br /&gt;
            // Пун тоалет, у њему су жене/домар или има других особа испред тоалета&lt;br /&gt;
            queue.wait(myTicket * 3);&lt;br /&gt;
        }&lt;br /&gt;
        ++count;&lt;br /&gt;
        if (group == -1) {&lt;br /&gt;
            // Означавамо да је тренутно активна група мушкараца&lt;br /&gt;
            group = 0;&lt;br /&gt;
        } else if (waitingForChildren.queue()) {&lt;br /&gt;
            // Ако има мушкарца који чека децу јавља му се да не мора више да чека&lt;br /&gt;
            waitingForChildren.signal();&lt;br /&gt;
        }&lt;br /&gt;
        if (count != capacity) {&lt;br /&gt;
            signalPersonOrChild();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    public synchronized void enterWoman() {&lt;br /&gt;
        int myTicket = ticket++;&lt;br /&gt;
        if (count == capacity || group == 0 || group == 2 || queue.queue()) {&lt;br /&gt;
            // Пун тоалет или су у њему мушкарци/домар&lt;br /&gt;
            queue.wait(myTicket * 3 + 1);&lt;br /&gt;
        }&lt;br /&gt;
        ++count;&lt;br /&gt;
        if (group == -1) {&lt;br /&gt;
            // Означавамо да је тренутно активна група жена&lt;br /&gt;
            group = 1;&lt;br /&gt;
        } else if (waitingForChildren.queue()) {&lt;br /&gt;
            // Ако има жена која чека децу јавља јој се да не мора више да чека&lt;br /&gt;
            waitingForChildren.signal();&lt;br /&gt;
        }&lt;br /&gt;
        if (count != capacity) {&lt;br /&gt;
            signalPersonOrChild();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    public synchronized void enterJanitor() {&lt;br /&gt;
        int myTicket = ticket++;&lt;br /&gt;
        if (group != -1) {&lt;br /&gt;
            // У тоалету или испред тоалета има било кога&lt;br /&gt;
            queue.wait(myTicket * 3 + 2);&lt;br /&gt;
        }&lt;br /&gt;
        ++count;&lt;br /&gt;
        // Означавамо да је домар тренутно у тоалету&lt;br /&gt;
        group = 2;&lt;br /&gt;
    }&lt;br /&gt;
    public synchronized void enterChild() {&lt;br /&gt;
        int myTicket = ticket++;&lt;br /&gt;
        if (count == capacity || group == 2 || group == -1 || queue.queue() || childrenQueue.queue() || waitingForChildren.queue()) {&lt;br /&gt;
            // Пун тоалет, у њему нема никога, у њему је домар, има других особа&lt;br /&gt;
            // испред тоалета или има особа која је унутра и чека да деца изађу&lt;br /&gt;
            childrenQueue.wait(myTicket);&lt;br /&gt;
        }&lt;br /&gt;
        ++count;&lt;br /&gt;
        ++childCount;&lt;br /&gt;
        if (count != capacity) {&lt;br /&gt;
            signalPersonOrChild();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    public synchronized void exitMan() {&lt;br /&gt;
        if (count == childCount + 1) {&lt;br /&gt;
            // Мушкарац не може да изађе док су деца сама у тоалету&lt;br /&gt;
            waitingForChildren.wait();&lt;br /&gt;
        }&lt;br /&gt;
        --count;&lt;br /&gt;
        if (count == 0) {&lt;br /&gt;
            // Нема више никог у тоалету, пусти следећу одраслу особу ако је има&lt;br /&gt;
            group = -1;&lt;br /&gt;
            if (queue.queue()) {&lt;br /&gt;
                queue.signal();&lt;br /&gt;
            }&lt;br /&gt;
        } else {&lt;br /&gt;
            signalPersonOrChild();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    public synchronized void exitWoman() {&lt;br /&gt;
        if (count == childCount + 1) {&lt;br /&gt;
            // Жена не може да изађе док су деца сама у тоалету&lt;br /&gt;
            waitingForChildren.wait();&lt;br /&gt;
        }&lt;br /&gt;
        --count;&lt;br /&gt;
        if (count == 0) {&lt;br /&gt;
            // Нема више никог у тоалету, пусти следећу одраслу особу ако је има&lt;br /&gt;
            group = -1;&lt;br /&gt;
            if (queue.queue()) {&lt;br /&gt;
                queue.signal();&lt;br /&gt;
            }&lt;br /&gt;
        } else  {&lt;br /&gt;
            signalPersonOrChild();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    public synchronized void exitJanitor() {&lt;br /&gt;
        --count;&lt;br /&gt;
        // Сигурно нема више никог у тоалету&lt;br /&gt;
        group = -1;&lt;br /&gt;
        if (queue.queue()) {&lt;br /&gt;
            queue.signal();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    public synchronized void exitChild() {&lt;br /&gt;
        --count;&lt;br /&gt;
        --childCount;&lt;br /&gt;
        if (waitingForChildren.queue() &amp;amp;&amp;amp; childCount == 0) {&lt;br /&gt;
            // Јави особи која чека на излазак детета да су сва деца изашла&lt;br /&gt;
            waitingForChildren.signal();&lt;br /&gt;
        }&lt;br /&gt;
        if (count == 0) {&lt;br /&gt;
            // Нема више никог у тоалету, пусти следећу одраслу особу ако је има&lt;br /&gt;
            group = -1;&lt;br /&gt;
            if (queue.queue()) {&lt;br /&gt;
                queue.signal();&lt;br /&gt;
            }&lt;br /&gt;
        } else {&lt;br /&gt;
            signalPersonOrChild();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== {{категорија|3. задатак|CSP}} ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Реализујте &#039;&#039;coarse grain ticket&#039;&#039; алгоритам за улазак у критичну секцију користећи CSP.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
Није јасно на шта се мисли под &#039;&#039;coarse grain&#039;&#039; реализацијом у овом случају, али је испод једна могућа имплементација &#039;&#039;ticket&#039;&#039; алгоритма за улазак у критичну секцију користећи CSP.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
[ticket::TICKET || user(i: 1..N)::USER]&lt;br /&gt;
&lt;br /&gt;
TICKET::&lt;br /&gt;
    users: (1..N) integer;&lt;br /&gt;
    head: integer;&lt;br /&gt;
    tail: integer;&lt;br /&gt;
    head := 0;&lt;br /&gt;
    tail := 0;&lt;br /&gt;
    *[&lt;br /&gt;
        head == tail; (i: 1..N) user(i)?enter -&amp;gt;&lt;br /&gt;
            // Нема никога, па пуштамо овог корисника&lt;br /&gt;
            user(i)!pass;&lt;br /&gt;
            tail := (tail + 1) mod N&lt;br /&gt;
        □&lt;br /&gt;
        head &amp;lt;&amp;gt; tail; (i: 1..N) user(i)?enter -&amp;gt;&lt;br /&gt;
            // Додајемо корисника у ред чекања&lt;br /&gt;
            users(tail) := i;&lt;br /&gt;
            tail := (tail + 1) mod N&lt;br /&gt;
        □&lt;br /&gt;
        (i: 1..N) user(i)?exit -&amp;gt;&lt;br /&gt;
            head := (head + 1) mod N;&lt;br /&gt;
            [&lt;br /&gt;
                // Пуштамо следећег корисника, уколико га има&lt;br /&gt;
                users(head) &amp;lt;&amp;gt; 0 -&amp;gt;&lt;br /&gt;
                    user(users(head))!pass;&lt;br /&gt;
                    users(head) := 0&lt;br /&gt;
            ]&lt;br /&gt;
        □&lt;br /&gt;
    ]&lt;br /&gt;
&lt;br /&gt;
USER::&lt;br /&gt;
    ticket!enter;&lt;br /&gt;
    ticket?pass;&lt;br /&gt;
    // У критичној секцији&lt;br /&gt;
    ticket!exit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== {{категорија|4. задатак|C-Linda}} ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
На уласку у једну железничку станицу са једном улазном пругом и једним слепим колосеком десио се квар, па се на улазу направила колона међународних и домаћих возова. Квар је отклоњен и треба пуштати возове. Да би међународни возови мање каснили, они се пуштају први, по редоследу доласка. Пошто постоји само једна пруга и возови се не могу „претицати”, сви домаћи возови који су били испред међународних у колони се пребацују на слепи колосек који је довољно велики да сви возови могу да стану. Када сви међународни возови оду, пуштају се прво возови са слепог колосека, па онда преостали домаћи возови из колоне. Сама станица има N перона, тј. N возова истовремено могу да укрцавају и искрцавају путнике. Возови који у међувремену пристижу треба да буду опслужени, али новопристигли међународни немају приоритет у односу на возове који су испред њих у колони. Решити проблем користећи C-Linda. Написати потребну иницијализацију која осликава стање након отклањања квара. Водити рачуна о томе да су композиције возова тешке и да је потребно време да се воз помери са једног места на друго.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
Следећи тагови су коришћени током реализације:&lt;br /&gt;
* &amp;lt;code&amp;gt;ticket&amp;lt;/code&amp;gt;: редослед воза по пристизању&lt;br /&gt;
* &amp;lt;code&amp;gt;current&amp;lt;/code&amp;gt;: воз који тренутно окупира улаз (било да излази из улаза и иде у слепи колосек, излази из улаза и иде на станицу или излази из слепог колосека и иде на станицу)&lt;br /&gt;
* &amp;lt;code&amp;gt;sidetrack&amp;lt;/code&amp;gt;: возови који се налазе у слепом колосеку, прва вредност је редослед у слепом колосеку а друга редослед пристизања воза&lt;br /&gt;
* &amp;lt;code&amp;gt;sidetrackHead&amp;lt;/code&amp;gt;: први воз који следећи треба да изађе из слепог колосека, по редоследу у слепом колосеку&lt;br /&gt;
* &amp;lt;code&amp;gt;sidetrackTail&amp;lt;/code&amp;gt;: број возова у слепом колосеку&lt;br /&gt;
* &amp;lt;code&amp;gt;station&amp;lt;/code&amp;gt;: возови који су тренутно на једном од регуларних N колосека&lt;br /&gt;
Начин на који је у овом решењу било одређено да ли је воз пристигао током квара или после је провера да ли је његов редослед пристизања већи или једнак константи &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt;, што је број возова који су пристигли током квара. Након почетне иницијализације стања након поправљања квара очекује се да новопристигли возови сами направе &amp;lt;code&amp;gt;train&amp;lt;/code&amp;gt; процес.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
const int N = 10;&lt;br /&gt;
const int M = 100;&lt;br /&gt;
&lt;br /&gt;
void setCurrentFromSidetrack() {&lt;br /&gt;
    int sidetrackTicket;&lt;br /&gt;
    int sidetrackHead;&lt;br /&gt;
    in(&amp;quot;sidetrackHead&amp;quot;, &amp;amp;sidetrackHead);&lt;br /&gt;
    in(&amp;quot;sidetrack&amp;quot;, sidetrackHead, &amp;amp;sidetrackTicket);&lt;br /&gt;
    out(&amp;quot;sidetrackHead&amp;quot;, sidetrackHead + 1);&lt;br /&gt;
    out(&amp;quot;current&amp;quot;, sidetrackTicket);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void train(bool isInternational) {&lt;br /&gt;
    int ticket;&lt;br /&gt;
    in(&amp;quot;ticket&amp;quot;, &amp;amp;ticket);&lt;br /&gt;
    out(&amp;quot;ticket&amp;quot;, ticket + 1);&lt;br /&gt;
    in(&amp;quot;current&amp;quot;, ticket);&lt;br /&gt;
    bool arrivedLater = ticket &amp;gt;= M;&lt;br /&gt;
    bool isSidetrack = !isInternational &amp;amp;&amp;amp; !arrivedLater;&lt;br /&gt;
    if (isSidetrack) {&lt;br /&gt;
        // Прво идемо у слепи колосек&lt;br /&gt;
        int sidetrackTail;&lt;br /&gt;
        in(&amp;quot;sidetrackTail&amp;quot;, &amp;amp;sidetrackTail);&lt;br /&gt;
        out(&amp;quot;sidetrack&amp;quot;, sidetrackTail, ticket);&lt;br /&gt;
        out(&amp;quot;sidetrackTail&amp;quot;, sidetrackTail + 1);&lt;br /&gt;
        if (ticket == M - 1) {&lt;br /&gt;
            // Ми смо последњи воз који је стигао током квара,&lt;br /&gt;
            // треба да предамо првом из слепог колосека&lt;br /&gt;
            setCurrentFromSidetrack();&lt;br /&gt;
            in(&amp;quot;current&amp;quot;, ticket);&lt;br /&gt;
        } else {&lt;br /&gt;
            // Предајемо следећем возу који је стигао током квара&lt;br /&gt;
            out(&amp;quot;current&amp;quot;, ticket + 1);&lt;br /&gt;
            in(&amp;quot;current&amp;quot;, ticket);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    int station;&lt;br /&gt;
    in(&amp;quot;station&amp;quot;, &amp;amp;station);&lt;br /&gt;
    // Идемо на станицу, па чим ослободимо улаз пуштамо следећег&lt;br /&gt;
    if (isSidetrack) {&lt;br /&gt;
        if (rdp(&amp;quot;sidetrack&amp;quot;)) {&lt;br /&gt;
            // Пуштамо следећег из слепог колосека&lt;br /&gt;
            setCurrentFromSidetrack();&lt;br /&gt;
        } else {&lt;br /&gt;
            // Нема више никог из слепог колосека, пуштамо обичну колону&lt;br /&gt;
            out(&amp;quot;current&amp;quot;, M);&lt;br /&gt;
        }&lt;br /&gt;
    } else {&lt;br /&gt;
        if (ticket == M - 1) {&lt;br /&gt;
            // Ми смо последњи воз који је стигао током квара,&lt;br /&gt;
            // треба да предамо возовима из слепог колосека, уколико постоје&lt;br /&gt;
            if (rdp(&amp;quot;sidetrack&amp;quot;)) {&lt;br /&gt;
                setCurrentFromSidetrack();&lt;br /&gt;
            } else {&lt;br /&gt;
                // Нико није ушао у слепи колосек&lt;br /&gt;
                out(&amp;quot;current&amp;quot;, ticket + 1);&lt;br /&gt;
            }&lt;br /&gt;
        } else {&lt;br /&gt;
            // Пуштамо следећи воз, пошто још увек колона која је стигла&lt;br /&gt;
            // током квара није изашла из улаза&lt;br /&gt;
            out(&amp;quot;current&amp;quot;, ticket + 1);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    // Одлазимо са станице&lt;br /&gt;
    out(&amp;quot;station&amp;quot;, station);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void initialize() {&lt;br /&gt;
    out(&amp;quot;ticket&amp;quot;, 0);&lt;br /&gt;
    for (int i = 0; i &amp;lt; M; ++i) {&lt;br /&gt;
        eval(train, rand() % 2 == 1);&lt;br /&gt;
        // Чекамо да воз покупи свој ticket&lt;br /&gt;
        rd(&amp;quot;ticket&amp;quot;, i + 1);&lt;br /&gt;
    }&lt;br /&gt;
    for (int i = 0; i &amp;lt; N; ++i) {&lt;br /&gt;
        out(&amp;quot;station&amp;quot;, i);&lt;br /&gt;
    }&lt;br /&gt;
    out(&amp;quot;current&amp;quot;, 0);&lt;br /&gt;
    out(&amp;quot;sidetrackHead&amp;quot;, 0);&lt;br /&gt;
    out(&amp;quot;sidetrackTail&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>Sirenfia</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=8258</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=8258"/>
		<updated>2026-02-16T11:12:46Z</updated>

		<summary type="html">&lt;p&gt;Sirenfia: /* Решење */&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;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// 1 произвођач и 1 потрошач&lt;br /&gt;
typeT buff[n];&lt;br /&gt;
int front = 0, rear = 0;&lt;br /&gt;
sem empty = n, full = 0;&lt;br /&gt;
// empty се користи као број празних места, а full као број попуњених места у баферу&lt;br /&gt;
&lt;br /&gt;
process Producer{&lt;br /&gt;
  while(true){&lt;br /&gt;
  ... //произведи податак&lt;br /&gt;
  wait(empty); //чекај да бафер има празних места&lt;br /&gt;
  buf[rear] = data; rear = (rear + 1)%n;&lt;br /&gt;
  signal(full); //попуни једно место у баферу&lt;br /&gt;
  ...&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
process Consumer{&lt;br /&gt;
  while(true){&lt;br /&gt;
  ... //потроши податак&lt;br /&gt;
  wait(full); //чекај да бафер није празан&lt;br /&gt;
  res = buf[front]; front = (front + 1)%n;&lt;br /&gt;
  signal(empty); //ослободи једно место у баферу&lt;br /&gt;
  ...&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//За M произвођача и N потрошача потребан нам је још један пар семафора - да се осигура да ће само један произвођач убацивати (deposit) у бафер, ерго да ће само један потрошач узимати (fetch) из бафера у било ком тренутку&lt;br /&gt;
typeT buff[n]; const M = ..., N = ...;&lt;br /&gt;
int front = 0, rear = 0;&lt;br /&gt;
sem empty = n, full = 0;&lt;br /&gt;
sem mutexD = 1, mutexF = 1; // за међусобно искључивање током deposit и fetch&lt;br /&gt;
&lt;br /&gt;
process Producer[i = 1 to M]{&lt;br /&gt;
  while(true){&lt;br /&gt;
  ... //произведи податак&lt;br /&gt;
  wait(mutexD); wait(empty); //чекај да сам једини који убацује у бафер и да бафер има празних места&lt;br /&gt;
  buf[rear] = data; rear = (rear + 1)%n;&lt;br /&gt;
  signal(mutexD); signal(full); //допусти да неки други поризвођач убацује у бафер и попуни једно место у баферу&lt;br /&gt;
  ...&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
process Consumer[i = 1 to N]{&lt;br /&gt;
  while(true){&lt;br /&gt;
  ... //потроши податак&lt;br /&gt;
  wait(mutexF); wait(full);&lt;br /&gt;
  res = buf[front]; front = (front + 1)%n;&lt;br /&gt;
  signal(mutexF); signal(empty);&lt;br /&gt;
  ...&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//За случај M произвођача и 1 потрошач није потребан семафор mutexF јер не постоји више потрошача који желе да узимају из бафера. Аналогно је за 1 произвођач и N потрошача.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;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>Sirenfia</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9F%D0%A0%D0%9C/%D0%9F%D1%80%D0%B5%D0%B4%D1%80%D0%BE%D0%BA_2022&amp;diff=8252</id>
		<title>ПРМ/Предрок 2022</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9F%D0%A0%D0%9C/%D0%9F%D1%80%D0%B5%D0%B4%D1%80%D0%BE%D0%BA_2022&amp;diff=8252"/>
		<updated>2026-02-08T16:58:00Z</updated>

		<summary type="html">&lt;p&gt;Sirenfia: /* Rešenje */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
{{нерешено}}&lt;br /&gt;
&#039;&#039;&#039;Предрок 2022. године&#039;&#039;&#039; је одржан 3. децембра у сали 70. Постојала је могућност изласка на испит и у јануарском року за студенте незадовољне оценом. Испит је рађен на &#039;&#039;Moodle&#039;&#039; платформи, без доступних окружења уз доступне материјале са предавања.&lt;br /&gt;
&lt;br /&gt;
== Задаци ==&lt;br /&gt;
=== 1. задатак ===&lt;br /&gt;
==== Postavka ====&lt;br /&gt;
Написати команде у Латеху којима се реконструише текст и форматирање са слике испод (овде преписано као текст).&lt;br /&gt;
# Rešiti sistem jednačina na &#039;&#039;dva načina&#039;&#039;, korišćenjem inverzne matrice i primenom Kramerovih pravila:&lt;br /&gt;
#: &amp;lt;div class=&amp;quot;center&amp;quot;&amp;gt;&amp;lt;math&amp;gt;2x +3y - 5z = -7&amp;lt;/math&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
#: &amp;lt;div class=&amp;quot;center&amp;quot;&amp;gt;&amp;lt;math&amp;gt;-3x +2y - z = -9&amp;lt;/math&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
#: &amp;lt;div class=&amp;quot;center&amp;quot;&amp;gt;&amp;lt;math&amp;gt;4x -y +  2z = 17&amp;lt;/math&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
#: (z и решење треба да буду поравнати).&lt;br /&gt;
# Izračunati integral:&lt;br /&gt;
#: &amp;lt;div class=&amp;quot;center&amp;quot;&amp;gt;&amp;lt;math&amp;gt;I = \int_0^{\frac{\pi}{2}} \frac{dx}{2 \sin{x} + 3 \cos{x}}.                                             (1)&amp;lt;/math&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Rešenje ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;latex&amp;quot;&amp;gt;&lt;br /&gt;
\begin{enumerate}&lt;br /&gt;
    \item Re\v siti sistem jedna\v cina na \textit{dva na\v cina}, kori\v s\&#039; cenjem inverzne matrice i \\ primenom Kramerovih pravila:&lt;br /&gt;
    \begin{align*}&lt;br /&gt;
        2x + 3y - 5z &amp;amp;= -7 \\&lt;br /&gt;
        -3x + 2y + z &amp;amp;= -9 \\&lt;br /&gt;
        4x - y + 2z &amp;amp;= 17&lt;br /&gt;
    \end{align*}&lt;br /&gt;
&lt;br /&gt;
    \item Izra\v cunati integral&lt;br /&gt;
    \begin{equation}&lt;br /&gt;
        I = \int_{0}^{\frac{\pi}{2}} \frac{dx}{2\sin{x} + 3\cos{x}}&lt;br /&gt;
    \end{equation}&lt;br /&gt;
\end{enumerate}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. задатак ===&lt;br /&gt;
==== Postavka ====&lt;br /&gt;
Написати команде у GNU Octave којима се:&lt;br /&gt;
* дефинише функција &amp;lt;math&amp;gt;f(x) = \frac{\cos^2{x}}{1+\sin^2{x}}&amp;lt;/math&amp;gt;;&lt;br /&gt;
* црта график функције &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* израчунава вредност интеграла &amp;lt;math&amp;gt;I = \int_0^{\pi} f(x) dx &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Rešenje ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang = &amp;quot;octave&amp;quot;&amp;gt;&lt;br /&gt;
pkg load symbolic&lt;br /&gt;
&lt;br /&gt;
syms x&lt;br /&gt;
&lt;br /&gt;
f = cos(x)^2 / (1+sin(x)^2)&lt;br /&gt;
&lt;br /&gt;
fh = function_handle(f);&lt;br /&gt;
&lt;br /&gt;
x_val = linspace(-10, 10, 1000);&lt;br /&gt;
y_val = fh(x_val);&lt;br /&gt;
&lt;br /&gt;
plot(x_val, y_val)&lt;br /&gt;
xlabel(&amp;quot;x&amp;quot;)&lt;br /&gt;
ylabel(&amp;quot;f(x)&amp;quot;)&lt;br /&gt;
title(&amp;quot;Grafik:&amp;quot;)&lt;br /&gt;
legend(&amp;quot;f(x)&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
int_f = int(f, x, 0, pi);&lt;br /&gt;
double(int_f)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. задатак ===&lt;br /&gt;
==== Postavka ====&lt;br /&gt;
Лапласова трансформација функције &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; се дефинише на следећи начин: &amp;lt;math&amp;gt;L(s) = \int_0^{+\infty} f(t) e^{-st} dt&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Написати команде у &#039;&#039;SageMath&#039;&#039; којима се одређује Лапласова трансформација функције &amp;lt;math&amp;gt;f(t) = 5te^{t-3}&amp;lt;/math&amp;gt;. (Напомена: претпоставити да је &amp;lt;math&amp;gt;s&amp;gt;1&amp;lt;/math&amp;gt;.)&lt;br /&gt;
&lt;br /&gt;
==== Rešenje ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang = &amp;quot;octave&amp;quot;&amp;gt;&lt;br /&gt;
pkg load symbolic&lt;br /&gt;
syms t s&lt;br /&gt;
f = 5*t*exp(t - 3);&lt;br /&gt;
L = laplace(f, t, s)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 4. задатак ===&lt;br /&gt;
==== Postavka ====&lt;br /&gt;
Написати команде у Python-у којима се одређују тангента и нормала функције &amp;lt;math&amp;gt;f(x) = x^2-3x+2&amp;lt;/math&amp;gt; у тачки (2,0).&lt;br /&gt;
&lt;br /&gt;
Написати команде у Python-у за цртање дате параболе и њене тангенте.&lt;br /&gt;
&lt;br /&gt;
==== Rešenje ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang = &amp;quot;octave&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import sympy as sp&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
x = sp.Symbol(&#039;x&#039;)&lt;br /&gt;
f = x**2 - 3*x + 2&lt;br /&gt;
x0 = 0&lt;br /&gt;
y0 = 2&lt;br /&gt;
&lt;br /&gt;
der = sp.diff(f, x)&lt;br /&gt;
slope = der.subs(x, x0)&lt;br /&gt;
tangent = slope*(x - x0) + y0&lt;br /&gt;
&lt;br /&gt;
f_num = sp.lambdify(x, f, &amp;quot;numpy&amp;quot;)&lt;br /&gt;
tangent_num = sp.lambdify(x, tangent, &amp;quot;numpy&amp;quot;)&lt;br /&gt;
x_vals = np.linspace(-2, 3, 400)&lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize=(7, 5))&lt;br /&gt;
plt.plot(x_vals, f_num(x_vals), label=r&amp;quot;$f(x) = x^2 - 3x + 2$&amp;quot;)&lt;br /&gt;
plt.plot(x_vals, tangent_num(x_vals), &amp;quot;--&amp;quot;, label=&amp;quot;Tangenta&amp;quot;)&lt;br /&gt;
plt.scatter(x0, y0)&lt;br /&gt;
&lt;br /&gt;
plt.xlabel(&amp;quot;x&amp;quot;)&lt;br /&gt;
plt.ylabel(&amp;quot;y&amp;quot;)&lt;br /&gt;
plt.title(&amp;quot;Grafik funkcije i tangente&amp;quot;)&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 5. задатак ===&lt;br /&gt;
==== Postavka ====&lt;br /&gt;
Написати команде у Python-у које решавају задати систем једначина на два начина, симболички и нумерички.&lt;br /&gt;
* &amp;lt;math&amp;gt;2x+3y-5z = -7&amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;-3x+2y+z = -9&amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;4x-y+2z = 17&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Rešenje ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang = &amp;quot;octave&amp;quot;&amp;gt;&lt;br /&gt;
import sympy as sp&lt;br /&gt;
&lt;br /&gt;
x, y, z = sp.symbols(&#039;x y z&#039;)&lt;br /&gt;
&lt;br /&gt;
eq1 = sp.Eq(2*x + 3*y - 5*z, -7)&lt;br /&gt;
eq2 = sp.Eq(-3*x + 2*y + z, -9)&lt;br /&gt;
eq3 = sp.Eq(4*x - y + 2*z, 17)&lt;br /&gt;
&lt;br /&gt;
solution = sp.solve((eq1, eq2, eq3), (x, y, z))&lt;br /&gt;
solution&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
A = np.array([&lt;br /&gt;
    [2,  3, -5],&lt;br /&gt;
    [-3, 2,  1],&lt;br /&gt;
    [4, -1,  2]&lt;br /&gt;
], dtype=float)&lt;br /&gt;
&lt;br /&gt;
b = np.array([-7, -9, 17], dtype=float)&lt;br /&gt;
&lt;br /&gt;
solution = np.linalg.solve(A, b)&lt;br /&gt;
x, y, z = solution&lt;br /&gt;
print(f&amp;quot;x = {x:.0f}, y = {y:.0f}, z = {z:.0f}&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Напомене ==&lt;br /&gt;
* За ствари које нису писале у материјалима, признавано је било шта.&lt;br /&gt;
* За &#039;&#039;Octave&#039;&#039;, уколико се дефинише функција, мора се у коментару нагласти да се то ради у посебном фајлу који се зове као функција, иначе -1 поен.&lt;br /&gt;
* Иако је при обиласку рекла да је то у реду, професорка је скинула поене за писање ошишаном латиницом у задатку са &#039;&#039;LaTeX&#039;&#039;-ом.&lt;br /&gt;
* За не дефинисање симбола у Пајтону скидан је један поен.&lt;br /&gt;
&lt;br /&gt;
[[Категорија:ПРМ]]&lt;br /&gt;
[[Категорија:Рокови]]&lt;/div&gt;</summary>
		<author><name>Sirenfia</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9F%D0%A0%D0%9C/%D0%9F%D1%80%D0%B5%D0%B4%D1%80%D0%BE%D0%BA_2022&amp;diff=8251</id>
		<title>ПРМ/Предрок 2022</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9F%D0%A0%D0%9C/%D0%9F%D1%80%D0%B5%D0%B4%D1%80%D0%BE%D0%BA_2022&amp;diff=8251"/>
		<updated>2026-02-08T16:54:39Z</updated>

		<summary type="html">&lt;p&gt;Sirenfia: /* Rešenje */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
{{нерешено}}&lt;br /&gt;
&#039;&#039;&#039;Предрок 2022. године&#039;&#039;&#039; је одржан 3. децембра у сали 70. Постојала је могућност изласка на испит и у јануарском року за студенте незадовољне оценом. Испит је рађен на &#039;&#039;Moodle&#039;&#039; платформи, без доступних окружења уз доступне материјале са предавања.&lt;br /&gt;
&lt;br /&gt;
== Задаци ==&lt;br /&gt;
=== 1. задатак ===&lt;br /&gt;
==== Postavka ====&lt;br /&gt;
Написати команде у Латеху којима се реконструише текст и форматирање са слике испод (овде преписано као текст).&lt;br /&gt;
# Rešiti sistem jednačina na &#039;&#039;dva načina&#039;&#039;, korišćenjem inverzne matrice i primenom Kramerovih pravila:&lt;br /&gt;
#: &amp;lt;div class=&amp;quot;center&amp;quot;&amp;gt;&amp;lt;math&amp;gt;2x +3y - 5z = -7&amp;lt;/math&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
#: &amp;lt;div class=&amp;quot;center&amp;quot;&amp;gt;&amp;lt;math&amp;gt;-3x +2y - z = -9&amp;lt;/math&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
#: &amp;lt;div class=&amp;quot;center&amp;quot;&amp;gt;&amp;lt;math&amp;gt;4x -y +  2z = 17&amp;lt;/math&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
#: (z и решење треба да буду поравнати).&lt;br /&gt;
# Izračunati integral:&lt;br /&gt;
#: &amp;lt;div class=&amp;quot;center&amp;quot;&amp;gt;&amp;lt;math&amp;gt;I = \int_0^{\frac{\pi}{2}} \frac{dx}{2 \sin{x} + 3 \cos{x}}.                                             (1)&amp;lt;/math&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Rešenje ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;latex&amp;quot;&amp;gt;&lt;br /&gt;
\begin{enumerate}&lt;br /&gt;
    \item Re\v siti sistem jedna\v cina na \textit{dva na\v cina}, kori\v s\&#039; cenjem inverzne matrice i \\ primenom Kramerovih pravila:&lt;br /&gt;
    \begin{align*}&lt;br /&gt;
        2x + 3y - 5z &amp;amp;= -7 \\&lt;br /&gt;
        -3x + 2y + z &amp;amp;= -9 \\&lt;br /&gt;
        4x - y + 2z &amp;amp;= 17&lt;br /&gt;
    \end{align*}&lt;br /&gt;
&lt;br /&gt;
    \item Izra\v cunati integral&lt;br /&gt;
    \begin{equation}&lt;br /&gt;
        I = \int_{0}^{\frac{\pi}{2}} \frac{dx}{2\sin{x} + 3\cos{x}}&lt;br /&gt;
    \end{equation}&lt;br /&gt;
\end{enumerate}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. задатак ===&lt;br /&gt;
==== Postavka ====&lt;br /&gt;
Написати команде у GNU Octave којима се:&lt;br /&gt;
* дефинише функција &amp;lt;math&amp;gt;f(x) = \frac{\cos^2{x}}{1+\sin^2{x}}&amp;lt;/math&amp;gt;;&lt;br /&gt;
* црта график функције &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* израчунава вредност интеграла &amp;lt;math&amp;gt;I = \int_0^{\pi} f(x) dx &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Rešenje ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang = &amp;quot;octave&amp;quot;&amp;gt;&lt;br /&gt;
pkg load symbolic&lt;br /&gt;
&lt;br /&gt;
syms x&lt;br /&gt;
&lt;br /&gt;
f = cos(x)^2 / (1+sin(x)^2)&lt;br /&gt;
&lt;br /&gt;
fh = function_handle(f);&lt;br /&gt;
&lt;br /&gt;
x_val = linspace(-10, 10, 1000);&lt;br /&gt;
y_val = fh(x_val);&lt;br /&gt;
&lt;br /&gt;
plot(x_val, y_val)&lt;br /&gt;
xlabel(&amp;quot;x&amp;quot;)&lt;br /&gt;
ylabel(&amp;quot;f(x)&amp;quot;)&lt;br /&gt;
title(&amp;quot;Grafik:&amp;quot;)&lt;br /&gt;
legend(&amp;quot;f(x)&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
int_f = int(f, x, 0, pi);&lt;br /&gt;
double(int_f)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. задатак ===&lt;br /&gt;
==== Postavka ====&lt;br /&gt;
Лапласова трансформација функције &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; се дефинише на следећи начин: &amp;lt;math&amp;gt;L(s) = \int_0^{+\infty} f(t) e^{-st} dt&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Написати команде у &#039;&#039;SageMath&#039;&#039; којима се одређује Лапласова трансформација функције &amp;lt;math&amp;gt;f(t) = 5te^{t-3}&amp;lt;/math&amp;gt;. (Напомена: претпоставити да је &amp;lt;math&amp;gt;s&amp;gt;1&amp;lt;/math&amp;gt;.)&lt;br /&gt;
&lt;br /&gt;
==== Rešenje ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang = &amp;quot;octave&amp;quot;&amp;gt;&lt;br /&gt;
pkg load symbolic&lt;br /&gt;
syms t s&lt;br /&gt;
f = 5*t*exp(t - 3);&lt;br /&gt;
L = laplace(f, t, s)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 4. задатак ===&lt;br /&gt;
==== Postavka ====&lt;br /&gt;
Написати команде у Python-у којима се одређују тангента и нормала функције &amp;lt;math&amp;gt;f(x) = x^2-3x+2&amp;lt;/math&amp;gt; у тачки (2,0).&lt;br /&gt;
&lt;br /&gt;
Написати команде у Python-у за цртање дате параболе и њене тангенте.&lt;br /&gt;
&lt;br /&gt;
==== Rešenje ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang = &amp;quot;octave&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import sympy as sp&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
x = sp.Symbol(&#039;x&#039;)&lt;br /&gt;
f = x**2 - 3*x + 2&lt;br /&gt;
x0 = 0&lt;br /&gt;
y0 = 2&lt;br /&gt;
&lt;br /&gt;
der = sp.diff(f, x)&lt;br /&gt;
slope = der.subs(x, x0)&lt;br /&gt;
tangent = slope*(x - x0) + y0&lt;br /&gt;
&lt;br /&gt;
f_num = sp.lambdify(x, f, &amp;quot;numpy&amp;quot;)&lt;br /&gt;
tangent_num = sp.lambdify(x, tangent, &amp;quot;numpy&amp;quot;)&lt;br /&gt;
x_vals = np.linspace(-2, 3, 400)&lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize=(7, 5))&lt;br /&gt;
plt.plot(x_vals, f_num(x_vals), label=r&amp;quot;$f(x) = x^2 - 3x + 2$&amp;quot;)&lt;br /&gt;
plt.plot(x_vals, tangent_num(x_vals), &amp;quot;--&amp;quot;, label=&amp;quot;Tangenta&amp;quot;)&lt;br /&gt;
plt.scatter(x0, y0)&lt;br /&gt;
&lt;br /&gt;
plt.xlabel(&amp;quot;x&amp;quot;)&lt;br /&gt;
plt.ylabel(&amp;quot;y&amp;quot;)&lt;br /&gt;
plt.title(&amp;quot;Grafik funkcije i tangente&amp;quot;)&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 5. задатак ===&lt;br /&gt;
==== Postavka ====&lt;br /&gt;
Написати команде у Python-у које решавају задати систем једначина на два начина, симболички и нумерички.&lt;br /&gt;
* &amp;lt;math&amp;gt;2x+3y-5z = -7&amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;-3x+2y+z = -9&amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;4x-y+2z = 17&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Rešenje ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang = &amp;quot;octave&amp;quot;&amp;gt;&lt;br /&gt;
import sympy as sp&lt;br /&gt;
&lt;br /&gt;
x, y, z = sp.symbols(&#039;x y z&#039;)&lt;br /&gt;
&lt;br /&gt;
eq1 = sp.Eq(2*x + 3*y - 5*z, -7)&lt;br /&gt;
eq2 = sp.Eq(-3*x + 2*y + z, -9)&lt;br /&gt;
eq3 = sp.Eq(4*x - y + 2*z, 17)&lt;br /&gt;
&lt;br /&gt;
solution = sp.solve((eq1, eq2, eq3), (x, y, z))&lt;br /&gt;
solution&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Напомене ==&lt;br /&gt;
* За ствари које нису писале у материјалима, признавано је било шта.&lt;br /&gt;
* За &#039;&#039;Octave&#039;&#039;, уколико се дефинише функција, мора се у коментару нагласти да се то ради у посебном фајлу који се зове као функција, иначе -1 поен.&lt;br /&gt;
* Иако је при обиласку рекла да је то у реду, професорка је скинула поене за писање ошишаном латиницом у задатку са &#039;&#039;LaTeX&#039;&#039;-ом.&lt;br /&gt;
* За не дефинисање симбола у Пајтону скидан је један поен.&lt;br /&gt;
&lt;br /&gt;
[[Категорија:ПРМ]]&lt;br /&gt;
[[Категорија:Рокови]]&lt;/div&gt;</summary>
		<author><name>Sirenfia</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9F%D0%A0%D0%9C/%D0%9F%D1%80%D0%B5%D0%B4%D1%80%D0%BE%D0%BA_2022&amp;diff=8250</id>
		<title>ПРМ/Предрок 2022</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9F%D0%A0%D0%9C/%D0%9F%D1%80%D0%B5%D0%B4%D1%80%D0%BE%D0%BA_2022&amp;diff=8250"/>
		<updated>2026-02-08T16:41:11Z</updated>

		<summary type="html">&lt;p&gt;Sirenfia: /* Rešenje */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
{{нерешено}}&lt;br /&gt;
&#039;&#039;&#039;Предрок 2022. године&#039;&#039;&#039; је одржан 3. децембра у сали 70. Постојала је могућност изласка на испит и у јануарском року за студенте незадовољне оценом. Испит је рађен на &#039;&#039;Moodle&#039;&#039; платформи, без доступних окружења уз доступне материјале са предавања.&lt;br /&gt;
&lt;br /&gt;
== Задаци ==&lt;br /&gt;
=== 1. задатак ===&lt;br /&gt;
==== Postavka ====&lt;br /&gt;
Написати команде у Латеху којима се реконструише текст и форматирање са слике испод (овде преписано као текст).&lt;br /&gt;
# Rešiti sistem jednačina na &#039;&#039;dva načina&#039;&#039;, korišćenjem inverzne matrice i primenom Kramerovih pravila:&lt;br /&gt;
#: &amp;lt;div class=&amp;quot;center&amp;quot;&amp;gt;&amp;lt;math&amp;gt;2x +3y - 5z = -7&amp;lt;/math&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
#: &amp;lt;div class=&amp;quot;center&amp;quot;&amp;gt;&amp;lt;math&amp;gt;-3x +2y - z = -9&amp;lt;/math&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
#: &amp;lt;div class=&amp;quot;center&amp;quot;&amp;gt;&amp;lt;math&amp;gt;4x -y +  2z = 17&amp;lt;/math&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
#: (z и решење треба да буду поравнати).&lt;br /&gt;
# Izračunati integral:&lt;br /&gt;
#: &amp;lt;div class=&amp;quot;center&amp;quot;&amp;gt;&amp;lt;math&amp;gt;I = \int_0^{\frac{\pi}{2}} \frac{dx}{2 \sin{x} + 3 \cos{x}}.                                             (1)&amp;lt;/math&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Rešenje ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;latex&amp;quot;&amp;gt;&lt;br /&gt;
\begin{enumerate}&lt;br /&gt;
    \item Re\v siti sistem jedna\v cina na \textit{dva na\v cina}, kori\v s\&#039; cenjem inverzne matrice i \\ primenom Kramerovih pravila:&lt;br /&gt;
    \begin{align*}&lt;br /&gt;
        2x + 3y - 5z &amp;amp;= -7 \\&lt;br /&gt;
        -3x + 2y + z &amp;amp;= -9 \\&lt;br /&gt;
        4x - y + 2z &amp;amp;= 17&lt;br /&gt;
    \end{align*}&lt;br /&gt;
&lt;br /&gt;
    \item Izra\v cunati integral&lt;br /&gt;
    \begin{equation}&lt;br /&gt;
        I = \int_{0}^{\frac{\pi}{2}} \frac{dx}{2\sin{x} + 3\cos{x}}&lt;br /&gt;
    \end{equation}&lt;br /&gt;
\end{enumerate}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. задатак ===&lt;br /&gt;
==== Postavka ====&lt;br /&gt;
Написати команде у GNU Octave којима се:&lt;br /&gt;
* дефинише функција &amp;lt;math&amp;gt;f(x) = \frac{\cos^2{x}}{1+\sin^2{x}}&amp;lt;/math&amp;gt;;&lt;br /&gt;
* црта график функције &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* израчунава вредност интеграла &amp;lt;math&amp;gt;I = \int_0^{\pi} f(x) dx &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Rešenje ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang = &amp;quot;octave&amp;quot;&amp;gt;&lt;br /&gt;
pkg load symbolic&lt;br /&gt;
&lt;br /&gt;
syms x&lt;br /&gt;
&lt;br /&gt;
f = cos(x)^2 / (1+sin(x)^2)&lt;br /&gt;
&lt;br /&gt;
fh = function_handle(f);&lt;br /&gt;
&lt;br /&gt;
x_val = linspace(-10, 10, 1000);&lt;br /&gt;
y_val = fh(x_val);&lt;br /&gt;
&lt;br /&gt;
plot(x_val, y_val)&lt;br /&gt;
xlabel(&amp;quot;x&amp;quot;)&lt;br /&gt;
ylabel(&amp;quot;f(x)&amp;quot;)&lt;br /&gt;
title(&amp;quot;Grafik:&amp;quot;)&lt;br /&gt;
legend(&amp;quot;f(x)&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
int_f = int(f, x, 0, pi);&lt;br /&gt;
double(int_f)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. задатак ===&lt;br /&gt;
==== Postavka ====&lt;br /&gt;
Лапласова трансформација функције &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; се дефинише на следећи начин: &amp;lt;math&amp;gt;L(s) = \int_0^{+\infty} f(t) e^{-st} dt&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Написати команде у &#039;&#039;SageMath&#039;&#039; којима се одређује Лапласова трансформација функције &amp;lt;math&amp;gt;f(t) = 5te^{t-3}&amp;lt;/math&amp;gt;. (Напомена: претпоставити да је &amp;lt;math&amp;gt;s&amp;gt;1&amp;lt;/math&amp;gt;.)&lt;br /&gt;
&lt;br /&gt;
==== Rešenje ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang = &amp;quot;octave&amp;quot;&amp;gt;&lt;br /&gt;
pkg load symbolic&lt;br /&gt;
syms t s&lt;br /&gt;
f = 5*t*exp(t - 3);&lt;br /&gt;
L = laplace(f, t, s)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 4. задатак ===&lt;br /&gt;
==== Postavka ====&lt;br /&gt;
Написати команде у Python-у којима се одређују тангента и нормала функције &amp;lt;math&amp;gt;f(x) = x^2-3x+2&amp;lt;/math&amp;gt; у тачки (2,0).&lt;br /&gt;
&lt;br /&gt;
Написати команде у Python-у за цртање дате параболе и њене тангенте.&lt;br /&gt;
&lt;br /&gt;
==== Rešenje ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang = &amp;quot;octave&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import sympy as sp&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
x = sp.Symbol(&#039;x&#039;)&lt;br /&gt;
f = x**2 - 3*x + 2&lt;br /&gt;
x0 = 0&lt;br /&gt;
y0 = 2&lt;br /&gt;
&lt;br /&gt;
der = sp.diff(f, x)&lt;br /&gt;
slope = der.subs(x, x0)&lt;br /&gt;
tangent = slope*(x - x0) + y0&lt;br /&gt;
&lt;br /&gt;
f_num = sp.lambdify(x, f, &amp;quot;numpy&amp;quot;)&lt;br /&gt;
tangent_num = sp.lambdify(x, tangent, &amp;quot;numpy&amp;quot;)&lt;br /&gt;
x_vals = np.linspace(-2, 3, 400)&lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize=(7, 5))&lt;br /&gt;
plt.plot(x_vals, f_num(x_vals), label=r&amp;quot;$f(x) = x^2 - 3x + 2$&amp;quot;)&lt;br /&gt;
plt.plot(x_vals, tangent_num(x_vals), &amp;quot;--&amp;quot;, label=&amp;quot;Tangenta&amp;quot;)&lt;br /&gt;
plt.scatter(x0, y0)&lt;br /&gt;
&lt;br /&gt;
plt.xlabel(&amp;quot;x&amp;quot;)&lt;br /&gt;
plt.ylabel(&amp;quot;y&amp;quot;)&lt;br /&gt;
plt.title(&amp;quot;Grafik funkcije i tangente&amp;quot;)&lt;br /&gt;
plt.legend()&lt;br /&gt;
plt.grid(True)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 5. задатак ===&lt;br /&gt;
==== Postavka ====&lt;br /&gt;
Написати команде у Python-у које решавају задати систем једначина на два начина, симболички и нумерички.&lt;br /&gt;
* &amp;lt;math&amp;gt;2x+3y-5z = -7&amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;-3x+2y+z = -9&amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;4x-y+2z = 17&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Rešenje ====&lt;br /&gt;
&lt;br /&gt;
== Напомене ==&lt;br /&gt;
* За ствари које нису писале у материјалима, признавано је било шта.&lt;br /&gt;
* За &#039;&#039;Octave&#039;&#039;, уколико се дефинише функција, мора се у коментару нагласти да се то ради у посебном фајлу који се зове као функција, иначе -1 поен.&lt;br /&gt;
* Иако је при обиласку рекла да је то у реду, професорка је скинула поене за писање ошишаном латиницом у задатку са &#039;&#039;LaTeX&#039;&#039;-ом.&lt;br /&gt;
* За не дефинисање симбола у Пајтону скидан је један поен.&lt;br /&gt;
&lt;br /&gt;
[[Категорија:ПРМ]]&lt;br /&gt;
[[Категорија:Рокови]]&lt;/div&gt;</summary>
		<author><name>Sirenfia</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9F%D0%A0%D0%9C/%D0%9F%D1%80%D0%B5%D0%B4%D1%80%D0%BE%D0%BA_2022&amp;diff=8249</id>
		<title>ПРМ/Предрок 2022</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9F%D0%A0%D0%9C/%D0%9F%D1%80%D0%B5%D0%B4%D1%80%D0%BE%D0%BA_2022&amp;diff=8249"/>
		<updated>2026-02-08T16:18:33Z</updated>

		<summary type="html">&lt;p&gt;Sirenfia: /* Rešenje */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
{{нерешено}}&lt;br /&gt;
&#039;&#039;&#039;Предрок 2022. године&#039;&#039;&#039; је одржан 3. децембра у сали 70. Постојала је могућност изласка на испит и у јануарском року за студенте незадовољне оценом. Испит је рађен на &#039;&#039;Moodle&#039;&#039; платформи, без доступних окружења уз доступне материјале са предавања.&lt;br /&gt;
&lt;br /&gt;
== Задаци ==&lt;br /&gt;
=== 1. задатак ===&lt;br /&gt;
==== Postavka ====&lt;br /&gt;
Написати команде у Латеху којима се реконструише текст и форматирање са слике испод (овде преписано као текст).&lt;br /&gt;
# Rešiti sistem jednačina na &#039;&#039;dva načina&#039;&#039;, korišćenjem inverzne matrice i primenom Kramerovih pravila:&lt;br /&gt;
#: &amp;lt;div class=&amp;quot;center&amp;quot;&amp;gt;&amp;lt;math&amp;gt;2x +3y - 5z = -7&amp;lt;/math&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
#: &amp;lt;div class=&amp;quot;center&amp;quot;&amp;gt;&amp;lt;math&amp;gt;-3x +2y - z = -9&amp;lt;/math&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
#: &amp;lt;div class=&amp;quot;center&amp;quot;&amp;gt;&amp;lt;math&amp;gt;4x -y +  2z = 17&amp;lt;/math&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
#: (z и решење треба да буду поравнати).&lt;br /&gt;
# Izračunati integral:&lt;br /&gt;
#: &amp;lt;div class=&amp;quot;center&amp;quot;&amp;gt;&amp;lt;math&amp;gt;I = \int_0^{\frac{\pi}{2}} \frac{dx}{2 \sin{x} + 3 \cos{x}}.                                             (1)&amp;lt;/math&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Rešenje ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;latex&amp;quot;&amp;gt;&lt;br /&gt;
\begin{enumerate}&lt;br /&gt;
    \item Re\v siti sistem jedna\v cina na \textit{dva na\v cina}, kori\v s\&#039; cenjem inverzne matrice i \\ primenom Kramerovih pravila:&lt;br /&gt;
    \begin{align*}&lt;br /&gt;
        2x + 3y - 5z &amp;amp;= -7 \\&lt;br /&gt;
        -3x + 2y + z &amp;amp;= -9 \\&lt;br /&gt;
        4x - y + 2z &amp;amp;= 17&lt;br /&gt;
    \end{align*}&lt;br /&gt;
&lt;br /&gt;
    \item Izra\v cunati integral&lt;br /&gt;
    \begin{equation}&lt;br /&gt;
        I = \int_{0}^{\frac{\pi}{2}} \frac{dx}{2\sin{x} + 3\cos{x}}&lt;br /&gt;
    \end{equation}&lt;br /&gt;
\end{enumerate}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. задатак ===&lt;br /&gt;
==== Postavka ====&lt;br /&gt;
Написати команде у GNU Octave којима се:&lt;br /&gt;
* дефинише функција &amp;lt;math&amp;gt;f(x) = \frac{\cos^2{x}}{1+\sin^2{x}}&amp;lt;/math&amp;gt;;&lt;br /&gt;
* црта график функције &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* израчунава вредност интеграла &amp;lt;math&amp;gt;I = \int_0^{\pi} f(x) dx &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Rešenje ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang = &amp;quot;octave&amp;quot;&amp;gt;&lt;br /&gt;
pkg load symbolic&lt;br /&gt;
&lt;br /&gt;
syms x&lt;br /&gt;
&lt;br /&gt;
f = cos(x)^2 / (1+sin(x)^2)&lt;br /&gt;
&lt;br /&gt;
fh = function_handle(f);&lt;br /&gt;
&lt;br /&gt;
x_val = linspace(-10, 10, 1000);&lt;br /&gt;
y_val = fh(x_val);&lt;br /&gt;
&lt;br /&gt;
plot(x_val, y_val)&lt;br /&gt;
xlabel(&amp;quot;x&amp;quot;)&lt;br /&gt;
ylabel(&amp;quot;f(x)&amp;quot;)&lt;br /&gt;
title(&amp;quot;Grafik:&amp;quot;)&lt;br /&gt;
legend(&amp;quot;f(x)&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
int_f = int(f, x, 0, pi);&lt;br /&gt;
double(int_f)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. задатак ===&lt;br /&gt;
==== Postavka ====&lt;br /&gt;
Лапласова трансформација функције &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; се дефинише на следећи начин: &amp;lt;math&amp;gt;L(s) = \int_0^{+\infty} f(t) e^{-st} dt&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Написати команде у &#039;&#039;SageMath&#039;&#039; којима се одређује Лапласова трансформација функције &amp;lt;math&amp;gt;f(t) = 5te^{t-3}&amp;lt;/math&amp;gt;. (Напомена: претпоставити да је &amp;lt;math&amp;gt;s&amp;gt;1&amp;lt;/math&amp;gt;.)&lt;br /&gt;
&lt;br /&gt;
==== Rešenje ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang = &amp;quot;octave&amp;quot;&amp;gt;&lt;br /&gt;
pkg load symbolic&lt;br /&gt;
syms t s&lt;br /&gt;
f = 5*t*exp(t - 3);&lt;br /&gt;
L = laplace(f, t, s)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 4. задатак ===&lt;br /&gt;
==== Postavka ====&lt;br /&gt;
Написати команде у Python-у којима се одређују тангента и нормала функције &amp;lt;math&amp;gt;f(x) = x^2-3x+2&amp;lt;/math&amp;gt; у тачки (2,0).&lt;br /&gt;
&lt;br /&gt;
Написати команде у Python-у за цртање дате параболе и њене тангенте.&lt;br /&gt;
&lt;br /&gt;
==== Rešenje ====&lt;br /&gt;
&lt;br /&gt;
=== 5. задатак ===&lt;br /&gt;
==== Postavka ====&lt;br /&gt;
Написати команде у Python-у које решавају задати систем једначина на два начина, симболички и нумерички.&lt;br /&gt;
* &amp;lt;math&amp;gt;2x+3y-5z = -7&amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;-3x+2y+z = -9&amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;4x-y+2z = 17&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Rešenje ====&lt;br /&gt;
&lt;br /&gt;
== Напомене ==&lt;br /&gt;
* За ствари које нису писале у материјалима, признавано је било шта.&lt;br /&gt;
* За &#039;&#039;Octave&#039;&#039;, уколико се дефинише функција, мора се у коментару нагласти да се то ради у посебном фајлу који се зове као функција, иначе -1 поен.&lt;br /&gt;
* Иако је при обиласку рекла да је то у реду, професорка је скинула поене за писање ошишаном латиницом у задатку са &#039;&#039;LaTeX&#039;&#039;-ом.&lt;br /&gt;
* За не дефинисање симбола у Пајтону скидан је један поен.&lt;br /&gt;
&lt;br /&gt;
[[Категорија:ПРМ]]&lt;br /&gt;
[[Категорија:Рокови]]&lt;/div&gt;</summary>
		<author><name>Sirenfia</name></author>
	</entry>
</feed>