1.11k likes | 1.43k Views
C++. Vježbenica 2 9. dio. Deklaracija funkcije. Deklaracija funkcije ima oblik: t ip _f unkcije naziv_f unkcije ( popis argumenata). tip podatka kojeg funkcija vraća pozivatelju. broj i tip podataka (argumenata) koji se predaju funkciji prilikom njenog poziva. Matematičke funkcije.
E N D
C++ Vježbenica 2 9. dio (c) S.Šutalo i D.Grundler, 2005.
Deklaracija funkcije • Deklaracija funkcije ima oblik: tip_funkcije naziv_funkcije(popis argumenata) tip podatkakojeg funkcija vraća pozivatelju broj i tip podataka (argumenata) koji se predaju funkciji prilikom njenog poziva (c) S.Šutalo i D.Grundler, 2005.
Matematičke funkcije • Korisniku na raspolaganju stoji mnoštvo funkcija razvrstanih u odgovarajuće biblioteke. • Većina matematičkih funkcija deklarirana je u datoteci cmath koju treba uključiti pretprocesorskom naredbom #include. (c) S.Šutalo i D.Grundler, 2005.
Matematičke funkcije float abs (float x); Funkcija kao rezultat vraća apsolutnu vrijednost broja x. float ceil (float x); Funkcija zaokružuje argument x na najbliži veći cijeli broj. float floor (float x); Funkcija zaokružuje argument x na najbliži manji cijeli broj. (c) S.Šutalo i D.Grundler, 2005.
Matematičke funkcije float fmod (float djeljenik, float djelitelj); Funkcija računa ostatak dijeljenja dva realna broja. float pow (float baza, float eksponent); Funkcija računa potenciju baza eksponent. float sqrt (float x); Funkcija računa kvadratni korijen argumenta x. (c) S.Šutalo i D.Grundler, 2005.
Primjer 41 • Zadatak (računanje kvadratnog korijena): • Treba unijeti realni broj pa provjeriti je li >= 0. Ako je, računa se kvadratni korijen tog broja, a ako nije ispisuje se poruka: Broj je manji od 0, ponovi upis. i ponavlja se unos broja. Upisi broj: Kvadratni korijen od ... je .... (c) S.Šutalo i D.Grundler, 2005.
Primjer 41 • Napomene: • Treba uključiti biblioteku cmath, da bi se moglo rabiti funkcijusqrt. • Ponovljeni unos broja omogućit će naredbagoto. (c) S.Šutalo i D.Grundler, 2005.
Primjer 41 ako je uneseni broj < 0, upis valja ponoviti (c) S.Šutalo i D.Grundler, 2005.
Primjer 41a #include<iostream> #include<cmath> using namespace std; int main() { float broj,rez; upis:cout<<"Upisi broj:"; cin>>broj; if (broj<0) { cout<<"Broj je manji od 0, ponovi upis"<<endl; goto upis; } (c) S.Šutalo i D.Grundler, 2005.
Primjer 41b else { rez=sqrt(broj); cout<<"Kvadratni korijen od "<<broj<<" je "<<rez<<endl; } return 0; } (c) S.Šutalo i D.Grundler, 2005.
Primjer 41 • Provjera za broj >= 0: za broj < 0: (c) S.Šutalo i D.Grundler, 2005.
Primjer 42 • Zadatak (funkcije floor i fmod): • Treba unijeti dva realna broja pa izračunati i ispisati njihov cjelobrojni kvocijent i ostatak dijeljenja. Potrebno je načiniti i provjeru. Ako je djelitelj 0, treba ispisati poruku: Ne moze se dijeliti sa 0 i zaustaviti program. Upisidjeljenik: Upisidjelitelj: ... / ... = ... cijelih i ... ostatka. Provjera: ... * ... + ... = ... (c) S.Šutalo i D.Grundler, 2005.
Primjer 42 • Napomene: • Cjelobrojni se kvocijent može dobiti uporabom funkcije floor (zaokružuje realni broj na prvi manji cijeli broj). • Ostatak dijeljenja vraća funkcija fmod. • Za provjeru je potrebno sadržaj varijable u koju je pohranjen cjelobrojni kvocijent pomnožiti s djeliteljem i tome umnošku pribrojiti vrijednost varijable ostatak. (c) S.Šutalo i D.Grundler, 2005.
Primjer 42 uključivanje biblioteke cmath uporaba matematičkih funkcija (c) S.Šutalo i D.Grundler, 2005.
Primjer 42a #include<iostream> #include<cmath > using namespace std; int main() { float a,b,ost,rez; cout<<"Upisi djeljenik:"; cin>>a; cout<<"Upisi djelitelj:"; cin>>b; if (b==0) cout<<"Ne moze se dijeliti sa 0."<<endl; (c) S.Šutalo i D.Grundler, 2005.
Primjer 42b else { rez=a/b; rez=floor(rez); ost=fmod(a,b); cout<<endl<<a<<"/"<<b<<"="<<rez<<" cijelih i " <<ost<<" ostatka."<<endl; cout<<endl<<"Provjera: "<<rez<<"*"<<b<<"+"<<ost <<"="<<rez*b+ost<<endl; } return 0; } (c) S.Šutalo i D.Grundler, 2005.
Primjer 42 • Provjera djelitelj != 0: djelitelj == 0: (c) S.Šutalo i D.Grundler, 2005.
Primjer 43 • Zadatak (funkcije pow i abs): • Treba unijeti cijeli broj paprovjeriti je li paran. Ako je paran, trebaizračunati i ispisati njegovu treću potenciju, a ako nije, apsolutnu vrijednost. • Ispis neka bude oblika: Unesi broj: Broj ... je paran, a njegovatreca potencija iznosi... ili Broj ... je neparan, a njegova apsolutna vrijednost iznosi... (c) S.Šutalo i D.Grundler, 2005.
uporaba matematičkih funkcija Primjer 43 uporaba matematičkih funkcija (c) S.Šutalo i D.Grundler, 2005.
Primjer 43/a #include <iostream> #include <cmath> using namespace std; int main () { int i,rez1,rez2; cout<<"Unesi broj:"; cin>>i; (c) S.Šutalo i D.Grundler, 2005.
Primjer 43/b if (i%2==0) { rez1=pow(i,3); cout<<"Broj "<<i<<" je paran, a njegova\ treca potencija iznosi "<<rez1<<endl; } else { rez2=abs(i); cout<<"Broj "<<i<<" je neparan, a njegova \ apsolutna vrijednost iznosi "<<rez2<<endl; } return 0; } (c) S.Šutalo i D.Grundler, 2005.
Primjer 43 • Provjera: (c) S.Šutalo i D.Grundler, 2005.
Primjer 44 • Zadatak (udaljenost dvije točke): • Treba unijeti koordinate točaka A i B, pa izračunati njihovu udaljenost u koordinatnom sustavu. • Ispis neka bude oblika: Koordinate tocke A: x1= y1= Koordinate tocke B: x2= y2= Udaljenost tocaka A(...,...) i B(...,...) je ... (c) S.Šutalo i D.Grundler, 2005.
Primjer 44 • Udaljenost točaka A(x1,y1) i B(x2,y2) u koordinatnom sustavu može se izračunati uz pomoć formule: (c) S.Šutalo i D.Grundler, 2005.
Primjer 44 uporaba matematičkih funkcija (c) S.Šutalo i D.Grundler, 2005.
Primjer 44/a #include<iostream> #include<cmath> using namespace std; int main() { float x1,y1,x2,y2,pom,d; cout<<"Koordinate tocke A:"<<endl; cout<<"x1= "; cin>>x1; cout<<"y1= "; cin>>y1; cout<<"Koordinate tocke B:"<<endl; cout<<"x2= "; cin>>x2; cout<<"y2= "; cin>>y2; (c) S.Šutalo i D.Grundler, 2005.
Primjer 44/b pom=pow((x2-x1),2)+pow((y2-y1),2); d=sqrt(pom); cout<<"Udaljenost tocaka A("<<x1<<","<<y1 <<") i B("<<x2 <<","<<y2<<") je "<<d<<endl; return 0; } (c) S.Šutalo i D.Grundler, 2005.
Primjer 44 • Provjera: (c) S.Šutalo i D.Grundler, 2005.
Primjer 45 • Zadatak (najmanji od tri broja): • Treba unijeti tri realna broja papronaći i ispisati najmanji. • Ispis neka bude oblika: Upisi prvi broj: Upisi drugi broj: Upisi treci broj: Ako se upisu brojevi: ..., ... i ... najmanji od njih je ... (c) S.Šutalo i D.Grundler, 2005.
Primjer 45 • Napomena: • Jedan od mogućih načina rješenja ovog zadatka je uvođenje pomoćne varijablemin u koju se na početku sprema prvi broj. • Preostali se brojevi uspoređuju sa sadržajem pomoćne varijable. Akoje neki od brojeva manji od sadržaja varijable min, privremeno se pohranjuje u min. (c) S.Šutalo i D.Grundler, 2005.
Primjer 45 U varijablu min se pohranjuje prvi broj. Ako je sadržaj varijable b manji od sadržaja varijable min, privremeno se sprema u varijablu min. (c) S.Šutalo i D.Grundler, 2005.
Primjer 45a #include<iostream> using namespace std; int main() { float a,b,c,min; cout<<"Upisi prvi broj:"; cin>>a; cout<<"Upisi drugi broj:"; cin>>b; cout<<"Upisi treci broj:"; cin>>c; (c) S.Šutalo i D.Grundler, 2005.
Primjer 45b min=a; if (b<min) {min=b;} if (c<min) {min=c;} cout<<"Ako se upisu brojevi: "<<a<<", "<<b<<" i "<<c <<" najmanji od njih je "<<min<<endl; return 0; } (c) S.Šutalo i D.Grundler, 2005.
Primjer 45 • Provjera: (c) S.Šutalo i D.Grundler, 2005.
Primjer 46 • Zadatak (linearna jednadžba): • Treba unijeti koeficijente linearne jednadžbe, pa ovisno o njihovim vrijednostima izračunati i ispisati iznos varijable x. U slučaju da je vrijednost jednog od koeficijenata 0, ispisati odgovarajuća upozorenja. Upisi koeficijenta: Upisi koeficijent b: Ako je a=0, jednadzba 0*x+...=0 nema rjesenje. ili Ako je b=0 rjesenje jednadzbe..*x+0=0 je: x=0.ili Rjesenje jednadzbe..*x+..=0 je: x=... (c) S.Šutalo i D.Grundler, 2005.
Primjer 46 • Napomene: • Zadatak će se riješiti uporabom razgranate naredbe if. • Ako je a == 0, to nije linearna jednadžba. • Ako je b == 0, rješenje je uvijek 0. • Za ostale vrijednosti koeficijenata, x = –b/a. (c) S.Šutalo i D.Grundler, 2005.
Primjer 46 uporaba razgranate naredbe if (c) S.Šutalo i D.Grundler, 2005.
Primjer 46a #include<iostream> using namespace std; int main() { float a,b,x; cout<<"Upisi koeficijent a:"; cin>>a; cout<<"Upisi koeficijent b:"; cin>>b; if(a==0) { cout<<"Ako je a=0, jednadzba "<<a<<"*x+("<<b <<")=0 nema rjesenje."<<endl; } (c) S.Šutalo i D.Grundler, 2005.
Primjer 46b else if(b==0) { cout<<"Ako je b=0, rjesenje jednadzbe "<<a<<"*x+("<<b<<")=0 je:"<<endl; cout<<"x=0"<<endl; } else { x=-b/a; cout<<"Rjesenje jednadzbe "<<a<<"*x+("<<b<<")=0 je:"<endl; cout<<"x= "<<x<<endl; } return 0; } (c) S.Šutalo i D.Grundler, 2005.
Primjer 46 • Provjera za a == 0: za b == 0: za (a i b != 0): (c) S.Šutalo i D.Grundler, 2005.
Primjer 47 • Zadatak (brojevi poredani po veličini): • Treba unijeti tri realna broja paih ispisati od najmanjeg do najvećeg. • Ispis neka bude oblika: Upisi prvi broj: Upisi drugi broj: Upisi treci broj: Brojevi: ..., ... i ... poredani od najmanjeg ka najvecem: ..., ..., ... (c) S.Šutalo i D.Grundler, 2005.
Primjer 47 • Napomene: • Problem se može riješiti tako da se prvo pronađu najveći i najmanji broj. • Nakon toga je potrebno pronaći srednji broj. (c) S.Šutalo i D.Grundler, 2005.
Primjer 47 • Napomene: • Kod traženja srednjeg broja polazi se od pretpostavke da srednji broj mora biti različit i od najmanjeg i od najvećeg broja. • Koristit će se logički operator I (&&) i operator uspoređivanjarazličito (!=). if ((b!=max)&&(b!=min)) mid=b; (c) S.Šutalo i D.Grundler, 2005.
Primjer 47 najmanji broj najveći broj srednji broj (c) S.Šutalo i D.Grundler, 2005.
Primjer 47a #include<iostream> using namespace std; int main() { float a,b,c,min,mid,max; cout<<"Upisi prvi broj:"; cin>>a; cout<<"Upisi drugi broj:"; cin>>b; cout<<"Upisi treci broj:"; cin>>c; min=a; if (b<min) {min=b;} if (c<min) {min=c;} (c) S.Šutalo i D.Grundler, 2005.
Primjer 47b max=a; if (b>max) {max=b;} if (c>max) {max=c;} mid=a; if ((b!=max)&&(b!=min)) {mid=b;} if ((c!=max)&&(c!=min)) {mid=c;} cout<<"Brojevi: "<<a<<", "<<b<<" i "<<c <<" poredani od najmanjeg ka najvecem:"<<endl; cout<<min<<", "<<mid<<", "<<max<<endl; return 0; } (c) S.Šutalo i D.Grundler, 2005.
Primjer 47 • Provjera: (c) S.Šutalo i D.Grundler, 2005.
Primjer 48 • Zadatak (rastaviti broj na proste faktore): • Treba unijeti prirodni broj pa ga rastaviti na proste faktore. • Ispis neka bude oblika: Upisi broj veci od 0: ... = 1 * ... * ... * ... * ... (c) S.Šutalo i D.Grundler, 2005.
Primjer 48 • Broj se rastavlja na proste faktore tako da ga se dijeli najmanjim prostim brojem, sve dok je djeljiv. • Zatim se dijeljenje nastavlja sljedećim prostim brojem i tako redom sve dok se ne dobije 1. 468 2 234 2 117 3 39 3 13 13 1 (c) S.Šutalo i D.Grundler, 2005.
Primjer 48 • Napomene: • Po unosu broja valja provjeriti je li br > 0.Ako nije, unos se ponavlja. • Ako je br > 0, valja zadati početnu vrijednost varijable u koju se pohranjuju prosti brojevi (prbr). Zbog lakšeg ispisa odabrano je prbr = 2. (c) S.Šutalo i D.Grundler, 2005.