četvrtak, 20. ožujka 2008.

Upotreba funkcija:Kalkulator

Sad ,ovaj post ćemo posvetiti (cijeli ) izradi kalkulatora upotrebom funkcija.Kad bude djelomično gotov biti će postan.Molim razumijevanje ,pišem kad imam vremena.Naravno ,ići ćemo korak po korak od samog početka.Prvo napravimo prazan projekt i na source desni klik i dodamo cpp file i ispišemo sva zaglavlja koja će nam trebati i možemo početi dodavati funkciju po funkciju i na kraju glavni program koji će objediniti naše sve funkcije u program kalkulator.Objašnjavam tako jer je lakše za shvatiti kako možete provjeriti funkciju a da uopće ne morate sastaviti glavni progarm jer sjetite se"funkcije su samoizvršavajući blokovi" ,znači same se za sebe mogu provjeriti.zaglavlja ću u toku posta objašnjavati,a na kraju sve možemo podijeliti i u posebne datoteke i tako sam program podijeliti u više datoteka.Krenimo s početkom :
Povećajte si ovu sliku jer tako mi je bilo lakše napisati u dotičnom trenutku:

Sad možemo pokazati kako izgleda sama funkcija kad je ispišemo u editor koda ,samo nju i možemo je pokrenuti i dobiti ćemo prazan cmd i to znači da je sve ok,da je bilo greške to bi nam se napisalo i vi na taj način bez ispisa cijelog programa korak po korak možete provjeravati točnost onoga što ste napisali i to se zove invarijanta programa!

Ovdje je sama funkcija i primjetite da je prvo gore navedena samo deklaracija a dolje se linka na definiciju,možda nisam naveo isto ime ali vi to ispravite a ja ću kasnije:

Možda nije istog imena kao i u programu ali objašnjenje je isto.Sva akcija se zbiva u while petlji koja nam doslovno govori:
..... istaržuj znakove dok ne dođeš do kraja pomoću pokazatelja slovo „j“ i rezultat svega toga spremi u „i“ ! Naravno pomoću j se krećemo ali u if uvjetu za svaki pokret slova j kad naiđe na prazninu to ne spremamo u i zbog if uvjeta, za svaki while(uvijet) pokret(korak j) to se mora sprovesti.Znači sprema se u naše polje samo cijeli znakovni niz ali bez praznih mjesta zbog if uvjeta,u biti opet se radi o petlji u petlji i za svaki korak vanjske petlje se vrti unutarnja do kraja tj dok se ne ispuni if uvijet!!!!Sad smo znači riješili se praznina i sad prelazimo na slijedeću funkciju koja tj. pomoću koje biramo što ćemo u kalkulatoru raditi a povezana je s funkcijom koja definira svaki taj odabir.Biti će vam puno jasnije kad napišemo funkcije i objasnimo ih, što naravno slijedi.
U biti ja ću vam skoro gotovi program s svim funkcijama i glavnim programom odmah staviti tako da možete i sami vježbati a ja ću kad imam vremena objasniti funkciju po funkciju ,dio po dio!!!Naravno i ovaj program još nije gotov jer da bi još radio u potpunosti još mu fali par kodova ali to tek kad ovo prije objasnimo jer ima toga dosta što želim približiti na jednostavan način .Vjerujem da se dosad niste susreli s oblikom for(;;) što ću također objasniti,sad malo proučavajte i prepisujte program!!! Naravno spojite ovo sve u jedan program:







Naravno sad slijedi objašnjenje korak po korak,kalkulator u ovom obliku ne računa izraze s zagradama i ima neke nedostatke ,ali to je zato što još nismo gotovi s funkcijama u koje treba dodati još pokoji red koda.Ali prvo da riješimo for(;;) blok koji je u biti beskonačan zbog izostavljana uvijeta ali su obvezne ;; jer mora biti nešto a one su znak samom progarmu da nema uvjeta i izvodi se beskonačno ili dok ne naiđe na neki uvjet koji smo mi postavili(if) ili do neke točke prekida koji mi posatvimo ili reset.Evo malog programa koji nam to prikazuje prije nego krenemo na objašnjavanje kalkulatora:

