UVOD Za razliku od C-a, programski jezik C++ je objektno orijentirani programski jezik. Zamisao objektnog programiranja je da se složeni zadatak razdijeli na manje dijelove koji se onda mogu međusobno neovisno rješavati. Jezik je nastao osamdesetih godina 20.tog stoljeća kao naprednija verzija C-a. Postoji više verzija prevoditelja (kompajlera) za C++, a najpoznatiji su: Dev C++; Microsoft Visual C++ i Borland C++ Builder. Osnovna struktura programa Svaki program napisan u C-u ili C++ ima svoj izgled (strukturu). U nastavku ćemo pokazati koji su elementi jedno programa napisanog u C++ programskom jeziku: Linije programa koje počinju s znakom # programske naredbe, već su to pretprocesorske naredbe C programa prevodiocu (kompajleru) koje se izvršavaju prije kompajliranja. Prevodilac ili kompajler je zaseban program koji je "zadužen" za prevođenje naredbi programskog jezika u strojni jezik. Naredba #include <iostream> poziva datoteku iostream.h koja sadrži skup naredbi zaduženih za komunikaciju s programom, a <cstdlib> cstdlib.h koja sadrži opis funkcija ulaza-izlaza za C++. Unutar vitičastih zagrada nalaze se deklaracije varijabli (koje će kasnije biti opisane) te slijede naredbe programa koje čine naredbe za ulaz, računanje i ispis rezultata. Naredbom using namespace std; obavještavamo prevoditelja da ćemo koristiti standardne nazive naredbi. Prva linija programa, main, definira funkciju ili grupu zavisnih programskih naredbi. Funkcije su sastavni dijelovi programa u C++u te se ta glavna ili osnovna zove main. Većina programa sadrži još nekoliko dodatnih funkcija koje imaju svoje ime. Svaka naredba u programu završava sa točkom-zarezom ( ; ), osim uvjetne naredbe (if-else). Naredbom system ("PAUSE"); zaustavljamo program dok ne pritisnemo neku tipku. To nam je važno prilikom izvođenja programa. Naredba return 0; najčešće stoji na kraju programa, a ustvari govor da funkcija main() ne vraća vrijednost. Kada budete učili o potprogramima tada ćete više saznati što radi ova naredba. Uz program poželjno je pisati i komentar tako da onaj tko čita program može shvatiti o čemu se radi. Komentari se pišu unutar slijedećih znakova /* */ ili se bilo gdje u retku upišu znakovi za dvije kose crte // Naredbe programa nalaze se unutar vitičastih zagrada i neke osnovne bit će opisane u slijedećim lekcijama . 1 Primjer1: Program računa i ispisuje zbroj za a=5 i b=3. Primjer 2: Program ispisuje pozdravnu poruku u više redaka na zaslonu. 2 Tipovi podataka Računalu je važno s kakvim podacima barata. Ovisno o vrsti razlikujemo: • Cjelobrojne tipovi podataka (int) • Realne tipovi podataka (obične (float) i dvostruke preciznosti(double)) • Znakovne tipovi podataka (char i string) • Korisničke definirane tipove (strukture) Svaki tip podatak zauzima određenu veličinu (memoriju) u računalu i ima određeni doseg ili opseg. U sljedećoj tablici dan je prikaz vrsta podataka, veličine u bitovima koju taj podatak zauzima u memoriji računala i opseg u kojem se može nalaziti u programskom jeziku C. Tip podatka char signed char unsigned char short int unsigned int int long unsigned long float double long double Veličina u bitovima 8 8 8 16 16 16 32 32 32 64 80 Opseg -128 do 127 -128 do127 0 do 255 -32768 do 32767 0 do 65535 -32768 do 32767 -2147483648 do 2147483647 0 do 4294967295 3,4x10-38 do 3,4x1038 1,7x10-308 do 1,7x10308 3,4x10-4932 do 1,1 x104932 Osnovni tip cijelog broja je int. On može imati negativnu ili pozitivnu vrijednost unutar prikazanih granica. Tip podatka long koristi se kada nam je za varijablu potrebno veće područje. Tipovi podataka mogu biti predznačni signed i to znači da je u jednom bitu smještena informacija o tome da li je broj pozitivan ili negativan. Neke varijable ne mogu nikada poprimiti negativnu vrijednost pa ih deklariramo kao nepredznačne ili unsigned. Realni brojevi imaju decimalni dio. Zovemo ih još i floating-point (plivajući zarez) brojevima. Ime su dobili po načinu predstavljanja takvih brojeva u memoriji računala. Taj tip podatka naziva se float. Tipovi podataka doble i long double su poput tipa float, jedino omogućavaju da se smjeti veći broj znamenaka sa većom preciznošću.. Za znakovni tip podataka koristimo se sa char (što je isto kao i signed char). Ukoliko želimo koristiti kompletan set znakova treba upotrijebiti unsigned char. Kada baratamo s riječima i rečenicama možemo koristiti i tip - string (niz znakova). Često se javlja potreba da kod izvođenja programa želimo zadržati sadržaj ekrana da pročitamo rezultate izvođenje programa. Za to će nam poslužiti naredba getch() koja učita jedan znak i nastavlja program, bez pritiska na tipku Enter. Često se koristi kao posljednja naredba u programu,a nalazi se u datoteci funkcija conio.h 3 Aritmetički operatori Operacija Zbrajanje Oduzimanje Množenje Dijeljenje Ostatak cjelobrojnog dijeljenja Na primjer 7%2=1 jer je 7 podijeljeno s 2 jednako 3, a ostatak je jedan Operator + * / % Matematičke funkcije Osnovne koje na početku treba znati: Opis funkcije Drugi korijen pozitivnog broja Potenciranje (xy) Zapisivanje sqrt(x) pow(x,y) Funkcije se nalaze u biblioteci funkcija math.h pa je na početku programa potrebno napisati naredbu #include <math.h> Varijable Varijable u programu su promjenjive veličine. Mogu biti: - brojčane (cijeli ili decimalni broj) - znakovne Najbolje je da se svaka varijabla koja se koristi u programu deklaira na početku programa, ali u C++ se može deklarirati bilo gdje u programu. Deklaracija se sastoji od tipa podatka i jednog ili više imena varijabli.Osim deklaracije ponekad je varijable potrebno i inicijalizirani tj. postaviti na početnu vrijednost, najčešće je to 0, ali može biti i 1 (na primjer kod množenja brojeva). Ako se varijabla u ne postavi na početnu vrijednost ona će biti nepredvidiva tj. početna vrijednost može biti bilo koji broj pa će program krivo raditi (računati). Imena varijabli Sva imena varijabli trebaju započinjati slovom engleskog alfabeta ili podvlakom _. Za ostatak imena koriste se slova ili brojevi. Znakovi interpunkcije, odnosno kontrolni znakovi se ne smiju koristiti. Za prepoznavanje imena varijabli bitna su prva 32 znaka. Broj znakova iznad 32 se zanemaruje. Postoje razlike između malih i velikih slova tj. program ih prepoznaje kao različite znakove u imenima varijabli. 4 Primjeri deklaracija varijabli: int broj; char znak; float temp; /*cjelobrojna varijabla*/ /*znakovna varijabla*/ /*decimalna varijabla*/ Varijabla broj deklarirana je kao cijeli broj. Varijabla znak deklarirana je kao znak tj. ona može biti bilo koje slovo ili broj, ali brojevi koji su deklarirani kao znak ne mogu se oduzimati, zbrajati, množiti i dijeliti niti nad njima mogu vršiti bilo koje matematičke operacije. Varijabla temp deklarirana je kao decimalni broj. Konstante Konstante imaju tijekom programa određenu vrijednost koja se ne može promijeniti. Ključna riječ u deklariranje i inicijalizaciju konstante je const iza koje slijedi tip konstante i njezina vrijednost. Primjeri konstanti: const float pi=3.14159; const int a=8; Pravila koja vrijede za određivanje imena varijabli vrijede i za imena konstanti. Naredba cin Naredbom cin unosimo podatke s tipkovnice i pridružujemo ih varijablama u programu. Varijable kojima želimo pridružiti vrijednosti zapisujemo iza naredbe cin. Na primjer, naredbom cin>>a; uz pomoć tipkovnice, pridružujemo varijabli a broj ili slovo, a naredbom cin >>a>>b pridružujemo vrijednosti varijablama a i b. Važna napomena: Varijable prethodno trebamo deklarirati. Naredba cout Naredbom cout ispisujemo tekst, vrijednosti matematičkih izraza i vrijednosti varijabli u programu. Tekst koji želimo ispisati navodimo unutar navodnika, a varijable čije vrijednosti želimo ispisati pišemo iza naredbe. Na primjer, naredbom cout<<"Pozdrav"; ispisuje se pozdravna poruka Pozdrav na zaslonu računala, a naredbom 5 cout <<2+2; ispisuje se broj 4 jer je to vrijednost matematičkog izraza 2+2. Vrijednosti varijabli ispisujemo tako da ih navodimo iza naredbe cout. Na primjer cout<< a; ispisuje na zaslonu računala vrijednost varijable a. Primjer1: Program ispisuje pozdravnu poruku u jednom retku na zaslonu računala Primjer 2: Programom se unosi broj i ispisuje njegov kvadrat. Formatirani upis i ispis Upoznali smo naredbe za upis i ispis cin i cout. One ne zahtijevaju nikakvu posebnu naznaku po kojem će se formatu vršiti unos i ispis podataka i koriste se u slučajevima kada nam format zapisa nije važan. Međutim postoje situacije kada moramo navoditi format zapisa, na primjer u radu s datoteka pa ćemo u nastavku pokazati koje se naredbe koriste za formatirani upis i ispis podatak u C++. 6 Funkcija ulaza - scanf Funkcija koja je zadužena za spremanje podataka u određene varijable zove se scanf. Ona se može koristiti za različite tipove podataka koji se na različite načine spremaju u memoriju. Zbog toga je potrebno funkciji scanf opisati koji tip podataka želimo čitati. Opći oblik funkcije scanf je: scanf ("opis_formata",[adresa, adresa..]); U programu to pišemo ovako: scanf("%d",&a); opis_formata sačinjava niz znakova koji sadrže jedan ili više opisanih formata. Opis formata se sastoji od oznake postotka (%) iza kojeg slijedi slovo, koje opisuje tip podatka koji se upotrebljava. Jedan ili više opisa formata je smješteno između dvostrukih navodnika, a najčešće korišteni opisi formata nalaze se u priloženoj tablici. Funkcija char int float (decimalni) float (eksponencijalni) string (niz znakova) unsigned long int double long double scanf %c %d %f %e %s %u %ld %lf %Lf printf %c %d %f %e %s %u %ld %lf %Lf Slijedeći neophodni dio funkcije scanf je adresa na koju će podaci biti spremljeni. Potrebno je napomenuti da je potrebno navesti adresu varijable pomoću znaka &. Svaka varijabla u C++ ima specifičnu adresu u memoriji. Potrebno je voditi računa da se ova funkcija koristi za definirani oblik i tip podatka koji je potrebno unijeti. Međutim, ako ulazni podatak ne odgovara ulaznom formatu, ponašanje funkcije je nepredvidivo što rezultira pogrešnim izvođenjem programa. Stoga je važno da vodite računa o pravilnom zapisivanju opisa formata kojeg koristite. Funkcija izlaza - printf Suprotnost funkciji scanf, koja daje vrijednost varijabli, je funkcija printf, koja pokazuje vrijednost varijabli na ekranu. Poziv funkcije printf izgleda: printf ("opis_formata",varijabla,varijabla,...); U programu to pišemo: printf("Rezultat je %d", a); opis_formata može opcionalno sadržavat tekst koji će se ispisati. Ukoliko prikazujete vrijednost jedne ili više varijabli, potrebno je na odgovarajuće mjesto upisati opis formata pretvorbe za svaku varijablu. Opisi formata za funkciju scanf su isti kao za funkciju printf. 7 Postoji nekoliko znakova koji kontroliraju kako se tekst prikazuje na ekranu, a funkcija printf omogućava da se bilo koji od tih znakova ispiše na ekranu. Sekvenca \a \b \f \n \r Ime Alert Backspace Formated Newline Carriage ret \t Horizontal tab \v \\ Vertical tab Backslash \' Single quote \'' Double quote \? Question mark \OOO \xHHH Značenje Aktiviranje zujala Vraćanje unatrag jedan znak Start nove strane ili ekrana Pomicanje u novu liniju Povratak na početak linije Pomicanje na narednu tab poziciju Pomicanje prema dolje Prikazivanje kose crte Prikazivanje jednostrukog navodnika Prikazivanje dvostrukih navodnika Prikazivanje znaka pitanja Prikazivanje znakova sa oktalno zadanim ASCII kodom Prikazivanje znakova sa heksadecimalno zadanim ASCII kodom Sada možemo pristupi izradi jednostavnog programa. Primjer 1: Unesi dva realna broja i ispiši njihov umnožak i zbroj. 8 Primjer 2: Napiši program kojim će te unijeti radijus kruga i izračunati opseg i površinu kruga. Opširnije o naredbama scanf i printf U naredbi scanf i printf se može pisati više formata zapisa zajedno što znači da unosimo i ispisujemo više vrijednosti varijabli istovremeno. Formati zapisa, u naredbi scanf se mogu odvojiti razmakom ili zarezom što uvjetuje i način upisa (na primjer s razmakom unosimo 2 3 , a zarezom 2,3) Primjer 1: Unesi dva cijela broja i ispisi njihov zbroj. (Napomena: za unos i ispis koristi funkciju scanf i printf tako da se brojevi unose s razmakom, npr: 2 3) 9 Primjer 2: Unesi dva cijela broja i ispisi njihov zbroj. (Napomena: za unos i ispis koristi funkciju scanf i printf tako da se brojevi unose s zarezom npr: 2,3) Objašnjenje: Broj mjesta rezerviran za ispis detaljnije se regulira brojem ispred formata. Na primjer za ispis cijelih brojeva možemo napisati: printf("\nZbroj brojeva %3d %2d je %4d ",a,b,c); gdje stoji da će za prvi broj u ispisu biti rezervirana 3 mjesta za drugi 2 za rezultat zbrajanja 4 mjesta. Za ispis decimalnih brojeva možemo napisati: printf ("\n Zbroj brojeva %.4f %.2f je %.3f ",a,b,c); gdje %f znači da se radi o decimalnim brojevima, .4 označava da će za ispis decimalnog dijela prvog broja biti rezervirana 4 mjesta, za decimalni dio drugog 2, a za decimalni dio trećeg broja 3 mjesta. Operatori inkrement i dekrement Operator inkrement označava UVEĆAVANJE varijable za 1, a dekrement UMANJENJE za 1. Tako na primjer x=x+1 možemo zapisati kao x++ ili ++x. Ako je x=1 onda će nakon izvršavanja svake od sljedećih naredbi x++ ++x poprimiti vrijednost 2. Međutim u matematičkom izrazu vrlo je važno na kojem mjestu pišemo inkrement jer on utječe na konačan rezultat. Pogledajmo primjer x Neka je x=5 Napišemo li u programu: y=++x to znači da će se prvo x uvećati za jedan a zatim pridružiti varijabli y. Rezultat je: x=6 i y=6 10 Ako napišemo y=x++, tada se prvo x pridruži varijabli y pa se x -u doda jedan. Rezultat je: y=5, x=6. Isto vrijedi i za operaciju dekrement. Relacijski operatori Računala u svom radu upotrebljavaju jednostavnu logiku sa dvije vrijednosti; ukoliko je uvjet istinit (true), vrijednost je 1; ukoliko je lažan (false), vrijednost je 0. Relacijski operatori prikazani su u slijedećoj tablici: Operator > >= < <= == != Značenje veći od veći od ili jednak manji od manji od ili jednak jednak nije jednak Primjer 5>4 5>=x 4<5 x<=5 5==5 5!=4 Logički operatori Moguće je u testu kombinirati više od jednog uvjeta. To postižemo upotrebom jednog od tri logička operatora prikazana u slijedećoj tablici: Operator && || ! Značenje I (AND), svi uvjeti moraju biti istiniti da rezultat uvjeta bio istinit ILI (OR), najmanje jedan od uvjeta mora biti istinit da bi rezultat uveta bio istinit NE (NOT), negacija uvjeta Primjer 1: (a==c)&&(a>d) rezultat je istinit samo ukoliko je a jednak c i a veći od d. Programski jezik C radi tako da ukoliko je prvi uvjet (sa lijeve strane) lažan, drugi uvjet se neće testirati, jer je I izraz lažan, ukoliko je jedan od uvjeta lažan. Primjer 2: (a==c)||(a>d) rezultat je istinit ukoliko je bilo koji od uvjeta istinit. Ukoliko je prvi uvjet istinit, nije potrebno daljnje testiranje, rezultat je svakako istinit. 11 If i if..else naredbe Jednostavna if naredba ima oblik: if (uvjetni izraz){ naredba ili blok naredbi; } Uvjet može biti jednostavan relacijski izraz ili kombinacija izraza spojenih s logičkim operatorima. Izraz mora biti unutar okruglih zagrada. Naredba if radi tako da se ispita uvjet i u skladu sa istinitom ili lažnom vrijednošću uvjetnog izraza izvršavaju naredbe. Ukoliko je izraz istinit, naredba ili blok naredbi, koje slijede, se izvršavaju. Ukoliko želimo koristiti blok naredbi, one moraju biti zatvorene unutar vitičastih zagrada. Primjer 1: Unesi broj. Ako je uneseni broj pozitivan ispiši njegov prethodnik, a ako je negativan ispiši njegov sljedbenik. Primjer 2: Napiši program kojim će se unijeti tri realna broja te ispisati najmanji. 12 Višestruki izbor pomoću if ....else Ovaj oblik izbora ima slijedeći oblik: if (uvjetni izraz){ naredba ili blok naredbi; } else{ alternativna naredba ili blok naredbi; } Izjave if...else je moguće ugrađivati jednu u drugu. U sljedećem općem primjeru zelena petlja je ugrađena u plavu. if (uvjetni izraz 1){ naredba ili blok naredbi; } else{ if (uvjetni izraz 2){ naredba ili blok naredbi; } else{ alternativna naredba ili blok naredbi; } } ili if (uvjetni izraz 1){ if (uvjetni izraz 2){ naredba ili blok naredbi; } else{ alternativna naredba ili blok naredbi; } } else{ naredba ili blok naredbi; } 13 Primjer 1: Unijeti dva broja. Ako je prvi veći od drugog ispisati njihov zbroj, a ako nije (prvi veći od drugog) ispisati njihov umnožak. Ponavljanje izvršavanja naredbi pomoću petlji Naredbe if, if-else i swich izvršavaju uvjet i naredbe samo jednom. Čest je slučaj u praksi da naredbe moramo izvršiti više od jednog puta, kao na primjer u slučaju učitavanja ili ispisa veće količine podataka. Za slučaj kada istu naredbu ponavljamo više puta koristimo petlje. Petlje označavaju naredbu ili niz naredbi koje će se izvršavati više puta za redom, dok se ne ispuni neki, unaprijed zadan uvjet. U C-u i C++u koriste se tri petlje: for, while i do-while. Petlja for Programsku petlju for u C++-u zapisujemo na sljedeći način: for (inicijalizacija kontrolne varijable) { blok naredbi; } kontrolne varijable; UVJET; promjena vrijednosti Objašnjenje: Inicijalizacija kontrolne varijable podrazumijeva postavljanje početne vrijednosti. Početna vrijednost je UVIJEK broj koji se pridružuje varijabli petlje. Najčešće početna vrijednost iznosi 1, ali može imati i drugu vrijednost 100, 200, ili bilo koji drugi broj. Uvjet podrazumijeva postavljanje uvjeta izvršavanja petlje. Ako je uvjet zadovoljen, naredbe unutar petlje će se izvršiti. Ako uvjet nije zadovoljen (ispunjen) petlja će se završiti i program će nastaviti sa svojim izvođenjem s prvom prvom naredbom izvan petlje. 14 Kontrolna varijabla, kontrolira izvođenje petlje i svaki put kad se naredbe unutar petlje izvedu, ona promijeni svoju vrijednost. Njezina uloga, najčešće je da "broji" koliko se puta petlja izvela pa korak promjene kontrolne varijable najčešće iznosi 1. Međutim, postoje programske situacije u kojima korak, odnosno promjena kontrolne varijable može iznositi 2 ili 3. Općenito promjena kontrolne varijable može biti bilo koji cijeli broj. Primjer 1: Ispiši prvih 20 prirodnih brojeva, svaki u svom redu. Na kraju ispiši i vrijednost varijable i nakon izvođenja petlje. Primjer 2: Ispiši parne brojeve od 20 do 450. 15 Primjer 3: Ispiši sve prirodne brojeve između 1 i N, koji su djeljivi sa 3. Petlja while Petlja while izvršava jednu ili više naredbi, sve dok je zadani uvjet istinit. While naredbu pišemo: while (uvjet) { blok naredbi; } Kod petlje while se može dogoditi da se naredbe unutar petlje ne izvrše niti jednom; ako uvjet nije zadovoljen. Kod petlje do-while, ne postoji takav slučaj, odnosno naredbe se uvijek bar jednom izvedu. 16 Primjer 1: Za niz od 5 različitih brojeva ispiši zbroj. Petlja do-while Za razliku od while petlje ova petlja se izvede bar jednom jer se uvjet ispituje na njezinom kraju. Naredbe unutar petlje se izvršavaju dok je uvjet istinit (dok ne postane lažan). Kada uvjet postane lažan završava se petlja i program se nastavlja izvođenjem prve naredbe iza zagrade petlje. Naredba se zapisuje na sljedeći način: do{ blok naredbi; } while (uvjet); Obratite pažnju da se točka-zarez koja označava kraj naredbe zapisuje iza while uvjeta. 17 Primjer:Za niz prirodnih brojeva od 1-N ispiši sumu (zbroj ) neparnih. Funkcije Funkcije su cjelovite skupine naredbi koje izvršavanjem ispunjavaju određene zahtjeve. Omogućavaju raščlanjivanje problema na jednostavnije - manje cjeline, čime doprinose boljoj preglednost izvornog koda i jednostavnijem rješenjem. Funkcija se definira na slijedeći način: tip_funkcije ime_funkcije(najava liste_argumenata) { najava lokalnih varijabli; naredbe; return izlazna_vrijednost; } gdje je: - tip_funkcije određuje tip vrijednosti koju pozvana funkcija vraća u nadređenu funkciju, a može biti bilo koji od osnovnih tipova podataka (int, char, float, double, void), - ime_funkcije je identifikator preko kojeg se funkcija poziva, dok je - lista_argumenata lista formalnih parametara sa pripadajućim tipovima preko kojih se niz podataka iz nadređene funkcije prenose u pozvanu funkciju. Funkcija u glavni program vraća jednu ili niti jednu vrijednost ovisno o tipu funkcije. Za prijenos vrijednosti u nadređeni program koristi se naredba return;. Funkcija se poziva na slijedeći način: ime_funkcije(stvarna lista_argumenata); Funkcije se mogu pozivati u izrazima, petljama, ili kao argumenti u pozivima drugih funkcija. Svaka korištena funkcija se mora najaviti prije poziva. 18 Primjer1: Napiši program kojim će se pomnožiti cijela dva broja i ispisati rezultat. Za množenje cijelih brojeva napiši funkciju. Primjer 2: Napiši funkciju za traženje najmanjeg od 3 učitana broja. Zatim napiši glavni program koji će pozvati napisanu funkciju i ispisati njezino rješenje. 19 Zadaci za samostalni rad: 1. Napiši program koji će zbrajati dva broja pomoću funkcije za zbrajanje. 2. Napiši program koji će vršiti potenciranje unesenog broja pomoću funkcije za potenciranje. 3. Napiši program koji omogućuje unošenje duljina stranica pravokutnika pa pomoću funkcija za računanje površine i opsega računa i ispisuje površinu i opseg. Polja ili nizovi Nizovi su skupine podataka koji predstavljaju jednu cjelinu. Niz ima svoje ime, tip i veličinu tj. Zauzima određeni prostor u memoriji računala. Niz se sastoji od članova niza koji imaju svoju vrijednost i mjesto. Nizove u procesu programiranju koristimo kada želimo raditi s više podataka koji su organizirani u retke i stupce, istog su tima i imena. Međusobno se razlikuju po svom mjestu i svojoj vrijednosti. Stoga ih je lakše premještati, sortirati i s njima vršiti različite računske operacije. Nizovi mogu sadržavati: - brojeve (cijele ili decimalne) - znakove (slova i posebne znakove) Ovisno o tome razlikujemo numeričke i znakovne nizove. U definiranom nizu, svi podaci moraju biti istog tipa. Nije moguće u istom nizu miješati brojeve i znakove. Svaki član u nizu ima svoje mjesto. To mjesto zovemo INDEKS. Osim mjesta, član niza ima i svoju vrijednost. Na primjer: Ako kažemo da želimo definirati niz imena A koji će imati 7 članova i čiji će članovi biti cijeli brojevi, onda ćemo u programskom to napisati ovako: int A[7]. Grafički prikazano to izgleda ovako : A[0] 2 A[1] 3 A[2] 5 A[3] 4 A[4] 5 A[5] 34 A[6] 56 Vidimo da svaki član niza ima svoje mjesto (indeks) i vrijednost. Indeksi idu od 0-6 i zapisani su unutar uglatih zagrada. Tako na primjer vrijednost prvog člana niza A[0] iznosi 2, drugog ,A[1], iznosi 3 itd. Uočimo da članovi niza idu od 0 do N-1 gdje je N broj koji govori koliko ima članova niza. Postoje jednodimenzionalni, dvodimenzionalni i višedimenzionalni nizovi. Jednodimenzionalni nizovi Jednodimenzionalni nizovi imaju samo jedan niz podataka. Na primjer niz A prikazan u tablici ima 7 članova. Svi članovi su cijeli brojevi i nalaze se poredani su jedan iza drugoga (u nizu). A[0] 34 A[1] 5 A[2] 3 A[3] 21 A[4] 5 A[5] 3 A[6] 76 20 Kako bi program mogao raditi s nizom, na početku programa potrebno je rezervirati memoriju u računalu. To se radi naredbom za deklaraciju koja se općenito zapisuje: tip_niza naziv_niza [dimenzije] ; Na primjer sljedeće deklaracije označavaju: – da je deklariran niz cijelih brojeva koji se zove a i ima ukupno 10 članova, a indeksi idu od 0 do 9 float X[8] – da je deklariran niz decimalnih brojeva koji se zove X i ima ukupno 8 članova , a indeksi idu od 0 do 7 char b[30] - da je deklariran niz od 30 znakova int a[10] Važno je uvijek rezervirati više prostora nego što će se u programu koristiti jer će inače program neće raditi ispravno. Na primjer ako deklariramo da ćemo koristiti niz od 10 članova, a unesemo 20 program neće moći prihvatiti preostalih 10 članova niza te neće moći ispravno raditi. Niz se može zadati unutar programa ili unosom s tipkovnice (naredbom cin ili scanf). Ako se vrijednosti članova niza zadaju unutar programa navode se unutar vitičastih zagrada npr: naredbom A[6]={2,34,1,67,99,7}; je zadan niz A kojeg čini 6 cijelih brojeva. Kada se vrijednosti članova niza unose preko tipkovnice (naredbom cin) koristi se petlja for. Petljom for unose se jedna po jedan član niza, povećavanjem kontrolne varijable za jedan. U nastavku je dio programskog koda koji pokazuje unos članova niza pomoću petlje for. for (i=0;i<N;i++) { cin>>X[i]; } Za ispis članova niza također se koristi petlja for: for (i=0;i<N;i++) { cout>>X[i]; } 21 Primjer 1: Unesi N članova niza X pomoću for petlje te ih zatim ispiši na zaslon računala, također petljom for. Primjer 2: Unesi N članova niza te ispiši najmanji element u nizu. 22 Dvodimenzionalni nizovi Karakteristika dvodimenzionalnih nizova je da imaju više redaka i stupaca.Tablicom u nastavku predstavljen je cjelobrojni niz naziva A. 1. redak 2. redak 1. stupac 2 0 2. stupac 4 3 3. stupac 5 9 4.stupac 6 7 Čitajući tablicu, članovi niza su sljedeći: A[0,0] = 2 A[0,1] = 4 A[0,2] = 5 A[0,3] = 6 A[1,0] = 0 A[1,1] = 3 A[1,2] = 9 A[1,3] = 7 Prvi broj unutar uglatih zagrada je redak, a drugi stupac. Ako članove niza zadajemo u programu onda to za, prethodno tablicom prikazani niz, zapisujemo ovako: int A[2][4]={{2,4,5,6},{0,3,9,7}}; gdje prvi broj označava broj redaka, a drugi broj stupaca. Kao i kod jednodimenzionalnih nizova prvi redak i stupac imaju redni broj (index) 0. Dvodimenzionalni niz, se primjerice u praksi koristi za rješavanje problema sortiranja niza (od najvećeg do najmanjeg ili od najmanjeg do najvećeg). U nastavku je primjer sortiranja niza korištenjem jednodimenzionalnog niza. Pokušajte riješiti isti zadatak korištenjem dvodimenzionalnog niza. 23 Primjer: Unesi niz od N cijelih brojeva te ispiši sortiran niz od najmanjeg do najvećeg. Nizovi znakova Za rad s nizom znakova možemo koristiti tip string ili char. Tip string se koristi u slučaju ako radimo s riječima ili rečenicama, dok tip char radi samo s jednim znakom. DEfiniramo li polje ili niz znakova tipa char, također ćemo moći raditi s riječima ili rečenicama. Pri rad s tipom string na početku programa potrebno je izvršiti deklaraciju varijabli naredbom; string ime_varijable; Budući da varijabla string prilikom unosa unese znakove jedne riječi, postoji posebna naredba za unos cijele rečenice: getline(cin, ime_varijable); 24 Primjer 1: Unesi i ispiši svoje ime. Primjer 2: Unesi rečenicu " Danas učim programiranje u C++." te ju nakon unosa ispiši na zaslonu računala. Niz znakova možemo i definiramo kao jednodimenzionalni nizi čiji su elementi znakovi (char). Znakovni niz se deklarira kao i svaki jednodimenzionalni niz, navođenjem tipa char, imena niza i njegove duljine. Kod određivanja duljine niza znakova treba voditi računa o tome da niz znakova završava nul znakom (\0) koji zauzima jedno mjesto niza. Niz se inicijalizira tako da se njegov sadržaj navodi unutar dvostrukih navodnika ( " " ). Za učitavanje i ispis znakovnih nizova mogu se koristiti standardni načini učitavanja i ispisivanja elemenata jednodimenzionalnog niza (cout , cin , printf(), scanf() u kombinaciji s petljom for). Osim ovog načina mogu se koristiti i funkcije: - gets() - koja omogućuje unošenje niza znakova sa standardnog ulaza. - puts() - koja omogućava ispis niza znakova na standardni izlaz. (Obje funkcije nalaze u biblioteci stdio.h) 25 Primjer 1: Napiši program kojim se unosi niz znakova i ispisuje duljina učitanog niza. Strukture Struktura je kombinacija skupa istih ili različitih tipova podataka koje formira sam korisnik, prema vlastitim potrebama. U C++u se struktura općenito zapisuje: struct ime_strukture { najava članova strukture; }; gdje je struct ključna riječ koja označava početak najave strukture, ime_strukture koju najavljujemo, a unutar vitičastih zagrada navodimo sve čalnove(varijable) koje želimo kreirati strukturom. Varijable strukture mogu se navesti : a) odmah iza strukture struct ime_strukture { najava članova strukture; } lista strukturnih varijabli; - ili u posebnoj naredbi čiji je oblik struct ime_strukture lista_strukturnih_varijabli; Članovima strukturne varijable pristupa se preko imena strukturne varijable i strukturne točke (.) operatora. U nastavku je primjer programa u kojem se unose podaci za: ime, prezime, matični broj, prosjek i datum rođenja za sve učenike jednog razreda (najviše 40). Nakon unosa svih 26 podataka traži se učenik s najboljim prosjekom te se na kraju programa na zaslonu računala ispisuju svi podaci za učenika koji ima najbolji prosjek. Objašnjenje: U programu su definirane dvije strukture: datum i ucenik. Struktura datum služi za unos datuma rođenja učenika i sastoji se od dana, mjeseca i godine rođenja. Druga struktura se zove ucenik i sadrži 2 niza znakova (za ime i prezime), matični broj i prosjek ocjena. Niz (polje) razred se sastoji od struktura tipa učenik. Na primjer poziv za ispis varijable razred[0].rodjendan.godina će dati za ispis godine rođenja za 1. učenika, a razred[1].prosjek će dati ispis prosjeka za 2. učenika. 27 U nastavku je isti primjer, ali uz korištenje naredbi za formatirani ulaz i izlaz (printf i scanf). 28 Datoteke Datoteke omogućuju pohranjivanje velike količine podataka koji se mogu koristiti neovisno o programu. Datoteke mogu biti tekstualne ili binarne. U nastavku će biti opisane tekstualne datoteke. 2 su osnovna načina upisa/ispisa podataka u datoteku: - formatirani - neformatirani Neformatirani način upisa i ispisa podataka iz datoteke koristi naredbe: ofstream: za upisivanje podataka u datoteku ifstream: za čitanje podataka iz datoteke fstream: za čitanje i pisanje podataka u datoteku a obavlja se kombinacijama ključnih riječi open i close. Primjer1: Otvaranje datoteke primjer.txt i upis teksta "Ovo je primjer pisanja teksta u datoteku". Datoteka će se nalaziti u radnoj mapi tvrdog diska te se može pročitati izlaskom iz C++ a i pokretanjem programa Blok za pisanje (NotePad). 29 Primjer 2: Ispis (čitanje) sadržaja prethodnim zadatkom kreirane datoteke primjer.txt. Želimo li koristiti formatirani upis/spis podataka u datoteku koristiti ćemo naredbe fscanf() i fprintf(). Prije otvaranja datoteke programu ćemo naredbom FILE *identifikator; najaviti da ćemo raditi s datotekom. Identifikator je naziv datoteke koji ćemo koristiti u programu, a zvjezdica govori da se radi o pokazivaču. Datoteku ćemo otvoriti funkcijom fopen(), a nakon uporabe zatvoriti funkcijom fclose();. Općenito se te funkcije zapisuju: fopen("ime_datoteke","način_otvaranja"); fclose(identifikator); Ime datoteke zadaje se po istom pravilu kao i naziv varijable, a način otvaranja datoteke (tekstualne) određuje njezine mogućnosti. Tako na primjer može postojati datoteka koja se može samo čitati ili u koju se mogu samo zapisivati podaci samo. Načini otvaranja se bilježe slovom (r, w, r+) i detaljnije su opisani u tablici. 30 Način otvaranja "r" "w" "a" "r+" "w+" "a+" Objašnjenje Otvara tekstualnu datoteku za čitanje. Ako datoteka ne postoji javlja pogrešku. Otvara tekstualnu datoteku za pisanje u nju. Otvara tekstualnu datoteku za dodavanje novih podataka na njen kraj. Otvara tekstualnu datoteku za čitanje i pisanje. Ako ne postoji javlja pogrešku. Otvara tekstualnu datoteku za čitanje i pisanje. Ako datoteka ne postoji kreirat će ju. Ako datoteka postoji, svi podaci iz nje bit će izbrisani prije upisivanja novih. Otvara tekstualnu datoteku za dodavanje novih podataka na njen kraj. Ako datoteka ne postoji bit će kreirana Za pisanje u datoteku koristi se nekoliko funkcija. Najčešće korištene funkcije su fprintf() i funkcija fwrite() koja je pogodna za upisivanje blokova podataka. Za čitanje podataka iz datoteke najčešće se koriste funkcije fscanf() i fread() - koja se često koristi u kombinaciji sa strukturama. U programima za rad s datotekama često ćemo naići na dio programskog koda kojim se ispituje da li je datoteka ispravno otvorena. Ako je datoteka deklarirana sa FILE *f; onda taj dio koda izgleda ovako: if(f==NULL) { printf("Greska pri otvaranju"); exit(1); } Ako je uvjet (f==NULL) ispunjen na zaslonu računala će se ispisat poruka "Greška pri otvaranju". 31 Primjer 1: Napišite program koji u radnoj mapi kreira datoteku test1.txt i u nju smješta prvih 100 cijelih brojeva. (Napomena: nakon izvođenja programa izađite i u radnoj mapi provjerite da li imate datoteku test1.txt. Njezin sadržaj možete pročitati s programom Blok za pisanje (NotePad)) Primjer 2: Napišite program koji će pročitati sadržaj iz datoteke iz prošlog zadatka i ispisati njezin sadržaj na zaslonu računala. 32 Objekti i klase U novije vrijeme u konceptu programiranja koriste se objekti i klase. Objekt u realnom svijetu, može biti: automobil ili bicikl, a u programskoj igri lopta ili neki lik. Svaki objekt je definiran stanjem i ponašanjem; na primjer, stanje lika u igri može biti: lik trči, skače ili stoji, a ponašanje lika možemo definirati brzinom trčanja i visinom skoka. U programu je objekt opisan varijablama koje mu određuju stanje i metodama koje mu određuju ponašanje. Klasa predstavlja nacrt (predložak) objekta. Stoga se uvijek prvo kreiraju klase na temelju kojih se proizvode objekti. Na primjer, kada kreiramo klasu za lik, u igri možemo kreirati više likova koji mogu imati drugačije stanje (npr:neki lik može letjeti) i ponašanje (ima brzinu letenja). Pogledajte u nastavku video u kojem učenici kroz primjere u razredu objašnjavaju osnovne pojmove objektnog programiranja, a to su: - klase - objekti - svojstva - metode i - događaji (Napomena: videozapis je na engleskom jeziku) http://msdn.microsoft.com/en-us/beginner/cc963989.aspx U C++u definiranje klasa slično je definiranju struktura u programskom jeziku C, s tim da je ključna riječ class, a ne struct. U klasama je također potrebno zadati varijable koje će biti dostupne cijelom programu. Takve varijable zovemo javne i u C++ se zapisuju s public. 33 Primjer 1: U ovom primjeru kreirana je klasa koja se zove Primjer i koja sadrži funkciju Ispis(). Funkcija Ispis() ispsuje tekst "Ispis teksta na zaslon racunala koristenjem klase Ispis" na zaslonu računala. 34 Primjer 2: U primjeru 2 zadana je klasa pravokutnik koja ima dvije varijable: stranicu a i stranicu b. To su "stanja" pravokutnika, odnosno pravokutnik je određen veličinama tih stranica.U klasi se nalaze i dvije funkcije: povrsina() i opseg() koje mu određuju "ponašanje", odnosno određeno je pravokutniku možemo računati opseg i površinu. U glavnom programu naredbom pravokutnik prvi; je deklariran objekt prvi prema predlošku koji je opisan u klasi pravokutnik. Zna se da objekt ima dva stanja prvi.str1 i prvi.str2. Budući da su to javne varijable u klasi pravokutnik, naredbom prvi.opseg(); se može dobiti izračun opsega za objekt prvi, a naredbom prvi.povrsina(); površina za objekt prvi. 35
© Copyright 2024 Paperzz