Програмирање 2/К1 2017 — разлика између измена
Пређи на навигацију
Пређи на претрагу
м (Kategorizacija) |
м (Zapravo ispravljen link) |
||
| (Нису приказане 3 међуизмене 2 корисника) | |||
| Ред 1: | Ред 1: | ||
[https://rti.etf.bg.ac.rs/rti/ir1p2/ | {{tocright}} | ||
'''Prvi kolokvijum 2017. godine''' održan je 20. marta. Zadaci i rešenja su dostupni sa [https://rti.etf.bg.ac.rs/rti/ir1p2/rokovi/2016_2017/13S111P2_K1_2016_2017_Resenja.pdf stranice predmeta.] | |||
== Zadatak == | |||
<syntaxhighlight lang="c"> | |||
#include <stdio.h> | |||
#define LIMIT 30 | |||
int main() { | |||
char num[LIMIT] = { 0 }, c; | |||
int cnt = 0, dotOccured= 0; | |||
while (cnt <= LIMIT) { | |||
do { | |||
c = getchar(); | |||
} while (c!='1' && c!='0' && c!='.' && c!='\n' || dotOccured && c=='.'); //1 0 . '\n' su dozvoljeni | |||
if (c == '\n') | |||
break; | |||
else if (!dotOccured && c == '.' ) { | |||
dotOccured = 1; | |||
} | |||
num[cnt++] = c; | |||
} | |||
printf("%s", num); | |||
//obrada | |||
double whole = 0; | |||
for (int i = 0; i < cnt && num[i] !='.'; i++) { | |||
whole = whole * 2 + num[i] - '0'; | |||
} | |||
double frac = 0; | |||
if (dotOccured) { | |||
for (int i = cnt - 1; i >= 0 && num[i] != '.'; i--) { | |||
frac = (double)(frac + num[i] - '0') / 2; | |||
} | |||
} | |||
printf("\n%.3lf", whole + frac); | |||
return 0; | |||
} | |||
</syntaxhighlight> | |||
== Pitanja == | == Pitanja == | ||
=== Pitanje 1 === | === Pitanje 1 === | ||
Тренутна верзија на датум 30. октобар 2023. у 03:30
Prvi kolokvijum 2017. godine održan je 20. marta. Zadaci i rešenja su dostupni sa stranice predmeta.
Zadatak
#include <stdio.h>
#define LIMIT 30
int main() {
char num[LIMIT] = { 0 }, c;
int cnt = 0, dotOccured= 0;
while (cnt <= LIMIT) {
do {
c = getchar();
} while (c!='1' && c!='0' && c!='.' && c!='\n' || dotOccured && c=='.'); //1 0 . '\n' su dozvoljeni
if (c == '\n')
break;
else if (!dotOccured && c == '.' ) {
dotOccured = 1;
}
num[cnt++] = c;
}
printf("%s", num);
//obrada
double whole = 0;
for (int i = 0; i < cnt && num[i] !='.'; i++) {
whole = whole * 2 + num[i] - '0';
}
double frac = 0;
if (dotOccured) {
for (int i = cnt - 1; i >= 0 && num[i] != '.'; i--) {
frac = (double)(frac + num[i] - '0') / 2;
}
}
printf("\n%.3lf", whole + frac);
return 0;
}
Pitanja
Pitanje 1
- Iz ograničenja mantise možemo videti da se radi o VAX standardu.
Možemo videti na osnovu cifara mantise broja da bi p moralo da bude barem 9 kako bi sve cifre stale.
Takođe, na osnovu eksponenata brojeva , i možemo zaključiti da mora da uključuje 5, 6 i 7 u svoj opseg. Isprobavanjem različitih vrednosti dobijamo da za vrednost višak ima vrednost a vrednosti na četiri bita idu od 0 do 15, pa je opseg i vrednosti 5, 6 i 7 jesu u tom opsegu.
Tačan odgovor je stoga pod A.
Pitanje 2
Pitanje 3
a := 0b := 15k := 32n := 15- Uslov
b < 16je ispunjen a uslovb % 3se evaluira na 0, tako da se izvršavaelsegrana unutrašnjegif-a, tako da jek := 5. n := n + k = 15 + 5 = 20
Izvršavanje petlje teče ovako:
i = 0i % b = 0 % 15 = 0pa padamo nadefaulti nastavljamo u sledeću iteraciju. Ovo se dešava za svaki broj čiji moduo po 15 nije 4, 9 ili 14.
i = 4(padamo ucase 4)a := a + 2 = 2a := a / 2 = 1
i = 9(padamo ucase 9)a := a + 3 = 4a := a / 2 = 2
i = 14(padamo ucase 14)a := a + 4 = 6(padamo ucase 9)a := a + 3 = 9a := a / 2 = 4
i = 19(padamo ucase 4)a := a + 2 = 6a := a / 2 = 3
Krajnji rezultat je a = 3, tako da je tačan odgovor pod B.
Pitanje 4
- Stanje niza
arrna početku je[40, 17, 14, 21, 0]. Pošto nam više odgovara kada bi ovaj niz bio u binarnom formatu (zbog binarnih operacija koje ćemo nad njim izvršavati), možemo ga izraziti kao[00101000, 00010001, 00001110, 00010101, 00000000]. n := 5- Možemo primetiti da se petlja neće izvršavati nad elementima niza koji su neparni (poslednji bit im je 1).
Izvršavanje petlje teče ovako:
i = 0c := 1v := arr[i] = 00101000v & 0xff = 00101000 & 11111111 = 101000 != 0(prviifse neće izvršiti)v & 0xf = 00101000 & 00001111 = 1000 != 0(drugiifse neće izvršiti)v & 0x3 = 00101000 & 00000011 = 0(trećiifće se izvršiti)v := v >> 2 = 1010(v := 10)c := c + 2 = 3c := c - (v & 0x1) = 3 - (1010 & 0001) = 3 - 0 = 3- Ispisuje se
3.
i = 1- Broj je neparan pa se preskače
i = 2c := 1v := arr[i] = 00001110v & 0xff = 00001110 & 11111111 = 00001110 != 0(prviifse neće izvršiti)v & 0xf = 00001110 & 00001111 = 1110 != 0(drugiifse neće izvršiti)v & 0x3 = 00001110 & 00000011 = 10 != 0(trećiifse neće izvršiti)c := c - (v & 0x1) = 1 - (1110 & 0001) = 1 - 0 = 1- Ispisuje se
1.
i = 3- Broj je neparan pa se preskače
i = 4c := 1v := arr[i] = 0- Svi
if-ovi će se izvršiti jer je bitovsko I sa nulom uvek nula. c := c + 8 + 4 + 2 = 15c := c - (v & 0x1) = 15 - 0 = 15- Ispisuje se
15.
Na kraju je ispisano 3 1 15 tako da je tačan odgovor pod B.