Materijali/Čas 11

Čas 11 · prototip, parametri, return i poziv

Funkcije: jedan zadatak, jasni delovi

Poznat postupak izdvajamo u funkciju, da bismo ga mogli jasno proveriti, pozvati više puta i povezati sa nizovima i matricama.

MAPA ČASA

Od ideje do prvog C programa

1
program
2
podaci
3
promenljiva
4
pseudokod
5
C program

Na kraju je dovoljno da:

  • Razlikuj prototip, definiciju i poziv funkcije.
  • Prepoznaj povratni tip, formalne parametre i stvarne argumente.
  • Objasni zašto promena običnog parametra ne menja promenljivu u main-u.
  • Napiši funkciju koja čita niz i vraća rezultat ili indeks.
  • Poveži dve manje funkcije u obradi matrice.

01 · KORAK

Funkcija radi jedan jasno određen posao

Funkcija je imenovan deo programa. Umesto da isti postupak ponavljamo ili da sve ostane u main-u, izdvojimo posao koji možemo kratko da opišemo: prebroj pozitivne, pronađi indeks maksimuma ili izračunaj zbir jedne vrste.

Dobro ime govori šta funkcija daje. Funkcija broj_pozitivnih treba da prebroji, indeks_max treba da vrati mesto, a zbir_vrste treba da izračuna zbir izabrane vrste. Unos celog programa i konačan ispis najčešće ostaju u main-u.

int veci(int a, int b) {
    if (a > b) return a;
    return b;
}
Odredi posao pre pisanja kodaZa zadatak koji učitava niz i premešta najveći element na početak izdvoji dva posla: funkcija pronalazi indeks, a main obavlja zamenu i ispis. Napiši šta funkcija prima i šta vraća.
Funkcija ne mora da radi ceo zadatakAko funkcija istovremeno učitava, računa, menja i ispisuje, teško se proverava. Bolje je da vrati jedan precizan rezultat koji main zatim koristi.

02 · KORAK

Prototip najavljuje, definicija rešava, poziv koristi

Prototip navodi povratni tip, ime i tipove parametara, ali nema telo. Definicija sadrži telo između vitičastih zagrada. Poziv navodi ime funkcije i konkretne argumente.

Ako je definicija napisana ispod main-a, prototip iznad main-a omogućava prevodiocu da ranije proveri poziv. Tačka-zarez stoji na kraju prototipa, ali ne stoji između zaglavlja definicije i njenog tela.

int broj_pozitivnih(const int a[], int n);  /* prototip */

int koliko = broj_pozitivnih(a, n);       /* poziv */

int broj_pozitivnih(const int a[], int n) {
    int broj = 0;
    for (int i = 0; i < n; i++)
        if (a[i] > 0) broj++;
    return broj;
}
Razdvoji tri zapisaU prikazanom kodu pronađi prototip, poziv i definiciju. Zatim napiši novi poziv koji obrađuje samo prva tri elementa istog niza.
Povratni tip mora odgovarati rezultatuAko funkcija vraća ceo broj, povratni tip je int. Ako ne vraća vrednost, koristi void. Iz funkcije sa povratnim tipom int rezultat izlazi naredbom return izraz;.

03 · KORAK

Običan parametar dobija kopiju vrednosti

U definiciji int pomeren(int x), x je formalni parametar. U pozivu pomeren(a), a je stvarni argument. Kada se prosledi običan int, x dobija kopiju vrednosti promenljive a.

Promena kopije x ne menja a u main-u. Ako želimo novu vrednost bez pokazivača, funkcija je vraća, a main je sačuva: a = pomeren(a);. Menjanje originala preko adrese obrađujemo na sledećem času.

int pomeren(int x) {
    x = x + 4;
    return x;
}