Vidite da smo postavili uvjet i kad se on ispuni dolazi do break;
i prekida se program i izvršava se ono što smo i napisali u for petlji ,a mi možemo beskonačno(ovisi o memoriji) unositi brojeve .....
....varijabla x nam služi kao brojač ....
U funkciji za kalkulatro program koristimo tu petlju jer dozvoljavamo unos koliko hoćemo ali dok mi to želimo a ne sama for naredba,ona je tu samo da se vrti jer kroz nju realiziramo našu zamisao.Funkcije su međusobno povezane jer poziva jedna drugu da bi se realizirale i zato je bitan i redoslijed deklariranja i definiranja,probajte mijenjati redoslijede in diolazi do greške iako ste sve dobro napisali,znači to vam pokazuje i rad samog prevodioca i kako on radi i kojim redom prevodi i izvršava program.Dalje slijedi.
Sad ćemo pokazati kompletan program kalkulator,nadopunjena funkcija num() i nova funkcija extract() ,sad možete unositi u izračun i zagrade .Objašnjenje će naravno doći ali unaprijed se ispričavam na tome što malo sporije napredujem ,alin to je zbog mnoštva obveza ali ovaj post o Visual c++ će ići sigurno ka svim temama koje sam obećao i naveo!!!
Naravno ove slike spojite u jedan program i naravno radio sam kao empzy project i klik na source u prozorčiču solution explorer i desni klik i add item,naravno cpp file i pišite kod:






Kad ga pokrenete evo slike i možete unositi i izračunavati vaše izračune na ovom jednostavnom kalkulatoru:

Objašnjenje dio po dio će uslijediti.

utorak, 11. ožujka 2008.

Funkcije::osnove::nativni c++

Funkcije(Console App)

Prvo ćemo ponoviti o funkcijama ali u razvojnom okruženju Visual Studia ,jer sam već napravio tut o funkcijama u Dev okruženju ali od viška glava ne boli !
Same funkcije su samoizvršavajući blokovi koji se izvršavaju u glavnom programu kad pozovemo dotičnu funkciju.Pozivamo je pomoću imena koje smo joj dali a naravno držimo se nekih pravila pri imenovanju(uglavnom logički imenujemo i bez korištenja ključnih riječi) i naravno da sama imena znače nešto,ovisi o vašoj mašti!
Ime funkcije ne smije imati razmake i biti komplicirano,eto to je ukratko o imenovanju.Funkcija znači ima ovaj oblik :
tip ime_funkcije (parametri funkcije)
{blok funkcije --definicija funkcije(tijelo funkcije)}

I to bi bilo ukratko o samom izgledu funkcije. Parametri funkcije moraju odgovarati argumentima tj.obrnuto.....u glavnom programu moraju argumenti odgovarati parametrima funkcije,inače se program tj.funkcija se neće izvršiti!!!!Funkcije možemo pozivati kad i koliko puta želimo u program i to na različitim mjestima programa. Funkcija mora imati svoju deklaraciju izvan glavnog programa a po mogućnosti i definiciju(tijelo).
Naravno deklaraciju(objavu) možemo odvojiti od definicije a sama definicija mora postojati na posebnom mjestu izvan main() programa i naravno kad pozovemo funkciju deklaracija se spaja(linka ) s definicijom ma gdje ona bila ako je pravilno definirana i eto nam izvršenja programa.
Deklaracija funkcije kao takve uvijek završava točkom zarez.Osvemu ovome ćemo sad napisati par programa da bi sad to sve i vizualno vidjeli!

Prvo naravno na new -> new project i ne na clr nego win32 i u desnom prozoru Console Application i ok nakon što unesete ime vašeg projekta :

Ovdje samo klik na Finish:

I naravno u editor koda ukucajte program kao što sam i ja ukucao(napisao):


Narvno kad ga izvršite rezultat je :

Samo malo detaljnije objašnjenje slijedi ali prvo još osim win32 Console App vi možete napisati program u Visual Studiu i kao cpp file tj. početi pisati program tako da sami dodajete datoteke a evo kako:

