ELEKTROTEHNIČKI FAKULTET UNIVERZITETA U BEOGRADU PROGRAMIRANJE 2 MATERIJALI ZA PRIPREMU ISPITA. verzija:

Like dokumenter
Programiranje 1 grupno spremanje (zadaci) datoteke

Zadatak 1 strukture (C110) P2: Jedanaesta nedelja Strukture i liste. Strukture na jeziku C (2) Strukture na jeziku C (1)

Strukture. Strukturirani (složeni) tip podataka koji definiše korisnik. Razlike u odnosu na niz

Složeni tipovi podataka

Del 1 En oversikt over C-programmering

1. 0BLINEARNE STRUKTURE PODATAKA

Kapittel 1 En oversikt over C-språket

/* Adresu promenjive x zapamticemo u novoj promeljivoj. Nova promenljiva je tipa pokazivaca na int (int*) */ int* px;

1 REALNE FUNKCIJE REALNE VARIJABLE

4. Grafič ke funkčije

Uvod u Veb i Internet tehnologije HTML

1. DHB-E 18/21/24 Sli art ELEKTRONIČKI PROTOČNI GRIJAČ VODE

Rapport Semesteroppgave i datasikkerhet Harald Dahle (795955) og Joakim L. Gilje (796196)

Neprekidne funkcije nestandardni pristup

Oversikt. Introduksjon Kildekode Kompilering Hello world Hello world med argumenter. 1 C programmering. 2 Funksjoner. 3 Datatyper. 4 Pekere og arrays

Del 4 Noen spesielle C-elementer

do minimalno 8 kreativnih objava mjesečno Povlaštena cijena nakon završetka akcije: 900,00 kn

Oving 2. Oppgave 1. #include <stdio.h> int main(int argc, char **argv) { char *navn = argv[1]; printf ("Navnet ditt er %s\n", navn); } Oppgave 2

Ord og begreper. Norsk Morsmål: Tegning (hvis aktuelt)

Izmena i dopuna konkursne dokumentacije

Kartlegging av leseferdighet Trinn 2 og 3 på bosnisk

Programmeringsspråket C Del 2. Michael Welzl

Kako dostaviti logo. USBnet. Powered by

ALUMINIJSKE VODILICE ZA ODJELJIVANJE PROSTORA

IN 147 Program og maskinvare

Dagens tema. Kort repetisjon om rutiner. Programmering i C Variable og adresser. Vektorer. Tekster. Preprosessoren. Separat kompilering

IN 147 Program og maskinvare

Riješeni zadaci: Funkcije

Dagens tema: Datastrukturer

Del 2 Tabeller, arrays, strenger

ZADACI ZA KVALIFIKACIONI ISPIT IZ HEMIJE. 1. Napišite elektronsku konfiguraciju broma, čiji je atomski broj Z= 35.

IN 147 Program og maskinvare

Dagens tema INF1070. Info om C. Cs preprosessor. Feilsøking. Dag Langmyhr,Ifi,UiO: Forelesning 31. januar 2005 Ark 1 av 29

