Jaz bom za to lekcijo uporabil Dev C++.
|
|||||
![]()
Odprite poljuben Compiler in odprite novo izvorno datoteko.
|
|||||
|
|||||
![]()
Kaj pravzaprav funkcija je?
Funkcija je neka podnaloga. Funkcije so sestavljene iz stavkov. Ponavadi tudi nekaj "vračajo" razen funkcije tipa void. Sintaksa funkcij je sledeča: tip_ki_ga_funkcija_vrača ime_funkcije (argument 1, argument 2, ...agrument x) { } Primer funkcije, ki sešteje dve celi števili in vrne njuno vsoto: int vsota(int a, int b) { return a+b } Funkcije prikličemo s klicem. To storimo tako, da napišemo ime funkcije in v oklepajih navedemo argumente; v našem primeru: vsota(x, y);
|
|||||
|
|||||
![]()
Uporabimo za začetek zgornjo funkcijo v našem programu:
#include <iostream> using namespace std; //definicja funkcije vsota //Opozorilo: funkcije zmeraj definiramo pred funkcijo main! int vsota(int a, int b) { return a+b; } int main () { int a=5, b=3; //deklaracija in inicializacija dveh celih števil int c=vsota(a, b); //klic funkcije z argumentoma a in b cout<<"Vsota stevil "<<a<<" in "<<b<<" je "<<c<<endl; //vsoto nato še izpišemo... system("pause"); return 0; //... in zaključimo program }
|
|||||
|
|||||
![]()
Spoznajmo sedaj še druge tipe funkcij:
Kot vidite, vse funkcije morajo nekaj vrniti (ukaz return), izjeme so funkcije void, ki ukaza return ne potrebujejo. Funkcija vrača vrednost enakega tipa kot je tudi sama! |
|||||
|
|
|||||
![]()
Naredimo sedaj program, ki bo imel dve funkciji in sicer, prva bo izpisovala abecedo z malimi črkami (a, b, c...), druga pa z velikimi (A, B, C...).
Uporabili bomo tip void, saj želimo, da funkciji kar sami izpišeta abecedi... Pa kar začnimo:
|
|||||
|
|||||
![]()
//spet standardna ukaza
#include <iostream> using namespace std; //definirijamo sedaj ti dve funkciji void abeceda_velike() { //število argumentov je lahko tudi enako 0, če jih ne potrebujemo! int x=1; for(char i='A'; i<='Z';i++) { cout<<i<<" "; if((x%10)==0) cout<<endl; x++; } cout<<endl<<endl; } |
|||||
|
|||||
![]()
//še druga funkcija za male črke
void abeceda_male() { int x=1; for(char i='a'; i<='z';i++) { cout<<i<<" "; if((x%10)==0) cout<<endl; x++; } } |
|||||
|
|||||
![]()
//sedaj je navrsti main funkcija, v kateri bomo zgornji funkciji seveda tudi klicali
int main () { abeceda_male(); //klic funkcije za male črke cout<<endl<<endl; abeceda_velike(); //klic funkcije za velike črke cout<<endl; system("pause"); return 0; } Sedaj ta program deluje zelo pregledno, saj je v glavni funkciji zelo malo število vrstic in to je tudi ena poleg ostalih prednosti funkcij.
|
|||||
|
|||||
![]()
Do sedaj smo funkcije definirali že takoj na začetku, zdaj pa vam bom pokazal še drugi način definiranja.
#include <iostream> using namespace std; //ponovno bomo definirali funkcijo vsota vendar na malo drugačen način int vsota(int a, int b); //temu delu rečemo tudi prototip funkcije, v njem samo povemo tip, ime, in argumente funkcije...
|
|||||
|
|||||
![]()
int main () {
int x=10, y=20; cout<<vsota(x, y)<<endl; system("pause"); return 0; } //sedaj pa še dodajmo kodo funkcije int vsota(int a, int b) { //kopiramo prototip vendar brez podpičja (;) in dodamo zavita oklepaja return a+b; } Oba načina sta seveda pravilna in je samo stvar vašega okusa, kater način boste uporabljali
|
|||||
|
|||||
![]()
Za konec vam bom napisal še postopek sortiranja polj - in sicer se ta postopek imenuje bubble sort oz. mehurčno urejanje. Spoznali boste tudi prenos po referenci, kaj pa to pomeni, boste izvedeli v nadaljevanju...
|
|||||
|
|||||
![]()
#include <iostream>
using namespace std; void IzpisiPolje(int polje[], int vel); //prototip funkcije za izpis polja void Zamenjaj(int& a, int& b); //prenos po referenci (&) - prototip funkcije, ki bo zamenjala dve števili void Uredi(int polje[], int vel); //prototip funkcije, ki bo polje uredila po velikosti void IzpolniPolje(int polje[], int vel); //funkcija, s katero bomo v polje vnesli števila
|
|||||
|
|||||
![]()
int main () {
int velikost=10; int polje[velikost]; IzpolniPolje(polje, velikost); cout<<"Polje pred ureditvijo: "<<endl; IzpisiPolje(polje, velikost); cout<<"Polje po ureditvi: "<<endl; Uredi(polje, velikost); IzpisiPolje(polje, velikost);
|
|||||
|
|||||
![]()
//zaključimo program
system("pause"); return 0; }
|
|||||
|
|||||
![]()
//...vendar nismo še končali, saj moramo naloge funkcij še definirati
void IzpisiPolje(int polje[], int vel) { for(int i=0;i<vel;i++) cout<<polje[i]<<endl; } void Zamenjaj(int& a, int& b) { if(a<b) { int zacasna=a; a=b; b=zacasna; } } |
|||||
|
|||||
![]() void Uredi(int polje[], int vel) { for(int i=0;i<vel;i++) { for(int j=0;j<vel;j++) Zamenjaj(polje[i], polje[j]); //klic funkcije } }
|
|||||
|
|||||
![]()
void IzpolniPolje(int polje[], int vel) {
for(int i=0;i<vel;i++) { cout<<"Vnesi "<<i+1<<". stevilo: "; cin>>polje[i]; } }
|
|||||
|
|||||
![]()
Sedaj pa vam bom še razložil, kako zgornje funkcije delujejo.
1. Funkcija enostavno s pomočjo for zanke izpiše vrednosti vseh celic polja
2. Pri drugi funkciji pa ste mogoče opazili malo drugačno deklariranje spremenljivk a in b. Z operatorjem & namreč ustvarimo referenco. Referenca je v bistvu samo drugo ime neke druge spremenljivke - imata isto vrednost. Ključnega pomena pa za to funkcijo je, da če referenci spremenimo vrednost, se vrednost spremeni tudi prvotni spremenljivki. |
|||||
|
|||||
![]()
Z if stavkom nato preverimo, če je vrednost a manjša od vrednosti b. Če je pogoj resničen, dobi spremenljivka a vrednost b in spremenljivka b vrednost spremenljivke a (pomagamo si z začasno - pomožno spremenlljivko).
Verjetno se še zmeraj sprašujete, zakaj smo uporabili referenci. Zato, ker če spremenljivki ne bi bili referenci, bi se vrednosti znotraj funkcije spremenili, vendar pa se izven funkcije ne bi. Ker pa smo ju uporabili, se bosta vrednosti spremenili tudi izven funkcije!
|
|||||
|
|||||
![]()
Lahko tudi naredite preizkus in funkciji podate argumenta (int a, int b) { ... }
3. V to funkcijo smo vključili prejšnjo funkcijo, s katero preverimo vrednosti celic na indeksih i in j. 4. Z zadnjo funkcijo pa polje preko for zanke enostavno inicializiramo.
|
|||||