Opet new-> new project i sad klik na General i pokazati će vam se ikonice desno i vi klik na empty project i naravno upišite vaše ime projekta i klik na ok:


Vidite da sad u Solution exploreru imate sve(Header,resource,i Source),mi zasad trebamo samo Source! Znači klik na Source i desni klik dok ste iznad njega i add -> add new item :

Otvara vam se ovaj prozor i vi klik na C++ File(cpp) i naravno morate ime cpp dati i na kraju add:

Otvara vam se editor koda a desno vidite cpp.file koji ste dodali i sad nam preostaje pisanje koda:

To je isti program koji smo gore pisali ali sad izmjenite sve da početak izgleda ovako a nastavak isti kao i gore :

I kad pokrenete opet isto:

Ova slika je trebala doći tamo gore na početak win32 ConsoleApp tako da znate jer to je prazni editor koda za to okruženje:

Sad slijedi još malo objašnjenja programa koji smo ispisali. Mi smo napravili funkciju koja nam izracunava broj na treću.Koristimo je tri puta u različitim oblicima a u zadnjem primjeru kao argument parametru int stavljamo samu funkciju i sve je to uredu dok se poštiva redoslijed argumenata koje smo naveli u deklaraciji funkcije.U slijedećem programu ista je funkcija u pitanju ali smo deklaraciju(objavu) funkcije napravili odvojeno od same definicije i deklaracija u takvom obliku uvijek ide s točka zarez na kraju.Znači prvo smo upoznali program s funkcijom i kad je pozivamo u main programu ,prevodilac je traži(definiciju) i evo spoja.U deklaraciji je dovoljno samo navesti tip koji ćemo upotrebljavati a definicija nam mora sve objasniti! Sad taj program i pručite logiku deklaracije i definicije a također program koji slijedi nakon njega nam govori o prjenosu argumenata po vrijednosti u funkciju što rezultira naravno povećanjem broja što radi funkcija ali nema utjecaja na samu varijablu,znači mi smo samo kopirali vrijednost i iskoristili je za rad funkcije a sama vrijednosta varijable ostaje ista-nismo utjecali na nju nego smo je samo iskoristili za rad naše funkcije!!!

U ovom programu gore vidite razdvajanje deklaracije i definicie.
Dolje je cmd ali od slijedećeg programa i koristim za pisanje koda General->empty project i source->add new item--> cpp file!Iako ću kombinirati oba načina kroz post.

Evo cijela slika kako izgleda sve i koje sam ja ime dao cpp.file-u:

Pročitajte i proučite kako funkcionora prijenos po vrijednosti koja samo kopira vrijednost varijable da bi provjerili funkciju ali ne utiče na povećanje vrijednosti na varijablu koju samo koristimo (kopija) da bi manipulirali s njom.U slijedećem programu pokazat ćemom kako ćemo uticati na promjenu vrijednosti same varijable pomoću funkcije.Za to nam trebaju pokazivači kao argumenti funkcije(parametri). Naravno sad sam opet na okruženju win32 Console Application:



Prijenos preko pokazivača

Funkcija ima kao parametar pokazivač što znači da u glavnom programu moramo kao argument proslijediti pokazivač koji će pokazivati na varijablu i tad funkcija može obaviti svoje .U ovom slučaju sve se odvija kao i u prijenosu po vrijednosti ali sad ono što je funkcija povečala odrazilo se na samu varijablu i njenu vrijednost i na taj način više nije ista vrijednost na početku nego je vrijednost ona koja se izvršila pomoću funkcije!Pokazivači su u biti drugo ime za varijable na koje pokazuju ali s bitnom razlikom ,mijenjamo vrijednost varijable i na taj se način pohranjuje nova vrijednost...a u prošlom programu smo uzimali samo kopiju broja a nismo pohranili novu vrijednost.Nadam se da ste shvatili jer u programu je sve lijepo prikazano i proučite ga i više puta ako treba!Deklaracija je odvojena od naravno definicije i u ovom programu,ako želite ponovite funkcije i s tutorijala za početnike na adresi koja je navedena u uvodu ,tamo su obrađene ali u Dev okruženju.Kad ovdje proučite funkcije i tamo na tim stranicama ,razumjet ćete njihovu bit...vjerujte!!Sad idemo dalje s funkcijama.
Proučite ove programe pa ćemo ih objasniti,primjetite samo da malo radim u win32 Console projectu a malo u general -> Empty projektu da vas to ne zbuni,gore vam je objašnjen i jedan i drugi način. Kao parametre funkcija možemo staviti i polje.To vidite u deklaraciji funkcije prosjek.Zato u glavnom programu moramo oformiti polje i pomoću funkcije prosjek izračunamo prosjek.Objašnjenje funkcije je naravno u definiciji ,kroz for petlju sve zbrajamo i naravno u return naredbi nam je izračun prosjeka tako da zbroj podjelimo s brojem elemenata i eto nam rješenja.Varijabla brojač nam je drugi parametar a sam brojač smo definirali s sizeof naredbama ,malo proučite sve to i vidjet ćete logiku programa i poštivanja parametara funkcije prosjek:




Ovdje je isti program ali naravno naravljen kao Empty projekt (gore pogledati) i u parametru funkcije prosjek kao prvi parametar smo upotrijebili pokazivač na polje koje ćemo oformiti u glavnom programu i sad sve radimo preko pokazivača koji u definiciji funkcije pokazuje na svaki element u polju i zbrajamo ih(aritmetika pokazivača) i tako smo došli do istog rezultata u smislu metode funkcije tj.načina kako funkcionira ,on je isti kao u prošlom programu ali preko pokazivača :


Sad prelazimo na dvodimenzionalna polja i upotreba dvodimenzionalnih,višedimenzionalnih polja u funkcijama.Naravno i njihova uporaba kao prarametar funkcije.


Ovu sliku povećajte i pročitajte:

Za čitanje višedimenzionalnih polja koja se sastoje od redova i stupaca koristimo dvije for petlje,unutrašnju i vanjsku,pomoću vanjske čitamo red a pomoću unutrašnje čitamo sve ono što se nalazi u redu tj. elemente kroz stupce svakog reda.Nadam se da ste razumjeli ali u biti se radi o petlji u petlji!!To sam već objasnio u tutorijalu o osnovama.Ako znate kako funkcionira petlja u petlji onda znate i kako čitamo redove i elemente u višedimenzionalnim poljima!Za svaki korak vanjske petlje unutrašnja petlja mora proći čitavu vanjsku petlju eto to je ukratko, i na taj način pročitamo svaki element u redu .Naravno i mi sve te elemente zbrajamo i spremamo u zbroj koji djelimo s brojem naših elemenata i eto nam prosjeka.Proučite program i shvatiti ćete logiku programa i čitanje redova i elemenata.
U slijedećem programu ćemo govoriti o prijenosu po adresama!
U ovom programu mi kao parametar uzimamo adresu varijable i stoga je adresa kad se varijabla stavi na tu adresu praktički i druga varijabla dok je kod pokazivača ,ime pokazivača ista varijabla ali samo drugo ime,znači adresa (referenca) kad se uzima mi u biti mijenjamo sve i zato možemo onako mijenjati vrijednosti varijable jer se radi o drugoj varijabli a ne o kopiji i to je bitna razlika između pokazivača i adresa.Mi svaki put uporabom funkcije koja ima kao parametar adresu mijenjamo i vrijednosti varijabli na nove vrijednosti!Nema kopija.Ali radi na istom principu.Malo proučite program i one prije i tutove na drugoj stranici o pokazivačima i funkcijama,shvatiti ćete!


Sad idemo na program prijenosa po adresi ali kad ne želimo da nam se mijenja vrijednost varijable a radimo s njom ,ali čuvamo originalnu vrijednost,i nakon toga će vam i ovaj prije program biti jasniji. Pri tome ćemo koristiti const izraz koji nam garantira da će vrijednost varijable uvijek biti original i nepromjenljiva je!!!To radimo kad ne želimo da nam se vrijednosti koje imamo u varijablama mijenjaju bilo slučajno ili namjerno,znači kad želimo sačuvati originalne podatke nepromjenjene, a s promjenjenima spremati u novu varijablu i vidite migućnosti su velike kad nam zatreba takav oblik funkcije.Program proučite i nije teško razumjeti ga,dolje u definiciji pokušajte ukloniti komentare s jednog dijela koda i pogledajte što se dešava i koju grešku javlja,doslovno nam govori da nije moguće koristiti konstantu s namjerom da je mijenjamo a to nam je i cilj!