int a = 7;
int b = pomeren(a);  /* a je 7, b je 11 */
Prati kopiju i originalNacrtaj dve odvojene kutije za a u main-u i x u funkciji. Prati poziv pomeren(a), promenu x i povratak rezultata u b.
return završava funkcijuKada se izvrši return, funkcija odmah završava i izračunata vrednost se vraća na mesto poziva. Naredbe ispod izvršenog return-a ne bi se izvršile.

04 · KORAK

Uz niz funkciji šaljemo i broj elemenata

Parametar const int a[] omogućava funkciji da čita elemente niza. Reč const u ovom zapisu govori da funkcija kroz taj parametar ne sme da menja elemente.

Funkcija iz parametra a[] ne dobija automatski broj elemenata, pa posebno prima n. Petlja tada ima jasnu granicu i < n. Poziv broj_pozitivnih(a, n) šalje niz i njegovu stvarnu dužinu.

int zbir_pozitivnih(const int a[], int n) {
    int zbir = 0;
    for (int i = 0; i < n; i++)
        if (a[i] > 0) zbir += a[i];
    return zbir;
}
Isti niz, dva rezultataNapiši funkcije broj_pozitivnih i zbir_pozitivnih. Pozovi obe nad istim nizom, a zatim proveri primer bez ijednog pozitivnog elementa.
n mora odgovarati stvarnom nizuAko pošaljemo n veće od broja postojećih elemenata, funkcija bi pokušala da čita van niza. Ako pošaljemo manje n, obradiće samo početni deo.

05 · KORAK

Funkcija može da vrati indeks ili odgovor 0/1

Kada posle pronalaženja treba menjati elemente, korisnije je vratiti indeks nego samo vrednost. Funkcija indeks_max vraća mesto prvog najvećeg elementa, pa main zna koji element treba da zameni sa a[0].

Funkcija koja proverava osobinu često vraća 1 za tačno i 0 za netačno. Takav rezultat može direktno da se koristi u uslovu: if (prost(a[i])) ....

int indeks_max(const int a[], int n) {
    int imax = 0;
    for (int i = 1; i < n; i++)
        if (a[i] > a[imax]) imax = i;
    return imax;
}
Prvi ili poslednji maksimumPrati niz 4, -3, 7, 0, 7, 2. Objasni zašto uslov > vraća indeks 2, a kako bi se ponašao uslov >=.
Početna vrednost dolazi iz nizaZa neprazan niz imax počinje od 0. Tako poređenje radi i kada su svi elementi negativni; ne izmišljamo početni maksimum 0 koji možda uopšte nije element niza.

06 · KORAK

Jedna funkcija može da koristi rezultat druge

Kod matrice funkcija pored matrice prima dimenzije ili indeks dela koji obrađuje. Za parametar A[][MAX] broj kolona u deklaraciji mora biti poznat prevodiocu; stvarni broj korišćenih kolona i dalje određuje m.

Funkcija indeks_najbolje_vrste ne mora ponovo da piše petlju za sabiranje kolona. Ona za svaku vrstu pozove zbir_vrste(A, i, m), uporedi rezultat i zapamti najbolji indeks.

#define MAX 10

int zbir_vrste(const int A[][MAX], int vrsta, int m) {
    int zbir = 0;
    for (int j = 0; j < m; j++) zbir += A[vrsta][j];
    return zbir;
}
Sastavi rešenje od dva mala poslaNapiši zbir_vrste, zatim funkciju koja vraća indeks prve vrste sa najvećim zbirom. Početni maksimum izračunaj pozivom za vrstu 0.
Ne ponavljaj već rešenu petljuAko već postoji proverena funkcija zbir_vrste, koristi njen rezultat. Tako je glavna logika traženja maksimuma kraća, a svaka greška ima jasnije mesto.

ZATVARANJE

Brza provera pre domaćeg

  1. Koja je razlika između algoritma i programa?
  2. Šta je ime, a šta vrednost promenljive?
  3. Kako svojim rečima čitaš x = x + 1?
  4. Koji red prvog programa računa, a koji prikazuje rezultat?