Programiranje 2 Programski jezik C Zadaci sa praktikuma Milena Vujošević - Janičić 2008/2009
Predgovor Ovo su prateći zadaci za praktikume koje držim iz predmenta Programiranje 2. Oni ne mogu zameniti pohad anje praktikuma niti korišćenje druge preporučene literature. Zahvaljujem svojim studentima na aktivnom učešću u nastavi čime su mi pomogli u uobličavanju ovog materijala. Svi komentari i sugestije vezane za ovaj materijal biće veoma dobrodošli. Milena Vujošević-Janičić www.matf.bg.ac.yu/~milena 1
Sadržaj 1 Praktikum 12. 2. 2009. 3 2 Praktikum 19. 2. 2009. 11 3 Praktikum 26. 2. 2009. 13 4 Praktikum 5. 03. 2009. 15 5 Praktikum 19. 03. 2009. 18 6 Praktikum 26. 03. 2009. 20 7 Praktikum 28. 03. 2009. 22 8 Praktikum 23. 4. 2009 24 9 Praktikum 30. 04. 2009. 26 10 Praktikum 7. 5. 2009 28 11 Praktikum 14. 05. 2009. 30 12 Praktikum 21. 05. 2009. 32 2
1 Praktikum 12. 2. 2009. Zadatak 1 Napisati program koji prebrojava a) znakove b) mala i velika slova c) cifre d) linije e) rečenice f) reči u ulaznoj datoteci čije se ime zadaje sa standardnog ulaza i rezultat upisuje u datoteku izlaz.txt. Zadatak 2 Ime ulazne i ime izlazne datoteke učitavaju se sa standardnog ulaza (imena nisu duža od 20 znakova). Napisati program koji sadržaj ulazne datoteke prepisuje n puta (gde se n učitava sa standardnog ulaza) u izlaznu datoteku. Na primer, ako je sadržaj ulazne datoteke Danas je lep dan\n a broj n = 3 tada sadržaj izlazne datoteke treba da bude Danas je lep dan\ndanas je lep dan\ndanas je lep dan\n Zadatak 3 Napisati program koji u datoteku prosti.txt upisuje sve proste brojeve u datom intervalu kojima je zbir cifara složen broj. Interval se zadaje učitavanjem gornje i donje granice (dva prirodna broja). Brojeve upisati u opadajućem poretku. Programiranje 1, završni ispit Zadatak 4 Data su dva rastuca niza A i B, napisati funkciju koja formira niz C koji sadrži: (a) zajedničke elemente nizova A i B. 3
Milena Vujošević Janičić Praktikum 12. 2. 2009. (b) elemente koje sadrži niz A a ne sadrži niz B. /* Funkcija kreira presek dva rastuca niza a i b i rezultat smesta u niz c (takodje u rastucem radosledu). Funkcija vraca broj elemenata preseka */ int kreiraj_presek(int a[], int n_a, int b[], int n_b, int c[]) int i = 0, j = 0, k = 0; /* Dokle god ima elemenata u oba niza... */ while (i < n_a && j < n_b) /* Ako su jednaki, ubacujemo vrednost u presek, i prelazimo na sledece elemente u oba niza. */ if(a[i] == b[j]) c[k++] = a[i]; i++; j++; /* Ako je element niza a manji, tada u tom nizu prelazimo na sledeci element */ else if(a[i] < b[j]) i++; /* Ako je element niza b manji, tada u tom nizu prelazimo na sledeci element */ else j++; /* Vracamo broj elemenata preseka */ return k; /* NAPOMENA: Sledi alternativna verzija funkcije za racunanje preseka. */ /* Funkcija kreira presek dva rastuca niza a i b i rezultat smesta u niz c (takodje u rastucem radosledu). Funkcija vraca broj elemenata preseka */ int kreiraj_presek_2 (int a[], int n_a, int b[], int n_b, int c[]) int i, j = 0, k = 0; /* za svaki element niza a...*/ 4
Milena Vujošević Janičić Praktikum 12. 2. 2009. for (i = 0; i < n_a; i++) /* Preskacemo sve elemente niza b koji su manji od tekuceg elementa niza a. Primetimo da nema inicijalizacije j=0. Ovo je zato sto jednom preskoceni elementi niza b vise nisu u igri ni za bilo koji naredni element niza a, jer su svi oni veci od tekuceg elementa niza a. */ for (; j < n_b && b[j] < a[i]; j++); /* Ako nismo preskocili sve elemente i element niza b na kome smo stali je jednak tekucem elementu niza a, tada je tekuci element niza a u preseku, i treba ga dodati */ if (j < n_b && a[i] == b[j]) c[k] = a[i]; k++; j++; /* Ako smo dosli do kraja niza b, tada ni tekuci ni bilo koji sledeci element niza a ne moze biti u preseku, jer su svi oni veci od svih elemenata niza b */ else if (j == n_b) break; /* Vracamo broj elemenata preseka */ return k; /* Funkcija kreira razliku dva rastuca niza a i b i rezultat smesta u niz c (takodje u rastucem radosledu). Funkcija vraca broj elemenata razlike */ int kreiraj_razliku (int a[], int n_a, int b[], int n_b, int c[]) int i = 0, j = 0, k = 0; /* Sve dok ima elemenata u oba niza...*/ while(i < n_a && j < n_b) /* Ako je tekuci element niza a manji, tada 5
Milena Vujošević Janičić Praktikum 12. 2. 2009. je on u razlici, jer su svi sledeci elementi niza b jos veci. Ubacujemo ga u razliku i prelazimo na sledeci element niza a */ if(a[i] < b[j]) c[k++] = a[i++]; /* Ako je tekuci element niza b manji, tada prelazimo na sledeci element u nizu b */ else if (a[i] > b[j]) j++; /* Ako su jednaki, tada ih oba preskacemo. Tekuci element niza a ocigledno nije u razlici. */ else i++; j++; /* Ako su preostali elementi niza a, tada su oni u razlici jer su svi elementi niza b bili manji od tekuceg elementa niza a, i svih koji za njim slede */ while (i < n_a) c[k++] = a[i++]; /* Vracamo broj elemenata u razlici */ return k; /* NAPOMENA: Sledi alternativna verzija funkcije za racunanje razlike */ /* Funkcija kreira razliku dva rastuca niza a i b i rezultat smesta u niz c (takodje u rastucem radosledu). Funkcija vraca broj elemenata razlike */ int kreiraj_razliku_2 (int a[], int n_a, int b[], int n_b, int c[]) int i, j = 0, k = 0; /* za svaki element niza A... */ for (i = 0; i < n_a; i++) /* Preskacemo sve elemente niza b koji su manji od tekuceg elementa niza a. 6
Milena Vujošević Janičić Praktikum 12. 2. 2009. Primetimo da nema inicijalizacije j=0. Ovo je zato sto jednom preskoceni elementi niza B vise nisu u igri ni za bilo koji naredni element niza a, jer su svi oni veci od tekuceg elementa niza a. */ for (; j < n_b && b[j] < a[i]; j++); /* Ako smo preskocili sve elemente ili smo stali kod elementa koji je veci od tekuceg elementa niza a, znaci da u nizu b ne postoji element jednak tekucem elementu niza a, tj. tekuci element niza a je u razlici a\b. */ if (j == n_b a[i] < b[j]) c[k] = a[i]; k++; /* Vracamo broj elemenata razlike */ return k; Zadatak 5 (a) Napisti funkciju koja ispituje da li se u datom neured enom nizu nalazi element x. Ako se nalazi, vretiti indeks, u suprotnom -1. (b) Napisti funkciju koja ispituje da li se u datom ured enom nizu nalazi element x. Ako se nalazi, vretiti indeks, u suprotnom -1. /* Funkcija pretrazuje niz celih brojeva duzine n, trazeci u njemu element x. Ako se element pronadje funkcija vraca indeks pozicije na kojoj je pronadjen. Ako element nije pronadjen u nizu, funkcija vraca -1, kao indikator neuspesne pretrage. */ int linearna_pretraga(int a[], int n, int x) int i; for(i = 0; i < n; i++) if(a[i] == x) return i; return -1; 7
Milena Vujošević Janičić Praktikum 12. 2. 2009. /* Funkcija trazi u sortiranom nizu a[] duzine n broj x. Vraca indeks pozicije nadjenog elementa ili -1, ako element nije pronadjen */ int binarna_pretraga (int a[], int n, int x) int l = 0; int d = n - 1; /* Dokle god je indeks l levo od indeksa... d */ while (l <= d) /* Racunamo sredisnji indeks */ int s = (l + d) / 2; /* Ako je sredisnji element veci od x, tada se x mora nalaziti u levoj polovini niza */ if (x < a[s]) d = s - 1; /* Ako je sredisnji element manji od x, tada se x mora nalaziti u desnoj polovini niza */ else if (x > a[s]) l = s + 1; else /* Ako je sredisnji element jednak x, tada smo pronasli x na poziciji s */ return s; /* ako nije pronadjen vracamo -1 */ return -1; Zadatak 6 Predstaviti apstraktni tip racionalni broj strukturom, i uvesti ime tipa Racionalni. (a) Napisati funkciju koja računa zbir dva racionalna broja, i vraća rezultat kao skraćeni razlomak. (b) Napisati funkciju koja za dva racionalna broja ispituje da li su jednaki. /* Definicija tipa "Racionalan" */ typedef struct int p; /* brojilac */ unsigned int q; /* imenilac */ 8
Milena Vujošević Janičić Praktikum 12. 2. 2009. Racionalan; /* Funkcija racuna zbir dva racionalna broja */ Racionalan saberi(racionalan * a, Racionalan * b) Racionalan s; int d; s.p = a->p * b->q + b->p * a->q; s.q = a->q * b->q; d = nzd(s.p, s.q); s.p /= d; s.q /= d; return s; /* Funkcija racuna nzd dva pozitivna broja primenom Euklidovog algoritma. */ int nzd(int n, int m) int r; /* Dokle god je m!=0, svodimo nzd(n,m) na nzd(m,r), gde je r = n % m. */ while(m) r = n % m; n = m; m = r; /* Nakon sto je m postalo 0, jasno je da je nzd(n,0) = n */ return n; /* Funkcija vraca 1 ako su dva racionalna broja jednaka, u suprotnom vraca 0 */ int jednaki(racionalan * a, Racionalan * b) return a->p * b->q == a->q * b->p; Zadatak 7 Napisati funkciju koja prihvata nisku x i karakter k i formira novu nisku 9
Milena Vujošević Janičić Praktikum 12. 2. 2009. y. (a) koja nastaje tako što se iz x izbace sva pojavljivanja karaktera k. (b) koja nastaje tako što se iz x izbace svi karakteri čiji je ASCII kod manji od k. /* Funkcija formira nisku y koja nastaje tako sto se iz niske x uklone svi karakteri jednaki karakteru k */ void ukloni_k (char *x, char k, char *y) int i, j = 0; /* Za svaki karakter niske x...*/ for(i = 0; x[i]!= \0 ; i++) if(x[i]!= k) /* ako je razlicit od k...*/ y[j++] = x[i]; /* ubacujemo ga u novu nisku y */ y[j] = \0 ; /* Terminacija stringa */ /* Funkcija formira nisku y koja nastaje tako sto se iz niske x uklone svi karakteri ciji je ASCII kod manji od k */ void ukloni_manje_od_k (char *x, char k, char *y) int i, j = 0; /* Za svaki karakter niske x...*/ for(i = 0; x[i]!= \0 ; i++) if(x[i] >= k) /* ako nije manji od k...*/ y[j++] = x[i]; /* ubacujemo ga u novu nisku y */ y[j] = \0 ; /* Terminacija stringa */ 10
2 Praktikum 19. 2. 2009. Zadatak 8 Kao argumenti komandne linije zadaju se celi brojevi. Napisati program koji računa i ispisuje zbir tih brojeva. Zadatak 9 Kao argumenti komandne linije zadaju se vlastita imena. Napisati program koji proverava da li se med u imenima nalazi ime Jelena. Zadatak 10 Napisati program koji proverava da li je med u argumentima komandne linije prisutna opcija -a. Zadatak 11 Napisati program koji u datoteku Paskal.txt uspisuje Paskalov trougao za broj N koji se unosi sa standardnog ulaza. Program napisati korišćenjem (a) dva pomoćna niza (b) jednog pomoćnog niza. Na primer, za N=7, program u datoteku treba da upiše sledeći sadržaj: 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 1 6 15 20 15 6 1 Zadatak 12 U datoteci čije se ime zadaje kao prvi argument komandne linije, nalaze se ured eni podaci o studentima (podaci su ured eni po broju indeksa studenta). Svakog studenta karakterišu ime (koje nije duže od 20 karaktera), prezime (koje nije duže od 30 karaktera), godina rod enja i broj indeksa (niska karaktera oblika mn08001). Uvesti tip student Napisati funkciju pronadji koja proverava da li se u nizu studenata nalazi student sa datim brojem indeksa (koristiti binarnu pretragu niza). Napisati program koji 11
Milena Vujošević Janičić Praktikum 19. 2. 2009. ucitava broj indeksa sa standardnog ulaza, učitava podatke iz datoteke i smešta ih u niz, poziva funkciju pronadji i štampa odgovarajuću poruku na standardni izlaz. Zadatak 13 (a) Napisati funkciju koja ispituje da li je jedna reč prefiks druge reči. (b) Napisati program koji za svaku liniju teksta datoteke čije se ime zadaje kao prvi argument komandne linije proverava da li je reč koja je zadata u prvoj liniji datoteke njen prefiks i štampa odgovarajuću poruku u datoteku čije se ime zadaje kao drugi argument komandne linije. Pretpostaviti da linija teksta nije duža od 100 karaktera. Na primer, ako datoteka ima sledeći sadržaj Ana Anagrami su lepi. Danas je lep dan! Program treba da kreira datoteku u koju će da upiše: Ana jeste prefiks linije Anagrami su lepi. Ana nije prefiks linije Danas je lep dan! Zadatak 14 (a) Napisati funkciju koja ispituje da li je jedna reč sufiks druge reči. (b) Napisati program koji za svaku liniju teksta datoteke čije se ime zadaje kao prvi argument komandne linije proverava da li je reč koja je zadata u prvoj liniji datoteke njen sufiks i štampa odgovarajuću poruku u datoteku čije se ime zadaje kao drugi argument komandne linije. Pretpostaviti da linija teksta nije duža od 100 karaktera. Na primer, ako datoteka ima sledeći sadržaj dan! Anagrami su lepi. Danas je lep dan! Program treba da kreira datoteku u koju će da upiše: dan! nije sufiks linije Anagrami su lepi. dan! jeste sufiks linije Danas je lep dan! 12
3 Praktikum 26. 2. 2009. Zadatak 15 Napisati funkciju int SumaPrvogIPoslednjegBita(unsigned x) koja izračunava sumu prvog i poslednjeg bita broja x. Napisati program koji testira rad ove funkcije. Broj x se zadaje kao argument komandne linije. Zadatak 16 Sastaviti funkciju int Broj01(unsigned short n) koja za dati broj n vraća 1 ako u njegovom binarnom zapisu ima više jednica nego nula, a inače vraća 0. Napisati program koji tu funkciju testira za broj koji se zadaje sa standardnog ulaza. Zadatak 17 Sastaviti funkciju koja za dati ceo broj x tipa unsigned long int vraća (a) najveći (b) najmanji ceo broj koji se sastoji od istog broja 0 i 1 kao broj x i koji je isto tipa unsigned long int. Zadatak 18 Napisati funkciju koja vraća kao rezultat broj koji se dobija od neoznačenog broja x tako što mu se sačuvaju n krajnjih desnih bitova, a ostali se postave na nulu. Napisati program koji tu funkciju testira za broj koji se zadaje sa standardnog ulaza. Na primer, ako je x=54 (00...00110110) a n=3, tada funkcija treba da vrati broj 6 (00...00000110). Zadatak 19 Napisati funkciju koja vraća kao rezultat broj koji se dobija od neoznačenog broja x tako što mu očistiti n krajnjih desnih bitova (postaviti nule). Napisati program koji tu funkciju testira za broj koji se zadaje sa standardnog ulaza. Na primer, ako je x=54 (00...00110110) a n=3, tada funkcija treba da vrati broj 48 (00...00110000). Zadatak 20 Napisati funkciju koja vraća kao rezultat broj koji se dobija od neoznačenog broja x tako što mu očistiti n bitova (postaviti nule) počev od pozicije p. Napisati program koji tu funkciju testira za broj koji se zadaje sa standardnog ulaza. Zadatak 21 Napisati funkciju koja vrši rotaciju neoznačenog broja x za n pozicija u levo. Napisati program koji tu funkciju testira za broj koji se zadaje sa standardnog ulaza. Zadatak 22 Tip polinom je definisan na sledeći način: 13
Milena Vujošević Janičić Praktikum 26. 2. 2009. #define STEPEN 10 typedef struct Polinom unsigned char stepen; short koef[stepen]; polinom; Sastaviti funkciju koja izračunava n-ti izvod ovako definisanog polinoma i program koji testira rad te funkcije za polinom čiji su stepen i koeficijenti zadati u datoteci polinom.txt. 14
4 Praktikum 5. 03. 2009. Zadatak 23 Isprobati primere sortiranja na stranici: http: // www. matf. bg. ac. rs/ ~ filip/ op/ sortiranja. html Zadatak 24 Napisati biblioteku funkcija za sortiranje i za generisanje nizova slučajnih brojeva. Uputstvo: 1. Napisati funkcije za sortiranje niza u rastućem poretku za razne tipove elemenata (float, char, long) i raznim metodama (select, insert, bubble). Na primer, prototip funkcije za sortiranje niza celih brojeva algoritmom Selection sort treba da bude: void selection_sort_long(long a[], int n) Objedniti sve te funkcije sortiranja u jednu datoteku sort.c (bez main funkcije), a zatim kreirati datoteku sort.h koje će sadržati deklaracije (prototipove) svih napisanih funkcija za sortiranje. 2. Napisati funkcije koje generišu niz slučajnih brojeva različitih tipova (float, char, long) dužine n, iz opsega [l, d]. Prototip funkcije za generisanje niza od n celih brojeva iz opsega [l,d] treba da bude: void random_niz_long(long a[], int n, long l, long d) Napomena: Funkcija rand(), koja je potrebna za implementaciju gornjih funkcija, nalazi se u standardnoj biblioteci stdlib i vraća pseudo-slučajan broj iz intervala [0,RAND_MAX], gde je RAND_MAX konstanta definisana u stdlib.h. Broj celobrojnog tipa (npr. tipa long) iz opsega [l, d] se može generisati sledećim izrazom: broj = l + (long)rand() % (d-l); Slično, broj realnog tipa (npr. float) iz opsega [l, d] se može generisati sledećim izrazom: broj = l + ((float)rand()/rand_max) *(d-l); Inicijalizacija početnih vrednosti (semena) algoritma za generisanje slučajnih brojeva ostvaruje se pozivom funkcije: srand(time(null)); (uključiti i zaglavlje <time.h> zbog upotrebe time funkcije). 15
Milena Vujošević Janičić Praktikum 5. 03. 2009. Objedniti sve funkcije u jedan fajl random.c, a zatim kreirati zaglavlje random.h koje će sadržati deklaracije (prototipove) svih napisanih funkcija za generisanje slučajnih brojeva. 3. U fajlu main.c napisati main() funkciju, uz uključenje zaglavlja sort.h i random.h direktivom #include (na primer, #include "sort.h"). U okviru funkcije main(), pozivom jedne od funkcija za generisanje slučajnog niza brojeva, generisati niz od 15 slučajnih brojeva u intervalu od -10000 do 10000, sortirati nekom od funkcija i ispisati tako dobijeni sortirani niz na standardni izlaz. 4. Odvojeno prevesti svaku datoteku sa izvornim kodom. Na kraju sve dobijene objektne datoteke povezati u jednu izvršnu datoteku mojsort. Uputstvo: Program prevesti naredbama: gcc -c -o sort.o sort.c gcc -c -o random.o random.c gcc -c -o main.o main.c gcc -o mojsort main.o sort.o random.o Opcija -c prilikom prevod enja označava kreiranje objektnog fajla (a ne izvršnog, što je podrazumevana vrednost), opcija -o zahteva navod enje i imena datoteke u koju će rezultat prevod enja biti smešten (umesto podrazumevanog a.out). 5. Proširiti funkciju main() iz prethodnog primera tako da omogućava korisniku izbor da li želi da ručno unese brojeve za sortiranje, ili želi da se niz date dužine generiše na slučajan način. Ovo uraditi argumentima komandne linije: npr. ako se program pozove sa:./sort -r 10 tada ce se na slučajan način generisati niz od deset brojeva, dok ako se navede:./sort -i tada se od korisnika očekuje da brojeve unosi sa standardnog ulaza. Implementirati i opciju -c:./sort -c 2-1 5 67 2 kojom se specificira da se niz unosi sa komandne linije nakon opcije -c. 6. Prethodni program obogatiti još i mogućnošću rada sa skupovima predstavljenim preko sortiranih nizova. Napisati funkcije za izračunavanje unije, preseka, razlike i pripadanja, objediniti ih u fajl skup.c a zatim kreirati zaglavlje skup.h. Zadatak 25 Za predstavljanje velikog broja uvesti tip #define MAX_CIFRE 100 enum ZNAK PLUS, MINUS; typedef struct broj 16
Milena Vujošević Janičić Praktikum 5. 03. 2009. int cifre[max_cifre]; int duzina; ZNAK znak; VelikiBroj; Napisati funkciju koja izračunava da li su dva velika broja jednaka; veći od dva velika broja; zbir dva velika broja; razliku dva velika broja; množenje velikog broja cifrom; množenje dva velika broja; celobrojno deljenje dva velika broja; faktorijel prirodnog broja tačno u svakoj cifri. Zadatak 26 Odrediti dužinu najdužeg uspona u datom nizu a. Uspon od i do j u nizu a je opisan sa: za vrednosti k1 i k2 takve da je i k1 < k2 j važi a[k1] < a[k2]. Njegova dužina je tada j-i+1. Zadatak 27 Odrediti dužinu najdužeg platoa u datom nizu a. Plato od i do j u nizu a je opisan sa: za vrednosti k takve da je i k j važi a[i] = a[k]. Njegova dužina je tada j-i+1. 17
5 Praktikum 19. 03. 2009. Zadatak 28 Napisati funkcije koje sortiraju niz struktura tačaka na osnovu (a) Njihovog rastojanja od koordinatnog početka. (b) x koordinate date tačke. (c) y koordinate date tačke. Tip tacka zadat je strukturom typedef struct _tacka int x; int y; tacka; Napisati program koji učitava niz tačaka iz datoteke čije se ime zadaje kao argument komandne linije, i u zavisnosti od prisutnih opcija u komandnoj liniji, sortira tačke po jednom od prethodna tri kriterijuma i rezultat upisuje u datoteku čije se ime zadaje kao drugi argument komandne linije. Na primer, ako se program pokrene sa a.out -b tacke.txt sorttacke.txt tada program treba da sortira tačke iz datoteke tacka.txt na osnovu x koordinate i da sortiran rezultat upiše u datoteku sorttacke.txt. Zadatak 29 Neka je definisana sledeća struktura podataka typedef struct dete char ime[max_ime]; char prezime[max_ime]; unsigned godiste; Dete; Napisati funkciju koja srotira niz dece po godištu, a ukoliko su deca istog godišta, tada ih sortirati leksikografski po prezimenu i imenu. Napisati program koji učitava podatke o deci koji se nalaze u datoteci čije se ime zadaje kao prvi argument komandne linije, 18
Milena Vujošević Janičić Praktikum 19. 03. 2009. sortira ih i sortirani niz upisuje u datoteku čije se ime zadaje kao drugi argument komandne linije. Pretpostaviti da u ulaznoj datoteci nisu zadati podaci o više od 100 dece. Zadatak 30 Napisati funkciju koja sortira niz velikih brojeva i program koji učitava niz velikih brojeva iz datoteke veliki_brojevi.txt i upisuje sortirane velike brojeve u datoteku sortirani_brojevi.txt. Pretpostaviti da datoteka veliki_brojevi.txt ne sadrži više od 100 velikih brojeva (ukoliko sadrži više od 100 brojeva prijaviti grešku), kao i da nijedan veliki broj nema više od 100 cifara. Za predstavljanje velikih brojeva koristiti strukturu #define MAX_CIFRE 100 enum ZNAK PLUS, MINUS; typedef struct broj int cifre[max_cifre]; int duzina; ZNAK znak; VelikiBroj; Zadatak 31 Napisati program koji obezbed uje da se unese niz karaktera (manje od 100 karaktera) i da se onda on prikaže sortiran i to tako da svako slovo koje se nad e na parnoj poziciji sortiranog niza bude pretvoreno u odgovarajuće veliko, a svako slovo koje se nalazi na neparnoj poziciji sortiranog niza bude pretvoreno u odgovarajuće malo slovo. Na primer, ako se unese niz Danas je lep dan izlaz iz programa treba da bude: aaaddejlnns 19
6 Praktikum 26. 03. 2009. Zadatak 32 Napisati program koji (a) iterativno (b) rekurzivno računa n-ti Fibonačijev broj, pri čemu se broj n zadaje sa standardnog ulaza. Uporediti brzine izvršavanja ova dva programa za n=5 i n=55. Zadatak 33 Napisati program u kome se korišćenjem rekurzivne funkcije izračunava NZD brojeva x i y koji se unose kao argumenti komandne linije. y, x = 0 nzd(x, y) = nzd(y%x, x), x 0 Zadatak 34 Napisati program u kome se korišćenjem rekurzivne funkcije ispisuje broj koji se piše istim ciframa ali u obrnutom poretku. Broj se unosi sa standardnog ulaza. Zadatak 35 Napisati rekurzivnu funkciju koja izračunava broj cifara njenog argumenta i program koji tu funkciju testira za vrednost koja se unosi sa standardnog ulaza. Zadatak 36 Napisati rekurzivnu funkciju koja vraća odgovor na pitanje da li je broj cifara njenog argumenta paran (ne koristeći prebrojavanje broja cifara broja) i program koji tu funkciju testira za vrednost koja se unosi sa standardnog ulaza. Zadatak 37 Napisati rekurzivne funkcije koje ispisuju elemente datog niza s leva na desno, odnosno s desna na levo i program koji te funkcije testira za vrednosti koje se unose sa standardnog ulaza. Zadatak 38 Napisati rekurzivnu funkciju koja proverava da li je data niska karaktera palindrom i program koji tu funkciju testira za nisku koja se zadaje kao argument komandne linije. Zadatak 39 Napisati rekurzivnu funkciju koja proverva da li su svi elementi datog niza jednaki datom broju i program koji tu funkciju testira za vrednosti koje se zadaju sa standardnog ulaza. Zadatak 40 Napisati rekurzivnu funkciju koja proverava da li postoji element datog niza koji je jednak datom broju i program koji tu funkciju testira za vrednosti koje se zadaju sa standardnog ulaza. 20
Milena Vujošević Janičić Praktikum 26. 03. 2009. Zadatak 41 Napisati rekurzivnu funkciju koja izracunava max/min niza brojeva i program koji tu funkciju testira za vrednosti koje se unose sa standardnog ulaza. Zadatak 42 Napisati rekurzivnu funkciju koja leksikografski poredi dve niske karaktera i program koji tu funkciju testira za vrednosti koje se zadaju kako argumenti komandne linije. Zadatak 43 Napisati rekurzivnu funkciju koja prevodi dati dekadni broj u niz binarnih cifara datog broja i program koji tu funkciju testira za vrednosti koje se unose sa standardnog ulaza. Zadatak 44 Napisati rekurzivnu funkciju koja izračunava sumu bitova datog neoznačenog broja i program koji tu funkciju testira za broj koji se unosi sa standardnog ulaza. Zadatak 45 Napisati rekurzivnu funkciju koja obrće datu nisku karaktera. 21
7 Praktikum 28. 03. 2009. Zadatak 46 Napisati program koji sa standardnog ulaza ucitava dva stringa, s i t (duzine manje od 20 karaktera), sortira nizove njihovih karaktera (biblioteckom qsort funkcijom) i ispituje i stampa da li su s i t anagrami (npr. vrata, vatra). Zadatak 47 Napisati program koji sa standardnog ulaza ucitava prvo ceo broj n (n <= 10) a zatim niz S od n stringova (maksimalna duzina stringa je 20 karaktera). Sortira niz S (bibliotečkom funkcijom qsort) i proveriti da li u njemu ima identičnih stringova. Zadatak 48 Neka je struktura artikal definisana na sledeći način. typedef struct _artikal long bar_kod; char ime[max_ime]; float pdv; float cena; artikal; (a) Inicijalizovati niz struktura artikal tako da sadrži sledeće podatke: 123456, "cokolada", 18.0, 100.0, 234567, "mleko", 12.0, 70.0, 123567, "kafa", 18.0, 116.0, 987654, "kikiriki", 18.0, 60.0, 222333,"cips", 18.0, 50.0, 444555,"smoki", 18.0, 30.0, 666888,"banana", 18.0, 88.0, 369258,"jabuka", 18.0, 115.0 Napisati funkciju koja štampa vrednosti niza artikala. (b) Koristeći funkciju lfind iz standardne biblioteke proveriti da li neki artikal pripada nizu artikala. Pretraživanje vršiti po bar kodu po ceni po pdv-u po imenu 22
Milena Vujošević Janičić Praktikum 28. 03. 2009. za komletnu strukturu (proveriti da li 666888,"banana", 18.0, 88.0 i 123999,"slag", 18.0, 45.0 pripadaju nizu artikala). Nakon svakog pretraživanja odštampati sadržaj celog niza. (b) Koristeći funkciju lsearch iz standardne biblioteke proveriti da li artikali 666888,"banana", 18.0, 88.0 i 123999,"slag", 18.0, 45.0 pripadaju nizu artikala. Nakon svakog pretraživanja odštampati sadržaj celog niza. (c) Sortirati niz struktura artikal koristeći funkciju qsort iz standardne biblioteke po bar kodu ceni pdv-u imenu Koristeći funkciju bsearch iz standardne biblioteke proveriti da li neki artikal pripada odgovarajućem sortiranom nizu (na primer, ako je niz artikala sortiran po imenima artikala, onda proveriti da li nizu pripada artikal banana i artikal kruska, ako je niz sortiran po cenama, onda proveriti da li postoji artikal sa cenom 88 i artikal sa cenom 200). Zadatak 49 Napisati program u kome se prvo inicijalizuje statički niz struktura osoba sa članovima ime i prezime (ured en u rastućem poretku prezimena) sa manje od 10 elemenata, a zatim se učitava jedan karakter i pronalazi (bibliotečkom funkcijom bsearch) i štampa jedna struktura iz niza osoba čije prezime počinje tim kakrakterom (ako takva osoba postoji). 23
8 Praktikum 23. 4. 2009 Zadatak 50 Napisati funkciju koja izračunava limes funkcije f(x) u tački a. Adresa funkcije f čiji se limes računa se prenosi kao parametar funkciji za računanje limesa. Limes se računa sledećom aproksimacijom (vrednost n uneti sa standardnog ulaza): lim x >a f(x) = lim n > f(a + 1/n) Zadatak 51 Napisati funkciju koja odred uje integral funkcije f(x) na intervalu [a, b]. Adresa funkcije f se prenosi kao parametar. Integral se računa prema formuli: b a f(a) + f(b) f(x) = h ( + Σ n 2 i=1f(a + i h)) gde je h = (b a)/n (vrednost n uneti sa standardnog ulaza). Zadatak 52 Napisati program koji (jednim prolaskom kroz niz) odred uje dva najveća elementa niza A. Zadatak 53 Napisati program koji odred uje srednji po veličini element niza (ako je n dužina niza, odrediti n/2-ti najmanji element). Zadatak 54 Napisati program koji za dati string koji predstavlja broj u rimskom zapisu odred uje vrednost tog celog broja. Zadatak 55 (a) Definisati strukturu kojom se predstavlja tačka u trodimenzionalnom prostoru. (b) Definisati strukturu kojom se predstavlja sfera u trodimenzionalnom prostoru (tačka koordinate centra i poluprečnik). (c) Definisati strukturu kojom se predstavlja ravan u prostoru (preko odgovarajućih koeficijenata). (d) Napisati funkciju koja odred uje rastojanje izmed u dve tačke. (e) Napisati funkciju koja ispituje da li se data tačka prostora nalazi u datoj sferi. (f) Napisati funkciju koja ispituje da li data tačka prostora pripada preseku date ravni i date sfere. 24
Milena Vujošević Janičić Praktikum 23. 4. 2009 (g) Napisati program koji testira upotrebu ovih funkcija. Zadatak 56 Definisana je struktura: typedef struct int dan; int mesec; int godina; Datum; Napisati funkciju koja poredi dva datuma i program koji učitava datume preko standardnog ulaza (ne više od 100 datuma), sortira ih pozivajući funkciju qsort iz standardne biblioteke i potom sa standardnog ulaza učitava datum i pozivanjem funkcije bsearch iz standardne biblioteke proverava da li takav datum postoji med u prethodno unetim datumima. 25
9 Praktikum 30. 04. 2009. Zadatak 57 Napisati program koji omogućava unos dimenzije kvadratne matrice i unos elemenata matrice sa standardnog ulaza. Napisati funkciju koja računa 1. zbir elemenata matrice dimenzija n m. 2. proizvod elemenata ispod/iznad glavne dijagonale matrice dimenzija n n. 3. zbir elemenata ispod/iznad glavne dijagonale matrice dimenzija n n. Program treba da testira rad ovih funkcija i odštampa odgovarajuće vrednosti na standardni izlaz. Zadatak 58 U datoteci je zapisana matrica i to tako što se u prvom redu nalazi dva broja koji predstavljaju broj vrsta n i broj kolona m matrice. Dalje se u svakom redu datoteke kojih ima n nalazi po m brojeva. Učitati date brojeve iz datoteke u odgovarajuću matricu i zatim napisati funkcije koje izračunavaju 1. zbir kvadrata elemenata matrice 2. zbir trećih stepena elemenata matrice ispod glavne dijagonale 3. zbir elemenata za svaku vrstu matrice 4. redni broj vrste sa najvećim/najmanjim zbirom 5. zbir elemenata za svaku kolonu matrice 6. redni broj kolone sa najvećim/najmanjim zbirom Program treba da izračuna sve ove podatke i da ih upiše na kraj datoteke. Na primer, matrica dimenzija 3x4 se zadaje na sledeći način: 3 4 1 2 3 4 2 3 4 5 3 4 5 6 26
Milena Vujošević Janičić Praktikum 30. 04. 2009. Zadatak 59 Napisati funkciju koja omogućava računanje proizvoda dve kvadratne matrice dimenzija n n. Napisati program koji omogućava unošenje dve kvadratne matrice i štampanje proizvoda te dve matrice. Zadatak 60 Napisati program koji formira HTML datoteku u koju upisuje tabelu čiji je sadržaj tablica množenja brojeva 1. od 1 do 10 2. od 1 do broja n koji se zadaje kao argument komandne linije Program treba da odštampa na standardni izlaz ime datoteke u koju je upisan html dokument. Zadatak 61 Napisati C program koji kreira i na standardan i izlaz izdaje opis HTML dokument koji sadrži tabelu koja se sastoji od tri kolone. Zaglavlja kolona su redom niske: n, kvadrat i kub. U prvoj koloni se nalaze vrednosti od 1 do 15, a u drugoj i trećoj koloni su kvadrati i kubovi tih vrednosti, redom. Porenuti dati program koristeći preusmeravanje. Zadatak 62 Napisati program koji prikazuje prvih n Fibonačijevih stringova: F[0] = "a" F[1] = "b" F[i] = F[i-1] + F[i-2], i > 1 27
10 Praktikum 7. 5. 2009 Zadatak 63 Napisati program koji implementira celobrojni niz koji dinamički raste (korišćenjem funkcije realloc()). Korisnik najpre unosi procenu veličine niza (potrebnu za prvu alokaciju memorije). Program treba da omogući dodavanje jednog po jednog elementa na kraj niza. Kada se prekorači trenutni kapacitet niza, tada se kapacitet povećava za 20% trenutne veličine niza. Elementi se unose u niz dok korisnik ne unese oznaku kraja ulaza (ctrl-d). Na kraju se štampaju uneti elementi niza unazad. Zadatak 64 Napisati funkciju koja formira listu studenata tako što se prvo unosi šifra i ukoliko je ona različita od nule onda se unose ime i prezime, a u suprotnom se prekida formiranje liste. Za svakog studenta pamtiti ime, prezime i šifru. Ispisati zatim tako formiranu listu i potom osloboditi memoriju. typedef struct _Element unsigned sifra; char ime[20]; char prezime[20]; struct _Element *sledeci; Element; Kružna (ciklična) lista Zadatak 65 (februar 2006.) Grupa od n plesača (na čijim kostimima su u smeru kazaljke na satu redom brojevi od 1 do n) izvodi svoju plesnu tačku tako što formiraju krug iz kog najpre izlazi k-ti plesač (odbrojava se počev od plesača označenog brojem 1 u smeru kretanja kazaljke na satu). Preostali plesači obrazuju manji krug iz kog opet izlazi k-ti plesač (odbrojava se pocev od sledećeg suseda prethodno izbačenog, opet u smeru kazaljke na satu). Izlasci iz kruga se nastavljaju sve dok svi plesači ne budu isključeni. Celi brojevi n, k (k < n) se učitavaju sa standardnog ulaza. Napisati program koji će na standardni izlaz ispisati redne brojeve plesača u redosledu napuštanja kruga. PRIMER: za n = 5, k = 3 redosled izlaska je 3 1 5 2 4. 28
Milena Vujošević Janičić Praktikum 7. 5. 2009 početak ciklične liste A B C... Z Figure 10.1: Kružna lista Red početak reda (brisanje get) kraj reda (dodavanje add) A B... X NULL novi element Y početak reda novi kraj reda A B... X Y NULL početak reda nakon brisanja kraj reda B... X Y NULL Figure 10.2: Red Zadatak 66 Napisati osnovne funkcije potrebne za rad sa redom koji se implementira preko jednostruko povezane liste. Za red se, pored pokazivača na početak reda, čuva i pokazivač na kraj reda, kako bi se ubrzalo dodavanje elemenata na kraj reda. Pored funkcija za pravljenje čvora i za oslobad anje memorije koju red zauzima, napisati funkciju koja čita vrednost sa početka reda, funkciju čita i uklanja vrednost sa početka reda i funkciju koja dodaje element na kraj reda. Napisati i program koji testira rad ovih funkcija. 29
11 Praktikum 14. 05. 2009. Zadatak 67 Napisati program koji prebrojava pojavljivanja etiketa (bez atributa) HTML datoteke čije se ime zadaje kao argument komandne linije. Sadržaj rezultujuće liste ispisati na standardni izlaz. Za forimrianje liste koristiti strukturu: typedef struct _Element unsigned broj_pojavljivanja; char etiketa[20]; struct _Element *sledeci; Element; Zadatak 68 Napisati program koji prebrojava pojavljivanja za svaku od reči datoteke čije se ime zadaje kao argument komandne linije. Zadatak rešiti korišćenjem ured ene liste: napisati funkciju koja pretražuje listu i ukoliko pronad e reč u listi povećava njen broj pojavljivanja a u slučaju da se reč nije ranije pojavljivala dodaje tu reč na odgovarajuće mesto u listi tako da lista ostane leksikografski sortirana. Sadržaj rezultujuće liste ispisati na standardni izlaz. Za forimrianje liste koristiti strukturu: typedef struct _Element unsigned broj_pojavljivanja; char rec[20]; struct _Element *sledeci; Element; Zadatak 69 Napisati program koji formira sortirane liste L1 i L2. funkciju koja Napisati zatim formira listu L3 koja sadrzi sve elemente koji pripadaju datoj listi L1, a ne pripadaju datoj listi L2. formira listu L3 koja sadrzi elemente koji pripadaju i datoj listi L1, i datoj listi L2. Obezbediti da program testira rad ovih funkcija. 30
Milena Vujošević Janičić Praktikum 14. 05. 2009. Zadatak 70 Napisati funkciju koja obrce datu jednostruko povezanu listu. Funkcija ne treba da kreira nove čvorove, vec da samo postojece čvorove obrnuto rasporedi. Napisati program koji testira ovu funkciju. Zadatak 71 Neka su date dve jednostruko povezane liste L1 i L2. Napisati funkciju koja od tih lista formira jednu novu listu koja sadrzi alternirajuce rasporedjene elemente lista L1 i L2 (prvi element iz L1, prvi element iz L2, drugi element L1, drugi element L2...itd.). Ne formirati nove čvorove, vec samo postojece čvorove rasporediti u jednu listu. Napisati i program koji testira ovu funkciju. Zadatak 72 Napisati funkciju koja formira listu studenata tako što se podaci o studentima učitavaju iz datoteke čije se ime zadaje kao argument komandne linije. U svakom redu datoteke nalaze se podaci o studentu i to šifra, ime i prezime. Napisati funkciju koja pretražuje da li neki student (koji se traži na osnovu šifre) pripada listi ili ne. Napisati program koji testira rad ovih funkcija. Zadatak 73 Jun, 2004. I grupa Data je datotka brojevi.txt koja sadrži cele brojeve, po jedan u svakom redu. 1. Napisati funkciju koja iz zadate datoteke učitava brojeve i smešta ih u listu. 2. Napisati funkciju koja u jednom prolazu kroz zadatu listu celih brojeva pronalazi maximalan strogo rastući podniz. 3. Koristeći funkcije pod a) i b) napisati program koji u datoteku Rezultat.txt upisuje nad eni strogo rastući podniz. 31
12 Praktikum 21. 05. 2009. Zadatak 74 Septembar, 2005. Napisati program koji na standardni izlaz ispisuje naziv (bez atributa) najčešće korišćene etikete u datoteci ulaz.htm. Ako ima više takvih, ispisati ma koju. Za prebrojavanje pojavljivanja etiketa koristiti ured eno binarno stablo. Pretpostaviti da je ulazna datoteka sintaksno korektna. Zadatak 75 Drugi kolokvijum za II tok 2004. Napisati program koji iz tekstualne datoteke čiji je ime dato kao argument komandne linije učitava različite prirodne brojeve i: 1. dodaje ih redom u uredjeno binarno stablo 2. u dobijenom drvetu izračunava dužinu najdužeg puta od korena do nekog lista i 3. štampa u rastućem poretku (bez ponavljanja) sve brojeve koji su nalaze na putevima te dužine od korena do listova. Zadatak 76 Nivoi drveta su definisani na sledeći način: koren je na nultom nivou, deca od korena su na prvom nivou, njihova deca na drugom nivou i tako redom. 1. Napisati funkciju koja izračunava koliko se čvorova nalazi na n-tom nivou. 2. Napisati funkciju koja izračunava maksimalnu vrednost čvorova na n-tom nivou. 3. Napisati funkciju koja izračunava zbir čvorova na n-tom nivou. 4. Napisati program koji testira rad ovih funkcija. Zadatak 77 Napisati funkciju koja štampa sadržaj čvorova koji se nalaze na n-tom nivou u drvetu. Napisati program koji štampa sadržaj drveta po nivoima: 1. koristeći prethodnu funkciju 2. bez korišćenja prethodne funkcije (uz samo jedan prolazak kroz drvo korišćenjem pomoćne liste). Zadatak 78 Napisati funkciju koja štampa pozitivne vrednosti listova drveta i program koji tu funkciju testira. 32