Sad se možemo malo osvrnuti na argumente funkcije main(). Naravno povećajte si sliku i pročitajte što piše,tako mi je bilo lakše pisati iako možda vama nije.
Ali bitno je da razumijete. Ima i gršaka(imre umjesto ime).




Znaci mi ako imamo na CMD-u kad izvrsimo neki program jednu recenicu:

Ja idem na tečaj

: to znači da prvi parametar main funkcije broji sad 4 , a drugi parametar ima pet elemenata u svom string polju jer zadnji je uvijek NULL i plus četiri riječi!! Ako želite da vam se
Ja idem
broji kao jedan string tad to upišite pod navodnike „Ja idem“,tad imamo 3 kao prvi parametar a 4 kao drugi i već shvaćate.U pogramu koji smo napisali da nam ispisuje samo ime našeg programa i putanju,znači jedan i jedan.Nadam se da ste bit onoga što se proslijđuje main() funkciji shvatili jer i ovdje se radi o funkciji kao svakoj funkciji samo što u C++-u mora uvijek biti jedna main() funkcija kao funkcija u kojoj se sve odigrava da tako kažemo!Kome se ne sviđa od naprednih kako objašnjavam neka ni ne čita ali garantiram da onaj tko prvi put čita lakše razumije ovo nego kompliciranje izrazima koji samo kompliciraju objašnjenje koje se može objasniti na svima pristupačan način.Protiv sam svih komplikacija .Standard je kao prvi parametar pisati int argc a drugi char* argv ,nepisano pravilo.Ja sam ga malo izmjenio da vidite da može.















POVRATNI TIP-REFERENCA(FUNKCIJE)

Također funkcija može imati kao povratnu vrijednost i referencu(adresu).Napomena je da moramo biti pažljivi s tim return vrijednostima ako je u pitanju adresa.Adrese nisu kao obične varijable i moramo biti sigurni da objekt koji je na toj adresi još uvijek postoji nakon izvršavanja funkcije.To sve ćemo najbolje pokazati kroz sam program.U samoj deklaraciji funkcije smo znači kao povratni tip označili referencu tipa double,prvi parametar u funkciji nam je jednodimenzionalno polje a kao drugi parametar nam je int tip koji označava dužinu polja.Tijelo funkcije nam je for petlja u kojoj se nalazi if uvjet.Na kraju dolazi return dio koji vraća najmanju vrijednost na adresu.

No,prije nego još detaljnije objasnim program return tip reference,malo proučite program koji u polju brojeva koje unosimo traži najmanji broj .Upotrebljavamo for petlje i if uvjet da bi našli najmanji broj i pohranjujemo ga u varijablu y i to nam je najmanji element u polju.Bitno je proučiti taj program koji će nam trebati u formiranju funkcije koja ima povratni tip referencu,jer tad funkciju kao takvu možemo upotrijebiti kao L vrijednost tj. u funkciju čije je rješenje adresa možemo pohraniti vrijednost i to nam je bio cilj!!!

Funkcija je našla najmanju vrijednost u nizu brojeva i sad da je povratni tip samo double mi ne bi mogli ništa pohraniti na tom mjestu jer je već zauzeto,ali ako nam je povratni tip double& (adresa) tad samu funkciju možemo upotrijebiti kao varijablu u koju nešto pohranjujemo ,a mi ćemo pohraniti broj koji želimo .Pomoću for petlje to radimo dva puta da bi vidili kako to funkcionira i naravno poslije same funkcije objekt ili varijabla još uvijek postoji i to je bitno i naravno ispisujemo sve da to i dokažemo.Sad proučite prvo ovaj program traženja najmanjeg broja i na koji način to radimo,iako sve to imate objašnjeno i u tutu osnove osnova,zatim ide program radi kojeg sve to i radimo.