Informasjon om C. Dagens tema INF1070 INF1070 INF1070 INF1070. Den viktigste kilden til informasjon om C (utenom en god. C-funksjonene.

Vektorer. Dagens tema. Deklarasjon. Bruk

Dagens tema INF1070. Vektorer (array er) Tekster (string er) Adresser og pekere. Dynamisk allokering

Dagens tema. Rutiner i LC-2 Og her er tilsvarende kode for LC-2: Funksjoner i C Her er det samme programmet i C: Kort repetisjon om rutiner

IN 147 Program og maskinvare. Dagens tema

Repetisjon fra sist - 1: Plan for dagen. Repetisjon fra sist 2: Hva jeg glemte sist: Nyttige Kommandoer

Nybegynnerkurs i C. Øyvind Grønnesby. 14. oktober Introduksjon Typer Operatorer Kontrollstrukturer Pekere Makroer Lenker

Programmeringsspråket C Del 3. Hans Petter Taugbøl Kragset

MINIMARK stampac za industrijsko obelezavanje

Dagens tema. Adresser som parametre Dynamisk allokering Signaturer Definisjon av nye typenavn Typekonvertering Pekere og vektorer

Dagens tema C, adresser og pekere

Ark 3 av 26. printf("i adresse %08x ligger b med verdien %d.\n", &b, b); printf("i adresse %08x ligger a med verdien %d.

Programmeringsspråket C Del 3. Michael Welzl

Programmeringsspråket C Del 2. Hans Petter Taugbøl Kragset

56. TAKMIČENJE MLADIH MATEMATIČARA BOSNE I HERCEGOVINE

IN 147 Program og maskinvare

IN 147 Program og maskinvare

Pekere og vektorer. Dagens tema. I C gjelder en litt uventet konvensjon:

Dagens tema. Det siste om C Pekere og vektorer. Pekere til pekere. Vanlige pekerfeil. struct-er og typedef. Lister. Feilsøking

Dagens tema INF2270. Cs preprosessor. Separat kompilering av C funksjoner. C og minnet. Dag Langmyhr,Ifi,UiO: Forelesning 5. februar 2007 Ark 1 av 15

Dagens tema. C-programmering. Nøkkelen til å forstå C-programmering ligger i å forstå hvordan minnet brukes.

Primena računara u fizičkoj hemiji. Profesor: Miloš Mojović Asistent: Aleksandar Ignjatović

Dagens tema. C-programmering. Nøkkelen til å forstå C-programmering ligger i å forstå hvordan minnet brukes.

Objektno orijentisano programiranje 2. Tipovi podataka u C#

PC i multimedija 3. deo: Audio

EKSAMENSOPPGAVE. INF-1100 Innføring i programmering og datamaskiners virkemåte. Ingen. Elektronisk (WiseFlow) Robert Pettersen

GJØVIK INGENIØRHØGSKOLE

1 ØVING I WINDOWS FRA CHRISTIAN ANDOLO

Projekat EUROWEB+ Ovo je program namenjem isključivo razmeni, a ne celokupnim studijama.

VERTIKALNA POLARIZACIJA

SECURIT table za pisanje kredom TABLE STONE ZA PISANJE KREDOM ILI KREDA MARKEROM...

Sveučilište u Zagrebu PMF Matematički odsjek. Mreže računala. Vježbe 04. Zvonimir Bujanović Slaven Kožić Vinko Petričević

EKSAMEN. Operativsystemer. 1. Læreboken "A Practical Guide to Red Hat Linux" av Mark Sobell 2. Maks. tre A-4 ark med selvskrevne notater.

Løsningsforslag til eksamen i IN 147 og IN 147A

Administrivia INF 3110/ INF /02/2005 1

Dagens tema INF1070. Bit fikling. Makroer. Blanding av C og assemblerkode. Mer om Core War. Dag Langmyhr,Ifi,UiO: Forelesning 22. mai 2006 Ark 1 av 25

Løsningsforslag til 2. del av Del - EKSAMEN

Dagens tema. Er maskinen big endian? Denne funksjonen tester det: INF1070 INF1070 INF1070 INF1070

INF1000 (Uke 5) Mer om løkker, arrayer og metoder

Dagens tema. Cs preprosessor Separat kompilering av C-funksjoner C og minnet Oversikt over operatorene

KONTINUASJONSEKSAMEN

OSNOVNI KONCEPTI GRAFIČKOG PROGRAMIRANJA Interaktivna manipulacija oblikom igra glavnu ulogu u CAD/CAM/CAE sistemima. Programiranje koje kreira

Dagens tema INF1070. Signaturer. Typekonvertering. Pekere og vektorer. struct-er. Definisjon av nye typenavn. Lister

DO ŽIV LJA JI HAK L BE RI JA FI NA

PROJEKTOVANJE SOFTVERA

Programmeringsspråket C

IN 147 Program og maskinvare

HØGSKOLEN I SØR-TRØNDELAG Avdeling for informatikk og e-læring - AITeL

Minneområder Det er vanlig å dele opp minnet til en prosess i disse ulike områdene: Fast minne Store og små indianere «align» ing struct er

IN 147 Program og maskinvare

Dagens tema INF1070. Vektorer (array-er) Tekster (string-er) Adresser og pekere. Dynamisk allokering

Dagens tema. Cs preprosessor Separat kompilering av C-funksjoner C og minnet Oversikt over operatorene

Uvod u web dizajn i obrada slike

MODIFIKACIJE METODA MATEMATIČKOG PROGRAMIRANJA I PRIMENE

Topografske karte. Dr. sc. Aleksandar Toskić, izv. prof.

UNIVERSITETET I OSLO

HØGSKOLEN I SØR-TRØNDELAG Avdeling for informatikk og e-læring - AITeL

UNIVERSITETET I OSLO

Dagens tema. Mer om C Enkle datatyper Sammensatte datatyper: Vektorer og matriser Tekster Mengder Strukturer Unioner Ringbuffere

VOLKSWAGEN Golf V (1K) V TDi (AZV) Motor -> Priručnik za popravak -> Remen razvodnog mehanizma: uklanjanje/postavljanje

Dynamic Programming Longest Common Subsequence. Class 27

EKSAMENSOPPGAVE. INF-1100 Innføring i programmering og datamaskiners virkemåte. Teorifagb, hus 3, og og Adm.bygget, Aud.max og B.

Tru64: Uvod - alati i naredbe. Dinko Korunić, InfoMAR d.o.o. v1.2, travanj 2006.

Kondisjonstest. Algoritmer og datastrukturer. Python-oppgaver. Onsdag 6. oktober Her er noen repetisjonsoppgaver i Python.

K O N T I N U A S J O N S E K S A M E N

Cs preprosessor. Dagens tema. Betinget kompilering

Dagens tema. Dynamisk allokering Signaturer Definisjon av typer og nye typenavn Typekonvertering Pekere, vektorer og lister Dokumentasjon

Transkript:

ELEKTROTEHNIČKI FAKULTET UNIVERZITETA U BEOGRADU PROGRAMIRANJE 2 MATERIJALI ZA PRIPREMU ISPITA verzija: 06.07.2018. Studentima se savetuje da programski kod ne uče napamet. Za pisanje i testiranje rešenja zadataka se predlaže upotreba nekog od razvojnih okruženja za programski jezik C. Sadržaj: OO1P2, popravni kolokvijum, jul 2008. (I način)... 4 OO1P2, popravni kolokvijum, jul 2008. (II način)... 5 OO1P2, kolokvijum, april 2009.... 6 OO1P2, kolokvijum, april 2010.... 7 OO1P2, popravni kolokvijum, jun 2010.... 8 OO1P2, kolokvijum, april 2011.... 9 OO1P2, kolokvijum, april 2012.... 10 OO1P2, kolokvijum, april 2013.... 11 OO1P2, popravni kolokvijum, jun 2013.... 12 OO1P2, kolokvijum, april 2014.... 13 OO1P2, kolokvijum, april 2018.... 14 OO1P2, popravni kolokvijum, jun 2018.... 15 SI1P2, prvi kolokvijum, mart 2011.... 16 SI1P2, prvi kolokvijum, mart 2011.... 17 SI1P2, prvi kolokvijum, mart 2012.... 18 SI1P2, prvi kolokvijum, mart 2013.... 19 SI1P2, drugi kolokvijum, april 2013.... 20 SI1P2, treći kolokvijum, jun 2012.... 21 SI1P2, prvi kolokvijum, mart 2014.... 22 SI1P2, prvi kolokvijum, mart 2014.... 23

SI1P2, drugi kolokvijum, 2014.... 24 SI1P2, popravni drugi kolokvijum, jun 2014.... 25 SI1P2, prvi kolokvijum, mart 2015.... 27 SI1P2, drugi kolokvijum, 2015.... 28 SI1P2, popravni prvi kolokvijum, jun 2015.... 29 SI1P2, prvi kolokvijum, mart, 2017.... 30 SI1P2, prvi kolokvijum, mart 2018.... 31 SI1P2, popravni prvi kolokvijum, april 2018.... 32 P2, ispit, jun 2010.... 33 P2, ispit, septembar 2010.... 35 P2, ispit, jun 2011.... 37 P2, ispit, jun 2011.... 38 P2, ispit, jul 2011.... 39 P2, ispit, jul 2011.... 41 P2, ispit, septembar 2011.... 43 P2, ispit, septembar 2011.... 44 P2, ispit, oktobar 2011.... 46 P2, ispit, oktobar 2011.... 47 P2, ispit, jun 2012.... 49 P2, ispit, jul 2012.... 52 P2, ispit, jul 2012.... 54 P2, ispit, septembar 2012.... 56 P2, ispit, oktobar 2012.... 58 P2, ispit, jun 2013.... 60 P2, ispit, jul 2013.... 62 P2, ispit, septembar 2013.... 63 P2, ispit, septembar 2013.... 64 P2, ispit, jul 2014.... 66 P2, ispit, jul 2014.... 68 P2, ispit, septembar 2014.... 71 P2, ispit, oktobar 2014.... 72 P2, ispit, januar 2015.... 74 P2, ispit, jun 2015.... 76 P2, ispit, jun 2016.... 79 P2, ispit, jul 2016.... 81 P2, ispit, septembar 2016.... 82

P2, ispit, oktobar 2016.... 84 P2, ispit, jun 2017.... 86 P2, ispit, jul 2017.... 88 P2, ispit, septembar 2017.... 90 P2, ispit, oktobar 2017.... 92 P2, ispit, jun 2018.... 94 P2, ispit, jun 2018.... 95 P2, ispit, jul 2018.... 97 P2, ispit, jul 2018.... 99

OO1P2, popravni kolokvijum, jul 2008. (I način) Zadatak 1. Napisati program na programskom jeziku C koji određuje da li su dva skupa celih brojeva, u opsegu od 0 do 15, jednaka. Program treba da učita sa standardnog ulaza elemente skupova, najpre prvog a zatim drugog. Elementi skupova se unose u proizvoljnom redosledu, a dodavanje elementa koji već postoji u skupu se ignoriše. Nakon završenog unosa elemenata skupova, program ispiše "Skupovi su jednaki" ili "Skupovi nisu jednaki" u zavisnosti od ishoda poređenja. Program ponavlja prethodne korake (unos skupova i poređenje) sve dok korisnik ne naznači da želi da prekine program. #define MAX_SKUP 16 main () { int skup1[max_skup], skup2[max_skup]; int i, end=1, jednaki, b; while (end) { for(i=0;i<max_skup;i++) skup1[i]=skup2[i]=0; printf("unesite elemente prvog skupa: "); while(1) { scanf("%d",&b); if ((b<0) (b>=max_skup)) break; skup1[b]=1; printf("unesite elemente drugog skupa: "); while(1) { scanf("%d",&b); if ((b<0) (b>=max_skup)) break; skup2[b]=1; jednaki=1; for(i=0;i<max_skup;i++) if (skup1[i]!=skup2[i]) { jednaki=0; break; if (jednaki) printf("skupovi su jednaki!\n"); else printf("skupovi nisu jednaki!\n"); printf("0 za kraj, 1 za nastavak: "); scanf("%d",&end); Materijali za pripremu ispita iz Programiranja 2 4

OO1P2, popravni kolokvijum, jul 2008. (II način) Zadatak 1. Napisati program na programskom jeziku C koji određuje da li su dva skupa celih brojeva, u opsegu od 0 do 15, jednaka. Program treba da učita sa standardnog ulaza elemente skupova, najpre prvog a zatim drugog. Elementi skupova se unose u proizvoljnom redosledu, a dodavanje elementa koji već postoji u skupu se ignoriše. Nakon završenog unosa elemenata skupova, program ispiše "Skupovi su jednaki" ili "Skupovi nisu jednaki" u zavisnosti od ishoda poređenja. Program ponavlja prethodne korake (unos skupova i poređenje) sve dok korisnik ne naznači da želi da prekine program. #define MAX_SKUP 16 void main () { unsigned short skup1 = 0, skup2 = 0; int i, end=1, b; while (end) { printf("unesite elemente prvog skupa: "); while(1) { scanf("%d",&b); if ((b<0) (b>=max_skup)) break; skup1 = 1 << b; printf("unesite elemente drugog skupa: "); while(1) { scanf("%d",&b); if ((b<0) (b>=max_skup)) break; skup2 = 1 << b; if (skup1 == skup2) printf("skupovi su jednaki!\n"); else printf("skupovi nisu jednaki!\n"); printf("0 za kraj, 1 za nastavak: "); scanf("%d",&end); Napomena: Primetiti da je drugi način predstavljanja skupova znatno efikasniji sa stanovišta iskorišćenja memorije. Materijali za pripremu ispita iz Programiranja 2 5

OO1P2, kolokvijum, april 2009. Zadatak 1. Napisati program na programskom jeziku C kojim se u prazan jednodimenzioni niz celih brojeva umeću pozitivni celi brojevi u nerastućem poretku. U niz ne treba umetati broj ako on već postoji. Brojevi se čitaju sa standardnog ulaza, a unos se prekida kada korisnik unese vrednost koja nije pozitivna. Nakon unosa, program treba da ispiše sadržaj niza. #define MAX 20 void main () { int a[max], i, j, b, n, ind; n = 0; while (n < MAX) { printf("\nunesite broj: "); scanf("%d",&b); if (b<0) break; for(i=ind=0;i<n a[i]>b;i++) if (a[i]==b) ind=1; if (ind) continue; for (i=n-1; i>=0 && a[i]<b; i--) a[i+1] = a[i]; a[i+1] = b; n++; printf("\nunesti niz: "); for(i=0;i<n;i++) printf("%d ",a[i]); Materijali za pripremu ispita iz Programiranja 2 6

OO1P2, kolokvijum, april 2010. Zadatak 1. Neka se poruka sastoji od N (N 100) celobrojnih, osmobitnih reči, tipa unsigned char. Svaka reč poruke se sastoji od jednog 7-bitnog broja koji zauzima najniže bitove reči, dok najviši bit (bit najveće težine) predstavlja bit parnosti. Bit parnosti se postavlja na vrednost 0 ukoliko je broj binarnih jedinica u preostalih 7 bita paran, a u suprotnom se postavlja na vrednost 1. Napisati program na programskom jeziku C koji sa glavnog ulaza pročita dužinu poruke n, zatim učitava n celih brojeva čije vrednosti mogu biti od 0 do 127, a zatim za svaki od učitanih brojeva računa i u njegov najviši bit upisuje bit parnosti, da bi formirao ispravnu reč. Nakon toga, program ispiše dobijenu poruku. Program ponavlja postupak sve dok se za dužinu niza n ne unese negativna vrednost. #define N 100 void main () { unsigned char a[n]; int i, j, n, odd; while (1) { printf("\nn? "); scanf("%d", &n); if (n <= 0 n > N) break; printf("unesite poruku:\n"); for(i = 0; i < n; i++) scanf("%d", &a[i]); for(i = 0; i < n; i++) { odd = 0; for(j = 0; j < 7; j++) odd += (a[i] >> j) & 1; a[i] = odd % 2? 0x80 : 0; //alternativno: odd & 1 printf("poruka za slanje:\n"); for(i = 0; i < n; i++) printf("%u", a[i]); Napomena: primetiti da zbog ograničenog opsega vrednosti od 0 do 127, binarna reprezentacija elemenata niza zauzima samo najnižih 7 bita broja. Primer računanja bita parnosti na dužini od 8 bita Broj: 7910 = 010011112 Broj sadrži 5 aktivnih bitova (jedinica) u binarnoj predstavi. Da bi se zadovoljilo pravilo za računanje bita parnosti, najviši bit je potrebno postaviti na vrednost 1. Broj nakon dodavanja bita parnosti: 110011112 = 20710 Broj: 7810 = 010011102 Broj sadrži 4 aktivna bita (jedinice) u binarnoj predstavi. Broj ne treba menjati, jer već ima paran broj jedinica i pravilo za računanje bita parnosti je zadovoljeno. Materijali za pripremu ispita iz Programiranja 2 7

OO1P2, popravni kolokvijum, jun 2010. Zadatak 1. Napisati program na programskom jeziku C koji odredi i ispiše najmanji neoznačeni ceo broj koji se može zapisati proizvoljnim kombinovanjem heksadecimalnih cifara koje se pročitaju sa glavnog ulaza. Broj je potrebno ispisati u decimalnom i heksadecimalnom obliku. Pretpostaviti da se cifre od A do F predstavljaju isključivo velikim slovima (ASCII kodovi cifara su manji od ASCII kodova velikih slova). Na primer, za unete cifre 5, C, 8, 5 i 2, najmanji ceo broj je 2558C. Smatrati da se celi brojevi sastoje od najviše 6 cifara. Validnost unetih podataka ne treba proveravati. #include <ctype.h> #define N 6 void main () { char broj[n+1], c; int n = 0, vred, i, j; while(((c = getchar())!= '\n') && (n < N)) { if (!(isdigit(c) (c >= 'A' && c <= 'F') (c >= 'a' && c <= 'f'))) continue; broj[n++] = c; broj[n] = '\0'; for(i = 0; i < n-1; i++) for(j = i+1; j < n; j++) if (broj[i] > broj[j]) { c = broj[i]; broj[i] = broj[j]; broj[j] = c; sscanf(broj, "%x", &vred); printf("minimalna vrednost: %d %s", vred, broj); Materijali za pripremu ispita iz Programiranja 2 8

OO1P2, kolokvijum, april 2011. Zadatak 1. Napisati program na programskom jeziku C koji na slučajan način generiše dva niza realnih brojeva X i Y zadate dužine koji predstavljaju koordinate tačaka u ravni. Prvo se unese dužina nizova, a zatim se generišu koordinate tačaka u opsegu[0.0, 1.0]. Nakon generisanja tačaka, iz nizova treba ukloniti sve one tačke koje ne pripadaju krugu jediničnog poluprečnika čiji se centar nalazi u koordinatnom početku. Na kraju programa ispisati rezultujuće nizove, tačku po tačku. Postupak ponavljati sve dok se za dužinu nizova ne unese nedozvoljena vrednost. #include <stdlib.h> #include <time.h> #define N 100 void main () { float x[n], y[n]; int i, j, n; srand(time(null)); while (1) { printf("\nunesite broj tacaka: "); scanf("%d", &n); if (n <= 0 n > N) break; for(i=0; i<n; i++) { x[i] = rand()/((float)rand_max); y[i] = rand()/((float)rand_max); for (i=j=0; i<n; i++) if (x[i]*x[i] + y[i]*y[i] <= 1) { x[j] = x[i]; y[j] = y[i]; j++; n = j; printf("\ntacke koje pripadaju krugu:\n"); for(i=0; i<n; i++) printf("(%f,%f) ", x[i], y[i]); Materijali za pripremu ispita iz Programiranja 2 9

OO1P2, kolokvijum, april 2012. Zadatak 1. Napisati program na programskom jeziku C koji vrši određenu obradu nad dva niza celih brojeva jednake dužine (najviše 100 elemenata). Program treba da utvrdi i ispiše da li je prvi učitani niz moguće dobiti rotacijom drugog učitanog niza za odgovarajući broj mesta udesno, kao i broj mesta za koji ga je potrebno rotirati. Program najpre treba da učita dimenziju nizova, zatim i same nizove. Na kraju, program treba da ispiše na standardnom izlazu ulazne nizove i rezultat provere. Postupak ponavljati sve dok se za dužinu nizova ne unese nedozvoljena vrednost. #define MAX 100 void main () { int a[100], b[100], pom[100]; int i, j, n, rot = 0, jednaki = 0, temp; while (1) { printf("unesite duzinu nizova: "); scanf("%d", &n); if (n <= 0 n > MAX) break; printf("unesite prvi niz: "); for(i = 0; i < n; i++) scanf("%d", &a[i]); printf("unesite drugi niz: "); for(i = 0; i < n; i++) { scanf("%d", &b[i]); pom[i] = b[i]; rot = 0; for(i = 0; i < n; i++) { jednaki = 1; for(j = 0; j < n; j++) if (a[j]!= pom[j]) { jednaki = 0; break; if (jednaki) break; rot++; temp = pom[n-1]; for (j = n-1; j > 0; j--) pom[j] = pom[j-1]; pom[0] = temp; printf("niz A: "); for(i = 0; i < n; i++) printf("%d ", a[i]); printf("\nniz B: "); for(i = 0; i < n; i++) printf("%d ", b[i]); if (jednaki) printf("\nniz A se dobija rotacijom niza B za %d mesta udesno!\n", rot); else printf("\nniz A se ne moze dobiti rotacijom niza B!\n"); Napomena: Zadatak se jednostavno može rešiti i bez upotrebe pomoćnog niza. Materijali za pripremu ispita iz Programiranja 2 10

OO1P2, kolokvijum, april 2013. Zadatak 1. Napisati program na programskom jeziku C koji vrši određenu obradu nad nizom celih brojeva. Niz može sadržati najviše 100 elemenata. Program najpre treba da učita dužinu niza i same elemente niza, a zatim na standardnom izlazu ispiše svaki element niza kao zbir stepena dvojke od kojih se on sastoji. Obezbediti da se u niz mogu uneti samo pozitivni celi brojevi. Ukoliko korisnik unese negativan broj ili nulu ponovo zatražiti unos. Prilikom ispisa usvojiti format izlaza kao što je u primeru. Postupak ponavljati sve dok se za dužinu niza ne unese nekorektna vrednost. Primer ulaza n = 4 Niz: 13 6 21 4 #define MAX 100 void main(){ int n, a[max], i, j; while(1){ scanf("%d", &n); if(n<=0 n>max) break; for (i = 0; i < n; ++i){ a[i] = 0; while(a[i] <= 0) scanf("%d", &a[i]); Primer izlaza 13 = 2^3 + 2^2 + 2^0 6 = 2^2 + 2^1 21 = 2^4 + 2^2 + 2^0 4 = 2^2 for (i = 0; i < n; ++i){ int isfirst = 1; printf("\n%d = ", a[i]); for(j = sizeof(int)*8-1; j >= 0; j--) if(a[i] & 1 << j){ if(!isfirst) printf(" + "); // print the plus if not first else isfirst = 0; // clear the flag printf("2^%d", j); putchar('\n'); Napomene: Obratiti pažnju da je broj potrebno kao sumu stepena dvojke počevši od člana najveće težine ka članu najmanje težine. Takođe, nakon poslednjeg člana sume ne treba ispisati znak +. Bitsko maskiranje i provera se mogu izvršiti i na drugačiji način: unsigned int mask = 1 << (sizeof(int)*8-1), j = sizeof(int)*8-1; for(; mask; mask >>=1, j--) if(a[i] & mask){ printf("%c 2^%d", isfirst? '' : '+', j); if(isfirst) isfirst = 0; // clear the flag Materijali za pripremu ispita iz Programiranja 2 11

OO1P2, popravni kolokvijum, jun 2013. Zadatak 1. Napisati program na programskom jeziku C koji obrađuje poene studenata osvojene na ispitu. Rezultati studenata na ispitu su predstavljeni pomoću dva niza celih brojeva, gde prvi niz predstavlja niz osmocifrenih brojeva indeksa studenata u formi ggggiiii (npr. 20130001 predstavlja broj indeksa 2013/0001), a drugi niz sadrži poene koje je student, čiji je broj indeksa u prvom nizu na odgovarajućoj poziciji, osvojio na ispitu. Niz poena se na početku inicijalizuje nulama. Program učitava prvo broj studenata, a zatim i niz sa brojevima indeksa studenata u kome nema ponavljanja. Korisnik potom unosi poene studentima, tako što u svakom redu unese broj indeksa željenog studenta, a onda i broj poena koje mu želi dodati. Moguće je više puta uneti poene za istog studenta, pri čemu se poeni sabiraju. Unos poena se ponavlja sve dok se ne unese broj indeksa koji ne postoji u nizu indeksa. Nakon unosa, program treba da odredi i ispiše prosečan broja poena na ispitu za generaciju čija se godina upisa (podatak gggg iz indeksa) unese sa standardnog ulaza. #define MAX 50 void main(){ int niz_indeksi[max], niz_poeni[max]; int indeks, poeni, n, godina, suma, broj, i, j, poz; for(i = 0; i < MAX; i++) // ili inicijalizacija niz_poeni[max]={0; niz_poeni[i] = 0; printf("broj studenata? "); scanf("%d", &n); // provera prekoracenja if(n>max n<=0){ printf("nekorektan broj studenata.\n"); return; // ucitavanje indeksa for(i=0; i<n; i++) scanf("%d", &niz_indeksi[i]); // ucitavanje poena while(1){ printf("indeks poeni? "); scanf("%d %d", &indeks, &poeni); // dozvoljene negativne vrednosti // pretraga pozicije indeksa for(j=0; j < n; j++) if(niz_indeksi[j]==indeks) break; // prekid unosa poena if(j==n) break; // dodavanje poena niz_poeni[j]+=poeni; printf("godina upisa? "); scanf("%d", &godina); suma = broj = 0; for(i=0; i<n; i++){ // provera pripadnosti generaciji if(niz_indeksi[i]/10000 == godina){ suma+=niz_poeni[i]; broj++; if(broj>0) printf("prosecan broj poena za generaciju %d iznosi %lf", godina, (double)suma/broj); else printf("nema podataka o generaciji %d.\n", godina); Materijali za pripremu ispita iz Programiranja 2 12

OO1P2, kolokvijum, april 2014. Zadatak 1. Napisati program na programskom jeziku C koji vrši simulaciju promene broja stanovnika u gradovima. Program najpre učita broj gradova koje će obrađivati (najviše 100) i broj godina za simulaciju, a zatim brojeve stanovnika za sve gradove. Simulacija se radi na sledeći način: na godišnjem nivou broj stanovnika u svakom gradu se promeni za slučajan broj koji je u opsegu od -1% do +1% broja stanovnika u gradu na početku godine. Za svaku godinu u simulaciji u zasebnom redu treba ispisati brojeve stanovnika koje svaki grad ima na kraju te godine. Kada se završi simulacija, ispisati broj stanovnika za najnaseljeniji grad. U slučaju da se sa standardnog ulaza unese nekorektna vrednost za bilo koji podatak, ispisati odgovarajuću poruku i prekinuti izvršavanje programa. #include<stdio.h> #include<stdlib.h> #define MAX 100 void main() { int godine, n, i, j, max, int gradovi[max]; double slucajan; printf("unesite broj gradova: "); scanf("%d", &n); if (n < 1 n > MAX) { printf("greska: Broj gradova je neodgovarajuci.\n"); exit(1); printf("unesite broj stanovnika za gradove:\n"); for (i = 0; i < n; i++){ scanf("%d", &gradovi[i]); if (gradovi[i] < 2) { printf("greska: Broj stanovnika grada je neodgovarajuci.\n"); exit(1); printf("unesite broj godina: "); scanf("%d", &godine); if (godine < 1) { printf("greska: Broj godina je neodgovarajuci.\n"); exit(1); for (i = 0; i < godine; i++) { for (j = 0; j < n; j++) { slucajan = rand() / (double)rand_max * 2-1; gradovi[j] += gradovi[j] * slucajan / 100; if (gradovi[j] < 2) { printf("greska: Broj stanovnika grada je neodgovarajuci.\n"); exit(1); for (j = 0; j < n; j++) printf("%d ", gradovi[j]); printf("\n"); max = gradovi[0]; for (i = 0; i < n; i++) if (max < gradovi[i]) max = gradovi[i]; printf("grad sa najvecim brojem stanovnika je %d.\n", max); Materijali za pripremu ispita iz Programiranja 2 13

OO1P2, kolokvijum, april 2018. Zadatak 1. Napisati program na programskom jeziku C koji pomaže organizatorima takmičenja u kucanju uskršnjim jajima da izaberu pobednike po kategorijama. Svako uskršnje jaje je organizaciona komisija opisala sledećim podacima: rednim brojem takmičara (ceo broj), jačinom ljuske (realan broj) i kategorijom jajeta (0 kokošije, 1 guščije, 2 drveno ili neidentifikovano). Redni brojevi takmičara se nalaze u opsegu od 0 do 100, a u takmičenju učestvuje najviše 1000 jaja. Jedan takmičar se može takmičiti sa više uskršnjih jaja. Program najpre treba da učita broj uskršnjih jaja (dužinu nizova) koje komisija treba da obradi, a zatim i podatke o svakom pojedinačnom jajetu razdvojene blanko znakom, za svako jaje iz posebnog reda. Pročitane podatke treba smeštati u tri niza odgovarajućeg tipa. Nakon učitavanja, program treba da ispiše podatke o pobedničkim jajima po kategorijama, ne uzimajući u obzir jaja diskvalifikovanih takmičara. Diskvalifikovani su oni takmičari koji su prijavili barem jedno drveno ili neidentifikovano jaje. Jaje je pobedničko ukoliko ima najjaču ljusku u svojoj kategoriji. #define MAX_JAJA 1000 #define MAX_TAKMICARA 100 enum kategorija_jaja {KOKOSIJE, GUSCIJE, DRVENO; int main () { int redni_broj[max_jaja], kategorija[max_jaja], takmicari[max_jaja] = {0, n, i, max_k_ind, max_g_ind; float jacina_ljuske[max_jaja], max_k, max_g; printf("unesite broj jaja na takmicenju: "); scanf("%d", &n); if (n <= 0 n > MAX_JAJA) return 1; printf("unesite podatke o svakom jajetu:\n"); for(i = 0; i < n; i++) { scanf("%d %f %d", &redni_broj[i], &jacina_ljuske[i], &kategorija[i]); takmicari[redni_broj[i]]++; for(i = 0; i < n; i++) if (kategorija[i] == DRVENO) takmicari[redni_broj[i]] = -1; max_k = max_g = 0; max_k_ind = max_g_ind = -1; for(i = 0; i < n; i++) { if (kategorija[i] == KOKOSIJE && jacina_ljuske[i] > max_k && takmicari[redni_broj[i]] > 0) { max_k = jacina_ljuske[i]; max_k_ind = i; ; if (kategorija[i] == GUSCIJE && jacina_ljuske[i] > max_g && takmicari[redni_broj[i]] > 0) { max_g = jacina_ljuske[i]; max_g_ind = i; ; if (max_k_ind!= -1) printf("najjace kokosije jaje: %d %0.2f.\n", redni_broj[max_k_ind], jacina_ljuske[max_k_ind]); else printf("nije bilo kokosijih jaja u regularnoj konkurenciji!\n"); if (max_g_ind!= -1) printf("najjace guscije jaje: %d %0.2f.\n", redni_broj[max_g_ind], jacina_ljuske[max_g_ind]); else printf("nije bilo guscijih jaja u regularnoj konkurenciji!\n"); return 0; Materijali za pripremu ispita iz Programiranja 2 14

OO1P2, popravni kolokvijum, jun 2018. Zadatak Napisati program na programskom jeziku C koji za dati delimično poznat neoznačeni ceo broj pronalazi njemu najsličniji broj u nekom skupu neoznačenih celih brojeva. Program sa standardnog ulaza prvo učitava dva broja N i M, a zatim N neoznačenih celih brojeva koji predstavljaju skup u kome se traži najsličniji broj. Nakon toga se unosi delimično poznati broj i to na sledeći način. Unosi se niz od M brojeva koji predstavljaju M najnižih binarnih cifara nepoznatog broja. U nizu se mogu naći vrednosti 0, 1, i -1. Vrednost -1 označava da vrednost cifre nije poznata. Unesene cifre su na pozicijama od M 1 do 0, gde je cifra na poziciji 0 najmanje težine. Cifre koje nisu unete su nepoznate. Program treba da ispiše najsličniji broj delimično poznatom broju (ako ih ima više, ispisati sve). Najsličniji je onaj broj koji ima najviše istih binarnih cifara na pozicijama kao i delimično poznat broj. Broj N ne može biti veći od 100 i broj M ne može biti veći od konstante sizeof(unsigned)*8. Za sve operacije sa bitovima koristiti bitske operatore. Primer ulaza: 3 4 10 6 7-1 1 1-1 Primer izlaza: 6 7 #define MAX (100) int main() { unsigned set[max]; int n, m; unsigned similarity[max]; scanf("%d %d", &n, &m); for (int i = 0; i < n; i++) { scanf("%u", &set[i]); similarity[i] = 0; for (int i = m - 1; i >= 0; i--) { int value; scanf("%d", &value); if (value == -1) { continue; unsigned mask = 1 << i; for (int j = 0; j < n; j++) { unsigned one_bit = (set[j] & mask) >> i; if (one_bit == value) { similarity[j]++; unsigned max = 0; for (int i = 0; i < n; i++) { if (max < similarity[i]) { max = similarity[i]; for (int i = 0; i < n; i++) { if (max == similarity[i]) { printf("%u ", set[i]); putchar('\n'); return 0; Materijali za pripremu ispita iz Programiranja 2 15

SI1P2, prvi kolokvijum, mart 2011. Zadatak 1. Napisati program na programskom jeziku C koji generiše pseudoslučajan broj u opsegu od 10 do 10000, a zatim vrši proveru da li je generisani broj Fibonačijev broj. Fibonačijevi brojevi se računaju po formuli f0=1, f1=1, fn=fn-1 + fn-2, a generisane brojeve je potrebno ispisivati na standardnom izlazu. Na kraju programa ispisati rezultat provere. #include <stdlib.h> #include <time.h> #define LOW 10 #define HIGH 10000 void main () { int broj, f0, f1, f2; srand(time(null)); broj = rand()/((double)rand_max)*(high - LOW) + LOW; printf("pseudoslucajni broj: %d\n", broj); printf("generisem Fibonacijeve brojeve: \n"); for(f0=f1=f2=1; f2 < broj;) { f0 = f1; f1 = f2; f2 = f0 + f1; printf("%d ", f2); putchar('\n'); if (f2 == broj) printf("generisani broj je Fibonacijev broj.\n"); else printf("generisani broj nije Fibonacijev broj.\n"); Materijali za pripremu ispita iz Programiranja 2 16

SI1P2, prvi kolokvijum, mart 2011. Zadatak 2. Napisati program na programskom jeziku C koji sa glavnog ulaza učitava niz od 12 realnih brojeva koji predstavljaju prosečnu mesečnu temperaturu za svaki mesec u godini. Program treba da izračuna i ispiše na standardnom izlazu prosečnu temperaturu po kvartalima (tromesečjima) u toku zadate godine, kao i redni broj kvartala sa najmanjom i najvećom prosečnom temperaturom. Program treba da ponavlja prethodni postupak sve dok korisnik ne učita sve vrednosti 0 u ulazni niz. #define BROJ_MESECI 12 #define KVARTALI 4 #define KVARTAL 3 void main () { double temperature[broj_meseci], kvartali[kvartali] = {0; int i, min, max, uslov; while(1) { printf("unesite prosecne mesecne temperature: "); for(i=0; i<broj_meseci; i++) scanf("%lf", &temperature[i]); for(uslov=i=0; i<broj_meseci; i++) uslov = uslov (int)temperature[i]; if (!uslov) break; for(i=0; i<kvartal; i++) { kvartali[0] += temperature[i + 0*KVARTAL]; kvartali[1] += temperature[i + 1*KVARTAL]; kvartali[2] += temperature[i + 2*KVARTAL]; kvartali[3] += temperature[i + 3*KVARTAL]; printf("prosecna temperatura po kvartalima: \n"); for(i=0; i<kvartali; i++) { kvartali[i] /= KVARTAL; printf("%d: %2.2f\n", i, kvartali[i]); min = max = 0; for(i=1; i<kvartal; i++) { if (kvartali[i] < kvartali[min]) min = i; if (kvartali[i] > kvartali[max]) max = i; printf("\nkvartal sa najmanjom prosecnom temperaturom: %d\n", min); printf("kvartal sa najvecom prosecnom temperaturom: %d\n", max); Materijali za pripremu ispita iz Programiranja 2 17

SI1P2, prvi kolokvijum, mart 2012. Zadatak 1. Vrednost broja PI se može statistički odrediti uz pomoć generatora pseudoslučajnih brojeva uniformne raspodele. Potrebno je generisati tačke u ravni sa obema koordinatama u realnom opsegu [0, 1]. Vrednost broja PI se tada može odrediti na osnovu odnosa broja tačaka koje se nalaze u delu kruga poluprečnika 1 sa centrom u koordinatnom početku (Tc) i broja tačaka koje pripadaju kvadratu stranice 1 koji obuhvata sve generisane tačke (Tu) pomoću sledeće formule: = 4 T T c u Napisati program na programskom jeziku C koji izračunava vrednost broja PI. Program treba da učita ukupan broj tačaka koji treba da budu generisan, izračuna vrednost broja PI i ispiše rezultat. Program treba da ponavlja opisane korake sve dok se za broj tačaka unosi pozitivna vrednost.. #include <stdlib.h> #include <math.h> void main () { double x1, y1, d, pi; int i, in_circle = 0, n; srand(time(null)); while(1) { printf("unesi broj tacaka koji treba generisati: "); scanf("%d", &n); if (n <= 0) break; for (i = 0; i < n ; i++) { x1 = rand()/(double)rand_max; y1 = rand()/(double)rand_max; d = sqrt(x1*x1 + y1*y1); in_circle += (d <= 1.0)? 1 : 0; pi = (double)4*in_circle/n; printf("izracunata vrednost PI: %f\n", pi); Materijali za pripremu ispita iz Programiranja 2 18

SI1P2, prvi kolokvijum, mart 2013. Zadatak 2. Napisati program na programskom jeziku C koji sa standardnog ulaza učitava niz od najviše 100 celih brojeva, a zatim proverava da li uneti niz predstavlja bitoničku sekvencu. Bitonička sekvenca je sekvenca brojeva koja se sastoji od jedne monotono neopadajuće i jedne monotono nerastuće sekvence brojeva ili obratno (x0... xk... xn-1 ili x0... xk... xn-1, gde 0 k < n). Program treba da učita dužinu i elemente niza, a zatim izvrši proveru i ispiše odgovarajuću poruku. Obezbediti da se u niz mogu uneti samo brojevi u opsegu od 0 do 50. Ukoliko korisnik unese broj van tog opsega ponovo zatražiti unos. Program treba da ponavlja opisane korake sve dok se za dužinu niza ne unese nekorektna vrednost. #define MAX 100 void main () { int niz[max], i, n, provera, tranzicija; while(1) { printf("unesite duzinu niza: \n"); scanf("%d", &n); if (n <= 0 n > MAX) break; printf("unesite elemente niza u opsegu 0..50: \n"); for(i = 0; i < n; i++) { int broj; scanf("%d", &broj); while (broj < 0 broj > 50) { printf("broj van opsega! Unesite ponovo: \n"); scanf("%d", &broj); niz[i] = broj; if (n == 1) { printf("sekvenca je bitonicka!\n"); continue; provera = 0; tranzicija = 0; for (i = 1; i < n; i++) { if (niz[i-1] < niz[i]) { if (provera == 0) provera = 1; else if (provera == -1) { tranzicija++; provera = 1; else if (niz[i-1] > niz[i]) { if (provera == 0) provera = -1; else if (provera == 1) { tranzicija++; provera = -1; if (tranzicija == 1) printf("sekvenca je bitonicka!\n"); else printf("sekvenca nije bitonicka!\n"); Materijali za pripremu ispita iz Programiranja 2 19

SI1P2, drugi kolokvijum, april 2013. Zadatak 2. Napisati program na programskom jeziku C koji vrši određenu obradu nad dinamičkom matricom realnih brojeva. Program treba učita dimenzije i elemente matrice, a zatim formira novu matricu koja sadrži samo one vrste čija je aritmetička sredina elemenata veća od aritmetičke sredine svih elemenata u polaznoj matrici. Nakon obrade ispisati rezultujuću matricu. Voditi računa o korektnoj upotrebi dinamičke memorije. #include <stdlib.h> float ar_sred (float *arr, unsigned int n) { unsigned int i; float suma; for (i = suma = 0; i < n; i++) suma += arr[i]; return suma / n; int main () { unsigned int m1, m2, n, i, j; float **mat, **nova_mat, ar_sred_mat, ar_sred_vr; printf("unesite dimenzije matrice: "); scanf("%d%d", &m1, &n); if (m <= 0 n <= 0) return 1; mat = malloc(m1 * sizeof(float*)); if (mat == NULL) exit(1); for (i = 0; i < m1; i++) { mat[i] = malloc(n * sizeof(float)); if (mat[i] == NULL) exit(2); for (j = 0; j < n; j++) scanf("%f", &mat[i][j]); for (i = 0; i < m1; printf("\n"), i++) for (j = 0; j < n; j++) printf("%2.2f ", mat[i][j]); ar_sred_mat = 0; for (i = 0; i < m1; i++) ar_sred_mat += ar_sred(mat[i], n); ar_sred_mat /= m1; printf("aritemticka sredina clanova matrice je: %2.2f\n", ar_sred_mat); nova_mat = NULL; m2 = 0; for (i = 0; i < m1; i++) { ar_sred_vr = ar_sred(mat[i], n); if (ar_sred_vr > ar_sred_mat) { float **nova_m; nova_m = realloc(nova_mat, (m2 + 1) * sizeof(float*)); if (nova_m == NULL) exit(3); else nova_mat = nova_m; nova_mat[m2] = malloc(n * sizeof(float)); if (nova_mat[m2] == NULL) exit(2); for (j = 0; j < n; j++) nova_mat[m2][j] = mat[i][j]; m2++; for (i = 0; i < m2; printf("\n"), i++) for (j = 0; j < n; j++) printf("%2.2f ", nova_mat[i][j]); for (i = 0; i < m1; i++) free (mat[i]); free (mat); for (i = 0; i < m2; i++) free (nova_mat[i]); free (nova_mat); return 0; Materijali za pripremu ispita iz Programiranja 2 20

SI1P2, treći kolokvijum, jun 2012. Zadatak 2. Napisati program na programskom jeziku C koji prepisuje sadržaj ulazne tekst datoteke u izlaznu tekst datoteku uz izostavljanje svih pojavljivanja HTML tagova. HTML tagovi su oblika <tag> ili </tag>, gde tag može biti bilo koji niz karaktera uključujući i blanko znake. Jedan HTML tag može početi u jednom, a završiti se u nekom drugom redu. Imena ulazne i izlazne datoteke se zadaju kao prvi i drugi argument komandne linije. Ukoliko se za ime izlazne datoteke zada string "-" sadržaj treba ispisati na standardni izlaz (stdout). Očuvati uređenost tekst po redovima. #include <stdlib.h> #include <string.h> int main (int argc, char* argv[]) { FILE *ulaz, *izlaz; int c, tag = 0, br = 0; if (argc!= 3) { printf("neodgovarajuci broj parametara u komandnoj liniji!"); exit(1); if ((ulaz = fopen(argv[1], "r")) == NULL) { fprintf(stderr,"greska u otvaranju ulazne datoteke %s\n", argv[1]); exit(2); if (strcmp(argv[2], "-")!= 0) { if ((izlaz = fopen(argv[2], "w")) == NULL) { fprintf(stderr,"greska u otvaranju izlazne datoteke %s\n", argv[2]); exit(3); else izlaz = stdout; while ((c = fgetc(ulaz))!= EOF) { switch(c) { case '<': tag = 1; br++; break; case '>': tag = 0; br--; break; default: if (!tag &&!br) fputc(c, izlaz); break; fclose(ulaz); fclose(izlaz); return 0; Materijali za pripremu ispita iz Programiranja 2 21

SI1P2, prvi kolokvijum, mart 2014. Zadatak 1. Napisati program na programskom jeziku C koji sa standardnog ulaza učitava ceo broj tipa unsigned int (pretpostaviti da je za smeštanje jednog podatka tog tipa potrebno 16 bita), a potom proverava da li je bitska reprezentacija tog broja, posmatrana od bita najveće težine ka bitu najmanje težine, komplementarna u odnosu na bitsku reprezentaciju posmatranu od bita namanje težine ka bitu najveće težine. U slučaju da jeste, na standardnom izlazu treba ispisati poruku DA, u suprotnom poruku NE. Pimer: binarna reprezentacija broja 48322 je 1011110011000010, pa se ispisuje poruka DA. #include<stdio.h> int main(){ unsigned int broj, dmaska = 0x0001, lmaska = 0x8000, i, da = 1; scanf("%d", &broj); for (i = 0; i < 8 && da; i++, lmaska >>= 1, dmaska <<= 1) if (!((broj & dmaska) ^ ((broj & lmaska) >> (15 - i * 2)))) da = 0; if (da) printf("da"); else printf("ne"); Materijali za pripremu ispita iz Programiranja 2 22

SI1P2, prvi kolokvijum, mart 2014. Zadatak 2. Napisati program na programskom jeziku C koji uređuje zadati niz od najviše 100 celih brojeva tako da sadrži prvo neparne brojeve u nerastućem po retku, a zatim parne brojeve u neopadajućemporetku. Elementi niza se inicijalizuju sekvencom pseudoslučajnih celih brojeva u opsegu [100,200]. Program najpre učita dužinu niza brojeva, zatim gainicijalizuje sekvencom pseudoslučajnih brojeva izzadatog opsega, sortira elemente prema zadatom kriterijumu i na kraju ispiše rezultujući niz.navedeni koraci se ponavljaju sve dok se za dužinuniza ne unese nekorektna vrednost. #include <stdlib.h> #define DIM 100 void main() { int a[dim], n, i, j, tmp, xchg; while (1) { printf("unesite broj elemenata:\n"); scanf("%d", &n); if (n < 1 n > DIM) break; printf("generisani niz:\n"); for (i = 0; i < n; i++){ a[i] = ((double)rand() / RAND_MAX)*100 + 100; printf("%d%c", a[i], (i == n - 1)? '\n' : ' '); for (i = 0; i < n;i++) for (j = i + 1; j < n; j++){ int i_paran, j_paran; i_paran = 0 == a[i] % 2; j_paran = 0 == a[j] % 2; xchg = i_paran &&!j_paran; xchg = xchg (i_paran && j_paran && a[i] < a[j]); xchg = xchg (!i_paran &&!j_paran && a[i] > a[j]); if (xchg) { tmp = a[i]; a[i] = a[j]; a[j] = tmp; printf("obradjeni niz:\n"); for (i = 0; i < n; i++){ printf("%d%c", a[i], (i == n - 1)? '\n' : ' '); Materijali za pripremu ispita iz Programiranja 2 23

SI1P2, drugi kolokvijum, 2014. Zadatak 2. Napisati program na programskom jeziku C koji vrši određenu obradu nad dinamičkom matricom realnih brojeva. Program treba da učita dimenzije i elemente matrice, a zatim i same elemente. Nakon toga program iz svake kolone matrice izbaci najveći element u toj koloni. Pretpostaviti da su svi elementi kolone različiti. Nakon izbacivanja elemenata osloboditi memorijski prostor koji se više ne koristi i ispisati rezultujuću matricu. Voditi računa o korektnoj upotrebi dinamičke memorije i optimalnom iskorišćenju memorijskog prostora. #include <stdlib.h> void main() { int **matrix, tmp, m,n; int i, j; scanf("%d%d", &m, &n); if (m < 1 n < 1) return; matrix = malloc(sizeof(int *) * m); if (NULL == matrix) return; for (i = 0; i < m; i++) { matrix[i] = malloc(sizeof(int) * n); if (NULL == matrix[i]) return; for (i = 0; i < m; i++) for (j = 0; j < n; j++) scanf("%d", &matrix[i][j]); for (j = 0; j < n; j++) { int max, index; max = matrix[0][j]; index = 0; for (i = 0; i < m; i++) if (max < matrix[i][j]) { max = matrix[i][j]; index = i; for (i = index; i < m - 1; i++) matrix[i][j] = matrix[i + 1][j]; if (m > 1) { m--; free(matrix[m]); tmp = realloc(matrix, sizeof(int *) * m); if (NULL!= tmp) matrix = tmp; for (i = 0; i < m; i++) for (j = 0; j < n; j++) printf("%d%c", matrix[i][j], (j == n - 1)? '\n' : ' '); for (i = 0; i < m; i++) free(matrix[i]); free(matrix); Materijali za pripremu ispita iz Programiranja 2 24

SI1P2, popravni drugi kolokvijum, jun 2014. Zadatak 1. Napisati program na programskom jeziku C funkciju char *num2word(char *str); koja u znakovnom nizu str uklanja jednocifrene brojeve i zamenjuje ih rečima (nula, jedan, dva,..., devet). Funkcija treba da vrati modifikovan znakovni niz. Za realizovanje tražene funkcije nije dozvoljeno korišćenje bibliotečkih funkcija, kao ni pomoćni niz. Napisati program na programskom jeziku C koji učitava niz znakova kao liniju teksta sa standardnog ulaza, a zatim pomoću realizovane funkcije obradi učitani niz znakova i potom ga ispiše na standardnom izlazu. Niz znakova se alocira dinamički i ništa se ne pretpostavlja o njegovoj dužini. Voditi računa o korektnoj upotrebi dinamičke memorije i optimalnom iskorišćenju memorijskog prostora. #include <stdlib.h> #include <string.h> #include <ctype.h> #define EOS (-1) char *words[] = { "nula", "jedan", "dva", "tri", "cetiri", "pet", "sest", "sedam", "osam", "devet" ; enum state { LOOK, DIGIT, NO_NUM ; int position_one_digit(char *str) { int i; enum state state; state = LOOK; for (i = 0; '\0'!= str[i]; i++) { switch (state){ case LOOK: if (isdigit(str[i])) state = DIGIT; else if (!isblank(str[i])) state = NO_NUM; break; case DIGIT: if (isblank(str[i])) return i - 1; else state = NO_NUM; break; case NO_NUM: if (isblank(str[i])) state = LOOK; break; if (DIGIT == state) return i - 1; return EOS; char *word(char c) { return words[c - '0']; Materijali za pripremu ispita iz Programiranja 2 25

int new_size(char *str) { int size; int i; size = strlen(str) + 1; while (EOS!= (i = position_one_digit(str))) { size += strlen(word(str[i])) - 1; str += i + 1; return size; char *num2words(char *str) { int nsize, osize; char *ret; int i, j, next; osize = strlen(str) + 1; nsize = new_size(str); ret = realloc(str, nsize); if (NULL == ret) return str; str = ret; for (i = nsize - 1, j = osize - 1; j >= 0; i--, j--) str[i] = str[j]; str = str + nsize - osize; i = 0; while (EOS!= (next = position_one_digit(str))) { char *w; for (j = 0; j < next; j++) ret[i++] = str[j]; w = word(str[next]); for (j = 0; '\0'!= w[j]; j++) ret[i++] = w[j]; str += next + 1; for (j = 0; '\0'!= str[j]; j++) ret[i++] = str[j]; ret[i] = '\0'; return ret; int main() { char *str, c; int i; str = NULL; i = 0; while ('\n'!= (c = getchar())) { if (0 == i % 10) { str = realloc(str, i + 10); if (NULL == str) exit(-1); str[i] = c; i++; str = realloc(str, i + 1); if (NULL == str) exit(-1); str[i] = '\0'; str = num2words(str); printf("%s\n", str); free(str); Materijali za pripremu ispita iz Programiranja 2 26

SI1P2, prvi kolokvijum, mart 2015. Zadatak 1. Napisati program na programskom jeziku C koji pretražuje binarnu predstavu broja radi pronalaženja svih pojava zadate binarne sekvence. Program treba sa standardnog ulaza da učita dva broja tipa unsigned int (pretpostaviti da je veličina tipa 16 bita). Prvo se učitava broj koji se pretražuje. Iz binarne predstave drugog učitanog broja izdvaja se deo između binarnih jedinica najmanje i najveće težine (uključujući i njih), pa to predstavlja sekvencu koja se traži. Pretraživanje se vrši počevši od cifre najveće težine. Program treba da ispiše sve početne pozicije u prvom broju gde je nađen zadati sadržaj (pozicija najveće težine je 15). Na primer neka je prvi broj 0x5B5A, a drugi broj 0x0168. Pozicije koje treba ispisati su: 14, 11 i 6. #define SIZE 16 void main() { unsigned int a, b, mask, ones; int first_one, last_one, i, find_start, iter; printf("unesite dva broja (drugi broj se pretrazuje u prvom)?\n"); scanf("%x%x", &a, &b); mask = 1; find_start = 1; for (i = 0; i < SIZE; i++){ if (mask & b) { if (find_start) { first_one = i; find_start = 0; last_one = i; mask <<= 1; if (find_start) { printf("drugi broj je jednak nuli\n"); return; ones = (1 << last_one first_one + 1) 1; mask = b << (SIZE - 1) - last_one; ones = ones << (SIZE (last_one first_one) 1); iter = SIZE - (last_one - first_one); for (i = 0; i < iter; i++) { if ((ones & a) == mask)) printf("%d ", (SIZE - i) - 1); mask >>= 1; ones >>= 1; Materijali za pripremu ispita iz Programiranja 2 27

SI1P2, drugi kolokvijum, 2015. Zadatak 2. Napisati program na programskom jeziku C koji učita matricu, obradi je i na kraju ispiše na standardni izlaz. Prilikom učitavanja matrice, prvo se učitaju dimenzije, a potom se alocira matrica odgovarajuće veličine i popuni vrednostima koje se pročitaju sa standardnog ulaza, tako da se svaka vrsta učitava iz posebnog reda. Učitana matrica se obrađuje tako što se prvo pronađe najmanja vrednost u matrici, a zatim se izbace sve vrste koje sadrže nađenu minimalnu vrednost. Na kraju ispisati sadržaj obrađene matrice. Voditi računa o korektnoj i optimalnoj upotrebi korišćenih resursa. #include <stdlib.h> #define CHECK(x) do { if (NULL == (x)) { \ printf("greska prilikom alokacije memorije.\n"); \ exit(-1); \ \ while (0) void main() { int **matrica, **nova, m, n, i, j, k, min; printf("unesite dimenzije matrice.\n"); scanf("%d%d", &m, &n); if (m < 1 n < 1) exit(0); printf("unesite elemente matrice.\n"); matrica = malloc(m*sizeof(int *)); CHECK(matrica); for (i = 0; i < m; i++) { matrica[i] = malloc(n*sizeof(int)); CHECK(matrica[i]); for (j = 0; j < n; j++) scanf("%d", &matrica[i][j]); min = matrica[0][0]; for (i = 0; i < m; i++) for (j = 0; j < n; j++) if (min > matrica[i][j]) min = matrica[i][j]; k = 0; for (i = 0; i < m; i++) { for (j = 0; j < n; j++) if (matrica[i][j] == min) break; if (j == n) { matrica[k] = matrica[i]; k++; else { free(matrica[i]); m = k; if (m > 0) { nova = realloc(matrica, m * sizeof(int *)); if (NULL!= nova) matrica = nova; for (i = 0; i < m; i++) { for (j = 0; j < n; j++) printf("%d ", matrica[i][j]); putchar('\n'); for (i = 0; i < m; i++) free(matrica[i]); free(matrica); Materijali za pripremu ispita iz Programiranja 2 28

SI1P2, popravni prvi kolokvijum, jun 2015. Zadatak 1. Napisati program na programskom jeziku C koji obađuje niz celih neoznačenih brojeva. Program sa standardnog ulaza učita broj elemenata niza i elemente niza, zatim iz niza izbaci sve elemente u čijoj binarnoj reprezentaciji ima više parova susednih jedinica od prosečnog broja parova susednih jedinica u reprezentacijama svih unetih brojeva, uredi preostale elemente niza po nerastućoj vrednosti elemenata i na kraju ispiše sadržaj rezultujućeg niza. Prilikom prebrojavanja parova jedna jedinica može da bude deo dva para (npr. u broju 10011101 postoje 2 para susednih jedinica). Smatrati da niz ima najviše 100 elemenata. Za svaki uneti broj dozvoljeno je najviše jednom računati broj parova susednih jedinica, pa je izračunatu vrednost potrebno čuvati u pomoćnom nizu. Osim dva pomenuta niza nije dozvoljeno koristiti druge pomoćne nizove. #define MAX 100 void main() { unsigned brojevi[100], parovi[100], n, i, j, mask; double srednja_vrednost; scanf("%u", &n); if (n < 1 n > MAX) return; for (i = 0; i < n; i++) scanf("%u", &brojevi[i]); srednja_vrednost = 0; for (i = 0; i < n; i++) { mask = 3; parovi[i] = 0; for (j = 0; j < sizeof(unsigned) * 8-1; j++) { if ((mask & brojevi[i]) == mask) parovi[i]++; mask <<= 1; srednja_vrednost += parovi[i]; srednja_vrednost /= n; for (i = j = 0; i < n; i++) if (parovi[i] <= srednja_vrednost) brojevi[j++] = brojevi[i]; n = j; for (i = 0; i < n; i++) for (j = i + 1; j < n; j++) if (brojevi[i] < brojevi[j]) { unsigned tmp = brojevi[i]; brojevi[i] = brojevi[j]; brojevi[j] = tmp; for (i = 0; i < n; i++) printf("%u ", brojevi[i]); putchar('\n'); Materijali za pripremu ispita iz Programiranja 2 29

SI1P2, prvi kolokvijum, mart, 2017. Zadatak 1. Napisati program na programskom jeziku C koji vrši konverziju realnog broja iz binarnog u decimalni oblik. Realan broj u binarnom brojnom sistemu se zadaje kao niz znakova koji može sadržati samo cifre 0, 1 i eventualnu decimalnu tačku. Program treba da učita niz znakova sa standardnog ulaza do kraja tekućeg reda, izvrši konverziju zadatog broja u odgovarajući realni tip programskog jezika C i ispiše rezultat u decimalnom brojnom sistemu. Prlikom učitavanja, obezbediti da korisnik unosi samo dozvoljene znakove, a u slučaju unošenja nedozvoljenog znaka zahtevati ponovni unos. Smatrati da niz znakova nije duži od 50 elemenata i obezbediti prekid unosa, ukoliko korisnik pokuša da unese više znakova. #define MAX 50 int main() { char broj[max], znak, tacka = 0; int i, n; double ceo_deo = 0, realni_deo = 0, realni; printf("unesite broj u binarnom obliku:\n"); n = 0; while ((znak = getchar())!= '\n' && n < MAX) { broj[n++] = znak; for (i = 0; i < n; i++) { znak = broj[i]; while (znak!= '0' && znak!= '1' && znak!= '.') { printf("uneli ste nedozvoljeni znak, ponovite unos!\n"); znak = getchar(); if (znak == '.') tacka++; broj[i] = znak; if (n == 0) { printf("niz je prazan!\n"); else if (tacka > 1) { printf("broj je neispravan!\n"); else { i = 0; if (broj[i]!= '.') { ceo_deo = broj[0] - '0'; while (++i < n && broj[i]!= '.') ceo_deo = ceo_deo * 2 + (broj[i] - '0'); if (i < n) while (i < --n) realni_deo = (realni_deo + broj[n] - '0') / 2; realni = ceo_deo + realni_deo; printf("konvertovani broj je: %f\n", realni); return 0; Materijali za pripremu ispita iz Programiranja 2 30

SI1P2, prvi kolokvijum, mart 2018. Zadatak 1. Napisati program na programskom jeziku C koji računa pobednika u nekoj kartaškoj igri. Igra se igra sa 52 karte. Karta je određena vrednošću i znakom. Vrednost može biti ceo broj od 2 do 14. Postoje četiri znaka čije su jednoslovne oznake K, H, T i P. Korisnik u prvom redu na standardnom ulazu unosi broj igrača N koji igraju igru, kao i glavni znak u partiji. Maksimalan broj igrača je 10. Nakon toga se u N redova, za svakog igrača u posebnom redu, unose karte koje poseduje. Broj karata koje jedan igrač ima je 5. Za svaku kartu se unosi vrednost karte i znak, odvojeni tačno jednim razmakom. Karte u redu su međusobno odvojene jednim razmakom. Broj poena koje jedan igrač ima računa se kao zbir poena koje svaka karta koju ima nosi. Broj poena za kartu koja ima vrednost manju od 10 je isti kao i njena vrednost. Broj poena za kartu koja ima vrednost veću ili jednaku 10 je 10. Ukoliko je znak neke karte isti kao i glavni znak u partiji, broj poena se za tu kartu duplira. Program treba da ispiše redni broj igrača (od 1 do N) i broj poena koji je osvojio taj igrač, i to u posebnim redovima, u nerastućem poretku broja poena. Smatrati da je ulaz ispravan. #define MAX_NUMBER_OF_PLAYERS 10 #define NUMBER_OF_CARDS 5 #define MAX_CARD_VALUE 10 void main() { int numberofplayers, players[max_number_of_players], points[max_number_of_players], cardvalue, i, j, temp; char cardsign, mainsign; scanf("%d %c", &numberofplayers, &mainsign); for (i = 0; i < numberofplayers; i++) { players[i] = i + 1; points[i] = 0; for (j = 0; j < NUMBER_OF_CARDS; j++) { scanf("%d %c", &cardvalue, &cardsign); if (cardvalue > MAX_CARD_VALUE) { cardvalue = MAX_CARD_VALUE; if (cardsign == mainsign) { cardvalue *= 2; points[i] += cardvalue; for (i = 0; i < (numberofplayers - 1); i++) for (j = (i + 1); j < numberofplayers; j++) { if (points[i] < points[j]) { temp = points[i]; points[i] = points[j]; points[j] = temp; temp = players[i]; players[i] = players[j]; players[j] = temp; for (i = 0; i < numberofplayers; i++) printf("%d %d\n", players[i], points[i]); Materijali za pripremu ispita iz Programiranja 2 31

SI1P2, popravni prvi kolokvijum, april 2018. Zadatak 1. Napisati program na programskom jeziku C koji vrši određenu obradu nad nizom cifara celog broja (prvi element niza je cifra najveće težine, poslednji je cifra najmanje težine). Program najpre treba da učita dužinu niza, a zatim popuni niz brojevima u opsegu [0, 9], pri čemu prva cifra ne sme biti nula. Brojeve korisnik zadaje sa standardnog ulaza, a treba ponovljati učitavanje sve dok broj nije u odgovarajućem opsegu. Nakon toga, treba iz niza ukloniti jedan element, tako da broj predstavljen rezultujućim nizom cifara bude najveći moguć. Formirani niz ispisati na standardnom izlazu. Niz može sadržati najviše 100 elemenata. Ukoliko se za dužinu niza unese nekorektna vrednost, ponovo zatražiti unos. Primer generisanog niza 1 2 3 8 6 2 4 1 7 5 4 2 1 #define MAX 100 Primer izlaznog niza 2 3 8 6 4 1 7 5 4 2 int main() { int niz[max], i, n; do{ printf("uneti duzinu niza: "); scanf("%d", &n); while(n<=0 n>max); for(i=0; i<n; i++){ do { printf("uneti %d. cifru: ", i+1); scanf("%d", &niz[i]); while (niz[i]<(i==0?1:0) niz[i]>9); for(i=0; i<n-1 && niz[i]>=niz[i+1]; i++); while(i<n){ niz[i] = niz[i+1]; i++; n--; for(i=0; i<n; i++) printf("%d", niz[i]); Materijali za pripremu ispita iz Programiranja 2 32

P2, ispit, jun 2010. Zadatak 1. U nekoj kompaniji, podaci o službenim automobilima se čuvaju u datoteci automobili.txt. Svaki red datoteke sadrži podatke o jednom automobilu najpre registarski broj automobila (string od tačno 6 karaktera), a zatim naziv automobila koji se može sastojati od više reči. U datoteci putovanja.txt se nalaze podaci o službenim putovanjima u jednom redu datoteke se nalazi datum (u formatu dd-mm-gggg), registarski broj korišćenog automobila i broj pređenih kilometara (ceo broj). Napisati program na jeziku C koji pročita sadržaj navedenih tekst datoteka i ispiše na glavnom izlazu registarski broj i naziv automobila koji su prešli najmanji i najveći broj kilometara. U slučaju postojanja više automobila koji su prešli isti broj kilometara, uzima se u obzir onaj koji se pojavljuje prvi u datoteci. #include <stdlib.h> #include <string.h> #define NAZIV 100 #define REG 9 #define DATUM 11 typedef struct elem { char reg_broj[reg]; char naziv[naziv]; int kilometraza; struct elem *sled; Elem; void main () { Elem *prvi = NULL, *tek = NULL, *novi = NULL, *pret = NULL, *min, *max; char reg[reg], datum[datum]; int km, i; FILE *automobili, *putovanja; automobili = fopen("automobili.txt", "r"); putovanja = fopen("putovanja.txt", "r"); if (automobili == NULL putovanja == NULL) { fprintf(stderr, "Ne postoji neka od datoteka!"); exit(1); while (fscanf(automobili, "%s", reg)!= EOF) { novi = malloc(sizeof(elem)); if (novi == NULL) { fprintf(stderr, "Neuspesna alokacija dinamicke memorije"); exit(2); novi->kilometraza = 0; novi->sled = NULL; strcpy(novi->reg_broj, reg); i = fgets(novi->naziv, NAZIV-2, automobili); novi->naziv[strlen(novi->naziv)-1] = '\0'; if (prvi == NULL) prvi = novi; else pret->sled = novi; pret = novi; while (fscanf(putovanja, "%s%s%d", datum, reg, &km)!= EOF) { tek = prvi; while(tek!= NULL) { if (strcmp(reg, tek->reg_broj) == 0) { tek->kilometraza += km; break; tek = tek->sled; Materijali za pripremu ispita iz Programiranja 2 33

min = max = prvi; tek = prvi->sled; while (tek!= NULL) { if (tek->kilometraza < min->kilometraza) min = tek; else if (tek->kilometraza > max->kilometraza) max = tek; tek = tek->sled; printf("najmanje je presao: %s%s %d km\n", min->reg_broj, min->naziv, min->kilometraza); printf("najvise je presao: %s%s %d km\n", max->reg_broj, max->naziv, max->kilometraza); while(prvi) { pret = prvi; prvi = prvi->sled; free(pret); fclose(automobili); fclose(putovanja); Materijali za pripremu ispita iz Programiranja 2 34

P2, ispit, septembar 2010. Zadatak 2. Napisati program na programskom jeziku C koji računa i ispisuje površinu i koordinate donjeg levog i gornjeg desnog temena pravougaonika najveće površine konstruisanog na sledeći način: iz jednostruko ulančane liste tačaka bira se par tačaka koje predstavljaju temena na jednoj od dijagonala pravougaonika čije su stranice paralelne sa x i y osama. Program sa glavnog ulaza iz svakog reda treba da učita realne koordinate jedne tačke, sve dok se ne unesu koordinate (0,0). Od učitanih tačaka se formira jednostruko ulančana lista. Koordinate (0,0) se ne unose u listu. Broj koordinata nije unapred poznat. Učitavanje, obradu i dealokaciju liste realizovati kao zasebne potprograme. Voditi računa o ispravnoj alokaciji i dealokaciji dinamičke memorije. #include <stdlib.h> #include <math.h> typedef struct tacka { double x,y; struct tacka* sled; Elem; Elem* ucitaj () { double x,y; Elem *novi, *prvi, *preth; printf("unesite koordinate tacaka: \n"); preth = prvi = NULL; while(1) { scanf("%lf%lf",&x,&y); if (x==0 && y==0) break; novi = malloc(sizeof(elem)); if (novi == NULL) { printf("greska - dinamicka memorija!"); exit(1); novi->x = x; novi->y = y; novi->sled = NULL; if (prvi == NULL) prvi = novi; else preth->sled = novi; preth = novi; return prvi; void obradi (Elem* prvi) { Elem *tek1, *tek2, *max1, *max2; double p, maxp; if (!prvi->sled) return; tek1 = max1 = prvi; tek2 = max2 = prvi->sled; maxp = fabs(tek1->x - tek2->x) * fabs(tek1->y - tek2->y); while (tek1) { tek2 = tek1->sled; while (tek2) { p = fabs(tek1->x - tek2->x) * fabs(tek1->y - tek2->y); if (p > maxp) { maxp = p; max1 = tek1; max2 = tek2; tek2 = tek2->sled; tek1 = tek1->sled; printf("\nnajveca povrisna: %f\n", maxp); printf("kooridnate temena: (%0.2g,%0.2g) (%0.2g,%0.2g)\n", max1->x > max2->x? max2->x : max1->x, max1->y > max2->y? max2->y : max1->y, max1->x < max2->x? max2->x : max1->x, max1->y < max2->y? max2->y : max1->y); Materijali za pripremu ispita iz Programiranja 2 35