<?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=Aleksa</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=Aleksa"/>
	<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/Aleksa"/>
	<updated>2026-06-04T02:15:09Z</updated>
	<subtitle>Кориснички доприноси</subtitle>
	<generator>MediaWiki 1.39.8</generator>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9D%D0%90%D0%94/%D0%9F%D1%80%D0%B5%D0%B4%D0%B8%D1%81%D0%BF%D0%B8%D1%82%D0%BD%D0%B5_%D0%BE%D0%B1%D0%B0%D0%B2%D0%B5%D0%B7%D0%B5_2025_2026&amp;diff=8298</id>
		<title>НАД/Предиспитне обавезе 2025 2026</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9D%D0%90%D0%94/%D0%9F%D1%80%D0%B5%D0%B4%D0%B8%D1%81%D0%BF%D0%B8%D1%82%D0%BD%D0%B5_%D0%BE%D0%B1%D0%B0%D0%B2%D0%B5%D0%B7%D0%B5_2025_2026&amp;diff=8298"/>
		<updated>2026-02-25T21:51:48Z</updated>

		<summary type="html">&lt;p&gt;Aleksa: /* Поставка */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&#039;&#039;&#039;Предиспитне обавезе 2025/26. године&#039;&#039;&#039; за одсек РТИ. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Напомена:&#039;&#039;&#039; &#039;&#039;Moodle&#039;&#039; насумично бира 3 задатка из велике базе задатака, тако да је могућа комбинација било којих од ових задатака (а и оних који се не налазе овде).  &lt;br /&gt;
&lt;br /&gt;
== Верзија 1 ==&lt;br /&gt;
=== 1. задатак ===&lt;br /&gt;
==== Поставка ====&lt;br /&gt;
Јакобијевом итеративном методом решити систем линеарних једначина. Одговор уписати са 6 децимала.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;100x_1-24x_2+48x_3-23x_4=39&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;5x_1+100x_2-44x_3-31x_4=72&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;10x_1-3x_2+100x_3+55x_4=56&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;-12x_1+7x_2-11x_3+100x_4=47&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
==== Решење ====&lt;br /&gt;
&lt;br /&gt;
=== 2. задатак ===&lt;br /&gt;
Исти задатак као [[НАД/Предиспитне_обавезе_2021#2._задатак_5|верзија 5 - задатак 2 из 2021. године]]&lt;br /&gt;
&lt;br /&gt;
=== 3. задатак ===&lt;br /&gt;
==== Поставка ====&lt;br /&gt;
Израчунати интеграл &amp;lt;math&amp;gt;\int\limits_{-1}^{2} (x+\sin{x})dx&amp;lt;/math&amp;gt; трапезном квадратурном формулом са тачношћу &amp;lt;math&amp;gt;10^{-3}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Решење ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Верзија 2 ==&lt;br /&gt;
=== 1. задатак ===&lt;br /&gt;
Исти задатак као [[НАД/Предиспитне_обавезе_2021#1._задатак_4|верзија 4 - задатак 1 из 2021. године]]&lt;br /&gt;
&lt;br /&gt;
=== 2. задатак ===&lt;br /&gt;
==== Поставка ====&lt;br /&gt;
Функцију &amp;lt;math&amp;gt;f(x)=\frac{x\ln{x}}{x^2+1}&amp;lt;/math&amp;gt;, табелирати на интервалу &amp;lt;math&amp;gt;[1.5, 2.3]&amp;lt;/math&amp;gt; са кораком &amp;lt;math&amp;gt;h=0.1&amp;lt;/math&amp;gt;. Израчунати &amp;lt;math&amp;gt;f(1.55)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;f&#039;(1.55)&amp;lt;/math&amp;gt; формирањем интерполационог полинома 3. степена. Одговор уписати са &amp;lt;math&amp;gt;4&amp;lt;/math&amp;gt; децимале.&lt;br /&gt;
&lt;br /&gt;
==== Решење ====&lt;br /&gt;
&lt;br /&gt;
=== 3. задатак ===&lt;br /&gt;
Исти задатак као [[НАД/Предиспитне_обавезе_2021#3._задатак_3|верзија 3 - задатак 3 из 2021. године]]&lt;br /&gt;
&lt;br /&gt;
== Верзија 3 ==&lt;br /&gt;
=== 1. задатак ===&lt;br /&gt;
==== Поставка ====&lt;br /&gt;
Методом сечице, са тачношћу &amp;lt;math&amp;gt;0,5*10^{-4}&amp;lt;/math&amp;gt;, одредити веће позитивно решење једначине &amp;lt;math&amp;gt;x^2-5\sqrt[3]{x}+1=0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Решење ====&lt;br /&gt;
&lt;br /&gt;
=== 2. задатак ===&lt;br /&gt;
==== Поставка ====&lt;br /&gt;
Функцију &amp;lt;math&amp;gt;f(x)=\sqrt{x^2+1}&amp;lt;/math&amp;gt; табелирати на интервалу &amp;lt;math&amp;gt;[0, 2]&amp;lt;/math&amp;gt; са кораком &amp;lt;math&amp;gt;h=0.25&amp;lt;/math&amp;gt;. Израчунати &amp;lt;math&amp;gt;f(1.97)&amp;lt;/math&amp;gt; користећи одговарајући Њутнов интерполациони полином трећег степена. Одредити оцену грешке у тачки &amp;lt;math&amp;gt;1.97&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Сличан задатак се појавио у [[НАД/Предиспитне_обавезе_2021#2._задатак_6|верзији 6 - задатак 2 из 2021. године]]&lt;br /&gt;
&lt;br /&gt;
==== Решење ====&lt;br /&gt;
&lt;br /&gt;
=== 3. задатак ===&lt;br /&gt;
==== Поставка ====&lt;br /&gt;
Израчунати интеграл &amp;lt;math&amp;gt;\int\limits_{0}^{1} \sin(\pi x) dx&amp;lt;/math&amp;gt; Симпсоновом квадратном формулом са тачношћу &amp;lt;math&amp;gt;10^{-5}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Решење ====&lt;br /&gt;
&lt;br /&gt;
[[Категорија:НАД]]&lt;br /&gt;
[[Категорија:Рокови]]&lt;/div&gt;</summary>
		<author><name>Aleksa</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9D%D0%90%D0%94/%D0%9F%D1%80%D0%B5%D0%B4%D0%B8%D1%81%D0%BF%D0%B8%D1%82%D0%BD%D0%B5_%D0%BE%D0%B1%D0%B0%D0%B2%D0%B5%D0%B7%D0%B5_2025_2026&amp;diff=8297</id>
		<title>НАД/Предиспитне обавезе 2025 2026</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9D%D0%90%D0%94/%D0%9F%D1%80%D0%B5%D0%B4%D0%B8%D1%81%D0%BF%D0%B8%D1%82%D0%BD%D0%B5_%D0%BE%D0%B1%D0%B0%D0%B2%D0%B5%D0%B7%D0%B5_2025_2026&amp;diff=8297"/>
		<updated>2026-02-25T21:51:12Z</updated>

		<summary type="html">&lt;p&gt;Aleksa: /* Поставка */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&#039;&#039;&#039;Предиспитне обавезе 2025/26. године&#039;&#039;&#039; за одсек РТИ. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Напомена:&#039;&#039;&#039; &#039;&#039;Moodle&#039;&#039; насумично бира 3 задатка из велике базе задатака, тако да је могућа комбинација било којих од ових задатака (а и оних који се не налазе овде).  &lt;br /&gt;
&lt;br /&gt;
== Верзија 1 ==&lt;br /&gt;
=== 1. задатак ===&lt;br /&gt;
==== Поставка ====&lt;br /&gt;
Јакобијевом итеративном методом решити систем линеарних једначина. Одговор уписати са 6 децимала.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;100x_1-24x_2+48x_3-23x_4=39&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;5x_1+100x_2-44x_3-31x_4=72&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;10x_1-3x_2+100x_3+55x_4=56&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;-12x_1+7x_2-11x_3+100x_4=47&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
==== Решење ====&lt;br /&gt;
&lt;br /&gt;
=== 2. задатак ===&lt;br /&gt;
Исти задатак као [[НАД/Предиспитне_обавезе_2021#2._задатак_5|верзија 5 - задатак 2 из 2021. године]]&lt;br /&gt;
&lt;br /&gt;
=== 3. задатак ===&lt;br /&gt;
==== Поставка ====&lt;br /&gt;
Израчунати интеграл &amp;lt;math&amp;gt;\int\limits_{-1}^{2} (x+\sin{x})dx&amp;lt;/math&amp;gt; трапезном квадратурном формулом са тачношћу &amp;lt;math&amp;gt;10^{-3}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Решење ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Верзија 2 ==&lt;br /&gt;
=== 1. задатак ===&lt;br /&gt;
Исти задатак као [[НАД/Предиспитне_обавезе_2021#1._задатак_4|верзија 4 - задатак 1 из 2021. године]]&lt;br /&gt;
&lt;br /&gt;
=== 2. задатак ===&lt;br /&gt;
==== Поставка ====&lt;br /&gt;
Функцију &amp;lt;math&amp;gt;f(x)=\frac{x\ln{x}}{x^2+1}&amp;lt;/math&amp;gt;, табелирати на интервалу &amp;lt;math&amp;gt;[1.5, 2.3]&amp;lt;/math&amp;gt; са кораком &amp;lt;math&amp;gt;h=0.1&amp;lt;/math&amp;gt;. Израчунати &amp;lt;math&amp;gt;f(1.55)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;f&#039;(1.55)&amp;lt;/math&amp;gt; формирањем интерполационог полинома 3. степена. Одговор уписати са &amp;lt;math&amp;gt;4&amp;lt;/math&amp;gt; децимале.&lt;br /&gt;
&lt;br /&gt;
==== Решење ====&lt;br /&gt;
&lt;br /&gt;
=== 3. задатак ===&lt;br /&gt;
Исти задатак као [[НАД/Предиспитне_обавезе_2021#3._задатак_3|верзија 3 - задатак 3 из 2021. године]]&lt;br /&gt;
&lt;br /&gt;
== Верзија 3 ==&lt;br /&gt;
=== 1. задатак ===&lt;br /&gt;
==== Поставка ====&lt;br /&gt;
Методом сечице, са тачношћу &amp;lt;math&amp;gt;0,5*10^{-4}&amp;lt;/math&amp;gt;, одредити веће позитивно решење једначине &amp;lt;math&amp;gt;x^2-5\sqrt[3]{x}+1=0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Решење ====&lt;br /&gt;
&lt;br /&gt;
=== 2. задатак ===&lt;br /&gt;
==== Поставка ====&lt;br /&gt;
Функцију &amp;lt;math&amp;gt;f(x)=\sqrt{x^2+1}&amp;lt;/math&amp;gt; табелирати на интервалу &amp;lt;math&amp;gt;[0, 2]&amp;lt;/math&amp;gt; са кораком &amp;lt;math&amp;gt;h=0.25&amp;lt;/math&amp;gt;. Израчунати &amp;lt;math&amp;gt;f(1.97)&amp;lt;/math&amp;gt; користећи одговарајући Њутнов интерполациони полином трећег степена. Одредити оцену грешке у тачки &amp;lt;math&amp;gt;1.97&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Сличан задатак се појавио у [[НАД/Предиспитне_обавезе_2021#6._задатак_2|верзији 6 - задатак 2 из 2021. године]]&lt;br /&gt;
&lt;br /&gt;
==== Решење ====&lt;br /&gt;
&lt;br /&gt;
=== 3. задатак ===&lt;br /&gt;
==== Поставка ====&lt;br /&gt;
Израчунати интеграл &amp;lt;math&amp;gt;\int\limits_{0}^{1} \sin(\pi x) dx&amp;lt;/math&amp;gt; Симпсоновом квадратном формулом са тачношћу &amp;lt;math&amp;gt;10^{-5}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Решење ====&lt;br /&gt;
&lt;br /&gt;
[[Категорија:НАД]]&lt;br /&gt;
[[Категорија:Рокови]]&lt;/div&gt;</summary>
		<author><name>Aleksa</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9D%D0%90%D0%94/%D0%9F%D1%80%D0%B5%D0%B4%D0%B8%D1%81%D0%BF%D0%B8%D1%82%D0%BD%D0%B5_%D0%BE%D0%B1%D0%B0%D0%B2%D0%B5%D0%B7%D0%B5_2025_2026&amp;diff=8296</id>
		<title>НАД/Предиспитне обавезе 2025 2026</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9D%D0%90%D0%94/%D0%9F%D1%80%D0%B5%D0%B4%D0%B8%D1%81%D0%BF%D0%B8%D1%82%D0%BD%D0%B5_%D0%BE%D0%B1%D0%B0%D0%B2%D0%B5%D0%B7%D0%B5_2025_2026&amp;diff=8296"/>
		<updated>2026-02-25T21:49:56Z</updated>

		<summary type="html">&lt;p&gt;Aleksa: /* Поставка */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&#039;&#039;&#039;Предиспитне обавезе 2025/26. године&#039;&#039;&#039; за одсек РТИ. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Напомена:&#039;&#039;&#039; &#039;&#039;Moodle&#039;&#039; насумично бира 3 задатка из велике базе задатака, тако да је могућа комбинација било којих од ових задатака (а и оних који се не налазе овде).  &lt;br /&gt;
&lt;br /&gt;
== Верзија 1 ==&lt;br /&gt;
=== 1. задатак ===&lt;br /&gt;
==== Поставка ====&lt;br /&gt;
Јакобијевом итеративном методом решити систем линеарних једначина. Одговор уписати са 6 децимала.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;100x_1-24x_2+48x_3-23x_4=39&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;5x_1+100x_2-44x_3-31x_4=72&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;10x_1-3x_2+100x_3+55x_4=56&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;-12x_1+7x_2-11x_3+100x_4=47&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
==== Решење ====&lt;br /&gt;
&lt;br /&gt;
=== 2. задатак ===&lt;br /&gt;
Исти задатак као [[НАД/Предиспитне_обавезе_2021#2._задатак_5|верзија 5 - задатак 2 из 2021. године]]&lt;br /&gt;
&lt;br /&gt;
=== 3. задатак ===&lt;br /&gt;
==== Поставка ====&lt;br /&gt;
Израчунати интеграл &amp;lt;math&amp;gt;\int\limits_{-1}^{2} (x+\sin{x})dx&amp;lt;/math&amp;gt; трапезном квадратурном формулом са тачношћу &amp;lt;math&amp;gt;10^{-3}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Решење ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Верзија 2 ==&lt;br /&gt;
=== 1. задатак ===&lt;br /&gt;
Исти задатак као [[НАД/Предиспитне_обавезе_2021#1._задатак_4|верзија 4 - задатак 1 из 2021. године]]&lt;br /&gt;
&lt;br /&gt;
=== 2. задатак ===&lt;br /&gt;
==== Поставка ====&lt;br /&gt;
Функцију &amp;lt;math&amp;gt;f(x)=\frac{x\ln{x}}{x^2+1}&amp;lt;/math&amp;gt;, табелирати на интервалу &amp;lt;math&amp;gt;[1.5, 2.3]&amp;lt;/math&amp;gt; са кораком &amp;lt;math&amp;gt;h=0.1&amp;lt;/math&amp;gt;. Израчунати &amp;lt;math&amp;gt;f(1.55)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;f&#039;(1.55)&amp;lt;/math&amp;gt; формирањем интерполационог полинома 3. степена. Одговор уписати са &amp;lt;math&amp;gt;4&amp;lt;/math&amp;gt; децимале.&lt;br /&gt;
&lt;br /&gt;
==== Решење ====&lt;br /&gt;
&lt;br /&gt;
=== 3. задатак ===&lt;br /&gt;
Исти задатак као [[НАД/Предиспитне_обавезе_2021#3._задатак_3|верзија 3 - задатак 3 из 2021. године]]&lt;br /&gt;
&lt;br /&gt;
== Верзија 3 ==&lt;br /&gt;
=== 1. задатак ===&lt;br /&gt;
==== Поставка ====&lt;br /&gt;
Методом сечице, са тачношћу &amp;lt;math&amp;gt;0,5*10^{-4}&amp;lt;/math&amp;gt;, одредити веће позитивно решење једначине &amp;lt;math&amp;gt;x^2-5\sqrt[3]{x}+1=0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Решење ====&lt;br /&gt;
&lt;br /&gt;
=== 2. задатак ===&lt;br /&gt;
==== Поставка ====&lt;br /&gt;
Функцију &amp;lt;math&amp;gt;f(x)=\sqrt{x^2+1}&amp;lt;/math&amp;gt; табелирати на интервалу &amp;lt;math&amp;gt;[0, 2]&amp;lt;/math&amp;gt; са кораком &amp;lt;math&amp;gt;h=0.25&amp;lt;/math&amp;gt;. Израчунати &amp;lt;math&amp;gt;f(1.97)&amp;lt;/math&amp;gt; користећи одговарајући Њутнов интерполациони полином трећег степена. Одредити оцену грешке у тачки &amp;lt;math&amp;gt;1.97&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Решење ====&lt;br /&gt;
&lt;br /&gt;
=== 3. задатак ===&lt;br /&gt;
==== Поставка ====&lt;br /&gt;
Израчунати интеграл &amp;lt;math&amp;gt;\int\limits_{0}^{1} \sin(\pi x) dx&amp;lt;/math&amp;gt; Симпсоновом квадратном формулом са тачношћу &amp;lt;math&amp;gt;10^{-5}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Решење ====&lt;br /&gt;
&lt;br /&gt;
[[Категорија:НАД]]&lt;br /&gt;
[[Категорија:Рокови]]&lt;/div&gt;</summary>
		<author><name>Aleksa</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9D%D0%90%D0%94/%D0%9F%D1%80%D0%B5%D0%B4%D0%B8%D1%81%D0%BF%D0%B8%D1%82%D0%BD%D0%B5_%D0%BE%D0%B1%D0%B0%D0%B2%D0%B5%D0%B7%D0%B5_2025_2026&amp;diff=8295</id>
		<title>НАД/Предиспитне обавезе 2025 2026</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9D%D0%90%D0%94/%D0%9F%D1%80%D0%B5%D0%B4%D0%B8%D1%81%D0%BF%D0%B8%D1%82%D0%BD%D0%B5_%D0%BE%D0%B1%D0%B0%D0%B2%D0%B5%D0%B7%D0%B5_2025_2026&amp;diff=8295"/>
		<updated>2026-02-25T21:49:35Z</updated>

		<summary type="html">&lt;p&gt;Aleksa: /* Верзија 2 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&#039;&#039;&#039;Предиспитне обавезе 2025/26. године&#039;&#039;&#039; за одсек РТИ. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Напомена:&#039;&#039;&#039; &#039;&#039;Moodle&#039;&#039; насумично бира 3 задатка из велике базе задатака, тако да је могућа комбинација било којих од ових задатака (а и оних који се не налазе овде).  &lt;br /&gt;
&lt;br /&gt;
== Верзија 1 ==&lt;br /&gt;
=== 1. задатак ===&lt;br /&gt;
==== Поставка ====&lt;br /&gt;
Јакобијевом итеративном методом решити систем линеарних једначина. Одговор уписати са 6 децимала.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;100x_1-24x_2+48x_3-23x_4=39&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;5x_1+100x_2-44x_3-31x_4=72&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;10x_1-3x_2+100x_3+55x_4=56&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;-12x_1+7x_2-11x_3+100x_4=47&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
==== Решење ====&lt;br /&gt;
&lt;br /&gt;
=== 2. задатак ===&lt;br /&gt;
Исти задатак као [[НАД/Предиспитне_обавезе_2021#2._задатак_5|верзија 5 - задатак 2 из 2021. године]]&lt;br /&gt;
&lt;br /&gt;
=== 3. задатак ===&lt;br /&gt;
==== Поставка ====&lt;br /&gt;
Израчунати интеграл &amp;lt;math&amp;gt;\int\limits_{-1}^{2} (x+\sin{x})dx&amp;lt;/math&amp;gt; трапезном квадратурном формулом са тачношћу &amp;lt;math&amp;gt;10^{-3}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Решење ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Верзија 2 ==&lt;br /&gt;
=== 1. задатак ===&lt;br /&gt;
Исти задатак као [[НАД/Предиспитне_обавезе_2021#1._задатак_4|верзија 4 - задатак 1 из 2021. године]]&lt;br /&gt;
&lt;br /&gt;
=== 2. задатак ===&lt;br /&gt;
==== Поставка ====&lt;br /&gt;
Функцију &amp;lt;math&amp;gt;f(x)=\frac{x\ln{x}}{x^2+1}&amp;lt;/math&amp;gt;, табелирати на интервалу &amp;lt;math&amp;gt;[1.5, 2.3]&amp;lt;/math&amp;gt; са кораком &amp;lt;math&amp;gt;h=0.1&amp;lt;/math&amp;gt;. Израчунати &amp;lt;math&amp;gt;f(1.55)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;f&#039;(1.55)&amp;lt;/math&amp;gt; формирањем интерполационог полинома 3. степена. Одговор уписати са &amp;lt;math&amp;gt;4&amp;lt;/math&amp;gt; децимале.&lt;br /&gt;
&lt;br /&gt;
==== Решење ====&lt;br /&gt;
&lt;br /&gt;
=== 3. задатак ===&lt;br /&gt;
Исти задатак као [[НАД/Предиспитне_обавезе_2021#3._задатак_3|верзија 3 - задатак 3 из 2021. године]]&lt;br /&gt;
&lt;br /&gt;
== Верзија 3 ==&lt;br /&gt;
=== 1. задатак ===&lt;br /&gt;
==== Поставка ====&lt;br /&gt;
Методом сечице, са тачношћу &amp;lt;math&amp;gt;0,5*10^{-4}&amp;lt;/math&amp;gt;, одредити веће позитивно решење једначине &amp;lt;math&amp;gt;x^2-5\sqrt[3]{x}+1=0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Решење ====&lt;br /&gt;
&lt;br /&gt;
=== 2. задатак ===&lt;br /&gt;
==== Поставка ====&lt;br /&gt;
Функцију &amp;lt;math&amp;gt;f(x)=\sqrt{x^2+1}&amp;lt;/math&amp;gt; табелирати на интервалу &amp;lt;math&amp;gt;[0, 2]&amp;lt;/math&amp;gt; са кораком &amp;lt;math&amp;gt;h=0.25&amp;lt;/math&amp;gt;. Израчунати &amp;lt;math&amp;gt;f(1.97)&amp;lt;/math&amp;gt; користећи одговарајући Њутнов интерполациони полином трећег степена. Одредити оцену грешке у тачки &amp;lt;math&amp;gt;1.97&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Решење ====&lt;br /&gt;
&lt;br /&gt;
=== 3. задатак ===&lt;br /&gt;
==== Поставка ====&lt;br /&gt;
Израчунати интеграл &amp;lt;math&amp;gt;\int\limits_{0}^{1} \sin(\pi x) dx&amp;lt;/math&amp;gt; Симпсоновом квадратном формулом са тачношћу &amp;lt;math&amp;gt;10^{-5}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Решење ====&lt;br /&gt;
&lt;br /&gt;
[[Категорија:НАД]]&lt;br /&gt;
[[Категорија:Рокови]]&lt;/div&gt;</summary>
		<author><name>Aleksa</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9D%D0%90%D0%94/%D0%9F%D1%80%D0%B5%D0%B4%D0%B8%D1%81%D0%BF%D0%B8%D1%82%D0%BD%D0%B5_%D0%BE%D0%B1%D0%B0%D0%B2%D0%B5%D0%B7%D0%B5_2025_2026&amp;diff=8294</id>
		<title>НАД/Предиспитне обавезе 2025 2026</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9D%D0%90%D0%94/%D0%9F%D1%80%D0%B5%D0%B4%D0%B8%D1%81%D0%BF%D0%B8%D1%82%D0%BD%D0%B5_%D0%BE%D0%B1%D0%B0%D0%B2%D0%B5%D0%B7%D0%B5_2025_2026&amp;diff=8294"/>
		<updated>2026-02-25T21:48:14Z</updated>

		<summary type="html">&lt;p&gt;Aleksa: /* Верзија 2 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&#039;&#039;&#039;Предиспитне обавезе 2025/26. године&#039;&#039;&#039; за одсек РТИ. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Напомена:&#039;&#039;&#039; &#039;&#039;Moodle&#039;&#039; насумично бира 3 задатка из велике базе задатака, тако да је могућа комбинација било којих од ових задатака (а и оних који се не налазе овде).  &lt;br /&gt;
&lt;br /&gt;
== Верзија 1 ==&lt;br /&gt;
=== 1. задатак ===&lt;br /&gt;
==== Поставка ====&lt;br /&gt;
Јакобијевом итеративном методом решити систем линеарних једначина. Одговор уписати са 6 децимала.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;100x_1-24x_2+48x_3-23x_4=39&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;5x_1+100x_2-44x_3-31x_4=72&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;10x_1-3x_2+100x_3+55x_4=56&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;-12x_1+7x_2-11x_3+100x_4=47&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
==== Решење ====&lt;br /&gt;
&lt;br /&gt;
=== 2. задатак ===&lt;br /&gt;
Исти задатак као [[НАД/Предиспитне_обавезе_2021#2._задатак_5|верзија 5 - задатак 2 из 2021. године]]&lt;br /&gt;
&lt;br /&gt;
=== 3. задатак ===&lt;br /&gt;
==== Поставка ====&lt;br /&gt;
Израчунати интеграл &amp;lt;math&amp;gt;\int\limits_{-1}^{2} (x+\sin{x})dx&amp;lt;/math&amp;gt; трапезном квадратурном формулом са тачношћу &amp;lt;math&amp;gt;10^{-3}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Решење ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Верзија 2 ==&lt;br /&gt;
=== 1. задатак ===&lt;br /&gt;
Исти задатак као [[НАД/Предиспитне_обавезе_2021#1._задатак_4|верзија 4 - задатак 1 из 2021. године]]&lt;br /&gt;
&lt;br /&gt;
=== 2. задатак ===&lt;br /&gt;
==== Поставка ====&lt;br /&gt;
Функцију &amp;lt;math&amp;gt;f(x)=\frac{x\ln{x}}{x^2+1}&amp;lt;/math&amp;gt;, табелирати на интервалу &amp;lt;math&amp;gt;[1.5, 2.3]&amp;lt;/math&amp;gt; са кораком &amp;lt;math&amp;gt;h=0.1&amp;lt;/math&amp;gt;. Израчунати &amp;lt;math&amp;gt;f(1.55)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;f&#039;(1.55)&amp;lt;/math&amp;gt; формирањем интерполационог полинома 3. степена. Одговор уписати са &amp;lt;math&amp;gt;4&amp;lt;/math&amp;gt; децимале.&lt;br /&gt;
&lt;br /&gt;
==== Решење ====&lt;br /&gt;
&lt;br /&gt;
=== 3. задатак ===&lt;br /&gt;
==== Поставка ====&lt;br /&gt;
Израчунати интеграл &amp;lt;math&amp;gt;\int\limits_{0}^{1} \sin(\pi x) dx&amp;lt;/math&amp;gt; Симпсоновом квадратном формулом са тачношћу &amp;lt;math&amp;gt;10^{-5}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Решење ====&lt;br /&gt;
&lt;br /&gt;
== Верзија 3 ==&lt;br /&gt;
=== 1. задатак ===&lt;br /&gt;
==== Поставка ====&lt;br /&gt;
Методом сечице, са тачношћу &amp;lt;math&amp;gt;0,5*10^{-4}&amp;lt;/math&amp;gt;, одредити веће позитивно решење једначине &amp;lt;math&amp;gt;x^2-5\sqrt[3]{x}+1=0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Решење ====&lt;br /&gt;
&lt;br /&gt;
=== 2. задатак ===&lt;br /&gt;
==== Поставка ====&lt;br /&gt;
Функцију &amp;lt;math&amp;gt;f(x)=\sqrt{x^2+1}&amp;lt;/math&amp;gt; табелирати на интервалу &amp;lt;math&amp;gt;[0, 2]&amp;lt;/math&amp;gt; са кораком &amp;lt;math&amp;gt;h=0.25&amp;lt;/math&amp;gt;. Израчунати &amp;lt;math&amp;gt;f(1.97)&amp;lt;/math&amp;gt; користећи одговарајући Њутнов интерполациони полином трећег степена. Одредити оцену грешке у тачки &amp;lt;math&amp;gt;1.97&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Решење ====&lt;br /&gt;
&lt;br /&gt;
=== 3. задатак ===&lt;br /&gt;
==== Поставка ====&lt;br /&gt;
Израчунати интеграл &amp;lt;math&amp;gt;\int\limits_{0}^{1} \sin(\pi x) dx&amp;lt;/math&amp;gt; Симпсоновом квадратном формулом са тачношћу &amp;lt;math&amp;gt;10^{-5}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Решење ====&lt;br /&gt;
&lt;br /&gt;
[[Категорија:НАД]]&lt;br /&gt;
[[Категорија:Рокови]]&lt;/div&gt;</summary>
		<author><name>Aleksa</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9D%D0%90%D0%94/%D0%9F%D1%80%D0%B5%D0%B4%D0%B8%D1%81%D0%BF%D0%B8%D1%82%D0%BD%D0%B5_%D0%BE%D0%B1%D0%B0%D0%B2%D0%B5%D0%B7%D0%B5_2025_2026&amp;diff=8293</id>
		<title>НАД/Предиспитне обавезе 2025 2026</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9D%D0%90%D0%94/%D0%9F%D1%80%D0%B5%D0%B4%D0%B8%D1%81%D0%BF%D0%B8%D1%82%D0%BD%D0%B5_%D0%BE%D0%B1%D0%B0%D0%B2%D0%B5%D0%B7%D0%B5_2025_2026&amp;diff=8293"/>
		<updated>2026-02-25T21:47:14Z</updated>

		<summary type="html">&lt;p&gt;Aleksa: /* 1. задатак */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&#039;&#039;&#039;Предиспитне обавезе 2025/26. године&#039;&#039;&#039; за одсек РТИ. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Напомена:&#039;&#039;&#039; &#039;&#039;Moodle&#039;&#039; насумично бира 3 задатка из велике базе задатака, тако да је могућа комбинација било којих од ових задатака (а и оних који се не налазе овде).  &lt;br /&gt;
&lt;br /&gt;
== Верзија 1 ==&lt;br /&gt;
=== 1. задатак ===&lt;br /&gt;
==== Поставка ====&lt;br /&gt;
Јакобијевом итеративном методом решити систем линеарних једначина. Одговор уписати са 6 децимала.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;100x_1-24x_2+48x_3-23x_4=39&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;5x_1+100x_2-44x_3-31x_4=72&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;10x_1-3x_2+100x_3+55x_4=56&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;-12x_1+7x_2-11x_3+100x_4=47&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
==== Решење ====&lt;br /&gt;
&lt;br /&gt;
=== 2. задатак ===&lt;br /&gt;
Исти задатак као [[НАД/Предиспитне_обавезе_2021#2._задатак_5|верзија 5 - задатак 2 из 2021. године]]&lt;br /&gt;
&lt;br /&gt;
=== 3. задатак ===&lt;br /&gt;
==== Поставка ====&lt;br /&gt;
Израчунати интеграл &amp;lt;math&amp;gt;\int\limits_{-1}^{2} (x+\sin{x})dx&amp;lt;/math&amp;gt; трапезном квадратурном формулом са тачношћу &amp;lt;math&amp;gt;10^{-3}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Решење ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Верзија 2 ==&lt;br /&gt;
=== 1. задатак ===&lt;br /&gt;
Исти задатак као [[НАД/Предиспитне_обавезе_2021#4._задатак_1|верзија 4 - задатак 1 из 2021. године]]&lt;br /&gt;
&lt;br /&gt;
=== 2. задатак ===&lt;br /&gt;
==== Поставка ====&lt;br /&gt;
Функцију &amp;lt;math&amp;gt;f(x)=\frac{x\ln{x}}{x^2+1}&amp;lt;/math&amp;gt;, табелирати на интервалу &amp;lt;math&amp;gt;[1.5, 2.3]&amp;lt;/math&amp;gt; са кораком &amp;lt;math&amp;gt;h=0.1&amp;lt;/math&amp;gt;. Израчунати &amp;lt;math&amp;gt;f(1.55)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;f&#039;(1.55)&amp;lt;/math&amp;gt; формирањем интерполационог полинома 3. степена. Одговор уписати са &amp;lt;math&amp;gt;4&amp;lt;/math&amp;gt; децимале.&lt;br /&gt;
&lt;br /&gt;
==== Решење ====&lt;br /&gt;
&lt;br /&gt;
=== 3. задатак ===&lt;br /&gt;
==== Поставка ====&lt;br /&gt;
Израчунати интеграл &amp;lt;math&amp;gt;\int\limits_{0}^{1} \sin(\pi x) dx&amp;lt;/math&amp;gt; Симпсоновом квадратном формулом са тачношћу &amp;lt;math&amp;gt;10^{-5}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Решење ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Верзија 3 ==&lt;br /&gt;
=== 1. задатак ===&lt;br /&gt;
==== Поставка ====&lt;br /&gt;
Методом сечице, са тачношћу &amp;lt;math&amp;gt;0,5*10^{-4}&amp;lt;/math&amp;gt;, одредити веће позитивно решење једначине &amp;lt;math&amp;gt;x^2-5\sqrt[3]{x}+1=0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Решење ====&lt;br /&gt;
&lt;br /&gt;
=== 2. задатак ===&lt;br /&gt;
==== Поставка ====&lt;br /&gt;
Функцију &amp;lt;math&amp;gt;f(x)=\sqrt{x^2+1}&amp;lt;/math&amp;gt; табелирати на интервалу &amp;lt;math&amp;gt;[0, 2]&amp;lt;/math&amp;gt; са кораком &amp;lt;math&amp;gt;h=0.25&amp;lt;/math&amp;gt;. Израчунати &amp;lt;math&amp;gt;f(1.97)&amp;lt;/math&amp;gt; користећи одговарајући Њутнов интерполациони полином трећег степена. Одредити оцену грешке у тачки &amp;lt;math&amp;gt;1.97&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Решење ====&lt;br /&gt;
&lt;br /&gt;
=== 3. задатак ===&lt;br /&gt;
==== Поставка ====&lt;br /&gt;
Израчунати интеграл &amp;lt;math&amp;gt;\int\limits_{0}^{1} \sin(\pi x) dx&amp;lt;/math&amp;gt; Симпсоновом квадратном формулом са тачношћу &amp;lt;math&amp;gt;10^{-5}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Решење ====&lt;br /&gt;
&lt;br /&gt;
[[Категорија:НАД]]&lt;br /&gt;
[[Категорија:Рокови]]&lt;/div&gt;</summary>
		<author><name>Aleksa</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9D%D0%90%D0%94/%D0%9F%D1%80%D0%B5%D0%B4%D0%B8%D1%81%D0%BF%D0%B8%D1%82%D0%BD%D0%B5_%D0%BE%D0%B1%D0%B0%D0%B2%D0%B5%D0%B7%D0%B5_2025_2026&amp;diff=8292</id>
		<title>НАД/Предиспитне обавезе 2025 2026</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9D%D0%90%D0%94/%D0%9F%D1%80%D0%B5%D0%B4%D0%B8%D1%81%D0%BF%D0%B8%D1%82%D0%BD%D0%B5_%D0%BE%D0%B1%D0%B0%D0%B2%D0%B5%D0%B7%D0%B5_2025_2026&amp;diff=8292"/>
		<updated>2026-02-25T21:46:07Z</updated>

		<summary type="html">&lt;p&gt;Aleksa: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&#039;&#039;&#039;Предиспитне обавезе 2025/26. године&#039;&#039;&#039; за одсек РТИ. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Напомена:&#039;&#039;&#039; &#039;&#039;Moodle&#039;&#039; насумично бира 3 задатка из велике базе задатака, тако да је могућа комбинација било којих од ових задатака (а и оних који се не налазе овде).  &lt;br /&gt;
&lt;br /&gt;
== Верзија 1 ==&lt;br /&gt;
=== 1. задатак ===&lt;br /&gt;
==== Поставка ====&lt;br /&gt;
Јакобијевом итеративном методом решити систем линеарних једначина. Одговор уписати са 6 децимала.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;100x_1-24x_2+48x_3-23x_4=39&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;5x_1+100x_2-44x_3-31x_4=72&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;10x_1-3x_2+100x_3+55x_4=56&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;-12x_1+7x_2-11x_3+100x_4=47&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
==== Решење ====&lt;br /&gt;
&lt;br /&gt;
=== 2. задатак ===&lt;br /&gt;
Исти задатак као [[НАД/Предиспитне_обавезе_2021#2._задатак_5|верзија 5 - задатак 2 из 2021. године]]&lt;br /&gt;
&lt;br /&gt;
=== 3. задатак ===&lt;br /&gt;
==== Поставка ====&lt;br /&gt;
Израчунати интеграл &amp;lt;math&amp;gt;\int\limits_{-1}^{2} (x+\sin{x})dx&amp;lt;/math&amp;gt; трапезном квадратурном формулом са тачношћу &amp;lt;math&amp;gt;10^{-3}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Решење ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Верзија 2 ==&lt;br /&gt;
=== 1. задатак ===&lt;br /&gt;
==== Поставка ====&lt;br /&gt;
Методом половљења интервала, са тачношћу &amp;lt;math&amp;gt;0,5*10^{-3}&amp;lt;/math&amp;gt;, решити једначину &amp;lt;math&amp;gt;x-2e^{-x}=0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Решење ====&lt;br /&gt;
&lt;br /&gt;
=== 2. задатак ===&lt;br /&gt;
==== Поставка ====&lt;br /&gt;
Функцију &amp;lt;math&amp;gt;f(x)=\frac{x\ln{x}}{x^2+1}&amp;lt;/math&amp;gt;, табелирати на интервалу &amp;lt;math&amp;gt;[1.5, 2.3]&amp;lt;/math&amp;gt; са кораком &amp;lt;math&amp;gt;h=0.1&amp;lt;/math&amp;gt;. Израчунати &amp;lt;math&amp;gt;f(1.55)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;f&#039;(1.55)&amp;lt;/math&amp;gt; формирањем интерполационог полинома 3. степена. Одговор уписати са &amp;lt;math&amp;gt;4&amp;lt;/math&amp;gt; децимале.&lt;br /&gt;
&lt;br /&gt;
==== Решење ====&lt;br /&gt;
&lt;br /&gt;
=== 3. задатак ===&lt;br /&gt;
==== Поставка ====&lt;br /&gt;
Израчунати интеграл &amp;lt;math&amp;gt;\int\limits_{0}^{1} \sin(\pi x) dx&amp;lt;/math&amp;gt; Симпсоновом квадратном формулом са тачношћу &amp;lt;math&amp;gt;10^{-5}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Решење ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Верзија 3 ==&lt;br /&gt;
=== 1. задатак ===&lt;br /&gt;
==== Поставка ====&lt;br /&gt;
Методом сечице, са тачношћу &amp;lt;math&amp;gt;0,5*10^{-4}&amp;lt;/math&amp;gt;, одредити веће позитивно решење једначине &amp;lt;math&amp;gt;x^2-5\sqrt[3]{x}+1=0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Решење ====&lt;br /&gt;
&lt;br /&gt;
=== 2. задатак ===&lt;br /&gt;
==== Поставка ====&lt;br /&gt;
Функцију &amp;lt;math&amp;gt;f(x)=\sqrt{x^2+1}&amp;lt;/math&amp;gt; табелирати на интервалу &amp;lt;math&amp;gt;[0, 2]&amp;lt;/math&amp;gt; са кораком &amp;lt;math&amp;gt;h=0.25&amp;lt;/math&amp;gt;. Израчунати &amp;lt;math&amp;gt;f(1.97)&amp;lt;/math&amp;gt; користећи одговарајући Њутнов интерполациони полином трећег степена. Одредити оцену грешке у тачки &amp;lt;math&amp;gt;1.97&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Решење ====&lt;br /&gt;
&lt;br /&gt;
=== 3. задатак ===&lt;br /&gt;
==== Поставка ====&lt;br /&gt;
Израчунати интеграл &amp;lt;math&amp;gt;\int\limits_{0}^{1} \sin(\pi x) dx&amp;lt;/math&amp;gt; Симпсоновом квадратном формулом са тачношћу &amp;lt;math&amp;gt;10^{-5}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Решење ====&lt;br /&gt;
&lt;br /&gt;
[[Категорија:НАД]]&lt;br /&gt;
[[Категорија:Рокови]]&lt;/div&gt;</summary>
		<author><name>Aleksa</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9D%D0%90%D0%94/%D0%9F%D1%80%D0%B5%D0%B4%D0%B8%D1%81%D0%BF%D0%B8%D1%82%D0%BD%D0%B5_%D0%BE%D0%B1%D0%B0%D0%B2%D0%B5%D0%B7%D0%B5_2025_2026&amp;diff=8291</id>
		<title>НАД/Предиспитне обавезе 2025 2026</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9D%D0%90%D0%94/%D0%9F%D1%80%D0%B5%D0%B4%D0%B8%D1%81%D0%BF%D0%B8%D1%82%D0%BD%D0%B5_%D0%BE%D0%B1%D0%B0%D0%B2%D0%B5%D0%B7%D0%B5_2025_2026&amp;diff=8291"/>
		<updated>2026-02-25T21:44:52Z</updated>

		<summary type="html">&lt;p&gt;Aleksa: /* 2. задатак */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&#039;&#039;&#039;Предиспитне обавезе 2025/26. године&#039;&#039;&#039; за одсек РТИ. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Напомена:&#039;&#039;&#039; &#039;&#039;Moodle&#039;&#039; насумично бира 3 задатка из велике базе задатака, тако да је могућа комбинација било којих од ових задатака (а и оних који се не налазе овде).  &lt;br /&gt;
&lt;br /&gt;
== Верзија 1 ==&lt;br /&gt;
=== 1. задатак ===&lt;br /&gt;
==== Поставка ====&lt;br /&gt;
Јакобијевом итеративном методом решити систем линеарних једначина. Одговор уписати са 6 децимала.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;100x_1-24x_2+48x_3-23x_4=39&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;5x_1+100x_2-44x_3-31x_4=72&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;10x_1-3x_2+100x_3+55x_4=56&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;-12x_1+7x_2-11x_3+100x_4=47&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
==== Решење ====&lt;br /&gt;
&amp;lt;math&amp;gt; &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== 2. задатак ===&lt;br /&gt;
Исти задатак као [[НАД/Предиспитне_обавезе_2021#2._задатак_5|верзија 5 - задатак 2 из 2021. године]]&lt;br /&gt;
&lt;br /&gt;
=== 3. задатак ===&lt;br /&gt;
==== Поставка ====&lt;br /&gt;
Израчунати интеграл &amp;lt;math&amp;gt;\int\limits_{-1}^{2} (x+\sin{x})dx&amp;lt;/math&amp;gt; трапезном квадратурном формулом са тачношћу &amp;lt;math&amp;gt;10^{-3}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Решење ====&lt;br /&gt;
&amp;lt;math&amp;gt; &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Верзија 2 ==&lt;br /&gt;
=== 1. задатак ===&lt;br /&gt;
==== Поставка ====&lt;br /&gt;
Методом половљења интервала, са тачношћу &amp;lt;math&amp;gt;0,5*10^{-3}&amp;lt;/math&amp;gt;, решити једначину &amp;lt;math&amp;gt;x-2e^{-x}=0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Решење ====&lt;br /&gt;
&amp;lt;math&amp;gt; &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== 2. задатак ===&lt;br /&gt;
==== Поставка ====&lt;br /&gt;
Функцију &amp;lt;math&amp;gt;f(x)=\frac{x\ln{x}}{x^2+1}&amp;lt;/math&amp;gt;, табелирати на интервалу &amp;lt;math&amp;gt;[1.5, 2.3]&amp;lt;/math&amp;gt; са кораком &amp;lt;math&amp;gt;h=0.1&amp;lt;/math&amp;gt;. Израчунати &amp;lt;math&amp;gt;f(1.55)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;f&#039;(1.55)&amp;lt;/math&amp;gt; формирањем интерполационог полинома 3. степена. Одговор уписати са &amp;lt;math&amp;gt;4&amp;lt;/math&amp;gt; децимале.&lt;br /&gt;
&lt;br /&gt;
==== Решење ====&lt;br /&gt;
&amp;lt;math&amp;gt; &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== 3. задатак ===&lt;br /&gt;
==== Поставка ====&lt;br /&gt;
Израчунати интеграл &amp;lt;math&amp;gt;\int\limits_{0}^{1} \sin(\pi x) dx&amp;lt;/math&amp;gt; Симпсоновом квадратном формулом са тачношћу &amp;lt;math&amp;gt;10^{-5}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Решење ====&lt;br /&gt;
&amp;lt;math&amp;gt; &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Верзија 3 ==&lt;br /&gt;
=== 1. задатак ===&lt;br /&gt;
==== Поставка ====&lt;br /&gt;
Методом сечице, са тачношћу &amp;lt;math&amp;gt;0,5*10^{-4}&amp;lt;/math&amp;gt;, одредити веће позитивно решење једначине &amp;lt;math&amp;gt;x^2-5\sqrt[3]{x}+1=0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Решење ====&lt;br /&gt;
&amp;lt;math&amp;gt; &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== 2. задатак ===&lt;br /&gt;
==== Поставка ====&lt;br /&gt;
Функцију &amp;lt;math&amp;gt;f(x)=\sqrt{x^2+1}&amp;lt;/math&amp;gt; табелирати на интервалу &amp;lt;math&amp;gt;[0, 2]&amp;lt;/math&amp;gt; са кораком &amp;lt;math&amp;gt;h=0.25&amp;lt;/math&amp;gt;. Израчунати &amp;lt;math&amp;gt;f(1.97)&amp;lt;/math&amp;gt; користећи одговарајући Њутнов интерполациони полином трећег степена. Одредити оцену грешке у тачки &amp;lt;math&amp;gt;1.97&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Решење ====&lt;br /&gt;
&amp;lt;math&amp;gt; &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== 3. задатак ===&lt;br /&gt;
==== Поставка ====&lt;br /&gt;
Израчунати интеграл &amp;lt;math&amp;gt;\int\limits_{0}^{1} \sin(\pi x) dx&amp;lt;/math&amp;gt; Симпсоновом квадратном формулом са тачношћу &amp;lt;math&amp;gt;10^{-5}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Решење ====&lt;br /&gt;
&amp;lt;math&amp;gt; &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Категорија:НАД]]&lt;br /&gt;
[[Категорија:Рокови]]&lt;/div&gt;</summary>
		<author><name>Aleksa</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%A0%D0%91%D0%A1&amp;diff=8290</id>
		<title>РБС</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%A0%D0%91%D0%A1&amp;diff=8290"/>
		<updated>2026-02-25T21:41:48Z</updated>

		<summary type="html">&lt;p&gt;Aleksa: /* Семестрални рад */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Предмет&lt;br /&gt;
| назив     = Развој безбедног софтвера&lt;br /&gt;
| шифра     = 13М111РБС&lt;br /&gt;
| семестар  = 9&lt;br /&gt;
| статус    = изборни&lt;br /&gt;
| страница  = [https://rti.etf.bg.ac.rs/rti/ms1rbs rti.etf.bg.ac.rs/rti/ms1rbs]&lt;br /&gt;
| одсек     = СИ&lt;br /&gt;
}}&lt;br /&gt;
&#039;&#039;&#039;Развој безбедног софтвера&#039;&#039;&#039; је изборни предмет из групе А на мастер студијама, на модулу СИ.&lt;br /&gt;
&lt;br /&gt;
== Корисне везе ==&lt;br /&gt;
&amp;lt;!-- Остале корисне везе, попут веза до развојних окружења која се користе на предмету --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Настава ==&lt;br /&gt;
На предмету се држе предавања и вежбе. На предавањима се обрађује следеће градиво:&lt;br /&gt;
* Сигурносни захтеви&lt;br /&gt;
* Дизајн безбедног софтвера&lt;br /&gt;
* Моделовање претњи&lt;br /&gt;
* Рањивост веб апликација&lt;br /&gt;
* Рањивости скрипт језика&lt;br /&gt;
* &#039;&#039;API&#039;&#039; напади и одбране&lt;br /&gt;
* &#039;&#039;Java&#039;&#039; специфичности&lt;br /&gt;
* Тестирање сигурности апликација&lt;br /&gt;
&lt;br /&gt;
На вежбама се обрађује следеће градиво:&lt;br /&gt;
* &#039;&#039;SQL&#039;&#039; инјекције&lt;br /&gt;
* &#039;&#039;Cross-site scripting (XSS)&#039;&#039;&lt;br /&gt;
* &#039;&#039;Cross Site Request Forgery (CSRF)&#039;&#039;&lt;br /&gt;
* Алати за статичку и динамичку анализу кода&lt;br /&gt;
* Сигурна имплементација аутентикације&lt;br /&gt;
* Ауторизација&lt;br /&gt;
* Сигурност и &#039;&#039;DevOps&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На испиту долази градиво са предавања, док градиво са вежби служи као припрема за пројекат.&lt;br /&gt;
&lt;br /&gt;
== Лабораторијске вежбе ==&lt;br /&gt;
Раде се у току вежби, представљају самосталан рад током трајања часова вежби.&lt;br /&gt;
&lt;br /&gt;
== Семестрални рад ==&lt;br /&gt;
Носи 20 поена, ради се у групама, представља анализу рада са конференције и брани се у току семестра или у јануарском року. Уместо анализе рада, може се направити 10 &#039;&#039;Capture the flag&#039;&#039; изазова за одабрани пропуст. Рад се брани уживо или онлајн, пред неким од професора на предмета.&lt;br /&gt;
&lt;br /&gt;
== Пројекат ==&lt;br /&gt;
Вреди 40 поена, ради се самостално и представља синтезу градива са вежби. Може се бранити у јанурском, фебруарском или јулском року.&lt;br /&gt;
&lt;br /&gt;
У оквиру пројектног задатака долази готово идентично почетно стање као у апликацији која се користи на часовима вежби. У случају да ставка обухвата више апеката одједном (нпр. &#039;&#039;SQLi+XSS&#039;&#039;) оба напада се морају извршити одједном. Такође, треба пратити начин решавања представљен на часовима вежби, што је и пожељно како би се лако и брзо урадио пројекат.&lt;br /&gt;
&lt;br /&gt;
На одбрани се постављају основна питања о одређеним нападима и како се брани од њих. Може се тражити покретање апликације и прказивање да нпр. ауторизација заправо ради.&lt;br /&gt;
&lt;br /&gt;
== Испитни рокови ==&lt;br /&gt;
Рокови нису доступни са странице предмета. Следећи рокови су сакупљени на викију:&lt;br /&gt;
{{#dpl:&lt;br /&gt;
| category    = РБС&lt;br /&gt;
| category    = Рокови&lt;br /&gt;
| format      = ,\n* &amp;lt;span class=&amp;quot;rok,&amp;quot;&amp;gt;[[%PAGE%|²{#invoke:String¦sub¦%PAGE%¦5¦-1}²]]&amp;lt;/span&amp;gt;,&lt;br /&gt;
| ordermethod = title&lt;br /&gt;
| include     = {nerešeno}.dpl, {delimično rešeno}.dpl, {нерешено}.dpl, {делимично решено}.dpl&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Начин оцењивања ==&lt;br /&gt;
* &amp;lt;math&amp;gt;PR&amp;lt;/math&amp;gt; — Бодови са практичног теста (0-40)&lt;br /&gt;
* &amp;lt;math&amp;gt;SEM&amp;lt;/math&amp;gt; — Бодови са семинарског рада (0-20)&lt;br /&gt;
* &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; — Бодови са испита (0-40)&lt;br /&gt;
* Укупни бодови: &amp;lt;math&amp;gt;P = PR + SEM + I&amp;lt;/math&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Бодови&lt;br /&gt;
| &amp;lt;math&amp;gt;P \leq 50&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;50 &amp;lt; P \leq 60&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;60 &amp;lt; P \leq 70&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;70 &amp;lt; P \leq 80&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;80 &amp;lt; P \leq 90&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;90 &amp;lt; P&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Оцена&lt;br /&gt;
| 5 || 6 || 7 || 8 || 9 || 10&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Потребна помоћ ==&lt;br /&gt;
* {{задаци|postavke}}&lt;br /&gt;
* {{задаци|prepis}}&lt;br /&gt;
** Јавити се неком од старијих уређивача викија како би добили непреписане рокове.&lt;/div&gt;</summary>
		<author><name>Aleksa</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%A0%D0%91%D0%A1&amp;diff=8289</id>
		<title>РБС</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%A0%D0%91%D0%A1&amp;diff=8289"/>
		<updated>2026-02-25T21:40:29Z</updated>

		<summary type="html">&lt;p&gt;Aleksa: /* Пројекат */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Предмет&lt;br /&gt;
| назив     = Развој безбедног софтвера&lt;br /&gt;
| шифра     = 13М111РБС&lt;br /&gt;
| семестар  = 9&lt;br /&gt;
| статус    = изборни&lt;br /&gt;
| страница  = [https://rti.etf.bg.ac.rs/rti/ms1rbs rti.etf.bg.ac.rs/rti/ms1rbs]&lt;br /&gt;
| одсек     = СИ&lt;br /&gt;
}}&lt;br /&gt;
&#039;&#039;&#039;Развој безбедног софтвера&#039;&#039;&#039; је изборни предмет из групе А на мастер студијама, на модулу СИ.&lt;br /&gt;
&lt;br /&gt;
== Корисне везе ==&lt;br /&gt;
&amp;lt;!-- Остале корисне везе, попут веза до развојних окружења која се користе на предмету --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Настава ==&lt;br /&gt;
На предмету се држе предавања и вежбе. На предавањима се обрађује следеће градиво:&lt;br /&gt;
* Сигурносни захтеви&lt;br /&gt;
* Дизајн безбедног софтвера&lt;br /&gt;
* Моделовање претњи&lt;br /&gt;
* Рањивост веб апликација&lt;br /&gt;
* Рањивости скрипт језика&lt;br /&gt;
* &#039;&#039;API&#039;&#039; напади и одбране&lt;br /&gt;
* &#039;&#039;Java&#039;&#039; специфичности&lt;br /&gt;
* Тестирање сигурности апликација&lt;br /&gt;
&lt;br /&gt;
На вежбама се обрађује следеће градиво:&lt;br /&gt;
* &#039;&#039;SQL&#039;&#039; инјекције&lt;br /&gt;
* &#039;&#039;Cross-site scripting (XSS)&#039;&#039;&lt;br /&gt;
* &#039;&#039;Cross Site Request Forgery (CSRF)&#039;&#039;&lt;br /&gt;
* Алати за статичку и динамичку анализу кода&lt;br /&gt;
* Сигурна имплементација аутентикације&lt;br /&gt;
* Ауторизација&lt;br /&gt;
* Сигурност и &#039;&#039;DevOps&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На испиту долази градиво са предавања, док градиво са вежби служи као припрема за пројекат.&lt;br /&gt;
&lt;br /&gt;
== Лабораторијске вежбе ==&lt;br /&gt;
Раде се у току вежби, представљају самосталан рад током трајања часова вежби.&lt;br /&gt;
&lt;br /&gt;
== Семестрални рад ==&lt;br /&gt;
Носи 20 поена, ради се у групама, представља анализу рада са конференције и брани се у току семестра или у јануарском року. Уместо анализе рада, може се направити 10 &#039;&#039;Capture the flag&#039;&#039; изазова за одабрани пропуст.&lt;br /&gt;
&lt;br /&gt;
== Пројекат ==&lt;br /&gt;
Вреди 40 поена, ради се самостално и представља синтезу градива са вежби. Може се бранити у јанурском, фебруарском или јулском року.&lt;br /&gt;
&lt;br /&gt;
У оквиру пројектног задатака долази готово идентично почетно стање као у апликацији која се користи на часовима вежби. У случају да ставка обухвата више апеката одједном (нпр. &#039;&#039;SQLi+XSS&#039;&#039;) оба напада се морају извршити одједном. Такође, треба пратити начин решавања представљен на часовима вежби, што је и пожељно како би се лако и брзо урадио пројекат.&lt;br /&gt;
&lt;br /&gt;
На одбрани се постављају основна питања о одређеним нападима и како се брани од њих. Може се тражити покретање апликације и прказивање да нпр. ауторизација заправо ради.&lt;br /&gt;
&lt;br /&gt;
== Испитни рокови ==&lt;br /&gt;
Рокови нису доступни са странице предмета. Следећи рокови су сакупљени на викију:&lt;br /&gt;
{{#dpl:&lt;br /&gt;
| category    = РБС&lt;br /&gt;
| category    = Рокови&lt;br /&gt;
| format      = ,\n* &amp;lt;span class=&amp;quot;rok,&amp;quot;&amp;gt;[[%PAGE%|²{#invoke:String¦sub¦%PAGE%¦5¦-1}²]]&amp;lt;/span&amp;gt;,&lt;br /&gt;
| ordermethod = title&lt;br /&gt;
| include     = {nerešeno}.dpl, {delimično rešeno}.dpl, {нерешено}.dpl, {делимично решено}.dpl&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Начин оцењивања ==&lt;br /&gt;
* &amp;lt;math&amp;gt;PR&amp;lt;/math&amp;gt; — Бодови са практичног теста (0-40)&lt;br /&gt;
* &amp;lt;math&amp;gt;SEM&amp;lt;/math&amp;gt; — Бодови са семинарског рада (0-20)&lt;br /&gt;
* &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; — Бодови са испита (0-40)&lt;br /&gt;
* Укупни бодови: &amp;lt;math&amp;gt;P = PR + SEM + I&amp;lt;/math&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Бодови&lt;br /&gt;
| &amp;lt;math&amp;gt;P \leq 50&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;50 &amp;lt; P \leq 60&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;60 &amp;lt; P \leq 70&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;70 &amp;lt; P \leq 80&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;80 &amp;lt; P \leq 90&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;90 &amp;lt; P&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Оцена&lt;br /&gt;
| 5 || 6 || 7 || 8 || 9 || 10&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Потребна помоћ ==&lt;br /&gt;
* {{задаци|postavke}}&lt;br /&gt;
* {{задаци|prepis}}&lt;br /&gt;
** Јавити се неком од старијих уређивача викија како би добили непреписане рокове.&lt;/div&gt;</summary>
		<author><name>Aleksa</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%A0%D0%91%D0%A1/%D0%88%D0%B0%D0%BD%D1%83%D0%B0%D1%80_2026&amp;diff=8286</id>
		<title>РБС/Јануар 2026</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%A0%D0%91%D0%A1/%D0%88%D0%B0%D0%BD%D1%83%D0%B0%D1%80_2026&amp;diff=8286"/>
		<updated>2026-02-25T21:32:48Z</updated>

		<summary type="html">&lt;p&gt;Aleksa: /* 4. zadatak */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&#039;&#039;&#039;Ispit u januarskom ispitnom roku 2026. godine&#039;&#039;&#039; održan je 18. februara, trajao je sat vremena i radio se preko platforme &#039;&#039;Moodle&#039;&#039; u &#039;&#039;Secure browser&#039;&#039;.&lt;br /&gt;
{{rešenja}}&lt;br /&gt;
&lt;br /&gt;
=== 1. zadatak ===&lt;br /&gt;
U &#039;&#039;Heartbeat&#039;&#039; protokolu koristi se bibliotečka funkcija &#039;&#039;memcpy&#039;&#039; iz jezika &#039;&#039;&#039;C&#039;&#039;&#039; i njeno korišćenje je dovelo do ranjivosti &#039;&#039;Heartblead&#039;&#039;. Objasniti kako je ova funkcija dovela do toga i kako se ovo može prevazići.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Odgovor:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;div class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;plain&amp;quot;&amp;gt;&lt;br /&gt;
Funkcija ima potpis memcpy(bp, pl, payload) koja kopira payload bajtova iz bafera pl u bp. Ovo se koristi u Heartbeat za proveru da li je server aktivan. Klijent šalje poruku i dužinu poruke serveru, i server odgovara istom porukom. Ranjivost nastaje jer se ne radi provera da li je payload veći od veličine pl, pa klijent može da pošalje poruku veličine 4B, a payload da postavi na 128KB, i samim tim da pročita osetljive informacije - lozinke, podatke o brojevima kreditnih kartica i slično - buffer overread. Ovo se može prevazići jednostavnom proverom da li je payload veći od veličine pl, i ako da da se prijavi greška.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. zadatak ===&lt;br /&gt;
Šta od navedenog ne spada u principe bezbednog dizajna:&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;
# Razdvojiti odgovornosti&lt;br /&gt;
# Osigurati najslabiju kariku&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Dodeliti najveće potrebne privilegije&amp;lt;/span&amp;gt;&lt;br /&gt;
# Koristiti jednostavna rešenja&lt;br /&gt;
# Beležiti osetljive događaje&lt;br /&gt;
# Ne oslanjati se na nejasnost&lt;br /&gt;
# Implementirati odbranu u dubinu&lt;br /&gt;
# Ne izmišljati bezbednosnu tehnologiju&lt;br /&gt;
# Oprezno dodeljivati poverenje:&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. zadatak ===&lt;br /&gt;
Postoje eksplicitni i kvalitativni sigurnosni zahtevi. Odakle potiču eksplicitni sigurnosni zahtevi. Navesti primer eksplicitnog zahteva i objasniti kako je dobijen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Odgovor:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;div class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;plain&amp;quot;&amp;gt;&lt;br /&gt;
Eksplicitni zahtevi potiči iz regulativa i standarda. Regulative propisuju zaštitu IKT i zaštitu od napada (zakoni). Moraju se ispoštovati. Standardni su dokumenta odobrena od strane prepoznatih ili priznatih tela za standardizaciju. Ne moraju se ispoštivati. Primer eksplicitnog zahteva - zakon propisuje da nalozi na eUpravi moraju imati lozinku od najmanje 10 karaktera, i to bar 1 veliko slovo, bar 1 broj i bar 1 specijalni karakter iz određenog skupa. Ovo je dobijeno jer je pokazano da se primenom ovih kriterijuma otežava provaljivanje lozinke poznatim tehnikama.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 4. zadatak ===&lt;br /&gt;
Ako u sistemu imamo 5 objekata i 5000 subjekata, koju kontrolu pristupa je bolje koristiti?&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;
# Kontrola pristupa zasnovana na ulogama&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Liste za kontrolu pristupa&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 5. zadatak ===&lt;br /&gt;
U &#039;&#039;NIST SSDF&#039;&#039; da li se koristi statičko testiranje i ako da, u kojoj fazi?&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;
# Priprema organizacije&lt;br /&gt;
# Zaštita softvera&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Produkcija dobro zaštićenog softvera&amp;lt;/span&amp;gt;&lt;br /&gt;
# Odgovor na ranjivosti&lt;br /&gt;
# Ne primenjuje se&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 6. zadatak ===&lt;br /&gt;
U &#039;&#039;&#039;STRIDE&#039;&#039;&#039; metodologiji, šta predstavlja pretnju Autorizaciji?&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;
# Skrivanje identiteta&lt;br /&gt;
# Neautorizovana izmena podataka&lt;br /&gt;
# Osporavanje&lt;br /&gt;
# Neautorizovan pristup podacima&lt;br /&gt;
# Onemogućavanje pristupa&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Podizanje privilegija&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 7. zadatak ===&lt;br /&gt;
U &#039;&#039;&#039;OSSTMM&#039;&#039;&#039;, šta predstavlja slepo testiranje?&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;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Analitičar nema predznanje o sistemu, a meta je spremna i unapred upoznata sa testiranjem.&amp;lt;/span&amp;gt;&lt;br /&gt;
# Analitičar nema predznanje o sistemu, a meta nije spremna niti upoznata sa testiranjem.&lt;br /&gt;
# Analitičar poznaje kanale napada i delimično odbrane, a meta je spremna i unapred upoznata sa svim detaljima.&lt;br /&gt;
# Analitičar poznaje kanale napada i delimično odbrane, a meta je upoznata sa okvirom testiranja, ali ne i sa kanalima i vektorima napada.&lt;br /&gt;
# Analitičar poznaje sve detalje o mogućim napadima, a meta je spremna i unapred upoznata sa svim detaljima.&lt;br /&gt;
# Analitičar poznaje sve detalje o mogućim napadima, a meta nije spremna niti upoznata sa testiranjem.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 8. zadatak ===&lt;br /&gt;
Šta predstavlja &#039;&#039;&#039;deljenje rizika&#039;&#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;
# Promena dizajna modula, dodavanje novih radnih zadataka, kupovina dodatnih alata?&lt;br /&gt;
# Uklanjanje modula koji uvodi rizik&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Angažovanje treće strane da se izbegne pretnja ili informisanje klijenta da je njegova obavaza da se pozabavi pretnjom&amp;lt;/span&amp;gt;&lt;br /&gt;
# Prihvatanje rizika&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 9. zadatak ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
LOG_FILE_LIST = [&amp;quot;data_log&amp;quot;, &amp;quot;system&amp;quot;, &amp;quot;access&amp;quot;]&lt;br /&gt;
def read_logs(log_file_name):&lt;br /&gt;
	if log_file_name not in LOG_FILE_LIST:&lt;br /&gt;
		return &amp;quot;Invalid log file name&amp;quot;&lt;br /&gt;
	result = subprocess.run([&amp;quot;cat&amp;quot;, f&amp;quot;/var/log/{log_file_name}.log&amp;quot;], capture_output=True, text=True)&lt;br /&gt;
    return result.stdout&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Koja tehnika je primenjena?&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;
# Blackisting&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Whitelisting&amp;lt;/span&amp;gt;&lt;br /&gt;
# Bezbedan poziv API&lt;br /&gt;
# Beleženje korisničkih akcija&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 10. zadatak ===&lt;br /&gt;
Za isti kod iz prethodnog zadatka unosi se&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
system; rm -rf /&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Objasniti kako će biti obrađen ovaj unos.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
LOG_FILE_LIST = [&amp;quot;data_log&amp;quot;, &amp;quot;system&amp;quot;, &amp;quot;access&amp;quot;]&lt;br /&gt;
def read_logs(log_file_name):&lt;br /&gt;
	if log_file_name not in LOG_FILE_LIST:&lt;br /&gt;
		return &amp;quot;Invalid log file name&amp;quot;&lt;br /&gt;
	result = subprocess.run([&amp;quot;cat&amp;quot;, f&amp;quot;/var/log/{log_file_name}.log&amp;quot;], capture_output=True, text=True)&lt;br /&gt;
    return result.stdout&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dodatno ukratko objasniti ovaj mehanizam zaštite.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Odgovor:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;div class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;plain&amp;quot;&amp;gt;&lt;br /&gt;
Unos pored dozvoljene niske sadrži i nedozvoljene karaktere, pa će program vratiti Invalid log file name. Ovde se koristi tehnika &#039;&#039;whitelisting&#039;&#039;, za sprečavanje &#039;&#039;Command injection&#039;&#039; napada - do kog dolazi usled &#039;&#039;Improper input validation&#039;&#039;. Postoji lista dozvoljenih unosa, ako naš unos nije među njima, on se odbacuje i prijavljuje se greška. Ovo je proaktivan pristup, smanjuje značajno mogućnost za napad i samim tim je bolja tehnika od blackistinga.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Napomene ==&lt;br /&gt;
* Ovaj rok je napisan &amp;lt;strong&amp;gt;isključivo po sećanju studenata&amp;lt;/strong&amp;gt;.&lt;br /&gt;
* U određenim zadacima eksplicitne vrednosti ili ponuđeni odgovori možda nisu isti kao u originalnoj postavci, međutim u svim zadacima gde je to slučaj, očuvana je suština zadatka.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:РБС]]&lt;/div&gt;</summary>
		<author><name>Aleksa</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%A0%D0%91%D0%A1&amp;diff=8285</id>
		<title>РБС</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%A0%D0%91%D0%A1&amp;diff=8285"/>
		<updated>2026-02-25T21:32:20Z</updated>

		<summary type="html">&lt;p&gt;Aleksa: /* Лабораторијске вежбе */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Предмет&lt;br /&gt;
| назив     = Развој безбедног софтвера&lt;br /&gt;
| шифра     = 13М111РБС&lt;br /&gt;
| семестар  = 9&lt;br /&gt;
| статус    = изборни&lt;br /&gt;
| страница  = [https://rti.etf.bg.ac.rs/rti/ms1rbs rti.etf.bg.ac.rs/rti/ms1rbs]&lt;br /&gt;
| одсек     = СИ&lt;br /&gt;
}}&lt;br /&gt;
&#039;&#039;&#039;Развој безбедног софтвера&#039;&#039;&#039; је изборни предмет из групе А на мастер студијама, на модулу СИ.&lt;br /&gt;
&lt;br /&gt;
== Корисне везе ==&lt;br /&gt;
&amp;lt;!-- Остале корисне везе, попут веза до развојних окружења која се користе на предмету --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Настава ==&lt;br /&gt;
На предмету се држе предавања и вежбе. На предавањима се обрађује следеће градиво:&lt;br /&gt;
* Сигурносни захтеви&lt;br /&gt;
* Дизајн безбедног софтвера&lt;br /&gt;
* Моделовање претњи&lt;br /&gt;
* Рањивост веб апликација&lt;br /&gt;
* Рањивости скрипт језика&lt;br /&gt;
* &#039;&#039;API&#039;&#039; напади и одбране&lt;br /&gt;
* &#039;&#039;Java&#039;&#039; специфичности&lt;br /&gt;
* Тестирање сигурности апликација&lt;br /&gt;
&lt;br /&gt;
На вежбама се обрађује следеће градиво:&lt;br /&gt;
* &#039;&#039;SQL&#039;&#039; инјекције&lt;br /&gt;
* &#039;&#039;Cross-site scripting (XSS)&#039;&#039;&lt;br /&gt;
* &#039;&#039;Cross Site Request Forgery (CSRF)&#039;&#039;&lt;br /&gt;
* Алати за статичку и динамичку анализу кода&lt;br /&gt;
* Сигурна имплементација аутентикације&lt;br /&gt;
* Ауторизација&lt;br /&gt;
* Сигурност и &#039;&#039;DevOps&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На испиту долази градиво са предавања, док градиво са вежби служи као припрема за пројекат.&lt;br /&gt;
&lt;br /&gt;
== Лабораторијске вежбе ==&lt;br /&gt;
Раде се у току вежби, представљају самосталан рад током трајања часова вежби.&lt;br /&gt;
&lt;br /&gt;
== Семестрални рад ==&lt;br /&gt;
Носи 20 поена, ради се у групама, представља анализу рада са конференције и брани се у току семестра или у јануарском року. Уместо анализе рада, може се направити 10 &#039;&#039;Capture the flag&#039;&#039; изазова за одабрани пропуст.&lt;br /&gt;
&lt;br /&gt;
== Пројекат ==&lt;br /&gt;
Вреди 40 поена, ради се самостално и представља синтезу градива са вежби. Може се бранити у јанурском, фебруарском или јулском року.&lt;br /&gt;
&lt;br /&gt;
== Испитни рокови ==&lt;br /&gt;
Рокови нису доступни са странице предмета. Следећи рокови су сакупљени на викију:&lt;br /&gt;
{{#dpl:&lt;br /&gt;
| category    = РБС&lt;br /&gt;
| category    = Рокови&lt;br /&gt;
| format      = ,\n* &amp;lt;span class=&amp;quot;rok,&amp;quot;&amp;gt;[[%PAGE%|²{#invoke:String¦sub¦%PAGE%¦5¦-1}²]]&amp;lt;/span&amp;gt;,&lt;br /&gt;
| ordermethod = title&lt;br /&gt;
| include     = {nerešeno}.dpl, {delimično rešeno}.dpl, {нерешено}.dpl, {делимично решено}.dpl&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Начин оцењивања ==&lt;br /&gt;
* &amp;lt;math&amp;gt;PR&amp;lt;/math&amp;gt; — Бодови са практичног теста (0-40)&lt;br /&gt;
* &amp;lt;math&amp;gt;SEM&amp;lt;/math&amp;gt; — Бодови са семинарског рада (0-20)&lt;br /&gt;
* &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; — Бодови са испита (0-40)&lt;br /&gt;
* Укупни бодови: &amp;lt;math&amp;gt;P = PR + SEM + I&amp;lt;/math&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Бодови&lt;br /&gt;
| &amp;lt;math&amp;gt;P \leq 50&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;50 &amp;lt; P \leq 60&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;60 &amp;lt; P \leq 70&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;70 &amp;lt; P \leq 80&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;80 &amp;lt; P \leq 90&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;90 &amp;lt; P&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Оцена&lt;br /&gt;
| 5 || 6 || 7 || 8 || 9 || 10&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Потребна помоћ ==&lt;br /&gt;
* {{задаци|postavke}}&lt;br /&gt;
* {{задаци|prepis}}&lt;br /&gt;
** Јавити се неком од старијих уређивача викија како би добили непреписане рокове.&lt;/div&gt;</summary>
		<author><name>Aleksa</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%A0%D0%91%D0%A1/%D0%88%D0%B0%D0%BD%D1%83%D0%B0%D1%80_2026&amp;diff=8268</id>
		<title>РБС/Јануар 2026</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%A0%D0%91%D0%A1/%D0%88%D0%B0%D0%BD%D1%83%D0%B0%D1%80_2026&amp;diff=8268"/>
		<updated>2026-02-19T07:51:48Z</updated>

		<summary type="html">&lt;p&gt;Aleksa: /* Napomene */ typo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&#039;&#039;&#039;Ispit u januarskom ispitnom roku 2026. godine&#039;&#039;&#039; održan je 18. februara, trajao je sat vremena i radio se preko platforme &#039;&#039;Moodle&#039;&#039; u &#039;&#039;Secure browser&#039;&#039;.&lt;br /&gt;
{{rešenja}}&lt;br /&gt;
&lt;br /&gt;
=== 1. zadatak ===&lt;br /&gt;
U &#039;&#039;Heartbeat&#039;&#039; protokolu koristi se bibliotečka funkcija &#039;&#039;memcpy&#039;&#039; iz jezika &#039;&#039;&#039;C&#039;&#039;&#039; i njeno korišćenje je dovelo do ranjivosti &#039;&#039;Heartblead&#039;&#039;. Objasniti kako je ova funkcija dovela do toga i kako se ovo može prevazići.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Odgovor:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;div class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;plain&amp;quot;&amp;gt;&lt;br /&gt;
Funkcija ima potpis memcpy(bp, pl, payload) koja kopira payload bajtova iz bafera pl u bp. Ovo se koristi u Heartbeat za proveru da li je server aktivan. Klijent šalje poruku i dužinu poruke serveru, i server odgovara istom porukom. Ranjivost nastaje jer se ne radi provera da li je payload veći od veličine pl, pa klijent može da pošalje poruku veličine 4B, a payload da postavi na 128KB, i samim tim da pročita osetljive informacije - lozinke, podatke o brojevima kreditnih kartica i slično - buffer overread. Ovo se može prevazići jednostavnom proverom da li je payload veći od veličine pl, i ako da da se prijavi greška.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. zadatak ===&lt;br /&gt;
Šta od navedenog ne spada u principe bezbednog dizajna:&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;
# Razdvojiti odgovornosti&lt;br /&gt;
# Osigurati najslabiju kariku&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Dodeliti najveće potrebne privilegije&amp;lt;/span&amp;gt;&lt;br /&gt;
# Koristiti jednostavna rešenja&lt;br /&gt;
# Beležiti osetljive događaje&lt;br /&gt;
# Ne oslanjati se na nejasnost&lt;br /&gt;
# Implementirati odbranu u dubinu&lt;br /&gt;
# Ne izmišljati bezbednosnu tehnologiju&lt;br /&gt;
# Oprezno dodeljivati poverenje:&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. zadatak ===&lt;br /&gt;
Postoje eksplicitni i kvalitativni sigurnosni zahtevi. Odakle potiču eksplicitni sigurnosni zahtevi. Navesti primer eksplicitnog zahteva i objasniti kako je dobijen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Odgovor:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;div class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;plain&amp;quot;&amp;gt;&lt;br /&gt;
Eksplicitni zahtevi potiči iz regulativa i standarda. Regulative propisuju zaštitu IKT i zaštitu od napada (zakoni). Moraju se ispoštovati. Standardni su dokumenta odobrena od strane prepoznatih ili priznatih tela za standardizaciju. Ne moraju se ispoštivati. Primer eksplicitnog zahteva - zakon propisuje da nalozi na eUpravi moraju imati lozinku od najmanje 10 karaktera, i to bar 1 veliko slovo, bar 1 broj i bar 1 specijalni karakter iz određenog skupa. Ovo je dobijeno jer je pokazano da se primenom ovih kriterijuma otežava provaljivanje lozinke poznatim tehnikama.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 4. zadatak ===&lt;br /&gt;
Ako u sistemu imamo 5 objekata i 5000 subjekata, koju kontrolu pristupa je bolje koristiti?&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;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Kontrola pristupa zasnovana na ulogama&amp;lt;/span&amp;gt;&lt;br /&gt;
# Liste za kontrolu pristupa&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 5. zadatak ===&lt;br /&gt;
U &#039;&#039;NIST SSDF&#039;&#039; da li se koristi statičko testiranje i ako da, u kojoj fazi?&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;
# Priprema organizacije&lt;br /&gt;
# Zaštita softvera&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Produkcija dobro zaštićenog softvera&amp;lt;/span&amp;gt;&lt;br /&gt;
# Odgovor na ranjivosti&lt;br /&gt;
# Ne primenjuje se&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 6. zadatak ===&lt;br /&gt;
U &#039;&#039;&#039;STRIDE&#039;&#039;&#039; metodologiji, šta predstavlja pretnju Autorizaciji?&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;
# Skrivanje identiteta&lt;br /&gt;
# Neautorizovana izmena podataka&lt;br /&gt;
# Osporavanje&lt;br /&gt;
# Neautorizovan pristup podacima&lt;br /&gt;
# Onemogućavanje pristupa&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Podizanje privilegija&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 7. zadatak ===&lt;br /&gt;
U &#039;&#039;&#039;OSSTMM&#039;&#039;&#039;, šta predstavlja slepo testiranje?&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;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Analitičar nema predznanje o sistemu, a meta je spremna i unapred upoznata sa testiranjem.&amp;lt;/span&amp;gt;&lt;br /&gt;
# Analitičar nema predznanje o sistemu, a meta nije spremna niti upoznata sa testiranjem.&lt;br /&gt;
# Analitičar poznaje kanale napada i delimično odbrane, a meta je spremna i unapred upoznata sa svim detaljima.&lt;br /&gt;
# Analitičar poznaje kanale napada i delimično odbrane, a meta je upoznata sa okvirom testiranja, ali ne i sa kanalima i vektorima napada.&lt;br /&gt;
# Analitičar poznaje sve detalje o mogućim napadima, a meta je spremna i unapred upoznata sa svim detaljima.&lt;br /&gt;
# Analitičar poznaje sve detalje o mogućim napadima, a meta nije spremna niti upoznata sa testiranjem.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 8. zadatak ===&lt;br /&gt;
Šta predstavlja &#039;&#039;&#039;deljenje rizika&#039;&#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;
# Promena dizajna modula, dodavanje novih radnih zadataka, kupovina dodatnih alata?&lt;br /&gt;
# Uklanjanje modula koji uvodi rizik&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Angažovanje treće strane da se izbegne pretnja ili informisanje klijenta da je njegova obavaza da se pozabavi pretnjom&amp;lt;/span&amp;gt;&lt;br /&gt;
# Prihvatanje rizika&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 9. zadatak ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
LOG_FILE_LIST = [&amp;quot;data_log&amp;quot;, &amp;quot;system&amp;quot;, &amp;quot;access&amp;quot;]&lt;br /&gt;
def read_logs(log_file_name):&lt;br /&gt;
	if log_file_name not in LOG_FILE_LIST:&lt;br /&gt;
		return &amp;quot;Invalid log file name&amp;quot;&lt;br /&gt;
	result = subprocess.run([&amp;quot;cat&amp;quot;, f&amp;quot;/var/log/{log_file_name}.log&amp;quot;], capture_output=True, text=True)&lt;br /&gt;
    return result.stdout&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Koja tehnika je primenjena?&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;
# Blackisting&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Whitelisting&amp;lt;/span&amp;gt;&lt;br /&gt;
# Bezbedan poziv API&lt;br /&gt;
# Beleženje korisničkih akcija&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 10. zadatak ===&lt;br /&gt;
Za isti kod iz prethodnog zadatka unosi se&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
system; rm -rf /&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Objasniti kako će biti obrađen ovaj unos.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
LOG_FILE_LIST = [&amp;quot;data_log&amp;quot;, &amp;quot;system&amp;quot;, &amp;quot;access&amp;quot;]&lt;br /&gt;
def read_logs(log_file_name):&lt;br /&gt;
	if log_file_name not in LOG_FILE_LIST:&lt;br /&gt;
		return &amp;quot;Invalid log file name&amp;quot;&lt;br /&gt;
	result = subprocess.run([&amp;quot;cat&amp;quot;, f&amp;quot;/var/log/{log_file_name}.log&amp;quot;], capture_output=True, text=True)&lt;br /&gt;
    return result.stdout&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dodatno ukratko objasniti ovaj mehanizam zaštite.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Odgovor:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;div class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;plain&amp;quot;&amp;gt;&lt;br /&gt;
Unos pored dozvoljene niske sadrži i nedozvoljene karaktere, pa će program vratiti Invalid log file name. Ovde se koristi tehnika &#039;&#039;whitelisting&#039;&#039;, za sprečavanje &#039;&#039;Command injection&#039;&#039; napada - do kog dolazi usled &#039;&#039;Improper input validation&#039;&#039;. Postoji lista dozvoljenih unosa, ako naš unos nije među njima, on se odbacuje i prijavljuje se greška. Ovo je proaktivan pristup, smanjuje značajno mogućnost za napad i samim tim je bolja tehnika od blackistinga.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Napomene ==&lt;br /&gt;
* Ovaj rok je napisan &amp;lt;strong&amp;gt;isključivo po sećanju studenata&amp;lt;/strong&amp;gt;.&lt;br /&gt;
* U određenim zadacima eksplicitne vrednosti ili ponuđeni odgovori možda nisu isti kao u originalnoj postavci, međutim u svim zadacima gde je to slučaj, očuvana je suština zadatka.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:РБС]]&lt;/div&gt;</summary>
		<author><name>Aleksa</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%A0%D0%91%D0%A1/%D0%88%D0%B0%D0%BD%D1%83%D0%B0%D1%80_2026&amp;diff=8267</id>
		<title>РБС/Јануар 2026</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%A0%D0%91%D0%A1/%D0%88%D0%B0%D0%BD%D1%83%D0%B0%D1%80_2026&amp;diff=8267"/>
		<updated>2026-02-19T07:51:01Z</updated>

		<summary type="html">&lt;p&gt;Aleksa: /* 5. zadatak */ c u č&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&#039;&#039;&#039;Ispit u januarskom ispitnom roku 2026. godine&#039;&#039;&#039; održan je 18. februara, trajao je sat vremena i radio se preko platforme &#039;&#039;Moodle&#039;&#039; u &#039;&#039;Secure browser&#039;&#039;.&lt;br /&gt;
{{rešenja}}&lt;br /&gt;
&lt;br /&gt;
=== 1. zadatak ===&lt;br /&gt;
U &#039;&#039;Heartbeat&#039;&#039; protokolu koristi se bibliotečka funkcija &#039;&#039;memcpy&#039;&#039; iz jezika &#039;&#039;&#039;C&#039;&#039;&#039; i njeno korišćenje je dovelo do ranjivosti &#039;&#039;Heartblead&#039;&#039;. Objasniti kako je ova funkcija dovela do toga i kako se ovo može prevazići.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Odgovor:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;div class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;plain&amp;quot;&amp;gt;&lt;br /&gt;
Funkcija ima potpis memcpy(bp, pl, payload) koja kopira payload bajtova iz bafera pl u bp. Ovo se koristi u Heartbeat za proveru da li je server aktivan. Klijent šalje poruku i dužinu poruke serveru, i server odgovara istom porukom. Ranjivost nastaje jer se ne radi provera da li je payload veći od veličine pl, pa klijent može da pošalje poruku veličine 4B, a payload da postavi na 128KB, i samim tim da pročita osetljive informacije - lozinke, podatke o brojevima kreditnih kartica i slično - buffer overread. Ovo se može prevazići jednostavnom proverom da li je payload veći od veličine pl, i ako da da se prijavi greška.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. zadatak ===&lt;br /&gt;
Šta od navedenog ne spada u principe bezbednog dizajna:&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;
# Razdvojiti odgovornosti&lt;br /&gt;
# Osigurati najslabiju kariku&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Dodeliti najveće potrebne privilegije&amp;lt;/span&amp;gt;&lt;br /&gt;
# Koristiti jednostavna rešenja&lt;br /&gt;
# Beležiti osetljive događaje&lt;br /&gt;
# Ne oslanjati se na nejasnost&lt;br /&gt;
# Implementirati odbranu u dubinu&lt;br /&gt;
# Ne izmišljati bezbednosnu tehnologiju&lt;br /&gt;
# Oprezno dodeljivati poverenje:&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. zadatak ===&lt;br /&gt;
Postoje eksplicitni i kvalitativni sigurnosni zahtevi. Odakle potiču eksplicitni sigurnosni zahtevi. Navesti primer eksplicitnog zahteva i objasniti kako je dobijen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Odgovor:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;div class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;plain&amp;quot;&amp;gt;&lt;br /&gt;
Eksplicitni zahtevi potiči iz regulativa i standarda. Regulative propisuju zaštitu IKT i zaštitu od napada (zakoni). Moraju se ispoštovati. Standardni su dokumenta odobrena od strane prepoznatih ili priznatih tela za standardizaciju. Ne moraju se ispoštivati. Primer eksplicitnog zahteva - zakon propisuje da nalozi na eUpravi moraju imati lozinku od najmanje 10 karaktera, i to bar 1 veliko slovo, bar 1 broj i bar 1 specijalni karakter iz određenog skupa. Ovo je dobijeno jer je pokazano da se primenom ovih kriterijuma otežava provaljivanje lozinke poznatim tehnikama.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 4. zadatak ===&lt;br /&gt;
Ako u sistemu imamo 5 objekata i 5000 subjekata, koju kontrolu pristupa je bolje koristiti?&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;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Kontrola pristupa zasnovana na ulogama&amp;lt;/span&amp;gt;&lt;br /&gt;
# Liste za kontrolu pristupa&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 5. zadatak ===&lt;br /&gt;
U &#039;&#039;NIST SSDF&#039;&#039; da li se koristi statičko testiranje i ako da, u kojoj fazi?&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;
# Priprema organizacije&lt;br /&gt;
# Zaštita softvera&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Produkcija dobro zaštićenog softvera&amp;lt;/span&amp;gt;&lt;br /&gt;
# Odgovor na ranjivosti&lt;br /&gt;
# Ne primenjuje se&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 6. zadatak ===&lt;br /&gt;
U &#039;&#039;&#039;STRIDE&#039;&#039;&#039; metodologiji, šta predstavlja pretnju Autorizaciji?&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;
# Skrivanje identiteta&lt;br /&gt;
# Neautorizovana izmena podataka&lt;br /&gt;
# Osporavanje&lt;br /&gt;
# Neautorizovan pristup podacima&lt;br /&gt;
# Onemogućavanje pristupa&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Podizanje privilegija&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 7. zadatak ===&lt;br /&gt;
U &#039;&#039;&#039;OSSTMM&#039;&#039;&#039;, šta predstavlja slepo testiranje?&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;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Analitičar nema predznanje o sistemu, a meta je spremna i unapred upoznata sa testiranjem.&amp;lt;/span&amp;gt;&lt;br /&gt;
# Analitičar nema predznanje o sistemu, a meta nije spremna niti upoznata sa testiranjem.&lt;br /&gt;
# Analitičar poznaje kanale napada i delimično odbrane, a meta je spremna i unapred upoznata sa svim detaljima.&lt;br /&gt;
# Analitičar poznaje kanale napada i delimično odbrane, a meta je upoznata sa okvirom testiranja, ali ne i sa kanalima i vektorima napada.&lt;br /&gt;
# Analitičar poznaje sve detalje o mogućim napadima, a meta je spremna i unapred upoznata sa svim detaljima.&lt;br /&gt;
# Analitičar poznaje sve detalje o mogućim napadima, a meta nije spremna niti upoznata sa testiranjem.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 8. zadatak ===&lt;br /&gt;
Šta predstavlja &#039;&#039;&#039;deljenje rizika&#039;&#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;
# Promena dizajna modula, dodavanje novih radnih zadataka, kupovina dodatnih alata?&lt;br /&gt;
# Uklanjanje modula koji uvodi rizik&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Angažovanje treće strane da se izbegne pretnja ili informisanje klijenta da je njegova obavaza da se pozabavi pretnjom&amp;lt;/span&amp;gt;&lt;br /&gt;
# Prihvatanje rizika&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 9. zadatak ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
LOG_FILE_LIST = [&amp;quot;data_log&amp;quot;, &amp;quot;system&amp;quot;, &amp;quot;access&amp;quot;]&lt;br /&gt;
def read_logs(log_file_name):&lt;br /&gt;
	if log_file_name not in LOG_FILE_LIST:&lt;br /&gt;
		return &amp;quot;Invalid log file name&amp;quot;&lt;br /&gt;
	result = subprocess.run([&amp;quot;cat&amp;quot;, f&amp;quot;/var/log/{log_file_name}.log&amp;quot;], capture_output=True, text=True)&lt;br /&gt;
    return result.stdout&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Koja tehnika je primenjena?&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;
# Blackisting&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Whitelisting&amp;lt;/span&amp;gt;&lt;br /&gt;
# Bezbedan poziv API&lt;br /&gt;
# Beleženje korisničkih akcija&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 10. zadatak ===&lt;br /&gt;
Za isti kod iz prethodnog zadatka unosi se&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
system; rm -rf /&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Objasniti kako će biti obrađen ovaj unos.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
LOG_FILE_LIST = [&amp;quot;data_log&amp;quot;, &amp;quot;system&amp;quot;, &amp;quot;access&amp;quot;]&lt;br /&gt;
def read_logs(log_file_name):&lt;br /&gt;
	if log_file_name not in LOG_FILE_LIST:&lt;br /&gt;
		return &amp;quot;Invalid log file name&amp;quot;&lt;br /&gt;
	result = subprocess.run([&amp;quot;cat&amp;quot;, f&amp;quot;/var/log/{log_file_name}.log&amp;quot;], capture_output=True, text=True)&lt;br /&gt;
    return result.stdout&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dodatno ukratko objasniti ovaj mehanizam zaštite.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Odgovor:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;div class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;plain&amp;quot;&amp;gt;&lt;br /&gt;
Unos pored dozvoljene niske sadrži i nedozvoljene karaktere, pa će program vratiti Invalid log file name. Ovde se koristi tehnika &#039;&#039;whitelisting&#039;&#039;, za sprečavanje &#039;&#039;Command injection&#039;&#039; napada - do kog dolazi usled &#039;&#039;Improper input validation&#039;&#039;. Postoji lista dozvoljenih unosa, ako naš unos nije među njima, on se odbacuje i prijavljuje se greška. Ovo je proaktivan pristup, smanjuje značajno mogućnost za napad i samim tim je bolja tehnika od blackistinga.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Napomene ==&lt;br /&gt;
* Ovaj rok je napisan &amp;lt;strong&amp;gt;isključivo po sećanju studenata&amp;lt;/strong&amp;gt;.&lt;br /&gt;
* U određenim zadacima eksplicitne vrednosti ili ponuđeni odgovori možda nisu iste kao u originalnoj postavci, međutim u svim zadacima gde je to slučaj, očuvana je suština zadatka.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:РБС]]&lt;/div&gt;</summary>
		<author><name>Aleksa</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%A0%D0%91%D0%A1/%D0%88%D0%B0%D0%BD%D1%83%D0%B0%D1%80_2026&amp;diff=8266</id>
		<title>РБС/Јануар 2026</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%A0%D0%91%D0%A1/%D0%88%D0%B0%D0%BD%D1%83%D0%B0%D1%80_2026&amp;diff=8266"/>
		<updated>2026-02-19T07:50:42Z</updated>

		<summary type="html">&lt;p&gt;Aleksa: /* 4. zadatak */  typo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&#039;&#039;&#039;Ispit u januarskom ispitnom roku 2026. godine&#039;&#039;&#039; održan je 18. februara, trajao je sat vremena i radio se preko platforme &#039;&#039;Moodle&#039;&#039; u &#039;&#039;Secure browser&#039;&#039;.&lt;br /&gt;
{{rešenja}}&lt;br /&gt;
&lt;br /&gt;
=== 1. zadatak ===&lt;br /&gt;
U &#039;&#039;Heartbeat&#039;&#039; protokolu koristi se bibliotečka funkcija &#039;&#039;memcpy&#039;&#039; iz jezika &#039;&#039;&#039;C&#039;&#039;&#039; i njeno korišćenje je dovelo do ranjivosti &#039;&#039;Heartblead&#039;&#039;. Objasniti kako je ova funkcija dovela do toga i kako se ovo može prevazići.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Odgovor:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;div class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;plain&amp;quot;&amp;gt;&lt;br /&gt;
Funkcija ima potpis memcpy(bp, pl, payload) koja kopira payload bajtova iz bafera pl u bp. Ovo se koristi u Heartbeat za proveru da li je server aktivan. Klijent šalje poruku i dužinu poruke serveru, i server odgovara istom porukom. Ranjivost nastaje jer se ne radi provera da li je payload veći od veličine pl, pa klijent može da pošalje poruku veličine 4B, a payload da postavi na 128KB, i samim tim da pročita osetljive informacije - lozinke, podatke o brojevima kreditnih kartica i slično - buffer overread. Ovo se može prevazići jednostavnom proverom da li je payload veći od veličine pl, i ako da da se prijavi greška.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. zadatak ===&lt;br /&gt;
Šta od navedenog ne spada u principe bezbednog dizajna:&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;
# Razdvojiti odgovornosti&lt;br /&gt;
# Osigurati najslabiju kariku&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Dodeliti najveće potrebne privilegije&amp;lt;/span&amp;gt;&lt;br /&gt;
# Koristiti jednostavna rešenja&lt;br /&gt;
# Beležiti osetljive događaje&lt;br /&gt;
# Ne oslanjati se na nejasnost&lt;br /&gt;
# Implementirati odbranu u dubinu&lt;br /&gt;
# Ne izmišljati bezbednosnu tehnologiju&lt;br /&gt;
# Oprezno dodeljivati poverenje:&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. zadatak ===&lt;br /&gt;
Postoje eksplicitni i kvalitativni sigurnosni zahtevi. Odakle potiču eksplicitni sigurnosni zahtevi. Navesti primer eksplicitnog zahteva i objasniti kako je dobijen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Odgovor:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;div class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;plain&amp;quot;&amp;gt;&lt;br /&gt;
Eksplicitni zahtevi potiči iz regulativa i standarda. Regulative propisuju zaštitu IKT i zaštitu od napada (zakoni). Moraju se ispoštovati. Standardni su dokumenta odobrena od strane prepoznatih ili priznatih tela za standardizaciju. Ne moraju se ispoštivati. Primer eksplicitnog zahteva - zakon propisuje da nalozi na eUpravi moraju imati lozinku od najmanje 10 karaktera, i to bar 1 veliko slovo, bar 1 broj i bar 1 specijalni karakter iz određenog skupa. Ovo je dobijeno jer je pokazano da se primenom ovih kriterijuma otežava provaljivanje lozinke poznatim tehnikama.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 4. zadatak ===&lt;br /&gt;
Ako u sistemu imamo 5 objekata i 5000 subjekata, koju kontrolu pristupa je bolje koristiti?&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;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Kontrola pristupa zasnovana na ulogama&amp;lt;/span&amp;gt;&lt;br /&gt;
# Liste za kontrolu pristupa&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 5. zadatak ===&lt;br /&gt;
U &#039;&#039;NIST SSDF&#039;&#039; da li se koristi staticko testiranje i ako da, u kojoj fazi?&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;
# Priprema organizacije&lt;br /&gt;
# Zaštita softvera&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Produkcija dobro zaštićenog softvera&amp;lt;/span&amp;gt;&lt;br /&gt;
# Odgovor na ranjivosti&lt;br /&gt;
# Ne primenjuje se&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 6. zadatak ===&lt;br /&gt;
U &#039;&#039;&#039;STRIDE&#039;&#039;&#039; metodologiji, šta predstavlja pretnju Autorizaciji?&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;
# Skrivanje identiteta&lt;br /&gt;
# Neautorizovana izmena podataka&lt;br /&gt;
# Osporavanje&lt;br /&gt;
# Neautorizovan pristup podacima&lt;br /&gt;
# Onemogućavanje pristupa&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Podizanje privilegija&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 7. zadatak ===&lt;br /&gt;
U &#039;&#039;&#039;OSSTMM&#039;&#039;&#039;, šta predstavlja slepo testiranje?&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;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Analitičar nema predznanje o sistemu, a meta je spremna i unapred upoznata sa testiranjem.&amp;lt;/span&amp;gt;&lt;br /&gt;
# Analitičar nema predznanje o sistemu, a meta nije spremna niti upoznata sa testiranjem.&lt;br /&gt;
# Analitičar poznaje kanale napada i delimično odbrane, a meta je spremna i unapred upoznata sa svim detaljima.&lt;br /&gt;
# Analitičar poznaje kanale napada i delimično odbrane, a meta je upoznata sa okvirom testiranja, ali ne i sa kanalima i vektorima napada.&lt;br /&gt;
# Analitičar poznaje sve detalje o mogućim napadima, a meta je spremna i unapred upoznata sa svim detaljima.&lt;br /&gt;
# Analitičar poznaje sve detalje o mogućim napadima, a meta nije spremna niti upoznata sa testiranjem.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 8. zadatak ===&lt;br /&gt;
Šta predstavlja &#039;&#039;&#039;deljenje rizika&#039;&#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;
# Promena dizajna modula, dodavanje novih radnih zadataka, kupovina dodatnih alata?&lt;br /&gt;
# Uklanjanje modula koji uvodi rizik&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Angažovanje treće strane da se izbegne pretnja ili informisanje klijenta da je njegova obavaza da se pozabavi pretnjom&amp;lt;/span&amp;gt;&lt;br /&gt;
# Prihvatanje rizika&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 9. zadatak ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
LOG_FILE_LIST = [&amp;quot;data_log&amp;quot;, &amp;quot;system&amp;quot;, &amp;quot;access&amp;quot;]&lt;br /&gt;
def read_logs(log_file_name):&lt;br /&gt;
	if log_file_name not in LOG_FILE_LIST:&lt;br /&gt;
		return &amp;quot;Invalid log file name&amp;quot;&lt;br /&gt;
	result = subprocess.run([&amp;quot;cat&amp;quot;, f&amp;quot;/var/log/{log_file_name}.log&amp;quot;], capture_output=True, text=True)&lt;br /&gt;
    return result.stdout&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Koja tehnika je primenjena?&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;
# Blackisting&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Whitelisting&amp;lt;/span&amp;gt;&lt;br /&gt;
# Bezbedan poziv API&lt;br /&gt;
# Beleženje korisničkih akcija&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 10. zadatak ===&lt;br /&gt;
Za isti kod iz prethodnog zadatka unosi se&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
system; rm -rf /&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Objasniti kako će biti obrađen ovaj unos.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
LOG_FILE_LIST = [&amp;quot;data_log&amp;quot;, &amp;quot;system&amp;quot;, &amp;quot;access&amp;quot;]&lt;br /&gt;
def read_logs(log_file_name):&lt;br /&gt;
	if log_file_name not in LOG_FILE_LIST:&lt;br /&gt;
		return &amp;quot;Invalid log file name&amp;quot;&lt;br /&gt;
	result = subprocess.run([&amp;quot;cat&amp;quot;, f&amp;quot;/var/log/{log_file_name}.log&amp;quot;], capture_output=True, text=True)&lt;br /&gt;
    return result.stdout&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dodatno ukratko objasniti ovaj mehanizam zaštite.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Odgovor:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;div class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;plain&amp;quot;&amp;gt;&lt;br /&gt;
Unos pored dozvoljene niske sadrži i nedozvoljene karaktere, pa će program vratiti Invalid log file name. Ovde se koristi tehnika &#039;&#039;whitelisting&#039;&#039;, za sprečavanje &#039;&#039;Command injection&#039;&#039; napada - do kog dolazi usled &#039;&#039;Improper input validation&#039;&#039;. Postoji lista dozvoljenih unosa, ako naš unos nije među njima, on se odbacuje i prijavljuje se greška. Ovo je proaktivan pristup, smanjuje značajno mogućnost za napad i samim tim je bolja tehnika od blackistinga.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Napomene ==&lt;br /&gt;
* Ovaj rok je napisan &amp;lt;strong&amp;gt;isključivo po sećanju studenata&amp;lt;/strong&amp;gt;.&lt;br /&gt;
* U određenim zadacima eksplicitne vrednosti ili ponuđeni odgovori možda nisu iste kao u originalnoj postavci, međutim u svim zadacima gde je to slučaj, očuvana je suština zadatka.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:РБС]]&lt;/div&gt;</summary>
		<author><name>Aleksa</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%A0%D0%91%D0%A1&amp;diff=8265</id>
		<title>РБС</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%A0%D0%91%D0%A1&amp;diff=8265"/>
		<updated>2026-02-18T20:51:20Z</updated>

		<summary type="html">&lt;p&gt;Aleksa: /* Пројекат */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Предмет&lt;br /&gt;
| назив     = Развој безбедног софтвера&lt;br /&gt;
| шифра     = 13М111РБС&lt;br /&gt;
| семестар  = 9&lt;br /&gt;
| статус    = изборни&lt;br /&gt;
| страница  = [https://rti.etf.bg.ac.rs/rti/ms1rbs rti.etf.bg.ac.rs/rti/ms1rbs]&lt;br /&gt;
| одсек     = СИ&lt;br /&gt;
}}&lt;br /&gt;
&#039;&#039;&#039;Развој безбедног софтвера&#039;&#039;&#039; је изборни предмет из групе А на мастер студијама, на модулу СИ.&lt;br /&gt;
&lt;br /&gt;
== Корисне везе ==&lt;br /&gt;
&amp;lt;!-- Остале корисне везе, попут веза до развојних окружења која се користе на предмету --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Настава ==&lt;br /&gt;
На предмету се држе предавања и вежбе. На предавањима се обрађује следеће градиво:&lt;br /&gt;
* Сигурносни захтеви&lt;br /&gt;
* Дизајн безбедног софтвера&lt;br /&gt;
* Моделовање претњи&lt;br /&gt;
* Рањивост веб апликација&lt;br /&gt;
* Рањивости скрипт језика&lt;br /&gt;
* &#039;&#039;API&#039;&#039; напади и одбране&lt;br /&gt;
* &#039;&#039;Java&#039;&#039; специфичности&lt;br /&gt;
* Тестирање сигурности апликација&lt;br /&gt;
&lt;br /&gt;
На вежбама се обрађује следеће градиво:&lt;br /&gt;
* &#039;&#039;SQL&#039;&#039; инјекције&lt;br /&gt;
* &#039;&#039;Cross-site scripting (XSS)&#039;&#039;&lt;br /&gt;
* &#039;&#039;Cross Site Request Forgery (CSRF)&#039;&#039;&lt;br /&gt;
* Алати за статичку и динамичку анализу кода&lt;br /&gt;
* Сигурна имплементација аутентикације&lt;br /&gt;
* Ауторизација&lt;br /&gt;
* Сигурност и &#039;&#039;DevOps&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На испиту долази градиво са предавања, док градиво са вежби служи као припрема за пројекат.&lt;br /&gt;
&lt;br /&gt;
== Лабораторијске вежбе ==&lt;br /&gt;
Раде се одмах након вежби, као припрема за пројекат.&lt;br /&gt;
&lt;br /&gt;
== Семестрални рад ==&lt;br /&gt;
Носи 20 поена, ради се у групама, представља анализу рада са конференције и брани се у току семестра или у јануарском року. Уместо анализе рада, може се направити 10 &#039;&#039;Capture the flag&#039;&#039; изазова за одабрани пропуст.&lt;br /&gt;
&lt;br /&gt;
== Пројекат ==&lt;br /&gt;
Вреди 40 поена, ради се самостално и представља синтезу градива са вежби. Може се бранити у јанурском, фебруарском или јулском року.&lt;br /&gt;
&lt;br /&gt;
== Испитни рокови ==&lt;br /&gt;
Рокови нису доступни са странице предмета. Следећи рокови су сакупљени на викију:&lt;br /&gt;
{{#dpl:&lt;br /&gt;
| category    = РБС&lt;br /&gt;
| category    = Рокови&lt;br /&gt;
| format      = ,\n* &amp;lt;span class=&amp;quot;rok,&amp;quot;&amp;gt;[[%PAGE%|²{#invoke:String¦sub¦%PAGE%¦5¦-1}²]]&amp;lt;/span&amp;gt;,&lt;br /&gt;
| ordermethod = title&lt;br /&gt;
| include     = {nerešeno}.dpl, {delimično rešeno}.dpl, {нерешено}.dpl, {делимично решено}.dpl&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Начин оцењивања ==&lt;br /&gt;
* &amp;lt;math&amp;gt;PR&amp;lt;/math&amp;gt; — Бодови са практичног теста (0-40)&lt;br /&gt;
* &amp;lt;math&amp;gt;SEM&amp;lt;/math&amp;gt; — Бодови са семинарског рада (0-20)&lt;br /&gt;
* &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; — Бодови са испита (0-40)&lt;br /&gt;
* Укупни бодови: &amp;lt;math&amp;gt;P = PR + SEM + I&amp;lt;/math&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Бодови&lt;br /&gt;
| &amp;lt;math&amp;gt;P \leq 50&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;50 &amp;lt; P \leq 60&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;60 &amp;lt; P \leq 70&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;70 &amp;lt; P \leq 80&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;80 &amp;lt; P \leq 90&amp;lt;/math&amp;gt; || &amp;lt;math&amp;gt;90 &amp;lt; P&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Оцена&lt;br /&gt;
| 5 || 6 || 7 || 8 || 9 || 10&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Потребна помоћ ==&lt;br /&gt;
* {{задаци|postavke}}&lt;br /&gt;
* {{задаци|prepis}}&lt;br /&gt;
** Јавити се неком од старијих уређивача викија како би добили непреписане рокове.&lt;/div&gt;</summary>
		<author><name>Aleksa</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9A%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D1%98%D0%B0:%D0%A0%D0%91%D0%A1&amp;diff=8264</id>
		<title>Категорија:РБС</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9A%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D1%98%D0%B0:%D0%A0%D0%91%D0%A1&amp;diff=8264"/>
		<updated>2026-02-18T20:48:32Z</updated>

		<summary type="html">&lt;p&gt;Aleksa: Направљена празна страница&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Aleksa</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%A0%D0%91%D0%A1/%D0%88%D0%B0%D0%BD%D1%83%D0%B0%D1%80_2026&amp;diff=8263</id>
		<title>РБС/Јануар 2026</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%A0%D0%91%D0%A1/%D0%88%D0%B0%D0%BD%D1%83%D0%B0%D1%80_2026&amp;diff=8263"/>
		<updated>2026-02-18T16:35:54Z</updated>

		<summary type="html">&lt;p&gt;Aleksa: /* 9. zadatak */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&#039;&#039;&#039;Ispit u januarskom ispitnom roku 2026. godine&#039;&#039;&#039; održan je 18. februara, trajao je sat vremena i radio se preko platforme &#039;&#039;Moodle&#039;&#039; u &#039;&#039;Secure browser&#039;&#039;.&lt;br /&gt;
{{rešenja}}&lt;br /&gt;
&lt;br /&gt;
=== 1. zadatak ===&lt;br /&gt;
U &#039;&#039;Heartbeat&#039;&#039; protokolu koristi se bibliotečka funkcija &#039;&#039;memcpy&#039;&#039; iz jezika &#039;&#039;&#039;C&#039;&#039;&#039; i njeno korišćenje je dovelo do ranjivosti &#039;&#039;Heartblead&#039;&#039;. Objasniti kako je ova funkcija dovela do toga i kako se ovo može prevazići.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Odgovor:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;div class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;plain&amp;quot;&amp;gt;&lt;br /&gt;
Funkcija ima potpis memcpy(bp, pl, payload) koja kopira payload bajtova iz bafera pl u bp. Ovo se koristi u Heartbeat za proveru da li je server aktivan. Klijent šalje poruku i dužinu poruke serveru, i server odgovara istom porukom. Ranjivost nastaje jer se ne radi provera da li je payload veći od veličine pl, pa klijent može da pošalje poruku veličine 4B, a payload da postavi na 128KB, i samim tim da pročita osetljive informacije - lozinke, podatke o brojevima kreditnih kartica i slično - buffer overread. Ovo se može prevazići jednostavnom proverom da li je payload veći od veličine pl, i ako da da se prijavi greška.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. zadatak ===&lt;br /&gt;
Šta od navedenog ne spada u principe bezbednog dizajna:&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;
# Razdvojiti odgovornosti&lt;br /&gt;
# Osigurati najslabiju kariku&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Dodeliti najveće potrebne privilegije&amp;lt;/span&amp;gt;&lt;br /&gt;
# Koristiti jednostavna rešenja&lt;br /&gt;
# Beležiti osetljive događaje&lt;br /&gt;
# Ne oslanjati se na nejasnost&lt;br /&gt;
# Implementirati odbranu u dubinu&lt;br /&gt;
# Ne izmišljati bezbednosnu tehnologiju&lt;br /&gt;
# Oprezno dodeljivati poverenje:&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. zadatak ===&lt;br /&gt;
Postoje eksplicitni i kvalitativni sigurnosni zahtevi. Odakle potiču eksplicitni sigurnosni zahtevi. Navesti primer eksplicitnog zahteva i objasniti kako je dobijen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Odgovor:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;div class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;plain&amp;quot;&amp;gt;&lt;br /&gt;
Eksplicitni zahtevi potiči iz regulativa i standarda. Regulative propisuju zaštitu IKT i zaštitu od napada (zakoni). Moraju se ispoštovati. Standardni su dokumenta odobrena od strane prepoznatih ili priznatih tela za standardizaciju. Ne moraju se ispoštivati. Primer eksplicitnog zahteva - zakon propisuje da nalozi na eUpravi moraju imati lozinku od najmanje 10 karaktera, i to bar 1 veliko slovo, bar 1 broj i bar 1 specijalni karakter iz određenog skupa. Ovo je dobijeno jer je pokazano da se primenom ovih kriterijuma otežava provaljivanje lozinke poznatim tehnikama.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 4. zadatak ===&lt;br /&gt;
Ako u sistemu umamo 5 objekata i 5000 subjekata, koju kontrolu pristupa je bolje koristiti?&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;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Kontrola pristupa zasnovana na ulogama&amp;lt;/span&amp;gt;&lt;br /&gt;
# Liste za kontrolu pristupa&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 5. zadatak ===&lt;br /&gt;
U &#039;&#039;NIST SSDF&#039;&#039; da li se koristi staticko testiranje i ako da, u kojoj fazi?&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;
# Priprema organizacije&lt;br /&gt;
# Zaštita softvera&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Produkcija dobro zaštićenog softvera&amp;lt;/span&amp;gt;&lt;br /&gt;
# Odgovor na ranjivosti&lt;br /&gt;
# Ne primenjuje se&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 6. zadatak ===&lt;br /&gt;
U &#039;&#039;&#039;STRIDE&#039;&#039;&#039; metodologiji, šta predstavlja pretnju Autorizaciji?&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;
# Skrivanje identiteta&lt;br /&gt;
# Neautorizovana izmena podataka&lt;br /&gt;
# Osporavanje&lt;br /&gt;
# Neautorizovan pristup podacima&lt;br /&gt;
# Onemogućavanje pristupa&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Podizanje privilegija&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 7. zadatak ===&lt;br /&gt;
U &#039;&#039;&#039;OSSTMM&#039;&#039;&#039;, šta predstavlja slepo testiranje?&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;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Analitičar nema predznanje o sistemu, a meta je spremna i unapred upoznata sa testiranjem.&amp;lt;/span&amp;gt;&lt;br /&gt;
# Analitičar nema predznanje o sistemu, a meta nije spremna niti upoznata sa testiranjem.&lt;br /&gt;
# Analitičar poznaje kanale napada i delimično odbrane, a meta je spremna i unapred upoznata sa svim detaljima.&lt;br /&gt;
# Analitičar poznaje kanale napada i delimično odbrane, a meta je upoznata sa okvirom testiranja, ali ne i sa kanalima i vektorima napada.&lt;br /&gt;
# Analitičar poznaje sve detalje o mogućim napadima, a meta je spremna i unapred upoznata sa svim detaljima.&lt;br /&gt;
# Analitičar poznaje sve detalje o mogućim napadima, a meta nije spremna niti upoznata sa testiranjem.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 8. zadatak ===&lt;br /&gt;
Šta predstavlja &#039;&#039;&#039;deljenje rizika&#039;&#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;
# Promena dizajna modula, dodavanje novih radnih zadataka, kupovina dodatnih alata?&lt;br /&gt;
# Uklanjanje modula koji uvodi rizik&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Angažovanje treće strane da se izbegne pretnja ili informisanje klijenta da je njegova obavaza da se pozabavi pretnjom&amp;lt;/span&amp;gt;&lt;br /&gt;
# Prihvatanje rizika&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 9. zadatak ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
LOG_FILE_LIST = [&amp;quot;data_log&amp;quot;, &amp;quot;system&amp;quot;, &amp;quot;access&amp;quot;]&lt;br /&gt;
def read_logs(log_file_name):&lt;br /&gt;
	if log_file_name not in LOG_FILE_LIST:&lt;br /&gt;
		return &amp;quot;Invalid log file name&amp;quot;&lt;br /&gt;
	result = subprocess.run([&amp;quot;cat&amp;quot;, f&amp;quot;/var/log/{log_file_name}.log&amp;quot;], capture_output=True, text=True)&lt;br /&gt;
    return result.stdout&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Koja tehnika je primenjena?&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;
# Blackisting&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Whitelisting&amp;lt;/span&amp;gt;&lt;br /&gt;
# Bezbedan poziv API&lt;br /&gt;
# Beleženje korisničkih akcija&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 10. zadatak ===&lt;br /&gt;
Za isti kod iz prethodnog zadatka unosi se&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
system; rm -rf /&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Objasniti kako će biti obrađen ovaj unos.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
LOG_FILE_LIST = [&amp;quot;data_log&amp;quot;, &amp;quot;system&amp;quot;, &amp;quot;access&amp;quot;]&lt;br /&gt;
def read_logs(log_file_name):&lt;br /&gt;
	if log_file_name not in LOG_FILE_LIST:&lt;br /&gt;
		return &amp;quot;Invalid log file name&amp;quot;&lt;br /&gt;
	result = subprocess.run([&amp;quot;cat&amp;quot;, f&amp;quot;/var/log/{log_file_name}.log&amp;quot;], capture_output=True, text=True)&lt;br /&gt;
    return result.stdout&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dodatno ukratko objasniti ovaj mehanizam zaštite.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Odgovor:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;div class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;plain&amp;quot;&amp;gt;&lt;br /&gt;
Unos pored dozvoljene niske sadrži i nedozvoljene karaktere, pa će program vratiti Invalid log file name. Ovde se koristi tehnika &#039;&#039;whitelisting&#039;&#039;, za sprečavanje &#039;&#039;Command injection&#039;&#039; napada - do kog dolazi usled &#039;&#039;Improper input validation&#039;&#039;. Postoji lista dozvoljenih unosa, ako naš unos nije među njima, on se odbacuje i prijavljuje se greška. Ovo je proaktivan pristup, smanjuje značajno mogućnost za napad i samim tim je bolja tehnika od blackistinga.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Napomene ==&lt;br /&gt;
* Ovaj rok je napisan &amp;lt;strong&amp;gt;isključivo po sećanju studenata&amp;lt;/strong&amp;gt;.&lt;br /&gt;
* U određenim zadacima eksplicitne vrednosti ili ponuđeni odgovori možda nisu iste kao u originalnoj postavci, međutim u svim zadacima gde je to slučaj, očuvana je suština zadatka.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:РБС]]&lt;/div&gt;</summary>
		<author><name>Aleksa</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%A0%D0%91%D0%A1/%D0%88%D0%B0%D0%BD%D1%83%D0%B0%D1%80_2026&amp;diff=8262</id>
		<title>РБС/Јануар 2026</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%A0%D0%91%D0%A1/%D0%88%D0%B0%D0%BD%D1%83%D0%B0%D1%80_2026&amp;diff=8262"/>
		<updated>2026-02-18T16:34:51Z</updated>

		<summary type="html">&lt;p&gt;Aleksa: Нова страница: {{tocright}} &amp;#039;&amp;#039;&amp;#039;Ispit u januarskom ispitnom roku 2026. godine&amp;#039;&amp;#039;&amp;#039; održan je 18. februara, trajao je sat vremena i radio se preko platforme &amp;#039;&amp;#039;Moodle&amp;#039;&amp;#039; u &amp;#039;&amp;#039;Secure browser&amp;#039;&amp;#039;. {{rešenja}}  === 1. zadatak === U &amp;#039;&amp;#039;Heartbeat&amp;#039;&amp;#039; protokolu koristi se bibliotečka funkcija &amp;#039;&amp;#039;memcpy&amp;#039;&amp;#039; iz jezika &amp;#039;&amp;#039;&amp;#039;C&amp;#039;&amp;#039;&amp;#039; i njeno korišćenje je dovelo do ranjivosti &amp;#039;&amp;#039;Heartblead&amp;#039;&amp;#039;. Objasniti kako je ova funkcija dovela do toga i kako se ovo može prevazići.  &amp;#039;&amp;#039;&amp;#039;Odgovor:&amp;#039;&amp;#039;&amp;#039; &amp;lt;div class=&amp;quot;spoiler&amp;quot;…&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&#039;&#039;&#039;Ispit u januarskom ispitnom roku 2026. godine&#039;&#039;&#039; održan je 18. februara, trajao je sat vremena i radio se preko platforme &#039;&#039;Moodle&#039;&#039; u &#039;&#039;Secure browser&#039;&#039;.&lt;br /&gt;
{{rešenja}}&lt;br /&gt;
&lt;br /&gt;
=== 1. zadatak ===&lt;br /&gt;
U &#039;&#039;Heartbeat&#039;&#039; protokolu koristi se bibliotečka funkcija &#039;&#039;memcpy&#039;&#039; iz jezika &#039;&#039;&#039;C&#039;&#039;&#039; i njeno korišćenje je dovelo do ranjivosti &#039;&#039;Heartblead&#039;&#039;. Objasniti kako je ova funkcija dovela do toga i kako se ovo može prevazići.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Odgovor:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;div class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;plain&amp;quot;&amp;gt;&lt;br /&gt;
Funkcija ima potpis memcpy(bp, pl, payload) koja kopira payload bajtova iz bafera pl u bp. Ovo se koristi u Heartbeat za proveru da li je server aktivan. Klijent šalje poruku i dužinu poruke serveru, i server odgovara istom porukom. Ranjivost nastaje jer se ne radi provera da li je payload veći od veličine pl, pa klijent može da pošalje poruku veličine 4B, a payload da postavi na 128KB, i samim tim da pročita osetljive informacije - lozinke, podatke o brojevima kreditnih kartica i slično - buffer overread. Ovo se može prevazići jednostavnom proverom da li je payload veći od veličine pl, i ako da da se prijavi greška.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. zadatak ===&lt;br /&gt;
Šta od navedenog ne spada u principe bezbednog dizajna:&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;
# Razdvojiti odgovornosti&lt;br /&gt;
# Osigurati najslabiju kariku&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Dodeliti najveće potrebne privilegije&amp;lt;/span&amp;gt;&lt;br /&gt;
# Koristiti jednostavna rešenja&lt;br /&gt;
# Beležiti osetljive događaje&lt;br /&gt;
# Ne oslanjati se na nejasnost&lt;br /&gt;
# Implementirati odbranu u dubinu&lt;br /&gt;
# Ne izmišljati bezbednosnu tehnologiju&lt;br /&gt;
# Oprezno dodeljivati poverenje:&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. zadatak ===&lt;br /&gt;
Postoje eksplicitni i kvalitativni sigurnosni zahtevi. Odakle potiču eksplicitni sigurnosni zahtevi. Navesti primer eksplicitnog zahteva i objasniti kako je dobijen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Odgovor:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;div class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;plain&amp;quot;&amp;gt;&lt;br /&gt;
Eksplicitni zahtevi potiči iz regulativa i standarda. Regulative propisuju zaštitu IKT i zaštitu od napada (zakoni). Moraju se ispoštovati. Standardni su dokumenta odobrena od strane prepoznatih ili priznatih tela za standardizaciju. Ne moraju se ispoštivati. Primer eksplicitnog zahteva - zakon propisuje da nalozi na eUpravi moraju imati lozinku od najmanje 10 karaktera, i to bar 1 veliko slovo, bar 1 broj i bar 1 specijalni karakter iz određenog skupa. Ovo je dobijeno jer je pokazano da se primenom ovih kriterijuma otežava provaljivanje lozinke poznatim tehnikama.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 4. zadatak ===&lt;br /&gt;
Ako u sistemu umamo 5 objekata i 5000 subjekata, koju kontrolu pristupa je bolje koristiti?&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;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Kontrola pristupa zasnovana na ulogama&amp;lt;/span&amp;gt;&lt;br /&gt;
# Liste za kontrolu pristupa&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 5. zadatak ===&lt;br /&gt;
U &#039;&#039;NIST SSDF&#039;&#039; da li se koristi staticko testiranje i ako da, u kojoj fazi?&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;
# Priprema organizacije&lt;br /&gt;
# Zaštita softvera&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Produkcija dobro zaštićenog softvera&amp;lt;/span&amp;gt;&lt;br /&gt;
# Odgovor na ranjivosti&lt;br /&gt;
# Ne primenjuje se&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 6. zadatak ===&lt;br /&gt;
U &#039;&#039;&#039;STRIDE&#039;&#039;&#039; metodologiji, šta predstavlja pretnju Autorizaciji?&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;
# Skrivanje identiteta&lt;br /&gt;
# Neautorizovana izmena podataka&lt;br /&gt;
# Osporavanje&lt;br /&gt;
# Neautorizovan pristup podacima&lt;br /&gt;
# Onemogućavanje pristupa&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Podizanje privilegija&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 7. zadatak ===&lt;br /&gt;
U &#039;&#039;&#039;OSSTMM&#039;&#039;&#039;, šta predstavlja slepo testiranje?&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;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Analitičar nema predznanje o sistemu, a meta je spremna i unapred upoznata sa testiranjem.&amp;lt;/span&amp;gt;&lt;br /&gt;
# Analitičar nema predznanje o sistemu, a meta nije spremna niti upoznata sa testiranjem.&lt;br /&gt;
# Analitičar poznaje kanale napada i delimično odbrane, a meta je spremna i unapred upoznata sa svim detaljima.&lt;br /&gt;
# Analitičar poznaje kanale napada i delimično odbrane, a meta je upoznata sa okvirom testiranja, ali ne i sa kanalima i vektorima napada.&lt;br /&gt;
# Analitičar poznaje sve detalje o mogućim napadima, a meta je spremna i unapred upoznata sa svim detaljima.&lt;br /&gt;
# Analitičar poznaje sve detalje o mogućim napadima, a meta nije spremna niti upoznata sa testiranjem.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 8. zadatak ===&lt;br /&gt;
Šta predstavlja &#039;&#039;&#039;deljenje rizika&#039;&#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;
# Promena dizajna modula, dodavanje novih radnih zadataka, kupovina dodatnih alata?&lt;br /&gt;
# Uklanjanje modula koji uvodi rizik&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Angažovanje treće strane da se izbegne pretnja ili informisanje klijenta da je njegova obavaza da se pozabavi pretnjom&amp;lt;/span&amp;gt;&lt;br /&gt;
# Prihvatanje rizika&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 9. zadatak ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
LOG_FILE_LIST = [&amp;quot;data_log&amp;quot;, &amp;quot;system&amp;quot;, &amp;quot;access&amp;quot;]&lt;br /&gt;
def read_logs(log_file_name):&lt;br /&gt;
	if log_file_name not in LOG_FILE_LIST:&lt;br /&gt;
		return &amp;quot;Invalid log file name&amp;quot;&lt;br /&gt;
	result = subprocess.run([&amp;quot;cat&amp;quot;, f&amp;quot;/var/log/{log_file_name}.log&amp;quot;], capture_output=True, text=True)&lt;br /&gt;
    return result.stdout&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Koja tehnika je primenjena?&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;
# Blackist&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Whitelist&amp;lt;/span&amp;gt;&lt;br /&gt;
# Bezbedan poziv API&lt;br /&gt;
# Beleženje korisničkih akcija&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 10. zadatak ===&lt;br /&gt;
Za isti kod iz prethodnog zadatka unosi se&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
system; rm -rf /&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Objasniti kako će biti obrađen ovaj unos.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
LOG_FILE_LIST = [&amp;quot;data_log&amp;quot;, &amp;quot;system&amp;quot;, &amp;quot;access&amp;quot;]&lt;br /&gt;
def read_logs(log_file_name):&lt;br /&gt;
	if log_file_name not in LOG_FILE_LIST:&lt;br /&gt;
		return &amp;quot;Invalid log file name&amp;quot;&lt;br /&gt;
	result = subprocess.run([&amp;quot;cat&amp;quot;, f&amp;quot;/var/log/{log_file_name}.log&amp;quot;], capture_output=True, text=True)&lt;br /&gt;
    return result.stdout&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dodatno ukratko objasniti ovaj mehanizam zaštite.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Odgovor:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;div class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;plain&amp;quot;&amp;gt;&lt;br /&gt;
Unos pored dozvoljene niske sadrži i nedozvoljene karaktere, pa će program vratiti Invalid log file name. Ovde se koristi tehnika &#039;&#039;whitelisting&#039;&#039;, za sprečavanje &#039;&#039;Command injection&#039;&#039; napada - do kog dolazi usled &#039;&#039;Improper input validation&#039;&#039;. Postoji lista dozvoljenih unosa, ako naš unos nije među njima, on se odbacuje i prijavljuje se greška. Ovo je proaktivan pristup, smanjuje značajno mogućnost za napad i samim tim je bolja tehnika od blackistinga.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Napomene ==&lt;br /&gt;
* Ovaj rok je napisan &amp;lt;strong&amp;gt;isključivo po sećanju studenata&amp;lt;/strong&amp;gt;.&lt;br /&gt;
* U određenim zadacima eksplicitne vrednosti ili ponuđeni odgovori možda nisu iste kao u originalnoj postavci, međutim u svim zadacima gde je to slučaj, očuvana je suština zadatka.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:РБС]]&lt;/div&gt;</summary>
		<author><name>Aleksa</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9F%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D1%81%D0%BA%D0%B8_%D0%BF%D1%80%D0%B5%D0%B2%D0%BE%D0%B4%D0%B8%D0%BE%D1%86%D0%B8_1&amp;diff=8247</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=8247"/>
		<updated>2026-01-24T18:27:16Z</updated>

		<summary type="html">&lt;p&gt;Aleksa: /* Пројекат */&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;
* &#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>Aleksa</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9F%D1%80%D0%BE%D1%98%D0%B5%D0%BA%D1%82%D0%BE%D0%B2%D0%B0%D1%9A%D0%B5_%D1%81%D0%BE%D1%84%D1%82%D0%B2%D0%B5%D1%80%D0%B0/%D0%9A2_2024&amp;diff=8236</id>
		<title>Пројектовање софтвера/К2 2024</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9F%D1%80%D0%BE%D1%98%D0%B5%D0%BA%D1%82%D0%BE%D0%B2%D0%B0%D1%9A%D0%B5_%D1%81%D0%BE%D1%84%D1%82%D0%B2%D0%B5%D1%80%D0%B0/%D0%9A2_2024&amp;diff=8236"/>
		<updated>2026-01-10T12:10:44Z</updated>

		<summary type="html">&lt;p&gt;Aleksa: /* Решење */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&#039;&#039;&#039;Други колоквијум 2024. године&#039;&#039;&#039; одржан је 1. децембра 2024. године. Биле су доступне презентације са вежби, као и УМЛ презентације професора Тартаље. Време за израду је било 120 минута. Поставка је доступна са [https://web.archive.org/web/20260103134407/https://ps.etf.bg.ac.rs/rokovi/PS_K2_2024.zip странице предмета].&lt;br /&gt;
&lt;br /&gt;
== Поставка ==&lt;br /&gt;
Информациони систем фиктивне медицинске куће “ПС медик” документован је у оквиру StarUML фајла lekari.mdj. Докторима се прате име и презиме и године стажа, а пацијентима име и презиме и јединствени здравствени идентификатор (ниска знакова која поштује унапред позната правила). Пацијенту се заказује преглед код неког од доктора, при чему се прате термин прегледа и ординација у којој се преглед обавља, као и статус прегледа (заказан, у току, одржан). Лековима се прати назив, произвођач, доза активне супстанце и може им се дохватити опис који се састоји од свих параметара лека.&lt;br /&gt;
&amp;lt;ol style=&amp;quot;list-style-type:lower-alpha&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Исправити грешке на дијаграму класа и документовати их у фајлу &#039;&#039;greske.docx&#039;&#039;. Начин документовања грешака је описан у том фајлу. &#039;&#039;&#039;Напомена:&#039;&#039;&#039; приказане класе поседују још операција, али оне нису од интереса у овој тачки и њихово недостајање не треба сматрати грешком. По потреби се операције могу додавати у оквиру осталих тачака.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Изменити модел и дијаграм класа тако да се омогући праћење стручне специјализације лекара (неке од њих су: радиолог, кардиолог, лекар опште праксе, остале нема потребе приказивати). Лекари обављају преглед другачије у зависности од специјализације. Сматрати да лекари увек имају тачно једну специјализацију и она им се не мења. Скуп генерализација и његова ограничења документовати помоћу &#039;&#039;StarUML&#039;&#039; елемента &#039;&#039;Text&#039;&#039; постављеног изнад генерализације &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Допунити дијаграм класа тако да се омогући праћење дијагноза које лекар прописује у оквиру прегледа. Дијагнози се прате текстуални назив болести и лекови који су преписани за ту дијагнозу, при чему неки лекови могу бити преписани на рецепт, а неки без рецепта.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Лекар опште праксе Михајло Михајловић је прегледао пацијента Луку Лукића у ординацији 4. У оквиру прегледа Луки је дијагностикован акутни ларингитис и на рецепт преписан “Хемомицин”, а препоручено му је и да користи “Фервекс” и “Стрепсилс”, који се купују без рецепта. На дијаграму објеката приказати стање система након прегледа. Атрибуте чије вредности нису познате не треба приказивати.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Захтев за састављање извештаја о прегледу који није завршен доводи до грешке. У случају да је преглед завршен, извештај се састоји од имена и презимена и јединственог здравственог идентификатора пацијента, имена и презимена лекара, као и описа дијагноза формираних у току прегледа. Опис дијагнозе састоји се од назива дијагностиковане болести, описа лекова који су преписани без рецепта и описа лекова који су преписани на рецепт. Направити дијаграм секвенце који приказује састављање извештаја о прегледу, разрађен до нивоа састављања описа лека (не треба приказивати како се реализује састављање описа лека) и по потреби допунити дијаграм класа да би обављање сценарија било изводиво.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Датотека:PS K2 2024 pocetno stanje.svg|оквир|центар|Почетно стањер]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Решење ==&lt;br /&gt;
&amp;lt;ol style=&amp;quot;list-style-type:lower-alpha&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Преглед грешака. Напомена: &amp;quot;Стинг&amp;quot; у конструктору класе Доктор је грешка у куцању, коју не треба наводити.&amp;lt;/li&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;br /&amp;gt;Р. бр.&lt;br /&gt;
! &amp;lt;br /&amp;gt;Дијаграм&lt;br /&gt;
! &amp;lt;br /&amp;gt;Елемент&lt;br /&gt;
! &amp;lt;br /&amp;gt;Опис грешке&lt;br /&gt;
|-&lt;br /&gt;
| 1&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;
| Атрибут радниСтаж треба да буде цео број, а не стринг&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| Класни&lt;br /&gt;
| Класа Доктор&lt;br /&gt;
| Конструктор не треба да буде статички&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| Класни&lt;br /&gt;
| Класа Пацијент&lt;br /&gt;
| Атрибут здравствениИД треба да буде тип података ЗдравствениИдентификатор&lt;br /&gt;
|-&lt;br /&gt;
| 5&lt;br /&gt;
| Класни&lt;br /&gt;
| Енумерација СтатусПрегледа&lt;br /&gt;
| Недостаје литерал У_ТОКУ&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| Класни&lt;br /&gt;
| Асоцијација Доктор-Пацијент&lt;br /&gt;
| Мултипликативности треба да буде 0..* са обе стране&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:Пројектовање софтвера]]&lt;/div&gt;</summary>
		<author><name>Aleksa</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9F%D1%80%D0%BE%D1%98%D0%B5%D0%BA%D1%82%D0%BE%D0%B2%D0%B0%D1%9A%D0%B5_%D1%81%D0%BE%D1%84%D1%82%D0%B2%D0%B5%D1%80%D0%B0/%D0%9E%D0%BA%D1%82%D0%BE%D0%B1%D0%B0%D1%80-2_2025&amp;diff=8235</id>
		<title>Пројектовање софтвера/Октобар-2 2025</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9F%D1%80%D0%BE%D1%98%D0%B5%D0%BA%D1%82%D0%BE%D0%B2%D0%B0%D1%9A%D0%B5_%D1%81%D0%BE%D1%84%D1%82%D0%B2%D0%B5%D1%80%D0%B0/%D0%9E%D0%BA%D1%82%D0%BE%D0%B1%D0%B0%D1%80-2_2025&amp;diff=8235"/>
		<updated>2026-01-06T18:17:47Z</updated>

		<summary type="html">&lt;p&gt;Aleksa: /* 8. задатак */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&#039;&#039;&#039;Испит у року октобар-2 2025. године&#039;&#039;&#039; одржан је 27. октобра 2025. године, на папиру, без документације. Време доступно за израду је 90 минута. Сваки задатак вреди 3 поена.&lt;br /&gt;
&lt;br /&gt;
== 1. задатак ==&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;
# Adapter&lt;br /&gt;
# Strategy&lt;br /&gt;
# Bridge&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Ни један од наведених већ &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;Proxy&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2. задатак ==&lt;br /&gt;
У систему за контролу промета &amp;quot;паметне куће&amp;quot; постоје сензори и аларми који се могу произвољно и независно додавати у систем и избацивати из система. Сензори могу бити две различите врсте: &#039;&#039;прекидачи&#039;&#039; (активирају се на јасно дефинисану границу, као прекидач) или &#039;&#039;хистерезисни&#039;&#039; (активирају се и деактивирају по принципу хистерезиса). Аларми такође могу бити различитих врста, као што су сирене, светлосни аларми, тихи аларми, дојаве преко комуникационих канала (нпр. телефоном). Применом пројектног обрасца &#039;&#039;Mediator&#039;&#039; конципирати описани део система и имплеметирати основни механизам активирања аларма када неки сензор сигнализира своју активацију.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
[[Датотека:PS-oktobar-2-2025-zadatak-2-resenje.svg|оквир|центар|алт=Слика уз решење другог задатка|Слика уз решење другог задатка]]&lt;br /&gt;
&lt;br /&gt;
== 3. задатак ==&lt;br /&gt;
Негативна појава која настаје због неадекватне примене развоја софтвера помоћу модела, а која се испољава као осећај нелагоде током раних фаза развоја и преовлађује став програмера да су документи са захтевима и пројектни модели само документација и уверење да &amp;quot;прави посао&amp;quot; није почео док се није почеко са писањем програмског кода, назива се &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;синдром журбе ка кодовању&amp;lt;/span&amp;gt; (енгл. &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;rush to code syndrom&amp;lt;/span&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
== 4. задатак ==&lt;br /&gt;
Приказати УМЛ дијаграм класа за следећи опис дела концептуалног модела. Фолдер може садржати фајлове и друге фолдере. Фајл не може садржати фајлове ни фолдере. Фајл или фолдер може бити садржан у највише једном фолдеру. Фајл или фолдер се може копирати у неки други фолдер. Фолдер се копира тако што се рекурзивно копирају сви његови елементи, док се фајл копира тако што се копира цео његов бинарни садржај. Када се бртише&amp;lt;sup&amp;gt;sip&amp;lt;/sup&amp;gt; фајл&amp;lt;sup&amp;gt;sip&amp;lt;/sup&amp;gt;, бришу се и сви његови елементи, рекурзивно.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
[[Датотека:PS-oktobar-2-2025-zadatak-4-resenje.svg|оквир|центар]]&lt;br /&gt;
&lt;br /&gt;
== 5. задатак ==&lt;br /&gt;
Приказати део шеме релационе базе (табеле, њихове колоне, примарне и стране кључеве) за следећи део концептуалног модела.&lt;br /&gt;
[[Датотека:PS-oktobar-2-2025-zadatak-5.png|оквир|центар|Слика уз поставку петог задатка]]&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
[[Датотека:PS-oktobar-2-2025-zadatak-5-resenje.png|оквир|центар|алт=Решење петог задатка|Решење петог задатка]]&lt;br /&gt;
&lt;br /&gt;
== 6. задатак ==&lt;br /&gt;
Ако имате потребу да неки скуп ентитета, који је моделован класом, специјализујете у различите хијерархије према различитим аспектима тј. критеријумима специјализације, користићете концепт језика УМЛ који се назива &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;скуповима генерализације&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== 7. задатак ==&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;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;колаборацију&amp;lt;/span&amp;gt;&lt;br /&gt;
# случај употребе&lt;br /&gt;
# ништа од наведеног&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
[[Датотека:PS-oktobar-2-2025-zadatak-7.png|оквир|центар|Слика уз задатака 7]]&lt;br /&gt;
&lt;br /&gt;
== 8. задатак ==&lt;br /&gt;
За дати дијаграм интеракције и догађаје које он спецификује, а који су означени &amp;quot;балончићима&amp;quot; (нису део дијаграма), написати све дозвољене секвенце тих догађаја које овај модел дозвољава (али највише три такве секвенце, ако их има више).&lt;br /&gt;
[[Датотека:PS-oktobar-2-2025-zadatak-8.PNG|оквир|центар|Слика уз поставку осмог задатка]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;За потребе решења на wiki, балончиће одвојити зарезом и једним знаком разамака, а секвенце симболом тачка-зарез. Након последње секвенце не треба стављати тачка-зарез.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Решење: &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;x1, x2, y1, y2, z1, z2, y3, y4, y5, y6, z3, z4, y7, y8, x3, x4&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Објашњење: &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;explanation&amp;quot;&amp;gt;Погледати слајдове са предавања који се односе на интеракцију. За презентацију из 2025/2026, то је сладј 244.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 9. задатак ==&lt;br /&gt;
Да ли порт у власништву енкапсулиране класе мора бити део њеног интерфејса? Образложити.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&#039;&#039;ROOM&#039;&#039; форисра да порт буде део интерфејса, јер је то једини дозвољени начин комуникације актера са окружењем. (Презентација, слајдови са називом &#039;&#039;Portovi&#039;&#039;, 2025/26 - слајдови 316 и 317) &lt;br /&gt;
&lt;br /&gt;
Са друге стране, стандардни &#039;&#039;UML&#039;&#039; ово не форсира, јер порт може да буде интерни, који служи само за комуникацију понашања са компонентама/улогама те класе. (Презентација, слајдови са називом &#039;&#039;Strukturirane klase&#039;&#039;, 2025/26 - слајд 327)&lt;br /&gt;
&lt;br /&gt;
== 10. задатак ==&lt;br /&gt;
Концепт који спецификује скуп акција које обавља субјекат, уз могуће варијације, које воде ка видљивом резултату од вредности за актера и друге заинтересоване стране, назива се &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;случај употребе&amp;lt;/span&amp;gt; (енгл. &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;use case&amp;lt;/span&amp;gt;) и користи се за моделовање интерне структуре/споља видљиво понашање система (прецртати непотребно).&lt;br /&gt;
&amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;explanation&amp;quot;&amp;gt;Треба прецртати интерне структуре.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:Пројектовање софтвера]]&lt;/div&gt;</summary>
		<author><name>Aleksa</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9F%D1%80%D0%BE%D1%98%D0%B5%D0%BA%D1%82%D0%BE%D0%B2%D0%B0%D1%9A%D0%B5_%D1%81%D0%BE%D1%84%D1%82%D0%B2%D0%B5%D1%80%D0%B0/%D0%9E%D0%BA%D1%82%D0%BE%D0%B1%D0%B0%D1%80-2_2025&amp;diff=8234</id>
		<title>Пројектовање софтвера/Октобар-2 2025</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9F%D1%80%D0%BE%D1%98%D0%B5%D0%BA%D1%82%D0%BE%D0%B2%D0%B0%D1%9A%D0%B5_%D1%81%D0%BE%D1%84%D1%82%D0%B2%D0%B5%D1%80%D0%B0/%D0%9E%D0%BA%D1%82%D0%BE%D0%B1%D0%B0%D1%80-2_2025&amp;diff=8234"/>
		<updated>2026-01-06T18:15:59Z</updated>

		<summary type="html">&lt;p&gt;Aleksa: /* Решење */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&#039;&#039;&#039;Испит у року октобар-2 2025. године&#039;&#039;&#039; одржан је 27. октобра 2025. године, на папиру, без документације. Време доступно за израду је 90 минута. Сваки задатак вреди 3 поена.&lt;br /&gt;
&lt;br /&gt;
== 1. задатак ==&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;
# Adapter&lt;br /&gt;
# Strategy&lt;br /&gt;
# Bridge&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Ни један од наведених већ &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;Proxy&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2. задатак ==&lt;br /&gt;
У систему за контролу промета &amp;quot;паметне куће&amp;quot; постоје сензори и аларми који се могу произвољно и независно додавати у систем и избацивати из система. Сензори могу бити две различите врсте: &#039;&#039;прекидачи&#039;&#039; (активирају се на јасно дефинисану границу, као прекидач) или &#039;&#039;хистерезисни&#039;&#039; (активирају се и деактивирају по принципу хистерезиса). Аларми такође могу бити различитих врста, као што су сирене, светлосни аларми, тихи аларми, дојаве преко комуникационих канала (нпр. телефоном). Применом пројектног обрасца &#039;&#039;Mediator&#039;&#039; конципирати описани део система и имплеметирати основни механизам активирања аларма када неки сензор сигнализира своју активацију.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
[[Датотека:PS-oktobar-2-2025-zadatak-2-resenje.svg|оквир|центар|алт=Слика уз решење другог задатка|Слика уз решење другог задатка]]&lt;br /&gt;
&lt;br /&gt;
== 3. задатак ==&lt;br /&gt;
Негативна појава која настаје због неадекватне примене развоја софтвера помоћу модела, а која се испољава као осећај нелагоде током раних фаза развоја и преовлађује став програмера да су документи са захтевима и пројектни модели само документација и уверење да &amp;quot;прави посао&amp;quot; није почео док се није почеко са писањем програмског кода, назива се &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;синдром журбе ка кодовању&amp;lt;/span&amp;gt; (енгл. &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;rush to code syndrom&amp;lt;/span&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
== 4. задатак ==&lt;br /&gt;
Приказати УМЛ дијаграм класа за следећи опис дела концептуалног модела. Фолдер може садржати фајлове и друге фолдере. Фајл не може садржати фајлове ни фолдере. Фајл или фолдер може бити садржан у највише једном фолдеру. Фајл или фолдер се може копирати у неки други фолдер. Фолдер се копира тако што се рекурзивно копирају сви његови елементи, док се фајл копира тако што се копира цео његов бинарни садржај. Када се бртише&amp;lt;sup&amp;gt;sip&amp;lt;/sup&amp;gt; фајл&amp;lt;sup&amp;gt;sip&amp;lt;/sup&amp;gt;, бришу се и сви његови елементи, рекурзивно.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
[[Датотека:PS-oktobar-2-2025-zadatak-4-resenje.svg|оквир|центар]]&lt;br /&gt;
&lt;br /&gt;
== 5. задатак ==&lt;br /&gt;
Приказати део шеме релационе базе (табеле, њихове колоне, примарне и стране кључеве) за следећи део концептуалног модела.&lt;br /&gt;
[[Датотека:PS-oktobar-2-2025-zadatak-5.png|оквир|центар|Слика уз поставку петог задатка]]&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
[[Датотека:PS-oktobar-2-2025-zadatak-5-resenje.png|оквир|центар|алт=Решење петог задатка|Решење петог задатка]]&lt;br /&gt;
&lt;br /&gt;
== 6. задатак ==&lt;br /&gt;
Ако имате потребу да неки скуп ентитета, који је моделован класом, специјализујете у различите хијерархије према различитим аспектима тј. критеријумима специјализације, користићете концепт језика УМЛ који се назива &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;скуповима генерализације&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== 7. задатак ==&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;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;колаборацију&amp;lt;/span&amp;gt;&lt;br /&gt;
# случај употребе&lt;br /&gt;
# ништа од наведеног&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
[[Датотека:PS-oktobar-2-2025-zadatak-7.png|оквир|центар|Слика уз задатака 7]]&lt;br /&gt;
&lt;br /&gt;
== 8. задатак ==&lt;br /&gt;
За дати дијаграм интеракције и догађаје које он спецификује, а који су означени &amp;quot;балончићима&amp;quot; (нису део дијаграма), написати све дозвољене секвенце тих догађаја које овај модел дозвољава (али највише три такве секвенце, ако их има више).&lt;br /&gt;
[[Датотека:PS-oktobar-2-2025-zadatak-8.PNG|оквир|центар|Слика уз поставку осмог задатка]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;За потребе решења на wiki, балончиће одвојити зарезом и једним знаком разамака, а секвенце симболом тачка зарез.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Решење: &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;x1, x2, y1, y2, z1, z2, y3, y4, y5, y6, z3, z4, y7, y8, x3, x4&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Објашњење: &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;explanation&amp;quot;&amp;gt;Погледати слајдове са предавања који се односе на интеракцију. За презентацију из 2025/2026, то је сладј 244.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 9. задатак ==&lt;br /&gt;
Да ли порт у власништву енкапсулиране класе мора бити део њеног интерфејса? Образложити.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
&#039;&#039;ROOM&#039;&#039; форисра да порт буде део интерфејса, јер је то једини дозвољени начин комуникације актера са окружењем. (Презентација, слајдови са називом &#039;&#039;Portovi&#039;&#039;, 2025/26 - слајдови 316 и 317) &lt;br /&gt;
&lt;br /&gt;
Са друге стране, стандардни &#039;&#039;UML&#039;&#039; ово не форсира, јер порт може да буде интерни, који служи само за комуникацију понашања са компонентама/улогама те класе. (Презентација, слајдови са називом &#039;&#039;Strukturirane klase&#039;&#039;, 2025/26 - слајд 327)&lt;br /&gt;
&lt;br /&gt;
== 10. задатак ==&lt;br /&gt;
Концепт који спецификује скуп акција које обавља субјекат, уз могуће варијације, које воде ка видљивом резултату од вредности за актера и друге заинтересоване стране, назива се &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;случај употребе&amp;lt;/span&amp;gt; (енгл. &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;use case&amp;lt;/span&amp;gt;) и користи се за моделовање интерне структуре/споља видљиво понашање система (прецртати непотребно).&lt;br /&gt;
&amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;explanation&amp;quot;&amp;gt;Треба прецртати интерне структуре.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:Пројектовање софтвера]]&lt;/div&gt;</summary>
		<author><name>Aleksa</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9F%D1%80%D0%BE%D1%98%D0%B5%D0%BA%D1%82%D0%BE%D0%B2%D0%B0%D1%9A%D0%B5_%D1%81%D0%BE%D1%84%D1%82%D0%B2%D0%B5%D1%80%D0%B0/%D0%9E%D0%BA%D1%82%D0%BE%D0%B1%D0%B0%D1%80-2_2025&amp;diff=8233</id>
		<title>Пројектовање софтвера/Октобар-2 2025</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9F%D1%80%D0%BE%D1%98%D0%B5%D0%BA%D1%82%D0%BE%D0%B2%D0%B0%D1%9A%D0%B5_%D1%81%D0%BE%D1%84%D1%82%D0%B2%D0%B5%D1%80%D0%B0/%D0%9E%D0%BA%D1%82%D0%BE%D0%B1%D0%B0%D1%80-2_2025&amp;diff=8233"/>
		<updated>2026-01-06T18:15:33Z</updated>

		<summary type="html">&lt;p&gt;Aleksa: 9. задатак resenje&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&#039;&#039;&#039;Испит у року октобар-2 2025. године&#039;&#039;&#039; одржан је 27. октобра 2025. године, на папиру, без документације. Време доступно за израду је 90 минута. Сваки задатак вреди 3 поена.&lt;br /&gt;
&lt;br /&gt;
== 1. задатак ==&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;
# Adapter&lt;br /&gt;
# Strategy&lt;br /&gt;
# Bridge&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Ни један од наведених већ &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;Proxy&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2. задатак ==&lt;br /&gt;
У систему за контролу промета &amp;quot;паметне куће&amp;quot; постоје сензори и аларми који се могу произвољно и независно додавати у систем и избацивати из система. Сензори могу бити две различите врсте: &#039;&#039;прекидачи&#039;&#039; (активирају се на јасно дефинисану границу, као прекидач) или &#039;&#039;хистерезисни&#039;&#039; (активирају се и деактивирају по принципу хистерезиса). Аларми такође могу бити различитих врста, као што су сирене, светлосни аларми, тихи аларми, дојаве преко комуникационих канала (нпр. телефоном). Применом пројектног обрасца &#039;&#039;Mediator&#039;&#039; конципирати описани део система и имплеметирати основни механизам активирања аларма када неки сензор сигнализира своју активацију.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
[[Датотека:PS-oktobar-2-2025-zadatak-2-resenje.svg|оквир|центар|алт=Слика уз решење другог задатка|Слика уз решење другог задатка]]&lt;br /&gt;
&lt;br /&gt;
== 3. задатак ==&lt;br /&gt;
Негативна појава која настаје због неадекватне примене развоја софтвера помоћу модела, а која се испољава као осећај нелагоде током раних фаза развоја и преовлађује став програмера да су документи са захтевима и пројектни модели само документација и уверење да &amp;quot;прави посао&amp;quot; није почео док се није почеко са писањем програмског кода, назива се &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;синдром журбе ка кодовању&amp;lt;/span&amp;gt; (енгл. &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;rush to code syndrom&amp;lt;/span&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
== 4. задатак ==&lt;br /&gt;
Приказати УМЛ дијаграм класа за следећи опис дела концептуалног модела. Фолдер може садржати фајлове и друге фолдере. Фајл не може садржати фајлове ни фолдере. Фајл или фолдер може бити садржан у највише једном фолдеру. Фајл или фолдер се може копирати у неки други фолдер. Фолдер се копира тако што се рекурзивно копирају сви његови елементи, док се фајл копира тако што се копира цео његов бинарни садржај. Када се бртише&amp;lt;sup&amp;gt;sip&amp;lt;/sup&amp;gt; фајл&amp;lt;sup&amp;gt;sip&amp;lt;/sup&amp;gt;, бришу се и сви његови елементи, рекурзивно.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
[[Датотека:PS-oktobar-2-2025-zadatak-4-resenje.svg|оквир|центар]]&lt;br /&gt;
&lt;br /&gt;
== 5. задатак ==&lt;br /&gt;
Приказати део шеме релационе базе (табеле, њихове колоне, примарне и стране кључеве) за следећи део концептуалног модела.&lt;br /&gt;
[[Датотека:PS-oktobar-2-2025-zadatak-5.png|оквир|центар|Слика уз поставку петог задатка]]&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
[[Датотека:PS-oktobar-2-2025-zadatak-5-resenje.png|оквир|центар|алт=Решење петог задатка|Решење петог задатка]]&lt;br /&gt;
&lt;br /&gt;
== 6. задатак ==&lt;br /&gt;
Ако имате потребу да неки скуп ентитета, који је моделован класом, специјализујете у различите хијерархије према различитим аспектима тј. критеријумима специјализације, користићете концепт језика УМЛ који се назива &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;скуповима генерализације&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== 7. задатак ==&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;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;колаборацију&amp;lt;/span&amp;gt;&lt;br /&gt;
# случај употребе&lt;br /&gt;
# ништа од наведеног&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
[[Датотека:PS-oktobar-2-2025-zadatak-7.png|оквир|центар|Слика уз задатака 7]]&lt;br /&gt;
&lt;br /&gt;
== 8. задатак ==&lt;br /&gt;
За дати дијаграм интеракције и догађаје које он спецификује, а који су означени &amp;quot;балончићима&amp;quot; (нису део дијаграма), написати све дозвољене секвенце тих догађаја које овај модел дозвољава (али највише три такве секвенце, ако их има више).&lt;br /&gt;
[[Датотека:PS-oktobar-2-2025-zadatak-8.PNG|оквир|центар|Слика уз поставку осмог задатка]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;За потребе решења на wiki, балончиће одвојити зарезом и једним знаком разамака, а секвенце симболом тачка зарез.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Решење: &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;x1, x2, y1, y2, z1, z2, y3, y4, y5, y6, z3, z4, y7, y8, x3, x4&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Објашњење: &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;explanation&amp;quot;&amp;gt;Погледати слајдове са предавања који се односе на интеракцију. За презентацију из 2025/2026, то је сладј 244.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 9. задатак ==&lt;br /&gt;
Да ли порт у власништву енкапсулиране класе мора бити део њеног интерфејса? Образложити.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
(Презентација, слајдови са називом &#039;&#039;Portovi&#039;&#039;, 2025/26 - слајдови 316 и 317) &#039;&#039;ROOM&#039;&#039; форисра да порт буде део интерфејса, јер је то једини дозвољени начин комуникације актера са окружењем.&lt;br /&gt;
&lt;br /&gt;
(Презентација, слајдови са називом &#039;&#039;Strukturirane klase&#039;&#039;, 2025/26 - слајд 327) Са друге стране, стандардни &#039;&#039;UML&#039;&#039; ово не форсира, јер порт може да буде интерни, који служи само за комуникацију понашања са компонентама/улогама те класе.&lt;br /&gt;
&lt;br /&gt;
== 10. задатак ==&lt;br /&gt;
Концепт који спецификује скуп акција које обавља субјекат, уз могуће варијације, које воде ка видљивом резултату од вредности за актера и друге заинтересоване стране, назива се &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;случај употребе&amp;lt;/span&amp;gt; (енгл. &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;use case&amp;lt;/span&amp;gt;) и користи се за моделовање интерне структуре/споља видљиво понашање система (прецртати непотребно).&lt;br /&gt;
&amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;explanation&amp;quot;&amp;gt;Треба прецртати интерне структуре.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:Пројектовање софтвера]]&lt;/div&gt;</summary>
		<author><name>Aleksa</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9F%D1%80%D0%BE%D1%98%D0%B5%D0%BA%D1%82%D0%BE%D0%B2%D0%B0%D1%9A%D0%B5_%D1%81%D0%BE%D1%84%D1%82%D0%B2%D0%B5%D1%80%D0%B0/%D0%9E%D0%BA%D1%82%D0%BE%D0%B1%D0%B0%D1%80-2_2025&amp;diff=8232</id>
		<title>Пројектовање софтвера/Октобар-2 2025</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9F%D1%80%D0%BE%D1%98%D0%B5%D0%BA%D1%82%D0%BE%D0%B2%D0%B0%D1%9A%D0%B5_%D1%81%D0%BE%D1%84%D1%82%D0%B2%D0%B5%D1%80%D0%B0/%D0%9E%D0%BA%D1%82%D0%BE%D0%B1%D0%B0%D1%80-2_2025&amp;diff=8232"/>
		<updated>2026-01-06T17:49:38Z</updated>

		<summary type="html">&lt;p&gt;Aleksa: /* 5. задатак */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&#039;&#039;&#039;Испит у року октобар-2 2025. године&#039;&#039;&#039; одржан је 27. октобра 2025. године, на папиру, без документације. Време доступно за израду је 90 минута. Сваки задатак вреди 3 поена.&lt;br /&gt;
&lt;br /&gt;
== 1. задатак ==&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;
# Adapter&lt;br /&gt;
# Strategy&lt;br /&gt;
# Bridge&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Ни један од наведених већ &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;Proxy&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2. задатак ==&lt;br /&gt;
У систему за контролу промета &amp;quot;паметне куће&amp;quot; постоје сензори и аларми који се могу произвољно и независно додавати у систем и избацивати из система. Сензори могу бити две различите врсте: &#039;&#039;прекидачи&#039;&#039; (активирају се на јасно дефинисану границу, као прекидач) или &#039;&#039;хистерезисни&#039;&#039; (активирају се и деактивирају по принципу хистерезиса). Аларми такође могу бити различитих врста, као што су сирене, светлосни аларми, тихи аларми, дојаве преко комуникационих канала (нпр. телефоном). Применом пројектног обрасца &#039;&#039;Mediator&#039;&#039; конципирати описани део система и имплеметирати основни механизам активирања аларма када неки сензор сигнализира своју активацију.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
[[Датотека:PS-oktobar-2-2025-zadatak-2-resenje.svg|оквир|центар|алт=Слика уз решење другог задатка|Слика уз решење другог задатка]]&lt;br /&gt;
&lt;br /&gt;
== 3. задатак ==&lt;br /&gt;
Негативна појава која настаје због неадекватне примене развоја софтвера помоћу модела, а која се испољава као осећај нелагоде током раних фаза развоја и преовлађује став програмера да су документи са захтевима и пројектни модели само документација и уверење да &amp;quot;прави посао&amp;quot; није почео док се није почеко са писањем програмског кода, назива се &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;синдром журбе ка кодовању&amp;lt;/span&amp;gt; (енгл. &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;rush to code syndrom&amp;lt;/span&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
== 4. задатак ==&lt;br /&gt;
Приказати УМЛ дијаграм класа за следећи опис дела концептуалног модела. Фолдер може садржати фајлове и друге фолдере. Фајл не може садржати фајлове ни фолдере. Фајл или фолдер може бити садржан у највише једном фолдеру. Фајл или фолдер се може копирати у неки други фолдер. Фолдер се копира тако што се рекурзивно копирају сви његови елементи, док се фајл копира тако што се копира цео његов бинарни садржај. Када се бртише&amp;lt;sup&amp;gt;sip&amp;lt;/sup&amp;gt; фајл&amp;lt;sup&amp;gt;sip&amp;lt;/sup&amp;gt;, бришу се и сви његови елементи, рекурзивно.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
[[Датотека:PS-oktobar-2-2025-zadatak-4-resenje.svg|оквир|центар]]&lt;br /&gt;
&lt;br /&gt;
== 5. задатак ==&lt;br /&gt;
Приказати део шеме релационе базе (табеле, њихове колоне, примарне и стране кључеве) за следећи део концептуалног модела.&lt;br /&gt;
[[Датотека:PS-oktobar-2-2025-zadatak-5.png|оквир|центар|Слика уз поставку петог задатка]]&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
[[Датотека:PS-oktobar-2-2025-zadatak-5-resenje.png|оквир|центар|алт=Решење петог задатка|Решење петог задатка]]&lt;br /&gt;
&lt;br /&gt;
== 6. задатак ==&lt;br /&gt;
Ако имате потребу да неки скуп ентитета, који је моделован класом, специјализујете у различите хијерархије према различитим аспектима тј. критеријумима специјализације, користићете концепт језика УМЛ који се назива &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;скуповима генерализације&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== 7. задатак ==&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;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;колаборацију&amp;lt;/span&amp;gt;&lt;br /&gt;
# случај употребе&lt;br /&gt;
# ништа од наведеног&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
[[Датотека:PS-oktobar-2-2025-zadatak-7.png|оквир|центар|Слика уз задатака 7]]&lt;br /&gt;
&lt;br /&gt;
== 8. задатак ==&lt;br /&gt;
За дати дијаграм интеракције и догађаје које он спецификује, а који су означени &amp;quot;балончићима&amp;quot; (нису део дијаграма), написати све дозвољене секвенце тих догађаја које овај модел дозвољава (али највише три такве секвенце, ако их има више).&lt;br /&gt;
[[Датотека:PS-oktobar-2-2025-zadatak-8.PNG|оквир|центар|Слика уз поставку осмог задатка]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;За потребе решења на wiki, балончиће одвојити зарезом и једним знаком разамака, а секвенце симболом тачка зарез.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Решење: &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;x1, x2, y1, y2, z1, z2, y3, y4, y5, y6, z3, z4, y7, y8, x3, x4&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Објашњење: &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;explanation&amp;quot;&amp;gt;Погледати слајдове са предавања који се односе на интеракцију. За презентацију из 2025/2026, то је сладј 244.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 9. задатак ==&lt;br /&gt;
Да ли порт у власништву енкапсулиране класе мора бити део њеног интерфејса? Образложити.&lt;br /&gt;
&lt;br /&gt;
== 10. задатак ==&lt;br /&gt;
Концепт који спецификује скуп акција које обавља субјекат, уз могуће варијације, које воде ка видљивом резултату од вредности за актера и друге заинтересоване стране, назива се &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;случај употребе&amp;lt;/span&amp;gt; (енгл. &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;use case&amp;lt;/span&amp;gt;) и користи се за моделовање интерне структуре/споља видљиво понашање система (прецртати непотребно).&lt;br /&gt;
&amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;explanation&amp;quot;&amp;gt;Треба прецртати интерне структуре.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:Пројектовање софтвера]]&lt;/div&gt;</summary>
		<author><name>Aleksa</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9F%D1%80%D0%BE%D1%98%D0%B5%D0%BA%D1%82%D0%BE%D0%B2%D0%B0%D1%9A%D0%B5_%D1%81%D0%BE%D1%84%D1%82%D0%B2%D0%B5%D1%80%D0%B0/%D0%9E%D0%BA%D1%82%D0%BE%D0%B1%D0%B0%D1%80-2_2025&amp;diff=8231</id>
		<title>Пројектовање софтвера/Октобар-2 2025</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9F%D1%80%D0%BE%D1%98%D0%B5%D0%BA%D1%82%D0%BE%D0%B2%D0%B0%D1%9A%D0%B5_%D1%81%D0%BE%D1%84%D1%82%D0%B2%D0%B5%D1%80%D0%B0/%D0%9E%D0%BA%D1%82%D0%BE%D0%B1%D0%B0%D1%80-2_2025&amp;diff=8231"/>
		<updated>2026-01-06T17:49:19Z</updated>

		<summary type="html">&lt;p&gt;Aleksa: /* Решење */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&#039;&#039;&#039;Испит у року октобар-2 2025. године&#039;&#039;&#039; одржан је 27. октобра 2025. године, на папиру, без документације. Време доступно за израду је 90 минута. Сваки задатак вреди 3 поена.&lt;br /&gt;
&lt;br /&gt;
== 1. задатак ==&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;
# Adapter&lt;br /&gt;
# Strategy&lt;br /&gt;
# Bridge&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Ни један од наведених већ &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;Proxy&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2. задатак ==&lt;br /&gt;
У систему за контролу промета &amp;quot;паметне куће&amp;quot; постоје сензори и аларми који се могу произвољно и независно додавати у систем и избацивати из система. Сензори могу бити две различите врсте: &#039;&#039;прекидачи&#039;&#039; (активирају се на јасно дефинисану границу, као прекидач) или &#039;&#039;хистерезисни&#039;&#039; (активирају се и деактивирају по принципу хистерезиса). Аларми такође могу бити различитих врста, као што су сирене, светлосни аларми, тихи аларми, дојаве преко комуникационих канала (нпр. телефоном). Применом пројектног обрасца &#039;&#039;Mediator&#039;&#039; конципирати описани део система и имплеметирати основни механизам активирања аларма када неки сензор сигнализира своју активацију.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
[[Датотека:PS-oktobar-2-2025-zadatak-2-resenje.svg|оквир|центар|алт=Слика уз решење другог задатка|Слика уз решење другог задатка]]&lt;br /&gt;
&lt;br /&gt;
== 3. задатак ==&lt;br /&gt;
Негативна појава која настаје због неадекватне примене развоја софтвера помоћу модела, а која се испољава као осећај нелагоде током раних фаза развоја и преовлађује став програмера да су документи са захтевима и пројектни модели само документација и уверење да &amp;quot;прави посао&amp;quot; није почео док се није почеко са писањем програмског кода, назива се &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;синдром журбе ка кодовању&amp;lt;/span&amp;gt; (енгл. &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;rush to code syndrom&amp;lt;/span&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
== 4. задатак ==&lt;br /&gt;
Приказати УМЛ дијаграм класа за следећи опис дела концептуалног модела. Фолдер може садржати фајлове и друге фолдере. Фајл не може садржати фајлове ни фолдере. Фајл или фолдер може бити садржан у највише једном фолдеру. Фајл или фолдер се може копирати у неки други фолдер. Фолдер се копира тако што се рекурзивно копирају сви његови елементи, док се фајл копира тако што се копира цео његов бинарни садржај. Када се бртише&amp;lt;sup&amp;gt;sip&amp;lt;/sup&amp;gt; фајл&amp;lt;sup&amp;gt;sip&amp;lt;/sup&amp;gt;, бришу се и сви његови елементи, рекурзивно.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
[[Датотека:PS-oktobar-2-2025-zadatak-4-resenje.svg|оквир|центар]]&lt;br /&gt;
&lt;br /&gt;
== 5. задатак ==&lt;br /&gt;
Приказати део шеме релационе базе (табеле, њихове колоне, примарне и стране кључеве) за следећи део концептуалног модела.&lt;br /&gt;
[[Датотека:PS-oktobar-2-2025-zadatak-5.png|оквир|центар|Слика уз поставку петог задатка]]&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
[[Датотека:PS-oktobar-2-2025-zadatak-5-resenje.png|мини|центар|алт=Решење петог задатка|Решење петог задатка]]&lt;br /&gt;
&lt;br /&gt;
== 6. задатак ==&lt;br /&gt;
Ако имате потребу да неки скуп ентитета, који је моделован класом, специјализујете у различите хијерархије према различитим аспектима тј. критеријумима специјализације, користићете концепт језика УМЛ који се назива &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;скуповима генерализације&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== 7. задатак ==&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;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;колаборацију&amp;lt;/span&amp;gt;&lt;br /&gt;
# случај употребе&lt;br /&gt;
# ништа од наведеног&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
[[Датотека:PS-oktobar-2-2025-zadatak-7.png|оквир|центар|Слика уз задатака 7]]&lt;br /&gt;
&lt;br /&gt;
== 8. задатак ==&lt;br /&gt;
За дати дијаграм интеракције и догађаје које он спецификује, а који су означени &amp;quot;балончићима&amp;quot; (нису део дијаграма), написати све дозвољене секвенце тих догађаја које овај модел дозвољава (али највише три такве секвенце, ако их има више).&lt;br /&gt;
[[Датотека:PS-oktobar-2-2025-zadatak-8.PNG|оквир|центар|Слика уз поставку осмог задатка]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;За потребе решења на wiki, балончиће одвојити зарезом и једним знаком разамака, а секвенце симболом тачка зарез.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Решење: &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;x1, x2, y1, y2, z1, z2, y3, y4, y5, y6, z3, z4, y7, y8, x3, x4&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Објашњење: &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;explanation&amp;quot;&amp;gt;Погледати слајдове са предавања који се односе на интеракцију. За презентацију из 2025/2026, то је сладј 244.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 9. задатак ==&lt;br /&gt;
Да ли порт у власништву енкапсулиране класе мора бити део њеног интерфејса? Образложити.&lt;br /&gt;
&lt;br /&gt;
== 10. задатак ==&lt;br /&gt;
Концепт који спецификује скуп акција које обавља субјекат, уз могуће варијације, које воде ка видљивом резултату од вредности за актера и друге заинтересоване стране, назива се &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;случај употребе&amp;lt;/span&amp;gt; (енгл. &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;use case&amp;lt;/span&amp;gt;) и користи се за моделовање интерне структуре/споља видљиво понашање система (прецртати непотребно).&lt;br /&gt;
&amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;explanation&amp;quot;&amp;gt;Треба прецртати интерне структуре.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:Пројектовање софтвера]]&lt;/div&gt;</summary>
		<author><name>Aleksa</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9F%D1%80%D0%BE%D1%98%D0%B5%D0%BA%D1%82%D0%BE%D0%B2%D0%B0%D1%9A%D0%B5_%D1%81%D0%BE%D1%84%D1%82%D0%B2%D0%B5%D1%80%D0%B0/%D0%9E%D0%BA%D1%82%D0%BE%D0%B1%D0%B0%D1%80-2_2025&amp;diff=8230</id>
		<title>Пројектовање софтвера/Октобар-2 2025</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9F%D1%80%D0%BE%D1%98%D0%B5%D0%BA%D1%82%D0%BE%D0%B2%D0%B0%D1%9A%D0%B5_%D1%81%D0%BE%D1%84%D1%82%D0%B2%D0%B5%D1%80%D0%B0/%D0%9E%D0%BA%D1%82%D0%BE%D0%B1%D0%B0%D1%80-2_2025&amp;diff=8230"/>
		<updated>2026-01-06T17:48:40Z</updated>

		<summary type="html">&lt;p&gt;Aleksa: Resenje 5. zadatka&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&#039;&#039;&#039;Испит у року октобар-2 2025. године&#039;&#039;&#039; одржан је 27. октобра 2025. године, на папиру, без документације. Време доступно за израду је 90 минута. Сваки задатак вреди 3 поена.&lt;br /&gt;
&lt;br /&gt;
== 1. задатак ==&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;
# Adapter&lt;br /&gt;
# Strategy&lt;br /&gt;
# Bridge&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Ни један од наведених већ &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;Proxy&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2. задатак ==&lt;br /&gt;
У систему за контролу промета &amp;quot;паметне куће&amp;quot; постоје сензори и аларми који се могу произвољно и независно додавати у систем и избацивати из система. Сензори могу бити две различите врсте: &#039;&#039;прекидачи&#039;&#039; (активирају се на јасно дефинисану границу, као прекидач) или &#039;&#039;хистерезисни&#039;&#039; (активирају се и деактивирају по принципу хистерезиса). Аларми такође могу бити различитих врста, као што су сирене, светлосни аларми, тихи аларми, дојаве преко комуникационих канала (нпр. телефоном). Применом пројектног обрасца &#039;&#039;Mediator&#039;&#039; конципирати описани део система и имплеметирати основни механизам активирања аларма када неки сензор сигнализира своју активацију.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
[[Датотека:PS-oktobar-2-2025-zadatak-2-resenje.svg|оквир|центар|алт=Слика уз решење другог задатка|Слика уз решење другог задатка]]&lt;br /&gt;
&lt;br /&gt;
== 3. задатак ==&lt;br /&gt;
Негативна појава која настаје због неадекватне примене развоја софтвера помоћу модела, а која се испољава као осећај нелагоде током раних фаза развоја и преовлађује став програмера да су документи са захтевима и пројектни модели само документација и уверење да &amp;quot;прави посао&amp;quot; није почео док се није почеко са писањем програмског кода, назива се &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;синдром журбе ка кодовању&amp;lt;/span&amp;gt; (енгл. &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;rush to code syndrom&amp;lt;/span&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
== 4. задатак ==&lt;br /&gt;
Приказати УМЛ дијаграм класа за следећи опис дела концептуалног модела. Фолдер може садржати фајлове и друге фолдере. Фајл не може садржати фајлове ни фолдере. Фајл или фолдер може бити садржан у највише једном фолдеру. Фајл или фолдер се може копирати у неки други фолдер. Фолдер се копира тако што се рекурзивно копирају сви његови елементи, док се фајл копира тако што се копира цео његов бинарни садржај. Када се бртише&amp;lt;sup&amp;gt;sip&amp;lt;/sup&amp;gt; фајл&amp;lt;sup&amp;gt;sip&amp;lt;/sup&amp;gt;, бришу се и сви његови елементи, рекурзивно.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
[[Датотека:PS-oktobar-2-2025-zadatak-4-resenje.svg|оквир|центар]]&lt;br /&gt;
&lt;br /&gt;
== 5. задатак ==&lt;br /&gt;
Приказати део шеме релационе базе (табеле, њихове колоне, примарне и стране кључеве) за следећи део концептуалног модела.&lt;br /&gt;
[[Датотека:PS-oktobar-2-2025-zadatak-5.png|оквир|центар|Слика уз поставку петог задатка]]&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
[[Датотека:PS-oktobar-2-2025-zadatak-5-resenje.png|оквир|центар|алт=Решење петог задатка|Решење петог задатка]]&lt;br /&gt;
&lt;br /&gt;
== 6. задатак ==&lt;br /&gt;
Ако имате потребу да неки скуп ентитета, који је моделован класом, специјализујете у различите хијерархије према различитим аспектима тј. критеријумима специјализације, користићете концепт језика УМЛ који се назива &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;скуповима генерализације&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== 7. задатак ==&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;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;колаборацију&amp;lt;/span&amp;gt;&lt;br /&gt;
# случај употребе&lt;br /&gt;
# ништа од наведеног&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
[[Датотека:PS-oktobar-2-2025-zadatak-7.png|оквир|центар|Слика уз задатака 7]]&lt;br /&gt;
&lt;br /&gt;
== 8. задатак ==&lt;br /&gt;
За дати дијаграм интеракције и догађаје које он спецификује, а који су означени &amp;quot;балончићима&amp;quot; (нису део дијаграма), написати све дозвољене секвенце тих догађаја које овај модел дозвољава (али највише три такве секвенце, ако их има више).&lt;br /&gt;
[[Датотека:PS-oktobar-2-2025-zadatak-8.PNG|оквир|центар|Слика уз поставку осмог задатка]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;За потребе решења на wiki, балончиће одвојити зарезом и једним знаком разамака, а секвенце симболом тачка зарез.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Решење: &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;x1, x2, y1, y2, z1, z2, y3, y4, y5, y6, z3, z4, y7, y8, x3, x4&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Објашњење: &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;explanation&amp;quot;&amp;gt;Погледати слајдове са предавања који се односе на интеракцију. За презентацију из 2025/2026, то је сладј 244.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 9. задатак ==&lt;br /&gt;
Да ли порт у власништву енкапсулиране класе мора бити део њеног интерфејса? Образложити.&lt;br /&gt;
&lt;br /&gt;
== 10. задатак ==&lt;br /&gt;
Концепт који спецификује скуп акција које обавља субјекат, уз могуће варијације, које воде ка видљивом резултату од вредности за актера и друге заинтересоване стране, назива се &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;случај употребе&amp;lt;/span&amp;gt; (енгл. &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;use case&amp;lt;/span&amp;gt;) и користи се за моделовање интерне структуре/споља видљиво понашање система (прецртати непотребно).&lt;br /&gt;
&amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;explanation&amp;quot;&amp;gt;Треба прецртати интерне структуре.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:Пројектовање софтвера]]&lt;/div&gt;</summary>
		<author><name>Aleksa</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:PS-oktobar-2-2025-zadatak-5-resenje.png&amp;diff=8229</id>
		<title>Датотека:PS-oktobar-2-2025-zadatak-5-resenje.png</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:PS-oktobar-2-2025-zadatak-5-resenje.png&amp;diff=8229"/>
		<updated>2026-01-06T17:48:15Z</updated>

		<summary type="html">&lt;p&gt;Aleksa: Отпремљено кроз дијалог за отпремање датотека.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{file&lt;br /&gt;
| description = Решење 5. задатка - пројектовање софтвера - испит октобар-2 2025 - цртано у LucidChart&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Aleksa</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9F%D1%80%D0%BE%D1%98%D0%B5%D0%BA%D1%82%D0%BE%D0%B2%D0%B0%D1%9A%D0%B5_%D1%81%D0%BE%D1%84%D1%82%D0%B2%D0%B5%D1%80%D0%B0/%D0%9E%D0%BA%D1%82%D0%BE%D0%B1%D0%B0%D1%80-2_2025&amp;diff=8228</id>
		<title>Пројектовање софтвера/Октобар-2 2025</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9F%D1%80%D0%BE%D1%98%D0%B5%D0%BA%D1%82%D0%BE%D0%B2%D0%B0%D1%9A%D0%B5_%D1%81%D0%BE%D1%84%D1%82%D0%B2%D0%B5%D1%80%D0%B0/%D0%9E%D0%BA%D1%82%D0%BE%D0%B1%D0%B0%D1%80-2_2025&amp;diff=8228"/>
		<updated>2026-01-05T22:56:18Z</updated>

		<summary type="html">&lt;p&gt;Aleksa: 4. задатак решење&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&#039;&#039;&#039;Испит у року октобар-2 2025. године&#039;&#039;&#039; одржан је 27. октобра 2025. године, на папиру, без документације. Време доступно за израду је 90 минута. Сваки задатак вреди 3 поена.&lt;br /&gt;
&lt;br /&gt;
== 1. задатак ==&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;
# Adapter&lt;br /&gt;
# Strategy&lt;br /&gt;
# Bridge&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Ни један од наведених већ &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;Proxy&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2. задатак ==&lt;br /&gt;
У систему за контролу промета &amp;quot;паметне куће&amp;quot; постоје сензори и аларми који се могу произвољно и независно додавати у систем и избацивати из система. Сензори могу бити две различите врсте: &#039;&#039;прекидачи&#039;&#039; (активирају се на јасно дефинисану границу, као прекидач) или &#039;&#039;хистерезисни&#039;&#039; (активирају се и деактивирају по принципу хистерезиса). Аларми такође могу бити различитих врста, као што су сирене, светлосни аларми, тихи аларми, дојаве преко комуникационих канала (нпр. телефоном). Применом пројектног обрасца &#039;&#039;Mediator&#039;&#039; конципирати описани део система и имплеметирати основни механизам активирања аларма када неки сензор сигнализира своју активацију.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
[[Датотека:PS-oktobar-2-2025-zadatak-2-resenje.svg|оквир|центар|алт=Слика уз решење другог задатка|Слика уз решење другог задатка]]&lt;br /&gt;
&lt;br /&gt;
== 3. задатак ==&lt;br /&gt;
Негативна појава која настаје због неадекватне примене развоја софтвера помоћу модела, а која се испољава као осећај нелагоде током раних фаза развоја и преовлађује став програмера да су документи са захтевима и пројектни модели само документација и уверење да &amp;quot;прави посао&amp;quot; није почео док се није почеко са писањем програмског кода, назива се &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;синдром журбе ка кодовању&amp;lt;/span&amp;gt; (енгл. &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;rush to code syndrom&amp;lt;/span&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
== 4. задатак ==&lt;br /&gt;
Приказати УМЛ дијаграм класа за следећи опис дела концептуалног модела. Фолдер може садржати фајлове и друге фолдере. Фајл не може садржати фајлове ни фолдере. Фајл или фолдер може бити садржан у највише једном фолдеру. Фајл или фолдер се може копирати у неки други фолдер. Фолдер се копира тако што се рекурзивно копирају сви његови елементи, док се фајл копира тако што се копира цео његов бинарни садржај. Када се бртише&amp;lt;sup&amp;gt;sip&amp;lt;/sup&amp;gt; фајл&amp;lt;sup&amp;gt;sip&amp;lt;/sup&amp;gt;, бришу се и сви његови елементи, рекурзивно.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
[[Датотека:PS-oktobar-2-2025-zadatak-4-resenje.svg|оквир|центар]]&lt;br /&gt;
&lt;br /&gt;
== 5. задатак ==&lt;br /&gt;
Приказати део шеме релационе базе (табеле, њихове колоне, примарне и стране кључеве) за следећи део концептуалног модела.&lt;br /&gt;
[[Датотека:PS-oktobar-2-2025-zadatak-5.png|оквир|центар|Слика уз поставку петог задатка]]&lt;br /&gt;
&lt;br /&gt;
== 6. задатак ==&lt;br /&gt;
Ако имате потребу да неки скуп ентитета, који је моделован класом, специјализујете у различите хијерархије према различитим аспектима тј. критеријумима специјализације, користићете концепт језика УМЛ који се назива &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;скуповима генерализације&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== 7. задатак ==&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;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;колаборацију&amp;lt;/span&amp;gt;&lt;br /&gt;
# случај употребе&lt;br /&gt;
# ништа од наведеног&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
[[Датотека:PS-oktobar-2-2025-zadatak-7.png|оквир|центар|Слика уз задатака 7]]&lt;br /&gt;
&lt;br /&gt;
== 8. задатак ==&lt;br /&gt;
За дати дијаграм интеракције и догађаје које он спецификује, а који су означени &amp;quot;балончићима&amp;quot; (нису део дијаграма), написати све дозвољене секвенце тих догађаја које овај модел дозвољава (али највише три такве секвенце, ако их има више).&lt;br /&gt;
[[Датотека:PS-oktobar-2-2025-zadatak-8.PNG|оквир|центар|Слика уз поставку осмог задатка]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;За потребе решења на wiki, балончиће одвојити зарезом и једним знаком разамака, а секвенце симболом тачка зарез.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Решење: &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;x1, x2, y1, y2, z1, z2, y3, y4, y5, y6, z3, z4, y7, y8, x3, x4&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Објашњење: &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;explanation&amp;quot;&amp;gt;Погледати слајдове са предавања који се односе на интеракцију. За презентацију из 2025/2026, то је сладј 244.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 9. задатак ==&lt;br /&gt;
Да ли порт у власништву енкапсулиране класе мора бити део њеног интерфејса? Образложити.&lt;br /&gt;
&lt;br /&gt;
== 10. задатак ==&lt;br /&gt;
Концепт који спецификује скуп акција које обавља субјекат, уз могуће варијације, које воде ка видљивом резултату од вредности за актера и друге заинтересоване стране, назива се &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;случај употребе&amp;lt;/span&amp;gt; (енгл. &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;use case&amp;lt;/span&amp;gt;) и користи се за моделовање интерне структуре/споља видљиво понашање система (прецртати непотребно).&lt;br /&gt;
&amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;explanation&amp;quot;&amp;gt;Треба прецртати интерне структуре.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:Пројектовање софтвера]]&lt;/div&gt;</summary>
		<author><name>Aleksa</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:PS-oktobar-2-2025-zadatak-4-resenje.svg&amp;diff=8227</id>
		<title>Датотека:PS-oktobar-2-2025-zadatak-4-resenje.svg</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%94%D0%B0%D1%82%D0%BE%D1%82%D0%B5%D0%BA%D0%B0:PS-oktobar-2-2025-zadatak-4-resenje.svg&amp;diff=8227"/>
		<updated>2026-01-05T22:56:00Z</updated>

		<summary type="html">&lt;p&gt;Aleksa: Отпремљено кроз дијалог за отпремање датотека.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{file&lt;br /&gt;
| description = Решење 4. задатака са испита из Пројектовања софтвера - рок октобар-2 2025, рађено у СтарУМЛ софтверу&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Aleksa</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9F%D1%80%D0%BE%D1%98%D0%B5%D0%BA%D1%82%D0%BE%D0%B2%D0%B0%D1%9A%D0%B5_%D1%81%D0%BE%D1%84%D1%82%D0%B2%D0%B5%D1%80%D0%B0/%D0%9E%D0%BA%D1%82%D0%BE%D0%B1%D0%B0%D1%80-2_2025&amp;diff=8226</id>
		<title>Пројектовање софтвера/Октобар-2 2025</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9F%D1%80%D0%BE%D1%98%D0%B5%D0%BA%D1%82%D0%BE%D0%B2%D0%B0%D1%9A%D0%B5_%D1%81%D0%BE%D1%84%D1%82%D0%B2%D0%B5%D1%80%D0%B0/%D0%9E%D0%BA%D1%82%D0%BE%D0%B1%D0%B0%D1%80-2_2025&amp;diff=8226"/>
		<updated>2026-01-05T22:35:16Z</updated>

		<summary type="html">&lt;p&gt;Aleksa: решење 2. задатка&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&#039;&#039;&#039;Испит у року октобар-2 2025. године&#039;&#039;&#039; одржан је 27. октобра 2025. године, на папиру, без документације. Време доступно за израду је 90 минута. Сваки задатак вреди 3 поена.&lt;br /&gt;
&lt;br /&gt;
== 1. задатак ==&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;
# Adapter&lt;br /&gt;
# Strategy&lt;br /&gt;
# Bridge&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Ни један од наведених већ &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;Proxy&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2. задатак ==&lt;br /&gt;
У систему за контролу промета &amp;quot;паметне куће&amp;quot; постоје сензори и аларми који се могу произвољно и независно додавати у систем и избацивати из система. Сензори могу бити две различите врсте: &#039;&#039;прекидачи&#039;&#039; (активирају се на јасно дефинисану границу, као прекидач) или &#039;&#039;хистерезисни&#039;&#039; (активирају се и деактивирају по принципу хистерезиса). Аларми такође могу бити различитих врста, као што су сирене, светлосни аларми, тихи аларми, дојаве преко комуникационих канала (нпр. телефоном). Применом пројектног обрасца &#039;&#039;Mediator&#039;&#039; конципирати описани део система и имплеметирати основни механизам активирања аларма када неки сензор сигнализира своју активацију.&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
[[Датотека:PS-oktobar-2-2025-zadatak-2-resenje.svg|оквир|центар|алт=Слика уз решење другог задатка|Слика уз решење другог задатка]]&lt;br /&gt;
&lt;br /&gt;
== 3. задатак ==&lt;br /&gt;
Негативна појава која настаје због неадекватне примене развоја софтвера помоћу модела, а која се испољава као осећај нелагоде током раних фаза развоја и преовлађује став програмера да су документи са захтевима и пројектни модели само документација и уверење да &amp;quot;прави посао&amp;quot; није почео док се није почеко са писањем програмског кода, назива се &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;синдром журбе ка кодовању&amp;lt;/span&amp;gt; (енгл. &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;rush to code syndrom&amp;lt;/span&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
== 4. задатак ==&lt;br /&gt;
Приказати УМЛ дијаграм класа за следећи опис дела концептуалног модела. Фолдер може садржати фајлове и друге фолдере. Фајл не може садржати фајлове ни фолдере. Фајл или фолдер може бити садржан у највише једном фолдеру. Фајл или фолдер се може копирати у неки други фолдер. Фолдер се копира тако што се рекурзивно копирају сви његови елементи, док се фајл копира тако што се копира цео његов бинарни садржај. Када се бртише&amp;lt;sup&amp;gt;sip&amp;lt;/sup&amp;gt; фајл&amp;lt;sup&amp;gt;sip&amp;lt;/sup&amp;gt;, бришу се и сви његови елементи, рекурзивно.&lt;br /&gt;
&lt;br /&gt;
== 5. задатак ==&lt;br /&gt;
Приказати део шеме релационе базе (табеле, њихове колоне, примарне и стране кључеве) за следећи део концептуалног модела.&lt;br /&gt;
[[Датотека:PS-oktobar-2-2025-zadatak-5.png|оквир|центар|Слика уз поставку петог задатка]]&lt;br /&gt;
&lt;br /&gt;
== 6. задатак ==&lt;br /&gt;
Ако имате потребу да неки скуп ентитета, који је моделован класом, специјализујете у различите хијерархије према различитим аспектима тј. критеријумима специјализације, користићете концепт језика УМЛ који се назива &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;скуповима генерализације&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== 7. задатак ==&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;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;колаборацију&amp;lt;/span&amp;gt;&lt;br /&gt;
# случај употребе&lt;br /&gt;
# ништа од наведеног&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
[[Датотека:PS-oktobar-2-2025-zadatak-7.png|оквир|центар|Слика уз задатака 7]]&lt;br /&gt;
&lt;br /&gt;
== 8. задатак ==&lt;br /&gt;
За дати дијаграм интеракције и догађаје које он спецификује, а који су означени &amp;quot;балончићима&amp;quot; (нису део дијаграма), написати све дозвољене секвенце тих догађаја које овај модел дозвољава (али највише три такве секвенце, ако их има више).&lt;br /&gt;
[[Датотека:PS-oktobar-2-2025-zadatak-8.PNG|оквир|центар|Слика уз поставку осмог задатка]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;За потребе решења на wiki, балончиће одвојити зарезом и једним знаком разамака, а секвенце симболом тачка зарез.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Решење: &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;x1, x2, y1, y2, z1, z2, y3, y4, y5, y6, z3, z4, y7, y8, x3, x4&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Објашњење: &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;explanation&amp;quot;&amp;gt;Погледати слајдове са предавања који се односе на интеракцију. За презентацију из 2025/2026, то је сладј 244.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 9. задатак ==&lt;br /&gt;
Да ли порт у власништву енкапсулиране класе мора бити део њеног интерфејса? Образложити.&lt;br /&gt;
&lt;br /&gt;
== 10. задатак ==&lt;br /&gt;
Концепт који спецификује скуп акција које обавља субјекат, уз могуће варијације, које воде ка видљивом резултату од вредности за актера и друге заинтересоване стране, назива се &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;случај употребе&amp;lt;/span&amp;gt; (енгл. &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;use case&amp;lt;/span&amp;gt;) и користи се за моделовање интерне структуре/споља видљиво понашање система (прецртати непотребно).&lt;br /&gt;
&amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;explanation&amp;quot;&amp;gt;Треба прецртати интерне структуре.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:Пројектовање софтвера]]&lt;/div&gt;</summary>
		<author><name>Aleksa</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:PS-oktobar-2-2025-zadatak-2-resenje.svg&amp;diff=8225</id>
		<title>Датотека:PS-oktobar-2-2025-zadatak-2-resenje.svg</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%94%D0%B0%D1%82%D0%BE%D1%82%D0%B5%D0%BA%D0%B0:PS-oktobar-2-2025-zadatak-2-resenje.svg&amp;diff=8225"/>
		<updated>2026-01-05T22:34:45Z</updated>

		<summary type="html">&lt;p&gt;Aleksa: Отпремљено кроз дијалог за отпремање датотека.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{file&lt;br /&gt;
| description = Resenje 2. zadatka Projektovanje softvera rok oktobar-2 2025, uradjeno u StarUML&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Aleksa</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:PS-oktobar-2-2025-zadatak-5.png&amp;diff=8224</id>
		<title>Датотека:PS-oktobar-2-2025-zadatak-5.png</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:PS-oktobar-2-2025-zadatak-5.png&amp;diff=8224"/>
		<updated>2026-01-05T21:41:49Z</updated>

		<summary type="html">&lt;p&gt;Aleksa: Aleksa отпремио је нову верзију датотеке Датотека:PS-oktobar-2-2025-zadatak-5.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{file&lt;br /&gt;
| description = Слика уз поставку петог задатка&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Aleksa</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9F%D1%80%D0%BE%D1%98%D0%B5%D0%BA%D1%82%D0%BE%D0%B2%D0%B0%D1%9A%D0%B5_%D1%81%D0%BE%D1%84%D1%82%D0%B2%D0%B5%D1%80%D0%B0&amp;diff=8223</id>
		<title>Пројектовање софтвера</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9F%D1%80%D0%BE%D1%98%D0%B5%D0%BA%D1%82%D0%BE%D0%B2%D0%B0%D1%9A%D0%B5_%D1%81%D0%BE%D1%84%D1%82%D0%B2%D0%B5%D1%80%D0%B0&amp;diff=8223"/>
		<updated>2026-01-05T21:29:53Z</updated>

		<summary type="html">&lt;p&gt;Aleksa: /* Пројекат */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Предмет&lt;br /&gt;
| шифра     = 13С113ПС, 13Е114ПС&lt;br /&gt;
| семестар  = 5 (СИ), 7 (РТИ)&lt;br /&gt;
| статус    = обавезни (СИ), изборни (РТИ)&lt;br /&gt;
| страница  = [https://rti.etf.bg.ac.rs/rti/ir4ps/ rti.etf.rs/rti/ir4ps]&lt;br /&gt;
| одсек     = СИ, РТИ&lt;br /&gt;
| претходни = ОО2&lt;br /&gt;
| следећи   = Рачунарска графика&lt;br /&gt;
}}&lt;br /&gt;
&#039;&#039;&#039;Пројектовање софтвера&#039;&#039;&#039; је неизбежан предмет у петом семестру за СИ, а изборни у седмом семестру за РТИ, у духу свих предмета које држи Гаги.&lt;br /&gt;
&lt;br /&gt;
== Корисне везе ==&lt;br /&gt;
* &#039;&#039;[https://staruml.io/ StarUML]&#039;&#039; — окружење које се користи на вежбама&lt;br /&gt;
* [https://drive.google.com/open?id=1qZ1Z_wSa1BBmOvmgz4mRS2yTHEyaJfQK &#039;&#039;&#039;Скрипта са свим презентацијама комбинованим у једном документу, спремно за штампу&#039;&#039;&#039;] ([https://docs.google.com/document/d/1pXMugMAyTZx8ki2z4gbcA27tmVaDbIa2 изворни &#039;&#039;Word&#039;&#039; документ])&lt;br /&gt;
* [https://drive.google.com/open?id=1FQce1ZdoMZK1V6wOdC9w6SZliWrDTBGx ETF SI] (збирка задатака, претходне лабораторијске вежбе)&lt;br /&gt;
* [https://app.box.com/s/0r50je333z1qyypz0h3rm0iqb9s0d64f/folder/38805409747 ETF Materijali (Box)] (белешке)&lt;br /&gt;
* [https://studentetfbgacrs-my.sharepoint.com/:b:/g/personal/sa190595d_student_etf_bg_ac_rs/EZn3Myy8GgZKohr0hCgOXh8Btt9JVmgpK7EDHtz6V4qhUA Документ са пречицама за алат &#039;&#039;StarUML&#039;&#039;]&lt;br /&gt;
* [https://github.com/Jovan11111/DesignPatterns Пројектни узорци имплементирани у Јави и C++]&lt;br /&gt;
&lt;br /&gt;
* [https://cet.rs/proizvod/gotova-resenja-design-patterns-elementi-objektno-orijentisanog-softvera/ Готова решења - Елементи објектно оријентисаног кода (Design Patterns: Elements of Reusable Object-Oriented Software) - CET]&lt;br /&gt;
&lt;br /&gt;
== Настава ==&lt;br /&gt;
На предавањима на предмету се предају две области: UML и пројектни узорци. Њихова подела иде овако:&lt;br /&gt;
* &#039;&#039;&#039;Први блок:&#039;&#039;&#039;&lt;br /&gt;
** Предају се сви пројектни узорци, подељени између предавања и вежби, тако да је потребно пратити оба. На последња два часа вежби се обрађују задаци слични онима који долазе на колоквијуму.&lt;br /&gt;
** За припрему првог колоквијума могу се, до неке мере, користити некадашње лабораторијске вежбе. Поред тога, за разумевање образаца у великој мери може помоћи књига &#039;&#039;Design Patterns, Elements of Reusable Object-Oriented Software&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Други блок:&#039;&#039;&#039; &lt;br /&gt;
** UML - Увод, употреба, основна синтакса. Дијаграми: Класа, Пакета (на предавањима овај део креће у првом блоку, и прелива се делом у трећи блок).&lt;br /&gt;
** За припрему другог колоквијума могу се користити некадашње лабораторијске вежбе. При том, треба имати у виду да фокус другог колоквијума на УМЛ, и да ће фокус на пројектне узорке бити мањи у односу на лабораторијске вежбе.&lt;br /&gt;
* &#039;&#039;&#039;Трећи блок:&#039;&#039;&#039; &lt;br /&gt;
** На предавањима се раде архитектурални обрасци (слојевита архитектура, микросервиси, архитектура вођена догађајима...) и њихово моделовање. На вежбама се пролазе ствари за пројекат.&lt;br /&gt;
&lt;br /&gt;
== Лабораторијске вежбе ==&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Овај блок је писан у складу са старим пропозицијама на предмету, од школске 2024/2025 нема лабораторијских вежби&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Исто као и на [[ОО1#Лабораторијске вежбе|ОО1]], осим што се домаћи задаци не предају, већ се на самој лабораторијској вежби добије готово решење.&lt;br /&gt;
&lt;br /&gt;
На првој лабораторијској вежби демонстратори пролазе референтно решење домаћег задатка, а затим над њом раде модификације које пишу у задатку. За другу лабораторијску вежбу долази градиво закључно са дијаграмима стања и пројектног узорка Стање, док за трећу лабораторијску вежбу долази градиво закључно са дијаграмима активности и пројектним узорком Заступник.&lt;br /&gt;
&lt;br /&gt;
Неке претходне лабораторијске вежбе могу се наћи међу драјвовима у [[#Корисне везе|одељку са корисним везама]]. Неке лабораторијске вежбе објављиване су на страници предмета, па су сада архивиране:&lt;br /&gt;
* [https://web.archive.org/web/20230125192247im_/https://rti.etf.bg.ac.rs/rti/ir4ps/lab/lab2_2022_23_reseno.pdf Лаб 2 2022/2023. године]&lt;br /&gt;
* [https://web.archive.org/web/20231221005013im_/https://rti.etf.bg.ac.rs/rti/ir4ps/lab/lab2_2023_24_V1_reseno.pdf Лаб 2 група 1 2023/2024. године]&lt;br /&gt;
* [https://web.archive.org/web/20231221005129im_/https://rti.etf.bg.ac.rs/rti/ir4ps/lab/lab2_2023_24_V2_reseno.pdf Лаб 2 група 2 2023/2024. године]&lt;br /&gt;
* [https://web.archive.org/web/20230125192053im_/https://rti.etf.bg.ac.rs/rti/ir4ps/lab/lab3_2022_23_reseno.pdf Лаб 3 2022/2023. године&lt;br /&gt;
&lt;br /&gt;
==Пројекат==&lt;br /&gt;
Од школеске 2024/2025 постоји пројекат на предмету. Пројекат носи 30 поена и није обавезан. Брани се у јануарском, фебруарском или августвоском испитном року.&lt;br /&gt;
&lt;br /&gt;
* [https://web.archive.org/web/20251211142709/https://ps.etf.bg.ac.rs/domaci/Projektni%20zadatak%202024%20v1.1.pdf Пројекат - школска 2024/2025, 2025/2026 (Wayback machine)]&lt;br /&gt;
&lt;br /&gt;
== Испитни рокови ==&lt;br /&gt;
Слична прича као и за [[ОО1#Испитни рокови|ОО1]]. &#039;&#039;&#039;Доступни су и [[Пројектовање софтвера/Питалице|испитни примери који нису категорисани по роковима]].&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Уколико желите да додате рок, посетите &#039;&#039;&#039;[[Project:Направи#Moodle|страницу за прављење рока]]&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Колоквијум 1 ===&lt;br /&gt;
{{#dpl:&lt;br /&gt;
| category    = Пројектовање софтвера&lt;br /&gt;
| category    = Рокови&lt;br /&gt;
| titleregexp = Пројектовање софтвера/К1&lt;br /&gt;
| nottitleregexp = ^Пројектовање софтвера/К1 20[01][0-9]$&lt;br /&gt;
| nottitleregexp = ^Пројектовање софтвера/К1 202[0-3]$&lt;br /&gt;
| format      = ,\n* &amp;lt;span class=&amp;quot;rok,&amp;quot;&amp;gt;[[%PAGE%|²{#invoke:String¦sub¦%PAGE%¦23¦-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;
=== Колоквијум 2 ===&lt;br /&gt;
{{#dpl:&lt;br /&gt;
| category    = Пројектовање софтвера&lt;br /&gt;
| category    = Рокови&lt;br /&gt;
| titleregexp = Пројектовање софтвера/К2&lt;br /&gt;
| nottitleregexp = ^Пројектовање софтвера/К2 20[01][0-9]$&lt;br /&gt;
| nottitleregexp = ^Пројектовање софтвера/К2 202[0-3]$&lt;br /&gt;
| format      = ,\n* &amp;lt;span class=&amp;quot;rok,&amp;quot;&amp;gt;[[%PAGE%|²{#invoke:String¦sub¦%PAGE%¦23¦-1}²]]&amp;lt;/span&amp;gt;,&lt;br /&gt;
| ordermethod = title&lt;br /&gt;
| include     = {nerešeno}.dpl, {delimično rešeno}.dpl, {нерешено}.dpl, {делимично решено}.dpl&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Испит ===&lt;br /&gt;
{{#dpl:&lt;br /&gt;
| category    = Пројектовање софтвера&lt;br /&gt;
| category    = Рокови&lt;br /&gt;
| titleregexp = Пројектовање софтвера/.* \d+$&lt;br /&gt;
| nottitleregexp     = Пројектовање софтвера/.* 201[0-9]$&lt;br /&gt;
| nottitleregexp     = Пројектовање софтвера/.* 202[0-4]$&lt;br /&gt;
| nottitleregexp  = Пројектовање софтвера/К\d&lt;br /&gt;
| nottitleregexp  = Пројектовање софтвера/Пробни тестови&lt;br /&gt;
| nottitleregexp  = Пројектовање софтвера/Лаб&lt;br /&gt;
| format      = ,\n* &amp;lt;span class=&amp;quot;rok,&amp;quot;&amp;gt;[[%PAGE%|²{#invoke:String¦sub¦%PAGE%¦23¦-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;
=== Стари рокови (пре 2024/2025)===&lt;br /&gt;
&lt;br /&gt;
==== Пробни тестови ====&lt;br /&gt;
Овде се налазе пробни тестови дати за вежбу пред колоквијум на Moodle платформи.&lt;br /&gt;
{{#dpl:&lt;br /&gt;
| titleregexp     = Пројектовање софтвера/Пробни тестови&lt;br /&gt;
| noresultsheader = Тренутно нема решених рокова.&lt;br /&gt;
| format          = ,\n* [[%PAGE%|²{#invoke:String¦sub¦%PAGE%¦23¦-1}²]],,&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Колоквијум 1 ====&lt;br /&gt;
{{#dpl:&lt;br /&gt;
| category    = Пројектовање софтвера&lt;br /&gt;
| category    = Рокови&lt;br /&gt;
| titleregexp = ^Пројектовање софтвера/К1 20[01][0-9]$&lt;br /&gt;
| titleregexp = ^Пројектовање софтвера/К1 202[0-3]$&lt;br /&gt;
| format      = ,\n* &amp;lt;span class=&amp;quot;rok,&amp;quot;&amp;gt;[[%PAGE%|²{#invoke:String¦sub¦%PAGE%¦23¦-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;
==== Колоквијум 2 ====&lt;br /&gt;
{{#dpl:&lt;br /&gt;
| category    = Пројектовање софтвера&lt;br /&gt;
| category    = Рокови&lt;br /&gt;
| titleregexp = ^Пројектовање софтвера/К2 20[01][0-9]$&lt;br /&gt;
| titleregexp = ^Пројектовање софтвера/К2 202[0-3]$&lt;br /&gt;
| format      = ,\n* &amp;lt;span class=&amp;quot;rok,&amp;quot;&amp;gt;[[%PAGE%|²{#invoke:String¦sub¦%PAGE%¦23¦-1}²]]&amp;lt;/span&amp;gt;,&lt;br /&gt;
| ordermethod = title&lt;br /&gt;
| include     = {nerešeno}.dpl, {delimično rešeno}.dpl, {нерешено}.dpl, {делимично решено}.dpl&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Испит ====&lt;br /&gt;
{{#dpl:&lt;br /&gt;
| category    = Пројектовање софтвера&lt;br /&gt;
| category    = Рокови&lt;br /&gt;
| titleregexp     = Пројектовање софтвера/.* 201[0-9]$&lt;br /&gt;
| titleregexp     = Пројектовање софтвера/.* 202[0-4]$&lt;br /&gt;
| nottitleregexp  = Пројектовање софтвера/К\d&lt;br /&gt;
| nottitleregexp  = Пројектовање софтвера/Пробни тестови&lt;br /&gt;
| nottitleregexp  = Пројектовање софтвера/Лаб&lt;br /&gt;
| format      = ,\n* &amp;lt;span class=&amp;quot;rok,&amp;quot;&amp;gt;[[%PAGE%|²{#invoke:String¦sub¦%PAGE%¦23¦-1}²]]&amp;lt;/span&amp;gt;,&lt;br /&gt;
| ordermethod = title&lt;br /&gt;
| include     = {nerešeno}.dpl, {delimično rešeno}.dpl, {нерешено}.dpl, {делимично решено}.dpl&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Начин оцењивања ==&lt;br /&gt;
Исто као и на [[ОО1#Начин оцењивања|ОО1]]. Школске 2022/23. године је, због друге лабораторијске вежбе која није била прегледана до пар сати пред трећу лабораторијску вежбу, било омогућено да поправна лабораторијска вежба надокнађује другу, трећу, или и другу и трећу лабораторијску вежбу (студенти су тај избор морали да направе пре саме лабораторијске вежбе).&lt;br /&gt;
&lt;br /&gt;
== Потребна помоћ ==&lt;br /&gt;
* {{zadaci|postavke}}&lt;br /&gt;
** Од користи су такође модификације добијене на лабораторијским вежбама, како би студенти знали отприлике шта их на лабораторијским вежбама чека.&lt;/div&gt;</summary>
		<author><name>Aleksa</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9F%D1%80%D0%BE%D1%98%D0%B5%D0%BA%D1%82%D0%BE%D0%B2%D0%B0%D1%9A%D0%B5_%D1%81%D0%BE%D1%84%D1%82%D0%B2%D0%B5%D1%80%D0%B0/%D0%9A2_2024&amp;diff=8222</id>
		<title>Пројектовање софтвера/К2 2024</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9F%D1%80%D0%BE%D1%98%D0%B5%D0%BA%D1%82%D0%BE%D0%B2%D0%B0%D1%9A%D0%B5_%D1%81%D0%BE%D1%84%D1%82%D0%B2%D0%B5%D1%80%D0%B0/%D0%9A2_2024&amp;diff=8222"/>
		<updated>2026-01-03T15:19:08Z</updated>

		<summary type="html">&lt;p&gt;Aleksa: /* Решење */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&#039;&#039;&#039;Други колоквијум 2024. године&#039;&#039;&#039; одржан је 1. децембра 2024. године. Биле су доступне презентације са вежби, као и УМЛ презентације професора Тартаље. Време за израду је било 120 минута. Поставка је доступна са [https://web.archive.org/web/20260103134407/https://ps.etf.bg.ac.rs/rokovi/PS_K2_2024.zip странице предмета].&lt;br /&gt;
&lt;br /&gt;
== Поставка ==&lt;br /&gt;
Информациони систем фиктивне медицинске куће “ПС медик” документован је у оквиру StarUML фајла lekari.mdj. Докторима се прате име и презиме и године стажа, а пацијентима име и презиме и јединствени здравствени идентификатор (ниска знакова која поштује унапред позната правила). Пацијенту се заказује преглед код неког од доктора, при чему се прате термин прегледа и ординација у којој се преглед обавља, као и статус прегледа (заказан, у току, одржан). Лековима се прати назив, произвођач, доза активне супстанце и може им се дохватити опис који се састоји од свих параметара лека.&lt;br /&gt;
&amp;lt;ol style=&amp;quot;list-style-type:lower-alpha&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Исправити грешке на дијаграму класа и документовати их у фајлу &#039;&#039;greske.docx&#039;&#039;. Начин документовања грешака је описан у том фајлу. &#039;&#039;&#039;Напомена:&#039;&#039;&#039; приказане класе поседују још операција, али оне нису од интереса у овој тачки и њихово недостајање не треба сматрати грешком. По потреби се операције могу додавати у оквиру осталих тачака.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Изменити модел и дијаграм класа тако да се омогући праћење стручне специјализације лекара (неке од њих су: радиолог, кардиолог, лекар опште праксе, остале нема потребе приказивати). Лекари обављају преглед другачије у зависности од специјализације. Сматрати да лекари увек имају тачно једну специјализацију и она им се не мења. Скуп генерализација и његова ограничења документовати помоћу &#039;&#039;StarUML&#039;&#039; елемента &#039;&#039;Text&#039;&#039; постављеног изнад генерализације &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Допунити дијаграм класа тако да се омогући праћење дијагноза које лекар прописује у оквиру прегледа. Дијагнози се прате текстуални назив болести и лекови који су преписани за ту дијагнозу, при чему неки лекови могу бити преписани на рецепт, а неки без рецепта.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Лекар опште праксе Михајло Михајловић је прегледао пацијента Луку Лукића у ординацији 4. У оквиру прегледа Луки је дијагностикован акутни ларингитис и на рецепт преписан “Хемомицин”, а препоручено му је и да користи “Фервекс” и “Стрепсилс”, који се купују без рецепта. На дијаграму објеката приказати стање система након прегледа. Атрибуте чије вредности нису познате не треба приказивати.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Захтев за састављање извештаја о прегледу који није завршен доводи до грешке. У случају да је преглед завршен, извештај се састоји од имена и презимена и јединственог здравственог идентификатора пацијента, имена и презимена лекара, као и описа дијагноза формираних у току прегледа. Опис дијагнозе састоји се од назива дијагностиковане болести, описа лекова који су преписани без рецепта и описа лекова који су преписани на рецепт. Направити дијаграм секвенце који приказује састављање извештаја о прегледу, разрађен до нивоа састављања описа лека (не треба приказивати како се реализује састављање описа лека) и по потреби допунити дијаграм класа да би обављање сценарија било изводиво.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Датотека:PS K2 2024 pocetno stanje.svg|оквир|центар|Почетно стањер]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Решење ==&lt;br /&gt;
&amp;lt;ol style=&amp;quot;list-style-type:lower-alpha&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Преглед грешака. Напомена: &amp;quot;Стинг&amp;quot; у конструктору класе Доктор је грешка у куцању, коју не треба наводити.&amp;lt;/li&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;br /&amp;gt;Р. бр.&lt;br /&gt;
! &amp;lt;br /&amp;gt;Дијаграм&lt;br /&gt;
! &amp;lt;br /&amp;gt;Елемент&lt;br /&gt;
! &amp;lt;br /&amp;gt;Опис грешке&lt;br /&gt;
|-&lt;br /&gt;
| 1&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;
| Атрибут радниСтаж треба да буде цео број, а не стринг&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| Класни&lt;br /&gt;
| Класа Пацијент&lt;br /&gt;
| Атрибут здравствениИД треба да буде тип података ЗдравствениИдентификатор&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| Класни&lt;br /&gt;
| Енумерација СтатусПрегледа&lt;br /&gt;
| Недостаје литерал У_ТОКУ&lt;br /&gt;
|-&lt;br /&gt;
| 5&lt;br /&gt;
| Класни&lt;br /&gt;
| Класа Преглед&lt;br /&gt;
| Недостаје атрибут бројОрдинације, типа цео број&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| Класни&lt;br /&gt;
| Асоцијација Доктор-Пацијент&lt;br /&gt;
| Мултипликативности треба да буде 0..* са обе стране&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:Пројектовање софтвера]]&lt;/div&gt;</summary>
		<author><name>Aleksa</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9F%D1%80%D0%BE%D1%98%D0%B5%D0%BA%D1%82%D0%BE%D0%B2%D0%B0%D1%9A%D0%B5_%D1%81%D0%BE%D1%84%D1%82%D0%B2%D0%B5%D1%80%D0%B0/%D0%9A2_2024&amp;diff=8221</id>
		<title>Пројектовање софтвера/К2 2024</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9F%D1%80%D0%BE%D1%98%D0%B5%D0%BA%D1%82%D0%BE%D0%B2%D0%B0%D1%9A%D0%B5_%D1%81%D0%BE%D1%84%D1%82%D0%B2%D0%B5%D1%80%D0%B0/%D0%9A2_2024&amp;diff=8221"/>
		<updated>2026-01-03T15:15:49Z</updated>

		<summary type="html">&lt;p&gt;Aleksa: Решење под а&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&#039;&#039;&#039;Други колоквијум 2024. године&#039;&#039;&#039; одржан је 1. децембра 2024. године. Биле су доступне презентације са вежби, као и УМЛ презентације професора Тартаље. Време за израду је било 120 минута. Поставка је доступна са [https://web.archive.org/web/20260103134407/https://ps.etf.bg.ac.rs/rokovi/PS_K2_2024.zip странице предмета].&lt;br /&gt;
&lt;br /&gt;
== Поставка ==&lt;br /&gt;
Информациони систем фиктивне медицинске куће “ПС медик” документован је у оквиру StarUML фајла lekari.mdj. Докторима се прате име и презиме и године стажа, а пацијентима име и презиме и јединствени здравствени идентификатор (ниска знакова која поштује унапред позната правила). Пацијенту се заказује преглед код неког од доктора, при чему се прате термин прегледа и ординација у којој се преглед обавља, као и статус прегледа (заказан, у току, одржан). Лековима се прати назив, произвођач, доза активне супстанце и може им се дохватити опис који се састоји од свих параметара лека.&lt;br /&gt;
&amp;lt;ol style=&amp;quot;list-style-type:lower-alpha&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Исправити грешке на дијаграму класа и документовати их у фајлу &#039;&#039;greske.docx&#039;&#039;. Начин документовања грешака је описан у том фајлу. &#039;&#039;&#039;Напомена:&#039;&#039;&#039; приказане класе поседују још операција, али оне нису од интереса у овој тачки и њихово недостајање не треба сматрати грешком. По потреби се операције могу додавати у оквиру осталих тачака.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Изменити модел и дијаграм класа тако да се омогући праћење стручне специјализације лекара (неке од њих су: радиолог, кардиолог, лекар опште праксе, остале нема потребе приказивати). Лекари обављају преглед другачије у зависности од специјализације. Сматрати да лекари увек имају тачно једну специјализацију и она им се не мења. Скуп генерализација и његова ограничења документовати помоћу &#039;&#039;StarUML&#039;&#039; елемента &#039;&#039;Text&#039;&#039; постављеног изнад генерализације &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Допунити дијаграм класа тако да се омогући праћење дијагноза које лекар прописује у оквиру прегледа. Дијагнози се прате текстуални назив болести и лекови који су преписани за ту дијагнозу, при чему неки лекови могу бити преписани на рецепт, а неки без рецепта.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Лекар опште праксе Михајло Михајловић је прегледао пацијента Луку Лукића у ординацији 4. У оквиру прегледа Луки је дијагностикован акутни ларингитис и на рецепт преписан “Хемомицин”, а препоручено му је и да користи “Фервекс” и “Стрепсилс”, који се купују без рецепта. На дијаграму објеката приказати стање система након прегледа. Атрибуте чије вредности нису познате не треба приказивати.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Захтев за састављање извештаја о прегледу који није завршен доводи до грешке. У случају да је преглед завршен, извештај се састоји од имена и презимена и јединственог здравственог идентификатора пацијента, имена и презимена лекара, као и описа дијагноза формираних у току прегледа. Опис дијагнозе састоји се од назива дијагностиковане болести, описа лекова који су преписани без рецепта и описа лекова који су преписани на рецепт. Направити дијаграм секвенце који приказује састављање извештаја о прегледу, разрађен до нивоа састављања описа лека (не треба приказивати како се реализује састављање описа лека) и по потреби допунити дијаграм класа да би обављање сценарија било изводиво.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Датотека:PS K2 2024 pocetno stanje.svg|оквир|центар|Почетно стањер]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Решење ==&lt;br /&gt;
&amp;lt;ol style=&amp;quot;list-style-type:lower-alpha&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Преглед грешака. Напомена: &amp;quot;Стинг&amp;quot; у конструктору класе Доктор је грешка у куцању, коју не треба наводити.&amp;lt;/li&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;br /&amp;gt;Р. бр.&lt;br /&gt;
! &amp;lt;br /&amp;gt;Дијаграм&lt;br /&gt;
! &amp;lt;br /&amp;gt;Елемент&lt;br /&gt;
! &amp;lt;br /&amp;gt;Опис грешке&lt;br /&gt;
|-&lt;br /&gt;
| 1&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;
| Атрибут радниСтаж треба да буде цео број, а не стринг&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| Класни&lt;br /&gt;
| Класа Пацијент&lt;br /&gt;
| Атрибут здравствениИД треба да бзде тип података ЗдравствениИдентификатор&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| Класни&lt;br /&gt;
| Енумерација СтатусПрегледа&lt;br /&gt;
| Недостаје литерал У_ТОКУ&lt;br /&gt;
|-&lt;br /&gt;
| 5&lt;br /&gt;
| Класни&lt;br /&gt;
| Класа Преглед&lt;br /&gt;
| Недостаје атрибут бројОрдинације, типа цео број&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| Класни&lt;br /&gt;
| Асоцијација Доктор-Пацијент&lt;br /&gt;
| Мултипликативности треба да буде 0..* са обе стране&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:Пројектовање софтвера]]&lt;/div&gt;</summary>
		<author><name>Aleksa</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9F%D1%80%D0%BE%D1%98%D0%B5%D0%BA%D1%82%D0%BE%D0%B2%D0%B0%D1%9A%D0%B5_%D1%81%D0%BE%D1%84%D1%82%D0%B2%D0%B5%D1%80%D0%B0/%D0%9A2_2024&amp;diff=8220</id>
		<title>Пројектовање софтвера/К2 2024</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9F%D1%80%D0%BE%D1%98%D0%B5%D0%BA%D1%82%D0%BE%D0%B2%D0%B0%D1%9A%D0%B5_%D1%81%D0%BE%D1%84%D1%82%D0%B2%D0%B5%D1%80%D0%B0/%D0%9A2_2024&amp;diff=8220"/>
		<updated>2026-01-03T15:05:17Z</updated>

		<summary type="html">&lt;p&gt;Aleksa: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&#039;&#039;&#039;Други колоквијум 2024. године&#039;&#039;&#039; одржан је 1. децембра 2024. године. Биле су доступне презентације са вежби, као и УМЛ презентације професора Тартаље. Време за израду је било 120 минута. Поставка је доступна са [https://web.archive.org/web/20260103134407/https://ps.etf.bg.ac.rs/rokovi/PS_K2_2024.zip странице предмета].&lt;br /&gt;
&lt;br /&gt;
== Поставка ==&lt;br /&gt;
Информациони систем фиктивне медицинске куће “ПС медик” документован је у оквиру StarUML фајла lekari.mdj. Докторима се прате име и презиме и године стажа, а пацијентима име и презиме и јединствени здравствени идентификатор (ниска знакова која поштује унапред позната правила). Пацијенту се заказује преглед код неког од доктора, при чему се прате термин прегледа и ординација у којој се преглед обавља, као и статус прегледа (заказан, у току, одржан). Лековима се прати назив, произвођач, доза активне супстанце и може им се дохватити опис који се састоји од свих параметара лека.&lt;br /&gt;
&amp;lt;ol style=&amp;quot;list-style-type:lower-alpha&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Исправити грешке на дијаграму класа и документовати их у фајлу &#039;&#039;greske.docx&#039;&#039;. Начин документовања грешака је описан у том фајлу. &#039;&#039;&#039;Напомена:&#039;&#039;&#039; приказане класе поседују још операција, али оне нису од интереса у овој тачки и њихово недостајање не треба сматрати грешком. По потреби се операције могу додавати у оквиру осталих тачака.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Изменити модел и дијаграм класа тако да се омогући праћење стручне специјализације лекара (неке од њих су: радиолог, кардиолог, лекар опште праксе, остале нема потребе приказивати). Лекари обављају преглед другачије у зависности од специјализације. Сматрати да лекари увек имају тачно једну специјализацију и она им се не мења. Скуп генерализација и његова ограничења документовати помоћу &#039;&#039;StarUML&#039;&#039; елемента &#039;&#039;Text&#039;&#039; постављеног изнад генерализације &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Допунити дијаграм класа тако да се омогући праћење дијагноза које лекар прописује у оквиру прегледа. Дијагнози се прате текстуални назив болести и лекови који су преписани за ту дијагнозу, при чему неки лекови могу бити преписани на рецепт, а неки без рецепта.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Лекар опште праксе Михајло Михајловић је прегледао пацијента Луку Лукића у ординацији 4. У оквиру прегледа Луки је дијагностикован акутни ларингитис и на рецепт преписан “Хемомицин”, а препоручено му је и да користи “Фервекс” и “Стрепсилс”, који се купују без рецепта. На дијаграму објеката приказати стање система након прегледа. Атрибуте чије вредности нису познате не треба приказивати.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Захтев за састављање извештаја о прегледу који није завршен доводи до грешке. У случају да је преглед завршен, извештај се састоји од имена и презимена и јединственог здравственог идентификатора пацијента, имена и презимена лекара, као и описа дијагноза формираних у току прегледа. Опис дијагнозе састоји се од назива дијагностиковане болести, описа лекова који су преписани без рецепта и описа лекова који су преписани на рецепт. Направити дијаграм секвенце који приказује састављање извештаја о прегледу, разрађен до нивоа састављања описа лека (не треба приказивати како се реализује састављање описа лека) и по потреби допунити дијаграм класа да би обављање сценарија било изводиво.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Датотека:PS K2 2024 pocetno stanje.svg|оквир|центар|Почетно стањер]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Решење ==&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:Пројектовање софтвера]]&lt;/div&gt;</summary>
		<author><name>Aleksa</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9F%D1%80%D0%BE%D1%98%D0%B5%D0%BA%D1%82%D0%BE%D0%B2%D0%B0%D1%9A%D0%B5_%D1%81%D0%BE%D1%84%D1%82%D0%B2%D0%B5%D1%80%D0%B0/%D0%9A2_2024&amp;diff=8219</id>
		<title>Пројектовање софтвера/К2 2024</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9F%D1%80%D0%BE%D1%98%D0%B5%D0%BA%D1%82%D0%BE%D0%B2%D0%B0%D1%9A%D0%B5_%D1%81%D0%BE%D1%84%D1%82%D0%B2%D0%B5%D1%80%D0%B0/%D0%9A2_2024&amp;diff=8219"/>
		<updated>2026-01-03T13:58:38Z</updated>

		<summary type="html">&lt;p&gt;Aleksa: линк ка оригиналном року&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&#039;&#039;&#039;Други колоквијум 2024. године&#039;&#039;&#039; одржан је 1. децембра 2024. године. Биле су доступне презентације са вежби, као и УМЛ презентације професора Тартаље. Време за израду је било 120 минута. Поставка је доступна са [https://web.archive.org/web/20260103134407/https://ps.etf.bg.ac.rs/rokovi/PS_K2_2024.zip странице предмета].&lt;br /&gt;
&lt;br /&gt;
== Поставка ==&lt;br /&gt;
Информациони систем фиктивне медицинске куће “ПС медик” документован је у оквиру StarUML фајла lekari.mdj. Докторима се прате име и презиме и године стажа, а пацијентима име и презиме и јединствени здравствени идентификатор (ниска знакова која поштује унапред позната правила). Пацијенту се заказује преглед код неког од доктора, при чему се прате термин прегледа и ординација у којој се преглед обавља, као и статус прегледа (заказан, у току, одржан). Лековима се прати назив, произвођач, доза активне супстанце и може им се дохватити опис који се састоји од свих параметара лека.&lt;br /&gt;
&amp;lt;ol style=&amp;quot;list-style-type:lower-alpha&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Исправити грешке на дијаграму класа и документовати их у фајлу &#039;&#039;greske.docx&#039;&#039;. Начин документовања грешака је описан у том фајлу. &#039;&#039;&#039;Напомена:&#039;&#039;&#039; приказане класе поседују још операција, али оне нису од интереса у овој тачки и њихово недостајање не треба сматрати грешком. По потреби се операције могу додавати у оквиру осталих тачака.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Изменити модел и дијаграм класа тако да се омогући праћење стручне специјализације лекара (неке од њих су: радиолог, кардиолог, лекар опште праксе, остале нема потребе приказивати). Лекари обављају преглед другачије у зависности од специјализације. Сматрати да лекари увек имају тачно једну специјализацију и она им се не мења. Скуп генерализација и његова ограничења документовати помоћу &#039;&#039;StarUML&#039;&#039; елемента &#039;&#039;Text&#039;&#039; постављеног изнад генерализације &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Допунити дијаграм класа тако да се омогући праћење дијагноза које лекар прописује у оквиру прегледа. Дијагнози се прате текстуални назив болести и лекови који су преписани за ту дијагнозу, при чему неки лекови могу бити преписани на рецепт, а неки без рецепта.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Лекар опште праксе Михајло Михајловић је прегледао пацијента Луку Лукића у ординацији 4. У оквиру прегледа Луки је дијагностикован акутни ларингитис и на рецепт преписан “Хемомицин”, а препоручено му је и да користи “Фервекс” и “Стрепсилс”, који се купују без рецепта. На дијаграму објеката приказати стање система након прегледа. Атрибуте чије вредности нису познате не треба приказивати.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Захтев за састављање извештаја о прегледу који није завршен доводи до грешке. У случају да је преглед завршен, извештај се састоји од имена и презимена и јединственог здравственог идентификатора пацијента, имена и презимена лекара, као и описа дијагноза формираних у току прегледа. Опис дијагнозе састоји се од назива дијагностиковане болести, описа лекова који су преписани без рецепта и описа лекова који су преписани на рецепт. Направити дијаграм секвенце који приказује састављање извештаја о прегледу, разрађен до нивоа састављања описа лека (не треба приказивати како се реализује састављање описа лека) и по потреби допунити дијаграм класа да би обављање сценарија било изводиво.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Датотека:PS K2 2024 pocetno stanje.svg|оквир|центар|Почетно стањер]]&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:Пројектовање софтвера]]&lt;/div&gt;</summary>
		<author><name>Aleksa</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9F%D1%80%D0%BE%D1%98%D0%B5%D0%BA%D1%82%D0%BE%D0%B2%D0%B0%D1%9A%D0%B5_%D1%81%D0%BE%D1%84%D1%82%D0%B2%D0%B5%D1%80%D0%B0/%D0%9E%D0%BA%D1%82%D0%BE%D0%B1%D0%B0%D1%80-2_2025&amp;diff=8218</id>
		<title>Пројектовање софтвера/Октобар-2 2025</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9F%D1%80%D0%BE%D1%98%D0%B5%D0%BA%D1%82%D0%BE%D0%B2%D0%B0%D1%9A%D0%B5_%D1%81%D0%BE%D1%84%D1%82%D0%B2%D0%B5%D1%80%D0%B0/%D0%9E%D0%BA%D1%82%D0%BE%D0%B1%D0%B0%D1%80-2_2025&amp;diff=8218"/>
		<updated>2025-12-19T21:13:16Z</updated>

		<summary type="html">&lt;p&gt;Aleksa: /* 8. задатак */ објашњење решења&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&#039;&#039;&#039;Испит у року октобар-2 2025. године&#039;&#039;&#039; одржан је 27. октобра 2025. године, на папиру, без документације. Време доступно за израду је 90 минута. Сваки задатак вреди 3 поена.&lt;br /&gt;
&lt;br /&gt;
== 1. задатак ==&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;
# Adapter&lt;br /&gt;
# Strategy&lt;br /&gt;
# Bridge&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Ни један од наведених већ &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;Proxy&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2. задатак ==&lt;br /&gt;
У систему за контролу промета &amp;quot;паметне куће&amp;quot; постоје сензори и аларми који се могу произвољно и независно додавати у систем и избацивати из система. Сензори могу бити две различите врсте: &#039;&#039;прекидачи&#039;&#039; (активирају се на јасно дефинисану границу, као прекидач) или &#039;&#039;хистерезисни&#039;&#039; (активирају се и деактивирају по принципу хистерезиса). Аларми такође могу бити различитих врста, као што су сирене, светлосни аларми, тихи аларми, дојаве преко комуникационих канала (нпр. телефоном). Применом пројектног обрасца &#039;&#039;Mediator&#039;&#039; конципирати описани део система и имплеметирати основни механизам активирања аларма када неки сензор сигнализира своју активацију.&lt;br /&gt;
&lt;br /&gt;
== 3. задатак ==&lt;br /&gt;
Негативна појава која настаје због неадекватне примене развоја софтвера помоћу модела, а која се испољава као осећај нелагоде током раних фаза развоја и преовлађује став програмера да су документи са захтевима и пројектни модели само документација и уверење да &amp;quot;прави посао&amp;quot; није почео док се није почеко са писањем програмског кода, назива се &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;синдром журбе ка кодовању&amp;lt;/span&amp;gt; (енгл. &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;rush to code syndrom&amp;lt;/span&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
== 4. задатак ==&lt;br /&gt;
Приказати УМЛ дијаграм класа за следећи опис дела концептуалног модела. Фолдер може садржати фајлове и друге фолдере. Фајл не може садржати фајлове ни фолдере. Фајл или фолдер може бити садржан у највише једном фолдеру. Фајл или фолдер се може копирати у неки други фолдер. Фолдер се копира тако што се рекурзивно копирају сви његови елементи, док се фајл копира тако што се копира цео његов бинарни садржај. Када се бртише&amp;lt;sup&amp;gt;sip&amp;lt;/sup&amp;gt; фајл&amp;lt;sup&amp;gt;sip&amp;lt;/sup&amp;gt;, бришу се и сви његови елементи, рекурзивно.&lt;br /&gt;
&lt;br /&gt;
== 5. задатак ==&lt;br /&gt;
Приказати део шеме релационе базе (табеле, њихове колоне, примарне и стране кључеве) за следећи део концептуалног модела.&lt;br /&gt;
[[Датотека:PS-oktobar-2-2025-zadatak-5.png|оквир|центар|Слика уз поставку петог задатка]]&lt;br /&gt;
&lt;br /&gt;
== 6. задатак ==&lt;br /&gt;
Ако имате потребу да неки скуп ентитета, који је моделован класом, специјализујете у различите хијерархије према различитим аспектима тј. критеријумима специјализације, користићете концепт језика УМЛ који се назива &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;скуповима генерализације&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== 7. задатак ==&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;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;колаборацију&amp;lt;/span&amp;gt;&lt;br /&gt;
# случај употребе&lt;br /&gt;
# ништа од наведеног&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
[[Датотека:PS-oktobar-2-2025-zadatak-7.png|оквир|центар|Слика уз задатака 7]]&lt;br /&gt;
&lt;br /&gt;
== 8. задатак ==&lt;br /&gt;
За дати дијаграм интеракције и догађаје које он спецификује, а који су означени &amp;quot;балончићима&amp;quot; (нису део дијаграма), написати све дозвољене секвенце тих догађаја које овај модел дозвољава (али највише три такве секвенце, ако их има више).&lt;br /&gt;
[[Датотека:PS-oktobar-2-2025-zadatak-8.PNG|оквир|центар|Слика уз поставку осмог задатка]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;За потребе решења на wiki, балончиће одвојити зарезом и једним знаком разамака, а секвенце симболом тачка зарез.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Решење: &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;x1, x2, y1, y2, z1, z2, y3, y4, y5, y6, z3, z4, y7, y8, x3, x4&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Објашњење: &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;explanation&amp;quot;&amp;gt;Погледати слајдове са предавања који се односе на интеракцију. За презентацију из 2025/2026, то је сладј 244.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 9. задатак ==&lt;br /&gt;
Да ли порт у власништву енкапсулиране класе мора бити део њеног интерфејса? Образложити.&lt;br /&gt;
&lt;br /&gt;
== 10. задатак ==&lt;br /&gt;
Концепт који спецификује скуп акција које обавља субјекат, уз могуће варијације, које воде ка видљивом резултату од вредности за актера и друге заинтересоване стране, назива се &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;случај употребе&amp;lt;/span&amp;gt; (енгл. &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;use case&amp;lt;/span&amp;gt;) и користи се за моделовање интерне структуре/споља видљиво понашање система (прецртати непотребно).&lt;br /&gt;
&amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;explanation&amp;quot;&amp;gt;Треба прецртати интерне структуре.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:Пројектовање софтвера]]&lt;/div&gt;</summary>
		<author><name>Aleksa</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9F%D1%80%D0%BE%D1%98%D0%B5%D0%BA%D1%82%D0%BE%D0%B2%D0%B0%D1%9A%D0%B5_%D1%81%D0%BE%D1%84%D1%82%D0%B2%D0%B5%D1%80%D0%B0/%D0%9E%D0%BA%D1%82%D0%BE%D0%B1%D0%B0%D1%80-2_2025&amp;diff=8217</id>
		<title>Пројектовање софтвера/Октобар-2 2025</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9F%D1%80%D0%BE%D1%98%D0%B5%D0%BA%D1%82%D0%BE%D0%B2%D0%B0%D1%9A%D0%B5_%D1%81%D0%BE%D1%84%D1%82%D0%B2%D0%B5%D1%80%D0%B0/%D0%9E%D0%BA%D1%82%D0%BE%D0%B1%D0%B0%D1%80-2_2025&amp;diff=8217"/>
		<updated>2025-12-19T21:07:10Z</updated>

		<summary type="html">&lt;p&gt;Aleksa: /* 6. задатак */  исправка решења&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&#039;&#039;&#039;Испит у року октобар-2 2025. године&#039;&#039;&#039; одржан је 27. октобра 2025. године, на папиру, без документације. Време доступно за израду је 90 минута. Сваки задатак вреди 3 поена.&lt;br /&gt;
&lt;br /&gt;
== 1. задатак ==&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;
# Adapter&lt;br /&gt;
# Strategy&lt;br /&gt;
# Bridge&lt;br /&gt;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;Ни један од наведених већ &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;Proxy&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2. задатак ==&lt;br /&gt;
У систему за контролу промета &amp;quot;паметне куће&amp;quot; постоје сензори и аларми који се могу произвољно и независно додавати у систем и избацивати из система. Сензори могу бити две различите врсте: &#039;&#039;прекидачи&#039;&#039; (активирају се на јасно дефинисану границу, као прекидач) или &#039;&#039;хистерезисни&#039;&#039; (активирају се и деактивирају по принципу хистерезиса). Аларми такође могу бити различитих врста, као што су сирене, светлосни аларми, тихи аларми, дојаве преко комуникационих канала (нпр. телефоном). Применом пројектног обрасца &#039;&#039;Mediator&#039;&#039; конципирати описани део система и имплеметирати основни механизам активирања аларма када неки сензор сигнализира своју активацију.&lt;br /&gt;
&lt;br /&gt;
== 3. задатак ==&lt;br /&gt;
Негативна појава која настаје због неадекватне примене развоја софтвера помоћу модела, а која се испољава као осећај нелагоде током раних фаза развоја и преовлађује став програмера да су документи са захтевима и пројектни модели само документација и уверење да &amp;quot;прави посао&amp;quot; није почео док се није почеко са писањем програмског кода, назива се &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;синдром журбе ка кодовању&amp;lt;/span&amp;gt; (енгл. &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;rush to code syndrom&amp;lt;/span&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
== 4. задатак ==&lt;br /&gt;
Приказати УМЛ дијаграм класа за следећи опис дела концептуалног модела. Фолдер може садржати фајлове и друге фолдере. Фајл не може садржати фајлове ни фолдере. Фајл или фолдер може бити садржан у највише једном фолдеру. Фајл или фолдер се може копирати у неки други фолдер. Фолдер се копира тако што се рекурзивно копирају сви његови елементи, док се фајл копира тако што се копира цео његов бинарни садржај. Када се бртише&amp;lt;sup&amp;gt;sip&amp;lt;/sup&amp;gt; фајл&amp;lt;sup&amp;gt;sip&amp;lt;/sup&amp;gt;, бришу се и сви његови елементи, рекурзивно.&lt;br /&gt;
&lt;br /&gt;
== 5. задатак ==&lt;br /&gt;
Приказати део шеме релационе базе (табеле, њихове колоне, примарне и стране кључеве) за следећи део концептуалног модела.&lt;br /&gt;
[[Датотека:PS-oktobar-2-2025-zadatak-5.png|оквир|центар|Слика уз поставку петог задатка]]&lt;br /&gt;
&lt;br /&gt;
== 6. задатак ==&lt;br /&gt;
Ако имате потребу да неки скуп ентитета, који је моделован класом, специјализујете у различите хијерархије према различитим аспектима тј. критеријумима специјализације, користићете концепт језика УМЛ који се назива &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;скуповима генерализације&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== 7. задатак ==&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;
# &amp;lt;span class=&amp;quot;solution&amp;quot;&amp;gt;колаборацију&amp;lt;/span&amp;gt;&lt;br /&gt;
# случај употребе&lt;br /&gt;
# ништа од наведеног&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
[[Датотека:PS-oktobar-2-2025-zadatak-7.png|оквир|центар|Слика уз задатака 7]]&lt;br /&gt;
&lt;br /&gt;
== 8. задатак ==&lt;br /&gt;
За дати дијаграм интеракције и догађаје које он спецификује, а који су означени &amp;quot;балончићима&amp;quot; (нису део дијаграма), написати све дозвољене секвенце тих догађаја које овај модел дозвољава (али највише три такве секвенце, ако их има више).&lt;br /&gt;
[[Датотека:PS-oktobar-2-2025-zadatak-8.PNG|оквир|центар|Слика уз поставку осмог задатка]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;За потребе решења на wiki, балончиће одвојити зарезом и једним знаком разамака, а секвенце симболом тачка зарез.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Решење: &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;x1, x2, y1, y2, z1, z2, y3, y4, y5, y6, z3, z4, y7, y8, x3, x4&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 9. задатак ==&lt;br /&gt;
Да ли порт у власништву енкапсулиране класе мора бити део њеног интерфејса? Образложити.&lt;br /&gt;
&lt;br /&gt;
== 10. задатак ==&lt;br /&gt;
Концепт који спецификује скуп акција које обавља субјекат, уз могуће варијације, које воде ка видљивом резултату од вредности за актера и друге заинтересоване стране, назива се &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;случај употребе&amp;lt;/span&amp;gt; (енгл. &amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;text&amp;quot;&amp;gt;use case&amp;lt;/span&amp;gt;) и користи се за моделовање интерне структуре/споља видљиво понашање система (прецртати непотребно).&lt;br /&gt;
&amp;lt;span class=&amp;quot;spoiler&amp;quot; data-solution=&amp;quot;explanation&amp;quot;&amp;gt;Треба прецртати интерне структуре.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:Пројектовање софтвера]]&lt;/div&gt;</summary>
		<author><name>Aleksa</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:PS_K2_2024_pocetno_stanje.svg&amp;diff=8216</id>
		<title>Датотека:PS K2 2024 pocetno stanje.svg</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%94%D0%B0%D1%82%D0%BE%D1%82%D0%B5%D0%BA%D0%B0:PS_K2_2024_pocetno_stanje.svg&amp;diff=8216"/>
		<updated>2025-12-13T22:37:42Z</updated>

		<summary type="html">&lt;p&gt;Aleksa: Нова страница: {{file | description =  | author      = PS predmetni nastavnici | source      = https://ps.etf.bg.ac.rs/rokovi/PS_K2_2024.zip }}&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{file&lt;br /&gt;
| description = &lt;br /&gt;
| author      = PS predmetni nastavnici&lt;br /&gt;
| source      = https://ps.etf.bg.ac.rs/rokovi/PS_K2_2024.zip&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Aleksa</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9F%D1%80%D0%BE%D1%98%D0%B5%D0%BA%D1%82%D0%BE%D0%B2%D0%B0%D1%9A%D0%B5_%D1%81%D0%BE%D1%84%D1%82%D0%B2%D0%B5%D1%80%D0%B0/%D0%9A2_2024&amp;diff=8214</id>
		<title>Пројектовање софтвера/К2 2024</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9F%D1%80%D0%BE%D1%98%D0%B5%D0%BA%D1%82%D0%BE%D0%B2%D0%B0%D1%9A%D0%B5_%D1%81%D0%BE%D1%84%D1%82%D0%B2%D0%B5%D1%80%D0%B0/%D0%9A2_2024&amp;diff=8214"/>
		<updated>2025-12-13T21:54:52Z</updated>

		<summary type="html">&lt;p&gt;Aleksa: УМЛ дијаграм почетног стања&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&#039;&#039;&#039;Други колоквијум 2024. године&#039;&#039;&#039; одржан је 1. децембра 2024. године. Биле су доступне презентације са вежби, као и УМЛ презентације професора Тартаље. Време за израду је било 120 минута.&lt;br /&gt;
&lt;br /&gt;
== Поставка ==&lt;br /&gt;
Информациони систем фиктивне медицинске куће “ПС медик” документован је у оквиру StarUML фајла lekari.mdj. Докторима се прате име и презиме и године стажа, а пацијентима име и презиме и јединствени здравствени идентификатор (ниска знакова која поштује унапред позната правила). Пацијенту се заказује преглед код неког од доктора, при чему се прате термин прегледа и ординација у којој се преглед обавља, као и статус прегледа (заказан, у току, одржан). Лековима се прати назив, произвођач, доза активне супстанце и може им се дохватити опис који се састоји од свих параметара лека.&lt;br /&gt;
&amp;lt;ol style=&amp;quot;list-style-type:lower-alpha&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Исправити грешке на дијаграму класа и документовати их у фајлу &#039;&#039;greske.docx&#039;&#039;. Начин документовања грешака је описан у том фајлу. &#039;&#039;&#039;Напомена:&#039;&#039;&#039; приказане класе поседују још операција, али оне нису од интереса у овој тачки и њихово недостајање не треба сматрати грешком. По потреби се операције могу додавати у оквиру осталих тачака.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Изменити модел и дијаграм класа тако да се омогући праћење стручне специјализације лекара (неке од њих су: радиолог, кардиолог, лекар опште праксе, остале нема потребе приказивати). Лекари обављају преглед другачије у зависности од специјализације. Сматрати да лекари увек имају тачно једну специјализацију и она им се не мења. Скуп генерализација и његова ограничења документовати помоћу &#039;&#039;StarUML&#039;&#039; елемента &#039;&#039;Text&#039;&#039; постављеног изнад генерализације &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Допунити дијаграм класа тако да се омогући праћење дијагноза које лекар прописује у оквиру прегледа. Дијагнози се прате текстуални назив болести и лекови који су преписани за ту дијагнозу, при чему неки лекови могу бити преписани на рецепт, а неки без рецепта.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Лекар опште праксе Михајло Михајловић је прегледао пацијента Луку Лукића у ординацији 4. У оквиру прегледа Луки је дијагностикован акутни ларингитис и на рецепт преписан “Хемомицин”, а препоручено му је и да користи “Фервекс” и “Стрепсилс”, који се купују без рецепта. На дијаграму објеката приказати стање система након прегледа. Атрибуте чије вредности нису познате не треба приказивати.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Захтев за састављање извештаја о прегледу који није завршен доводи до грешке. У случају да је преглед завршен, извештај се састоји од имена и презимена и јединственог здравственог идентификатора пацијента, имена и презимена лекара, као и описа дијагноза формираних у току прегледа. Опис дијагнозе састоји се од назива дијагностиковане болести, описа лекова који су преписани без рецепта и описа лекова који су преписани на рецепт. Направити дијаграм секвенце који приказује састављање извештаја о прегледу, разрађен до нивоа састављања описа лека (не треба приказивати како се реализује састављање описа лека) и по потреби допунити дијаграм класа да би обављање сценарија било изводиво.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Датотека:PS K2 2024 pocetno stanje.svg|оквир|центар|Почетно стањер]]&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:Пројектовање софтвера]]&lt;/div&gt;</summary>
		<author><name>Aleksa</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9F%D1%80%D0%BE%D1%98%D0%B5%D0%BA%D1%82%D0%BE%D0%B2%D0%B0%D1%9A%D0%B5_%D1%81%D0%BE%D1%84%D1%82%D0%B2%D0%B5%D1%80%D0%B0/%D0%9A2_2024&amp;diff=8212</id>
		<title>Пројектовање софтвера/К2 2024</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9F%D1%80%D0%BE%D1%98%D0%B5%D0%BA%D1%82%D0%BE%D0%B2%D0%B0%D1%9A%D0%B5_%D1%81%D0%BE%D1%84%D1%82%D0%B2%D0%B5%D1%80%D0%B0/%D0%9A2_2024&amp;diff=8212"/>
		<updated>2025-12-13T21:46:53Z</updated>

		<summary type="html">&lt;p&gt;Aleksa: Нова страница: {{tocright}} &amp;#039;&amp;#039;&amp;#039;Други колоквијум 2024. године&amp;#039;&amp;#039;&amp;#039; одржан је 1. децембра 2024. године. Биле су доступне презентације са вежби, као и УМЛ презентације професора Тартаље. Време за израду је било 120 минута.  == Поставка == Информациони систем фиктивне медицинске куће “ПС медик…&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&#039;&#039;&#039;Други колоквијум 2024. године&#039;&#039;&#039; одржан је 1. децембра 2024. године. Биле су доступне презентације са вежби, као и УМЛ презентације професора Тартаље. Време за израду је било 120 минута.&lt;br /&gt;
&lt;br /&gt;
== Поставка ==&lt;br /&gt;
Информациони систем фиктивне медицинске куће “ПС медик” документован је у оквиру StarUML фајла lekari.mdj. Докторима се прате име и презиме и године стажа, а пацијентима име и презиме и јединствени здравствени идентификатор (ниска знакова која поштује унапред позната правила). Пацијенту се заказује преглед код неког од доктора, при чему се прате термин прегледа и ординација у којој се преглед обавља, као и статус прегледа (заказан, у току, одржан). Лековима се прати назив, произвођач, доза активне супстанце и може им се дохватити опис који се састоји од свих параметара лека.&lt;br /&gt;
&amp;lt;ol style=&amp;quot;list-style-type:lower-alpha&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Исправити грешке на дијаграму класа и документовати их у фајлу &#039;&#039;greske.docx&#039;&#039;. Начин документовања грешака је описан у том фајлу. &#039;&#039;&#039;Напомена:&#039;&#039;&#039; приказане класе поседују још операција, али оне нису од интереса у овој тачки и њихово недостајање не треба сматрати грешком. По потреби се операције могу додавати у оквиру осталих тачака.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Изменити модел и дијаграм класа тако да се омогући праћење стручне специјализације лекара (неке од њих су: радиолог, кардиолог, лекар опште праксе, остале нема потребе приказивати). Лекари обављају преглед другачије у зависности од специјализације. Сматрати да лекари увек имају тачно једну специјализацију и она им се не мења. Скуп генерализација и његова ограничења документовати помоћу &#039;&#039;StarUML&#039;&#039; елемента &#039;&#039;Text&#039;&#039; постављеног изнад генерализације &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Допунити дијаграм класа тако да се омогући праћење дијагноза које лекар прописује у оквиру прегледа. Дијагнози се прате текстуални назив болести и лекови који су преписани за ту дијагнозу, при чему неки лекови могу бити преписани на рецепт, а неки без рецепта.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Лекар опште праксе Михајло Михајловић је прегледао пацијента Луку Лукића у ординацији 4. У оквиру прегледа Луки је дијагностикован акутни ларингитис и на рецепт преписан “Хемомицин”, а препоручено му је и да користи “Фервекс” и “Стрепсилс”, који се купују без рецепта. На дијаграму објеката приказати стање система након прегледа. Атрибуте чије вредности нису познате не треба приказивати.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Захтев за састављање извештаја о прегледу који није завршен доводи до грешке. У случају да је преглед завршен, извештај се састоји од имена и презимена и јединственог здравственог идентификатора пацијента, имена и презимена лекара, као и описа дијагноза формираних у току прегледа. Опис дијагнозе састоји се од назива дијагностиковане болести, описа лекова који су преписани без рецепта и описа лекова који су преписани на рецепт. Направити дијаграм секвенце који приказује састављање извештаја о прегледу, разрађен до нивоа састављања описа лека (не треба приказивати како се реализује састављање описа лека) и по потреби допунити дијаграм класа да би обављање сценарија било изводиво.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:Пројектовање софтвера]]&lt;/div&gt;</summary>
		<author><name>Aleksa</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9F%D1%80%D0%BE%D1%98%D0%B5%D0%BA%D1%82%D0%BE%D0%B2%D0%B0%D1%9A%D0%B5_%D1%81%D0%BE%D1%84%D1%82%D0%B2%D0%B5%D1%80%D0%B0/%D0%9A1_2024&amp;diff=8189</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%D1%98%D0%B5%D0%BA%D1%82%D0%BE%D0%B2%D0%B0%D1%9A%D0%B5_%D1%81%D0%BE%D1%84%D1%82%D0%B2%D0%B5%D1%80%D0%B0/%D0%9A1_2024&amp;diff=8189"/>
		<updated>2025-12-01T23:36:23Z</updated>

		<summary type="html">&lt;p&gt;Aleksa: /* Сарадња */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&#039;&#039;&#039;Први колоквијум 2024. године&#039;&#039;&#039; одржан је 27. октобра 2024. године. Биле су доступне презентације о свим пројектним обрасцима, као и &#039;&#039;Java&#039;&#039; документација. Време за израду је било 120 минута.&lt;br /&gt;
&lt;br /&gt;
== 1. задатак ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Посматра се систем за приказ и обраду дигиталних слика. Треба обезбедити то да се на оригиналну слику може применити произвољан број филтера (или ниједан), у произвољном редоследу, при чему остатак система који приказује и користи слику (“клијент”) не треба да види разлику у односу на то да ли су на слику примењени филтери или нису. Свака слика садржи низ пиксела. Пиксел има R, G и B компоненте (интензитет црвене, зелене и плаве боје), где свака има целобројну вредност од 0 до 255. Филтери који могу да се примене у овом систему су за сада (касније могу бити осмишљени и додати нови филтери):&lt;br /&gt;
* &#039;&#039;Greyscale&#039;&#039; – сваки пиксел се претвара у одговарајућу нијансу сиве, где се R, G и B компоненте рачунају по следећој формули: &amp;lt;code&amp;gt;R, G, B = 0.3 * R + 0.59 * G + 0.11 * B&amp;lt;/code&amp;gt;&lt;br /&gt;
* &#039;&#039;Invert&#039;&#039; – R, G и B компоненте сваког пиксела се инвертују по следећој формули: &amp;lt;code&amp;gt;R = 255 – R, G = 255 – G, B = 255 – B&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Клијент који користи слику може да прочита вредности њених пиксела; уколико су на слику примењени филтери, то су вредности пиксела оригиналне слике измењене дејством додатих филтера (у случају да ниједан филтер није примењен над оригиналном сликом, враћа се неизмењен низ пиксела оригиналне слике). Коришћењем пројектног обрасца Декоратер (Decorator) потребно је имплементирати описани део система и навести расподелу улога из обрасца класама у овом решењу; опис дати у текстуалном фајлу z1.txt. &lt;br /&gt;
&lt;br /&gt;
Написати пример коришћења дате сарадње. Направити слику са филтерима Greyscale и Invert, са неким насумичним вредностима пиксела, а затим дохватити пикселе такве слике и исписати их. Имплементација пиксела приказана је у следећој класи:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package zad1;&lt;br /&gt;
&lt;br /&gt;
public class Pixel {&lt;br /&gt;
    private int R, G, B;&lt;br /&gt;
&lt;br /&gt;
    public Pixel(int R, int G, int B) {&lt;br /&gt;
        this.R = R;&lt;br /&gt;
        this.G = G;&lt;br /&gt;
        this.B = B;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public int getR() {&lt;br /&gt;
        return R;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void setR(int R) {&lt;br /&gt;
        this.R = R;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public int getG() {&lt;br /&gt;
        return G;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void setG(int G) {&lt;br /&gt;
        this.G = G;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public int getB() {&lt;br /&gt;
        return B;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void setB(int B) {&lt;br /&gt;
        this.B = B;&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;
У овом задатку потребно је користити узорак Декоратер, а у изради се користио и узорак Шаблонски метод.&lt;br /&gt;
&lt;br /&gt;
; Декоратер&lt;br /&gt;
: Учесници:&lt;br /&gt;
:* Компонента (Image)&lt;br /&gt;
:* Субјекат (RawImage)&lt;br /&gt;
:* Допуна (Filter)&lt;br /&gt;
:* КонкретнаДопуна (Greyscale, Inverse)&lt;br /&gt;
; Шаблонски метод&lt;br /&gt;
: Учесници:&lt;br /&gt;
:* АпстрактнаКласа (Filter)&lt;br /&gt;
:* КонкретнаКласа (Greyscale, Inverse)&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;Image.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package z1;&lt;br /&gt;
&lt;br /&gt;
import java.util.List;&lt;br /&gt;
&lt;br /&gt;
public interface Image {&lt;br /&gt;
    public List&amp;lt;Pixel&amp;gt; getPixels();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;RawImage.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package z1;&lt;br /&gt;
&lt;br /&gt;
import java.util.ArrayList;&lt;br /&gt;
import java.util.List;&lt;br /&gt;
&lt;br /&gt;
public class RawImage implements Image {&lt;br /&gt;
    protected List&amp;lt;Pixel&amp;gt; pixels = new ArrayList&amp;lt;Pixel&amp;gt;();&lt;br /&gt;
&lt;br /&gt;
    public RawImage(List&amp;lt;Pixel&amp;gt; pixels) {&lt;br /&gt;
        this.pixels = pixels;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public List&amp;lt;Pixel&amp;gt; getPixels() {&lt;br /&gt;
        return pixels;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;Filter.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package z1;&lt;br /&gt;
&lt;br /&gt;
import java.util.ArrayList;&lt;br /&gt;
import java.util.List;&lt;br /&gt;
&lt;br /&gt;
public abstract class Filter implements Image{&lt;br /&gt;
    private Image image; //image that we wrap/decorate&lt;br /&gt;
&lt;br /&gt;
    public Filter(Image image){&lt;br /&gt;
        this.image = image;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    protected abstract Pixel modifyPixel(Pixel p);&lt;br /&gt;
&lt;br /&gt;
    private List&amp;lt;Pixel&amp;gt; applyFilter(List&amp;lt;Pixel&amp;gt; pixels){&lt;br /&gt;
        List&amp;lt;Pixel&amp;gt; modifiedPixels = new ArrayList&amp;lt;Pixel&amp;gt;();&lt;br /&gt;
        for (Pixel pixel : pixels){&lt;br /&gt;
            modifiedPixels.add(modifyPixel(pixel));&lt;br /&gt;
        }&lt;br /&gt;
        return modifiedPixels;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public List&amp;lt;Pixel&amp;gt; getPixels() {&lt;br /&gt;
        return applyFilter(this.image.getPixels());&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;Greyscale.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package z1;&lt;br /&gt;
&lt;br /&gt;
public class Greyscale extends Filter{&lt;br /&gt;
    public Greyscale(Image i) {&lt;br /&gt;
        super(i);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    protected Pixel modifyPixel(Pixel p){&lt;br /&gt;
        int grey = (int) (p.getR()*0.3) +  (int) (p.getG()*0.59) + (int) (p.getB()*0.11);&lt;br /&gt;
        return new Pixel(grey, grey, grey&lt;br /&gt;
        );&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;Invert.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package z1;&lt;br /&gt;
&lt;br /&gt;
public class Invert extends Filter {&lt;br /&gt;
    public Invert(Image i) {&lt;br /&gt;
        super(i);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private final int invertFactor = 255;&lt;br /&gt;
&lt;br /&gt;
    protected Pixel modifyPixel(Pixel p) {&lt;br /&gt;
        return new Pixel(&lt;br /&gt;
                invertFactor - p.getR(),&lt;br /&gt;
                invertFactor - p.getG(),&lt;br /&gt;
                invertFactor - p.getB()&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;
==== &amp;lt;code&amp;gt;Main.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package z1;&lt;br /&gt;
&lt;br /&gt;
import java.util.Arrays;&lt;br /&gt;
import java.util.List;&lt;br /&gt;
&lt;br /&gt;
public class Main {&lt;br /&gt;
&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        List&amp;lt;Pixel&amp;gt; pixels = Arrays.asList(new Pixel(2, 2, 2), new Pixel(2, 3, 4), new Pixel(100, 200, 255));&lt;br /&gt;
        Image myImage = new RawImage(pixels);&lt;br /&gt;
        for (Pixel p : myImage.getPixels()) {&lt;br /&gt;
            System.out.println(p.toString());&lt;br /&gt;
        }&lt;br /&gt;
        Image myFilteredImage = new Invert(new Greyscale(myImage));&lt;br /&gt;
        for  (Pixel p : myFilteredImage.getPixels()) {&lt;br /&gt;
            System.out.println(p.toString());&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;
Посматра се део система који симулира карташку игру. Пре почетка игре, играчи могу да се пријаве делиоцу карата („крупијеу“) за учествовање у игри и могу да се одјаве након завршене игре. Игра се игра тако да у њој може учествовати различит број играча и током игре играчи не разговарају један са другим. Број играча је увек довољно мали да је са њима прихватљива синхрона комуникација. Након што се игра покрене, сваки играч од крупијеа добија по две насумичне карте (којих је само он свестан). Потом крупије открива једну од преосталих карата и сви играчи се обавештавају о карти која је откривена. На основу ових информација, сваки играч може да одлучи колико ће новца уложити. Неки играчи играју агресивно, а неки штедљиво; начин играња може да се конфигурише за сваког играча различито, при чему се предвиђа осмишљавање нових различитих начина игре, па различити играчи са истим информацијама улажу различиту количину новца. Након што сви играчи уложе свој новац, следи поново откривање нове карте око које се играчи обавештавају и након чега сваки може поново да уложи новац. Ово се понавља пет пута по игри, на крају чега играч са најбољом комбинацијом карата добија сав новац и игра се завршава. Логика одабира победника се такође може мењати од игре до игре, мада конкретна имплементација ове логике није од интереса за овај задатак.&lt;br /&gt;
&lt;br /&gt;
Дорадити и исправити дату имплементацију система коришћењем одговарајућих пројектних образаца. Навести све примене пројектних образаца у систему са кратким образложењем у текстуалном фајлу z2.txt (једна до две реченице).&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
==== Сарадња ====&lt;br /&gt;
У овом задатку су искоришћени узорци Уникат, Посматрач и Стратегија.&lt;br /&gt;
&lt;br /&gt;
; Уникат&lt;br /&gt;
: Учесници:&lt;br /&gt;
:* Уникат (Croupier)&lt;br /&gt;
; Посматрач&lt;br /&gt;
: Учесници:&lt;br /&gt;
:* КонкретанСубјекат (Croupier)&lt;br /&gt;
:* КонкретанПосматрач (Player)&lt;br /&gt;
:* С обзиром на то да се Крупије ослања на познавање Играча, звањем методе за постављање &amp;quot;руке&amp;quot;, изабран је нешто запрљанији приступ овог обрасца, тј. да је ово засновано на Посматрачу.&lt;br /&gt;
; Стратегија:&lt;br /&gt;
: Учесници:&lt;br /&gt;
:* Контекст (Player)&lt;br /&gt;
:* Стратегија (PlayingStrategy)&lt;br /&gt;
:* КонкретнаСтратегија (AggresiveStrategy, ScroogeStrategy)&lt;br /&gt;
&lt;br /&gt;
С обзиром на то да ће реалистично играчи стратегије заснивати на основу конкретних карата, сваки пут ће стратегија анализирати све карте на столу. У реалној имплементацији система, вероватно је скупо сваки пут довлачити све карте (крупије вероватно не би био на нашем рачунару), оптималније је чувати све карте код себе.&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;Card.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package z2;&lt;br /&gt;
&lt;br /&gt;
public class Card {&lt;br /&gt;
&lt;br /&gt;
    public enum CardSuit {DIAMOND, CLUB, HEART, SPADE};&lt;br /&gt;
    public static final int NUMBER_OF_CARDS = 14;&lt;br /&gt;
    public static final int NUMBER_OF_SUITS = 4;&lt;br /&gt;
    private int number;&lt;br /&gt;
    private CardSuit cardSuit;&lt;br /&gt;
&lt;br /&gt;
    public int getNumber() {&lt;br /&gt;
        return number;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void setNumber(int number) {&lt;br /&gt;
        this.number = number;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public CardSuit getCardSuit() {&lt;br /&gt;
        return cardSuit;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void setCardSuit(CardSuit cardSuit) {&lt;br /&gt;
        this.cardSuit = cardSuit;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public Card(int number, int cardSuitIndex) {&lt;br /&gt;
        this.number = number;&lt;br /&gt;
        this.cardSuit = CardSuit.values()[cardSuitIndex];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;PlayingStrategy.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package z2;&lt;br /&gt;
&lt;br /&gt;
import java.util.List;&lt;br /&gt;
&lt;br /&gt;
public abstract class PlayingStrategy {&lt;br /&gt;
    public abstract double playAMove(Card[] myCards, List&amp;lt;Card&amp;gt; tableCards);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;ScroogeStrategy.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package z2;&lt;br /&gt;
&lt;br /&gt;
import java.util.List;&lt;br /&gt;
&lt;br /&gt;
public class ScroogeStrategy extends PlayingStrategy {&lt;br /&gt;
    @Override&lt;br /&gt;
    public double playAMove(Card[] cardsInHand, List&amp;lt;Card&amp;gt; tableCards) {&lt;br /&gt;
        double bettingMoney;&lt;br /&gt;
        int numCardsOnTable = tableCards.size();&lt;br /&gt;
        bettingMoney = numCardsOnTable * 0.2 + cardsInHand.length * 0.1;&lt;br /&gt;
        return bettingMoney;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;AggresiveStrategy.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package z2;&lt;br /&gt;
&lt;br /&gt;
import java.util.List;&lt;br /&gt;
&lt;br /&gt;
public class AggresiveStrategy extends PlayingStrategy {&lt;br /&gt;
    @Override&lt;br /&gt;
    public double playAMove(Card[] cardsInHand, List&amp;lt;Card&amp;gt; tableCards) {&lt;br /&gt;
        double bettingMoney;&lt;br /&gt;
        int numCardsOnTable = tableCards.size();&lt;br /&gt;
        bettingMoney = numCardsOnTable * 0.5 + cardsInHand.length * 0.3;&lt;br /&gt;
        return bettingMoney;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;Croupier.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package z2;&lt;br /&gt;
&lt;br /&gt;
import java.util.ArrayList;&lt;br /&gt;
import java.util.List;&lt;br /&gt;
import java.util.Random;&lt;br /&gt;
&lt;br /&gt;
import static z2.Card.*;&lt;br /&gt;
&lt;br /&gt;
public class Croupier {&lt;br /&gt;
&lt;br /&gt;
    private static final int NUMBER_OF_TURNS = 5;&lt;br /&gt;
    private boolean isGameInProgress = false;&lt;br /&gt;
&lt;br /&gt;
    private Random randomGenerator = new Random();&lt;br /&gt;
    private List&amp;lt;Player&amp;gt; playersInGame = new ArrayList&amp;lt;&amp;gt;();&lt;br /&gt;
    private List&amp;lt;Card&amp;gt; cardsOnTable = new ArrayList&amp;lt;&amp;gt;();&lt;br /&gt;
&lt;br /&gt;
    private double moneyPot = 0;&lt;br /&gt;
&lt;br /&gt;
    private Croupier() {}&lt;br /&gt;
&lt;br /&gt;
    private volatile static Croupier instance = null;&lt;br /&gt;
&lt;br /&gt;
    public static Croupier getInstance() {&lt;br /&gt;
        //Thread safe variant with minimal critical section&lt;br /&gt;
        if (instance == null) {&lt;br /&gt;
            synchronized (Croupier.class) {&lt;br /&gt;
                if (instance == null) {&lt;br /&gt;
                    instance = new Croupier();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        return instance;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* join and leave are subscription methods for concrete subject in Observer */&lt;br /&gt;
    public void join(Player player) {&lt;br /&gt;
        if(!isGameInProgress) {&lt;br /&gt;
            this.playersInGame.add(player);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void leave(Player player) {&lt;br /&gt;
        if(!isGameInProgress) {&lt;br /&gt;
            this.playersInGame.remove(player);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public List&amp;lt;Card&amp;gt; getTable(){&lt;br /&gt;
        return cardsOnTable;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void simulateGame() {&lt;br /&gt;
        isGameInProgress = true;&lt;br /&gt;
        for (Player player: playersInGame) {&lt;br /&gt;
            player.setCardsInHand(&lt;br /&gt;
                    new Card[]{&lt;br /&gt;
                            drawCardFromDeck(),&lt;br /&gt;
                            drawCardFromDeck()&lt;br /&gt;
                    }&lt;br /&gt;
            );&lt;br /&gt;
        }&lt;br /&gt;
        cardsOnTable.clear();&lt;br /&gt;
        moneyPot = 0;&lt;br /&gt;
        for(int i = 0; i &amp;lt; NUMBER_OF_TURNS; i++) {&lt;br /&gt;
            Card newCard = drawCardFromDeck();&lt;br /&gt;
            cardsOnTable.add(newCard);&lt;br /&gt;
            for(Player player: playersInGame) {&lt;br /&gt;
                moneyPot += player.update(newCard);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        Player player = defineWinner();&lt;br /&gt;
        player.addMoney(moneyPot);&lt;br /&gt;
        System.out.println(&lt;br /&gt;
                &amp;quot;Winning player with ID: &amp;quot; + player.getPlayer_id() +&lt;br /&gt;
                &amp;quot;, currently has: &amp;quot; + player.getMoney());&lt;br /&gt;
        isGameInProgress = false;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private Player defineWinner() {&lt;br /&gt;
        // TODO: Should be a few declaring winner tactics, not currently important.&lt;br /&gt;
        return playersInGame.get(randomGenerator.nextInt(playersInGame.size()));&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private Card drawCardFromDeck() {&lt;br /&gt;
        return new Card(&lt;br /&gt;
                randomGenerator.nextInt(NUMBER_OF_CARDS),&lt;br /&gt;
                randomGenerator.nextInt(NUMBER_OF_SUITS)&lt;br /&gt;
        );&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;Player.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package z2;&lt;br /&gt;
&lt;br /&gt;
import java.util.ArrayList;&lt;br /&gt;
import java.util.List;&lt;br /&gt;
&lt;br /&gt;
public class Player {&lt;br /&gt;
    private Croupier croupier;&lt;br /&gt;
    private PlayingStrategy playingStrategy;&lt;br /&gt;
    public Player(Croupier c, PlayingStrategy playingStrategy) {&lt;br /&gt;
        croupier = c;&lt;br /&gt;
        this.playingStrategy = playingStrategy;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private static final double STARTING_MONEY = 10;&lt;br /&gt;
    private Card cardsInHand[];&lt;br /&gt;
    private double money = STARTING_MONEY;&lt;br /&gt;
    private boolean aggressive = true;&lt;br /&gt;
    private static int ID = 0;&lt;br /&gt;
    private int player_id = ID++;&lt;br /&gt;
&lt;br /&gt;
    private List&amp;lt;Card&amp;gt; tableCards = new ArrayList&amp;lt;Card&amp;gt;();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    public int getPlayer_id() {&lt;br /&gt;
        return player_id;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public Card[] getCardsInHand() {&lt;br /&gt;
        return cardsInHand;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void setCardsInHand(Card[] cardsInHand) {&lt;br /&gt;
        this.cardsInHand = cardsInHand;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public double getMoney() {&lt;br /&gt;
        return money;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void addMoney(double money) {&lt;br /&gt;
        this.money += money;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public boolean isAggressive() {&lt;br /&gt;
        return aggressive;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void setAggressive(boolean aggressive) {&lt;br /&gt;
        this.aggressive = aggressive;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public double update(Card newCard) {&lt;br /&gt;
        tableCards.add(newCard);&lt;br /&gt;
        double bettingMoney;&lt;br /&gt;
        bettingMoney = playingStrategy.playAMove(cardsInHand, tableCards);&lt;br /&gt;
        bettingMoney = bettingMoney &amp;gt; money ? money : bettingMoney;&lt;br /&gt;
        money -= bettingMoney;&lt;br /&gt;
        return bettingMoney;&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>Aleksa</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9F%D1%80%D0%BE%D1%98%D0%B5%D0%BA%D1%82%D0%BE%D0%B2%D0%B0%D1%9A%D0%B5_%D1%81%D0%BE%D1%84%D1%82%D0%B2%D0%B5%D1%80%D0%B0/%D0%9A1_2024&amp;diff=8188</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%D1%98%D0%B5%D0%BA%D1%82%D0%BE%D0%B2%D0%B0%D1%9A%D0%B5_%D1%81%D0%BE%D1%84%D1%82%D0%B2%D0%B5%D1%80%D0%B0/%D0%9A1_2024&amp;diff=8188"/>
		<updated>2025-12-01T23:24:18Z</updated>

		<summary type="html">&lt;p&gt;Aleksa: /* 2. задатак */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&#039;&#039;&#039;Први колоквијум 2024. године&#039;&#039;&#039; одржан је 27. октобра 2024. године. Биле су доступне презентације о свим пројектним обрасцима, као и &#039;&#039;Java&#039;&#039; документација. Време за израду је било 120 минута.&lt;br /&gt;
&lt;br /&gt;
== 1. задатак ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Посматра се систем за приказ и обраду дигиталних слика. Треба обезбедити то да се на оригиналну слику може применити произвољан број филтера (или ниједан), у произвољном редоследу, при чему остатак система који приказује и користи слику (“клијент”) не треба да види разлику у односу на то да ли су на слику примењени филтери или нису. Свака слика садржи низ пиксела. Пиксел има R, G и B компоненте (интензитет црвене, зелене и плаве боје), где свака има целобројну вредност од 0 до 255. Филтери који могу да се примене у овом систему су за сада (касније могу бити осмишљени и додати нови филтери):&lt;br /&gt;
* &#039;&#039;Greyscale&#039;&#039; – сваки пиксел се претвара у одговарајућу нијансу сиве, где се R, G и B компоненте рачунају по следећој формули: &amp;lt;code&amp;gt;R, G, B = 0.3 * R + 0.59 * G + 0.11 * B&amp;lt;/code&amp;gt;&lt;br /&gt;
* &#039;&#039;Invert&#039;&#039; – R, G и B компоненте сваког пиксела се инвертују по следећој формули: &amp;lt;code&amp;gt;R = 255 – R, G = 255 – G, B = 255 – B&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Клијент који користи слику може да прочита вредности њених пиксела; уколико су на слику примењени филтери, то су вредности пиксела оригиналне слике измењене дејством додатих филтера (у случају да ниједан филтер није примењен над оригиналном сликом, враћа се неизмењен низ пиксела оригиналне слике). Коришћењем пројектног обрасца Декоратер (Decorator) потребно је имплементирати описани део система и навести расподелу улога из обрасца класама у овом решењу; опис дати у текстуалном фајлу z1.txt. &lt;br /&gt;
&lt;br /&gt;
Написати пример коришћења дате сарадње. Направити слику са филтерима Greyscale и Invert, са неким насумичним вредностима пиксела, а затим дохватити пикселе такве слике и исписати их. Имплементација пиксела приказана је у следећој класи:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package zad1;&lt;br /&gt;
&lt;br /&gt;
public class Pixel {&lt;br /&gt;
    private int R, G, B;&lt;br /&gt;
&lt;br /&gt;
    public Pixel(int R, int G, int B) {&lt;br /&gt;
        this.R = R;&lt;br /&gt;
        this.G = G;&lt;br /&gt;
        this.B = B;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public int getR() {&lt;br /&gt;
        return R;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void setR(int R) {&lt;br /&gt;
        this.R = R;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public int getG() {&lt;br /&gt;
        return G;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void setG(int G) {&lt;br /&gt;
        this.G = G;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public int getB() {&lt;br /&gt;
        return B;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void setB(int B) {&lt;br /&gt;
        this.B = B;&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;
У овом задатку потребно је користити узорак Декоратер, а у изради се користио и узорак Шаблонски метод.&lt;br /&gt;
&lt;br /&gt;
; Декоратер&lt;br /&gt;
: Учесници:&lt;br /&gt;
:* Компонента (Image)&lt;br /&gt;
:* Субјекат (RawImage)&lt;br /&gt;
:* Допуна (Filter)&lt;br /&gt;
:* КонкретнаДопуна (Greyscale, Inverse)&lt;br /&gt;
; Шаблонски метод&lt;br /&gt;
: Учесници:&lt;br /&gt;
:* АпстрактнаКласа (Filter)&lt;br /&gt;
:* КонкретнаКласа (Greyscale, Inverse)&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;Image.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package z1;&lt;br /&gt;
&lt;br /&gt;
import java.util.List;&lt;br /&gt;
&lt;br /&gt;
public interface Image {&lt;br /&gt;
    public List&amp;lt;Pixel&amp;gt; getPixels();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;RawImage.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package z1;&lt;br /&gt;
&lt;br /&gt;
import java.util.ArrayList;&lt;br /&gt;
import java.util.List;&lt;br /&gt;
&lt;br /&gt;
public class RawImage implements Image {&lt;br /&gt;
    protected List&amp;lt;Pixel&amp;gt; pixels = new ArrayList&amp;lt;Pixel&amp;gt;();&lt;br /&gt;
&lt;br /&gt;
    public RawImage(List&amp;lt;Pixel&amp;gt; pixels) {&lt;br /&gt;
        this.pixels = pixels;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public List&amp;lt;Pixel&amp;gt; getPixels() {&lt;br /&gt;
        return pixels;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;Filter.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package z1;&lt;br /&gt;
&lt;br /&gt;
import java.util.ArrayList;&lt;br /&gt;
import java.util.List;&lt;br /&gt;
&lt;br /&gt;
public abstract class Filter implements Image{&lt;br /&gt;
    private Image image; //image that we wrap/decorate&lt;br /&gt;
&lt;br /&gt;
    public Filter(Image image){&lt;br /&gt;
        this.image = image;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    protected abstract Pixel modifyPixel(Pixel p);&lt;br /&gt;
&lt;br /&gt;
    private List&amp;lt;Pixel&amp;gt; applyFilter(List&amp;lt;Pixel&amp;gt; pixels){&lt;br /&gt;
        List&amp;lt;Pixel&amp;gt; modifiedPixels = new ArrayList&amp;lt;Pixel&amp;gt;();&lt;br /&gt;
        for (Pixel pixel : pixels){&lt;br /&gt;
            modifiedPixels.add(modifyPixel(pixel));&lt;br /&gt;
        }&lt;br /&gt;
        return modifiedPixels;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public List&amp;lt;Pixel&amp;gt; getPixels() {&lt;br /&gt;
        return applyFilter(this.image.getPixels());&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;Greyscale.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package z1;&lt;br /&gt;
&lt;br /&gt;
public class Greyscale extends Filter{&lt;br /&gt;
    public Greyscale(Image i) {&lt;br /&gt;
        super(i);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    protected Pixel modifyPixel(Pixel p){&lt;br /&gt;
        int grey = (int) (p.getR()*0.3) +  (int) (p.getG()*0.59) + (int) (p.getB()*0.11);&lt;br /&gt;
        return new Pixel(grey, grey, grey&lt;br /&gt;
        );&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;Invert.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package z1;&lt;br /&gt;
&lt;br /&gt;
public class Invert extends Filter {&lt;br /&gt;
    public Invert(Image i) {&lt;br /&gt;
        super(i);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private final int invertFactor = 255;&lt;br /&gt;
&lt;br /&gt;
    protected Pixel modifyPixel(Pixel p) {&lt;br /&gt;
        return new Pixel(&lt;br /&gt;
                invertFactor - p.getR(),&lt;br /&gt;
                invertFactor - p.getG(),&lt;br /&gt;
                invertFactor - p.getB()&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;
==== &amp;lt;code&amp;gt;Main.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package z1;&lt;br /&gt;
&lt;br /&gt;
import java.util.Arrays;&lt;br /&gt;
import java.util.List;&lt;br /&gt;
&lt;br /&gt;
public class Main {&lt;br /&gt;
&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        List&amp;lt;Pixel&amp;gt; pixels = Arrays.asList(new Pixel(2, 2, 2), new Pixel(2, 3, 4), new Pixel(100, 200, 255));&lt;br /&gt;
        Image myImage = new RawImage(pixels);&lt;br /&gt;
        for (Pixel p : myImage.getPixels()) {&lt;br /&gt;
            System.out.println(p.toString());&lt;br /&gt;
        }&lt;br /&gt;
        Image myFilteredImage = new Invert(new Greyscale(myImage));&lt;br /&gt;
        for  (Pixel p : myFilteredImage.getPixels()) {&lt;br /&gt;
            System.out.println(p.toString());&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;
Посматра се део система који симулира карташку игру. Пре почетка игре, играчи могу да се пријаве делиоцу карата („крупијеу“) за учествовање у игри и могу да се одјаве након завршене игре. Игра се игра тако да у њој може учествовати различит број играча и током игре играчи не разговарају један са другим. Број играча је увек довољно мали да је са њима прихватљива синхрона комуникација. Након што се игра покрене, сваки играч од крупијеа добија по две насумичне карте (којих је само он свестан). Потом крупије открива једну од преосталих карата и сви играчи се обавештавају о карти која је откривена. На основу ових информација, сваки играч може да одлучи колико ће новца уложити. Неки играчи играју агресивно, а неки штедљиво; начин играња може да се конфигурише за сваког играча различито, при чему се предвиђа осмишљавање нових различитих начина игре, па различити играчи са истим информацијама улажу различиту количину новца. Након што сви играчи уложе свој новац, следи поново откривање нове карте око које се играчи обавештавају и након чега сваки може поново да уложи новац. Ово се понавља пет пута по игри, на крају чега играч са најбољом комбинацијом карата добија сав новац и игра се завршава. Логика одабира победника се такође може мењати од игре до игре, мада конкретна имплементација ове логике није од интереса за овај задатак.&lt;br /&gt;
&lt;br /&gt;
Дорадити и исправити дату имплементацију система коришћењем одговарајућих пројектних образаца. Навести све примене пројектних образаца у систему са кратким образложењем у текстуалном фајлу z2.txt (једна до две реченице).&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
==== Сарадња ====&lt;br /&gt;
У овом задатку су искоришћени узорци Уникат, Посматрач и Стратегија.&lt;br /&gt;
&lt;br /&gt;
; Уникат&lt;br /&gt;
: Учесници:&lt;br /&gt;
:* Уникат (Croupier)&lt;br /&gt;
; Посматрач&lt;br /&gt;
: Учесници:&lt;br /&gt;
:* КонкретанСубјекат (Croupier)&lt;br /&gt;
:* КонкретанПосматрач (Player)&lt;br /&gt;
:* С обзиром на то да се Крупије ослања на познавање Играча, звањем методе за постављање &amp;quot;руке&amp;quot;, изабран је нешто запрљанији приступ овог обрасца.&lt;br /&gt;
; Стратегија:&lt;br /&gt;
: Учесници:&lt;br /&gt;
:* Контекст (Player)&lt;br /&gt;
:* Стратегија (PlayingStrategy)&lt;br /&gt;
:* КонкретнаСтратегија (AggresiveStrategy, ScroogeStrategy)&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;Card.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package z2;&lt;br /&gt;
&lt;br /&gt;
public class Card {&lt;br /&gt;
&lt;br /&gt;
    public enum CardSuit {DIAMOND, CLUB, HEART, SPADE};&lt;br /&gt;
    public static final int NUMBER_OF_CARDS = 14;&lt;br /&gt;
    public static final int NUMBER_OF_SUITS = 4;&lt;br /&gt;
    private int number;&lt;br /&gt;
    private CardSuit cardSuit;&lt;br /&gt;
&lt;br /&gt;
    public int getNumber() {&lt;br /&gt;
        return number;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void setNumber(int number) {&lt;br /&gt;
        this.number = number;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public CardSuit getCardSuit() {&lt;br /&gt;
        return cardSuit;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void setCardSuit(CardSuit cardSuit) {&lt;br /&gt;
        this.cardSuit = cardSuit;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public Card(int number, int cardSuitIndex) {&lt;br /&gt;
        this.number = number;&lt;br /&gt;
        this.cardSuit = CardSuit.values()[cardSuitIndex];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;PlayingStrategy.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package z2;&lt;br /&gt;
&lt;br /&gt;
import java.util.List;&lt;br /&gt;
&lt;br /&gt;
public abstract class PlayingStrategy {&lt;br /&gt;
    public abstract double playAMove(Card[] myCards, List&amp;lt;Card&amp;gt; tableCards);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;ScroogeStrategy.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package z2;&lt;br /&gt;
&lt;br /&gt;
import java.util.List;&lt;br /&gt;
&lt;br /&gt;
public class ScroogeStrategy extends PlayingStrategy {&lt;br /&gt;
    @Override&lt;br /&gt;
    public double playAMove(Card[] cardsInHand, List&amp;lt;Card&amp;gt; tableCards) {&lt;br /&gt;
        double bettingMoney;&lt;br /&gt;
        int numCardsOnTable = tableCards.size();&lt;br /&gt;
        bettingMoney = numCardsOnTable * 0.2 + cardsInHand.length * 0.1;&lt;br /&gt;
        return bettingMoney;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;AggresiveStrategy.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package z2;&lt;br /&gt;
&lt;br /&gt;
import java.util.List;&lt;br /&gt;
&lt;br /&gt;
public class AggresiveStrategy extends PlayingStrategy {&lt;br /&gt;
    @Override&lt;br /&gt;
    public double playAMove(Card[] cardsInHand, List&amp;lt;Card&amp;gt; tableCards) {&lt;br /&gt;
        double bettingMoney;&lt;br /&gt;
        int numCardsOnTable = tableCards.size();&lt;br /&gt;
        bettingMoney = numCardsOnTable * 0.5 + cardsInHand.length * 0.3;&lt;br /&gt;
        return bettingMoney;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;Croupier.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package z2;&lt;br /&gt;
&lt;br /&gt;
import java.util.ArrayList;&lt;br /&gt;
import java.util.List;&lt;br /&gt;
import java.util.Random;&lt;br /&gt;
&lt;br /&gt;
import static z2.Card.*;&lt;br /&gt;
&lt;br /&gt;
public class Croupier {&lt;br /&gt;
&lt;br /&gt;
    private static final int NUMBER_OF_TURNS = 5;&lt;br /&gt;
    private boolean isGameInProgress = false;&lt;br /&gt;
&lt;br /&gt;
    private Random randomGenerator = new Random();&lt;br /&gt;
    private List&amp;lt;Player&amp;gt; playersInGame = new ArrayList&amp;lt;&amp;gt;();&lt;br /&gt;
    private List&amp;lt;Card&amp;gt; cardsOnTable = new ArrayList&amp;lt;&amp;gt;();&lt;br /&gt;
&lt;br /&gt;
    private double moneyPot = 0;&lt;br /&gt;
&lt;br /&gt;
    private Croupier() {}&lt;br /&gt;
&lt;br /&gt;
    private volatile static Croupier instance = null;&lt;br /&gt;
&lt;br /&gt;
    public static Croupier getInstance() {&lt;br /&gt;
        //Thread safe variant with minimal critical section&lt;br /&gt;
        if (instance == null) {&lt;br /&gt;
            synchronized (Croupier.class) {&lt;br /&gt;
                if (instance == null) {&lt;br /&gt;
                    instance = new Croupier();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        return instance;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* join and leave are subscription methods for concrete subject in Observer */&lt;br /&gt;
    public void join(Player player) {&lt;br /&gt;
        if(!isGameInProgress) {&lt;br /&gt;
            this.playersInGame.add(player);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void leave(Player player) {&lt;br /&gt;
        if(!isGameInProgress) {&lt;br /&gt;
            this.playersInGame.remove(player);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public List&amp;lt;Card&amp;gt; getTable(){&lt;br /&gt;
        return cardsOnTable;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void simulateGame() {&lt;br /&gt;
        isGameInProgress = true;&lt;br /&gt;
        for (Player player: playersInGame) {&lt;br /&gt;
            player.setCardsInHand(&lt;br /&gt;
                    new Card[]{&lt;br /&gt;
                            drawCardFromDeck(),&lt;br /&gt;
                            drawCardFromDeck()&lt;br /&gt;
                    }&lt;br /&gt;
            );&lt;br /&gt;
        }&lt;br /&gt;
        cardsOnTable.clear();&lt;br /&gt;
        moneyPot = 0;&lt;br /&gt;
        for(int i = 0; i &amp;lt; NUMBER_OF_TURNS; i++) {&lt;br /&gt;
            Card newCard = drawCardFromDeck();&lt;br /&gt;
            cardsOnTable.add(newCard);&lt;br /&gt;
            for(Player player: playersInGame) {&lt;br /&gt;
                moneyPot += player.update(newCard);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        Player player = defineWinner();&lt;br /&gt;
        player.addMoney(moneyPot);&lt;br /&gt;
        System.out.println(&lt;br /&gt;
                &amp;quot;Winning player with ID: &amp;quot; + player.getPlayer_id() +&lt;br /&gt;
                &amp;quot;, currently has: &amp;quot; + player.getMoney());&lt;br /&gt;
        isGameInProgress = false;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private Player defineWinner() {&lt;br /&gt;
        // TODO: Should be a few declaring winner tactics, not currently important.&lt;br /&gt;
        return playersInGame.get(randomGenerator.nextInt(playersInGame.size()));&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private Card drawCardFromDeck() {&lt;br /&gt;
        return new Card(&lt;br /&gt;
                randomGenerator.nextInt(NUMBER_OF_CARDS),&lt;br /&gt;
                randomGenerator.nextInt(NUMBER_OF_SUITS)&lt;br /&gt;
        );&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;Player.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package z2;&lt;br /&gt;
&lt;br /&gt;
import java.util.ArrayList;&lt;br /&gt;
import java.util.List;&lt;br /&gt;
&lt;br /&gt;
public class Player {&lt;br /&gt;
    private Croupier croupier;&lt;br /&gt;
    private PlayingStrategy playingStrategy;&lt;br /&gt;
    public Player(Croupier c, PlayingStrategy playingStrategy) {&lt;br /&gt;
        croupier = c;&lt;br /&gt;
        this.playingStrategy = playingStrategy;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private static final double STARTING_MONEY = 10;&lt;br /&gt;
    private Card cardsInHand[];&lt;br /&gt;
    private double money = STARTING_MONEY;&lt;br /&gt;
    private boolean aggressive = true;&lt;br /&gt;
    private static int ID = 0;&lt;br /&gt;
    private int player_id = ID++;&lt;br /&gt;
&lt;br /&gt;
    private List&amp;lt;Card&amp;gt; tableCards = new ArrayList&amp;lt;Card&amp;gt;();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    public int getPlayer_id() {&lt;br /&gt;
        return player_id;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public Card[] getCardsInHand() {&lt;br /&gt;
        return cardsInHand;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void setCardsInHand(Card[] cardsInHand) {&lt;br /&gt;
        this.cardsInHand = cardsInHand;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public double getMoney() {&lt;br /&gt;
        return money;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void addMoney(double money) {&lt;br /&gt;
        this.money += money;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public boolean isAggressive() {&lt;br /&gt;
        return aggressive;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void setAggressive(boolean aggressive) {&lt;br /&gt;
        this.aggressive = aggressive;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public double update(Card newCard) {&lt;br /&gt;
        tableCards.add(newCard);&lt;br /&gt;
        double bettingMoney;&lt;br /&gt;
        bettingMoney = playingStrategy.playAMove(cardsInHand, tableCards);&lt;br /&gt;
        bettingMoney = bettingMoney &amp;gt; money ? money : bettingMoney;&lt;br /&gt;
        money -= bettingMoney;&lt;br /&gt;
        return bettingMoney;&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>Aleksa</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9F%D1%80%D0%BE%D1%98%D0%B5%D0%BA%D1%82%D0%BE%D0%B2%D0%B0%D1%9A%D0%B5_%D1%81%D0%BE%D1%84%D1%82%D0%B2%D0%B5%D1%80%D0%B0/%D0%9A1_2024&amp;diff=8187</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%D1%98%D0%B5%D0%BA%D1%82%D0%BE%D0%B2%D0%B0%D1%9A%D0%B5_%D1%81%D0%BE%D1%84%D1%82%D0%B2%D0%B5%D1%80%D0%B0/%D0%9A1_2024&amp;diff=8187"/>
		<updated>2025-12-01T23:23:22Z</updated>

		<summary type="html">&lt;p&gt;Aleksa: Поништена измена бр. 8185 корисника Aleksa (разговор)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&#039;&#039;&#039;Први колоквијум 2024. године&#039;&#039;&#039; одржан је 27. октобра 2024. године. Биле су доступне презентације о свим пројектним обрасцима, као и &#039;&#039;Java&#039;&#039; документација. Време за израду је било 120 минута.&lt;br /&gt;
&lt;br /&gt;
== 1. задатак ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Посматра се систем за приказ и обраду дигиталних слика. Треба обезбедити то да се на оригиналну слику може применити произвољан број филтера (или ниједан), у произвољном редоследу, при чему остатак система који приказује и користи слику (“клијент”) не треба да види разлику у односу на то да ли су на слику примењени филтери или нису. Свака слика садржи низ пиксела. Пиксел има R, G и B компоненте (интензитет црвене, зелене и плаве боје), где свака има целобројну вредност од 0 до 255. Филтери који могу да се примене у овом систему су за сада (касније могу бити осмишљени и додати нови филтери):&lt;br /&gt;
* &#039;&#039;Greyscale&#039;&#039; – сваки пиксел се претвара у одговарајућу нијансу сиве, где се R, G и B компоненте рачунају по следећој формули: &amp;lt;code&amp;gt;R, G, B = 0.3 * R + 0.59 * G + 0.11 * B&amp;lt;/code&amp;gt;&lt;br /&gt;
* &#039;&#039;Invert&#039;&#039; – R, G и B компоненте сваког пиксела се инвертују по следећој формули: &amp;lt;code&amp;gt;R = 255 – R, G = 255 – G, B = 255 – B&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Клијент који користи слику може да прочита вредности њених пиксела; уколико су на слику примењени филтери, то су вредности пиксела оригиналне слике измењене дејством додатих филтера (у случају да ниједан филтер није примењен над оригиналном сликом, враћа се неизмењен низ пиксела оригиналне слике). Коришћењем пројектног обрасца Декоратер (Decorator) потребно је имплементирати описани део система и навести расподелу улога из обрасца класама у овом решењу; опис дати у текстуалном фајлу z1.txt. &lt;br /&gt;
&lt;br /&gt;
Написати пример коришћења дате сарадње. Направити слику са филтерима Greyscale и Invert, са неким насумичним вредностима пиксела, а затим дохватити пикселе такве слике и исписати их. Имплементација пиксела приказана је у следећој класи:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package zad1;&lt;br /&gt;
&lt;br /&gt;
public class Pixel {&lt;br /&gt;
    private int R, G, B;&lt;br /&gt;
&lt;br /&gt;
    public Pixel(int R, int G, int B) {&lt;br /&gt;
        this.R = R;&lt;br /&gt;
        this.G = G;&lt;br /&gt;
        this.B = B;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public int getR() {&lt;br /&gt;
        return R;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void setR(int R) {&lt;br /&gt;
        this.R = R;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public int getG() {&lt;br /&gt;
        return G;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void setG(int G) {&lt;br /&gt;
        this.G = G;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public int getB() {&lt;br /&gt;
        return B;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void setB(int B) {&lt;br /&gt;
        this.B = B;&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;
У овом задатку потребно је користити узорак Декоратер, а у изради се користио и узорак Шаблонски метод.&lt;br /&gt;
&lt;br /&gt;
; Декоратер&lt;br /&gt;
: Учесници:&lt;br /&gt;
:* Компонента (Image)&lt;br /&gt;
:* Субјекат (RawImage)&lt;br /&gt;
:* Допуна (Filter)&lt;br /&gt;
:* КонкретнаДопуна (Greyscale, Inverse)&lt;br /&gt;
; Шаблонски метод&lt;br /&gt;
: Учесници:&lt;br /&gt;
:* АпстрактнаКласа (Filter)&lt;br /&gt;
:* КонкретнаКласа (Greyscale, Inverse)&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;Image.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package z1;&lt;br /&gt;
&lt;br /&gt;
import java.util.List;&lt;br /&gt;
&lt;br /&gt;
public interface Image {&lt;br /&gt;
    public List&amp;lt;Pixel&amp;gt; getPixels();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;RawImage.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package z1;&lt;br /&gt;
&lt;br /&gt;
import java.util.ArrayList;&lt;br /&gt;
import java.util.List;&lt;br /&gt;
&lt;br /&gt;
public class RawImage implements Image {&lt;br /&gt;
    protected List&amp;lt;Pixel&amp;gt; pixels = new ArrayList&amp;lt;Pixel&amp;gt;();&lt;br /&gt;
&lt;br /&gt;
    public RawImage(List&amp;lt;Pixel&amp;gt; pixels) {&lt;br /&gt;
        this.pixels = pixels;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public List&amp;lt;Pixel&amp;gt; getPixels() {&lt;br /&gt;
        return pixels;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;Filter.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package z1;&lt;br /&gt;
&lt;br /&gt;
import java.util.ArrayList;&lt;br /&gt;
import java.util.List;&lt;br /&gt;
&lt;br /&gt;
public abstract class Filter implements Image{&lt;br /&gt;
    private Image image; //image that we wrap/decorate&lt;br /&gt;
&lt;br /&gt;
    public Filter(Image image){&lt;br /&gt;
        this.image = image;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    protected abstract Pixel modifyPixel(Pixel p);&lt;br /&gt;
&lt;br /&gt;
    private List&amp;lt;Pixel&amp;gt; applyFilter(List&amp;lt;Pixel&amp;gt; pixels){&lt;br /&gt;
        List&amp;lt;Pixel&amp;gt; modifiedPixels = new ArrayList&amp;lt;Pixel&amp;gt;();&lt;br /&gt;
        for (Pixel pixel : pixels){&lt;br /&gt;
            modifiedPixels.add(modifyPixel(pixel));&lt;br /&gt;
        }&lt;br /&gt;
        return modifiedPixels;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public List&amp;lt;Pixel&amp;gt; getPixels() {&lt;br /&gt;
        return applyFilter(this.image.getPixels());&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;Greyscale.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package z1;&lt;br /&gt;
&lt;br /&gt;
public class Greyscale extends Filter{&lt;br /&gt;
    public Greyscale(Image i) {&lt;br /&gt;
        super(i);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    protected Pixel modifyPixel(Pixel p){&lt;br /&gt;
        int grey = (int) (p.getR()*0.3) +  (int) (p.getG()*0.59) + (int) (p.getB()*0.11);&lt;br /&gt;
        return new Pixel(grey, grey, grey&lt;br /&gt;
        );&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;Invert.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package z1;&lt;br /&gt;
&lt;br /&gt;
public class Invert extends Filter {&lt;br /&gt;
    public Invert(Image i) {&lt;br /&gt;
        super(i);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private final int invertFactor = 255;&lt;br /&gt;
&lt;br /&gt;
    protected Pixel modifyPixel(Pixel p) {&lt;br /&gt;
        return new Pixel(&lt;br /&gt;
                invertFactor - p.getR(),&lt;br /&gt;
                invertFactor - p.getG(),&lt;br /&gt;
                invertFactor - p.getB()&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;
==== &amp;lt;code&amp;gt;Main.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package z1;&lt;br /&gt;
&lt;br /&gt;
import java.util.Arrays;&lt;br /&gt;
import java.util.List;&lt;br /&gt;
&lt;br /&gt;
public class Main {&lt;br /&gt;
&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        List&amp;lt;Pixel&amp;gt; pixels = Arrays.asList(new Pixel(2, 2, 2), new Pixel(2, 3, 4), new Pixel(100, 200, 255));&lt;br /&gt;
        Image myImage = new RawImage(pixels);&lt;br /&gt;
        for (Pixel p : myImage.getPixels()) {&lt;br /&gt;
            System.out.println(p.toString());&lt;br /&gt;
        }&lt;br /&gt;
        Image myFilteredImage = new Invert(new Greyscale(myImage));&lt;br /&gt;
        for  (Pixel p : myFilteredImage.getPixels()) {&lt;br /&gt;
            System.out.println(p.toString());&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;
=== Поставка ===&lt;br /&gt;
Посматра се део система који симулира карташку игру. Пре почетка игре, играчи могу да се пријаве делиоцу карата („крупијеу“) за учествовање у игри и могу да се одјаве након завршене игре. Игра се игра тако да у њој може учествовати различит број играча и током игре играчи не разговарају један са другим. Број играча је увек довољно мали да је са њима прихватљива синхрона комуникација. Након што се игра покрене, сваки играч од крупијеа добија по две насумичне карте (којих је само он свестан). Потом крупије открива једну од преосталих карата и сви играчи се обавештавају о карти која је откривена. На основу ових информација, сваки играч може да одлучи колико ће новца уложити. Неки играчи играју агресивно, а неки штедљиво; начин играња може да се конфигурише за сваког играча различито, при чему се предвиђа осмишљавање нових различитих начина игре, па различити играчи са истим информацијама улажу различиту количину новца. Након што сви играчи уложе свој новац, следи поново откривање нове карте око које се играчи обавештавају и након чега сваки може поново да уложи новац. Ово се понавља пет пута по игри, на крају чега играч са најбољом комбинацијом карата добија сав новац и игра се завршава. Логика одабира победника се такође може мењати од игре до игре, мада конкретна имплементација ове логике није од интереса за овај задатак.&lt;br /&gt;
&lt;br /&gt;
Дорадити и исправити дату имплементацију система коришћењем одговарајућих пројектних образаца. Навести све примене пројектних образаца у систему са кратким образложењем у текстуалном фајлу z2.txt (једна до две реченице).&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
==== Сарадња ====&lt;br /&gt;
У овом задатку су искоришћени узорци Уникат, Посматрач и Стратегија.&lt;br /&gt;
&lt;br /&gt;
; Уникат&lt;br /&gt;
: Учесници:&lt;br /&gt;
:* Уникат (Croupier)&lt;br /&gt;
; Посматрач&lt;br /&gt;
: Учесници:&lt;br /&gt;
:* КонкретанСубјекат (Croupier)&lt;br /&gt;
:* КонкретанПосматрач (Player)&lt;br /&gt;
; Стратегија:&lt;br /&gt;
: Учесници:&lt;br /&gt;
:* Контекст (Player)&lt;br /&gt;
:* Стратегија (PlayingStrategy)&lt;br /&gt;
:* КонкретнаСтратегија (AggresiveStrategy, ScroogeStrategy)&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;Card.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package z2;&lt;br /&gt;
&lt;br /&gt;
public class Card {&lt;br /&gt;
&lt;br /&gt;
    public enum CardSuit {DIAMOND, CLUB, HEART, SPADE};&lt;br /&gt;
    public static final int NUMBER_OF_CARDS = 14;&lt;br /&gt;
    public static final int NUMBER_OF_SUITS = 4;&lt;br /&gt;
    private int number;&lt;br /&gt;
    private CardSuit cardSuit;&lt;br /&gt;
&lt;br /&gt;
    public int getNumber() {&lt;br /&gt;
        return number;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void setNumber(int number) {&lt;br /&gt;
        this.number = number;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public CardSuit getCardSuit() {&lt;br /&gt;
        return cardSuit;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void setCardSuit(CardSuit cardSuit) {&lt;br /&gt;
        this.cardSuit = cardSuit;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public Card(int number, int cardSuitIndex) {&lt;br /&gt;
        this.number = number;&lt;br /&gt;
        this.cardSuit = CardSuit.values()[cardSuitIndex];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;PlayingStrategy.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package z2;&lt;br /&gt;
&lt;br /&gt;
import java.util.List;&lt;br /&gt;
&lt;br /&gt;
public abstract class PlayingStrategy {&lt;br /&gt;
    public abstract double playAMove(Card[] myCards, List&amp;lt;Card&amp;gt; tableCards);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;ScroogeStrategy.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package z2;&lt;br /&gt;
&lt;br /&gt;
import java.util.List;&lt;br /&gt;
&lt;br /&gt;
public class ScroogeStrategy extends PlayingStrategy {&lt;br /&gt;
    @Override&lt;br /&gt;
    public double playAMove(Card[] cardsInHand, List&amp;lt;Card&amp;gt; tableCards) {&lt;br /&gt;
        double bettingMoney;&lt;br /&gt;
        int numCardsOnTable = tableCards.size();&lt;br /&gt;
        bettingMoney = numCardsOnTable * 0.2 + cardsInHand.length * 0.1;&lt;br /&gt;
        return bettingMoney;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;AggresiveStrategy.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package z2;&lt;br /&gt;
&lt;br /&gt;
import java.util.List;&lt;br /&gt;
&lt;br /&gt;
public class AggresiveStrategy extends PlayingStrategy {&lt;br /&gt;
    @Override&lt;br /&gt;
    public double playAMove(Card[] cardsInHand, List&amp;lt;Card&amp;gt; tableCards) {&lt;br /&gt;
        double bettingMoney;&lt;br /&gt;
        int numCardsOnTable = tableCards.size();&lt;br /&gt;
        bettingMoney = numCardsOnTable * 0.5 + cardsInHand.length * 0.3;&lt;br /&gt;
        return bettingMoney;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;Croupier.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package z2;&lt;br /&gt;
&lt;br /&gt;
import java.util.ArrayList;&lt;br /&gt;
import java.util.List;&lt;br /&gt;
import java.util.Random;&lt;br /&gt;
&lt;br /&gt;
import static z2.Card.*;&lt;br /&gt;
&lt;br /&gt;
public class Croupier {&lt;br /&gt;
&lt;br /&gt;
    private static final int NUMBER_OF_TURNS = 5;&lt;br /&gt;
    private boolean isGameInProgress = false;&lt;br /&gt;
&lt;br /&gt;
    private Random randomGenerator = new Random();&lt;br /&gt;
    private List&amp;lt;Player&amp;gt; playersInGame = new ArrayList&amp;lt;&amp;gt;();&lt;br /&gt;
    private List&amp;lt;Card&amp;gt; cardsOnTable = new ArrayList&amp;lt;&amp;gt;();&lt;br /&gt;
&lt;br /&gt;
    private double moneyPot = 0;&lt;br /&gt;
&lt;br /&gt;
    private Croupier() {}&lt;br /&gt;
&lt;br /&gt;
    private volatile static Croupier instance = null;&lt;br /&gt;
&lt;br /&gt;
    public static Croupier getInstance() {&lt;br /&gt;
        //Thread safe variant with minimal critical section&lt;br /&gt;
        if (instance == null) {&lt;br /&gt;
            synchronized (Croupier.class) {&lt;br /&gt;
                if (instance == null) {&lt;br /&gt;
                    instance = new Croupier();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        return instance;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* join and leave are subscription methods for concrete subject in Observer */&lt;br /&gt;
    public void join(Player player) {&lt;br /&gt;
        if(!isGameInProgress) {&lt;br /&gt;
            this.playersInGame.add(player);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void leave(Player player) {&lt;br /&gt;
        if(!isGameInProgress) {&lt;br /&gt;
            this.playersInGame.remove(player);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public List&amp;lt;Card&amp;gt; getTable(){&lt;br /&gt;
        return cardsOnTable;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void simulateGame() {&lt;br /&gt;
        isGameInProgress = true;&lt;br /&gt;
        for (Player player: playersInGame) {&lt;br /&gt;
            player.setCardsInHand(&lt;br /&gt;
                    new Card[]{&lt;br /&gt;
                            drawCardFromDeck(),&lt;br /&gt;
                            drawCardFromDeck()&lt;br /&gt;
                    }&lt;br /&gt;
            );&lt;br /&gt;
        }&lt;br /&gt;
        cardsOnTable.clear();&lt;br /&gt;
        moneyPot = 0;&lt;br /&gt;
        for(int i = 0; i &amp;lt; NUMBER_OF_TURNS; i++) {&lt;br /&gt;
            Card newCard = drawCardFromDeck();&lt;br /&gt;
            cardsOnTable.add(newCard);&lt;br /&gt;
            for(Player player: playersInGame) {&lt;br /&gt;
                moneyPot += player.update(newCard);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        Player player = defineWinner();&lt;br /&gt;
        player.addMoney(moneyPot);&lt;br /&gt;
        System.out.println(&lt;br /&gt;
                &amp;quot;Winning player with ID: &amp;quot; + player.getPlayer_id() +&lt;br /&gt;
                &amp;quot;, currently has: &amp;quot; + player.getMoney());&lt;br /&gt;
        isGameInProgress = false;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private Player defineWinner() {&lt;br /&gt;
        // TODO: Should be a few declaring winner tactics, not currently important.&lt;br /&gt;
        return playersInGame.get(randomGenerator.nextInt(playersInGame.size()));&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private Card drawCardFromDeck() {&lt;br /&gt;
        return new Card(&lt;br /&gt;
                randomGenerator.nextInt(NUMBER_OF_CARDS),&lt;br /&gt;
                randomGenerator.nextInt(NUMBER_OF_SUITS)&lt;br /&gt;
        );&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;Player.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package z2;&lt;br /&gt;
&lt;br /&gt;
import java.util.ArrayList;&lt;br /&gt;
import java.util.List;&lt;br /&gt;
&lt;br /&gt;
public class Player {&lt;br /&gt;
    private Croupier croupier;&lt;br /&gt;
    private PlayingStrategy playingStrategy;&lt;br /&gt;
    public Player(Croupier c, PlayingStrategy playingStrategy) {&lt;br /&gt;
        croupier = c;&lt;br /&gt;
        this.playingStrategy = playingStrategy;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private static final double STARTING_MONEY = 10;&lt;br /&gt;
    private Card cardsInHand[];&lt;br /&gt;
    private double money = STARTING_MONEY;&lt;br /&gt;
    private boolean aggressive = true;&lt;br /&gt;
    private static int ID = 0;&lt;br /&gt;
    private int player_id = ID++;&lt;br /&gt;
&lt;br /&gt;
    private List&amp;lt;Card&amp;gt; tableCards = new ArrayList&amp;lt;Card&amp;gt;();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    public int getPlayer_id() {&lt;br /&gt;
        return player_id;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public Card[] getCardsInHand() {&lt;br /&gt;
        return cardsInHand;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void setCardsInHand(Card[] cardsInHand) {&lt;br /&gt;
        this.cardsInHand = cardsInHand;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public double getMoney() {&lt;br /&gt;
        return money;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void addMoney(double money) {&lt;br /&gt;
        this.money += money;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public boolean isAggressive() {&lt;br /&gt;
        return aggressive;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void setAggressive(boolean aggressive) {&lt;br /&gt;
        this.aggressive = aggressive;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public double update(Card newCard) {&lt;br /&gt;
        tableCards.add(newCard);&lt;br /&gt;
        double bettingMoney;&lt;br /&gt;
        bettingMoney = playingStrategy.playAMove(cardsInHand, tableCards);&lt;br /&gt;
        bettingMoney = bettingMoney &amp;gt; money ? money : bettingMoney;&lt;br /&gt;
        money -= bettingMoney;&lt;br /&gt;
        return bettingMoney;&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>Aleksa</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9F%D1%80%D0%BE%D1%98%D0%B5%D0%BA%D1%82%D0%BE%D0%B2%D0%B0%D1%9A%D0%B5_%D1%81%D0%BE%D1%84%D1%82%D0%B2%D0%B5%D1%80%D0%B0/%D0%9A1_2024&amp;diff=8186</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%D1%98%D0%B5%D0%BA%D1%82%D0%BE%D0%B2%D0%B0%D1%9A%D0%B5_%D1%81%D0%BE%D1%84%D1%82%D0%B2%D0%B5%D1%80%D0%B0/%D0%9A1_2024&amp;diff=8186"/>
		<updated>2025-12-01T23:23:15Z</updated>

		<summary type="html">&lt;p&gt;Aleksa: Поништена измена бр. 8184 корисника Aleksa (разговор)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&#039;&#039;&#039;Први колоквијум 2024. године&#039;&#039;&#039; одржан је 27. октобра 2024. године. Биле су доступне презентације о свим пројектним обрасцима, као и &#039;&#039;Java&#039;&#039; документација. Време за израду је било 120 минута.&lt;br /&gt;
&lt;br /&gt;
== 1. задатак ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Посматра се систем за приказ и обраду дигиталних слика. Треба обезбедити то да се на оригиналну слику може применити произвољан број филтера (или ниједан), у произвољном редоследу, при чему остатак система који приказује и користи слику (“клијент”) не треба да види разлику у односу на то да ли су на слику примењени филтери или нису. Свака слика садржи низ пиксела. Пиксел има R, G и B компоненте (интензитет црвене, зелене и плаве боје), где свака има целобројну вредност од 0 до 255. Филтери који могу да се примене у овом систему су за сада (касније могу бити осмишљени и додати нови филтери):&lt;br /&gt;
* &#039;&#039;Greyscale&#039;&#039; – сваки пиксел се претвара у одговарајућу нијансу сиве, где се R, G и B компоненте рачунају по следећој формули: &amp;lt;code&amp;gt;R, G, B = 0.3 * R + 0.59 * G + 0.11 * B&amp;lt;/code&amp;gt;&lt;br /&gt;
* &#039;&#039;Invert&#039;&#039; – R, G и B компоненте сваког пиксела се инвертују по следећој формули: &amp;lt;code&amp;gt;R = 255 – R, G = 255 – G, B = 255 – B&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Клијент који користи слику може да прочита вредности њених пиксела; уколико су на слику примењени филтери, то су вредности пиксела оригиналне слике измењене дејством додатих филтера (у случају да ниједан филтер није примењен над оригиналном сликом, враћа се неизмењен низ пиксела оригиналне слике). Коришћењем пројектног обрасца Декоратер (Decorator) потребно је имплементирати описани део система и навести расподелу улога из обрасца класама у овом решењу; опис дати у текстуалном фајлу z1.txt. &lt;br /&gt;
&lt;br /&gt;
Написати пример коришћења дате сарадње. Направити слику са филтерима Greyscale и Invert, са неким насумичним вредностима пиксела, а затим дохватити пикселе такве слике и исписати их. Имплементација пиксела приказана је у следећој класи:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package zad1;&lt;br /&gt;
&lt;br /&gt;
public class Pixel {&lt;br /&gt;
    private int R, G, B;&lt;br /&gt;
&lt;br /&gt;
    public Pixel(int R, int G, int B) {&lt;br /&gt;
        this.R = R;&lt;br /&gt;
        this.G = G;&lt;br /&gt;
        this.B = B;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public int getR() {&lt;br /&gt;
        return R;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void setR(int R) {&lt;br /&gt;
        this.R = R;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public int getG() {&lt;br /&gt;
        return G;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void setG(int G) {&lt;br /&gt;
        this.G = G;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public int getB() {&lt;br /&gt;
        return B;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void setB(int B) {&lt;br /&gt;
        this.B = B;&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;
У овом задатку потребно је користити узорак Декоратер, а у изради се користио и узорак Шаблонски метод.&lt;br /&gt;
&lt;br /&gt;
; Декоратер&lt;br /&gt;
: Учесници:&lt;br /&gt;
:* Компонента (Image)&lt;br /&gt;
:* Субјекат (RawImage)&lt;br /&gt;
:* Допуна (Filter)&lt;br /&gt;
:* КонкретнаДопуна (Greyscale, Inverse)&lt;br /&gt;
; Шаблонски метод&lt;br /&gt;
: Учесници:&lt;br /&gt;
:* АпстрактнаКласа (Filter)&lt;br /&gt;
:* КонкретнаКласа (Greyscale, Inverse)&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;Image.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package z1;&lt;br /&gt;
&lt;br /&gt;
import java.util.List;&lt;br /&gt;
&lt;br /&gt;
public interface Image {&lt;br /&gt;
    public List&amp;lt;Pixel&amp;gt; getPixels();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;RawImage.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package z1;&lt;br /&gt;
&lt;br /&gt;
import java.util.ArrayList;&lt;br /&gt;
import java.util.List;&lt;br /&gt;
&lt;br /&gt;
public class RawImage implements Image {&lt;br /&gt;
    protected List&amp;lt;Pixel&amp;gt; pixels = new ArrayList&amp;lt;Pixel&amp;gt;();&lt;br /&gt;
&lt;br /&gt;
    public RawImage(List&amp;lt;Pixel&amp;gt; pixels) {&lt;br /&gt;
        this.pixels = pixels;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public List&amp;lt;Pixel&amp;gt; getPixels() {&lt;br /&gt;
        return pixels;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;Filter.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package z1;&lt;br /&gt;
&lt;br /&gt;
import java.util.ArrayList;&lt;br /&gt;
import java.util.List;&lt;br /&gt;
&lt;br /&gt;
public abstract class Filter implements Image{&lt;br /&gt;
    private Image image; //image that we wrap/decorate&lt;br /&gt;
&lt;br /&gt;
    public Filter(Image image){&lt;br /&gt;
        this.image = image;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    protected abstract Pixel modifyPixel(Pixel p);&lt;br /&gt;
&lt;br /&gt;
    private List&amp;lt;Pixel&amp;gt; applyFilter(List&amp;lt;Pixel&amp;gt; pixels){&lt;br /&gt;
        List&amp;lt;Pixel&amp;gt; modifiedPixels = new ArrayList&amp;lt;Pixel&amp;gt;();&lt;br /&gt;
        for (Pixel pixel : pixels){&lt;br /&gt;
            modifiedPixels.add(modifyPixel(pixel));&lt;br /&gt;
        }&lt;br /&gt;
        return modifiedPixels;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public List&amp;lt;Pixel&amp;gt; getPixels() {&lt;br /&gt;
        return applyFilter(this.image.getPixels());&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;Greyscale.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package z1;&lt;br /&gt;
&lt;br /&gt;
public class Greyscale extends Filter{&lt;br /&gt;
    public Greyscale(Image i) {&lt;br /&gt;
        super(i);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    protected Pixel modifyPixel(Pixel p){&lt;br /&gt;
        int grey = (int) (p.getR()*0.3) +  (int) (p.getG()*0.59) + (int) (p.getB()*0.11);&lt;br /&gt;
        return new Pixel(grey, grey, grey&lt;br /&gt;
        );&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;Invert.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package z1;&lt;br /&gt;
&lt;br /&gt;
public class Invert extends Filter {&lt;br /&gt;
    public Invert(Image i) {&lt;br /&gt;
        super(i);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private final int invertFactor = 255;&lt;br /&gt;
&lt;br /&gt;
    protected Pixel modifyPixel(Pixel p) {&lt;br /&gt;
        return new Pixel(&lt;br /&gt;
                invertFactor - p.getR(),&lt;br /&gt;
                invertFactor - p.getG(),&lt;br /&gt;
                invertFactor - p.getB()&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;
==== &amp;lt;code&amp;gt;Main.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package z1;&lt;br /&gt;
&lt;br /&gt;
import java.util.Arrays;&lt;br /&gt;
import java.util.List;&lt;br /&gt;
&lt;br /&gt;
public class Main {&lt;br /&gt;
&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        List&amp;lt;Pixel&amp;gt; pixels = Arrays.asList(new Pixel(2, 2, 2), new Pixel(2, 3, 4), new Pixel(100, 200, 255));&lt;br /&gt;
        Image myImage = new RawImage(pixels);&lt;br /&gt;
        for (Pixel p : myImage.getPixels()) {&lt;br /&gt;
            System.out.println(p.toString());&lt;br /&gt;
        }&lt;br /&gt;
        Image myFilteredImage = new Invert(new Greyscale(myImage));&lt;br /&gt;
        for  (Pixel p : myFilteredImage.getPixels()) {&lt;br /&gt;
            System.out.println(p.toString());&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;
=== Поставка ===&lt;br /&gt;
Посматра се део система који симулира карташку игру. Пре почетка игре, играчи могу да се пријаве делиоцу карата („крупијеу“) за учествовање у игри и могу да се одјаве након завршене игре. Игра се игра тако да у њој може учествовати различит број играча и током игре играчи не разговарају један са другим. Број играча је увек довољно мали да је са њима прихватљива синхрона комуникација. Након што се игра покрене, сваки играч од крупијеа добија по две насумичне карте (којих је само он свестан). Потом крупије открива једну од преосталих карата и сви играчи се обавештавају о карти која је откривена. На основу ових информација, сваки играч може да одлучи колико ће новца уложити. Неки играчи играју агресивно, а неки штедљиво; начин играња може да се конфигурише за сваког играча различито, при чему се предвиђа осмишљавање нових различитих начина игре, па различити играчи са истим информацијама улажу различиту количину новца. Након што сви играчи уложе свој новац, следи поново откривање нове карте око које се играчи обавештавају и након чега сваки може поново да уложи новац. Ово се понавља пет пута по игри, на крају чега играч са најбољом комбинацијом карата добија сав новац и игра се завршава. Логика одабира победника се такође може мењати од игре до игре, мада конкретна имплементација ове логике није од интереса за овај задатак.&lt;br /&gt;
&lt;br /&gt;
Дорадити и исправити дату имплементацију система коришћењем одговарајућих пројектних образаца. Навести све примене пројектних образаца у систему са кратким образложењем у текстуалном фајлу z2.txt (једна до две реченице).&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
==== Сарадња ====&lt;br /&gt;
У овом задатку су искоришћени узорци Уникат, Посматрач и Стратегија.&lt;br /&gt;
&lt;br /&gt;
; Уникат&lt;br /&gt;
: Учесници:&lt;br /&gt;
:* Уникат (Croupier)&lt;br /&gt;
; Посматрач&lt;br /&gt;
: Учесници:&lt;br /&gt;
:* КонкретанСубјекат (Croupier)&lt;br /&gt;
:* КонкретанПосматрач (Player)&lt;br /&gt;
; Стратегија:&lt;br /&gt;
: Учесници:&lt;br /&gt;
:* Контекст (Player)&lt;br /&gt;
:* Стратегија (PlayingStrategy)&lt;br /&gt;
:* КонкретнаСтратегија (AggresiveStrategy, ScroogeStrategy)&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;Observer.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package z2;&lt;br /&gt;
&lt;br /&gt;
public interface Observer {&lt;br /&gt;
    double update(Card newCard);&lt;br /&gt;
    void resetGame();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;Card.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package z2;&lt;br /&gt;
&lt;br /&gt;
public class Card {&lt;br /&gt;
&lt;br /&gt;
    public enum CardSuit {DIAMOND, CLUB, HEART, SPADE};&lt;br /&gt;
    public static final int NUMBER_OF_CARDS = 14;&lt;br /&gt;
    public static final int NUMBER_OF_SUITS = 4;&lt;br /&gt;
    private int number;&lt;br /&gt;
    private CardSuit cardSuit;&lt;br /&gt;
&lt;br /&gt;
    public int getNumber() {&lt;br /&gt;
        return number;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void setNumber(int number) {&lt;br /&gt;
        this.number = number;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public CardSuit getCardSuit() {&lt;br /&gt;
        return cardSuit;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void setCardSuit(CardSuit cardSuit) {&lt;br /&gt;
        this.cardSuit = cardSuit;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public Card(int number, int cardSuitIndex) {&lt;br /&gt;
        this.number = number;&lt;br /&gt;
        this.cardSuit = CardSuit.values()[cardSuitIndex];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;PlayingStrategy.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package z2;&lt;br /&gt;
&lt;br /&gt;
import java.util.List;&lt;br /&gt;
&lt;br /&gt;
public abstract class PlayingStrategy {&lt;br /&gt;
    public abstract double playAMove(Card[] myCards, List&amp;lt;Card&amp;gt; tableCards);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;ScroogeStrategy.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package z2;&lt;br /&gt;
&lt;br /&gt;
import java.util.List;&lt;br /&gt;
&lt;br /&gt;
public class ScroogeStrategy extends PlayingStrategy {&lt;br /&gt;
    @Override&lt;br /&gt;
    public double playAMove(Card[] cardsInHand, List&amp;lt;Card&amp;gt; tableCards) {&lt;br /&gt;
        double bettingMoney;&lt;br /&gt;
        int numCardsOnTable = tableCards.size();&lt;br /&gt;
        bettingMoney = numCardsOnTable * 0.2 + cardsInHand.length * 0.1;&lt;br /&gt;
        return bettingMoney;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;AggresiveStrategy.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package z2;&lt;br /&gt;
&lt;br /&gt;
import java.util.List;&lt;br /&gt;
&lt;br /&gt;
public class AggresiveStrategy extends PlayingStrategy {&lt;br /&gt;
    @Override&lt;br /&gt;
    public double playAMove(Card[] cardsInHand, List&amp;lt;Card&amp;gt; tableCards) {&lt;br /&gt;
        double bettingMoney;&lt;br /&gt;
        int numCardsOnTable = tableCards.size();&lt;br /&gt;
        bettingMoney = numCardsOnTable * 0.5 + cardsInHand.length * 0.3;&lt;br /&gt;
        return bettingMoney;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;Croupier.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package z2;&lt;br /&gt;
&lt;br /&gt;
import java.util.ArrayList;&lt;br /&gt;
import java.util.List;&lt;br /&gt;
import java.util.Random;&lt;br /&gt;
&lt;br /&gt;
import static z2.Card.*;&lt;br /&gt;
&lt;br /&gt;
public class Croupier {&lt;br /&gt;
&lt;br /&gt;
    private static final int NUMBER_OF_TURNS = 5;&lt;br /&gt;
    private boolean isGameInProgress = false;&lt;br /&gt;
&lt;br /&gt;
    private Random randomGenerator = new Random();&lt;br /&gt;
    private List&amp;lt;Player&amp;gt; playersInGame = new ArrayList&amp;lt;&amp;gt;();&lt;br /&gt;
    private List&amp;lt;Card&amp;gt; cardsOnTable = new ArrayList&amp;lt;&amp;gt;();&lt;br /&gt;
&lt;br /&gt;
    private double moneyPot = 0;&lt;br /&gt;
&lt;br /&gt;
    private Croupier() {}&lt;br /&gt;
&lt;br /&gt;
    private volatile static Croupier instance = null;&lt;br /&gt;
&lt;br /&gt;
    public static Croupier getInstance() {&lt;br /&gt;
        //Thread safe variant with minimal critical section&lt;br /&gt;
        if (instance == null) {&lt;br /&gt;
            synchronized (Croupier.class) {&lt;br /&gt;
                if (instance == null) {&lt;br /&gt;
                    instance = new Croupier();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        return instance;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* join and leave are subscription methods for concrete subject in Observer */&lt;br /&gt;
    public void join(Player player) {&lt;br /&gt;
        if(!isGameInProgress) {&lt;br /&gt;
            this.playersInGame.add(player);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void leave(Player player) {&lt;br /&gt;
        if(!isGameInProgress) {&lt;br /&gt;
            this.playersInGame.remove(player);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public List&amp;lt;Card&amp;gt; getTable(){&lt;br /&gt;
        return cardsOnTable;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void simulateGame() {&lt;br /&gt;
        isGameInProgress = true;&lt;br /&gt;
        for (Player player: playersInGame) {&lt;br /&gt;
            player.setCardsInHand(&lt;br /&gt;
                    new Card[]{&lt;br /&gt;
                            drawCardFromDeck(),&lt;br /&gt;
                            drawCardFromDeck()&lt;br /&gt;
                    }&lt;br /&gt;
            );&lt;br /&gt;
        }&lt;br /&gt;
        cardsOnTable.clear();&lt;br /&gt;
        moneyPot = 0;&lt;br /&gt;
        for(int i = 0; i &amp;lt; NUMBER_OF_TURNS; i++) {&lt;br /&gt;
            Card newCard = drawCardFromDeck();&lt;br /&gt;
            cardsOnTable.add(newCard);&lt;br /&gt;
            for(Player player: playersInGame) {&lt;br /&gt;
                moneyPot += player.update(newCard);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        Player player = defineWinner();&lt;br /&gt;
        player.addMoney(moneyPot);&lt;br /&gt;
        System.out.println(&lt;br /&gt;
                &amp;quot;Winning player with ID: &amp;quot; + player.getPlayer_id() +&lt;br /&gt;
                &amp;quot;, currently has: &amp;quot; + player.getMoney());&lt;br /&gt;
        isGameInProgress = false;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private Player defineWinner() {&lt;br /&gt;
        // TODO: Should be a few declaring winner tactics, not currently important.&lt;br /&gt;
        return playersInGame.get(randomGenerator.nextInt(playersInGame.size()));&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private Card drawCardFromDeck() {&lt;br /&gt;
        return new Card(&lt;br /&gt;
                randomGenerator.nextInt(NUMBER_OF_CARDS),&lt;br /&gt;
                randomGenerator.nextInt(NUMBER_OF_SUITS)&lt;br /&gt;
        );&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;Player.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package z2;&lt;br /&gt;
&lt;br /&gt;
import java.util.ArrayList;&lt;br /&gt;
import java.util.List;&lt;br /&gt;
&lt;br /&gt;
public class Player {&lt;br /&gt;
    private Croupier croupier;&lt;br /&gt;
    private PlayingStrategy playingStrategy;&lt;br /&gt;
    public Player(Croupier c, PlayingStrategy playingStrategy) {&lt;br /&gt;
        croupier = c;&lt;br /&gt;
        this.playingStrategy = playingStrategy;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private static final double STARTING_MONEY = 10;&lt;br /&gt;
    private Card cardsInHand[];&lt;br /&gt;
    private double money = STARTING_MONEY;&lt;br /&gt;
    private boolean aggressive = true;&lt;br /&gt;
    private static int ID = 0;&lt;br /&gt;
    private int player_id = ID++;&lt;br /&gt;
&lt;br /&gt;
    private List&amp;lt;Card&amp;gt; tableCards = new ArrayList&amp;lt;Card&amp;gt;();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    public int getPlayer_id() {&lt;br /&gt;
        return player_id;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public Card[] getCardsInHand() {&lt;br /&gt;
        return cardsInHand;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void setCardsInHand(Card[] cardsInHand) {&lt;br /&gt;
        this.cardsInHand = cardsInHand;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public double getMoney() {&lt;br /&gt;
        return money;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void addMoney(double money) {&lt;br /&gt;
        this.money += money;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public boolean isAggressive() {&lt;br /&gt;
        return aggressive;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void setAggressive(boolean aggressive) {&lt;br /&gt;
        this.aggressive = aggressive;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public double update(Card newCard) {&lt;br /&gt;
        tableCards.add(newCard);&lt;br /&gt;
        double bettingMoney;&lt;br /&gt;
        bettingMoney = playingStrategy.playAMove(cardsInHand, tableCards);&lt;br /&gt;
        bettingMoney = bettingMoney &amp;gt; money ? money : bettingMoney;&lt;br /&gt;
        money -= bettingMoney;&lt;br /&gt;
        return bettingMoney;&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>Aleksa</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9F%D1%80%D0%BE%D1%98%D0%B5%D0%BA%D1%82%D0%BE%D0%B2%D0%B0%D1%9A%D0%B5_%D1%81%D0%BE%D1%84%D1%82%D0%B2%D0%B5%D1%80%D0%B0/%D0%9A1_2024&amp;diff=8185</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%D1%98%D0%B5%D0%BA%D1%82%D0%BE%D0%B2%D0%B0%D1%9A%D0%B5_%D1%81%D0%BE%D1%84%D1%82%D0%B2%D0%B5%D1%80%D0%B0/%D0%9A1_2024&amp;diff=8185"/>
		<updated>2025-12-01T23:18:32Z</updated>

		<summary type="html">&lt;p&gt;Aleksa: /* Card.java */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&#039;&#039;&#039;Први колоквијум 2024. године&#039;&#039;&#039; одржан је 27. октобра 2024. године. Биле су доступне презентације о свим пројектним обрасцима, као и &#039;&#039;Java&#039;&#039; документација. Време за израду је било 120 минута.&lt;br /&gt;
&lt;br /&gt;
== 1. задатак ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Посматра се систем за приказ и обраду дигиталних слика. Треба обезбедити то да се на оригиналну слику може применити произвољан број филтера (или ниједан), у произвољном редоследу, при чему остатак система који приказује и користи слику (“клијент”) не треба да види разлику у односу на то да ли су на слику примењени филтери или нису. Свака слика садржи низ пиксела. Пиксел има R, G и B компоненте (интензитет црвене, зелене и плаве боје), где свака има целобројну вредност од 0 до 255. Филтери који могу да се примене у овом систему су за сада (касније могу бити осмишљени и додати нови филтери):&lt;br /&gt;
* &#039;&#039;Greyscale&#039;&#039; – сваки пиксел се претвара у одговарајућу нијансу сиве, где се R, G и B компоненте рачунају по следећој формули: &amp;lt;code&amp;gt;R, G, B = 0.3 * R + 0.59 * G + 0.11 * B&amp;lt;/code&amp;gt;&lt;br /&gt;
* &#039;&#039;Invert&#039;&#039; – R, G и B компоненте сваког пиксела се инвертују по следећој формули: &amp;lt;code&amp;gt;R = 255 – R, G = 255 – G, B = 255 – B&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Клијент који користи слику може да прочита вредности њених пиксела; уколико су на слику примењени филтери, то су вредности пиксела оригиналне слике измењене дејством додатих филтера (у случају да ниједан филтер није примењен над оригиналном сликом, враћа се неизмењен низ пиксела оригиналне слике). Коришћењем пројектног обрасца Декоратер (Decorator) потребно је имплементирати описани део система и навести расподелу улога из обрасца класама у овом решењу; опис дати у текстуалном фајлу z1.txt. &lt;br /&gt;
&lt;br /&gt;
Написати пример коришћења дате сарадње. Направити слику са филтерима Greyscale и Invert, са неким насумичним вредностима пиксела, а затим дохватити пикселе такве слике и исписати их. Имплементација пиксела приказана је у следећој класи:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package zad1;&lt;br /&gt;
&lt;br /&gt;
public class Pixel {&lt;br /&gt;
    private int R, G, B;&lt;br /&gt;
&lt;br /&gt;
    public Pixel(int R, int G, int B) {&lt;br /&gt;
        this.R = R;&lt;br /&gt;
        this.G = G;&lt;br /&gt;
        this.B = B;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public int getR() {&lt;br /&gt;
        return R;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void setR(int R) {&lt;br /&gt;
        this.R = R;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public int getG() {&lt;br /&gt;
        return G;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void setG(int G) {&lt;br /&gt;
        this.G = G;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public int getB() {&lt;br /&gt;
        return B;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void setB(int B) {&lt;br /&gt;
        this.B = B;&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;
У овом задатку потребно је користити узорак Декоратер, а у изради се користио и узорак Шаблонски метод.&lt;br /&gt;
&lt;br /&gt;
; Декоратер&lt;br /&gt;
: Учесници:&lt;br /&gt;
:* Компонента (Image)&lt;br /&gt;
:* Субјекат (RawImage)&lt;br /&gt;
:* Допуна (Filter)&lt;br /&gt;
:* КонкретнаДопуна (Greyscale, Inverse)&lt;br /&gt;
; Шаблонски метод&lt;br /&gt;
: Учесници:&lt;br /&gt;
:* АпстрактнаКласа (Filter)&lt;br /&gt;
:* КонкретнаКласа (Greyscale, Inverse)&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;Image.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package z1;&lt;br /&gt;
&lt;br /&gt;
import java.util.List;&lt;br /&gt;
&lt;br /&gt;
public interface Image {&lt;br /&gt;
    public List&amp;lt;Pixel&amp;gt; getPixels();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;RawImage.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package z1;&lt;br /&gt;
&lt;br /&gt;
import java.util.ArrayList;&lt;br /&gt;
import java.util.List;&lt;br /&gt;
&lt;br /&gt;
public class RawImage implements Image {&lt;br /&gt;
    protected List&amp;lt;Pixel&amp;gt; pixels = new ArrayList&amp;lt;Pixel&amp;gt;();&lt;br /&gt;
&lt;br /&gt;
    public RawImage(List&amp;lt;Pixel&amp;gt; pixels) {&lt;br /&gt;
        this.pixels = pixels;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public List&amp;lt;Pixel&amp;gt; getPixels() {&lt;br /&gt;
        return pixels;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;Filter.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package z1;&lt;br /&gt;
&lt;br /&gt;
import java.util.ArrayList;&lt;br /&gt;
import java.util.List;&lt;br /&gt;
&lt;br /&gt;
public abstract class Filter implements Image{&lt;br /&gt;
    private Image image; //image that we wrap/decorate&lt;br /&gt;
&lt;br /&gt;
    public Filter(Image image){&lt;br /&gt;
        this.image = image;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    protected abstract Pixel modifyPixel(Pixel p);&lt;br /&gt;
&lt;br /&gt;
    private List&amp;lt;Pixel&amp;gt; applyFilter(List&amp;lt;Pixel&amp;gt; pixels){&lt;br /&gt;
        List&amp;lt;Pixel&amp;gt; modifiedPixels = new ArrayList&amp;lt;Pixel&amp;gt;();&lt;br /&gt;
        for (Pixel pixel : pixels){&lt;br /&gt;
            modifiedPixels.add(modifyPixel(pixel));&lt;br /&gt;
        }&lt;br /&gt;
        return modifiedPixels;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public List&amp;lt;Pixel&amp;gt; getPixels() {&lt;br /&gt;
        return applyFilter(this.image.getPixels());&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;Greyscale.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package z1;&lt;br /&gt;
&lt;br /&gt;
public class Greyscale extends Filter{&lt;br /&gt;
    public Greyscale(Image i) {&lt;br /&gt;
        super(i);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    protected Pixel modifyPixel(Pixel p){&lt;br /&gt;
        int grey = (int) (p.getR()*0.3) +  (int) (p.getG()*0.59) + (int) (p.getB()*0.11);&lt;br /&gt;
        return new Pixel(grey, grey, grey&lt;br /&gt;
        );&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;Invert.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package z1;&lt;br /&gt;
&lt;br /&gt;
public class Invert extends Filter {&lt;br /&gt;
    public Invert(Image i) {&lt;br /&gt;
        super(i);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private final int invertFactor = 255;&lt;br /&gt;
&lt;br /&gt;
    protected Pixel modifyPixel(Pixel p) {&lt;br /&gt;
        return new Pixel(&lt;br /&gt;
                invertFactor - p.getR(),&lt;br /&gt;
                invertFactor - p.getG(),&lt;br /&gt;
                invertFactor - p.getB()&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;
==== &amp;lt;code&amp;gt;Main.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package z1;&lt;br /&gt;
&lt;br /&gt;
import java.util.Arrays;&lt;br /&gt;
import java.util.List;&lt;br /&gt;
&lt;br /&gt;
public class Main {&lt;br /&gt;
&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        List&amp;lt;Pixel&amp;gt; pixels = Arrays.asList(new Pixel(2, 2, 2), new Pixel(2, 3, 4), new Pixel(100, 200, 255));&lt;br /&gt;
        Image myImage = new RawImage(pixels);&lt;br /&gt;
        for (Pixel p : myImage.getPixels()) {&lt;br /&gt;
            System.out.println(p.toString());&lt;br /&gt;
        }&lt;br /&gt;
        Image myFilteredImage = new Invert(new Greyscale(myImage));&lt;br /&gt;
        for  (Pixel p : myFilteredImage.getPixels()) {&lt;br /&gt;
            System.out.println(p.toString());&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;
=== Поставка ===&lt;br /&gt;
Посматра се део система који симулира карташку игру. Пре почетка игре, играчи могу да се пријаве делиоцу карата („крупијеу“) за учествовање у игри и могу да се одјаве након завршене игре. Игра се игра тако да у њој може учествовати различит број играча и током игре играчи не разговарају један са другим. Број играча је увек довољно мали да је са њима прихватљива синхрона комуникација. Након што се игра покрене, сваки играч од крупијеа добија по две насумичне карте (којих је само он свестан). Потом крупије открива једну од преосталих карата и сви играчи се обавештавају о карти која је откривена. На основу ових информација, сваки играч може да одлучи колико ће новца уложити. Неки играчи играју агресивно, а неки штедљиво; начин играња може да се конфигурише за сваког играча различито, при чему се предвиђа осмишљавање нових различитих начина игре, па различити играчи са истим информацијама улажу различиту количину новца. Након што сви играчи уложе свој новац, следи поново откривање нове карте око које се играчи обавештавају и након чега сваки може поново да уложи новац. Ово се понавља пет пута по игри, на крају чега играч са најбољом комбинацијом карата добија сав новац и игра се завршава. Логика одабира победника се такође може мењати од игре до игре, мада конкретна имплементација ове логике није од интереса за овај задатак.&lt;br /&gt;
&lt;br /&gt;
Дорадити и исправити дату имплементацију система коришћењем одговарајућих пројектних образаца. Навести све примене пројектних образаца у систему са кратким образложењем у текстуалном фајлу z2.txt (једна до две реченице).&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
==== Сарадња ====&lt;br /&gt;
У овом задатку су искоришћени узорци Уникат, Посматрач и Стратегија.&lt;br /&gt;
&lt;br /&gt;
; Уникат&lt;br /&gt;
: Учесници:&lt;br /&gt;
:* Уникат (Croupier)&lt;br /&gt;
; Посматрач&lt;br /&gt;
: Учесници:&lt;br /&gt;
:* КонкретанСубјекат (Croupier)&lt;br /&gt;
:* КонкретанПосматрач (Player)&lt;br /&gt;
; Стратегија:&lt;br /&gt;
: Учесници:&lt;br /&gt;
:* Контекст (Player)&lt;br /&gt;
:* Стратегија (PlayingStrategy)&lt;br /&gt;
:* КонкретнаСтратегија (AggresiveStrategy, ScroogeStrategy)&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;Observer.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package z2;&lt;br /&gt;
&lt;br /&gt;
public interface Observer {&lt;br /&gt;
    double update(Card newCard);&lt;br /&gt;
    void resetGame();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;Card.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package z2;&lt;br /&gt;
&lt;br /&gt;
public class Card {&lt;br /&gt;
&lt;br /&gt;
    public enum CardSuit {DIAMOND, CLUB, HEART, SPADE};&lt;br /&gt;
    public static final int NUMBER_OF_CARDS = 14;&lt;br /&gt;
    public static final int NUMBER_OF_SUITS = 4;&lt;br /&gt;
    private int number;&lt;br /&gt;
    private CardSuit cardSuit;&lt;br /&gt;
&lt;br /&gt;
    public int getNumber() {&lt;br /&gt;
        return number;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void setNumber(int number) {&lt;br /&gt;
        this.number = number;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public CardSuit getCardSuit() {&lt;br /&gt;
        return cardSuit;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void setCardSuit(CardSuit cardSuit) {&lt;br /&gt;
        this.cardSuit = cardSuit;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public Card(int number, int cardSuitIndex) {&lt;br /&gt;
        this.number = number;&lt;br /&gt;
        this.cardSuit = CardSuit.values()[cardSuitIndex];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;PlayingStrategy.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package z2;&lt;br /&gt;
&lt;br /&gt;
import java.util.List;&lt;br /&gt;
&lt;br /&gt;
public abstract class PlayingStrategy {&lt;br /&gt;
    public abstract double playAMove(Card[] myCards, List&amp;lt;Card&amp;gt; tableCards);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;ScroogeStrategy.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package z2;&lt;br /&gt;
&lt;br /&gt;
import java.util.List;&lt;br /&gt;
&lt;br /&gt;
public class ScroogeStrategy extends PlayingStrategy {&lt;br /&gt;
    @Override&lt;br /&gt;
    public double playAMove(Card[] cardsInHand, List&amp;lt;Card&amp;gt; tableCards) {&lt;br /&gt;
        double bettingMoney;&lt;br /&gt;
        int numCardsOnTable = tableCards.size();&lt;br /&gt;
        bettingMoney = numCardsOnTable * 0.2 + cardsInHand.length * 0.1;&lt;br /&gt;
        return bettingMoney;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;AggresiveStrategy.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package z2;&lt;br /&gt;
&lt;br /&gt;
import java.util.List;&lt;br /&gt;
&lt;br /&gt;
public class AggresiveStrategy extends PlayingStrategy {&lt;br /&gt;
    @Override&lt;br /&gt;
    public double playAMove(Card[] cardsInHand, List&amp;lt;Card&amp;gt; tableCards) {&lt;br /&gt;
        double bettingMoney;&lt;br /&gt;
        int numCardsOnTable = tableCards.size();&lt;br /&gt;
        bettingMoney = numCardsOnTable * 0.5 + cardsInHand.length * 0.3;&lt;br /&gt;
        return bettingMoney;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;Croupier.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package z2;&lt;br /&gt;
&lt;br /&gt;
import java.util.ArrayList;&lt;br /&gt;
import java.util.List;&lt;br /&gt;
import java.util.Random;&lt;br /&gt;
&lt;br /&gt;
import static z2.Card.*;&lt;br /&gt;
&lt;br /&gt;
public class Croupier {&lt;br /&gt;
&lt;br /&gt;
    private static final int NUMBER_OF_TURNS = 5;&lt;br /&gt;
    private boolean isGameInProgress = false;&lt;br /&gt;
&lt;br /&gt;
    private Random randomGenerator = new Random();&lt;br /&gt;
    private List&amp;lt;Player&amp;gt; playersInGame = new ArrayList&amp;lt;&amp;gt;();&lt;br /&gt;
    private List&amp;lt;Card&amp;gt; cardsOnTable = new ArrayList&amp;lt;&amp;gt;();&lt;br /&gt;
&lt;br /&gt;
    private double moneyPot = 0;&lt;br /&gt;
&lt;br /&gt;
    private Croupier() {}&lt;br /&gt;
&lt;br /&gt;
    private volatile static Croupier instance = null;&lt;br /&gt;
&lt;br /&gt;
    public static Croupier getInstance() {&lt;br /&gt;
        //Thread safe variant with minimal critical section&lt;br /&gt;
        if (instance == null) {&lt;br /&gt;
            synchronized (Croupier.class) {&lt;br /&gt;
                if (instance == null) {&lt;br /&gt;
                    instance = new Croupier();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        return instance;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* join and leave are subscription methods for concrete subject in Observer */&lt;br /&gt;
    public void join(Player player) {&lt;br /&gt;
        if(!isGameInProgress) {&lt;br /&gt;
            this.playersInGame.add(player);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void leave(Player player) {&lt;br /&gt;
        if(!isGameInProgress) {&lt;br /&gt;
            this.playersInGame.remove(player);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public List&amp;lt;Card&amp;gt; getTable(){&lt;br /&gt;
        return cardsOnTable;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void simulateGame() {&lt;br /&gt;
        isGameInProgress = true;&lt;br /&gt;
        for (Player player: playersInGame) {&lt;br /&gt;
            player.setCardsInHand(&lt;br /&gt;
                    new Card[]{&lt;br /&gt;
                            drawCardFromDeck(),&lt;br /&gt;
                            drawCardFromDeck()&lt;br /&gt;
                    }&lt;br /&gt;
            );&lt;br /&gt;
        }&lt;br /&gt;
        cardsOnTable.clear();&lt;br /&gt;
        moneyPot = 0;&lt;br /&gt;
        for(int i = 0; i &amp;lt; NUMBER_OF_TURNS; i++) {&lt;br /&gt;
            Card newCard = drawCardFromDeck();&lt;br /&gt;
            cardsOnTable.add(newCard);&lt;br /&gt;
            for(Player player: playersInGame) {&lt;br /&gt;
                moneyPot += player.update(newCard);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        Player player = defineWinner();&lt;br /&gt;
        player.addMoney(moneyPot);&lt;br /&gt;
        System.out.println(&lt;br /&gt;
                &amp;quot;Winning player with ID: &amp;quot; + player.getPlayer_id() +&lt;br /&gt;
                &amp;quot;, currently has: &amp;quot; + player.getMoney());&lt;br /&gt;
        isGameInProgress = false;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private Player defineWinner() {&lt;br /&gt;
        // TODO: Should be a few declaring winner tactics, not currently important.&lt;br /&gt;
        return playersInGame.get(randomGenerator.nextInt(playersInGame.size()));&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private Card drawCardFromDeck() {&lt;br /&gt;
        return new Card(&lt;br /&gt;
                randomGenerator.nextInt(NUMBER_OF_CARDS),&lt;br /&gt;
                randomGenerator.nextInt(NUMBER_OF_SUITS)&lt;br /&gt;
        );&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;Player.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package z2;&lt;br /&gt;
&lt;br /&gt;
import java.util.ArrayList;&lt;br /&gt;
import java.util.List;&lt;br /&gt;
&lt;br /&gt;
public class Player implements Observer {&lt;br /&gt;
    private Croupier croupier;&lt;br /&gt;
    private PlayingStrategy playingStrategy;&lt;br /&gt;
    public Player(Croupier c, PlayingStrategy playingStrategy) {&lt;br /&gt;
        croupier = c;&lt;br /&gt;
        this.playingStrategy = playingStrategy;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private static final double STARTING_MONEY = 10;&lt;br /&gt;
    private Card cardsInHand[];&lt;br /&gt;
    private double money = STARTING_MONEY;&lt;br /&gt;
    private boolean aggressive = true;&lt;br /&gt;
    private static int ID = 0;&lt;br /&gt;
    private int player_id = ID++;&lt;br /&gt;
&lt;br /&gt;
    private List&amp;lt;Card&amp;gt; tableCards = new ArrayList&amp;lt;Card&amp;gt;();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    public int getPlayer_id() {&lt;br /&gt;
        return player_id;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public Card[] getCardsInHand() {&lt;br /&gt;
        return cardsInHand;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void setCardsInHand(Card[] cardsInHand) {&lt;br /&gt;
        this.cardsInHand = cardsInHand;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public double getMoney() {&lt;br /&gt;
        return money;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void addMoney(double money) {&lt;br /&gt;
        this.money += money;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public boolean isAggressive() {&lt;br /&gt;
        return aggressive;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void setAggressive(boolean aggressive) {&lt;br /&gt;
        this.aggressive = aggressive;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public double update(Card newCard) {&lt;br /&gt;
        tableCards.add(newCard);&lt;br /&gt;
        double bettingMoney;&lt;br /&gt;
        bettingMoney = playingStrategy.playAMove(cardsInHand, tableCards);&lt;br /&gt;
        bettingMoney = bettingMoney &amp;gt; money ? money : bettingMoney;&lt;br /&gt;
        money -= bettingMoney;&lt;br /&gt;
        return bettingMoney;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void resetGame() {&lt;br /&gt;
        this.tableCards.clear();&lt;br /&gt;
        this.cardsInHand = null;&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>Aleksa</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9F%D1%80%D0%BE%D1%98%D0%B5%D0%BA%D1%82%D0%BE%D0%B2%D0%B0%D1%9A%D0%B5_%D1%81%D0%BE%D1%84%D1%82%D0%B2%D0%B5%D1%80%D0%B0/%D0%9A1_2024&amp;diff=8184</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%D1%98%D0%B5%D0%BA%D1%82%D0%BE%D0%B2%D0%B0%D1%9A%D0%B5_%D1%81%D0%BE%D1%84%D1%82%D0%B2%D0%B5%D1%80%D0%B0/%D0%9A1_2024&amp;diff=8184"/>
		<updated>2025-12-01T23:17:26Z</updated>

		<summary type="html">&lt;p&gt;Aleksa: /* Player.java */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&#039;&#039;&#039;Први колоквијум 2024. године&#039;&#039;&#039; одржан је 27. октобра 2024. године. Биле су доступне презентације о свим пројектним обрасцима, као и &#039;&#039;Java&#039;&#039; документација. Време за израду је било 120 минута.&lt;br /&gt;
&lt;br /&gt;
== 1. задатак ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Посматра се систем за приказ и обраду дигиталних слика. Треба обезбедити то да се на оригиналну слику може применити произвољан број филтера (или ниједан), у произвољном редоследу, при чему остатак система који приказује и користи слику (“клијент”) не треба да види разлику у односу на то да ли су на слику примењени филтери или нису. Свака слика садржи низ пиксела. Пиксел има R, G и B компоненте (интензитет црвене, зелене и плаве боје), где свака има целобројну вредност од 0 до 255. Филтери који могу да се примене у овом систему су за сада (касније могу бити осмишљени и додати нови филтери):&lt;br /&gt;
* &#039;&#039;Greyscale&#039;&#039; – сваки пиксел се претвара у одговарајућу нијансу сиве, где се R, G и B компоненте рачунају по следећој формули: &amp;lt;code&amp;gt;R, G, B = 0.3 * R + 0.59 * G + 0.11 * B&amp;lt;/code&amp;gt;&lt;br /&gt;
* &#039;&#039;Invert&#039;&#039; – R, G и B компоненте сваког пиксела се инвертују по следећој формули: &amp;lt;code&amp;gt;R = 255 – R, G = 255 – G, B = 255 – B&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Клијент који користи слику може да прочита вредности њених пиксела; уколико су на слику примењени филтери, то су вредности пиксела оригиналне слике измењене дејством додатих филтера (у случају да ниједан филтер није примењен над оригиналном сликом, враћа се неизмењен низ пиксела оригиналне слике). Коришћењем пројектног обрасца Декоратер (Decorator) потребно је имплементирати описани део система и навести расподелу улога из обрасца класама у овом решењу; опис дати у текстуалном фајлу z1.txt. &lt;br /&gt;
&lt;br /&gt;
Написати пример коришћења дате сарадње. Направити слику са филтерима Greyscale и Invert, са неким насумичним вредностима пиксела, а затим дохватити пикселе такве слике и исписати их. Имплементација пиксела приказана је у следећој класи:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package zad1;&lt;br /&gt;
&lt;br /&gt;
public class Pixel {&lt;br /&gt;
    private int R, G, B;&lt;br /&gt;
&lt;br /&gt;
    public Pixel(int R, int G, int B) {&lt;br /&gt;
        this.R = R;&lt;br /&gt;
        this.G = G;&lt;br /&gt;
        this.B = B;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public int getR() {&lt;br /&gt;
        return R;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void setR(int R) {&lt;br /&gt;
        this.R = R;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public int getG() {&lt;br /&gt;
        return G;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void setG(int G) {&lt;br /&gt;
        this.G = G;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public int getB() {&lt;br /&gt;
        return B;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void setB(int B) {&lt;br /&gt;
        this.B = B;&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;
У овом задатку потребно је користити узорак Декоратер, а у изради се користио и узорак Шаблонски метод.&lt;br /&gt;
&lt;br /&gt;
; Декоратер&lt;br /&gt;
: Учесници:&lt;br /&gt;
:* Компонента (Image)&lt;br /&gt;
:* Субјекат (RawImage)&lt;br /&gt;
:* Допуна (Filter)&lt;br /&gt;
:* КонкретнаДопуна (Greyscale, Inverse)&lt;br /&gt;
; Шаблонски метод&lt;br /&gt;
: Учесници:&lt;br /&gt;
:* АпстрактнаКласа (Filter)&lt;br /&gt;
:* КонкретнаКласа (Greyscale, Inverse)&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;Image.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package z1;&lt;br /&gt;
&lt;br /&gt;
import java.util.List;&lt;br /&gt;
&lt;br /&gt;
public interface Image {&lt;br /&gt;
    public List&amp;lt;Pixel&amp;gt; getPixels();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;RawImage.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package z1;&lt;br /&gt;
&lt;br /&gt;
import java.util.ArrayList;&lt;br /&gt;
import java.util.List;&lt;br /&gt;
&lt;br /&gt;
public class RawImage implements Image {&lt;br /&gt;
    protected List&amp;lt;Pixel&amp;gt; pixels = new ArrayList&amp;lt;Pixel&amp;gt;();&lt;br /&gt;
&lt;br /&gt;
    public RawImage(List&amp;lt;Pixel&amp;gt; pixels) {&lt;br /&gt;
        this.pixels = pixels;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public List&amp;lt;Pixel&amp;gt; getPixels() {&lt;br /&gt;
        return pixels;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;Filter.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package z1;&lt;br /&gt;
&lt;br /&gt;
import java.util.ArrayList;&lt;br /&gt;
import java.util.List;&lt;br /&gt;
&lt;br /&gt;
public abstract class Filter implements Image{&lt;br /&gt;
    private Image image; //image that we wrap/decorate&lt;br /&gt;
&lt;br /&gt;
    public Filter(Image image){&lt;br /&gt;
        this.image = image;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    protected abstract Pixel modifyPixel(Pixel p);&lt;br /&gt;
&lt;br /&gt;
    private List&amp;lt;Pixel&amp;gt; applyFilter(List&amp;lt;Pixel&amp;gt; pixels){&lt;br /&gt;
        List&amp;lt;Pixel&amp;gt; modifiedPixels = new ArrayList&amp;lt;Pixel&amp;gt;();&lt;br /&gt;
        for (Pixel pixel : pixels){&lt;br /&gt;
            modifiedPixels.add(modifyPixel(pixel));&lt;br /&gt;
        }&lt;br /&gt;
        return modifiedPixels;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public List&amp;lt;Pixel&amp;gt; getPixels() {&lt;br /&gt;
        return applyFilter(this.image.getPixels());&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;Greyscale.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package z1;&lt;br /&gt;
&lt;br /&gt;
public class Greyscale extends Filter{&lt;br /&gt;
    public Greyscale(Image i) {&lt;br /&gt;
        super(i);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    protected Pixel modifyPixel(Pixel p){&lt;br /&gt;
        int grey = (int) (p.getR()*0.3) +  (int) (p.getG()*0.59) + (int) (p.getB()*0.11);&lt;br /&gt;
        return new Pixel(grey, grey, grey&lt;br /&gt;
        );&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;Invert.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package z1;&lt;br /&gt;
&lt;br /&gt;
public class Invert extends Filter {&lt;br /&gt;
    public Invert(Image i) {&lt;br /&gt;
        super(i);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private final int invertFactor = 255;&lt;br /&gt;
&lt;br /&gt;
    protected Pixel modifyPixel(Pixel p) {&lt;br /&gt;
        return new Pixel(&lt;br /&gt;
                invertFactor - p.getR(),&lt;br /&gt;
                invertFactor - p.getG(),&lt;br /&gt;
                invertFactor - p.getB()&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;
==== &amp;lt;code&amp;gt;Main.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package z1;&lt;br /&gt;
&lt;br /&gt;
import java.util.Arrays;&lt;br /&gt;
import java.util.List;&lt;br /&gt;
&lt;br /&gt;
public class Main {&lt;br /&gt;
&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        List&amp;lt;Pixel&amp;gt; pixels = Arrays.asList(new Pixel(2, 2, 2), new Pixel(2, 3, 4), new Pixel(100, 200, 255));&lt;br /&gt;
        Image myImage = new RawImage(pixels);&lt;br /&gt;
        for (Pixel p : myImage.getPixels()) {&lt;br /&gt;
            System.out.println(p.toString());&lt;br /&gt;
        }&lt;br /&gt;
        Image myFilteredImage = new Invert(new Greyscale(myImage));&lt;br /&gt;
        for  (Pixel p : myFilteredImage.getPixels()) {&lt;br /&gt;
            System.out.println(p.toString());&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;
=== Поставка ===&lt;br /&gt;
Посматра се део система који симулира карташку игру. Пре почетка игре, играчи могу да се пријаве делиоцу карата („крупијеу“) за учествовање у игри и могу да се одјаве након завршене игре. Игра се игра тако да у њој може учествовати различит број играча и током игре играчи не разговарају један са другим. Број играча је увек довољно мали да је са њима прихватљива синхрона комуникација. Након што се игра покрене, сваки играч од крупијеа добија по две насумичне карте (којих је само он свестан). Потом крупије открива једну од преосталих карата и сви играчи се обавештавају о карти која је откривена. На основу ових информација, сваки играч може да одлучи колико ће новца уложити. Неки играчи играју агресивно, а неки штедљиво; начин играња може да се конфигурише за сваког играча различито, при чему се предвиђа осмишљавање нових различитих начина игре, па различити играчи са истим информацијама улажу различиту количину новца. Након што сви играчи уложе свој новац, следи поново откривање нове карте око које се играчи обавештавају и након чега сваки може поново да уложи новац. Ово се понавља пет пута по игри, на крају чега играч са најбољом комбинацијом карата добија сав новац и игра се завршава. Логика одабира победника се такође може мењати од игре до игре, мада конкретна имплементација ове логике није од интереса за овај задатак.&lt;br /&gt;
&lt;br /&gt;
Дорадити и исправити дату имплементацију система коришћењем одговарајућих пројектних образаца. Навести све примене пројектних образаца у систему са кратким образложењем у текстуалном фајлу z2.txt (једна до две реченице).&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
==== Сарадња ====&lt;br /&gt;
У овом задатку су искоришћени узорци Уникат, Посматрач и Стратегија.&lt;br /&gt;
&lt;br /&gt;
; Уникат&lt;br /&gt;
: Учесници:&lt;br /&gt;
:* Уникат (Croupier)&lt;br /&gt;
; Посматрач&lt;br /&gt;
: Учесници:&lt;br /&gt;
:* КонкретанСубјекат (Croupier)&lt;br /&gt;
:* КонкретанПосматрач (Player)&lt;br /&gt;
; Стратегија:&lt;br /&gt;
: Учесници:&lt;br /&gt;
:* Контекст (Player)&lt;br /&gt;
:* Стратегија (PlayingStrategy)&lt;br /&gt;
:* КонкретнаСтратегија (AggresiveStrategy, ScroogeStrategy)&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;Card.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package z2;&lt;br /&gt;
&lt;br /&gt;
public class Card {&lt;br /&gt;
&lt;br /&gt;
    public enum CardSuit {DIAMOND, CLUB, HEART, SPADE};&lt;br /&gt;
    public static final int NUMBER_OF_CARDS = 14;&lt;br /&gt;
    public static final int NUMBER_OF_SUITS = 4;&lt;br /&gt;
    private int number;&lt;br /&gt;
    private CardSuit cardSuit;&lt;br /&gt;
&lt;br /&gt;
    public int getNumber() {&lt;br /&gt;
        return number;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void setNumber(int number) {&lt;br /&gt;
        this.number = number;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public CardSuit getCardSuit() {&lt;br /&gt;
        return cardSuit;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void setCardSuit(CardSuit cardSuit) {&lt;br /&gt;
        this.cardSuit = cardSuit;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public Card(int number, int cardSuitIndex) {&lt;br /&gt;
        this.number = number;&lt;br /&gt;
        this.cardSuit = CardSuit.values()[cardSuitIndex];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;PlayingStrategy.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package z2;&lt;br /&gt;
&lt;br /&gt;
import java.util.List;&lt;br /&gt;
&lt;br /&gt;
public abstract class PlayingStrategy {&lt;br /&gt;
    public abstract double playAMove(Card[] myCards, List&amp;lt;Card&amp;gt; tableCards);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;ScroogeStrategy.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package z2;&lt;br /&gt;
&lt;br /&gt;
import java.util.List;&lt;br /&gt;
&lt;br /&gt;
public class ScroogeStrategy extends PlayingStrategy {&lt;br /&gt;
    @Override&lt;br /&gt;
    public double playAMove(Card[] cardsInHand, List&amp;lt;Card&amp;gt; tableCards) {&lt;br /&gt;
        double bettingMoney;&lt;br /&gt;
        int numCardsOnTable = tableCards.size();&lt;br /&gt;
        bettingMoney = numCardsOnTable * 0.2 + cardsInHand.length * 0.1;&lt;br /&gt;
        return bettingMoney;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;AggresiveStrategy.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package z2;&lt;br /&gt;
&lt;br /&gt;
import java.util.List;&lt;br /&gt;
&lt;br /&gt;
public class AggresiveStrategy extends PlayingStrategy {&lt;br /&gt;
    @Override&lt;br /&gt;
    public double playAMove(Card[] cardsInHand, List&amp;lt;Card&amp;gt; tableCards) {&lt;br /&gt;
        double bettingMoney;&lt;br /&gt;
        int numCardsOnTable = tableCards.size();&lt;br /&gt;
        bettingMoney = numCardsOnTable * 0.5 + cardsInHand.length * 0.3;&lt;br /&gt;
        return bettingMoney;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;Croupier.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package z2;&lt;br /&gt;
&lt;br /&gt;
import java.util.ArrayList;&lt;br /&gt;
import java.util.List;&lt;br /&gt;
import java.util.Random;&lt;br /&gt;
&lt;br /&gt;
import static z2.Card.*;&lt;br /&gt;
&lt;br /&gt;
public class Croupier {&lt;br /&gt;
&lt;br /&gt;
    private static final int NUMBER_OF_TURNS = 5;&lt;br /&gt;
    private boolean isGameInProgress = false;&lt;br /&gt;
&lt;br /&gt;
    private Random randomGenerator = new Random();&lt;br /&gt;
    private List&amp;lt;Player&amp;gt; playersInGame = new ArrayList&amp;lt;&amp;gt;();&lt;br /&gt;
    private List&amp;lt;Card&amp;gt; cardsOnTable = new ArrayList&amp;lt;&amp;gt;();&lt;br /&gt;
&lt;br /&gt;
    private double moneyPot = 0;&lt;br /&gt;
&lt;br /&gt;
    private Croupier() {}&lt;br /&gt;
&lt;br /&gt;
    private volatile static Croupier instance = null;&lt;br /&gt;
&lt;br /&gt;
    public static Croupier getInstance() {&lt;br /&gt;
        //Thread safe variant with minimal critical section&lt;br /&gt;
        if (instance == null) {&lt;br /&gt;
            synchronized (Croupier.class) {&lt;br /&gt;
                if (instance == null) {&lt;br /&gt;
                    instance = new Croupier();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        return instance;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* join and leave are subscription methods for concrete subject in Observer */&lt;br /&gt;
    public void join(Player player) {&lt;br /&gt;
        if(!isGameInProgress) {&lt;br /&gt;
            this.playersInGame.add(player);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void leave(Player player) {&lt;br /&gt;
        if(!isGameInProgress) {&lt;br /&gt;
            this.playersInGame.remove(player);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public List&amp;lt;Card&amp;gt; getTable(){&lt;br /&gt;
        return cardsOnTable;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void simulateGame() {&lt;br /&gt;
        isGameInProgress = true;&lt;br /&gt;
        for (Player player: playersInGame) {&lt;br /&gt;
            player.setCardsInHand(&lt;br /&gt;
                    new Card[]{&lt;br /&gt;
                            drawCardFromDeck(),&lt;br /&gt;
                            drawCardFromDeck()&lt;br /&gt;
                    }&lt;br /&gt;
            );&lt;br /&gt;
        }&lt;br /&gt;
        cardsOnTable.clear();&lt;br /&gt;
        moneyPot = 0;&lt;br /&gt;
        for(int i = 0; i &amp;lt; NUMBER_OF_TURNS; i++) {&lt;br /&gt;
            Card newCard = drawCardFromDeck();&lt;br /&gt;
            cardsOnTable.add(newCard);&lt;br /&gt;
            for(Player player: playersInGame) {&lt;br /&gt;
                moneyPot += player.update(newCard);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        Player player = defineWinner();&lt;br /&gt;
        player.addMoney(moneyPot);&lt;br /&gt;
        System.out.println(&lt;br /&gt;
                &amp;quot;Winning player with ID: &amp;quot; + player.getPlayer_id() +&lt;br /&gt;
                &amp;quot;, currently has: &amp;quot; + player.getMoney());&lt;br /&gt;
        isGameInProgress = false;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private Player defineWinner() {&lt;br /&gt;
        // TODO: Should be a few declaring winner tactics, not currently important.&lt;br /&gt;
        return playersInGame.get(randomGenerator.nextInt(playersInGame.size()));&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private Card drawCardFromDeck() {&lt;br /&gt;
        return new Card(&lt;br /&gt;
                randomGenerator.nextInt(NUMBER_OF_CARDS),&lt;br /&gt;
                randomGenerator.nextInt(NUMBER_OF_SUITS)&lt;br /&gt;
        );&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;Player.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package z2;&lt;br /&gt;
&lt;br /&gt;
import java.util.ArrayList;&lt;br /&gt;
import java.util.List;&lt;br /&gt;
&lt;br /&gt;
public class Player implements Observer {&lt;br /&gt;
    private Croupier croupier;&lt;br /&gt;
    private PlayingStrategy playingStrategy;&lt;br /&gt;
    public Player(Croupier c, PlayingStrategy playingStrategy) {&lt;br /&gt;
        croupier = c;&lt;br /&gt;
        this.playingStrategy = playingStrategy;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private static final double STARTING_MONEY = 10;&lt;br /&gt;
    private Card cardsInHand[];&lt;br /&gt;
    private double money = STARTING_MONEY;&lt;br /&gt;
    private boolean aggressive = true;&lt;br /&gt;
    private static int ID = 0;&lt;br /&gt;
    private int player_id = ID++;&lt;br /&gt;
&lt;br /&gt;
    private List&amp;lt;Card&amp;gt; tableCards = new ArrayList&amp;lt;Card&amp;gt;();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    public int getPlayer_id() {&lt;br /&gt;
        return player_id;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public Card[] getCardsInHand() {&lt;br /&gt;
        return cardsInHand;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void setCardsInHand(Card[] cardsInHand) {&lt;br /&gt;
        this.cardsInHand = cardsInHand;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public double getMoney() {&lt;br /&gt;
        return money;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void addMoney(double money) {&lt;br /&gt;
        this.money += money;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public boolean isAggressive() {&lt;br /&gt;
        return aggressive;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void setAggressive(boolean aggressive) {&lt;br /&gt;
        this.aggressive = aggressive;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public double update(Card newCard) {&lt;br /&gt;
        tableCards.add(newCard);&lt;br /&gt;
        double bettingMoney;&lt;br /&gt;
        bettingMoney = playingStrategy.playAMove(cardsInHand, tableCards);&lt;br /&gt;
        bettingMoney = bettingMoney &amp;gt; money ? money : bettingMoney;&lt;br /&gt;
        money -= bettingMoney;&lt;br /&gt;
        return bettingMoney;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void resetGame() {&lt;br /&gt;
        this.tableCards.clear();&lt;br /&gt;
        this.cardsInHand = null;&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>Aleksa</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9F%D1%80%D0%BE%D1%98%D0%B5%D0%BA%D1%82%D0%BE%D0%B2%D0%B0%D1%9A%D0%B5_%D1%81%D0%BE%D1%84%D1%82%D0%B2%D0%B5%D1%80%D0%B0/%D0%9A1_2024&amp;diff=8183</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%D1%98%D0%B5%D0%BA%D1%82%D0%BE%D0%B2%D0%B0%D1%9A%D0%B5_%D1%81%D0%BE%D1%84%D1%82%D0%B2%D0%B5%D1%80%D0%B0/%D0%9A1_2024&amp;diff=8183"/>
		<updated>2025-12-01T23:14:09Z</updated>

		<summary type="html">&lt;p&gt;Aleksa: /* Croupier.java */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&#039;&#039;&#039;Први колоквијум 2024. године&#039;&#039;&#039; одржан је 27. октобра 2024. године. Биле су доступне презентације о свим пројектним обрасцима, као и &#039;&#039;Java&#039;&#039; документација. Време за израду је било 120 минута.&lt;br /&gt;
&lt;br /&gt;
== 1. задатак ==&lt;br /&gt;
=== Поставка ===&lt;br /&gt;
Посматра се систем за приказ и обраду дигиталних слика. Треба обезбедити то да се на оригиналну слику може применити произвољан број филтера (или ниједан), у произвољном редоследу, при чему остатак система који приказује и користи слику (“клијент”) не треба да види разлику у односу на то да ли су на слику примењени филтери или нису. Свака слика садржи низ пиксела. Пиксел има R, G и B компоненте (интензитет црвене, зелене и плаве боје), где свака има целобројну вредност од 0 до 255. Филтери који могу да се примене у овом систему су за сада (касније могу бити осмишљени и додати нови филтери):&lt;br /&gt;
* &#039;&#039;Greyscale&#039;&#039; – сваки пиксел се претвара у одговарајућу нијансу сиве, где се R, G и B компоненте рачунају по следећој формули: &amp;lt;code&amp;gt;R, G, B = 0.3 * R + 0.59 * G + 0.11 * B&amp;lt;/code&amp;gt;&lt;br /&gt;
* &#039;&#039;Invert&#039;&#039; – R, G и B компоненте сваког пиксела се инвертују по следећој формули: &amp;lt;code&amp;gt;R = 255 – R, G = 255 – G, B = 255 – B&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Клијент који користи слику може да прочита вредности њених пиксела; уколико су на слику примењени филтери, то су вредности пиксела оригиналне слике измењене дејством додатих филтера (у случају да ниједан филтер није примењен над оригиналном сликом, враћа се неизмењен низ пиксела оригиналне слике). Коришћењем пројектног обрасца Декоратер (Decorator) потребно је имплементирати описани део система и навести расподелу улога из обрасца класама у овом решењу; опис дати у текстуалном фајлу z1.txt. &lt;br /&gt;
&lt;br /&gt;
Написати пример коришћења дате сарадње. Направити слику са филтерима Greyscale и Invert, са неким насумичним вредностима пиксела, а затим дохватити пикселе такве слике и исписати их. Имплементација пиксела приказана је у следећој класи:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package zad1;&lt;br /&gt;
&lt;br /&gt;
public class Pixel {&lt;br /&gt;
    private int R, G, B;&lt;br /&gt;
&lt;br /&gt;
    public Pixel(int R, int G, int B) {&lt;br /&gt;
        this.R = R;&lt;br /&gt;
        this.G = G;&lt;br /&gt;
        this.B = B;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public int getR() {&lt;br /&gt;
        return R;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void setR(int R) {&lt;br /&gt;
        this.R = R;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public int getG() {&lt;br /&gt;
        return G;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void setG(int G) {&lt;br /&gt;
        this.G = G;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public int getB() {&lt;br /&gt;
        return B;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void setB(int B) {&lt;br /&gt;
        this.B = B;&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;
У овом задатку потребно је користити узорак Декоратер, а у изради се користио и узорак Шаблонски метод.&lt;br /&gt;
&lt;br /&gt;
; Декоратер&lt;br /&gt;
: Учесници:&lt;br /&gt;
:* Компонента (Image)&lt;br /&gt;
:* Субјекат (RawImage)&lt;br /&gt;
:* Допуна (Filter)&lt;br /&gt;
:* КонкретнаДопуна (Greyscale, Inverse)&lt;br /&gt;
; Шаблонски метод&lt;br /&gt;
: Учесници:&lt;br /&gt;
:* АпстрактнаКласа (Filter)&lt;br /&gt;
:* КонкретнаКласа (Greyscale, Inverse)&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;Image.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package z1;&lt;br /&gt;
&lt;br /&gt;
import java.util.List;&lt;br /&gt;
&lt;br /&gt;
public interface Image {&lt;br /&gt;
    public List&amp;lt;Pixel&amp;gt; getPixels();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;RawImage.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package z1;&lt;br /&gt;
&lt;br /&gt;
import java.util.ArrayList;&lt;br /&gt;
import java.util.List;&lt;br /&gt;
&lt;br /&gt;
public class RawImage implements Image {&lt;br /&gt;
    protected List&amp;lt;Pixel&amp;gt; pixels = new ArrayList&amp;lt;Pixel&amp;gt;();&lt;br /&gt;
&lt;br /&gt;
    public RawImage(List&amp;lt;Pixel&amp;gt; pixels) {&lt;br /&gt;
        this.pixels = pixels;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public List&amp;lt;Pixel&amp;gt; getPixels() {&lt;br /&gt;
        return pixels;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;Filter.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package z1;&lt;br /&gt;
&lt;br /&gt;
import java.util.ArrayList;&lt;br /&gt;
import java.util.List;&lt;br /&gt;
&lt;br /&gt;
public abstract class Filter implements Image{&lt;br /&gt;
    private Image image; //image that we wrap/decorate&lt;br /&gt;
&lt;br /&gt;
    public Filter(Image image){&lt;br /&gt;
        this.image = image;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    protected abstract Pixel modifyPixel(Pixel p);&lt;br /&gt;
&lt;br /&gt;
    private List&amp;lt;Pixel&amp;gt; applyFilter(List&amp;lt;Pixel&amp;gt; pixels){&lt;br /&gt;
        List&amp;lt;Pixel&amp;gt; modifiedPixels = new ArrayList&amp;lt;Pixel&amp;gt;();&lt;br /&gt;
        for (Pixel pixel : pixels){&lt;br /&gt;
            modifiedPixels.add(modifyPixel(pixel));&lt;br /&gt;
        }&lt;br /&gt;
        return modifiedPixels;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public List&amp;lt;Pixel&amp;gt; getPixels() {&lt;br /&gt;
        return applyFilter(this.image.getPixels());&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;Greyscale.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package z1;&lt;br /&gt;
&lt;br /&gt;
public class Greyscale extends Filter{&lt;br /&gt;
    public Greyscale(Image i) {&lt;br /&gt;
        super(i);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    protected Pixel modifyPixel(Pixel p){&lt;br /&gt;
        int grey = (int) (p.getR()*0.3) +  (int) (p.getG()*0.59) + (int) (p.getB()*0.11);&lt;br /&gt;
        return new Pixel(grey, grey, grey&lt;br /&gt;
        );&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;Invert.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package z1;&lt;br /&gt;
&lt;br /&gt;
public class Invert extends Filter {&lt;br /&gt;
    public Invert(Image i) {&lt;br /&gt;
        super(i);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private final int invertFactor = 255;&lt;br /&gt;
&lt;br /&gt;
    protected Pixel modifyPixel(Pixel p) {&lt;br /&gt;
        return new Pixel(&lt;br /&gt;
                invertFactor - p.getR(),&lt;br /&gt;
                invertFactor - p.getG(),&lt;br /&gt;
                invertFactor - p.getB()&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;
==== &amp;lt;code&amp;gt;Main.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package z1;&lt;br /&gt;
&lt;br /&gt;
import java.util.Arrays;&lt;br /&gt;
import java.util.List;&lt;br /&gt;
&lt;br /&gt;
public class Main {&lt;br /&gt;
&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        List&amp;lt;Pixel&amp;gt; pixels = Arrays.asList(new Pixel(2, 2, 2), new Pixel(2, 3, 4), new Pixel(100, 200, 255));&lt;br /&gt;
        Image myImage = new RawImage(pixels);&lt;br /&gt;
        for (Pixel p : myImage.getPixels()) {&lt;br /&gt;
            System.out.println(p.toString());&lt;br /&gt;
        }&lt;br /&gt;
        Image myFilteredImage = new Invert(new Greyscale(myImage));&lt;br /&gt;
        for  (Pixel p : myFilteredImage.getPixels()) {&lt;br /&gt;
            System.out.println(p.toString());&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;
=== Поставка ===&lt;br /&gt;
Посматра се део система који симулира карташку игру. Пре почетка игре, играчи могу да се пријаве делиоцу карата („крупијеу“) за учествовање у игри и могу да се одјаве након завршене игре. Игра се игра тако да у њој може учествовати различит број играча и током игре играчи не разговарају један са другим. Број играча је увек довољно мали да је са њима прихватљива синхрона комуникација. Након што се игра покрене, сваки играч од крупијеа добија по две насумичне карте (којих је само он свестан). Потом крупије открива једну од преосталих карата и сви играчи се обавештавају о карти која је откривена. На основу ових информација, сваки играч може да одлучи колико ће новца уложити. Неки играчи играју агресивно, а неки штедљиво; начин играња може да се конфигурише за сваког играча различито, при чему се предвиђа осмишљавање нових различитих начина игре, па различити играчи са истим информацијама улажу различиту количину новца. Након што сви играчи уложе свој новац, следи поново откривање нове карте око које се играчи обавештавају и након чега сваки може поново да уложи новац. Ово се понавља пет пута по игри, на крају чега играч са најбољом комбинацијом карата добија сав новац и игра се завршава. Логика одабира победника се такође може мењати од игре до игре, мада конкретна имплементација ове логике није од интереса за овај задатак.&lt;br /&gt;
&lt;br /&gt;
Дорадити и исправити дату имплементацију система коришћењем одговарајућих пројектних образаца. Навести све примене пројектних образаца у систему са кратким образложењем у текстуалном фајлу z2.txt (једна до две реченице).&lt;br /&gt;
&lt;br /&gt;
=== Решење ===&lt;br /&gt;
==== Сарадња ====&lt;br /&gt;
У овом задатку су искоришћени узорци Уникат, Посматрач и Стратегија.&lt;br /&gt;
&lt;br /&gt;
; Уникат&lt;br /&gt;
: Учесници:&lt;br /&gt;
:* Уникат (Croupier)&lt;br /&gt;
; Посматрач&lt;br /&gt;
: Учесници:&lt;br /&gt;
:* КонкретанСубјекат (Croupier)&lt;br /&gt;
:* КонкретанПосматрач (Player)&lt;br /&gt;
; Стратегија:&lt;br /&gt;
: Учесници:&lt;br /&gt;
:* Контекст (Player)&lt;br /&gt;
:* Стратегија (PlayingStrategy)&lt;br /&gt;
:* КонкретнаСтратегија (AggresiveStrategy, ScroogeStrategy)&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;Card.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package z2;&lt;br /&gt;
&lt;br /&gt;
public class Card {&lt;br /&gt;
&lt;br /&gt;
    public enum CardSuit {DIAMOND, CLUB, HEART, SPADE};&lt;br /&gt;
    public static final int NUMBER_OF_CARDS = 14;&lt;br /&gt;
    public static final int NUMBER_OF_SUITS = 4;&lt;br /&gt;
    private int number;&lt;br /&gt;
    private CardSuit cardSuit;&lt;br /&gt;
&lt;br /&gt;
    public int getNumber() {&lt;br /&gt;
        return number;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void setNumber(int number) {&lt;br /&gt;
        this.number = number;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public CardSuit getCardSuit() {&lt;br /&gt;
        return cardSuit;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void setCardSuit(CardSuit cardSuit) {&lt;br /&gt;
        this.cardSuit = cardSuit;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public Card(int number, int cardSuitIndex) {&lt;br /&gt;
        this.number = number;&lt;br /&gt;
        this.cardSuit = CardSuit.values()[cardSuitIndex];&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;PlayingStrategy.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package z2;&lt;br /&gt;
&lt;br /&gt;
import java.util.List;&lt;br /&gt;
&lt;br /&gt;
public abstract class PlayingStrategy {&lt;br /&gt;
    public abstract double playAMove(Card[] myCards, List&amp;lt;Card&amp;gt; tableCards);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;ScroogeStrategy.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package z2;&lt;br /&gt;
&lt;br /&gt;
import java.util.List;&lt;br /&gt;
&lt;br /&gt;
public class ScroogeStrategy extends PlayingStrategy {&lt;br /&gt;
    @Override&lt;br /&gt;
    public double playAMove(Card[] cardsInHand, List&amp;lt;Card&amp;gt; tableCards) {&lt;br /&gt;
        double bettingMoney;&lt;br /&gt;
        int numCardsOnTable = tableCards.size();&lt;br /&gt;
        bettingMoney = numCardsOnTable * 0.2 + cardsInHand.length * 0.1;&lt;br /&gt;
        return bettingMoney;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;AggresiveStrategy.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package z2;&lt;br /&gt;
&lt;br /&gt;
import java.util.List;&lt;br /&gt;
&lt;br /&gt;
public class AggresiveStrategy extends PlayingStrategy {&lt;br /&gt;
    @Override&lt;br /&gt;
    public double playAMove(Card[] cardsInHand, List&amp;lt;Card&amp;gt; tableCards) {&lt;br /&gt;
        double bettingMoney;&lt;br /&gt;
        int numCardsOnTable = tableCards.size();&lt;br /&gt;
        bettingMoney = numCardsOnTable * 0.5 + cardsInHand.length * 0.3;&lt;br /&gt;
        return bettingMoney;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;Croupier.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package z2;&lt;br /&gt;
&lt;br /&gt;
import java.util.ArrayList;&lt;br /&gt;
import java.util.List;&lt;br /&gt;
import java.util.Random;&lt;br /&gt;
&lt;br /&gt;
import static z2.Card.*;&lt;br /&gt;
&lt;br /&gt;
public class Croupier {&lt;br /&gt;
&lt;br /&gt;
    private static final int NUMBER_OF_TURNS = 5;&lt;br /&gt;
    private boolean isGameInProgress = false;&lt;br /&gt;
&lt;br /&gt;
    private Random randomGenerator = new Random();&lt;br /&gt;
    private List&amp;lt;Player&amp;gt; playersInGame = new ArrayList&amp;lt;&amp;gt;();&lt;br /&gt;
    private List&amp;lt;Card&amp;gt; cardsOnTable = new ArrayList&amp;lt;&amp;gt;();&lt;br /&gt;
&lt;br /&gt;
    private double moneyPot = 0;&lt;br /&gt;
&lt;br /&gt;
    private Croupier() {}&lt;br /&gt;
&lt;br /&gt;
    private volatile static Croupier instance = null;&lt;br /&gt;
&lt;br /&gt;
    public static Croupier getInstance() {&lt;br /&gt;
        //Thread safe variant with minimal critical section&lt;br /&gt;
        if (instance == null) {&lt;br /&gt;
            synchronized (Croupier.class) {&lt;br /&gt;
                if (instance == null) {&lt;br /&gt;
                    instance = new Croupier();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        return instance;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* join and leave are subscription methods for concrete subject in Observer */&lt;br /&gt;
    public void join(Player player) {&lt;br /&gt;
        if(!isGameInProgress) {&lt;br /&gt;
            this.playersInGame.add(player);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void leave(Player player) {&lt;br /&gt;
        if(!isGameInProgress) {&lt;br /&gt;
            this.playersInGame.remove(player);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public List&amp;lt;Card&amp;gt; getTable(){&lt;br /&gt;
        return cardsOnTable;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void simulateGame() {&lt;br /&gt;
        isGameInProgress = true;&lt;br /&gt;
        for (Player player: playersInGame) {&lt;br /&gt;
            player.setCardsInHand(&lt;br /&gt;
                    new Card[]{&lt;br /&gt;
                            drawCardFromDeck(),&lt;br /&gt;
                            drawCardFromDeck()&lt;br /&gt;
                    }&lt;br /&gt;
            );&lt;br /&gt;
        }&lt;br /&gt;
        cardsOnTable.clear();&lt;br /&gt;
        moneyPot = 0;&lt;br /&gt;
        for(int i = 0; i &amp;lt; NUMBER_OF_TURNS; i++) {&lt;br /&gt;
            Card newCard = drawCardFromDeck();&lt;br /&gt;
            cardsOnTable.add(newCard);&lt;br /&gt;
            for(Player player: playersInGame) {&lt;br /&gt;
                moneyPot += player.update(newCard);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        Player player = defineWinner();&lt;br /&gt;
        player.addMoney(moneyPot);&lt;br /&gt;
        System.out.println(&lt;br /&gt;
                &amp;quot;Winning player with ID: &amp;quot; + player.getPlayer_id() +&lt;br /&gt;
                &amp;quot;, currently has: &amp;quot; + player.getMoney());&lt;br /&gt;
        isGameInProgress = false;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private Player defineWinner() {&lt;br /&gt;
        // TODO: Should be a few declaring winner tactics, not currently important.&lt;br /&gt;
        return playersInGame.get(randomGenerator.nextInt(playersInGame.size()));&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private Card drawCardFromDeck() {&lt;br /&gt;
        return new Card(&lt;br /&gt;
                randomGenerator.nextInt(NUMBER_OF_CARDS),&lt;br /&gt;
                randomGenerator.nextInt(NUMBER_OF_SUITS)&lt;br /&gt;
        );&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;Player.java&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package z2;&lt;br /&gt;
&lt;br /&gt;
import java.util.ArrayList;&lt;br /&gt;
import java.util.List;&lt;br /&gt;
&lt;br /&gt;
public class Player {&lt;br /&gt;
    private Croupier croupier;&lt;br /&gt;
    private PlayingStrategy playingStrategy;&lt;br /&gt;
    public Player(Croupier c, PlayingStrategy playingStrategy) {&lt;br /&gt;
        croupier = c;&lt;br /&gt;
        this.playingStrategy = playingStrategy;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private static final double STARTING_MONEY = 10;&lt;br /&gt;
    private Card cardsInHand[];&lt;br /&gt;
    private double money = STARTING_MONEY;&lt;br /&gt;
    private boolean aggressive = true;&lt;br /&gt;
    private static int ID = 0;&lt;br /&gt;
    private int player_id = ID++;&lt;br /&gt;
&lt;br /&gt;
    private List&amp;lt;Card&amp;gt; tableCards = new ArrayList&amp;lt;Card&amp;gt;();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    public int getPlayer_id() {&lt;br /&gt;
        return player_id;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public Card[] getCardsInHand() {&lt;br /&gt;
        return cardsInHand;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void setCardsInHand(Card[] cardsInHand) {&lt;br /&gt;
        this.cardsInHand = cardsInHand;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public double getMoney() {&lt;br /&gt;
        return money;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void addMoney(double money) {&lt;br /&gt;
        this.money += money;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public boolean isAggressive() {&lt;br /&gt;
        return aggressive;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void setAggressive(boolean aggressive) {&lt;br /&gt;
        this.aggressive = aggressive;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public double update(Card newCard) {&lt;br /&gt;
        tableCards.add(newCard);&lt;br /&gt;
        double bettingMoney;&lt;br /&gt;
        bettingMoney = playingStrategy.playAMove(cardsInHand, tableCards);&lt;br /&gt;
        bettingMoney = bettingMoney &amp;gt; money ? money : bettingMoney;&lt;br /&gt;
        money -= bettingMoney;&lt;br /&gt;
        return bettingMoney;&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>Aleksa</name></author>
	</entry>
</feed>