Naravno ,proučite sve i sad slijedi program u kojem ćemo dio ovog prgrama iznad iskoristiti za našu funkciju (for i if dio) i tip funkcije kao povratnu vrijednost referenca:



Proučite malo program kad ga ispišete i setw() je manipulator jer manipulira s izlazom znakova na CMD,naravno o osnovama manipulatora sam napisao u tutu o osnovama.Ovdje samo usporedite što je funkcija napravila(zamjena brojeva) i zbog return tipa kao adresa mi možemo pohraniti novu vrijednost na tu adresu.˛Nadam se da ste razumjeli povratni tip funkcije kao referenca. Sad nam slijedi objašnjenje statičkih varijabli u funkcijama i rekruzivna funkcija,iako to imate napisano u Dev okruženju(osnovs osnova) ,sad u VS-u,zatim samo ukratko CLR funkcije jer ćemo se njima pozabaviti malo kasnije ,puno više.

static varijabla u Funkciji

Slijedi program koji nam pokazuje da varijabla s naredbom static ispred tipa ostaje u funkciji i traje dok se funkcija izvršava i mijenja s njom tj. pokazuje nam koliko smo je puta upotrijebili.Probajte samo napisati bez static i vidite u priloženim slikama programa što se dešava i koja je funkcija static naredbe.Funkcija sama nema povratnog tipa i mogli smo napisati i bez dolje
return ;
..ali reda radi ostavljeno.Ako pokušate napisati s nulom javiće se greška jer nije nam broj povratna vrijednost (int) nego void(praznina).Proučite malo program i vidjet ćete samu logiku static naredbe koja osim što je možemo lokalno upotrijebiti unutar funkcije ona može biti i globalna ,znači svima u programu dohvatljiva ,ali o tome malo kasnije.
Naravno ove dvije slike su jedna i opet koristim new project->General->Empty->i desni klik na solution->add new item-> cpp file.U editor koda pišemo ovo dolje:


U drugoj verziji programa gdje pokazujemo razliku između deklaracije static i bez static je ova slika s kodom dolje gdje skinete komentar s int brojac a stavite komentar na static i onda izvršite program:

Evo ovdje na slikama CMD-a vidite razliku kad je s static i kad static nemamo:


Kad static naredbe nema tad se svaki put ponovi funkcija s varijablom od samog početka ali kad static (doslovno miruj i ne mijenjaj se,budi stalno prisutan,statičan) primjenimo varijabla se ne gubi s prije ostavrenom vrijednošću.S svakim pozivanjem pozivamo istu funkciju ali varijabla se ne gubi,statična je.Nadam se da ste razumjeli iako da bi program svladali morate ih napisati desetine i desetine.....Sad idemo na rekurzivnu funkciju koja u biti poziva samu sebe više puta!


Kad funkcija koja radi iste radnje više puta s jednim pozivom napravi više rezultata to je rekurzivna funkcija,samu sebe poziva.Naravno ,mora se paziti beskonačne petlje!Program radi da izračunava umnožak broja s brojem u for petlji.Sama funkcija sadrži i if uvjet koji omogućava rad i s negativnim brojevima.Proučite program i vježbajte vježbajte. Nastavićemo s funkcijama u nativ(c++) programiranju jer CLR programiranje koristi isti oblik pisanja funkcija kao i nativ c++ ali u C++/CLI programiranju se koristimo tracking handle( ^) oznakama i klasama kao tipovima ali oblik je isti . Zato je vrlo važno znati funkcije na oba načina i zato prolazim oba načina,prvo jedan pa drugi ,ma koliko trajalo! Kad završimo s funkcijama i strukturama podataka slijedi nam prava objektna orijentiranost C++-a ,ali naravno sve to ide polako jer pišem kad stignem,stoga molim razumijevanje.

Pokazivači na Funkcije

