4
Dr. Željko Jurić: Tehnike programiranja /kroz programski jezik C++/ Zadaci za samostalno vježbanje 6 Kolekcija neobaveznih zadataka za ponavljanje prethodnog i utvrđivanje novog gradiva Akademska godina 2014/15 1 Zadaci za samostalno vježbanje 6. Svi zadaci dati ovdje su takvi da se mogu uraditi korištenjem isključivo gradiva prva četiri predavanja i ranije stečenog predznanja na predmetu “Osnove računarstva”. Zvjezdicom (*) su označeni zadaci koji su se pojavljivali na dosadašnjim ispitima (eventualno uz minorne modifikacije, koje suštinski ništa ne mijenjaju). Tarabom (#) su označeni zadaci koji su u prethodnim generacijama bili zadaci za zadaću. Savjetuju se studenti da koriste razne C++11 novine koje su rađene na predavanjima gdje god bi im one mogle biti od koristi, ali da također i razmisle kako bi se isti problem mogao riješiti na “stariji” način (tj. bez dodataka uvedenih u C++11). 1 * . Prikažite tačan izgled ekrana na kraju izvršavanja ovog C++ programa, uz kratko obrazloženje zbog čega su rezultati onakvi kakvi jesu. Oprez: bitan je svaki razmak, kao i prelasci u nove redove. Radi jasnoće, razmake prikažite kao kvadratiće. #include <iostream> #include <iomanip> #include <complex> void P(int *x, int *y) { while(x != y) std::cout << *x++ << " "; std::cout << std::endl; } int &Q(int &x, int &y, int &z) { std::cout << std::setw(4) << x << y << z << std::endl; x += 2; y += 3; z += 4; std::cout << x << "," << y << "," << z << std::endl; return x; } int main() { int x[] = {3, 6, 1, 2, 7, 5, 3, 2, 6, 4}; std::cout << 2 + std::complex<int>(x[1], x[3]) << std::endl; P(x + 2, x + 8); int *y(x + 6), *z(new int(x[6])); Q(x[4], *z, y[-2])--; delete z; P(y – 5, &x[9]); return 0; } 2 * . Prikažite tačan izgled ekrana na kraju izvršavanja ovog C++ programa, uz kratko obrazloženje zbog čega su rezultati onakvi kakvi jesu. Oprez: bitan je svaki razmak, kao i prelasci u nove redove. Radi jasnoće, razmake prikažite kao kvadratiće. #include <iostream> #include <iomanip> #include <complex> void F1(int a, int b) { a = b + 3; b = a - 1; std::cout << a << b; } void F2(int &a, int &b) { a = b + 3; b = a - 1; std::cout << a << b; } int *F3(int a, int *b) { std::cout << (*b)++; return new int(a); } int main() { int x(4); std::complex<double> c(4), i(0, 1); std::cout << std::setw(5) << c * c << c * i << std::setw(9) << c * i - c << std::endl; F1(x, x); std::cout << x << std::endl;

Zadaci Za Samostalno Vjezbanje 6

  • Upload
    amer

  • View
    79

  • Download
    2

Embed Size (px)

DESCRIPTION

C++ zadaci

Citation preview

  • Dr. eljko Juri: Tehnike programiranja /kroz programski jezik C++/ Zadaci za samostalno vjebanje 6 Kolekcija neobaveznih zadataka za ponavljanje prethodnog i utvrivanje novog gradiva Akademska godina 2014/15

    1

    Zadaci za samostalno vjebanje 6. Svi zadaci dati ovdje su takvi da se mogu uraditi koritenjem iskljuivo gradiva prva etiri predavanja i ranije steenog predznanja na predmetu Osnove raunarstva. Zvjezdicom (*) su oznaeni zadaci koji su se pojavljivali na dosadanjim ispitima (eventualno uz minorne modifikacije, koje sutinski nita ne mijenjaju). Tarabom (#) su oznaeni zadaci koji su u prethodnim generacijama bili zadaci za zadau. Savjetuju se studenti da koriste razne C++11 novine koje su raene na predavanjima gdje god bi im one mogle biti od koristi, ali da takoer i razmisle kako bi se isti problem mogao rijeiti na stariji nain (tj. bez dodataka uvedenih u C++11).

    1*. Prikaite taan izgled ekrana na kraju izvravanja ovog C++ programa, uz kratko obrazloenje zbog

    ega su rezultati onakvi kakvi jesu. Oprez: bitan je svaki razmak, kao i prelasci u nove redove. Radi jasnoe, razmake prikaite kao kvadratie.

    #include

    #include

    #include

    void P(int *x, int *y) {

    while(x != y) std::cout

  • Dr. eljko Juri: Tehnike programiranja /kroz programski jezik C++/ Zadaci za samostalno vjebanje 6 Kolekcija neobaveznih zadataka za ponavljanje prethodnog i utvrivanje novog gradiva Akademska godina 2014/15

    2

    F2(x, x);

    std::cout

  • Dr. eljko Juri: Tehnike programiranja /kroz programski jezik C++/ Zadaci za samostalno vjebanje 6 Kolekcija neobaveznih zadataka za ponavljanje prethodnog i utvrivanje novog gradiva Akademska godina 2014/15

    3

    9*. Napiite generiku funkciju koja prima kao parametar matricu organiziranu kao vektor vektora, iji su

    elementi proizvoljnog tipa. Funkcija treba da izvri dinamiku alokaciju prostora za pamenje matrice istog formata i istog tipa elemenata kao to je i matrica proslijeena kao parametar, zatim da kopira sadraj matrice proslijeene kao parametar u tako alociran prostor, i konano, da vrati kao rezultat dvojni pokaziva koji omoguava pristup elementima tako kreirane matrice. U sluaju da alokacija ne uspije, funkcija treba da baci tekst Kreiranje nije uspjelo kao izuzetak. U sluaju da ulazni parametar nema strukturu matrice, treba kao izuzetak baciti tekst Nekorektna matrica. Takoer, funkcija se treba pobrinuti da ni u koj sluaju ne moe doi do curenja memorije. Napiite i mali testni program u kojem ete demonstrirati kako biste pozvali ovu funkciju, i eventualno uhvatili izuzetak koji bi mogao biti baen iz nje.

    10*. Napiite generiku funkciju koja kao svoj parametar prima dvodimenzionalnu strukturu (recimo matricu,

    ali pri emu broj elemenata u svakom redu ne mora nuno biti isti) predstavljenu kao vektor vektr iji su elementi proizvoljnog tipa. Funkcija prvo treba da dinamiki alocira prostor za dvodimenzionalnu strukturu identinog oblika kao i parametar postupkom fragmentirane alokacije, zatim da u nju prepie elemente dvodimenzionalne strukture predstavljene parametrom i, konano, da kao rezultat vrati dvojni pokaziva preko kojeg se moe izvriti pristup elementima ove strukture. U sluaju da doe do problema sa alokacijom memorije, funkcija treba baciti izuzetak. Pri tome, ni u kom sluaju ne smije doi do curenja memorije. Napiite i kratki isjeak programa koji sa tastature unosi elemente matrice formata 3

    3 organizirane kao vektor vektr, a nakon toga poziva napisanu funkciju sa ciljem kreiranja

    odgovarajue dinamike matrice i, konano, ispisuje elemente tako kreirane dinamike matrice na ekran i oslobaa zauzetu memoriju. U testnom isjeku predvidite i eventualno hvatanje baenih izuzetaka.

    11*. Napiite funkciju sa jednim parametrom n koja dinamiki alocira prostor za kvadratnu matricu formata

    n

    n i popunjava sadraj matrice tablicom mnoenja za brojeve od 1 do n, tj. vrijednost elementa u

    presjeku i-tog reda i j-te kolone treba da bude i j. Funkcija treba da kao rezultat vrati dvojni pokaziva

    koji slui za pristup elementima tako kreirane matrice. Alokaciju obavite postupkom kontinualne alokacije. U sluaju da je n

    0, funkcija treba da baci tekst Broj elemenata mora biti pozitivan kao

    izuzetak. U sluaju da alokacija ne uspije, funkcija treba da baci tekst Alokacija nije uspjela kao izuzetak (pri tome treba paziti da ne doedo curenja memorije). Napisanu funkciju iskoristite u testnom programu u kojem se sa tastature unosi broj n, nakon ega se ispisuju elementi kreirane matrice (tablica mnoenja). Na kraju se vri oslobaanje prostora koji je zauzela dinamiki alocirana matrica. Pored toga, u glavnom programu treba predvidjeti hvatanje svih izuzetaka koji bi funkcija eventualno mogla baciti.

    12*. Napiite generiku funkciju koja obavlja kompaktifikaciju dinamiki alocirane matrice na nain koji

    e biti opisan. Funkcija prima 3 parametra nazvana a, m i n. a je dvojni pokaziva preko kojeg se pristupa elementima neke dinamiki alocirane dvodimenzionalne matrice za koju se pretpostavlja da je alocirana postupkom fragmentirane alokacije (tip elemenata matrice nije unaprijed poznat), dok su m i n njeni brojevi redova odnosno kolona respektivno. Funkcija treba da dinamiki alocira novu matricu istog formata kao i poetna matrica, ali ovaj put postupkom kontinualne alokacije, zatim da prepie elemente poetne matrice u novostvorenu matricu, oslobodi memoriju koju je zauzimala poetna matrica i na kraju, da preusmjeri pokaziva a da pokazuje na novokreiranu matricu. U sluaju da nova alokacija ne uspije, funkcija treba da baci izuzetak, pri emu tada izvorna matrica ne smije biti obrisana, niti pokaziva a smije biti izmijenjen. Vodite rauna da funkcija ne smije stvoriti curenje memorije ni pod kojim uvjetima.

    13*. Napiite generiku funkciju iji su parametri neki niz cijelih brojeva i broj elemenata u tom nizu.

    Funkcija treba da izvri dinamiku alokaciju grbave matrice iji pojedini redovi imaju onoliko elemenata koliko iznose odgovarajui elementi niza koji je zadan kao parametar. Na primjer, ukoliko se kao parametar zada niz iji su elementi redom 3, 5, 2, 8 i 6, tada redovi grbave matrice trebaju imati redom 3, 5, 2, 8 odnosno 6 elemenata. Kao rezultat, funkcija vraa dvostruki pokaziva preko kojeg se moe pristupiti elementima tako kreirane grbave matrice. Tip elemenata grbave matrice nije unaprijed odreen, nego se moe specificirati prilikom poziva funkcije. Elementi matrice treba inicijalizirati na podrazumijevanu vrijednost za tip elemenata matrice. Ukoliko je neki element niza koji je zadan kao parametar negativan, funkcija treba baciti izuzetak (s obzirom da ni jedan red ne moe imati negativan broj elemenata). Funkcija takoer treba baciti izuzetak u sluaju da alokacija ne uspije, pazei pri tome da ne doe do curenja memorije ni u kakvim okolnostima. Napisanu funkciju iskoristite u to kraem isjeku programa u kojem se prvo kreira grbava matrica iji redovi imaju 4, 6, 2, 7 i 5 elemenata respektivno, a nakon toga oslobaa prostor koji je zauzela ta matrica. Predvidjeti i hvatanje svih izuzetaka koji bi funkcija eventualno mogla baciti.

  • Dr. eljko Juri: Tehnike programiranja /kroz programski jezik C++/ Zadaci za samostalno vjebanje 6 Kolekcija neobaveznih zadataka za ponavljanje prethodnog i utvrivanje novog gradiva Akademska godina 2014/15

    4

    14#. Napiite generiku funkciju sa 4 parametra niz1, n1, niz2 i n2. Parametri niz1 i niz2 su

    nizovi proizvoljnog ali istog tipa elemenata, za koje emo pretpostavljati da je definirana operacija sabiranja (to ukljuuje sve brojane tipove, ali i recimo tip string), dok su n1 i n2 brojevi elemenata u tim nizovima respektivno. Funkcija treba da dinamiki alocira dvodimenzionalni niz sa n1 redova i n2 kolona istog tipa elemenata kao i u nizovima niz1 i niz2, zatim da popuni elemente tako kreiranog dvodimenzionalnog niza tako da element u itom redu i j-toj koloni bude jednak zbiru itog elementa niza niz1 i j-tog elementa niza niz2 i na kraju, da kao rezultat vrati dvojni pokaziva preko kojeg de moe pristupiti tako kreiranom dvodimenzionalnom nizu. Pri tome, koristite postupak fragmentirane alokacije. U sluaju da alokacija ne uspije, funkcija treba baciti tekst Alokacija nije uspjela, pri emu ni u kom sluaju ne smije doi do curenja memorije. Napisanu funkciju demonstrirajte u malom testnom programu koji e primijeniti ovu funkciju nad dva niza iji su elementi fiksno zadani stringovi (po vlastitom izboru) od kojih prvi niz ima 6 a drugi 4 elementa, a koji e zatim ispisati na ekran elemente kreiranog dvodimenzionalnog niza u formi tablice (da ne biste imali problema sa ispisom, neka zadani stringovi budu kratki). Na kraju, program treba prije zavretka da oslobodi memoriju zauzetu kreiranim dvodimenzionalnim nizom (bez obzira to e se to svakako desiti automatski po zavretku programa).

    15*. Napiite funkciju koja kao parametar prima vektor stringova (tj. vektor iji su elementi tipa string).

    Funkcija treba da podatke pohranjene u tom vektoru stringova organizira u memoriji koristei dinamiku alokaciju memorije. Na prvom mjestu, funkcija treba da dinamiki kreira niz pokazivaa na znakove koji ima onoliko elemenata koliko ima stringova u vektoru. Zatim, za svaki string u vektoru treba dinamiki alocirati odgovarajui prostor, prepisati sadraj stringa u kreirani prostor, i dodijeliti adresu kreiranog prostora odgovarajuem pokazivau u nizu pokazivaa. Funkcija kao rezultat vraa pokaziva na prvi element kreiranog niza pokazivaa (preko koga se moe izvriti pristup pohranjenim podacima). Ukoliko doe do bilo kakvih problema pri alokaciji, funkcija treba da baci izuzetak, uz prethodno ienje svog smea koje je bilo kreirano u postupku alokacije (tako da ni pod kojim uvjetima ne doe do curenja memorije). Napiite i kratki isjeak programa u kojem ete demonstrirati kako biste sa tastature unijeli n stringova u vektor stringova (n se takoer unosi sa tastature), pozvali napisanu funkciju, ispisali na ekran dinamiki alocirane nizove znakova koje je kreirala funkcija i, na kraju, obrisali sav alocirani prostor. Obavezno treba predviditi i hvatanje eventualno baenih izuzetaka.

    16#. Napiite program koji od korisnika trai da unese dimenzije kvadratne matrice n, a zatim da unese dvije

    matrice formata n

    n iji su elementi matrica realni brojevi. Program nakon toga treba da ispie zbir

    dvije unesene matrice. U programu treba da se nalaze funkcije KreirajMatricu, UnesiMatricu, SaberiMatrice, IspisiMatricu i UnistiMatricu. Funkcija KreirajMatricu prima kao parametre dvojni pokaziva koji slui za pristup dinamiki kreiranoj matrici (u nastavku emo ovaj pokaziva prosto zvati dinamika matrica), kao i dimenziju matrice n. Funkcija treba da alocira prostor za matricu formata n n, i dodijeli adresu alociranog prostora pokazivau koji se koristi za pristup njenim elementima (za tu svrhu, odgovarajui formalni parametar mora biti referenca na dvojni pokaziva). Funkcija UnesiMatricu popunjava matricu elementima unesenim sa tastature, a prima kao parametre dinamiku matricu i dimenziju n. Funkcija SaberiMatrice prima kao parametre dvije dinamike matrice i dimenziju n. Ova funkcija treba da kreira novu dinamiku matricu (pozivom funkcije KreirajMatricu), da je popuni zbirom dvije dinamike matrice koje su joj proslijeene kao parametri, i da vrati kao rezultat dvojni pokaziva koji slui za pristup elementima novokreirane matrice. Funkcija IspisiMatricu kao parametre prima dinamiku matricu i dimenziju n, a ispisuje elemente matrice na ekran. Konano, funkcija UnistiMatricu unistava dinamiki kreiranu matricu koja joj se prosljeuje kao parametar (zajedno sa dimenzijom n). Funkcija KreirajMatricu treba da baci izuzetak u sluaju da kreiranje ne uspije. Pri tome, ova funkcija mora da vodi rauna da u sluaju da doe do bacanja izuzetka poisti iza sebe sve uspjele alokacije, tako da ne doe do curenja memorije. Baeni izuzetak treba hvatati u glavnom programu. Obavezno testirajte sluaj kada alokacija ne uspijeva (unosom prevelikog broja n).