Potprogrami su delovi programa. Često se delovi koda ponavljaju u okviru nekog programa. Logično je da se ta grupa komandi izdvoji u potprogram, i da se po želji poziva u okviru programa tamo gde je potrebno. Takođe, potprogrami omogućavaju da se program razbije na menje module, i da se lakše reši problem. U potprograme spadaju procedure i funkcijski potprogrami (funkcije). Procedure i funkcije su slične. Obe se izvršavaju nad nekim ulaznim promenljivama, i obe izvršavaju neke naredbe. Razlika je u tome što funkcije uvek vraćaju neku vrednost (imaju izlazni rezultat), dok procedure ne moraju da vraćaju neku vrednost. Funkcije mogu da se napišu kao procedura, obrnuto ne važi. Ulazne promenljive se nazivaju argumenti ili fiktivni parametri. Potprogram se poziva u okviru programa, kada se pri pozivu navode stvarni parametri. Sam potprogram može da ima svoje lokalne promenljive, čije vrednosti mogu da se dobiju iz glavnog programa, ali ne mogu da se vide u glavnom programu. Lokalne promenljive mogu da imaju ISTA imena kao i globalne promenljive (pod uslovom da te globalne ne pozivam u potprogramu). Globalne promenljive su promenljive koje se deklarišu u okviru glavnog programa, vidljive su kroz ceo program, mogu da menjaju vrednost u potprogramu, i promenjena vrednost se vidi u glavnom programu. Globalne promenljive u Lazarusu mogu de se deklarišu i pre procedura (ispod implementation linije koda).
Prilikom rešavanja problema tokom programiranja često postoji potreba da se ista akcija izvršava nad različitim podacima, u različitim trenutcima i na različitim mestima, kao što je slučaj i u realnim procesima. Zgodno je takvu akciju (akcije), izdvojiti u nezavisne programske celine i po potrebi ih pozivati na različitim mestima u programu. Za svaku od takvih akcija kreiramo odgovarajući metod. U metode ubrajamo funkcije i procedure i pišemo ih u odeljku implementation editora koda. Funkcije Funkcije su metode koje daju određenu izlaznu vrednost koju nosi samo ime funkcije. Zaglavlje funkcije: Function imefunkcije(fp1,fp2 :tip):tipf; gde imefunkcije služi za poziv funkcije i nosi izlaznu vrednost tipa tipf. Fp1,fp2 su formalniparametri koji predstavljaju ulazne podatke. U pozivu funkcije biće zamenjeni stvarnimparametrima. Primer: Kreirati funkciju saberi koja sabira brojeve u intervalu od n do m. Ko risteći funkciju saberi izračunati zbir brojeva iz intervala x,y, zbir brojeva od 1 do 10 i zbir brojeva od 1 do 100. tri puta pozivamo funkcijusaberi sa različitim stvarnim parametrima
Zadatak2. Kreirati aplikaciju sa funkcijom max kojom se određuje veći od 2 broja. Koristeći ovu funkciju odrediti najveći od uneta 4 broja. Zadatak3. Kreirati aplikaciju sa funkcijom stepen koja računa n-ti stepen od x. Koristeći ovu funkciju izračunati S=a3+5b+cd Procedure: 1. Napisati proceduru kojom se izračunavaju minimum i maksimum dva broja. U glavnom programu testirati proceduru. 2. Sastaviti proceduru koja određuje najveći i najmanji od tri broja koristeći funkcije za minimum i maksimum iz odeljka Funkcije. U glavnom programu testirati proceduru. 3. Napisati program koji tri broja x, y, z uređuje u neopadajući poredak x<=y<=z. U program uključiti proceduru razmeni kojom se razmanjuju vrednosti dve promenljive. 4. Napisati proceduru koja računa zbir kvadrata i zbir kubova brojeva od n do m. U glavnom programu testirati proceduru REŠENJA 1. procedure minimax(x,y:integer; var min,max:integer); if x>y then max:=x; min:=y; end else max:=y; min:=x;
Var a,b,min1,max1:integer; minimax(a,b,min1,max1); Label4.Caption:=IntToStr(max1); Label6.Caption:=IntToStr(min1); 2. function max(x,y:integer):integer; if x>y then max:=x else max:=y; function min(x,y:integer):integer; if x<y then min:=x else min:=y; procedure minimax(x,y,z:integer; var mmin, mmax:integer); mmin:=min(min(x,y),z);
mmax:=max(max(x,y),z); Var a,b,c,min1,max1:integer; c:=strtoint(edit3.text); minimax(a,b,c,min1,max1); Label5.Caption:=IntToStr(max1); Label7.Caption:=IntToStr(min1); 3. procedure razmeni(var a,b:integer); var pom:integer; pom:=a; a:=b; b:=pom; Var a,b,c,min1,max1:integer; c:=strtoint(edit3.text); if a>b then razmeni(a,b); if b>c then razmeni(b,c);
Label5.Caption:=IntToStr(a); Label6.Caption:=IntToStr(b); Label7.Caption:=IntToStr(c); 4. procedure zbir(n,m:integer; var kv,kb:integer); var i:integer; kv:=0; kb:=0; for i:=n to m do kv:=kv+sqr(i); kb:=kb+i*i*i; Var a,b,sumkv,sumkb:integer; zbir(a,b,sumkv,sumkb); Label4.Caption:=IntToStr(sumkv); Label6.Caption:=IntToStr(sumkb);