Dosad smo govorili o pokazivačima na varijable,ali pokazivači mogu pokazivati i na funkcije!To nam omogućava poziv te funkcije preko pokazivača.Sam takav pokazivač mora imati sve ono što smo napravili pri deklaraciji funkcije: povratni tip,parametri i pravilna deklaracija ,sve se mora podudarati .Naravno tipovi u parametrima i return tipu moraju biti isti kao i u funkcije na koju pokazujemo!!!

double (*pfunk)(char,int);

...evo ovo je primjer deklaracije pokazivača s double povratnim tipom!
Pokazivač pokazuje na funkciju koja ima dva tipa(char,int) s povratnim tipom double.Zagrade su obvezatne jer da nema zagrade tad bi se samo radilo o još jednoj deklaraciji funkcije a ne pokazivača!Znači opći oblik deklaracije pokazivača na funkcje je :

return_tip(*ime_pokazivača)(tip i lista_parametara);

Sve moramo poštivati a ovako izgleda pokazivač koji sve to poštiva:

double zbroj(double a,double b);//ovo je deklaracija funkcije
double(*pzbroj)(double,double)= zbroj;//pokazivač je odmah na zbroj funkciji

Kad bi preusmjerili na drugu funkciju to bi izgledalo ovako:

double druga(double,double);

pzbroj=druga;

...s time da i ona gornja deklaracija postoji u programu jer prije svega moramo deklarirati pokazivač pa makar na ništa pokazivao!Sad slijedi program koji nam samo pokazuje funkcioniranje pokazivača i kako možemo više puta koristiti pokazivač a imamo dvije funkcije a i sama funkcija može biti argument u traženom parametru!!Uf sad sam vam zakomplicirao ali sve to stoji i proučite program jer sve to rečeno je u njemu!


...Ne zaboravite * taj znak pri deklariranju pokazivača i naravno zagrade!
Zbog "pokazivača na funkciju " sama funkcija u deklaraciji neke nove funkcije može imati pkazivač na finkciju kao parametar.Znači kao argument tom parametru se proslijeđuje pokazivač na funkciju!
U ovom programu koji slijedi pri deklaraciji:

double ukupno()funkcije

u trćem parametru mi pozivamo funkciju preko pokazivača:

double(*pfunk)(double)

..naravno taj ili tom obliku odgovaraju naše funkcije koje smo prije deklarirali!(sq i kub) Tako preko jednog pokazvača pozivamo obe funkcije koje rade svoj posao.Pokazivač u tom obliku i s tim povratnim tipom možemo koristiti za sve funkcije koje mu odgovaraju!
Sad proučite program o tome:


Polja pokazivača na funkcije

Sam naslov nam govori o čemu se radi,formirati ćemo polje pokazivača na funkcije!!!
Evo slike koja to vjerno prikazuje i način na koji pozivamo funkciju s poljem pokazivača:

Pozvali smo funkciju umnozak i sad nad ta dva broja se vrši umnožak!
Naravno ,ponovite polja iz tuta o osnovama i kao se broje i čitaju elementi i sve će vam biti jasno.
Sad ćemo proučiti program koji nam pri samoj deklaraciji parmetara unutar funkcije izvršava unaprijed određeni argument koji smo već deklarirali pri deklaraciji funkcije.Sve ćete razumjeti kroz program koji slijedi:


Vidite kako smo u deklaraciji po defaultu pridružili rečenicu i kad pozivamo samo našu funkciju tad se to pokaže,ako je izmjenimo u glavnom programu ,opet se to pokaže ,ako nije ništa dirano po defaultu se pokazuje ono što smo u deklaraciji naveli .Naravno moramo poštivati tip i sve ok!Nova poruka je ispisana zadnja i naravno sve je istog tipa const char i naravno ne može se mijenjati i zato je to i default zbog const iizraza ali i zbog same deklaracije na početku programa.Nadam se da ste razumjeli jer nije teško shvatiti logiku ,ponavljajte što više puta .Funkcija je tipa void i ništa ne vraća nego se izvršava ono što je u bloku funkcije!!!
Također možemo imati i default int tipa :
int brojevi(long a=10,long b= 12,long c=34);
Na taj načim možemo sve po defaultu pozivati a ne moramo to raditi u glavnom programu,nadam se da ste shvatili bit,a to je i objašnjeno u tutu o osnovama(poglavlje o funkcijama).
Sad ćemo malo nešto reći i o izuzecima ,naravno u okruženju Visual Studia .

