Програмирање 2/К1П 2017 — разлика између измена

Извор: SI Wiki
Пређи на навигацију Пређи на претрагу
(Trenutno gotov jedan zadatak)
 
м (Ispravljen link + uvodni pasus)
 
(3 међуизмене истог корисника нису приказане)
Ред 1: Ред 1:
[https://rti.etf.bg.ac.rs/rti/ir1p2/resenja/SI1P2_1617_K1P_resenja.pdf Zadaci i rešenja na sajtu.]
{{tocright}}
'''Popravni prvi kolokvijum 2017. godine''' održan je 24. aprila. Zadaci i rešenja su dostupni sa [https://rti.etf.bg.ac.rs/rti/ir1p2/rokovi/2016_2017/13S111P2_K1_P_2016_2017_Resenja.pdf stranice predmeta.]


== Pitanja ==
== Pitanja ==
Ред 41: Ред 42:


=== Pitanje 2 ===
=== Pitanje 2 ===
Iz postavke zadatka imamo:
* <math>k = 5</math>
* <math>p = 6</math>
* <math>v = 15 = 2^4 - 1 \implies</math> IEEE standard
Prvi korak je pretvaranje brojeva u njihov binarni oblik:
* <math>A = 23.875 = 23 + 0.875 = 10111_2 + 0.111_2 = 10111.111_2 = 1.0111111_2 \cdot 2^4 \approx 1.1_2 \cdot 2^4</math>
* <math>B = 5.999 = 101.111_2... = 1.01111_2... \cdot 2^2 \approx 1.1_2 \cdot 2^4 = 0.011_2 \cdot 2^4</math>
* <math>A + B = (1.1_2 + 0.011_2) \cdot 2^4 = 1.111_2 \cdot 2^4 = 11110_2 = 30</math>
Tačan rezultat sabiranja 23.875 i 5.999 je 29.875, a razlika 29.875 i 30 je 0.126, pa je tačan odgovor pod '''A'''.


=== Pitanje 3 ===
* Na osnovu strukture <code>op</code> možemo zaključiti da će vrednosti njenih članova biti <code>mul = 0</code>, <code>div = 1</code>, <code>add = 2</code> i <code>sub = 3</code>.
* Vrednosti u nizu <code>niz</code> na početku biće <code>[5, 10, 12, 18, 31, ?, ?, ?, ?, ?]</code>.
* Unutrašnja petlja je napravljena da gurne sve elemente niza trenutno manje od <code>x</code> udesno i onda ubaci <code>x</code> na jedno mesto ispred poslednjeg broja manjeg od <code>x</code>. Nakon toga se poveća <code>n</code>, što bi trebalo da označava dužinu niza do koje elementi postoje.
Iteracija kroz petlju teče ovako:
* <code>i = 0</code>
** <code>niz[i] % 4 = 5 % 4 = 1</code> tako da padamo u <code>case div</code>.
** <code>x := niz[i] * niz[i + 1] = 5 * 10 = 50</code> (padamo na <code>default</code>)
** <code>niz[0] := niz[0] - 1 = 4</code>, <code>niz[1] := niz[1] + 1 = 11</code>
** Pošto je vrednost <code>x</code> (50) veća od svih ostalih vrednosti u nizu ona se gura na kraj niza. Stanje niza je: <code>[4, 11, 12, 18, 31, 50, ?, ?, ?, ?]</code>.
** <code>n := n + 1 = 6</code>
* <code>i = 1</code>
** <code>niz[i] % 4 = 11 % 4 = 3</code> tako da padamo na <code>case sub</code>.
** <code>x := x / (2 * 10) = 2</code>
*** U ovom koraku se pretpostavi da je veličina <code>short</code> tipa jednaka 2 bajta (iako to nigde nije naglašeno i ne piše u standardu)
** <code>i := i + 1 = 2</code> (broj iteracija se smanjuje za jedan)
** Unutrašnja petlja gurne sve elemente niza na desno i postavi 2 na početak. Trenutno stanje niza je <code>[2, 4, 11, 12, 18, 31, 50, ?, ?, ?]</code>.
* <code>i = 3</code>
** <code>niz[i] % 4 = 12 % 4 = 0</code> tako da padamo u <code>case mul</code>.
** <code>x := niz[i + 1] - niz[i] = 18 - 12 = 6</code>
** Stanje niza je isto kao i ranije.
* <code>i = 4</code>
** <code>niz[i] % 4 = 18 % 4 = 2</code> tako da padamo na <code>case add</code>.
** <code>x := niz[i] + niz[i + 1] = 49</code> (padamo na <code>case sub</code> i odavde se stvari nastavljaju slično kao za <code>i = 1</code>)
** <code>x := x / 20 = 2</code>
** <code>i := i + 1</code>
** Unutrašnja petlja ponovo dodaje 2 na početak niza tako da je trenutno stanje niza: <code>[2, 2, 4, 11, 12, 18, 31, 50, ?, ?]</code>
Krajnji ispis biće poznate vrednosti u nizu: <code>2 2 4 11 12 18 31 50</code> (odgovor pod '''B''').


=== Pitanje 3 ===
=== Pitanje 4 ===
=== Pitanje 4 ===
* <code>M = 8</code>, <code>N = 5</code>
* <code>mask := (1 << 3) - 1 = 4 - 1 = 3</code>
* <code>arr = [53, 156, 86, 13, 4]</code>
** Za potrebe zadatka nam je lakše da izrazimo ovaj niz kao binarne brojeve, pa dobijamo: <code>arr = [00110101, 10011100, 01010110, 00001101, 00000100]</code>.
* Nakon prve petlje dobijamo stanje niza <code>c = [2, 2, 0, 1, 0, 0, 0, 0]</code>.
* Prvi član <code>p</code> je nula a svi ostali zbir prošlog elementa <code>p</code> i njemu odgovarajućeg elementa iz <code>c</code> pa je stanje niza <code>p = [0, 2, 4, 4, 5, 5, 5, 5]</code>.
* Zatim se radi ispis elemenata <code>p</code> sličnom operacijom kao u prvoj petlji (dva puta će se ispisati prva dva elementa a jednom četvrti) s tim što se ispisani članovi niza povećavaju za jedan pri svakom ispisu.
Krajnji ispis je <code>2 0 4 3 1</code>, tako da je tačan odgovor pod '''B'''.
[[Категорија:Рокови]]
[[Категорија:Програмирање 2]]

Тренутна верзија на датум 30. октобар 2023. у 03:05

Popravni prvi kolokvijum 2017. godine održan je 24. aprila. Zadaci i rešenja su dostupni sa stranice predmeta.

Pitanja

Pitanje 1

Pošto nemamo mnogo izbora za i (zbog uslova da ) možemo da probamo svako od ponuđenih rešenja da vidimo koje radi. Iz uslova da je dobijamo da se u zadatku radi o IEEE standardu.

U slučaju da je dobijamo:

  • ,
  • ,
  • ,
  • ,

Uočimo da se sabiranjem ova dva broja ne može dobiti broj čija mantisa može stati u dva bita i nastavimo na sledeći izbor.

U slučaju da je dobijamo:

  • ,
  • ,
  • ,
  • ,

Pošto mantisa broja C ne može stati u tri bita, nastavljamo na sledeći izbor.

U slučaju da je dobijamo:

  • ,
  • ,
  • ,
  • ,

Pošto se ovaj broj može sačuvati na zadatim širinama tačno rešenje je pod C.

Pitanje 2

Iz postavke zadatka imamo:

  • IEEE standard

Prvi korak je pretvaranje brojeva u njihov binarni oblik:

Tačan rezultat sabiranja 23.875 i 5.999 je 29.875, a razlika 29.875 i 30 je 0.126, pa je tačan odgovor pod A.

Pitanje 3

  • Na osnovu strukture op možemo zaključiti da će vrednosti njenih članova biti mul = 0, div = 1, add = 2 i sub = 3.
  • Vrednosti u nizu niz na početku biće [5, 10, 12, 18, 31, ?, ?, ?, ?, ?].
  • Unutrašnja petlja je napravljena da gurne sve elemente niza trenutno manje od x udesno i onda ubaci x na jedno mesto ispred poslednjeg broja manjeg od x. Nakon toga se poveća n, što bi trebalo da označava dužinu niza do koje elementi postoje.

Iteracija kroz petlju teče ovako:

  • i = 0
    • niz[i] % 4 = 5 % 4 = 1 tako da padamo u case div.
    • x := niz[i] * niz[i + 1] = 5 * 10 = 50 (padamo na default)
    • niz[0] := niz[0] - 1 = 4, niz[1] := niz[1] + 1 = 11
    • Pošto je vrednost x (50) veća od svih ostalih vrednosti u nizu ona se gura na kraj niza. Stanje niza je: [4, 11, 12, 18, 31, 50, ?, ?, ?, ?].
    • n := n + 1 = 6
  • i = 1
    • niz[i] % 4 = 11 % 4 = 3 tako da padamo na case sub.
    • x := x / (2 * 10) = 2
      • U ovom koraku se pretpostavi da je veličina short tipa jednaka 2 bajta (iako to nigde nije naglašeno i ne piše u standardu)
    • i := i + 1 = 2 (broj iteracija se smanjuje za jedan)
    • Unutrašnja petlja gurne sve elemente niza na desno i postavi 2 na početak. Trenutno stanje niza je [2, 4, 11, 12, 18, 31, 50, ?, ?, ?].
  • i = 3
    • niz[i] % 4 = 12 % 4 = 0 tako da padamo u case mul.
    • x := niz[i + 1] - niz[i] = 18 - 12 = 6
    • Stanje niza je isto kao i ranije.
  • i = 4
    • niz[i] % 4 = 18 % 4 = 2 tako da padamo na case add.
    • x := niz[i] + niz[i + 1] = 49 (padamo na case sub i odavde se stvari nastavljaju slično kao za i = 1)
    • x := x / 20 = 2
    • i := i + 1
    • Unutrašnja petlja ponovo dodaje 2 na početak niza tako da je trenutno stanje niza: [2, 2, 4, 11, 12, 18, 31, 50, ?, ?]

Krajnji ispis biće poznate vrednosti u nizu: 2 2 4 11 12 18 31 50 (odgovor pod B).

Pitanje 4

  • M = 8, N = 5
  • mask := (1 << 3) - 1 = 4 - 1 = 3
  • arr = [53, 156, 86, 13, 4]
    • Za potrebe zadatka nam je lakše da izrazimo ovaj niz kao binarne brojeve, pa dobijamo: arr = [00110101, 10011100, 01010110, 00001101, 00000100].
  • Nakon prve petlje dobijamo stanje niza c = [2, 2, 0, 1, 0, 0, 0, 0].
  • Prvi član p je nula a svi ostali zbir prošlog elementa p i njemu odgovarajućeg elementa iz c pa je stanje niza p = [0, 2, 4, 4, 5, 5, 5, 5].
  • Zatim se radi ispis elemenata p sličnom operacijom kao u prvoj petlji (dva puta će se ispisati prva dva elementa a jednom četvrti) s tim što se ispisani članovi niza povećavaju za jedan pri svakom ispisu.

Krajnji ispis je 2 0 4 3 1, tako da je tačan odgovor pod B.