Uvod u programski jezik EDIN PAŠIĆ 2013 BIHAĆ SADRŽAJ UVOD ....................................................................................................................................... iv 1. RAZVOJNO OKRUŽENJE ................................................................................................... 1 1.1. Izgled programa ........................................................................................................... 3 1.2. Kreiranje datoteke ........................................................................................................ 4 1.3. Struktura programa....................................................................................................... 7 1.4. Pokretanje programa .................................................................................................... 8 1.5. Greške .......................................................................................................................... 9 2. NAREDBE ZA IZLAZ I ULAZ .......................................................................................... 12 2.1. Početni program ......................................................................................................... 12 2.2. Naredba cout .............................................................................................................. 13 2.3. Varijacije naredbe cout .............................................................................................. 13 2.4. Osnovni tipovi podataka ............................................................................................ 17 2.5. Deklaracija varijabli ................................................................................................... 19 2.6. Operatori i izrazi ........................................................................................................ 21 2.6.1. Operator pridruživanja........................................................................................ 21 2.6.2. Inicijalizacija varijabli ........................................................................................ 21 2.6.3. Aritmetički operatori .......................................................................................... 22 2.7. Naredba za ulaz .......................................................................................................... 25 2.8. Zadaci za samostalan rad ........................................................................................... 29 3. MATEMATIČKE FUNKCIJE ............................................................................................ 29 3.1. Decimalni brojevi ....................................................................................................... 31 3.1.1. Fixed ................................................................................................................... 31 3.1.2. Setprecision ........................................................................................................ 31 3.2. Ostali manipulatori ..................................................................................................... 32 4. NAREDBE ........................................................................................................................... 33 4.1. Sekvenca ili blok ........................................................................................................ 33 4.2. Relacijski operatori .................................................................................................... 34 4.3. Selekcije ..................................................................................................................... 34 4.3.1. Naredba if ........................................................................................................... 34 4.3.2. Naredba if-else.................................................................................................... 36 4.2.3. Zadaci za samostalan rad .................................................................................... 40 4.4. Logički operatori ........................................................................................................ 41 4.4.1. Zadaci za samostalan rad .................................................................................... 45 4.5. Ciklusi ili petlje .......................................................................................................... 46 4.5.1. For petlja ............................................................................................................. 46 4.5.2. Zadaci za samostalan rad .................................................................................... 52 4.5.3. While petlja ........................................................................................................ 54 4.5.4. Do while petlja ................................................................................................... 57 4.5.5. Naredba break ..................................................................................................... 58 4.5.6. Zadaci za samostalan rad .................................................................................... 58 5. NIZOVI (POLJA) ................................................................................................................ 59 5.1. Jednodimenzionalni nizovi......................................................................................... 59 ii 5.2. Zadaci za samostalan rad ........................................................................................... 64 6. STRING ............................................................................................................................... 64 6.1. Deklaracija stringa ..................................................................................................... 65 6.2. Čitanje i ispisivanje znakova ...................................................................................... 65 6.3. Ispitivanje znakova..................................................................................................... 66 6.4. Rad sa stringom (nizom znakova) .............................................................................. 70 6.5. Zadaci za samostalan rad ........................................................................................... 75 7. ZADACI SA OPĆINSKIH TAKMIČENJA ........................................................................ 76 7.1. Zadaci 2010 ................................................................................................................ 76 7.2. Zadaci 2011 ................................................................................................................ 79 7.3. Zadaci 2012 ................................................................................................................ 82 7.4. Zadaci 2013 ................................................................................................................ 85 8. ZADACI SA KANTONALNIH TAKMIČENJA ................................................................ 88 8.1. Zadaci 2011 ................................................................................................................ 88 8.2. Zadaci 2012 ................................................................................................................ 91 8.3. Zadaci 2013 ................................................................................................................ 94 9. TEORETSKI ZADACI SA OPĆINSKIH TAKMIČENJA ................................................. 97 9.1. Zadaci 2010 ................................................................................................................ 97 9.2. Zadaci 2011 ................................................................................................................ 98 9.3. Zadaci 2012 ................................................................................................................ 99 9.4. Zadaci 2013 .............................................................................................................. 102 10. TEORETSKI ZADACI SA KANTONALNIH TAKMIČENJA ..................................... 105 10.1. Zadaci 2011 ............................................................................................................ 105 10.2. Zadaci 2012 ............................................................................................................ 106 10.3. Zadaci 2013 ............................................................................................................ 109 iii UVOD Ova skripta je namijenjena učenicima koji žele naučiti programirati u C++, a nemaju neko prethodno znanje ni o jednom programskom jeziku. Naravno, bilo kakvo predznanje o programskim jezicima bi bilo od velikog značaja za bolje razumijevanje, ali nije neophodno. Napisana je da služi kao interni udžbenik u OŠ "Kamenica" za pripremu učenika za takmičenja iz programiranja u Unsko-sanskom kantonu. Skripta se sastoji iz nekoliko dijelova. U prvom dijelu je objašnjena instalacija programskog paketa Code Blocks. Također, u nekoliko narednih strana je opisan program i sve opcije koje su nam potrebne za nesmetan rad. U drugom dijelu su opisane naredbe za ulaz i izlaz. Njih treba dobro svladati i ne prelaziti u sljedeće poglavlje dok se dobro ne savladaju. U trećem dijelu su opisane matematičke funkcije samo nama potrebne i načini ispisivanja decimalnih brojeva. U četvrtom dijelu se bavimo naredbama od proste naredbe do ciklusa. Peti dio obrađuje nizove i to samo jednodimenzionalni niz. Nizovi su nam potrebni više u šestom poglavlju gdje string obrađujemo preko niza. Ostala poglavlja sadrže zadatke i pitanja s općinskih i kantonalnih takmičenja u USK održanih posljednjih godina. Svako poglavlje sadrži određen broj riješenih primjera koje treba dobro proučiti. U rješenju svakog primjera se nalazi tekst koji opisuje kako se dolazi do rješenja, te kako program radi. Na kraju svakog poglavlja se nalazi određen broj zadataka namijenjenih za samostalan rad. Preporučuje se da se svi zadaci riješe prije nego li se pređe na naredno poglavlje, jer svaki od njih donosi neko novo znanje, neki novi trik. Programiranje je u početku teško, pa nemojte odmah odustajati. Imajte na umu da se programiranje uči na greškama. Oni koji žele koristiti ovu skriptu u svom radu trebaju se javiti na e-mail. Kao i svaka, i ova skripta sadrži greške, pa sve sugestije i primjedbe pošaljite na e-mail: [email protected] iv 1. RAZVOJNO OKRUŽENJE Programsko okruženje koje ćemo koristiti za pisanje naših programa naziva se Code Blocks. Ovo sam okruženje odabrao jer je besplatno, ugodnog izgleda, lako se instalira i malih je dimenzija. Posjeduje sve osobine koje su potrebne za učenje programiranja, a i više od toga. Kako instalirati Code Blocks? Moramo imati instalacijski CD ili ako imamo internet, onda treba otići na stranicu: http://www.codeblocks.org/downloads/26#windows Dobićemo sljedeći link (Slika 1) i odaberemo codeblocks-12.11mingw-setup.exe tj. kliknemo na BerliOS (može i na Sourceforge.net), gdje pokazuje crvena strelica, te sačekamo par sekundi i preuzimanje će početi automatski. Slika 1 Kad smo preuzeli datoteku, onda možemo krenuti s instalacijom programa. Inače instalacija je jednostavna, samo Next, Next, Next, itd. Ali evo ipak malo detaljnijeg upustva. Kao i kod svake instalacije, kliknemo dva puta malo brže da bi pokrenuli instalaciju. Računar će nas pitati želimo li zaista pokrenuti ovaj program na šta ćemo mi reći (kliknuti Run). Ako imate Windows 7 operativni sistem, onda je preporučeno da instalaciju započnete kao administrator (admin), tako što kliknete desnim dugmetom miša na instalacijsku datoteku Code Blocks-a i odaberete Run as admin. Potom ćete dobiti čarobnjak koji će vas voditi kroz instalaciju tj. odaberete Next. Zatim dobijete prozor o licenci, tu odaberemo I Agree. U sljedećem prozoru ako nije, označimo sve i odaberemo Next, slika 2. 1 Slika 2 A zatim odaberemo Install. Sačekamo par minuta, pa kad se završi instalacija pojavit će se prozor u kojem vas računar pita želite li pokrenuti Code Blocks, odaberemo Yes (Da). Nakon toga, će se pojaviti prozor: Slika 3 Lista otkrivenih kompajlera Ovo pretstavlja pronađene kompajlere na vašem računaru. Odaberete prvi tj. GNU GCC Compiler i kliknete na OK. I to je to. Instalirali ste Code Blocks. U slučaju da koristite operativni sistem Windows 7 može se dogoditi da vam kompajler ne bude pronađen. Tada ga morate vi pronaći. Kako? Pa odmah nakon instalacije računar će vas pitati želite li pokrenuti Code Blocks, odgovorite potvrdno. Nakon toga on će potražiti kompajlere na vašem računaru. Dobit ćete sliku prethodno. No, ako ne pronađe GNU GCC Compiler, tada će pisati Invalid. U tom slučaju, pokrenete program Code Blocks (slika 4) odabrate 2 Settings Compiler Zatim, kliknuti redom na 1, 2, i 3 kao na slici 4. A zatim na OK. Ako ni ovo ne pomogne onda otići u folder gdje je instaliran Code Blocks i vidjeti gdje se nalazi folder kompajlera pod imenom MinGW. Zatim taj put napisati ručno npr. kao što na ovoj slici piše C:\CodeBlocks\MinGW (ne ovaj nego vaš). Slika 4 Compiler settings (Podešavanje kompajlera) 1.1. Izgled programa Pokrenemo Code Blocks. Nakon pokretanja programa, pojavit će se na početku mali prozor koji sadrži kratke upute. Ako ne želimo da nam se pojavljuje pri sljedećem pokretanju programa otkačimo kvačicu i kliknemo na OK. Izgled programa Code Blocks je: 3 Slika 5 Izgled programa Code Blocks 1.2. Kreiranje datoteke Sada ćemo naučiti kako kreirati datoteku u koju ćemo pisati naše kodove. Ima više načina kako to uraditi. Mi ćemo navesti jedan koji možda nije najkraći, ali za početnike je najbolji. Uradimo sljedeće, kliknemo na: 1. File 2. New 3. File.. Slika 6 Kreiranje source datoteke 4 Dobivmo sljedeći prozor u kojem kliknemo na drugu sličicu ispod koje piše C/C++ source, a zatim na Go. Slika 7 Izbor datoteke U sljedećem koraku samo kliknemo na Next. Potom odaberemo C++ i kliknemo na Next. Pazite da u ovom koraku ne odaberete jezik C, jer onda nećete moći raditi s nekim naredbama. Slika 8 Izbor jezika 5 Još malo i gotovi smo. U ovom prozoru trebamo odabrati mjesto na računaru gdje će se nalaziti naša datoteka odnosno naš program. To činimo tako što kliknemo na sličicu gdje piše File name with full path odnosno na tri tačke (...). Slika 9 Izbor lokacije na disku Pojavit će se još jedan prozor, u kojem odaberemo: 1. gdje će biti program i 2. upišemo njegovo ime, te kliknemo na Spremi (Save), slika 10. Slika 10 Izbor foldera (mape) gdje će biti program 6 Folder (mapu) gdje biti vaši programi napravite prije. U ovom slučaju to je folder ZadaciC++. U imenu foldera, gdje će biti vaši programi ne smije biti kvačica nad slovima. Također, put do tog folder ne smije sadržavati nad slovima kvačice, jer se može vrlo lako desiti da vam program neće raditi tj. neće ga moći kompajler naći. Stoga je najbolje kreirati folder gdje će biti programi odmah čim otvorimo C particiju ili neku drugu. Na kraju kliknemo na Finish. Nova datoteka izvornog koda naziva Prvi program.cpp je stvorena. Slika 11 Izgled kreirane datoteke 1.3. Struktura programa Za ljude koji tek uče programirati, najbolji način učenja je da napišu program. Pa ćemo i mi krenuti tim putem. U prethodnom dijelu smo naučili kako napraviti source file (datoteku u koju ćemo pisati naše naredbe - kodove). Napišimo sljedeći kod na mjestu gdje piše "Tu pišemo naredbe!!!", slika 11. Naredbe za prvi program: 7 Objasnimo sada značenje svake linije koda. #include<iostream> Linija počinje s znakom Hach # (taraba). To je pretprocesorska radnja koja računaru kaže da u naš program uključi iostream datoteku. using namespace std; U drugom redu koda je napisana naredba using namespace std;. Ovdje su using i namespace ključne riječi pomoću kojih se aktivira određeno područje imena, u našem slučaju std, koji je naziv imenika u kojem su obuhvaćene sve standardne funkcije, te funkcije iz iostream biblioteke. int main() Treći red sadrži int main(). Svaki program u C++ mora da ima bar jednu main (glavnu) funkciju. Deklaracija int ispred main znači da funkcija vraća cjelobrojnu vrijednost, pa se na samom kraju programa mora staviti naredba return 0;. Umjesto tipa int mogli smo staviti void, pa tada na kraju nebi morali pisati return 0;. cout<<"Moj prvi program"; Ovo ispisuje poruku na ekran monitora tačno kako piše u navodnicima. Inače, cout<< je naredba za ispis podataka na ekran monitora. 1.4. Pokretanje programa Sada ćemo naučiti kako pokrenuti program. Dakle, kreirali smo datoteku i napisali (prepisali) TAČNO prethodni kod. Kako pokrenuti program? Ima više načina. Najjednostavniji i najlakši je da na tastaturi pritisnemo tipku 8 F9 Nakon toga računar će kompajlirati vaš kod i pokrenuti program, pod uslovom da ste sve ispravno napisali. Ako je bilo tako dobit ćemo prozor crne boje s bijelim slovima, slika 12. Slika 12 Izgled izvršenja programa Ako smo napravili neku sintaksičku (pravopisnu) grešku tj. zaboravili smo jedno slovo ili tačku-zarez (;), onda nam se neće pojaviti ovakav crni prozor nego ćemo dobiti upute kako da popravimo greške. 1.5. Greške Greške su česte, naročito kod početnika. Zaboravljeno slovo, tačka-zarez, krivo napisana neka naredba, zaboravljena zagrada itd. su samo neke od najčešćih grešaka. Ne brinite, one nisu veliki problem, jer nam Code Blocks kaže gdje je i šta ne valja. A gdje se nalaze te važne informacije? Na dnu prozora. Ako npr. u prethodnom kodu izostavimo ; koje se nalazi iza navodnika, te pokrenimo program tipkom F9, dobićemo upozorenje o greškama, slika 13. Analizirajmo na šta nas kompajler upozorava. Prva linija: D:\Prvi program.. kaže da je to u funkciji int main() (jer može biti više funkcija, mi za sada imamo jednu). Druga linija: Čitamo samo ispod Message (poruka) šta piše, a piše sljedeće: error: expected ' ; ' before 'return' a znači: greška: očekivano (vjerovatno) je problem u ' ; ' tačka-zarezu, GDJE?, prije naredbe return Crveni kvadratić također ukazuje gdje se pogreška nalazi (imati na umu da NIJE u istoj liniji gdje je kvadratić nego prije kvadratića tj. u liniji broj 6.) 9 Slika 13 Analiza napravljenih greški Također, ispod naziva Line stoji broj koji označava gdje je mogući problem. U našem slučaju to je broj 7. Ako se ovaj izvještaj ne vidi, onda ga uključimo (učinimo vidljivim) pritiskom na tipku F2 Kad popravimo greške pritisnemo tipku F9 da bi ponovo kompajlirali i pokrenuli program. Ako se opet pojave greške popravljamo dok nam na dnu ne bude pisalo 0 errors tj. dok ne dobijemo crni prozor. U slučaju da ne vidimo brojeve linija, onda ih uključimo tako što kliknemo na Settings → Editor Dobivamo sljedeći prozor, u kojem, gdje piše Show line numbers označimo kvačicom i kliknemo na Ok, slika 14. 10 Slika 14 Brojevi linija (line nubers) Kod treba biti lijepo napisan da bi bio pregledan, zbog kasnijih popravki. Da se mi ne bi previše oko toga zamarali, kada napišemo kod (program), onda jednostavno kliknemo desnim dugmetom miša i odaberemo Format use Astyle. Može se desiti da sa ovom inačicom programa imate problem kada želite napisati vitičaste zagrade { }. Problem je u plugin-u i treba ga isključiti na sljedeći način: Plugins → Manage Plugins... Dobivamo jedan prozor u kojem tražimo gdje piše DoxyBlocksB (slika 15), označimo i odaberemo Disable i zatvorimo prozor, pa nam više neće raditi probleme. Također, ako ne želimo da nam provjerava pravopis teksta u navodnicima ili komentarima (budući da provjerava engleski jezik, kod nas će sve podvući kao da je netačno (pogrešno) napisano, pa ga je poželjno isključiti), kao i u prethodnom slučaju odaberemo Plugins → Manage Plugins... Tražimo gdje piše SpellChecker, i kliknemo na Disable, te zatvorimo prozor. 11 Slika 15 Upravljanje plugin‐ovima 2. NAREDBE ZA IZLAZ I ULAZ 2.1. Početni program Kada dobijemo neki problem da riješimo tj. da napišemo odgovarajući program onda slijedimo nekoliko koraka koji su potrebi u svakom programu. Radimo sljedeće: 1. Kreiramo datoteku u koju ćemo pisati kod (to radimo na prethodno opisan način) 2. Napišemo sljedeći kod (ovaj kod ima svaki program i zato ga naučimo NAPAMET): #include<iostream> using namespace std; int main() { return 0; } 12 3. Kompajliramo i pokrenemo program tipkom F9. Ako dobijemo crni prozor, onda je sve OK, ako ne popravljamo greške. Poslije toga pristupamo rješavanju zadanog problema. Svaki zadatak treba na ovakav način rješavati da bi se izbjegle nepotrebne greške, a koje je nekada teško otkriti. 2.2. Naredba cout Naredbu cout smo već upoznali u našem prvom programu, a sada ćemo se s njom detaljnije upoznati. Za izlaz (ispis) na ekran monitora koristimo identifikator cout <<. Funkcija cout usmjerava podatke s izlaznog toka na ekran monitora. Ispis podataka se ostvaruje operatorom ispisa (<<). ZAPAMTITI: Tekst koji ispisujemo naredbom cout stavljamo u znake navoda Slika 16 Naredba cout 2.3. Varijacije naredbe cout Jedna od najboljih metoda koje nam pomažu da bolje razumijemo funkcioniranje programa i pojedinih naredbi jest da u program unesemo manje izmjene, a zatim opažamo kakve posljedice će takve izmjene izazvati. Napisat ćemo nekoliko različitih varijanti jednog te istog programa, te navesti njihova izvršavanja da bi mogli izvući određene zaključke. Naš prvi program: Rezultat pokretanja programa: #include<iostream> using namespace std; int main() { cout<<"Moj prvi program"; return 0; } 13 ZAKLJUČAK: Ništa se na izlazu (ekranu) ne mijenja pisali mi naredbe u jednom ili više redova. #include<iostream> using namespace std; int main() { cout<< "Moj prvi program"; return 0; } ZAKLJUČAK: Ništa se ne mijenja. #include<iostream> using namespace std; int main() { cout << "Moj prvi program"; return 0; } Ili #include<iostream> using namespace std; int main() { cout << "Moj prvi program"; return 0; } ZAKLJUČAK: Ništa se ne mijenja. Pisali mi naredbe u jednom redu ili u više redova, pa čak i razmak između naredbi, ništa se ne mijenja, ne utiče na rezultat programa. 14 #include<iostream> using namespace std; int main() { cout<<"Moj prvi program."<<"Ucim C++."; return 0; } ZAKLJUČAK: Ove dvije rečenice su ispisane spojene. Ako želimo da poslije tačke imamo razmak onda u prvoj rečenici poslije tačke napravimo jedan razmak ili u drugoj rečenici prije riječi učim napravimo jedan razmak. Ako ispisujemo više rečenica ili pak više varijabli pomoću jedne naredbe cout, tada samo jednom napišemo cout, a za ispis koristimo identifikator <<. Sada ćemo koristiti dvije cout naredbe. #include<iostream> using namespace std; int main() { cout<<"Moj prvi program."; cout<<"Ucim C++."; return 0; } ZAKLJUČAK: Rezultat isti, ništa se nije promijenilo. Možemo koristiti više naredbi cout tako da je svaka u novom redu ili jednu. Ako koristimo jednu naredbu cout uočiti da nju napišemo jednom a identifikator << pišemo za svaki ispis. Kako da nam poslije tačke bude razmak? Odgovor je jednostavan. Trebamo samo ispisati jedan prazan razmak u prvoj ili drugoj rečenici, isto je. Mi ćemo ispisati tri u prvoj da se dobro vidi što se hoće reći. #include<iostream> using namespace std; int main() { cout<<"Moj prvi program. cout<<"Ucim C++."; "; return 0; } 15 ZAKLJUČAK: Ako hoću da ispišem razmak, to uradim tako što u znacima navoda napravim razmaka koliko mi treba. Postavlja se pitanje, kako da druga rečenica bude u novom redu? Kako to uraditi? Kada želimo dobiti JEDAN PRAZAN RED ili PREĆI U NOVI RED onda koristimo naredbu endl. #include<iostream> using namespace std; int main() { cout<<"Moj prvi program."<<endl; cout<<"Ucim C++."; return 0; } Šta ako stavimo dvije endl naredbe? #include<iostream> using namespace std; int main() { cout<<"Moj prvi program."<<endl<<endl; cout<<"Ucim C++."; return 0; } ZAKLJUČAK: Dobili smo novi red i jedan prazan red. Ispis četiri reda. #include<iostream> using namespace std; int main() { cout<<"Moj prvi program."; cout<<endl<<endl; cout<<endl; cout<<endl; cout<<"Ucim C++."; return 0; } 16 ZAKLJUČAK: Uočimo da naredbu endl ne možemo koristiti ako prije nismo stavili naredbu cout. Zadatak 1. Napisati program koji će na ekranu (zaslonu) monitora ispisati tekst tačno ovako kako izgleda. Danas je lijep dan. Ucim C++. Idem u osnovnu skolu. Imam 10 godina. Sutra mi je rodjendan. 2.4. Osnovni tipovi podataka Podatke možemo podijeliti na nepromjenjive (konstante) i promjenjive (varijable). Konstante su podaci koji tokom izvršavanja programa ne mogu da promjene svoju vrijednost. Varijable (promjenjive) su podaci koji tokom izvršavanja mogu da promjene svoju vrijednost. Identifikator predstavlja ime koje dodjeljujemo varijablama, funkcijama itd. Identifikator (ime) može biti sastavljeno od slova engleskog alfabeta, prvi znak mora biti slovo ili znak podvučeno „ _ “, brojeva i identifikator ne smije biti jednak nekoj od ključnih riječi. Pri programiranju, pohranjujemo varijable u memoriji računara, ali računar mora znati kakve podatke želimo pohraniti, jer ne zauzimaju svi podaci jednaku količinu memorije tj. moramo reći računaru šta spremamo broj, slova, znakove, itd. Tako ako kažem 13 to je podatak. Kakav? Brojčani. Ako pak kažem sunce. I ovo je podatak. Kakav? Znakovni. Zbog toga što podaci mogu biti različiti po tipu (znakovni, brojčani) moramo računaru reći kakav tip podatka unosimo i s kakvim će podacima on raditi. Programski jezik C++ ima nekoliko osnovnih tipova podataka: Tip podatka znakovni cjelobrojni realni realni dvostruke preciznosti ne sadrži vrijednosti Oznaka tipa Broj bitova Opseg char 8 0 – 255 int 16 -32768 – 32767 float 32 3.4E-38 – 3.4E+38 double 64 1.7E-308 – 1.E+38 void 0 bez vrijednosti Prve dvije kolone tabele treba znati NAPAMET, šta znači i kako se piše. Tako pomoću tipa char možemo spremati znakove (slova, brojeve, upitnik, uzvičnik, i ostalo), int nam govori da se radi o cijelim brojevima, float o realnim brojevima, double je također realan broj 17 samo u njega može "stati" znatno veći broj. Nekada radimo samo npr. sa pozitivnim brojevima, pa su nam negativni nepotrebni, da nebi gubili memoriju i da bi mogli spremiti što veći pozitivan broj onada koristimo modifikator. Tako sa modifikatorom unsigned tip int zauzima opseg od 0 – 65534. Osnovni tipovi podataka se mogu modificirati (promijeniti) koristeći jedan ili više modifikatora: signed short unsigned long Sljedeća tabela pokazuje kako se koriste modifikatori, koliko memorije imamo, kolika je maksimalna i minimalna vrijednost koju možemo staviti u određenu varijablu. Tip Količina Raspon char 1byte -127 to 127 or 0 to 255 unsigned char 1byte 0 to 255 signed char 1byte -127 to 127 int 4bytes -2147483648 to 2147483647 unsigned int 4bytes 0 to 4294967295 signed int 4bytes -2147483648 to 2147483647 short int 2bytes -32768 to 32767 unsigned short int 2bytes 0 to 65,535 signed short int 2bytes -32768 to 32767 long int 4bytes -2,147,483,647 to 2,147,483,647 signed long int 4bytes kao long int unsigned long int 4bytes 0 to 4,294,967,295 float 4bytes +/- 3.4e +/- 38 ( 7 cifara) double 8bytes +/- 1.7e +/- 308 ( 15 cifara) long double 8bytes +/- 1.7e +/- 308 ( 15 cifara) Međutim, ove vrijednositi ovise i od kompajlera koji koristimo, te također i od računara na kojem radimo. 18 2.5. Deklaracija varijabli Kada smo naučili koje tipove podataka imamo, vrijeme je da se upoznamo detaljnije s varijablama. Već smo rekli da su varijable podaci koji tokom izvršavanja programa mijenjaju svoju vrijednost. Sve varijable (promjenjive) koje se koriste u programu potrebno je deklarirati, odnosno dati im ime (ili identifikator) i odrediti tip. Tip smo naučili prethodno šta je npr. int, char, double, itd, a ime predstavlja naziv te varijable i dajete ga vi, onako kao želite. Najbolje je da to ime upućuje na ono na šta se odnosi. Npr. ako računate obim kvadrata, onda je za ime varijable, u koju ćemo spremiti vrijednost, poželjno uzeti ime: Obim, ili obim, ili samo slovo O. Može i neko drugo ime npr. Aligator, ali kad to vidimo u programu koji računa obim nećemo moći zaključiti po tom imenu da se radi o obimu. SVE VARIJABLE PRIJE UPOTREBE U PROGRAMU MORAMO DEKLARIRATI, INAČE ĆE NAM KOMPAJLER JAVITI GREŠKU. Deklaracija varijabli se obavlja naredbom oblika: tip podatka ime varijable Primjer 1. int a; int a, b, c; float zbir; double x, y, razlika; long double x, y; char ime; 19 Vrlo je važno da razumijete šta su varijable i kako se deklariraju. Ako vam nije jasno šta je to onda pročitajte još jednom, pa još jednom i tako dok ne bude jasno, jer one su dio gotovo svake linije u programu, s njima radimo, s njima se igramo. Tako u prethodnom primjeru int a; znači da smo kreirali varijablu, čije ime je a, te u nju možemo staviti samo cjelobrojnu vrijednost. Na ovaj način mi kažemo računaru da nam obezbjedi prostor u memoriji koji će se zvati a i da ćemo u njega "skladištiti" tj. pohraniti samo cjelobrojne vrijednosti (negativne i pozitivne cijele brojeve, te nulu). Ako u ovu varijablu a pokušamo pridružiti (spremiti, pohraniti) vrijednost odnosno broj 5.23 (decimalni broj), onda će računar spremiti samo cijeli dio tj. broj 5 a ostalo 0.23 će odbaciti. Programski jezik C++ razlikuje velika i mala slova, tako je dopušteno služiti se istim imenom varijable, samo pisano malim, odnosno velikim slovima za dvije različite varijable. Mjesto deklaracije varijable u programu određuje područje djelovanja određene varijable. Prema području djelovanja varijable mobu biti globalne i lokalne: - globalne varijable, su dostupne kako za čitanje, tako i za promjenu u bilo kojem dijelu programa, deklariraju se izvan svih funkcija, naredbi, petlji itd. - lokalne varijable se deklariraju na početku neke funkcije ili na početku nekog bloka naredbi. Ove varijable vrijede samo unutar funkcije ili bloka naredbi, jer izlaskom iz funkcije ili bloka naredbi ove varijable više ne postoje. Mi ćemo za sada najčešće koristiti globalne varijable. Nemojte da vas ovo zbunjuje. Trenutno vam nije bitno ako ne znate šta to znači. 20 Ključne riječi koje ne smijete koristiti za imena varijabli i konstanti su: auto double int enum volatile else long switch case union break typedef char extern return continue register float short unsigned continue struct const void default goto sizeof enum signed if static while struct for do 2.6. Operatori i izrazi Kombinacijom varijabli, konstanti i operatora nastaju izrazi. Izrazi su riječi ili simboli koji određuju da se s varijablama u programu nešto učini. Mogu biti unarni, binarni, ternarni. 2.6.1. Operator pridruživanja Operatorom pridruživanja ili operatorom za dodjelu vrijednosti se varijabli s njegove lijeve strane pridružuje (sprema, pohranjuje) vrijednost izraza koja se nalazi na desnoj strani. Tip vrijednosti izraza treba odgovarati tipu varijable. Operator pridruživanja je znak jednako: = Operator pridruživanja se može koristiti zajedno i s još jednim operatorom. Primjer 2. a=5; (znači da će varijabli a biti pridružena (spremita, skladištita) vrijednost 5) a = a + 5; (znači da će varijabli a biti pridružena vrijednost izraza a + 5) Ovo se može i drukčije zapisati: a += 5; Dakle, znak = ne znači da je lijeva strana jednaka desnoj, nego on kaže računaru da ono što je na desnoj strani znaka jednako pridruži (spremi, skladišti) u varijablu na lijevoj strani znaka jednako. 2.6.2. Inicijalizacija varijabli Pridruživanje vrijednosti varijabli prilikom definisanja naziva se inicijalizacija varijable. Deklaracija i inicijalizacija varijable se može obaviti u istom redu koda. 21 Primjer 3. int a = 3; Ovdje smo deklarirali varijablu a tj. odredili smo kakav tip podatka će sadržavati, te smo je inicijalizirali odnosno pridružili joj vrijednost 3. Dakle, kada napišemo int a; ili double a, b; mi smo izvršili deklaraciju varijabli, a kad napišemo int a = 3; ili double a = 5.03, b = 3.25; mi smo izvršili deklaraciju varijabli i inicijalizaciju (pridruživanje vrijednosti) varijabli. 2.6.3. Aritmetički operatori Simboli aritmetičkih operatora uglavnom odgovaraju standardnim matematičkim oznakama aritmetičkih operacija. C++ operator Operacija + sabiranje – oduzimanje * množenje / dijeljenje % ostatak pri cjelobrojnom dijeljenju Prva tri operatora +, -, i * imaju iste osobine kao u matematici, pa ih ne treba posebno objašnjavati. Operator dijeljenja / ima isto značenje kao u matematici samo što morate voditi računa koje brojeve tj. varijable dijelite. Tako npr. ako računamo koliko je 5/2 gdje su 5 i 2 cijeli brojevi rezultat će biti 2, a ne 2.5 kao što bi pokazao kalkulator. Jer su 5 i 2 cijeli brojevi pa i rezultat će biti cijeli broj tj. računar će odbaciti 0.5. Ako pak računate 5.0/2 ili 5/2.0 ili 5.0/2.0 gdje je jedan realan ili oba tada će rezultat biti 2.5. Ovdje treba samo voditi s računa sa kojim vrijednostima radimo i kakav rezultat očekujemo cijeli ili realni broj tj. decimalni. Zadnji operator % (čitamo modulo) daje kao rezultat ostatak pri CJELOBROJNOM dijeljenju. Primjer 4. Izračunajmo sljedeće izraze sa znanjem iz matematike koristeći operatore (oznake) C++. 4/2 je jednako 2 15/3 je jednako 3 A koliko bi bilo onda 5/2? To je 5/2=2.5. 22 Koliko bi bilo 5%2? Operator modulo % daje ostatak pri cjelobrojnom dijeljenju. Možemo ga koristiti samo ako su cijeli brojevi u pitanju. Kako naći taj ostatak? Vrlo jednostavno, jer 5/2 možemo zapisati i ovako: 5/2 je jednako 2 jer je 2*2=4 (najbliže broju 5) plus 1 tj. 5/2=2*2+1 Ovo 1 je ostatak pri cjelobrojnom dijeljenju. Dakle, 5%2=1, jer je 2*2=4 plus 1 jednako 5. Pogledajmo još nekoliko primjera da nam bude jasan ovaj operator jer se on često koristi u programiranju. 7%2=1, jer je 7/2 najbliže 3 tj. 3*2=6 i do 7 nedostaje 1. Postavite sebi pitanje: Koji broj pomnožen sa brojem 2 daje broj 7 ili što bliže broju 7? Ono što nedostaje do broja 7 je ostatak. 8%4=0, jer je 8/4 tačno 2, tj. 2*4=8. 11%3=2, jer je 11/3 najbliže 3 tj. 3*3=9 i do 11 fali 2. 15%4=3, jer je 15/4 najbliže 3 tj. 3*4=12 i do 15 fali 3. Ako se u izrazu nalazi više operatora, redoslijed izvršavanja ovisi o prioritetu operatora. Nižeg prioriteta su sabiranje i oduzimanje, a višeg množenje, dijeljenje, cjelobrojno dijeljenje s ostatkom. Redoslijed prioriteta se može promijeniti upotrebom zagrada ( ), jer one imaju najviši prioritet tj. izvršava se prvo ono što je u njima, pri tome treba paziti da je broj otvorenih i zatvorenih zagrada jednak. Primjer 5. int a=2; int b=4; int c=1; int rezultat; 23 Izračunajmo sljedeće izraze. a) rezultat = a – b * c b) rezultat = (a – b) * c c) rezultat = a * b + b * c d) rezultat = ((a * c) – c) * b – a Rješenje. a) rezultat = - 2 b) rezultat = - 2 c) rezultat = 12 d) rezultat = 2 Programski jezik C++ ima još dva unarna operatora: uvećaj za jedan ++ (inkrement) i umanji za jedan – – (dekrement). Inkrement i dekrement operatori se primjenjuju samo na varijable i ne mogu se primijeniti na izraze, niti na konstante. Ako se nalaze ispred varijable, onda se vrijednost te varijable prvo poveća ili umanji za jedan i tako dobivena nova vrijednost se koristi pri izračunavanju izraza. Ako se operator nalazi iza varijable, tada se prvo izračuna vrijednost izraza, a tek nakon toga se vrijednost varijable poveća ili umanji za jedan. Primjer 6. int a = 3; int b = 2; int R; U programu pišu sljedeće naredbe: a++; R = a – b; Koliki bi bio rezultat? Rezultat je R = 2, jer će računar prvo izračunati koliko je a++, a to znači povećaj a za 1 odnosno a = a + 1; pa je a sada 4 jer je 3+1 = 4, stoga je R = 4 – 2 = 2. Ako bi pak pisalo ovako: R = a++ - b; Onda bi izračunao izraz s upotrebom a = 3 pa tek bi onda povećao a za 1 tj. R = 3 – 2 = 1. 24 Ako bi napisali ovako: R = ++a – b; Prvo bi povećao a za 1, pa bi onda računao s novom vrijednošću od a tj. R = 4 – 2 = 2. Na isti način se upotrebljava i dekrement -- jedino što on ne povećava za 1 nego smanjuje za 1. 2.7. Naredba za ulaz Za unošenje podataka s tastature odnosno s ekrana monitora koristimo cin >>. Ovu naredbu koristimo kada unosimo neke podatke s tastature (glavnog ulaza) u računar. Kako to ide, pokazaćemo na nekoliko primjera. Upotreba je veoma jednostavna. Primjer 7. Napisaćemo program koji unosi jedan cijeli broj s tastature u računar i ispisat ćemo taj isti broj na ekran monitora. #include<iostream> using namespace std; int main() { int a; cin>>a; cout<<a<<endl; return 0; } Unijeli smo npr. broj 3 i ispisali ga. Primjer 8. Napišimo sada program koji unosi dva broja i ispisuje ih svaki u novom redu. #include<iostream> using namespace std; int main() { int a, b; cin>>a; cin>>b; cout<<a<<endl; cout<<b<<endl; return 0; } 25 Brojeve možemo unijeti i u jednom redu s tim da između njih napravimo jedan prazan razmak npr. 2 5. Također, možemo ispis napraviti i s jednom naredbom cout. #include<iostream> using namespace std; int main() { int a, b; cin>>a>>b; cout<<a<<endl<<b<<endl; return 0; } ZAKLJUČAK: Ako unosimo dva ili više brojeva svaki iz novog reda onda pišemo cin>> za svaku varijablu, a ako ih unosimo u jednom redu onda pišemo cin>> varijabla >> varijabla; tj. svaku varijablu odvajamo operatorom za unos >>, a na kraju obavezno dođe tačka-zarez (;). Sada kada smo naučili unositi podatke možemo preći na rješavanje konkretnih problema. Zadatak 2. Napisati program koji će unijeti dva cijela broja s glavnog ulaza (tastature) i ispisati njihov zbir. Rješenje. Kada rješavamo zadatak, prvo ga dobro pročitamo i uočimo šta su nam ulazni podaci, šta izlazni, koliko ćemo varijabli trebati, kojeg će tipa biti itd. U našem slučaju imamo dva broja tj. trebat ćemo dvije varijable kojima ćemo pridružiti (spremiti) ta dva broja. Kako im dati ime? Ime birate sami. Treba da je što jednostavnije. Mi ćemo za prvi broj uzeti ime varijable a, dok za drugi broj neka bude ime varijable b. Zbir kao rezultat treba isto spremiti u treću varijablu. Pošto se radi o zbiru, neka njeno ime bude veliko Z. Unosimo dva CIJELA broja pa će varijable a i b biti tipa int, a pošto je zbir dva cijela broja opet cijeli broj to će i varijabla Z biti tipa int. U zadatku se ne kaže kako će te unijeti brojeve, u jednom ili više redova. To sami birate po želji, kako vam je lakše. Također, se ne kaže treba li se ispisati prije unosa kakva poruka. To opet birate sami, da li ćete ispisati nekakvu poruku ili ne. Na izlazu (ekranu) se traži samo ispis zbira, nikakva poruka. Vi sami birate da li ćete ispisati neku poruku ili ne. Mi ćemo ovdje navesti sve varijante bez poruka i s njima. U svakom slučaju program je tačan jer radi ono što se od njega traži, sabira dva broja. Ostale poruke, način ispisa su samo šminka – da ljepše izgleda. Prvi slučaj bez ikakvih poruka, unosimo npr. 2 i 3: 26 #include<iostream> using namespace std; int main() { int a, b, Z; cin>>a>>b; Z= a + b; cout<<Z<<endl; return 0; } Drugi slučaj s porukama korisniku: #include<iostream> using namespace std; int main() { int a, b, Z; cout<<"Unesite prvi broj:"; cin>>a; cout<<"Unesite drugi broj:"; cin>>b; Z= a + b; cout<<"Zbir je "<<Z<<endl; return 0; } Može i ovako: #include<iostream> using namespace std; int main() { int a, b, Z; cout<<"Unesite dva broja:"; cin>>a>>b; Z= a + b; cout<<"Zbir je "<<Z<<endl; return 0; } Ovo su neki načini. Vi možete ispisivati kako hoćete, unositi kako hoćete (ako to nije naglašeno u zadatku), bitno je da program radi ono što se od njega traži. Navest ćemo još jedan slučaj u kojem ne koristimo varijablu Z, već odmah sabiramo i ispisujemo na ekran. Ovo je najkraće rješenje zadatka. 27 #include<iostream> using namespace std; int main() { int a, b; cin>>a>>b; cout<<a+b<<endl; return 0; } Zadatak 3. Napisati program koji unosi dva cijela broja, te ispisuje njihov zbir, razliku, proizvod, količnik i ostatak pri dijeljenju prvog s drugim. Rješenje. Unosimo npr. 5 i 2. #include<iostream> using namespace std; int main() { int a, b, Z, R,P,K,O; cin>>a>>b; Z=a+b; R=a-b; P=a*b; K= a/b; O=a%b; cout<<"Zbir je "<<Z<<endl; cout<<"Razlika je "<<R<<endl; cout<<"Proizvod je "<<P<<endl; cout<<"Kolicnik je "<<K<<endl; cout<<"Ostatak je "<<O<<endl; return 0; } Obratiti pažnju na količnik. Računar je napisao da je to 2, a ne 2.5. To je zbog toga što nam su varijable a i b, te K tipa int. Da dobijemo 2.5 moramo koristiti tip double ili float. No, nismo mogli navesti tip double jer onda bi nam javio grešku za ostatak. Međutim, to se može izbjeći uvođenjem novih varijablih A, B,K koje će biti tipa double. #include<iostream> using namespace std; int main() { int a, b, Z, R,P,O; cin>>a>>b; Z=a+b; R=a-b; P=a*b; O=a%b; double A, B, K; A=a; 28 B=b; K= A/B; cout<<"Zbir je "<<Z<<endl; cout<<"Razlika je "<<R<<endl; cout<<"Proizvod je "<<P<<endl; cout<<"Kolicnik je "<<K<<endl; cout<<"Ostatak je "<<O<<endl; return 0; } Varijable možete deklarairati bilo gdje u kodu a ne samo na početku, samo mora biti prije njihove upotrebe. Imati na umu da se svaki program koji napišete mora testirati. To znači probati sve moguće kombinacije, pa ako za sve daje tačan rezultat, onda je program dobar odnosno zadatak tačno riješen. Može se desiti da za neke brojeve program daje tačno rješenje, a za ostale ne. To onda nije rješenje zadatka. 2.8. Zadaci za samostalan rad Zadatak 4. Napisati program za računanje obima kvadrata (O=4a). Zadatak 5. Napisati program za računanje površine pravougaonika (P=ab). Zadatak 6. Napisati program za računanje obima pravougaonika (O=2a+2b). Zadatak 7. Napisati program za računanje površine kvadrata (P=a2). Zadatak 8. Napisati program koji sabira tri broja. Zadatak 9. Napisati program koji učitava tri broja i ispisuje njihov proizvod. 0 računa vrijednost funkcije Zadatak 10. Napisati program koji za unešeno 1 2 3 Zadatak 11. Napisati program koji za četiri unijete ocjene iz Informatike računa prosječnu ocjenu (zaključnu ocjenu). (Uputa. Koristiti tip double ili float za varijable) Zadatak 12. Na ulazu se unose dva broja. Na izlazu ispisati dvostruku vrijednost prvog broja i trostruku vrijednost drugog broja. Zadatak 13. Sa standardnog ulaza (tastatura) se unosi dužina stranice kocke (prirodan broj). Na izlazu ispisati površinu i zapreminu kocke. Zadatak 14. Napisati program koji će za uneseni poluprečnik kruga, izračunati njegov obim. (Uputa. 2 , umjesto pisati 3.14, za r i O koristiti tip double ili float) Zadatak 15. Napisati program koji unosi četverocifren broj i ispisuje cifre tog broja počev od cifre najmanje mjesne vrijednosti (cifre jedinica). 29 3. MATEMATIČKE FUNKCIJE U C++ postoji mnogo ugrađenih funkcija. Šta to znači? Uzmimo npr. apsolutnu vrijednost nekog broja. Pošto se to često koristi, pa da ne bi za svaki problem (zadatak) pisali kod (program) koji računa aposolutnu vrijednost, onda su programeri napisali taj kod i ugradili ga u jezik a naše je samo da ga upotrebimo kad nam treba. Šta je funkcija u C++ trenutno nije bitno da znate, već samo kako se primjenjuje. Postoji mnogo ugrađenih matematičkih funkcija, mi ćemo ovdje navesti samo one koje će nama trebati i koje su vama poznate iz matematike. Da bi koristili matematiče funkcije morate prije using namespace std; uključiti matematičku biblioteku naredbom #include<cmath> Vrijednost svih sljedećih funkcija je tipa double. Tip argumenta x i y je double, a argumenta n je int. Kada upotrebite neku funkciju ona će vam vratiti izračunatu vrijednost koja će biti tipa double. pow(x,y) Stepenovanje (Potenciranje). Vrijednost funkcije . Ako je mora da bude 0. Ako je 0, mora biti cijeli broj. sqrt(x) Korjenovanje (drugi korijen). Vrijednost funkcije √ , abs(n) Apsolutna vrijednost 0 Primjer 9. Napisaćemo program koji demonstrira upotrebu ovih funkcija. Rješenje. #include <iostream> #include <cmath> using namespace std; int main() { int a=2, b=4, c=-5; cout<<pow(3,2)<<endl; cout<<pow(a,b)<<endl; cout<<pow(2.135,4)<<endl; cout<<sqrt(b)<<endl; cout<<sqrt(a+b)<<endl; cout<<sqrt(10.250)<<endl; cout<<abs(c)<<endl; cout<<abs(5)<<endl; cout<<abs(-15)<<endl; return 0; } 30 0, 3.1. Decimalni brojevi Naučit ćemo kako oblikovati tj. ispisivati decimalne brojeve. C++ pruža mogućnost da manipuliramo izlaznim podacima. U tu svrhu koristimo razne manipulatore. Mi ćemo spomenuti samo neke. 3.1.1. Fixed fixed je manipulator koji se koristi kada ne želimo da nam broj bude prikazan u naučnom zapisu (npr. umjesto 1.034292e+004 želimo da bude 10342.92) Primjer 10. Napisaćemo program koji će zadane brojeve ispisati na ekran bez upotrebe modulatora fixed i s upotrebom modulatora fixed. Rješenje. #include <iostream> using namespace std; int main() { double a=3.14, b=0.051; double c=10.122445541; cout<<a<<endl; cout<<b<<endl; cout<<c<<endl; cout<<endl; cout<<fixed; cout<<a<<endl; cout<<b<<endl; cout<<c<<endl; return 0; } ZAKLJUČAK: Modulator fixed je dovoljno napisati jednom ispred svih ispisa, te će on djelovati na sve ispise. Svi ispisi će biti na šest decimala. Nije potrebno uključivati nikakvu biblioteku. 3.1.2. Setprecision setprecision(n) je funkcija koja se koristi za ispis decimalnog broja s određenim brojem cifara, s tim da nulu ne broji, ako je ona na prvom mjestu. Dakle, ona samo govori koliko će se brojeva prikazati prilikom ispisa decimalnog broja. Umjesto slova n pišemo cijeli broj. Da bi koristili ovu funkciju moramo uključiti biblioteku 31 #include <iomanip> Ona se može koristiti za tačno određen ispis decimala u decimalnom broju (zaokruživanje), tako što se prije ove funkcije napiše naredba fixed. Primjer 11. Prethodni primjer, gdje su prvo ispisani decimalni brojevi s naredbom setprecision, a ispod odmah u kombinaciji s naredbom fixed. Rješenje. #include <iostream> #include <iomanip> using namespace std; int main() { double a=3.14, b=0.051; double c=10.122445541; cout<<setprecision(3)<<a<<endl; cout<<setprecision(1)<<b<<endl; cout<<setprecision(3)<<c<<endl; cout<<endl<<fixed; cout<<setprecision(3)<<a<<endl; cout<<setprecision(3)<<b<<endl; cout<<setprecision(3)<<c<<endl; return 0; } 3.2. Ostali manipilatori dec – čita ili ispisuje decimalni broj. oct – čita ili ispisuje oktalni broj. hex – čita ili ispisuje heksadecimalni broj. Primjer 12. Ispisat ćemo cijeli broj 15 i 25 u ova tri brojna sistema. Rješenje. #include <iostream> using namespace std; int main() { int n=15, m=25; cout<<"Ispis broja 15:"<<endl; cout<<dec<<n<<endl; cout<<oct<<n<<endl; cout<<hex<<n<<endl; cout<<"Ispis broja 25:"<<endl; cout<<dec<<m<<endl; cout<<oct<<m<<endl; cout<<hex<<m<<endl; return 0; } 32 4. NAREDBE Naredba je osnovna jedinica obrade u programima. Mogu se podijeliti na proste, složene i upravljačke. Upravljačke naredbe ne vrše nikakvu obradu već prenose tok upravljanja na neko mjesto u programu. To spadaju razne naredbe skokova. Proste naredbe predstavljaju elementarne obrade koje se ne mogu da podjele na manje dijelove koji bi i sami bili naredbe, npr.: int a; ili a=5; ili cout<<a;. Izvršavanje proste naredbe sastoji se u izračunavanju izraza. Njen opšti oblik je: izraz ; ZAPAMTITI: SVAKA NAREDBA SE ZAVRŠAVA SA TAČKA-ZAREZ (;) Ako stavimo samo ; tada imamo praznu naredbu koja ne radi ništa. Složene naredbe predstavljaju strukture naredbi kojima se određuje redoslijed izvršavanja naredbi sadržanih u strukturi (u kodu tj. programu). Mogu biti: sekvenca, selekcije i ciklusi ili petlje. 4.1. Sekvenca ili blok: { } Sekvenca je niz naredbi koje se izvršavaju jedna za drugom. Sekvenca se u jeziku C++ piše unutar velikih (vitičastih) zagrada: { }. U jednom redu može da bude više naredbi ili pak u svakom redu po jedna. Osnovni kriterij je preglednost. Načini pisanja naredbi za sekvencu: 1) { naredba1; naredba2; ... naredba n;} 2) { } naredba1; naredba2; ... naredba n; Pošto se ispred naredbe1 može da stavi i nekoliko deklarativnih naredbi, zbog toga se sekvence nazivaju i blokovi. Doseg (oblast važenja) identifikatora u programiranju označava dio programa u kome se identifikator koristi. Pa tako ako je na početku bloka definisan neki identifikator, tada je njegov doseg samo od početka pa do kraja bloka, tj. neće vrijediti izvan bloka odnosno vitičastih zagrada. 33 Dakle, ako imamo dvije ili više naredbi za koje želimo da se izvrše zajedno jedna iza druge onda ih stavljamo u vitičaste zagrade tj. u blok. Prije nego li naučimo šta su sekcije, upoznajmo još jednu vrstu operatora. To su relacijski operatori. 4.2. Relacijski operatori Relacijskim operatorima se utvrđuje povezanost dviju varijabli, funkcija ili izraza. Računari u svom radu upotrebljavaju jednostavnu logiku sa dvije vrijednosti: ukoliko je uslov (uvjet) istinit (true), vrijednost je 1; ukoliko je lažan (false), vrijednost je 0. Relacijski operatori su prikazani u sljedećoj tablici: C++ operator Značenje Primjer > veće od 5>4 >= veće od ili jednako 5>=x < manje od 4<5 <= manje od ili jednako x<=5 == jednako 5==5 != različito (nije jednak) 5!=4 4.3. Selekcije Selekcije su upravljačke strukture koje omogućuju uslovno izvršavanje naredbi. To znači ako je neki uslov (uvjet) tačan nešto će se desiti (neke naredbe će se izvršiti). 4.3.1. Naredba if if (uslov) naredba1; Ovo je jednostavna naredba if. Funkcionira na sljedeći način: Naredba if ispita da li je uslov tačan (istinit). Ako je tačan onda se izvrši naredba1. Ako nije tačan, tada se naredba1 neće izvršiti, nego se nastavlja sa izvršavanjem naredbe koja je sljedeća u programu. Uslov (uvjet) mora bit takav da za njega računar može utvrditi da li je tačan ili netačan. 34 Primjer 13. IZRAZ USLOV 5 = = 5 DA a>b DA a+b NE (a+b)*c<0 DA 5-2 NE OBJAŠNJENJE Jer možemo utvrditi da li je izraz tačan ili netačan. Jer možemo utvrditi da li je izraz tačan ili netačan za određene vrijednosti a i b. Jer ne možemo utvrditi da li je izraz tačan ili netačan za određene vrijednosti a i b. Jer možemo utvrditi da li je izraz tačan ili netačan za određene vrijednosti a,b i c. Jer ne možemo utvrditi da li je izraz tačan ili netačan. NAPOMENA: Ako kao uslov stoji broj 1 ili 0, tada je to ispravan uslov tj. broj 1 za računar predstavlja tačno, a broj 0 netačno, npr. if (1) naredba1; Primjer 14. Napisati program koji će komentarisati uneseni cijeli broj a tj. ako je a veće od nule ispisat će se poruka "Broj je pozitivan", ako je jednak nuli "Broj je jednak nuli", te ako je manji od nule "Broj je negativan". Rješenje. Unosimo jedan broj s tastature i to cijeli broj, pa će deklaracija biti int a. Pošto u zadatku imao uslov (da je veći od nule, jednak nuli, manji od nule) onda koristimo if naredbu. #include<iostream> using namespace std; int main() { int a; cin>>a; if(a>0) cout<<"Broj je pozitivan"<<endl; if(a==0) cout<<"Broj je jednak nuli"<<endl; if(a<0) cout<<"Broj je negativan"<<endl; Za unos 5 return 0; } Kako program radi? Nakon što vi unesete broj s tastature (to je naredba cin>>a;), računar ide na sljedeću naredbu if(a>0) cout<<"Broj je pozitivan"<<endl; i prvo se provjerava uslov a>0 uvrštava se uneseni broj (npr. u ovom slučaju 5) tj. 5>0 da li je ovo tačno, postavi si pitanje računar. DA, tačno je. Onda se izvrši naredba koja stoji poslije okruglih zagrada cout<<"Broj je pozitivan"<<endl; 35 Ispiše se tekst: "Broj je pozitivan" te se poslije ispiše jedan prazan red tj. pređe se u novi red naredbom endl; Nakon toga računar ide dalje s izvršavanjem koda na liniju ispod if(a==0) cout<<"Broj je jednak nuli"<<endl; Provjerava da li je uslov a==0 tačan tj. uvrsti broj 5 mjesto a tj. 5==0 i pita se da li je ovo tačno. NE, nije, pa dio cout<<"Broj je jednak nuli"<<endl; koji stoji poslije uslova neće izvršiti, preskočiće ga, jer uslov nije tačan. Zatim, ide na sljedeću naredbu (liniju koda) if(a<0) cout<<"Broj je negativan"<<endl; Ponovo, ispitiva da li je uslov tačan uvrštavajući uneseni broj umjesto varijable a. U našem slučaju broj 5. Kako 5<0 nije tačno, računar preskače dio iza if naredbe i prelazi na sljedeću naredbu return 0; i time završava program. Dakle, samo je bio tačan uslov u prvoj naredbi if za uneseni broj 5 pa se jedino i ona izvršila. Ovo smo napisali malo detaljnije kako program radi, jer je vrlo važno da razumijete if naredbu, da bi s njom mogli lakše manipulirati. NAPOMENA: U prethodnom primjeru smo iza naredbe if imali jednu naredbu i to cout. Šta ako želimo da se izvrše dvije, tri ili pak više naredbi, ako je neki uslov tačan? Tada koristimo blok tj. te naredbe stavljamo u vitičastu zagradu. if (uslov) {naredba1; naredba2; naredba3; itd} Imati na umu da iza svake naredbe dođe tačka-zarez (;), a da se poslije vitičastih zagrada NE PIŠE tačka-zarez. 4.3.2. Naredba if – else Ova naredba je slična naredbi if, pa sve rečeno za naredbu if vrijedi i za naredbu if – else. Naredba ima jedan dodatak else koji znači inače. Naredba se piše na sljedeći način: if (uslov) naredba1; else naredba2; Naredba if – else radi na sljedeći način: Kao i kod naredbe if prvo se provjerava da li je uslov tačan (istinit). Ako je uslov tačan, onda se izvršava naredba1, dok se naredba2 ne izvršava (preskače). Ako je pak uslov netačan, onda se naredba1 ne izvršava (preskače), ali se izvršava naredba2. Dakle, ako je uslov tačan izvršava se samo naredba1, ako nije tačan izvršava se samo naredba2. 36 Načini pisanja naredbe if-else: 1) if ( uslov ) naredba1; else naredba2; 2) if ( uslov ) naredba1; else naredba2; 3) if ( uslov ) { naredba11; naredba12; ... naredba 1n; } else { naredba21; naredba22; ... naredba 2m; } 4) if ( uslov) { naredba11; naredba12; ... naredba 1n; } else { naredba21; naredba22; ... naredba 2m; } Ovo su neki najčešći, najpregledniji načini pisanja naredbe if–else, mada ih se vi ne morate pridržavati tj. pišete u koliko redova hoćete, s kojim razmakom hoćete, bitno je samo da naredba sadrži svoj osnovni oblik, koji možete lijepo srediti samo s dva klika, tako što kliknete desnim dugmetom miša i odaberete Format use Astyle, slika 17. 37 Slika 17 Oblikovanje koda Primjer 15. Napisati program koji unosi dva cijela broja, te ako je njihov zbir veći od nule, ispisuje njihov proizvod, inače njihovu razliku. Rješenje. Trebamo unijeti dva cijela broja, pa odmah znamo da su tipa int, a imena neka budu a i b. Dakle, int a, b; . Imamo uslov, da je njihov zbir veći od nule tj. a+b>0. Ako je to tačno (za unesene brojeve), onda će se ispisati njihov proizvod tj. a*b. To je naša naredba1 u if-else naredbi. Dio inače njihovu razliku, znači, ako je uslov netačan, onda ispiši njihovu razliku tj. a-b, a ovo je naša naredba2 u if-else naredbi. #include<iostream> using namespace std; int main() { int a, b; cin>>a>>b; if(a+b>0) cout<<a*b<<endl; else cout<<a-b<<endl; Za unos 2 i 3 Za unos ‐2 i 1 return 0; } Primjer 16. Napisati program koji unosi tri cijela broja i ispisuje najvećeg od njih. Rješenje. Iz zadatka vidimo da moramo deklarirati tri varijable tipa int (jer su cijeli brojevi). Dajmo im imena a, b, c tj. int a, b, c; . Odmah iz zadatka se ne vidi da ćemo koristiti if naredbu. Kao to u zadatku prepoznati? Čim se u vašem govoru javi riječ AKO je nešto tako ONDA će biti ovo itd. Znamo da relacijski operatori (>, <, ==, itd) mogu uzeti (uporediti) samo dva broja. Pa ćemo mi uzeti npr. brojeve a i b, te ih uporediti, da vidimo koji je veći (postaviti 38 uslov a>b). Šta ako je uslov tačan? To znači da je broj a veći od broja b. Šta onda da uradimo? A šta ako je netačan? To znači da je onda broj b veći od broja a, šta da onda uradimo? Upravo zbog ovog " šta da onda uradimo", moramo uvesti novu varijablu kojoj ćemo dati ime max i njoj pridružiti (spremiti, u nju skladištiti) broj koji od njih dvojce (od a ili b) bude veći. if (a>b) max=a; else max=b; Ostaje još da uporedimo max i c, pa ko od njih bude veći, taj je onda najveći broj. Za unos 1, 2 i 3 #include<iostream> using namespace std; int main() { int a, b, c, max; cin>>a>>b>>c; if(a>b) max=a; else max=b; if(max>c) cout<<"Najveci je "<<max<<endl; else cout<<"Najveci je "<<c<<endl; Za unos 1, 3 i 2 Za unos 3, 2 i 1 return 0; } Program testirate sa što manjim brojevima tj. za koje znate kakav treba rezultat biti i sve moguće slučajeve, prije nego li ga proglasite tačnim. U ovom primjeru smo imali tri broja, pa smo u testiranju morali na sva ti mjesta staviti najveći broj da vidimo da li će ga program ispravno naći. Može li se zadatak riješiti bez uvođenja nove varijable? Da, može, upotrebom proširene ifelse-if-else naredbe: if(uslov1) naredba1; else if(uslov2) naredba2; else if(uslov3) naredba3; else naredba4; ili if(uslov1) if(uslov2) naredba2; else if(uslov3) naredba3; else naredba4; Ovdje smo stali na naredbi4, mada možete ići dokle vam je volja. Dakle, ako je uslov1 tačan, onda izvrši naredbu1, inače (ako nije tako), provjeri da li je uslov2 tačan, pa ako jeste izvrši naredbu2, inače (ako nije tačan), provjeri je li uslov3 tačan, pa ako jeste izvrši naredbu3, inače izvrši naredbu4. 39 #include<iostream> using namespace std; int main() { int a, b, c; cin>>a>>b>>c; if(a>b) if(a>c) cout<<"Najveci je "<<a<<endl; else cout<<"Najveci je "<<c<<endl; if(a<b) if(b>c) cout<<"Najveci je "<<b<<endl; else cout<<"Najveci je "<<c<<endl; return 0; } 4.3.3. Zadaci za samostalan rad Zadatak 17. Napisati program koji unosi dva cijela broja. Ako je prvi veći od nule ispisuje njhov proizvod, inače njihov zbir. Zadatak 17. Napisati program koji unosi dva cijela broja. Ako je razlika tih brojeva veća ili jednaka od nule ispisuje njihov zbir, inače njihov proizvod. Zadatak 18. Unijeti dva cijela broja. Ako je kvadrat prvog veći od kvadrata drugog broja, ispisati njhov zbir, a ako nije njihovu razliku. Zadatak 19. Napisati program koji će provjeriti jesu li dva broja a i b jednaka ili ne. Zadatak 20. Napisati program koji će provjeriti da li je cijeli broj unesen s tastature veći od 3. Zadatak 21. Napisati program koji učitava dva broja x, y te ispisuje poruku da li je x<y ili x>y ili x=y. Zadatak 22. Napisati program koji učitava dužine tri stranice trougla i ispisuje poruku da li je trougao pravougli. (Uputa: Zbir dvije stranice mora biti veći od treće, da bi imali trougao) Zadatak 23. Napisati program koji učitava tri prirodna broja i ispitiva da li su ti brojevi stranice trougla. Zadatak 24. Napisati program koji za uneseni prirodan broj provjerava da li paran broj. Ako jeste ispiše poruku "DA", ako nije poruku "NE". (Uputa. Koristiti operator modulo) Zadatak 25. Napisati program koji će za uneseni cijeli broj ispitati da li je djeljiv s 5. Zadatak 26. Napisati program koji od tri unesena cijela broja ispisuje najmanjeg. Zadatak 27. Napisati program koji za tri unijeta cijela broja a, b i c ispituje da li je jedan od njih jednak zbiru druga dva. Ako jeste ispisuje poruku npr. " Broj a je jednak zbiru brojeva b i c", ako nije poruku "Ne". Umjesto a, b i c koristiti konkretne brojeve. 40 Zadatak 28. Napisati program koji unosi dva prirodna broja a i b, i ispisuje poruku, ako je broj a djeljiv brojem b: "Broj a je djeljiv brojem b", a ako nije poruku "Broj a nije djeljiv brojem b". Umjesto a i b u poruci koristiti konkretne vrijednosti. 4.4. Logički operatori Do sada smo u uslovu kod if naredbe koristili relacijske operatore (<, >, ==, itd) i to samo jedan operator u izrazu. Postavlja se pitanje možemo li kako koristiti više relacijskih operatora? Jer kad bi mogli koristiti više njih u jednom uslovu, tada bi mogli graditi složenije uslove. Odgovor je potvrdan. To nam omogućuju logički operatori, koji služe za povezivanje dva ili više jednostavnih uslova - izraza (sa samo jednim relacijskim operatorom). Logički operatori u C++ su: Logički operator C++ operator ! negacija NE && logički I logički ILI Logički operator negacija "ne" je unarni operator, označava se sa ! i zapisuje se ispred elementa i mijenja njegovu logičku vrijednost iz tačno u netačno ili iz netačno u tačno. U C++ se tačno označava s brojem 1, a netačno s brojem 0. Logički operator "I" u oznaci && je tačan (ima vrijednost 1) ako i samo ako su oba operanda tačna (imaju vrijednost 1), inače je netačan (ima vrijednost 0 u svim ostalim slučajevima). Označimo jedan operand (izraz) sa A, a drugi sa B, npr. (5+c)<0 je izraz (operand). Budući da operator I, binarni operator tj. povezuje samo dva operanda, to onda imamo samo četiri moguća slučaja: A 0 0 1 1 B A && B 0 0 1 0 0 0 1 1 41 Logički operator "ILI" u oznaci || je tačan (ima vrijednost 1) ako je bar jedan operand (izraz) tačan tj. netačan je (ima vrijednost 0) samo ako su oba operanda netačna. A 0 0 1 1 B A || B 0 0 1 1 0 1 1 1 Primjer 17. Izračunati (utvrditi) da li su sljedeći izrazi (uslovi) tačni ili netačni. 5, 1. a) 1 1 0 && b) 5 && c) 3 0 5 0 && / – 5 0 1, 2. a) 3, 1 0 || 0 0 || b) 0 || c) 1, 3. 2, 4 a) 1 && b) && c) 0 || d) 5 e) ! 5 f) 0 || g) 0 && 0 0 && 1 0 || 1 || 0 && 0 && 0 0 5 0 && || 5 && 0 0 0 || Rješenje. 1) a) Sada umjesto varijabi i uvrstimo konkretne vrijednosti, te ispitamo da li je prvi izraz tačan ili netačan, isto tako za drugi, pa onda primjenimo operator &&, a umjesto tačno kao što smo rekli pišemo 1, a za netačno 0: (5+1)>0 && (5-1)>0 42 6>0 && 4>0 1 && 1 1 Dakle, ovaj uslov je tačan. b) 1 c) 0 2) a) Opet umjesto varijabli uvrstimo vrijednosti. a>0 || b>0 1>0 || 3>0 1 || 1 1 Dakle, tačno. b) 1 c) 1 3) a) Sada na isti način samo što gledmo prva dva, pa tako dobiven rezultat s sljedećim. a>=1 && b>0 && c<0 1>=1 && 2>0 && 4<0 1 && 1 && 0 1 && 0 0 Dakle, netačno b) 1 c) 0 d) 1 e) 1 f) 1 Pošto smo se upoznali s logičkim operatorima možemo raditi mnogo složenije zadatke. Primjer 18. Napisati program koji učitava dva cijela broja, te ako je jedan od brojeva negativan ispisuje njihov proizvod, a ako su pozitivni ispisuje njihovu razliku. Rješenje. 43 U zadatku se traži da unesemo dva cijela broja, koja ćemo označiti s a i b tj. int a, b; . Uslov je da se ispiše njihov proizvod, ako je jedan od brojeva negativan. To znači, da će se ispisati proizvod ovih brojeva, ako je negativan a, b pozitivan a pozitivan, b negativan negativan a, negativan b odnosno zapisano simbolima a<0, b>0 a>0, b<0 a<0, b<0 KOJI logički operator upotrebiti? Prethodna tri slučaja moraju biti tačna, a moramo to zapisati što kraće tj. jednostavnije – kao jedan slučaj. Tu dolaze do izražaja logički operatori. Pomoću njih ćemo povezati dva izraza (elementarna uslova): a<0 || b<0 Dovoljno je da je jedan a ili b, nije važno koji, negativan, da bi sve bilo tačno tj. da bi se ispisao njihov proizvod. A ako nije tako, onda su očito oba pozitivna. #include <iostream> using namespace std; int main(){ int a, b; cout<<"Unesite dva broja:"; cin>>a>>b; if (a < 0 || b <0) cout<<a*b<<endl; else cout <<a-b<<endl; return 0; } Za unos ‐2 i 3 Primjer 19. Napisati program koji unosi cijeli broj A, te provjerava da li se broj A nalazi između brojeva 1 i 10. Rješenje. Unosimo jedan cijeli broj A tj. int A. Uslov je da se broj nalazi između brojeva 1 i 10. To znači, da broj A mora biti veći od 1 i manji od 10. Koji logički operator koristiti? Sama prethodna rečenica vam je dala odgovor. To je logičko I tj. &&. Jer da bi broj A bio između brojeva 1 i 10, on mora biti istovremeno veći od 1 i manji od 10 tj. oba izraza moraju biti istovremeno tačna, da bi sve ukupno bilo tačno, a to nam daje logičko I. 44 #include <iostream> using namespace std; int main(){ int a; cout<<"Unesite broj:"<<endl; cin>>a; if (a >1 && a <10) cout<<"DA"<<endl; else cout <<"NE"<<endl; return 0; } 4.4.1. Zadaci za samostalan rad Zadatak 29. Napisati program koji unosi cijeli broj i ispisuje poruku "DA" ako je broj veći od 100, a manji od nule, ako nije onda poruku "NE". Zadatak 30. Napisati program koji unosi prirodan broj N. Ako je broj N djeljiv s 5 i paran broj, ispisuje poruku "Broj N je djeljiv s 5 i paran je broj", u suprotnom poruku "NE". U poruci N treba biti konkretna vrijednost. Zadatak 31. Napisati program koji učitava cijeli broj i provjerava da li je taj broj djeljiv s 5 i 7. Zadatak 32. Napisati program koji unosi dva cijela broja A i B i koji ispisuje broj A, ako je zbir i razlika brojeva A i B veće od nule, inače ispisuje broj B. Zadatak 33. Napisati program koji učitava četiri cijela broja a, b, c i d. Ako je prvi pozitivan i zbir drugog i četvrtog veći od nule i zbir prvog i trećeg manji od nule ispisuje, proizvod a*b*c, inače ispisuje koliko je a-b-c. 45 4.5. Ciklusi ili petlje Ciklusi ili petlje su upravljačkie strukture koje omogućuju ponovljeno izvršavanje neke naredbe. Prema zadavanju uslova dokle treba da se petlja ponavlja, mogu da postoje: petlje koje traju dok je neki uslov ispunjen petlje koje traju dok neki uslov nije ispunjen brojačke petlje 4.5.1. For petlja Jedna od najvažnijih petlji je for petlja. Njena upotreba u programima je neizostavna, zbog toga je vrlo važno razumjeti kako ona funkcionira. Kada ćemo koristiti for petlju? AKO JE BROJ PONAVLJANJA POZNAT, TADA KORISTIMO FOR PETLJU Opći oblik for petlje je: for (izraz1; uslov; izraz2) naredba; Izraz1 predstavlja pripremu za ulazak u petlju i njegova vrijednost se samo iskoristi prvi put. Uslov je logički izraz koji predstavlja uslov za nastavljenje petlje. Dok je tačan petlja se izvodi, čim postane netačan petlja se prekida. Izraz2 predstavlja promjenu vrijednosti izraza1 na kraju svakog prolaska kroz petlju. Načini pisanja for petlje: 1) for(izraz1; uslov; izraz2) naredba; 2) for(izraz1; uslov; izraz2) naredba; for(izraz1; uslov; izraz2) { naredba1; naredba2; } Dvije ili više naredbi, koje pripadaju for petlji se moraju staviti u vitičaste zagrade!!! ... naredba n; 46 3) for(izraz1; uslov; izraz2) { naredba1 naredba2 ... naredba n } Primjer 20. Napisati program koji ispisuje poruku "C++" 10 puta. Rješenje. Prema znanju koje imamo (bez znanja for petlje) mi bi ovaj zadatak riješili tako što bi poruku "C++" napisali 10 puta: cout<<"C++ C++ C++ C++ C++ C++ C++ C++ C++ C++"; Pa i nije neki zamor. No, šta da svaka poruka mora biti u novom redu? Onda bi bilo malo više posla, ali i to se da. Što će nam onda for petlja? Recimo da smo u zadatku umjesto 10 puta napisali 1000 ili možda milion puta. Koliko bi nam samo vremena trebalo da to napišemo na prethodni način? Tu dolazi do izražava moć for petlje. Mi napišemo jednom, a ono se ispiše koliko puta želimo. Vratimo se sada rješenju našeg zadatka pomoću for petlje. Iz zadatka znamo da se poruka "C++" treba ispisati 10 puta. To je naš uslov iz definicije for petlje. Izraz1 u definiciji petlje označava odakle petlja kreće tj. pretstavlja njenu početnu vrijednost. U našem slučaju će krenuti od broja 1. Izraz2 u definiciji for petlje označava za koliko će se izraz1 – početna vrijednost povećati nakon što prgram dođe do kraja for petlje. To je zapravo korak, koji diktira način ponavljanja. U našem slučaju, izraz2 mora povećati izraz1 svaki put za 1. Jer trebamo ispisati "C++" 10 puta, pošto krećemo od 1, a trebamo doći do 10. Kako napisati tj. zapisati izraz1? Najčešće se u tom slučaju koristi varijabla i, može i neko drugo ime. Ali varijablu i moramo deklarirati na početku, te je tipa int. Kako napisati uslov? Uslov obično sadrži varijablu iz izraza1 i mora biti logički uslov. U našem slučaju je i<=10. Kako napisati izraz2? Već smo rekli da on povećava izraz1 tj. početnu vrijednost (može i smanjivati, ali u našem slučaju povećava). Obično se piše i++, ako povećava za 1. Mogli smo napisati i ovako i=i+1. To je isto. 47 Konačno rješenje zadatka. #include <iostream> using namespace std; int main(){ int i; for(i=1; i<=10; i++) cout<<"C++"<<endl; return 0; } Primjer 21. Napisati program koji će ispisati brojeve od 10 do 1. Rješenje. Zadatak od nas traži da ispišemo brojeve 10, 9, 8, ... , 1. Dakle, opet imamo ponavljanje, pa ćemo koristiti for petlju. Sada je početna vrijednost 10, a krajnja 1, pa nam izraz2 mora biti takav da smanjuje početnu vrijednost. Uslov, petlja mora da se vrti – ponavlja do 1, pa mora biti oblika i>=1 ili i>0. #include <iostream> using namespace std; int main(){ int i; for(i=10; i>=1; i--) cout<<i<<endl; return 0; } Primjer 22. Napisati program koji ispisuje sve parne brojeve između 1 i 15. Rješenje. Početna vrijednost-izraz1 će nam biti sada i=2 jer je 2 prvi parni broj koji se nalazi u zadanom intervalu. Uslov će biti i<15, a izraz2 tj. korak će biti i=i+2. Sljedeći parni broj 48 poslije 2 je 4, pa 6, 8, itd. Da bi dobili 4 moramo na 2 tj. početnu vrijednost dodati 2. Isto tako da bi dobili 6 od 4, moramo na 4 dodati 2, itd., zbog toga mora biti oblika i=i+2. Pojasnimo malo ovaj izraz. On znači da onu vrijednost koju ima i povećamo za 2, pa novu vrijednost pridružimo varijabli i. Stara vrijednost se obriše, a nova upiše. #include <iostream> using namespace std; int main(){ int i; for(i=2; i<15; i=i+2) cout<<i<<endl; return 0; } Primjer 23. Napisati program koji ispisuje sve brojeve od 1 do 100 koji su djeljivi sa 7. Rješenje. Ovakav zadatak na prvi pogled se može učiniti teškim. No, vidjet ćemo da nije tako. Kako trebamo za svaki broj od 1 do 100 provjeriti je li djeljiv sa 7, to nam odmah sugerira da trebamo koristiti for petlju, jer za svaki broj trebamo uraditi isto. To isto je provjeriti je li djeljiv s 7 odnosno provjeriti da li je ostatak pri dijeljenju tog broja sa 7 jednak nuli. Dakle, izraz1 u petlji će nam biti i=1 (mada smo mogli i staviti i=7, ali neka ostane i=1 jer još uvijek smo početnici). Uslov će biti i<=100. Izraz2-korak će biti 1 odnosno i++. Ostaje još da odredimo šta će biti u petlji tj. koje će se to naredbe ponavljati. Za svaki broj moramo naći ostatak i ispitati da li je jednak nuli. Ako jeste ispisati ga. Dakle, to je uslov za if (ako) naredbu. #include <iostream> using namespace std; int main(){ int i; for(i=1; i<=100; i++) if(i%7==0)cout<<i<<endl; return 0; } Primjer 24. Napisati program koji će sabrati sve prirodne brojeve od 1 do 100. Rješenje. Od anegdota o poznatim matematičarima možda je najčešće prepričavana ona o velikom matematičaru Karlu Friedrichu Gaussu, iz doba njegova djetinjstva: Jednom zgodom 49 učitelj đacima dade u zadatak neka izračunaju zbir prvih stotinu prirodnih brojeva. Očekivao je kako će ga djeca, zadubljena u rješavanje, neko duže vrijeme ostaviti na miru, no nemalo se iznenadio kada je već nakon nekoliko trenutaka mali Gauss javio tačan rezultat. Zadatak ćemo riješiti upotrebom for petlje, jer trebamo sabrati brojeve 1, 2, 3, ... , 100. Dakle, imamo ponavljanje. Početna vrijednost (izraz1) će biti i=1. Uslov i<=100. Izraz2 (korak) i++. Ovo je za sada bilo lahko. Ostaje još da odredimo, šta će to biti u for petlji tj. da napišemo izraz (formulu) koja će sabirati te brojeve. Prvo ćemo uzeti i deklarirati još jednu varijablu kojoj ćemo dati ime zbir. Pošto sabiramo samo prirodne brojeve, ona će biti tipa int. U ovoj varijabli ćemo čuvati naš rezultat (zbir). Varijablu zbir ćemo odmah i inicijalizirati tj. pridružiti (spremiti, skladištiti) joj broj 0. Ovo činimo zbog toga što varijabla ima neku vrijednost, obično broj u memoriji, pa bi dobili pogrešan rezultat. Naredba koja će sabirati brojeve i ujedno čuvati rezultat je zbir=zbir+i; #include <iostream> using namespace std; int main(){ int i, zbir=0; for(i=1; i<=100; i++) zbir=zbir+i; cout<<zbir<<endl; return 0; } Razmotrimo sada rješenje korak po korak da vidimo kako to funkcionira. Računar dolazi do for petlje. Početna vrijednost je i=1. Potom provjerava da li je uslov zadovoljen (tačan) tj. računa i<=100 kad uvrsti i=1 je 1<=100 tačno. Zatim ulazi u for petlju i izvršava naredbu zbir=zbir+i; tj. kad uvrstimo zbir=0+1 odnosno zbir=1. Pošto u for petlji nema više naredbi osim prethodne, tada se izvršava izraz2 tj. i++ odnosno i=i+1 tj. i=1+1=2. Ovo je bio prvi korak u for petlji. Sada ide drugi. Provjerava se uslov: i<=100. Sada je i=2, a ne 1. Pa je 2<=100 tačno. Ulazi se u for petlju i izvršava naredba zbir=zbir+i=1+2=3. Pazite, varijabla zbir je u prvom koraku promijenila svoju vrijednost iz 0 u 1. Sada se opet izvrši izraz2 tj. i postaje i=i+1=2+1=3. Sada bi išao korak 3, pa 4, 5, itd do 100. Vidimo da naredba zbir=zbir+i zapravo znači: 1+2+3+...+100 Na kraju moramo još ispisati rezultat tj. vrijednost varijable zbir. 50 Primjer 25. Napisati program koji će izračunati (prebrojiti) koliko ima prirodnih brojeva između 1 i 1000, a koji su djeljivi sa 19. Rješenje. Ovo je sličan zadatku koji smo prije uradili a tražilo se da ispišemo sve brojeve djeljive sa 7 između 1 i 100. Brojeve nećemo ispisivati već ćemo izbrojati koliko ih ima. Kako ćemo to uraditi? Tako što ćemo deklarirati i incijalizirati varijablu s imenom brojac (može naravno i neko drugo ime) tj. int brojac=0; . Odmah varijablu brojac stavljamo na vrijednost 0, jer kad nađemo prvog koji je djeljiv s 19, odnosno kad uslov u naredbi if bude tačan, varijablu povećamo za 1. Pa kad nađemo drugog opet varijablu povećamo za 1. Tu radnju možemo jednostavno zapisati sa brojac++; ili brojac=brojac+1;. Na kraju ostaje još samo da ispišemo koliko ih ima. #include <iostream> using namespace std; int main(){ int i, brojac=0; for(i=1; i<=1000; i++) if(i%19==0) brojac++; cout<<brojac<<endl; return 0; } Primjer 26. Napisati program koji učitava prirodan broj i ispisuje poruku da li je taj broj savršen. (Broj je savršen ako je jednak zbiru svih svojih djelitelja manjih od njega samog, npr. djelitelji od broja 6 su 1, 2, i 3 te vrijedi 1+2+3=6 ili za 28=1+2+4+7+14). Rješenje. Ovo je malo teži primjer, jer zahtjeva od nas da kombiniramo prethodne primjere. U zadatku se od nas traži da provjerimo da li je uneseni prirodan broj savršen. Dajmo ime tom broju n tj. int n;. Iz definicije savršenog broja slijedi da trebamo naći sve djelitelje unesenog broja manje od njega samog (to znamo iz prethodnih primjera) i kako kojeg nađemo ujedno ih sabiramo (to također znamo iz primjera gdje je trebalo sabrati prvih 100 prirodnih brojeva). Kako će sada izgledati for petlja. Znamo da je izraz1 jednak i=1. Uslov: djelimo sve do unesenog broja tj. i<n. Izraz2 je i++. Ostaje još samo da vidimo da li je taj zbir jednak unešenom broju, ako jeste broj je savršen, inače nije. 51 #include <iostream> using namespace std; int main(){ int i, n, zbir=0; cout<<"Unesite prirodan broj: "; cin>>n; for(i=1; i<n; i++) if(n%i==0) zbir=zbir+i; if(n==zbir) cout<<"Broj je savrsen."<<endl; else cout<<"Broj nije savrsen."<<endl; return 0; } Primjer 27. Napisati program koji ispisuje sve savršene brojeve koji se nalaze između 1 i 1000. Rješenje. Ovaj primjer ćemo iskoristiti da demonstriramo kako se koristi petlja u petlji. Jer i u for petlji može biti jedna ili više for petlji. Također, isto može biti i unutar tih petlji. Iz prethodnog primjera znamo kako se traži (provjerava) da li je broj savršen. Sada to moramo uraditi za svaki broj od 1 do 1000. Dakle, trebaće nam for petlja koja ima početnu vrijednost izraz1 n=1. Uslov: n<=1000, a izraz2 je n++. Unutar ove petlje će biti for petlja iz prethodnog primjera. Prije nje ćemo morati staviti da je zbir=0; tj. moramo za svaki broj na ovaj način prije ulaska u drugu petlju resetirati varijbalu zbir odnosno njenu vrijednost. Unutar te petlje će biti i provjera da li je zbir jednak n tj. ako jeste ispisaćemo broj n, jer je on tada savršen broj. Pošto ćemo u toj vanjskoj petlji imati tri naredbe: zbir=0; for petlju iz prethodnog primjera i provjeru je li zbir jednak n, to ćemo ih morati staviti u vitičaste zagrade. #include <iostream> using namespace std; int main() { int i, n, zbir; for(n=1; n<=1000; n++){ zbir=0; for(i=1; i<n; i++) if(n%i==0) zbir=zbir+i; if(n==zbir) cout<<n<<endl; } return 0; } 52 Primjer 28. Napisati program za ispis prirodnih brojeva od 1 do n. Rješenje. #include <iostream> using namespace std; int main() { int i, n; cin>>n; for(i=1; i<=n;i++) cout<<i<<endl; Za unos 5 return 0; } 4.5.2. Zadaci za samostalan rad Zadatak 34. Napisati program koji će ispisati sve neparne brojeve od 1 do 20. Zadatak 35. Napisati program koji će ispisati brojeve 10, 20, 30, ... , 100. Zadatak 36. Napisati program koji ispisuje prirodne brojeve od 5 do 20 unazad. Zadatak 37. Napisati program koji će ispisati sve brojeve između 1 i 100, koji su djeljivi s 11. Zadatak 38. Napisati program koji će sabrati sve parne brojeve od 1 do 200. Zadatak 39. Napisati program za ispis zbira prvih 50 prirodnih brojeva. Zadatak 40. Napisati program koji će ispisati tri višekratnika (sadržioca) broja 15 uz uslov da su veći od 50. (Višekratnici ili sadržioci prirodnog broja su svi brojevi koji su djeljivi s tim brojem) Zadatak 41. Napisati program za ispis zbira prirodnih brojeva manjih od 500, a djeljivih sa 3 i ispisati koliko takvih brojeva ima. (Rj. zbir=41583, a ima ih 166) Zadatak 42. Napisati program koji će ispisati višekratnike (sadržioce) unijetog broja n. Broj n mora biti veći od 5 i manji od 20. Ispisuju se samo višekratnici koji su manji od 150. Zadatak 43. Napisati program koji ispisuje sve parne brojeve koji se nalaze između brojeva A i B. Svaki parni broj se ispisuje u novom redu. Brojevi A i B se unose. Zadatak 44. Napisati program koji sabira sve višekratnike broja 7 koji se nalaze između zadanih brojeva A i B. Ako između zadanih brojeva nema višekratnika broja 7, ispišite poruku „Nema traženih visekratnika“. Zadatak 45. Napisati program koji provjerava da li je unešeni broj prost broj. (Broj prost ako je djeljiv samo s 1 i sa samim sobom) Zadatak 46. Napisati program koji će ispisati zbir kvadrata brojeva od 1 do n. 53 1 je Zadatak 47. Napisati program koji će ispisati sumu (zbir) prirodnih brojeva u intervalu od 1 do n koji su djeljivi sa 3 i sa 7. Zadatak 48. Napisati program koji će ispisati zbir prirodnih brojeva u intervalu od 1 do n čija je cifra jedinica 8. Zadatak 49. Napisati program za izračunavanje proizvoda od 1 do 5. Zadatak 50. Napisati program za ispis aritmetičke sredine parnih prirodnih brojeva do n. Zadatak 51. Napisati program koji će izračunati zbir dvocifrenih brojeva kod kojih je zbir cifara manji od 7. Zadatak 52. Napisati program koji će ispisati sve dvocifrene brojeve sa drugom cifrom većom od 6. Zadatak 53. Napisati program koji će ispisati dvocifrene brojeve kod kojih pri djeljenju sa 3 je ostatak 2. 4.5.3. While petlja Petlja while se koristi za ponavljanje dijela koda programa kod kojeg broj ponavljanja nije unaprijed poznat. Dakle, kada ne znamo da li će se pri svakom pokretanju programa ili petlje while ona izvršiti jednom, dva puta ili deset puta ili pak nijednom. While petlju možemo koristiti i kada je broj ponavljanja poznat. Opći oblik while naredbe je: while ( uslov ) naredba; Kada računar dođe do while petlje on prvo se provjerava uslov. Ako je uslov (koji mora biti logički izraz) tačan, izvršava se naredba. Potom se opet provjerava uslov, pa ako je tačan, izvršava se naredba. Ciklus tj. petlja se završava kada vrijednost uslova postane logička neistina tj. netačan. Dakle, naredba while se izvršava sve dok je uslov tačan. Treba uočiti da se može desiti da naredba ne bude nijednom izvršena, ako pri prvoj provjeri uslov, bude netačan. Kao i kod for petlje, ako imamo dvije ili više naredbi koje pripadaju while naredbi, onda se one pišu u vitičastim zagradama tj. u bloku. Rijedak je slučaj kada ćemo koristiti načine pisanja 1 i 2, većinom 3 ili 4. 54 Načini pisanja while naredbe: 1) while ( uslov ) naredba; 2) while ( uslov ) naredba; 3) while ( uslov ) 4) while ( uslov ){ { } naredba1; naredba2; ... naredba n; } naredba1; naredba2; ... naredba n; Primjer 29. Napisati program koji će ispisati brojeve od 1 do 10. Rješenje. Uzeli smo ovaj lagan zadatak da demonstriramo kako to radi while petlja. Prvo što trebamo je odrediti je uslov. On treba biti tačan sve dok se ne ispišu svi brojevi. Pošto je zadnji 10, onda će biti i<=10, gdje smo uzeli varijablu i, te joj odmah pri deklaraciji dali vrijednost 1, jer je 1 prvi broj koji će se ispisati. Brojeve će ispisivati naredba cout koja će biti u while petlji. Ostaje još da definiramo šta će nam biti brojač tj. naredbu koja će mijenjati vrijednost varijable i, da bi uslov nakon ispisa broja 10 bio netačan tj. da bi se while petlja završila. Kako se brojevi trebaju ispisivati po redu 1, 2, 3, itd to ćemo očito i povećavati za 1. Pa će brojač biti oblika i=i+1 ili i++. #include <iostream> using namespace std; int main() { int i=1; while(i<=10) { cout<<i<<endl; i++; } return 0; } Primjer 30. Napisati program koji učitava prirodan broj i ispisuje mu cifre počevši od cifre najmanje mjesne vrijednost (cifre jedinica) i to svaku u novom redu. Rješenje. Trebamo unijeti jedan prirodan broj i ispisati mu cifre, svaku u novom redu, počevši od cifre jedinica. Pošto, ne znamo, koji će broj korisnik unijeti tj. da li će to biti jednocifren, dvocifren ili pak petocifren broj, koristimo while petlju. Da lakše odredimo šta će biti uslov i koje će se naredbe nalaziti u while petlji, posmatrajmo jedan konkretan broj npr. 629. Kako sada dobiti zadnju cifru od broja 629? Tako što ćemo koristiti operator modulo – ostatak pri 55 cjelobrojnom dijeljenju (%). Pa će biti 629%M=9, gdje je M, koji broj? Kako ga odrediti? Pošto je 9 ostatak, to će očito biti 620 + 9, sada se jasno vidi da je 620=62*10 629 = 620 * 10 + 9 Dakle, M je broj 10. Pa će nam 629%10 dati cifru 9. Kako dobiti drugu cifru? Kada bi imali broj 62, onda bi bilo lahko. Opet bi napisali 62%10, a to je 2, i dobili bi drugu cifru. Možemo li kako od broja 629 dobiti broj 62? Imajte na umu da mi radimo s cijelim brojevima i da ćemo koristiti tip int. Podijelimo broj 629 sa 10. To će dati 62,9. Kako već rekoh, mi ćemo koristiti tip int, za broj koji bude unosio korisnik, pa će računar odbaciti dio poslije zareza, pa će ostati samo 62. Sada primjenimo modulo tj. 62%10=2. Kako dobiti treću cifru? Pa na isti način kao i drugu. Podijelimo 62 sa 10. Dobićemo 6,2. Računar će odbaciti dio poslije zareza, jer radimo s cijelim brojevima i ostaće broj 6. Konačno, 6%10=6 i tako smo dobili sve tri cifre. Ako podijelimo još broj 6 sa 10 dobit ćemo 6/10=0,6 tj. 0 jer će računar odbaciti dio poslije zareza. Dakle, podijelimo li sa 10 još i zadnju cifru (onu koja je ostala zadnja pri prethodno opisanom načinu ispisivanja cifri broja), uvijek ćemo dobiti broj 0. Stoga će se petlja ponavljati sve dok je uslov različit od nule. Šta se je u prethodnom objašnjenju ponavljalo? tražili smo modulo 10 dijelili smo sa 10 Dakle, označimo s n prirodan broj kojeg unosi korisnik tj. int n;. Naredbe koje će biti u while petlji su: cout<<n%10<<endl; n=n/10; Uslov je oblika n!=0 jer kad zadnji broj (unašem primjeru broj 6) podijelimo s 10 dobićemo 0, pa dok je god n različito od 0 (nije nula), izvršavat će se while petlja. #include <iostream> using namespace std; int main() { int n; cin>>n; while(n!=0) { cout<<n%10<<endl; n=n/10; } return 0; } 56 Za unos 629 Testirati program i za jednocifren i dvocifren broj, jer se može desiti da recimo za sve brojeve daje ispravan rezultat, osim za jednocifrene. Primjer 31. Napisati program za sabiranje brojeva. Brojevi se unose s tastature. Kada korisnik unese broj 0, program se završava. Rješenje. #include <iostream> using namespace std; int main(){ int i, zbir = 0; cout<< "Unesite broj: "; cin >> i; while(i!=0){ zbir=zbir+i; cout<<"Unesite broj: "; cin>>i; } cout<<"Zbir je "<<zbir<<endl; return 0; } 4.5.4. Petlja do while Naredba do while se također koristi kada nam nije poznat broj ponavljanja, ali za razliku od for i while petlje ovdje se naredba izvrši bar jednom. Pošto, se kod ove petlje prvo izvrši naredba, pa se onda provjeri uslov, a kod for i while petlje se prvo provjeri uslov, pa se izvršavaju naredbe. Opći oblik do while naredbe je: do naredba; while(uslov); ZAPAMTITI: Na kraju obavezno staviti ; Načini pisanja do while naredbe: 1) do naredba; while(uslov); 2) do naredba; while(uslov); 3) do { 4) do { naredba1; naredba2; ... naredba n; } while( uslov); naredba1; naredba2; ... naredba n; } while(uslov); 57 4.5.5. Naredba break Iskakanje iz upravljačke strukture se postiže naredbom: break; Time se postiže završetak ciklusa (petlje): for, while, do while, skakanjem na prvu naredbu neposredno iza petlje. Nekad ćete doći u situaciju da želite izađi iz petlje prije nego se završi tada obično koristite naredbu break. 4.5.6. Zadaci za samostalan rad Zadatke rješavati upotrebom while petlje. Zadatak 54. Napisati program za ispis kvadrata prirodnih brojeva od 1 do 5.. Zadatak 55. Napisati program za ispis prirodnih brojeve od 5 do 20 unazad. Zadatak 56. Napisati program za ispis kvadratnog korijena prirodnih brojeva do 10. Zadatak 57. Napisati program za ispis prirodnih brojeva od 1 do n. Zadatak 58. Napisati program za ispis parnih prirodnih brojeva od 1 do n. Zadatak 59. Napisati program za ispis proizvoda brojeva od 1 do n koji su djeljivi sa 7. Zadatak 60. Napisati program za brojanje brojeva djeljivih sa 3, za prirodne brojeve od 1 do n. 5. NIZOVI (POLJA) Pretpostavimo da trebamo riješiti zadatak u kojem se od nas traži da unesemo npr. 100-tinu cijelih brojeva. Tada bi za svaki broj trebali po jednu varijablu. Ako bismo uzeli imena slova abecede a, b, c, itd brzo bi ih potrošili. Mogli bi pisati a1, a2, a3, itd. No, ni ovo nije prikladno rješenje, jer ne zaboravimo da treba napisati 100-tinu varijabli prilikom deklaracije, pa onda i kad ih budemo unosili. Postavlja se pitanje, ima li lakšeg i jednostavnijeg način? Ima, upotrebom nizova ili polja. Šta je to niz? Niz ili polje je konačni niz podataka istog tipa koji predstavljaju cjelinu. Primjer 32. Sljedeći brojevi predstavljalju niz: 1, 2, 3, 4, 5, 6, 7, 8 , 9 10 1, 3, 5, -1, 3, 1, 8, 9, 7, 0 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 58 Svi su istog tipa tj. int odnosno cijeli brojevi. Također, niz može biti sastavljen i od znakova: a, b, c, d, e, f a1, a2, a3, a4 arif, elma, murat, omer Dakle, niz se sastoji od podataka istog tipa. Podaci u nizu se nazivaju elementi (članovi) niza. Naprimjer u nizu a, b, c, d, e, f elementi (članovi) niza su slova i to slovo a je jedan element, drugi element je slovo b itd. Elementi niza se identifikuju pomoću rednog broja unutar niza tj. položaj (mjesto) u nizu je određeno pomoću rednog broja. Ti redni brojevi nazivaju se indeksi elementa niza. Prvi element niza u C++ ima obavezno indeks 0, drugi 1, treći 2, itd. Tako npr. u nizu a, b, c, d, e, f slovo a se nalazi na mjestu 0 odnosno ima indeks 0, slovo b indeks 1, c indeks 2, d indeks 3, e indeks 4 i f indeks 5. Nizovi mogu biti: jednodimenzionalni višedimenzionalni. Mi ćemo u našoj skripti raditi samo jednodimenzionalne nizove. To su nizovi navedeni u prethodnom primjeru. 5.1. Jednodimenzionalni nizovi Sve prethodno što smo rekli vrijedi za jednodimenzionalni niz. Kada kažemo niz, u daljem tekstu mislimo na jednodimenzionalni niz, da ne bi stalno pisali riječ jednodimenzionalni. U C++ niz definiramo na sljedeći način: tip_elementa ime_niza [dužina niza] Prvo navodimo tip elemenata niza. Pišemo int, ako će elementi biti cijeli brojevi, double ako će elementi biti realni brojevi, char ako će elementi biti znakovi, itd, isto kao i za varijable. Drugo pišemo ime niza. Kao i kod varijabli, ime vi dajte i sami birate kako će biti. Obavezno idu srednje zagrade [], koje se dobiju pritiskom tipki Alt Gr + F i Alt Gr + G. 59 Unutar srednjih zagrada se navodi broj, koji označava dužinu niza tj. govori koliko će niz imati elemenata. Primjer 33. int dan[5]; Na ovaj način smo definisali (deklarirali) niz čije ime je dan, a koji ima pet elemenata tipa int. Imati na umu da indeksi (mjesta) elemenata niza idu od 0 tj. indeksi su 0, 1, 2, 3, 4. double A[10]; Na ovaj način smo definisali niz čije je ime A i koji ima deset elemenata tipa double. char slova[30]; Na ovaj način smo definisali niz čije je ime slova, a ima 30 elemenata tipa char. Elementima (članovima) deklariranog niza mogu se pridružiti vrijednosti. Pridruživanje vrijednosti elementu niza: ime_niza [ indeks elementa] = vrijednost Primjer 34. niz [3] = 1; Na ovaj način smo elementu niza čiji je indeks 3 (pozicija ili mjesto u nizu 3) pridružili vrijednost 1. Možemo odmah prilikom deklaracije izvršiti inicijalizaciju niza. Vrijednosti se navode unutar para vitičastih zagrada, odvojene zarezom. Primjer 35. int a[5]= {9, 5, 4, -1, 1} Sada smo svakom elementu niza pridružili određenu vrijednost. 60 Kako dobiti npr. broj 4 iz niza? Dobićemo ga tako što napišemo ime niza i u srednjim zagradama indeks (poziciju, mjesto) gdje se broj 4 nalazi tj.: a[2] Pogledajmo kako to u tabeli izgleda za svaki element prethodnog niza: 9 a[0] 5 a[1] 4 a[2] -1 a[3] 1 a[4] Elemente niza najčešće unosimo for petljom ili while petljom. Oprez! U radu s nizovima treba biti oprezan, jer jezik C++ ne provjerava granice niza prilikom pristupa elementima (članovima) niza. Ako se navede prevelik ili negativan indeks, prevoditelj neće javiti pogrešku i pri izvršavanju programa pristupit će se memorijskoj adresi koja nije u području rezerviranom za niz. To će prouzročiti neispravan rad programa. Ako se izdvaja (dohvaća) element (član) s nedozvoljenim indeksom, rezultat je slučajni broj. Ako se vrijednost pridružuje članu s nedozvoljenim indeksom, vrijednost će se pohraniti u memoriju na mjesto predviđeno za druge sadržaje što će vjerojatno prouzročiti pogrešan rad programa. Primjer 36. Brojeve 1, 5, -1, 4, 5 spremiti u niz broj, te ih ispisati na ekran svaki u novom redu. Rješenje. #include <iostream> using namespace std; int main() { int a[5]={1, 5, -1, 4, 5}; cout<<a[0]<<endl; cout<<a[1]<<endl; cout<<a[2]<<endl; cout<<a[3]<<endl; cout<<a[4]<<endl; return 0; } Ovakav način ispisa elemenata niza se koristi samo ako elemenata niza ima malo. Većinom se koristi for petlja. Jer kako vidimo iz rješenja zadatka dio cout<<a[]<<endl; se ponavlja dok se samo broj u srednjoj zagradi mijenja. Prethodni primjer sa for petljom: 61 #include <iostream> using namespace std; int main() { int i, a[5]={1, 5, -1, 4, 5}; for(i=0;i<5;i++) cout<<a[i]<<endl; return 0; } Obratiti pažnju na početnu vrijednost, da je i=0 (element s indeksom 0, prvi u nizu), uslov i<5 mada se je moglo napisati i<=4, ali je prvi način bolji. Primjer 37. Napisati program koji unosi 10 cijelih brojeva, i ispisuje ih obrnutim redosljedom u jednom redu s praznim razmakom. Rješenje. Deklariramo niz tipa int, imena a, dužine 10. Koristimo for petlju za unos brojeva. Drugu for petlju koristimo za ispis brojeva, s tim da je onda početna vrijednost najveći indeks. #include <iostream> using namespace std; int main() { int i, a[10]; for(i=0;i<10;i++) cin>>a[i]; for(i=9;i>=0;i--) cout<<a[i]<<" "; return 0; } NAPOMENA: Sasvim je svejedno da li ćete prvo napisati sve brojeve koje unosite s razmakom obavezno, pa pritisnuti tipku Enter ili ćete napisati prvi broj, pa Enter, drugi broj pa Enter, itd. Primjer 38. Napisati program koji će učitati elemente (članove) niza i sortirati ih po rastućem redoslijedu. (5 članova niza) Rješenje. 62 #include <iostream> using namespace std; int main() { int i,j,m; int a[5]; for(i=0; i<5; i++) cin>>a[i]; for(i=0; i<4; i++) for(j=i+1; j<5; j++) if(a[i]>a[j]) { m=a[i]; a[i]=a[j]; a[j]=m; } for(i=0; i<5; i++) cout<<a[i]<<" "; return 0; } Razmotrimo rješenje ovog zadatka, da bi shvatili kako sortiranje funkcionira. Kao što vidite potrebna nam je jedna petlja za unos i jedna za ispis niza. Za rješenje traženog problema trebaju nam dvije for petlje i to jedna u drugoj. Pojasnimo to na primjeru niza 2, 1, 3, 0, 4. Prva for petlja for(i=0; i<4; i++) uzme prvi element 2 i pomoću druge petlje for(j=i+1; j<5; j++) upoređuje ga s ostalim elementima niza. Tako druga petlja prvo uporedi 2 i naredni element (j=i+1), a to je 1. To radi dio if(a[i]>a[j]) Ako je to tačno, što u našem slučaju jeste, jer je 2>1, onda ovaj dio u if naredbi m=a[i]; a[i]=a[j]; a[j]=m; napravi zamjenu. Broj dva stavi u varijablu m, a na njegovo mjesto stavi broj 1. Zatim, na mjesto broja 1 stavi broj 2. Varijabla m nam treba da se ne bi broj 2 obrisao kad se na njegovo mjesto stavlja broj 1. S varijablom m mi broj 2 privremeno premjestimo s tog mjesta da bi ga sačuvali. Nakon toga niz izgleda ovako 1, 2, 3, 0, 4. Druga petlja, ide dalje pa uzima sljedeći broj 3 i sad upoređuje s a[i], to je a[0], a to je sad 1. Pošto 1>3, nije tačno, ide na sljedeći broj, a to je 0. Kako je 1>0, tačno, opet na isti način pravi zamjenu, pa niz izgleda ovako 0, 2, 3, 1, 4. Sad upoređuje a[0] tj. 0 sa 4. Pošto 0>4 nije tačno, ništa se neće desiti. Prva for petlja je 63 imala vrijednost i=0 i ona se je izvršila samo jednom, a druga se je izvršila do kraja. Rezultat toga je da na prvom mjestu u nizu imamo najmanji broj. Sada se prva pomjera za 1 tj i postaje 1, pa a[i] tj. a[1] uzima drugo mjesto i poredi ga sa ostalim elementima u nizu. Ponavlja se čitav prethodni postupak. Kad se izvrši druga petlja, na drugom će mjestu biti najmanji broj od preostalih elemenata niza. I tako će niz biti sortiran. U prvoj petlji uslov je i<4, jer onaj koji zadnji ostane je i najveći, ali nebi pogriješili kad bi stavili i<5, samo bi računar imao malo više posla. 5.2. Zadaci za samostalan rad Zadatak 61. Napisati program koji će učitati niz od 7 cijelih brojeva i sortirati ih od najvećeg ka najmanjem tj. sortirati ih po opadajućem redosljedu. Zadatak 62. Napisati program koji će učitati niz od 10 cijelih brojeva i ispisati koliko ima učitanih negativnih brojeva. Zadatak 63. Napisati program koji će učitati niz od 8 prirodnih brojeva i ispisati njihovu aritmetičku sredinu. Zadatak 64. Napisati program koji će učitati niz od 10 cijelih brojeva i ispitati da li zbir tih brojeva djeljiv sa 11. 6. STRING Niz znakova, string, zauzima u memoriji jedan ili više bajtova koji su kontinuirano smješteni. String u C++ možemo posmatrati kao niz (polje) tipa char. Oznaka kraja stringa, odnosno posljednji znak svakog stringa je nul znak \0. Prema tome, za string od n znakova potrebno je n+1 memorijsko mjesto. U niz dužine n znakova možemo pohraniti string maksimalne dužine od n-1 znaka. Primjer 39. Neka je s="Jezik C++". Prikaz stringa s u memoriji bit će: J e z i k s[0] s[1] s[2] s[3] s[4] s[5] C + + \0 s[6] s[7] s[8] s[9] Pojedinom znaku stringa s moguće je pristupiti i navođenjem njegove pozicije – indeksa u stringu. Tako je npr. s[4]=k. 64 6.1. Deklaracija stringa String (niz znakova) deklariramo isto kao i niz s tim da je obavezno tipa char: char ime [maks_broj_znakova]; ili char ime[] = inicijalan_sadržaj_stringa; Primjer 40. char A[80]; char tekst[]="Jezik C++" NAPOMENA: Niz znakova je tipa char, ime mu dajemo po želji, a u srednjim zagradama navodimo koliko ćemo znakova unijeti s tim da moramo voditi računa da na zadnjem mjestu uvijek dođe nul znak \0 kao oznaka kraja. Računar stavlja nul znak \0, ne vi. Primjer 41. Napišimo program koji će unositi jednu riječ i ispisivati je, te ispisati prvo slovo je riječi. Rješenje. Za unos dan #include <iostream> using namespace std; int main() { char rijec[20]; cin>>rijec; cout<<rijec<<endl; Za unos dan je lijep cout<<rijec[0]<<endl; return 0; } ZAKLJUČAK: Naredbom cin možemo unijeti samo jednu riječ tj. znakove do prvog razmaka. 6.2. Čitanje i ispisivanje znakova Sljedeće funkcije koje ćemo navesti su iz programskog jezika C, no možemo ih koristiti i u C++, obzirom da je njihova upotreba za početnika jednostavnija. Da bismo koristili sljedeće funkcije moramo uključiti biblioteku #include<cstdio> 65 getchar() putchar(c) gets(s) puts(s) Ova funkcija čita jedan znak, uključujući i bijele znakove, sa glavnog ulaza(tastature). Vrijednost funkcije je kod pročitanog znaka ili simbolička konstanta EOF (end of line) ukoliko je pročitan signal za kraj datoteke kao i u slučaju greške tokom čitanja. Rezultat je tipa int. Ova funkcija ispisuje znak c (jedan znak) na glavni izlaz (ekran). Tip argumenta je int. Ova funkcija učitava jedan red teksta (do znaka za prelazak u novi red \n) sa glavnog ulaza (tastature) i smješta ga u s (tipa char[], odnosno char*). Umjesto znaka \n u niz s stavlja prazan znak \0. Ova funkcija ispisuje sadržaj niza s (tipa char[], odnosno char*)do završnog znaka \0 kao red teksta na glavnom izlazu, dodajući znak za prelazak u novi red \n. Ako tekst sadrži više znakova \n, rezultat će biti više ispisanih redova. Vrijednost funkcije je tipa int t, nenegativan broj. Primjer 42. Napišimo program koji će učitati jedan red teksta (jednu rečenicu ili riječ) i ispisati ga na ekran monitora. Kao i u prethodnom primjeru ispisat ćemo prvo slovo. Rješenje. #include <iostream> #include <cstdio> using namespace std; int main() { char rijec[20]; gets(rijec); putchar(rijec[0]); cout<<endl; puts(rijec); return 0; } Za unos dan je lijep 6.3. Ispitivanje znakova Funkcije za ispitivanje znakova određuju u koju kategoriju znakova (slovo, cifra, itd) spada dati znak. Vrijednost svih sljedećih funkcija je tipa logical, a tip argumenta je int (vrijednost treba da je kod nekog znaka). Za logičku istinu daju neku nenultu vrijednost, a ne obavezno vrijednost 1, kao što daju relacijski i logički operatori. Da biste koristili sljedeće funkcije morate napisati u zaglavlju #include<cctype> 66 isalnum(c) Da li je c slovo ili broj (cifra) ? isalpha(c) Da li je c slovo? islower(c) Da li je c malo slovo? isupper(c) Da li je c veliko slovo? isdigit(c) Da li je c cifra? isspace(c) Da li je c bijeli znak? Pretvaranje velikih slova u mala i obratno tolower(c) Ako je c veliko slovo, vijednost funkcije je kod odgovarajućeg malog slova. toupper(c) Ako je c malo slovo, vijednost funkcije je kod odgovarajućeg velikog slova. Obavezno naučiti one koje su označene sivom podlogom. Sada ćemo navesti primjer za svaku funkciju kako se upotrebljava. Primjer 43. Napisaćemo program koji broji koliko je brojeva u rečenici.. Rješenje. #include <iostream> #include <cstring> using namespace std; int main() { char rijec[]="Dan 15, mjesec 6, godina 2014"; int i=0; while(isalnum(rijec[i])) i++; cout<<"Brojeva ima ukupno "<<i<<endl; return 0; } 67 Primjer 44. Napisaćemo program koji ispitiva da li je neki znak slovo ili nije. Rješenje. #include <iostream> #include <cstring> using namespace std; int main() { char rijec[]="C++"; int i=0; while(rijec[i]) { if(isalpha(rijec[i])) cout<<"Znak "<<rijec[i]<<" je slovo"<<endl; else cout<<"Znak "<<rijec[i]<<" nije slovo"<<endl; i++; } return 0; } ZAKLJUČAK: U programu dio while(rijec[i]) će se završiti kada rijec[i] postane netačno, a to će se desiti poslije drugog znaka +, jer smo rekli da je zadnji znak nul znak \0 (NULL) u svakom nizu, a što znači netačno. Primjer 45. Napisaćemo program koji ispitiva koliko u nizu znakova ima malih, a koliko velikih slova. Rješenje. #include <iostream> #include <cstdio> #include <cstring> using namespace std; int main() { char rijec[]="KaMeNicA"; int i=0, m=0, v=0; while(rijec[i]) { if(islower(rijec[i])) m++; if(isupper(rijec[i])) v++; i++; } cout<<"Malih slova je "<<m<<endl; cout<<"Velikih slova je "<<v<<endl; return 0; } 68 Primjer 46. Napisaćemo program koji ispitiva koliko u nizu znakova ima cifara. Rješenje. #include <iostream> #include <cstring> using namespace std; int main() { char rijec[]="2014 godina"; int i=0, c=0; while(rijec[i]) { if(isdigit(rijec[i])) c++; i++; } cout<<"Cifara ima "<<c<<endl; return 0; } Primjer 47. Napisaćemo program koji ispitiva koliko u nizu znakova ima bijelih znakova tj. koliko ima razmaka. Rješenje. #include <iostream> #include <cstring> using namespace std; int main() { char rijec[]="To je to"; int i=0, bz=0; while(rijec[i]) { if(isspace(rijec[i])) bz++; i++; } cout<<"Bijelih znakova ima "<<bz<<endl; return 0; } 69 Primjer 48. Napisaćemo program koji pretvara mala u velika i velika u mala slova. Rješenje. #include <iostream> #include <cctype> #include<cstdio> using namespace std; int main() { char a[]="Grad Bihac"; char b[]="SARAJEVO"; int i=0; while(a[i]!=NULL) { } a[i]=toupper(a[i]); i++; i=0; while(b[i]!=NULL) { } b[i]=tolower(b[i]); i++; puts(a); puts(b); return 0; } NAPOMENA: Funkcije toupper i tolower uzimaju samo po jedan znak, zbog toga moramo koristiti neku od petlji, te to slovo kojeg one vrate mora biti nekom pridruženo (spremeljeno). 6.4. Rad sa stringom (nizom znakova) U prethodnom dijelu smo upoznali funkcije koje uzimaju samo jedan znak (karakter), a sada ćemo upoznati funkcije - naredbe koje uzimaju string tj. niz znakova. U jeziku C/C++ ne postoji nijedan operator za obradu stringa. Zato, za sve uobičajene operacije postoji odgovarajuća bibliotečka funkcija. Da bi koristili sljedeće funkcije morate uključiti biblioteku #include<cstring> Kod svih sljedećih funkcija argumenti t, u, i s su tipa string, argument n tipa int, a argument c tipa int (treba da sadrži kod nekog znaka). Nijedna od ovih funkcija ne mijenja sadržaj argumenta s i u, a sve mijenjaju sadržaj argumenta t. Ovdje je navedeno dosta funkcija, obavezno naučiti one koje su označene sivom podlogom. 70 strcpy(t,s) Ova funkcija kopira string s u string t, kopirajući i sve znakove uključujući i \0. strncpy(t,s,n) Ova funkcija kopira najviše n znakova iz stringa s u string t. Ako string s nema znakova, rezultat se dopunjuje znakovima \0 do dužine n. strcat(t,s) Ova funkcija dopisuje string s na kraj stringa t. strchar(u,c) Traži prvu pojavu znaka u stringu strrev(s) Okreće string (ovi strlen(s) Vrijednost funkcije je broj znakova (tipa int) u znakovnom nizu s. Završni znak \0 se ne ubraja. Broji koliko riječ ili tekst ima slova tj. znakova. strupr(s) Sva mala slova engleske abacede, pretvara u velika, a ostale znakve ne mijenja strlwr(s) Sva velika slova engleske abacede, pretvara u mala, a ostale znakve ne mijenja ivo) Primjer 49. Napisati program koji unosi niz znakova (string) i ispisuje ga u obrnutom redosljedu. Rješenje. #include <iostream> #include<cstdio> #include<cstring> using namespace std; int main() { char a[256]; gets(a); puts(strrev(a)); return 0; } 71 Primjer 50. Napisati program koji unosi niz znakova (string) i ispisuje kolika je dužina niza tj. koliko je unijeto znakova i razmaka zajedno. Rješenje. #include <iostream> #include<cstdio> #include<cstring> using namespace std; int main() { char a[256]; int b; gets(a); b=strlen(a); cout<<b<<endl; return 0; } NAPOMENA: Kada koristimo funkciju strlen, onda moramo vrijednost koju ona vrati (a to je broj), pridružiti (spremiti) nekoj varijabli tipa int. Ne možemo je koristiti, kao što je u prethodnom primjeru upotrebljena funkcija strrev. Primjer 51. Napisaćemo program koji pretvara mala u velika i velika u mala slova. Rješenje. Ovaj primjer smo već imali, ali tad smo morali pretvarati znak po znak. Sada je to mnogo lakše i jednostavnije. #include <iostream> #include<cstdio> #include<cstring> using namespace std; int main() { char a[]="Grad Bihac"; char b[]="SARAJEVO"; puts(strupr(a)); puts(strlwr(b)); return 0; } Primjer 52. Napisati program koji će učitati niz znakova (riječ ili rečenicu) maksimalne dužine 256 znakova, te ispisati koliko se puta u rečenici pojavljuje samoglasnik a (brojati i velika i mala slova). Ako u datom nizu nema samoglasnika a, onda ispisati poruku "Nema samoglasnika A". Rješenje. Postavljeni zadatak ćemo riješiti na dva načina. U prvom načinu ćemo koristiti while petlju, obzirom da ne znamo koliko će znakova korisnik unijeti, ali znamo da je sigurno zadnji 72 znak u nizu nul znak \0 (tj. NULL). Pošto moramo za svaki znak provjeriti da li je jednak a ili A, to će biti i=0, varijablu brsamog ćemo koristiti da brojimo samoglasnik A, i odmah je postavljamo na vrijednost 0, jer se može desiti da nema samoglasnika A. Kad se petlja završi, ona će izbrojati sva pojavljivanja a ili A, a zatim izvan petlje provjeravamo da li je varijabla brsamog promijenila svoju vrijednost. Ako nije, tj. ako je ostala nula, onda nema samoglasnika A, a ako je neka druga vrijednost tj. broj, onda ih ima. #include <iostream> #include<cstdio> using namespace std; int main() { char slova[256]; int i=0, brsamog=0; gets(slova); while(slova[i]!=NULL){ } if(slova[i]=='a' || slova[i]=='A') brsamog++; i++; if(brsamog==0) cout<<"Nema samoglasnika A"<<endl; else cout<<"Samoglasnika A ima "<<brsamog<<endl; return 0; } U drugom načinu ćemo umjesto while petlje koristiti for petlju. Kod for petlje broj ponavljanja je unaprijed poznat, zbog toga uvodimo varijablu n, i pomoću funkcije strlen u nju spremamo (pridruživamo) broj učitanih znakova (ako ima razmaka i oni se broje). Ostalo ostaje isto. Da li smo umjesto uslova i<n u for petlji, mogli staviti isti uslov kao u while petlji? Da, mogli smo. 73 #include <iostream> #include<cstdio> #include<cstring> using namespace std; int main() { char slova[256]; int i, n, brsamog=0; gets(slova); n=strlen(slova); for(i=0;i<n;i++) if(slova[i]=='a' || slova[i]=='A') brsamog++; if(brsamog==0) cout<<"Nema samoglasnika A"<<endl; else cout<<"Samoglasnika A ima "<<brsamog<<endl; return 0; } Primjer 53. Napisati program koji će učitati riječ. Ako je učitana riječ palindrom, ispisaće poruka "DA", ako nije poruku "NE". Palindrom je igra riječi u kojoj se čitanjem jedne riječi ili čitave rečenice obrnutim redom dobiva isto značenje kao i pravilnim čitanjem, npr. oko, Ana, kuk. Rješenje. Da bismo riješili ovaj zadatak moramo definisati dva znakovna niza. Jedan koji će se zvati slova i drugi kopijaslova. Nakon što učitamo riječ u niz slova, koristimo funkciju strlwr da bi sve znakove tj. slova u nizu pretvorili u mala slova, jer se može desiti da korisnik unese npr. ime Ana. Zatim koristimo funkciju strcpy i kopiramo sve iz niza slova u niz kopijaslova. Potom, okrećemo niz kopijaslova tj. slova u njemu, u obrnutom redosljedu (npr. ivo postaje ovi) naredbom strrev. Sada pomoću while petlje (može i for petljom, prethodni primjer) ispitivamo da li se prvo slovo u nizu slova podudara s prvim slovom u nizu kopijaslova, pa drugo, i tako redom. Ako se neka slova ne podudaraju, tada varijabla k promijeni svoju vrijednost s broja 0, a što će značiti da unešena riječ nije palindrom. Ako pak varijabla k ne promijeni svoju vrijednost tj. ostane broj 0, tada će to značiti da je učitana riječ palindrom. 74 #include <iostream> #include<cstdio> #include<cstring> using namespace std; int main() { char slova[256]; char kopijaslova[256]; int i=0, k=0; gets(slova); strlwr(slova); strcpy(kopijaslova,slova); strrev(kopijaslova); while(slova[i]!=NULL){ if(slova[i]!=kopijaslova[i]) k++; i++; } if(k==0) cout<<"DA"<<endl; else cout<<"NE"<<endl; return 0; } 6.5. Zadaci za samostalan rad Zadatak 65. Napisati program koji će zadani string „ZDRAVO SVIJETE“ ispisati malim slovima. Zadatak 66. Napisati program koji će učitati string (maksimalno 256 znakova), te ispisati dužinu stringa (koliko ste znakova unijeli). Zadatak 67. Napisati program koji će prebrojiti koliko se u učitanom stringu pojavilo suglasnika R i S. (Brojati mala i velika slova) Zadatak 68. Napisati program koji će prebrojiti koliko riječi ima učitani string. Zadatak 69. Napisati program koji će učitanu rečenicu ispisati je s desna na lijevo. Zadatak 70. Napisati program koji će prebrojati broj velikih slova u učitanom stringu. Zadatak 71. Napisati program koji će učitiati niz znakova /STRING/ i znak. Ispisati koliko puta se upisani znak pojavljuje u upisanom stringu. 75 7. ZADACI SA OPĆINSKIH TAKMIČENJA 7.1. Zadaci 2010 OPĆINSKO TAKMIČENJE IZ INFORMATIKE ZA UČENIKE OSNOVNIH ŠKOLA 29.04.2010. 1. zadatak DIJELI Za prirodan broj takav da je kažemo da je djeljiv s prirodnim brojem ako postoji prirodan broj · . Treba napisati program koji će za dva prirodna broja učitana s tastature ispitati da li je prvi djeljiv s drugim. Ukoliko jeste, treba na ekranu ispisati njihov količnik, a ukoliko nije treba ispisati poruku da nije. Program snimiti pod imenom DIJELI. Ulazni podaci S tastature u prvom redu učitavamo prvi prirodan broj, a u drugom drugi prirodan broj. Izlazni podaci Na ekranu se u slučaju da je prvi broj djeljiv s drugim ispisuje njihov količnik, a u slučaju da nije djeljiv, ispisuje se poruka kao u navedenom primjeru. Primjeri Tastatura (ulaz) Tastatura (ulaz) Tastatura (ulaz) 100 5 4 8 18 5 Ekran (izlaz) Ekran (izlaz) Ekran (izlaz) 20 4 nije djeljivo s 8 18 nije djeljivo s 5 76 2. zadatak SLOVA Treba napisati program koji će učitati riječ s tastature i ispisati tu riječ bez samoglasnika.. Program snimiti pod imenom SLOVA. Ulazni podaci S tastature u jednom redu učitavamo riječ napisanu velikim slovima. Izlazni podaci Na ekranu se velikim slovima ispisuje učitana riječ ali bez samoglasnika. Ukoliko je učitana riječ bila sastavljena samo od samoglasnika, na ekranu treba ispisati riječ BOSNA. Primjeri Tastatura (ulaz) Tastatura (ulaz) Tastatura (ulaz) INFORMATIKA BRK EEOA Ekran (izlaz) Ekran (izlaz) Ekran (izlaz) NFRMTK BRK BOSNA 77 3. zadatak TROUGAO Treba napisati program koji će za tri prirodna broja učitana s tastature ispitati da li oni predstavljaju stranice jednakokrakog trougla. Program snimiti pod imenom TROUGAO. Ulazni podaci S tastature u tri reda učitavamo tri prirodna broja. Izlazni podaci Na ekranu se ispisuje poruka da li je učitani trougao jednakokraki ili nije, ili uopće nije trougao. Primjeri Tastatura (ulaz) Tastatura (ulaz) Tastatura (ulaz) Tastatura (ulaz) Tastatura (ulaz) 7 5 5 4 4 4 9 8 9 4 3 5 5 7 20 Ekran (izlaz) Ekran (izlaz) Ekran (izlaz) Ekran (izlaz) Ekran (izlaz) Jeste jednakokraki Nije jednakokraki Jeste jednakokraki Nije jednakokraki Nije trougao 78 7.2. Zadaci 2011 OPĆINSKO TAKMIČENJE IZ INFORMATIKE ZA UČENIKE OSNOVNIH ŠKOLA April 2011. 1. zadatak RECENICA Treba napisati program koji će za rečenicu učitanu uz pomoć tastature na ekranu ispisati da li je izjavna, upitna ili uzvična. Program snimiti pod imenom RECENICA. Ulazni podaci Sa tastature u jednom redu učitavamo rečenicu sa odgovarajućim znakom interpunkcije na kraju (. Ili ? ili !). Izlazni podaci Na ekranu se ispisuje jedna od tri moguće poruke: "Recenica je izjavna." ili "Recenica je upitna." ili "Recenica je uzvicna." Primjeri Tastatura (ulaz) Tastatura (ulaz) Tastatura (ulaz) Kako si? Danas je utorak. Pazi, auto! Ekran (izlaz) Ekran (izlaz) Ekran (izlaz) Recenica je upitna. Recenica je izjavna. Recenica je uzvicna. 79 2. zadatak BROJEVI Treba napisati program koji će učitati dva broja s tastature, pa na ekranu prikazati veći. Ako se unesu dva ista broja, na ekranu se treba pojaviti poruka "Brojevi su jednaki." Program snimiti pod imenom BROJEVI. Ulazni podaci Sa tastature u prvom redu učitavamo prvi broj, a u drugom redu drugi broj. Izlazni podaci Na ekranu se ispisuje veći broj. U slučaju da su jednaki, na ekranu se ispisuje poruka "Brojevi su jednaki." Primjeri Tastatura (ulaz) Tastatura (ulaz) Tastatura (ulaz) 1 5 8 3 7 7 Ekran (izlaz) Ekran (izlaz) Ekran (izlaz) Broj 5 je veci. Broj 8 je veci. Brojevi su jednaki. 80 3. zadatak KVADRAT Treba napisati program koji će s tastature učitati stranicu kvadrata (u centrimetrima), izračunati njegovo obim i površinu, te rezultate prikazati na ekranu. Program snimiti pod imenom KVADRAT. Ulazni podaci Sa tastature u jednom redu učitavamo broj koji predstavlja stranicu kvadrata. Izlazni podaci Na ekranu se ispisuje obim i površina kvadrata. Primjeri Tastatura (ulaz) Tastatura (ulaz) Tastatura (ulaz) 5 2 7 Ekran (izlaz) Ekran (izlaz) Ekran (izlaz) Obim je 20. Površina je 25. Obim je 8. Površina je 4. Obim je 28. Površina je 49. 81 7.3. Zadaci 2012 OPĆINSKO TAKMIČENJE IZ INFORMATIKE ZA UČENIKE OSNOVNIH ŠKOLA 27.03. 2012. 1. zadatak KOCKA Vrši se popločavanje puta određene dužine (D) i širine (S) sa dvije vrste betonskih kocki. Dužine ivica kocki su: jedne vrste kocki K1, a druge vrste kocki K2. Napisati program koji će ispisati broj kocki potrebnih za popločavanje puta, uz poštovanje određenih pravila. Naime, kod popločavanja puta kockama ne smije biti praznina niti viška kocki, a kocke se uklapaju na način da se koriste one kojih ide manje. Ukoliko se niti jednom vrstom kocki ne može popločati put, program treba da ispiše poruku "NE MOŽE". Vrijednosti D, S, K1 i K2 su pozitivne vrijednosti veće od nule. Program snimiti pod imenom KOCKA. Ulazni podaci Sa tastature se unose ulazni podaci D, S, K1 i K2, gdje su D i S dužina i širina puta, a K1 ivica jedne vrste kocki, a K2 ivica druge vrste kocki. Izlazni podaci Na ekranu se ispisuje broj kocki koliko je potrebno za popločavanje ili poruka "NE MOŽE" u slučaju da kocki ima viška ili manjka. Primjeri Tastatura (ulaz) Tastatura (ulaz) Tastatura (ulaz) 12 54 2 3 75 150 30 15 12 55 5 4 Ekran (izlaz) Ekran (izlaz) Ekran (izlaz) 72 50 NE MOŽE 82 2. zadatak PRESTUPNA GODINA Prestupne godine su sve djeljive sa 4, ako nisu djeljive sa 100, kojima se dodaju one koje su djeljive sa 400. Napišite program koji na osnovu unešene godine računa da li je godina prestupna. Ako jeste program će napisati "GODINA xxxx JE PRESTUPNA" a ako nije ispisaće "GODINA xxxx NIJE PRESTUPNA". xxxx označava godinu koja je unešena na ulazu. Program snimiti pod imenom PRESTUPNA_GODINA. Ulazni podaci Sa tastature se unosi određena godina – npr. 2012 i program provjerava da li je godina prestupna. Izlazni podaci Na ekranu se u slučaju da je godina prestupna ispisuje tekst "GODINA xxxx JE PRESTUPNA" a ako nije ispisaće se "GODINA xxxx NIJE PRESTUPNA", gdje xxxx varijabla gdine koju smo unijeli za prvovjeru-kao u navedenom primjeru. Primjeri Tastatura (ulaz) Tastatura (ulaz) Tastatura (ulaz) 2012 2000 1970 Ekran (izlaz) GODINA 2012 JE PRESTUPNA Ekran (izlaz) GODINA 2000 JE PRESTUPNA Ekran (izlaz) GODINA 1970 NIJE PRESTUPNA 83 3. zadatak KVADRATNI KORIJEN Napisati program koji na osnovu unešenog broja X računa kvadratni korijen brojeva X, X+1, X+2 i X+3 i ispisuje ih na ekran. Broj X je pozitivan broj. Program snimiti pod imenom KVADRATNI_KORIJEN. Ulazni podaci Sa tastature učitavamo prirodan broj X. Izlazni podaci Na ekranu se ispisuje broj X i njegov kvadratni korijen, zatim u novom redu X+1 i njegov kvadratni korijen, ispod njega X+2 i njegov kvadratni korijen i na kraju u novom redu X+3 i njegov kvadratni korijen – kao u navedenom primjeru. Primjeri Tastatura (ulaz) Tastatura (ulaz) Tastatura (ulaz) 5 9 25 Ekran (izlaz) Ekran (izlaz) Ekran (izlaz) BROJ 5 KVADRATNI KORIJEN 2.23 BROJ 6 KVADRATNI KORIJEN 2.44 BROJ 7 KVADRATNI KORIJEN 2.64 BROJ 8 KVADRATNI KORIJEN 2.82 BROJ 9 KVADRATNI KORIJEN 3 BROJ 10 KVADRATNI KORIJEN 3.16 BROJ 11 KVADRATNI KORIJEN 3.31 BROJ 12 KVADRATNI KORIJEN 3.46 BROJ 25 KVADRATNI KORIJEN 5 BROJ 6 KVADRATNI KORIJEN 5.09 BROJ 7 KVADRATNI KORIJEN 5.19 BROJ 8 KVADRATNI KORIJEN 5.29 84 7.4. Zadaci 2013 OPĆINSKO TAKMIČENJE IZ INFORMATIKE ZA UČENIKE OSNOVNIH ŠKOLA 19.03.2013. 1. zadatak BINARNI Tradicionalni brojni sistem, koji se izučava u školi i koji se koristi u svakodnevnom životu se naziva dekadni brojni sistem. To je sistem čija je baza broj 10, a svaki broj u tom sistemu se zapisuje pomoću 10 cifara: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9. Ako imamo broj 25047 u dekadnom brojnom sistemu, to znači da je 25047 = 2·104 + 5·103 + 0·102 + 4·10 + 7 Slično dekadnom brojnom sistemu, postoje i drugi brojni sistemi, od kojih je najpoznatiji binarni brojni sistem. To je brojni sistem kojem je baza broj 2 a ukojem se brojevi zapisuju pomoću cifara 0 i 1. Treba napisati program koji s tastature učitava dva prirodna broja B i N, za koje vrijedi 2 9, 100000, te na ekran ispsuje broj N zapisan u brojnom sistemu s bazom B. Program snimiti pod imenom BINARNI. Ulazni podaci Sa tastature se unose prirodni brojevi B i N Izlazni podaci Na ekranu se ispisuje broj N zapisan u brojnom sistemu s bazom B. Primjeri Tastatura (ulaz) Tastatura (ulaz) Tastatura (ulaz) 2 21 5 59 8 571 Ekran (izlaz) Ekran (izlaz) Ekran (izlaz) 10101 214 1073 85 2. zadatak TROUGAO Tri prirodna broja predstavljaju dužine stranica trougla ako je zbir bilo koja dva veći od trećeg. Treba napisati program koji će s tastature učitati 3 prirodna broja A, B i C i na ekranu (na način kako je prikazano u primjerima) ispisati poruke o tome da li su učitani brojevi predstavljaju stranice jednakokragog, jednakostraničnog ili pravouglog trougla. Ako tri učitana broja ne predstavljaju dužine stranica trougla treba ispisati odgovarajuću poruku (kao u primjeru). Program snimiti pod imenom TROUGAO. Ulazni podaci Sa tastature se unose prirodni brojevi A, B i C. Izlazni podaci Na ekranu se, u slučaju da učitani brojevi ne predstavljaju dužine stranica trougla. Ispisuje poruka "NIJE TORUGAO", dok se u slučaju da učitani brojevi predstavljaju stranice trougla ispisuje jedna od sljedeće četiri poruke: "JEDNAKOKARKI TROUGAO" (ako je riječ o jednakokrakom trouglu), "JEDNAKOSTRANICNI" (ako je riječ o jednakostraničnom trouglu), "PRAVOUGLI" (ako je riječ o pravouglom trouglu) i "TROUGAO" ako nije među nabrojanim slučajevima. Poruke se ispisuju na način kako je prikazano u primjerima. Primjeri Tastatura (ulaz) Tastatura (ulaz) Tastatura (ulaz) 3 3 8 3 5 4 7 2 6 Ekran (izlaz) Ekran (izlaz) Ekran (izlaz) NIJE TROUGAO PRAVOUGLI TROUGAO 86 3. zadatak SAMOGLASNIK S tastature se učitava jedna riječ (niz velikih i malih slova). Na ekranu treba ispisati broj samoglasnika u učitanoj riječi i riječ u kojoj su u učitanoj riječi umjesto samoglasnika koji su napisani malim slovom ispisana slova X, a umjesto samoglasnika koji su napisani velikim slovom ispisana slova x. Program snimiti pod imenom SAMOGLASNIK. Ulazni podaci Sa tastature se unosi riječ (niz znakova koji ne mora predstavljati riječ koja ima smisla). Izlazni podaci Na ekranu se u prvi red ispisuje broj samoglasnika u učitanoj riječi, a u drugom redu učitana riječ promijenjena na opisan način. Primjeri Tastatura (ulaz) Tastatura (ulaz) Tastatura (ulaz) BoSAnsKa edFGUeakXWAa QtZxRVy Ekran (izlaz) Ekran (izlaz) Ekran (izlaz) 3 BXSxnskX 6 XdFGxXXKXWxX 0 QtZxRVy 87 8. ZADACI SA KANTONALNIH TAKMIČENJA 8.1. Zadaci 2011 KANTONALNO TAKMIČENJE IZ INFORMATIKE ZA UČENIKE OSNOVNIH ŠKOLA 10.04. 2011. 1. zadatak SUMACIF Emir je naučio programirati. Prvi "ozbiljniji" program koji je napisao izračunava sumu cifara prirodnog dvocifrenog broja koji se unosi putem tastature. Međutim, ukoliko broj koji se unosi nije dvocifren nastaju problemo. Pomozi Emiru i napiši program koji će izračunati i prikazati sumu cifara ako se unese dvocifren broj. Inače će se na ekranu prikazati poruka da broj nije dvocifren. Program snimiti pod imenom SUMACIF. Ulazni podaci Sa tastature učitavamo jedan prirodan broj. Izlazni podaci Na ekranu se ispisuje suma njegovih cifara (ako je dvocifren) ili poruka (ako nije dvocifren). Primjeri Tastatura (ulaz) Tastatura (ulaz) Tastatura (ulaz) 41 6 142 Ekran (izlaz) Ekran (izlaz) Ekran (izlaz) 5 Broj nije dvocifren! Broj nije dvocifren! 88 2. zadatak SLOVAR Emirova sestra teško izgovara slovo r. On joj je, stoga, odlučio napisati rečenice u kojima se ovo slovo što više pojavljuje. Pomozi Emiru da napiše program koji će mu izbrojati koliko puta se slovo r (nalo ili veliko) pojavilo u rečenici koju unese putem tastature. One rečenice sa kojima bude zadovoljan Emir će prepisati na papir i zamoliti malu sestru da ih naglas pročita više puta kako bi izvježbala izgovor Program snimiti pod imenom SLOVAR. Ulazni podaci Sa tastature učitati rečenicu. Izlazni podaci Na ekranu se ispisuje poruka o broju pojavljivanja slova r (malo ili veliko) u učitanoj rečenici. Primjeri Tastatura (ulaz) Tastatura (ulaz) Riba ribi grize rep Irma i Romi idu u prvi razred. Vracaju se rode. Ekran (izlaz) Ekran (izlaz) Broj pojavljivanja: Broj pojavljivanja: 4 5 89 Tastatura (ulaz) Ekran (izlaz) Broj pojavljivanja: 2 3. zadatak SLIKE Emir bi trebao slike sa svih ekskurzija sa svoga računara spržiti na CD-ove kako bi ih podijelio prijateljima iz razreda. Emir ima N slika i one su veličine K megabajta. Svaki CD ima tačno 700MB prostora. Pomozi Emiru izračunati koliko najmanje CD-ova mora kupiti svaki od njegovi prijatelja kako bi na njih mogao snimiti željene slike. Niti jedna slike se ne smije dijelom snimiti na jedan CD, a dijelom na drugi! Program snimiti pod imenom SLIKE. Ulazni podaci Sa tastature u dva reda učitavamo dva prirodna broja, i to: - prirodan broj N (1 1000), broj slika koje Emir želi snimiti na CD-ove, - prirodan broj K (1 10), veličina slike u MB. Izlazni podaci Na ekranu se ispisuje prirodan broj X koji predstavlja najmanji broj CD-ova potreban Emiru da snimi sve slike. Primjeri Tastatura (ulaz) Tastatura (ulaz) Tastatura (ulaz) 400 5 100 4 101 7 Ekran (izlaz) Ekran (izlaz) Ekran (izlaz) 3 1 2 Objašnjenje Damiru treba prebaciti 400 slika veličine 5MB. Za to mu trebaju 3 CD-a, jer na 3 CD-a stane 700*3=2100MB. Objašnjenje Almi treba prebaciti 100 slika veličine 4MB. Za to u treba 1 CD, jer na 1 CD stane 700*1=700MB. Objašnjenje Ivanu treba prebaciti 101 sliku veličine 7MB. Za to mu trebaju 2 CD-a, jer na 2 CD-a stane 700*2=1400MB. 90 8.2. Zadaci 2011 KANTONALNO TAKMIČENJE IZ INFORMATIKE ZA UČENIKE OSNOVNIH ŠKOLA 10.05.2012. 1. zadatak TECAJ Enesova obitelj vrši pripreme za odlazak na more. Enes je dobio određenu svotu novaca od majke u KM-a (konvertibilbe marke). Enes planira sakupiti još novca u KM nakon završetka školske godine (dobijanja knjižica), a nada se de će dobiti nešto od tetke iz Njemačke gdje se koriste Euri (Eur). Na omoru (Hrvatska) se troše isključivo Kune (Kn). Pomozimo Enesu da napiše program koji pretvara valutu iz KM-a i Eur-a u Kune kako bi se Enes lakše snašao na moru. Program snimiti pod imenom TECAJ. Ulazni podaci Sa tastature se unosi vrijednost tečaja Kune (Kn) za Eur, tečaja Kune (Kn) za KM. Zatim se unosi iznos ušteđenih i dobivenih KM i Eura posebno a koje će Enes razmjenjivati za Kune. Za 1 KM Enes može dobiti 3,75 Kn, a za 1 Eur se može dobiti 7,5 Kn. Izlazni podaci Na ekranu se ispisuje sljedeća poruka: "Za iznos od ___KM i ___Eur Enes može dobiti ____Kuna." Primjeri Tastatura (ulaz) Tastatura (ulaz) Tastatura (ulaz) 7.5 3.75 100 100 7.5 3.75 75 50 7.5 3.75 150 35 Ekran (izlaz) Ekran (izlaz) Ekran (izlaz) Za iznos od 100 KM Za iznos od 75 KM i Za iznos od 150 KM i 100 Eur, Enes može 50 Eur, Enes može i 35 Eur, Enes može dobiti 1125.00 Kn dobiti 656.25 Kn dobiti 825.00 Kn 91 2. zadatak DJELJIVOST Potrebno je napisati programski kod za rješenje sljedećeg problema: Sa tastature se unosi broj, za koji program provjerava da li je djeljiv sa tri. Ukoliko jeste djeljiv sa 3 program ispisuje poruku: "Ostatak djeljenja broja ___ sa 3 je 0", a ukoliko nije program računa prvi manji broj od unešenog broja a koji je djeljiv sa 3 i ispisuje poruku: "Prvi manji broj od unesenog broja, a djeljiv sa 3 je ____". Program snimiti pod imenom DJELJIVOST. Ulazni podaci Sa tastature se unosi određeni broj a program vrši provjeru uvjeta. Izlazni podaci Ukoliko je unešeni broj djeljiv sa 3 program ispisuje poruku: "Ostatak djeljenja broja ___ sa 3 je 0", a ukoliko nije program traži prvi manji broj od unesenog a koji je djeljiv sa 3 i ispisuje poruku: "Prvi manji broj od unesenog broja, a koji je djeljiv sa 3 je __ ". Primjeri Tastatura (ulaz) Tastatura (ulaz) Tastatura (ulaz) 33 256 4356 Ekran (izlaz) Ekran (izlaz) Ekran (izlaz) Ostatak djeljenja broja 33 sa 3 je 0. Prvi manji broj od unesenog broja, a koji je djeljiv sa 3 je 255. Ostatak djeljenja broja 4356 sa 3 je 0. 92 3. zadatak SAMOGLASNICI Napisati program koji broji (prebrojava) samoglasnike u unesenoj rečenici i ispisuje njihov zbir na ekran. Program snimiti pod imenom SAMOGLASNICI. Ulazni podaci Sa tastature učitavamo rečenicu određene dužine (broja riječi). Izlazni podaci Na ekranu se ispisuje poruka: "Samoglasnici se u rečenici pojavljuju ___ puta" kao u navedenom primjeru. Primjeri Tastatura (ulaz) Tastatura (ulaz) Tastatura (ulaz) Danas je cijeli dan padala Ovaj zadatak je veoma Veceras je premijera mog jaka kisa. jednostavan i nadam se da omiljenog filma u kinu ću ga uspjesno rijesiti. Una. Ekran (izlaz) Ekran (izlaz) Ekran (izlaz) BROJ 5 KVADRATNI BROJ 9 KVADRATNI BROJ 25 KVADRATNI Samoglasnici se u rečenici Samoglasnici se u rečenici Samoglasnici se u rečenici pojavljuju 14 puta! pojavljuju 26 puta! pojavljuju 19 puta! 93 8.3. Zadaci 2013 KANTONALNO TAKMIČENJE IZ INFORMATIKE ZA UČENIKE OSNOVNIH ŠKOLA 30.04.2013. 1. zadatak COKOLADA Hana je vježbala matematiku i naišla je na jedan slatki zadatak. Potrebno je tablu čokolade oblika pravougaonika podijeliti na manje dijelove koji će biti oblika kvadrata, ali pod uvjetom da je taj broj kvadrata najmanji moguć. Program snimiti pod imenom COKOLADA. Ulazni podaci Sa tastature u prva dva reda učitavamo dva prirodna broja M i N (1 M, N 1000), gdje je M broj redaka a N broj stupaca čokolade. Izlazni podaci Na ekranu treba ispisati najmanji broj kvadrata na koji se čokolada može podijeliti. Primjeri Tastatura (ulaz) Tastatura (ulaz) 3 4 5 5 Ekran (izlaz) Ekran (izlaz) 4 1 Objašnjenje za prvi primjer Na slici su dane dvije moguće podjele čokolade od 3 reda i 4 stupca, s tim što je na drugoj slici prikazana podjela s najmanjim brojem kvadrata. 94 2. zadatak KAPICA Tri Amina, Lejla i Emira su u autobusu, da bi sebi putovanje učinile interesantnijim, igrale igre pogađanja boje kape na njihovim glavama. Svaka od njih na glavi ima kapu crne ili bijele boje, ali ne zna koje je boje. Međutim, svaka od njih vidi kakve je boje kapa na glavi drugih dviju. Svaka od njih treba da kaže koliko crnih kapa vidi, te da na osnovu dobijenih informacija pogodi koje je boje kapa na njenoj glavi. Treba napisati program koji s tastature učitava koliko crnih kapa vide Amina, Lejla i Emira, a zatim ispisuje koje su boje kape na njihovim glavama i to tako što za crnu kapu ispisuje C a za bijelu B. Program snimiti pod imenom KAPICA. Ulazni podaci Sa tastature u prva tri reda učitavamo tri nenegativna broja. U prvom redu je broj crnih kapa koje vidi Amina, u drugom broj crnih kapa koje vidi Lejla a u trećem redu broj crnih kapa koje vidi Emira. Izlazni podaci Na ekranu treba ispisati u tri reda boju (C ili B) kape koju one imaju na glavi i to u prvom redu Aminine, u druugom boju Lejline a u trećem redu boju Emirine kape. Primjeri Tastatura (ulaz) Tastatura (ulaz) 2 1 1 0 0 0 Ekran (izlaz) Ekran (izlaz) B C C B B B 95 3. zadatak KALADONT Enes i Lejla igraju igru koja se zove "kaladont". Lejla je bolji igrač, pa je Enes odlučio samostalno vježbati uz pomoć računara. Igra se sastoji od više partija. Svaka partija počinje tako što Enes izgovori proizvoljnu riječ. Za svaku sljedeću riječ koju on izgovori mora da vrijedi da je njenih K početnih slova jednako kao posljednjih K slova prethodno izgovorene riječi. Ako Enes ne može da smisli riječ koja počinje na odgovarajući način, partija se završava. Broj izgovorenih riječi tokom jedne partije predstavlja dužinu partije. Potrebno je za N datih riječi izgovorenih u toku igre odrediti dužinu najduže partije. Program snimiti pod imenom KALADONT. Ulazni podaci Sa tastature se unose dva prirodna broja K i N (1 N 1000, 1 K 20) koji predstavljaju riječi i broj slova koja mora da se poklapaju i lista od N izgovorenih riječi. Izlazni podaci Na ekranu se ispisuje broj koji predstavlja dužinu najduže partije u igri. Primjeri Tastatura (ulaz) Objašnjenje: 9 2 jabuka kaldont drvo vozilo logor orkan maca carica car Učitava se 9 riječi a zahtijevano je podudaranje u 2 posljednja slova prethodne riječi i 2 početna slova novoizgovorene riječi. U ovoj igri su bile 3 partije: jabuka – kaladont (dužina 2) drvo – vozilo – logor – orkan (dužina 4) maca – carica – car (dužina 3) Vidimo da je druga partija najduža i da je njena dužina 4 Ekran (izlaz) 4 96 9. TEORETSKI ZADACI SA OPĆINSKIH TAKMIČENJA 9.1. Zadaci 2010 OPĆINSKO TAKMIČENJE IZ INFORMATIKE ZA UČENIKE OSNOVNIH ŠKOLA 29.04.2010. Teorija 1. Računar može raditi 24 sata bez prekida. DA NE 2. Spoji par: Briše znak desno od kursora Tipka BACKSPACE Briše znak lijevo od kursora Tipka DELETE 3. Jedan bajt ima _________ bita, a jedan kilobajt ima _________________ bajta. 4. Zaokruži pet programskih jezika: 1. C 3. NEWTON 5. SQL 7. COBOL 2. PASCAL 4. FORTRAN 6. MS DOS 8. WINDOWS 5. Razvrstaj na ulazne i izlazne jedinice: tastatura, miš, štampač, džojstik, skener. Ulazne:___________________________________________________________ Izlazne: ___________________________________________________________ 6. Povezati kojoj naredbi programskog jezika BASIC odgovara koji opis djelovanja: INPUT završetak programa REM naredba izlaza PRINT naredba grananja END naredba ulaza IF THEN komentar 7. Niz koraka koji jasno i određeno vode ka rješenju nekog problema (ukoliko rješenje postoji), odnosno daju odgovor da problem nema rješenja (ako rješenje ne postoji, ne može se dobiti odgovarajućom tačnošću ili u predviđenom vremenu) naziva se _______________________. 8. S koje strane znaka @ se u nekoj e-mail adresi nalazi e-mail provider? A: lijeve B: desne C: obe D: ništa od navedenog 9. Koju biste ikonu koristili da kopirate format jedne riječi na drugu? A: B: C: 10. Pritisak na koju ikonu poništava izvršenu komandu? 97 D: A: B: C: D: C: Vertical D: Landscape 11. Vodoravna orijentacija papira je: A: Portrait B: Laid 12. Formule u Excelu počinju znakom: A: = B: % C: # 13. Koji od odgovora radi u Excelu isto što i A: =A1+B2 D: zavisi od formule =SUM(A1:A2)? B: =A1+A2 C: =sin(A1/B2) D: =A1+A2+B1+B2 C: A,B,C,... D: I,II,III,... 14. Kolone u Excelu su označene: A: 1,2,3,.... B: A1,A2,A3,... 15. Binarni zapis broja 753 je __________________________________. 9.2. Zadaci 2011 OPĆINSKO TAKMIČENJE IZ INFORMATIKE ZA UČENIKE OSNOVNIH ŠKOLA 24.04.2011. 1. Softver je materijalni dio računara. (Može se opipati rukom) DA NE 2. Tipka Shift služi za _______________________________________________________. Tipka CapsLock služi za ___________________________________________________. 3. Jedan megabajt ima ______________ bajta, a jedan gigabajt ima __________megabajta. 4. Zaokruži naredbe koje se koriste u programskom jeziku BASIC: 1. CLS 2. READ 3. INPUT 4. WRITE 5. RENAME 6. IF..THEN 7. CLR 8. FOR 5. Šta je šta? Popuni kvadrate odgovarajućim slovom. (A-ulazna jedinica, B-izlazna jedinica) štampač skener zvučnik web kamera 6. Navedi 4 programska jezika za koje si čuo. _____________ ____________ ____________ __________ 7. Decimalni zapis binarnog broja 10111 jeste _______________. 8. Za ispis na štampaču tekuće stranice našeg dokumenta kji ima 12 stranica koristit ćemo 98 A: naredbu Print iz izbornika B: pritisak na ikonu 9. Pritisak na koju ikonu sprema naš dokument? A: B: C: D: 10. Vertikalna orijentacija papira je: A: Portrait B: Laid C: Vertical D: Landscape 11. MS Excel je sastavni dio: A: MS Windows B: MS Office C: Ne pripada niti jednom 12. Ćelije u Excelu su označene: A: 1,2,3... B: A1,A2,A3,.... C: A,B,C,... D: I,II,III,.... C: u tastaturi D: na monitoru 13. Obrada podataka u računaru vrši se: A: u memoriji B: u procesoru 14. Binarni zapis broja 53 je ____________________________________. 15. Zadnja verzija operativnog sistema Windows jeste: A: Windows Phone 7 B: Windows 7 C: Windows 2007 D: Windows 2011 9.3. Zadaci 2012 OPĆINSKO TAKMIČENJE IZ INFORMATIKE ZA UČENIKE OSNOVNIH ŠKOLA 27.03.2012. Na sljedeća pitanja se odgovara tako da se upiše slovo koje se nalazi ispred tačnog odgovora na za to predviđeno mjesto (crtu): r/b bodovi mogući ostvareni Pitanje: 2 1. Koji rezultat će se prikazati prilikom pokretanja formule u ćeliji C8 (kada pritisnemo tipku ENTER)? Odgovor: _______ 99 Predstavite broj 44 u binarnom obliku: 2 2. Odgovor: _____________ 3. Ako je brzina prenosa podataka preko ADSL linka 4 Mb/ps, za koliko vremena će se teoretski "download-ati" datoteka veličine 500 MB? 2 Odgovor: _____________ Kojem od pobrojanih operativnih sistema nije mejsto u skupini: a) Windows 7 b) Windows XP c) Windows Mobile d) d) Windows 2000 4. 2 Odgovor: _____________ Koji izraz je tačno napisan i predstavlja sljedeću formulu: 0 5. a) b) c) d) 2 b+a-(c+0)/((p*y)/d) b+(a-(c+0)/p*y)/d b+(a-(c+0)/(p*y))/d d) b+(a-c+0/(p*y))/d Odgovor: _____________ Softverska licenca je: 6. a) b) c) d) Pravo na korištenje određenog softvera (programa) CD na kojem dobijamo isporučen sofvter Vrsta softvera d) Oblik distribucije softvera 2 Odgovor: _____________ Umetanje matematičkih izraza u MS Word se vrši pokretanjem slijeda naredbi: 7. a) b) c) d) InsertObjectMicrosoft Equattion 3.0 ViewObjectMicrosoft Equattion 3.0 ObjectMicrosoft Equattion 3.0 Ni na jedan od ponuđenih načina Odgovor: _____________ 100 2 8. Koja vrijednost će biti u ćeliji C1 kao rezultat obrade operacije na slici, pritiskom na tipku ENTER a) 450 b) 45 c) 4500 d) 30 2 Odgovor: _____________ Koji od navedenih nisu ulazno/izlazni uređaji: 9. a) b) c) d) Skener Ekran osjetljiv na dodir (touch.screen) Modem Mikrofon 2 Odgovor: _____________ 10. Korisnik je otvorio dokument u MS Wordu koji se zove "kontrolni", na istom izvršio određene promjene, pritisnuo CTRL+S, zatim CTRL+P a nakon toga ALT+F? Upišite odgovor što se tada dogodilo? 2 Odgovor: _____________ Koja od ponuđenih nije naredba PASCAL-a? 11. a) b) c) d) PRIVATE WRITELN READLN BEGIN 2 Odgovor: _____________ http://www.pzusk.ba/index.php?option=com_content&view=category&id=35 U sljedećem linku riječi "pzusk.ba" predstavljaju: 12. a) b) c) d) Ime dokumenta i oznaku države Naziv domene i oznaku države Ime dokumenta i naziv domene E-mail adresu domene 2 Odgovor: _____________ Algoritam je: 13. a) Niz koraka koji vode ka rješenju nekog problema b) Određen i beskonačan broj koraka koji jasno vode ka rješenju nekog problema 101 2 c) Određen i konačan broj koraka koji jasno vode ka rješenju nekog problema (ukoliko rješenje postoji) d) Neodređen i beskonačan broj koraka koji vode ka rješenju nekog problema. Odgovor: _____________ Kada u Excel-u koristimo komandu COPY na ćeliji u kojoj se nalazi formula, koju od ponuđenih PASTE OPTION ćemo koristiti da zalijepimo vrijednost formule, a ne formulu: a) 14. 2 b) c) d) Odgovor: _____________ Kada u Wordu želimo da isprintamo samo određene stranice koristiti ćemo: 15. a) CTRL+S b) CTRL+P 2 c) Ikonu štampača d) CTRL+C Odgovor: _____________ 9.4. Zadaci 2013 OPĆINSKO TAKMIČENJE IZ INFORMATIKE ZA UČENIKE OSNOVNIH ŠKOLA 19.03.2013. U zadacima 1-10 treba zaokružiti slovo ispred tačnog odgovora. 1. Softverska licenca je A. Microsoft Office B. Vrsta softvera C. Pravo na korištenje određenog softvera D. CD koji dobijemo uz računar 102 2. Programski jezik nije A. PASCAL B. NEWTON C. COBOL D. JAVA 3. Najmanja adresabilna tačka na ekranu se naziva A. Pixel B. Minijatura C. Ekranska tačkica D. Point 4. Ikona u Microsoft Word-u A. Otvara još jedan postojeći dokument B. Otvara još jedan prazan dokument C. Dijeli ekran na dva dijela D. Kopira selektirani dio na clipboard 5. Koji nivo nije nijedan od tri nivoa komunikacijskog procesa A. Tehnološki B. Semantički C. Hardverski D. Efektivni 6. Koji broj nije napisan u heksadecimalnom brojnom sistemu A. BABE B. BEBE C. NANE D. 1234 7. Osnovni dijelovi centralne procesorske jedinice su A. Procesor i memorija B. Procesor i hladnjak C. Procesor i printer D. Procesor i softver 8. Prva definicija informatike potiče od A. Francuske akademije nauka B. Apple-a 103 C. NASA-e i CIA-e D. Američkog informatičkog društva 9. Dio centralne jedinice gdje se vrši obrada podataka se naziva A. Procesor B. Aritmetičko-logička jedinica C. Podatkovno-obrađivački filter D. Kompjuter 10. Koju kombinaciju treba pritisnuti za softversko resetiranje računara A. Ctrl+AltGr+Del B. Ctrl+AltGr+F1 C. Ctrl+Alt+Del D. Ctrl+Alt+F1 U zadacima 11-15 treba uraditi traženo. 11. Broj 2013 iz dekadnog brojnog sistema zapisati u binarnom: _______________________. 12. Nakon izvršenja naredbi, A i B će imati sljedeće vrijednosti: A=_______, B=________. A=2 B=3 A=A+B A=A+A IF B>A THEN A=100 B=A+B 13. Ako u Microsoft Excel ćelijama imamo sljedeće zapise: A1: 10 A2: 15 A3: 20 A4: 25 A5: =SUM(A2:A4) Nakon što u ćeliju A6 upišemo =COUNT(A1:A5) i pritisnemo tipku ENTER, koji će sadržaj biti ispisan na ekran u ćeliji A6? U ćeliji A6 će biti ispisano _______________. 14. Ako imamo 3 memorijske jedinice CD1, CD2 i CD3 sa sljedećim memorijskim kapacitetima: CD1 – 1010MB CD2 – 1GB CD3 – 1031031KB Poredati ih po veličini od najvećeg do najmanjeg:________________________________. 15. Broj 2706 iz oktalnog brojnog sistema zapisati u dekadnom: _______________________. 104 10. TEORETSKI ZADACI SA KANTONALNIH TAKMIČENJA 10.1. Zadaci 2011 KANTONALNO TAKMIČENJE IZ INFORMATIKE ZA UČENIKE OSNOVNIH ŠKOLA 10.05.2011. 1. Informacija i podatak su isto. DA NE 2. Softver su svi program koji se nalaze u nekom računaru. DA NE 3. Najvažniji dio računara (njegovo srce) je memorija. DA NE 4. Ako su uključena mala slova, da bismo aktivirali velika moramo koristiti: A: CapsLock B: Ctrl C: Shift D: Alt E: Enter F: Delete 5. Određenim pojmovima pridruži značenje: I generacija računara tranzistor II generacija računara integrisana kola III generacija računara elektronske cijevi IV generacija računara mikroprocesor 6. RAM je memorija iz koje se podaci mogu samo čitati. DA NE 7. DOS naredba DIR_p*.exe radi: Prikazuje sve datoteke sa exe ekstenzijom čije ime počinje sa slovom p. 8. Rezolucija monitora je ukupan broj piksela. DA NE DA NE 9. Datoteka (engl. File) je skup istovrsnih podataka zapisanih na jednom mjestu i nazvanih zajedničkim imenom. DA 10. Naziv bit dolazi od engl. Binary digit što u prevodu znači binarna cifra. DA NE NE 11. Dio centralne jedinice gdje se vrši obrada podataka se naziva porcesor, a skraćeni naziv je CPU. DA NE 12. Kako u Excel-u preći u novi red iste ćelije? A: Ctrl + Alta B: Shift + Enter C: Alt + Enter D: Ctrl + Shift 13. Koji je broj napisan u binarnom brojnom sistemu? A: 120392 B: 101010 C: 881188 105 D: 1234567890 10.2. Zadaci 2012 KANTONALNO TAKMIČENJE IZ INFORMATIKE ZA UČENIKE OSNOVNIH ŠKOLA 10.05.2012. Na sljedeća pitanja se odgovara tako da se upiše slovo koje se nalazi ispred tačnog odgovora na za to predviđeno mjesto (crtu): r/b bodovi mogući ostvareni Pitanje: Koji od sljedećih uređaja vam treba za komunikaciju sa drugim računarima putem telefonske mreže? 1. a) b) c) d) CD-ROM Modem Ploter Zvučnici 2 Odgovor: _______ Šta je od navedenog operativni sistem? 2. a) b) c) d) Lotus 1-2-3 PowerPoint 2010 Linux Ubuntu Corel X5 2 Odgovor: _____________ 3. Koji od navedenih uređaja je prikladan za pravljenje sigurnosne kopije (backup) sa mrežnog servera podataka? a) b) c) d) Modem Magnetna traka Ploter CD/RW 2 Odgovor: _____________ Korisnički ugovor Agreement): o licenci (End User Licence a) je oblik oglošavanja između autora ili izdavača softverske aplikacije i korisnika b) daje korisniku ekskluzivno pravo za kopiranje i prodaju softvera drugim potecionalnim korisnicima 4. 106 2 c) garantuje vlasništvo softvera korisniku softvera d) je zakonski ugovor između autora ili izdavača softverske aplikacije i korisnika s obzirom na uslove distribucije, dalje prodaje i ograničenja upotrebe. Odgovor: _____________ Šta je od navedenog ispravno ime za sliku ispod? 5. a) b) c) d) Naslovna traka Klizna traka Statusna traka Traka menija 2 Odgovor: _____________ .docx je ekstenzija (nastavak) za: 6. a) b) c) d) Ekstenzija za Word 1997 dokumenta Ekstenzija za Excel 2007 dokumenta Ekstenzija za Word 2007 dokumenta Niti jedno od pobrojanog 2 Odgovor: _____________ Šta znači skraćenica HTTP? 7. a) b) c) d) Hyperlink Transfer protocol Hyperlink Transmission Procedure Hypertext Transfer Protocol Hypertext Transmission Procedure 2 Odgovor: _____________ Simbol na ravnalu Office aplikacija obojan crnom bojom služi za: 8. a) b) c) d) uvlačenje cijelog odlomka uvlačenje prvog retka uvlačenje svih redaka osim prvog u odlomku ništa od navedenog 107 2 Odgovor: _____________ 9. Rezultat izvršenja formule u ćeliji B1 je: 2 Odgovor: _____________ Poredaj po veličini sljedeće kapacitete memorije počevši od najmanjeg: 10. a) b) c) d) e) 1100MB 0.1GB 103kB 1GB 1500kB 2 Odgovor: _____________ Tačan naziv trake na slici je: 11. a) b) c) d) startna traka alatna traka programska traka zadaćna traka 2 Odgovor: _____________ Koja će vrijednosti pisati u ćeliji C1 nakon izvršenja funkcije koja se u njoj nalazi: 2 12. =IF(SUM(A1:A4)>SUM(B1:B4);AVERAGE(A1:A4);SUM(B1;B4)) Odgovor: _____________ Prikazati realni broj 190.3125(10) binarno i oktalno! 2 13. Odgovor: _____________ 14. Kolika je vrijednost varijabli g i h nakon izvršenja niza naredbi? (DIV je rezultat cjelobrojnog dijeljenja, MOD je ostatak cjelobrojnog dijeljenja). g=4 h=15 108 2 g=g+h h=g – h g=g – h g=g MOD h h=g DIV h Odgovor: _____________ 15. Opcija "Track Changes" u MS Wordu služi za: a) Praćenje promjena koje se dešavaju u Word dokumentu b) Provjeru pravopisa c) Označavanje novih pojmova u Wordu d) Ništa od navedenog 2 Odgovor: _____________ 10.3. Zadaci 2013 KANTONALNO TAKMIČENJE IZ INFORMATIKE ZA UČENIKE OSNOVNIH ŠKOLA 30.04.2013. U zadacima 1-10 treba zaokružiti slovo ispred tačnog odgovora. 1. Za crtanje kružnice i kvadrata u Windows aplikaciji Paint, na tastaturi je potrebno držati pritisnutu tipku A. Ctrl B. Alt C. Shift 2. Neizostavni dio u svakoj adresi elektronske pošte je A. @ B. % C. .com 3. Ulazna jedinica nije A. Miš 109 B. Tastatura C. Štampač 4. Koja od navedenih naredbi nije naredba u Pascalu A. WRITELN B. PRIVATE C. READLN 5. Koji je broj zapisan u oktalnom brojnom sistemu A. 88 B. 77 C. Nijedan 6. Formule u Excelu počinju znakom A. # B. = C. % 7. Vodoravna orijentacija papira je A. Landscape B. Portrait C. Horizonal 8. Koliko jedan gigabajt ima megabajta A. 102 B. 1000 C. 210 9. Koji od odgovora radi u Excelu isto što i =SUM(A1:B2) A. =A1+B1+A2+B2 B. =A1+B2 C. =A1/B2 10. Softver se dijeli na A. Kupovni i prodajni B. Sistemski i aplikativni C. Memorijski i procesorski U zadacima 11-15 treba uraditi traženo. 11. Broj 20122013 iz dekadnog brojnog sistema zapisati u heksadecimalnom:_____________. 12. Nakon izvršenja naredbi, A i B će imati sljedeće vrijednosti: A= _______, B= ________. A=2 110 B=3 A=A+B A=A+A IF B>A THEN A=100 B=A+B 13. Ako u Microsoft Excel ćelijama imamo sljedeće zapise: A1: 10 A2: 15 A3: 20 A4: 25 A5: =SUM(A2:A4) Nakon što u ćeliju A6 upišemo =COUNT(A1:A5) i pritisnemo tipku ENTER, koji će sadržaj biti ispisan na ekranu u ćeliji A6? U ćeliji A6 će biti ispisano ___________ 14. Nakon izvršenja koda i:=17; writeln((i mod 6)+(i div 6); biće odštampano ________ 15. Broj 11001011 iz binarnog brojnog sistema zapisati u dekadnom:_________________ 111
© Copyright 2024 Paperzz