Izuzeci(try-cacth-throw)

Kad ne želimo da nam se program zaustavi a želimo znati gdje je greška primjenjujemo blok try-cacth zajedno s stvaranjem izuzetka s naredbom throw :


U ovo programu koji nam pokazuje kao radi try blok s throw i catch naredbama,napravili smo imaginarni brojač koji javlja koliko puta u sat vremena je došlo na primjer do stvaranja prevelikog pritiska i naravno moramo izračunati svakih koliko minuta po satu se taj proboj javlja u obliku beepa.Naravno ako ga nema tad je to nula ,i sad naravno da se program ne bi prekinuo napravimo try blok i unutar njega throw izraz (u obliku rečenice) i kad naiđe na nulu(u if uvjetu) naredba cath će uhvatiti taj izuzetak(sve naravno mora biti istog tipa)Također istog tipa mora biti i izračun i zato varijablu vrijeme castamo u double tip.Proučite program i shvatite logiku.

Sad ćemo malo o throw i catch naredbi(osnove). U ovom programu smo throw cijeli izuzetak stavili u funkciju tipa void:




U ovom programu smo napravili više try blokova i molim pazite na tipove ,throw mora odgovarati catch po tipu , naravno cath hvata svoj tip a u prvi try blok smo stavili while petlju i kako vidite radi se o programu petlji u petljama,sve to se zove ugniježđeni try blok(Nested try Blocks)...malo ga proučite objašnjenje slijedi:




U biti nema se tu što previše objašnjavati,petlje u petlji,zatim try blok vanjski pa unutarnji,svaki catch hvata svoj tip a prvi catch je unutar while petlje pa još uvijek možemo nastaviti program a drugi catch je van while petlje i u vanjskom try bloku pa program odmah završava kad taj catch uhvati svoj izuzetak!Sve je lijepo povezano a vi samo proučite.

Overload(preklapanje imena funkcije) Funkcije

Samo ime vam govori o čemu ćemo ovdje prikazivati program,samo prvo vam prikazujem kako izgleda odabir kad radite s express izdanjem Visual c++-a:

Sve je isto samo malo siromašniji izbor:
Nakon što ste sve napravili(odabir imena projekta i sve ostalo,na početku posta su upute) prepišite kodove i vježbajte proučavajte a objašnjenje slijedi:




Preklapanje se odnosi na isto ime funkcije pa čak i parametri mogu biti isti ali je tip drugačiji i ovisi koju pozivamo po tipu i polju(argumentu )ta se i izvršava....u programu kad dobro proučite već ćete shvatiti.
Sve je isto kao i gore ali sad primjetite razliku kad se primjenjuje template funkcija,kraći kod a samo jednom imate deklaraciju i definiciju kad koristite template funkcija:



Naravno sva objašnjenja slijede.Što se tiče template(predloška ) funkcije sve se svodi u biti na zajedničku funkciju preko koje možemo pozivati koju hoćemo funkciju i na taj način skraćujemo kod.Ključna riječ je template što znači da sad definiramo predložak funkcije.Zatim dolaze uglate zagrade u kojima ako ključne riječi koristimo class ili typename i slovo T ili Z ili G,nema veze ali to je oznaka koja će nam govoriti o tipu same funkcije ,da li se radi o double ili int ili long,što već pozovemo i to slovo postaje oznaka za izabrani tip!U nekim programskim okruženjima ali i samim programima puno više se koristi typename! Znači slovo T nam u našem programu zamjenjuje tipove i zato možemo pozvati sve tri funkcije ,a samo jednom smo definirali funkciju stvorivši šablonu prema kojoj će funkcija bilo kojeg tipa raditi....eto proučite program i mislim da ste shvatilil bit template ili šablona funkcije!Mi jesmo smanjili količinu napisanog koda ali ne smanjujemo brzinu programa jer se opet pozivaju sve tri funkcije tako da je prevodiocu svejedno ali nama je lakše napisati predložak .