Za kaj se uporabljajo podprogrami? Koncept podprograma

V praksi programiranja se pogosto pojavljajo situacije, ko je treba isto skupino operaterjev, ki izvajajo določen cilj, ponoviti brez sprememb na več mestih v programu. Da bi se znebili takšne izgube časa, je bil predlagan koncept podprograma.

Podprogram je poimenovana, logično popolna skupina jezikovnih stavkov, ki jih je mogoče poljubno številokrat priklicati za izvajanje z različnih mest v programu. V Free Pascalu obstajata dve vrsti rutin: procedure in funkcije. Glavna razlika med proceduro in funkcijo je, da je rezultat izvajanja operatorjev, ki sestavljajo telo funkcije, vedno določena vrednost, zato je funkcijo mogoče uporabiti neposredno v izrazih, skupaj s spremenljivkami in konstantami.

4.1 Splošne informacije o podprogramih. Lokalne in globalne spremenljivke

Podprogram je torej poimenovan niz deklaracij in stavkov, ki izvajajo določeno nalogo. Informacije, posredovane podprogramu za obdelavo, se imenujejo parametri, rezultat izračunov pa se imenuje vrednosti. Klic podprograma se imenuje klic. Pred klicem mora biti podprogram opisan v razdelku z opisi. Opis podprograma je sestavljen iz glave in telesa. Glava deklarira ime podprograma in njegove parametre, če obstajajo, v oklepajih. Za funkcijo morate navesti vrsto rezultata, ki ga vrne. Telo podprograma sledi glavi in ​​je sestavljeno iz deklaracij in izvedljivih stavkov.

Vsak podprogram lahko vsebuje opise drugih podprogramov. Konstante, spremenljivke, tipe podatkov je mogoče deklarirati tako v glavnem programu kot v podprogramih različnih stopenj gnezdenja. Spremenljivke, konstante in tipi, deklarirani v glavnem programu pred definiranjem podprogramov, se imenujejo globalni in so na voljo vsem funkcijam in postopkom. Spremenljivke, konstante in tipi, deklarirani v podprogramu, so na voljo samo v tem podprogramu in se imenujejo lokalne.

Za pravilno določitev obsega identifikatorjev (spremenljivk) se morate držati naslednjih pravil:

  • vsako spremenljivko, konstanto ali vrsto je treba deklarirati pred uporabo;
  • obseg spremenljivke, konstante ali tipa je podprogram, v katerem je deklarirana;
  • vsa imena znotraj podprograma, v katerem so deklarirana, morajo biti edinstvena in ne smejo sovpadati z imenom samega podprograma;
  • lokalne in globalne spremenljivke z istim imenom so različne spremenljivke; dostop do takih spremenljivk v podprogramu se obravnava kot dostop do lokalnih spremenljivk (globalne spremenljivke niso na voljo);
  • Pri dostopu do podprograma so na voljo objekti, ki so deklarirani v njem in pred njegovim opisom.

4.2 Formalni in dejanski parametri. Posredovanje parametrov podprogramu

Izmenjava informacij med klicano in klicajočo funkcijo se izvaja z uporabo mehanizma za posredovanje parametrov. Spremenljivke, navedene v glavi funkcije, se imenujejo formalni parametri ali preprosto parametri podprograma. Vse spremenljivke s tega seznama je mogoče uporabiti znotraj podprograma. Seznam spremenljivk v stavku klica podprograma so dejanski parametri ali argumenti.

Mehanizem za posredovanje parametrov zagotavlja izmenjavo podatkov med formalnimi in dejanskimi parametri, kar vam omogoča izvajanje podprograma z različnimi podatki. Med dejanskimi parametri v stavku klica in formalnimi parametri v glavi podprograma obstaja ujemanje ena proti ena. Število, vrste in vrstni red formalnih in dejanskih parametrov se morajo ujemati.

Prenos parametrov se izvaja na naslednji način. Izračunajo se izrazi, ki nadomestijo dejanske parametre. Pomnilnik je dodeljen formalnim parametrom glede na njihove vrste. Izvede se preverjanje tipa in če se ne ujemata, a diagnostično sporočilo. Če se število in vrste formalnih in dejanskih parametrov ujemajo, potem začne delovati mehanizem za prenos podatkov med dejanskimi in formalnimi parametri.

Formalne parametre postopka lahko razdelimo v dva razreda: vrednostne parametre in spremenljive parametre.

Pri prenosu podatkov skozi vrednostne parametre se vrednosti dejanskih parametrov posredujejo podprogramu in ni dostopa do samih dejanskih parametrov iz podprograma. Pri prenosu podatkov parametri-spremenljivke nadomestijo 1 V resnici se naslovi dejanskih parametrov posredujejo podprogramu. formalnih parametrov, zato ima podprogram dostop do vrednosti dejanskih parametrov. Vsaka sprememba spremenljivih parametrov v podprogramu povzroči spremembo ustreznih formalnih parametrov. Zato je treba vhodne podatke posredovati skozi parametre vrednosti; spremenljive parametre je treba uporabiti za posredovanje podatkov, spremenjenih kot rezultat delovanja podprograma.

Preidimo od splošnih teoretičnih načel k praktični uporabi podprogramov pri reševanju problemov. Začnimo preučevati podprograme s postopki.

4.3 Postopki

Opis postopka je naslednji:

procedura ime_procedure(seznam_formalnih_parametrov); oznaka seznam_oznak; const seznam_konstant; vrsta type_list; var seznam_spremenljivk; začetek //telo postopka. konec;

Opis se začne z naslovom procedure, kjer je procedura jezikovna ključna beseda, procedure_name je kateri koli dovoljen identifikator v jeziku Free Pasacal, seznam_formalnih_parametrov- imena formalnih parametrov in njihove vrste, ločena s podpičjem. Oglejmo si primere glav postopkov z vrednostnimi parametri:

postopek ime_1(r: resnično; jaz: celo število; c: char);

Parametri iste vrste so lahko navedeni ločeni z vejicami:

postopek ime_2(a, b: resnično; i, j, k: celo število);

Seznam formalnih parametrov je neobvezen in morda manjka:

postopek ime_3;

Če bodo v glavi postopka uporabljeni spremenljivi parametri, mora biti pred njimi navedena servisna beseda var:

postopek ime_4(x, y: resnično; var z: resnično);

//x, y - parametri vrednosti,

//z - parameter - spremenljivka.

Za glavo sledi telo postopka, ki je sestavljeno iz razdelka opisa 2 Razdelek z opisom v postopku je lahko odsoten, če ni potreben.(konstante, tipi, spremenljivke, postopki in funkcije, ki se uporabljajo v postopku) in jezikovni operaterji, ki izvajajo algoritem postopka.

Če želite poklicati postopek, morate uporabiti klicnega operaterja:

ime_procedure(dejanski_seznam_parametrov);

Dejanski parametri na seznamu klicnih operaterjev so ločeni z vejico:

a: = 5,3; k: = 2; s:= 'a';

ime_1(a, k, s);

Če v opisu postopka ni bilo formalnih parametrov, jih pri njihovem klicu ne bi smelo biti:

NALOGA 4.1. Poiščite prave korenine kvadratne enačbe.

Algoritem za reševanje tega problema je bil podrobno opisan v nalogi 3.3 (slika 3.14). Vendar situacija napačnega vnosa vrednosti koeficientov tam ni bila upoštevana. Na primer, če uporabnik vnese , se enačba spremeni iz kvadratne v linearno. Algoritem za reševanje linearne enačbe je trivialen: , pod pogojem, da . Da ne bi komplicirali že sestavljenega algoritma za reševanje kvadratne enačbe, ga zapišemo v obliki podprograma-postopka. Sledi delček programa s komentarji:

//Postopek za izračun realnih //korenov kvadratne enačbe. postopek corni (a, b, c: real; var x1, x2: real; var pr: boolean); //Vhodni parametri postopka: //a,b,c - koeficienti kvadratne enačbe; //Izhodni parametri postopka: //x1,x2 sta korena kvadratne enačbe, //pr je logična spremenljivka, //vzemi vrednost "false", če v enačbi ni korenin, //in sicer vrednost "true". var d: pravi; začetek d:=b * b-4 * a * c; če d<0 then pr:= false else begin pr:= true; x1:=(-b+sqrt (d)) / 2 / a; x2:=(-b-sqrt (d)) / (2 * a); end end; //Конец подпрограммы //Основная программа var a_, b_, c_, x1_, x2_, x_ : real; pr_ : boolean; begin write (’a_:= ’); readln (a_); write (’b_:= ’); readln (b_); write (’c_:= ’); readln (c_); if a_=0 then //Если а=0, то уравнение //квадратным не является. begin //Решение линейного уравнения bx+c=0. if b_<>0 nato začnite x_:=-c_/b_; writeln('x=',x_); end else writeln('Brez korenin'); end else //Reševanje kvadratne enačbe ax^2 + bx + c = 0. begin korni (a_, b_, c_, x1_, x2_, pr_); //Kliči postopek. if pr_=false then writeln ('Brez korenin') else writeln (' x1= ',x1_, ' _x2= ',x2_); konec; konec.

NALOGA 4.2. Vnesite zaporedje pozitivnih celih števil. V vsakem številu poišči največjo in najmanjšo števko.

Za rešitev problema bomo ustvarili proceduro max_min, katere rezultat bosta dve vrednosti: najmanjša in največja cifra v danem številu.

Besedilo programa:

//Postopek vrne //max največje in min najmanjše števke v številu M. //Na seznamu parametrov: //M parameter-vrednost (vhodni parameter), //max in min parametri-spremenljivke (izhodni parametri ). procedure max_min(M: longint; var max: byte; var min: byte); var i: bajt; začetek i: = 1; medtem ko M div 10>0 do begin if i =1 then begin //Predpostavimo, da je prva številka max:=M mod 10; //največji ali najmanj:=M mod 10; //najmanjši. i:= i +1; konec; //Išči številke, večje od max ali manjše od min. če je M mod 10 > max potem max:=M mod 10; če je M mod 10< min then min:=M mod 10; M:=M div 10; end; end; var X: longint; N, i,X_max, X_min: byte; begin //Количество элементов в последовательности. write (’N= ’); readln (N); for i:=1 to N do begin write (’X= ’); readln (X); //Элемент последовательности. if X>0 then //Če je element pozitiven, potem begin max_min(X,X_max, X_min); //pokliči postopek. //Natisnite rezultate. writeln(’ max= ’,X_max, ’ min= ’,X_min); konec; konec; konec.

Lekcija bo razložila algoritem za delo s postopki v Pascalu. Obravnavani bodo primeri uporabe postopka s parametri in brez njih. Seznani se s pojmi: formalni in dejanski parametri, parameter-spremenljivka in parameter-vrednost.


Podprogram je del kode, ki ima svoje ime in se ustvari, če je potrebno to kodo večkrat (več)krat izvesti. Podprogram je opisan enkrat pred začetkom glavnega programa (pred začetkom). Prevajalnik preskoči ta del kode, dokler ne naleti na "klic" podprograma v glavnem programu, kar je videti, kot da ga kliče po imenu (morda ime z argumenti, podanimi v oklepajih).

V mnogih programskih jezikih podprogrami obstajajo samo kot funkcije. Vendar v Pascalu je podprogram hkrati funkcija in postopek. Razlika med obema bo postala očitna v tej lekciji.

Torej razmislimo sintaksa za deklaracijo in opis postopka v Pascalu

var ...; (območje deklaracije globalne spremenljivke) ime postopka (parametri); (začetek postopka) var ...; (deklaracija lokalnih spremenljivk) začetek ... (telo postopka) konec; (konec postopka) začetek ... (glavni program) konec.

primer: Postopek brez parametrov, ki natisne 60 zvezdic, vsako v novo vrstico

postopek pr; var i:celo število; začni za i:=1 do 60 do začni (telo podprograma) write("*"); writeln; konec; konec; (konec podprograma) begin pr; (klic postopka) konec.

V tem primeru dela s proceduro v Pascalu je očitno, da bo prevajalnik preskočil blok opisa procedure in prišel do glavnega programa (9. vrstica kode). In šele ko naleti na klic procedure (vrstica 10), bo prevajalnik nadaljeval z njegovo izvedbo in se vrnil v vrstico 1.

Postopki s parametri. Dejanski in formalni parametri

Oglejmo si primer potrebe po uporabi postopka.

primer:
Zgradite figuro

Posebnost: Tri podobne figure.

  • splošno: dimenzije, kot zasuka
  • razlike: koordinate, barva
  • Algoritem rešitve:

    • označite enaka ali podobna dejanja (tri številke);
    • najti v njih splošno(dimenzije, oblika, kot zasuka) in razlike(koordinate, barva);
    • razlike zapišite v obliki neznanih spremenljivk, bodo parametri postopkov.

    Rešitev v Pascalu:
    Postopek:

    Program:

    15 uporablja GraphABC; procedure Tr( x, y: celo število ; barva: sistem. Risba . Barva ) ; začetek Premakni na (x, y); LineTo(x, y- 60) ; LineTo(x+ 100 , y) ; LineTo(x, y); FloodFill(x+ 20, y- 20, barva); konec ; začetek SetPenColor(clBlack) ; Tr(100 , 100 , clBlue) ; Tr(200 , 100 , clGreen) ; Tr(200 , 160 , clRed) ; konec.

    uporablja GraphABC; procedure Tr(x, y: celo število; barva:sistem.Risba.Barva); začetek Premakni na (x, y); LineTo(x, y-60); LineTo(x+100, y); LineTo(x, y); FloodFill(x+20, y-20,barva); konec; začetek SetPenColor(clBlack); Tr(100, 100, clBlue); Tr(200, 100, clGreen); Tr(200, 160, clRdeča); konec.

    Poglejmo si sintakso deklaracije in opisa postopka s parametri v Pascalu.

    var ...;(območje deklaracije globalne spremenljivke) procedure pr(parameter1, parameter2: celo število; parameter3:char); (začetek procedure) var ...; (deklaracija lokalnih spremenljivk) begin ... (telo procedure) end; (konec procedure) begin ... (glavni program) pr (parameter1, parameter2, parameter3 ); (klic postopka) konec.

    1. postopek: n navpične črte. n je določen s parametrom postopka.


    Postopek 2: Napišite postopek risanja n krogi premaknjeni vodoravno. n, polmer R in zamik O so določeni s parametri postopka (skupaj 3 parametri).

    primer: Napišite postopek, ki podani znak (vnesen s tipkovnice) natisne 60-krat, vsakega v novo vrstico

    Parametri postopka(v nekaterih jezikih se imenujejo argumenti) so navedeni v oklepaju za njegovim imenom (v deklaraciji).

    V tem primeru bomo kot vneseni znak uporabili parameter procedure. Formalni parameter postopka pri opisu navedeno v oklepajih. Navesti je treba vrsto formalnega parametra, ločenega z dvopičjem.

    Dejanski parameter je vrednost, ki je navedena v oklepaju pri klicu procedure. Dejanski parameter je lahko določena vrednost (dobesedno: število, znak, niz...) ali spremenljivka, ki jo bo prevajalnik nadomestil namesto formalnega parametra. Zato morata biti tip podatkov formalnega in dejanskega parametra postopka enak.

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 var s: char ; postopek pr(a: char) ; (a je formalni parameter) var i: celo število; začni za i: = 1 do 60 začni zapiši (a) ; writeln ; konec ; konec ; začetek pisanja ("simvol"); readln(s); pr(s); (s je dejanski parameter) konec.

    var s:char; postopek pr(a:char); (a je formalni parameter) var i:integer; začni za i:=1 do 60 začni pisati(a); writeln; konec; konec; začetek pisanja ("simvol"); readln(s); pr(s); (s je dejanski parameter) end.

    V tem primeru bo prevajalnik ob klicu procedure zamenjal formalni parameter a z dejanskim parametrom s, tj. znak, ki ga boste vnesli s tipkovnice. Oba parametra sta podatkovnega tipa char.

    Postopek naloge 3. Napišite postopek, ki sešteje poljubni dve števili (dva parametra).

    Postopki s parametri. Spremenljivi parameter

    1. način:
    2. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 var x, y, m, n: celo število; procedure MaxNumber(a, b: integer; var max: integer) ; (a in b sta parametra vrednosti, max je spremenljiv parameter) začni če a>b potem max: = a else max: = b; konec ; začnite pisati ("vvedite x,y" ) ; readln(x, y); Največje Število(x, y, m); (dejanski parametri) writeln ("max=", m) konec.

      var x,y,m,n:celo število; procedure MaxNumber(a,b:integer;var max:integer); (a in b sta parametra vrednosti, max je spremenljiv parameter) begin if a>b then max:=a else max:=b; konec; začetek pisanja ("vvedite x,y"); readln(x,y); Največje Število(x,y,m); (dejanski parametri) writeln("max=",m) end.

      V primeru se formalna parametra a in b uporabljata za shranjevanje primerjanih števil, spremenljivka parameter max pa za shranjevanje največjega števila obeh števil. Spremenljivi parameter ali izhodni parameter posreduje svojo vrednost glavnemu programu (dejanski parameter m), tj. vrne vrednost, medtem ko formalno parametri-vrednosti(vhodni parameter), nasprotno, vzame vrednosti iz glavnega programa (iz dejanskih parametrov x in y). Za spremenljiv parameter (max) se uporabijo tiste pomnilniške celice, ki so dodeljene ustreznemu parametru ob klicu procedure (celica m).

      Torej, oblikujmo koncepte:

      Če je navadna spremenljivka, ki označuje njen tip, določena kot formalni parameter, potem je takšen parameter parameter-vrednost oz vhodni parameter(a in b v primeru). Tip podatkov formalnega parametra vrednosti se mora ujemati s tipom podatkov njegovega dejanskega parametra (a in b se morata ujemati s tipoma podatkov x in y v parih).

      Če je pred imenom formalnega parametra v deklaraciji postopka funkcijska beseda var, potem se pokliče ta parameter spremenljivi parameter oz ob prostih dnevih parameter (največ v primeru). Uporablja tiste pomnilniške celice, ki so dodeljene ustreznemu parametru ob klicu procedure (m). Dejanski parameter, ki ustreza parametru spremenljivke, je lahko le spremenljivka (ne konstanta, ne literal ali izraz).

    3. način:
    4. Uporaba spremenljivih parametrov vam omogoča manjšo porabo pomnilnika

      1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 var x, y: celo število; postopek izmenjave (a: celo število; var b: celo število) ; (b - spremenljiv parameter ali izhodni parameter) var c: celo število; začni če a>b potem začni c: = a; a: = b; b: = c; (drugi parameter postopka - b - bo vedno največji) konec ; konec ; začni pisati( "vnesite dve številki") ; readln(x, y); menjava (x, y) ; writeln ("max=", y) konec.

      var x,y:celo število; izmenjava postopkov (a: celo število; var b: celo število); (b - parameter spremenljivke ali izhodni parameter) var c:integer; začni če a>b potem začni c:=a; a:=b; b:=c; (drugi parameter postopka - b - bo vedno največji) end; konec; begin writeln("vnesite dve številki"); readln(x,y); izmenjava(x,y); writeln("max=",y) konec.

      S to metodo reševanja problema smo brez tretjega parametra. Za to smo v postopku uporabili drugo lokalno spremenljivko c. Postopek spremeni vrednosti spremenljivk a in b tako, da je b vedno največji. Zato je v vrstici 15 programa drugi parameter (y), ki ustreza formalnemu parametru b, prikazan kot maksimum.

    Postopek naloge 4.

    1. S pomočjo zanke morate določiti največji skupni delitelj dveh vnesenih števil.
    2. Določiti je treba največji skupni delitelj dveh vpisanih števil s postopkom (dva vrednostna parametra, en spremenljiv parameter).


    Verbalni algoritem:

    • Predstavljen a in b(Na primer, 18 in 24 )
    • V zanki ponavljamo naslednje korake:
    • če A < b, nato spremenljivke zamenjamo (1. korak: a=24, b=18; 2. korak: a=18, b=6)
    • Spremenljivka a dodeli preostanek delitve a na b(1 korak: a=6, b=18; 2. korak: a=0, b=6)
    • Ko je ostanek 0 , se prikaže rezultat (vrednosti spremenljivk b) (b=6)

    Algoritem za reševanje iskanja GCD:

    Postopek naloge 5. S pomočjo postopkov sestavi lik:


    Postopek naloge 6. Podane so 3 različne matrike celih števil (vsaka velikost je 15 elementov). V vsakem nizu poiščite aritmetično sredino.
    Za oblikovanje elementov polja ter izračun vsote in aritmetične sredine uporabite en postopek (aritmetična sredina in vsota sta formalizirana kot spremenljiva parametra).

    Pri nalogah Pascal je pogosto treba zapolniti matriko s podatki in nato prikazati vrednosti na zaslonu. Zakaj ne bi avtomatizirali te naloge polnjenja in izpisa matrike – tj. formalizirati z uporabo postopkov in nato po potrebi uporabiti te postopke.

    primer: Ustvarite postopek za prikaz desetih elementov matrike (dva parametra: število elementov, matrika)

    Prikaži rešitev:

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 const n = 10; var i: celo število; a, b: polje [1 .. n] celega števila; postopek arr_out (k: celo število; arr: niz [ 1 .. n ] celega števila ) ; var i: bajt; začetek pisanja ("izhod matrike: " ); for i : = 1 to k do write (arr[ i] : 4 ) ; writeln ; konec ; začni za i: = 1 do n do a[ i] : = naključno(10) ; arr_out (n, a) ; konec.

    konst n = 10; var i:celo število; a, b: niz celih števil; postopek arr_out (k:celo; arr: niz celih števil); var i: bajt; začetek pisanja ("izhod matrike: "); for i:= 1 to k do write (arr[i]:4); writeln; konec; začni za i:=1 do n naredi a[i]:=naključno(10); arr_out(n, a); konec. celo število; procedure arr_rand (k: celo število; var arr: niz [ 1 .. n ] celega števila ) ; var i: bajt; začni pisati ( "Polnjenje matrike z naključnimi števili") ; randomizirati; for i : = 1 to k do arr[ i] : = random(100 ) ; konec ; začetek arr_rand (n, a) ; konec.

    konst n = 10; var a, b: niz celih števil; procedure arr_rand (k:celo; var arr: niz celih števil); var i: bajt; begin write("Polnjenje matrike z naključnimi števili"); randomizirati; for i:= 1 to k do arr[i]:=random(100); konec; začetek arr_rand(n, a); konec.

    Postopek naloge 7. Združite obe rešeni nalogi (za polnjenje in izpis matrike).


    Postopek naloge 8. Nalogi dodajte postopek za polnjenje vrednosti matrike s strani uporabnika (vnos vrednosti s tipkovnice). Izpišite dve različni matriki: eno z naključno ustvarjenimi vrednostmi, drugo z vrednostmi, ki jih vnese uporabnik.


    Postopek naloge 9. Izdelajte program s postopkom za izračun (vhodna parametra: število in stopnja). Za prikaz rezultata uporabite spremenljiv parameter.

    Samostojno delo

    Možnost 1: za 5 enodimenzionalnih nizov določite zmnožek elementov vsakega polja s postopkom z dvema parametroma - številom elementov polja in spremenljivim parametrom za prikaz produkta.

    Možnost 2: za 5 enodimenzionalnih nizov določi minimalni element vsakega polja s pomočjo postopka z dvema parametroma - številom elementov polja in spremenljivim parametrom za prikaz minimalnega elementa.

    * zapleteno S postopkom naključno ustvarite enodimenzionalne nize 10 elementov (vrednosti od -20 do +20). Kličite postopek, dokler se med vrednostmi ne pojavi nič.

    Pri reševanju novih problemov lahko poskusite uporabiti že napisane programe. Algoritem, ki je bil predhodno razvit in v celoti uporabljen kot del drugih algoritmov, se imenuje pomožni. Uporaba pomožnih algoritmov vam omogoča, da problem razdelite na dele in ga strukturirate.

    Celoten program lahko razdelimo na dva dela: glavni in pomožni. V glavnem delu se izvaja najpreprostejša obdelava informacij, organiziran je dostop do različnih pomožnih modulov (podprogramov).

    Pomožni algoritem lahko kliče tudi druge pomožne algoritme, dolžina takšne verige klicev je teoretično neomejena. Tu in v nadaljevanju se kot sinonimi uporabljajo naslednji pari besed: algoritem in program, pomožni algoritem in podprogram, ukaz in operater, program in modul. Pomožni in glavni algoritmi niso sami po sebi, ampak v povezavi drug z drugim.

    Pri uporabi pomožnih algoritmov je treba upoštevati način, na katerega se jim posredujejo vrednosti izvornih podatkov in rezultat, dobljen iz njih. Argumenti pomožnega algoritma so spremenljivke, v katere je treba umestiti začetne podatke za rešitev ustrezne podnaloge. Rezultati pomožnega algoritma so tudi spremenljivke, ki vsebujejo rezultate reševanja teh podproblemov, rezultat pa je lahko tudi določena akcija, ki jo računalnik izvede pod vplivom podprograma.

    Podprogrami so lahko dveh vrst: podprogrami brez parametrov in podprogrami s parametri. Podprogram je mogoče poklicati od koder koli v glavnem programu ali drugem podprogramu kolikokrat želite.

    Pri delu s podprogrami sta pomembna koncepta formalnih in dejanskih parametrov. Formalni parametri so vhodni identifikatorji za rutino. Če formalni parametri prejmejo določene vrednosti, se imenujejo dejanski. Formalni parametri lahko prejmejo določene vrednosti samo v programu, kjer se dostopa do danega modula podprograma. Vrsta in vrstni red zapisovanja dejanskih parametrov morata biti enaka formalnim parametrom. V nasprotnem primeru bo rezultat programa nepredvidljiv. Iz tega sledi, da se dejanski parametri uporabljajo pri dostopu do podprograma iz glavnega, formalni parametri pa se uporabljajo le v samem modulu.

    Podprogram s parametri se uporablja za beleženje ponavljajočih se dejanj z različnimi začetnimi podatki. Podprograme s parametri lahko razdelimo na dve vrsti: podprograme-funkcije in preprosto podprograme s parametri (imenujemo jih procedure).

    Pri sestavljanju podprogramov s parametri je treba upoštevati naslednja pravila:

    1) vsak podprogram ima svoje ime in seznam formalnih parametrov;

    2) proceduro iz glavnega programa pokliče klicni ukaz, ki se po obliki ne razlikuje od klicanja izvršilnega ukaza. Rezultat je dodeljen eni ali več spremenljivkam, ki so na seznamu formalnih parametrov. Toda rezultat seveda lahko niso samo vrednosti spremenljivk, ampak nekaj dejanj, ki jih izvede računalnik.

    Primer 1. Algoritem za iskanje največjega skupnega delitelja dveh naravnih števil uporabimo kot pomožni pri reševanju naloge: izdelamo program za odštevanje ulomkov (a, b, c, d so naravna števila). Rezultat predstavi kot navaden nezmanjšljiv ulomek.

    Podprogram.

    1) Vpiši naravna števila M, N.

    2) Če je M=N, pojdite na korak 5, sicer pojdite na naslednjo točko.

    3) Če je M>N, potem je M:=M-N, drugače N:=N-M.

    4) Pojdite na 2. korak.

    5) Posredujte vrednost M glavnemu programu.

    6) Konec podprograma.

    Glavni program.

    1) Vnesite vrednosti A, B, C, D.

    2) E:=A*D - B*C.

    4) Če je E=0, izpišite vrednost E in pojdite na korak 9, sicer pojdite na naslednji korak.

    5) M:=|E|, N:=F, pojdite na podprogram za izračun GCD.

    7) E in F popolnoma razdelite z G.

    8) Natisnite vrednosti E in F.

    9) Konec programa.

    Varianta A, B, C, D, G, E, F: celo število;

    Procedure Nod(M, N: Integer; Var K: Integer);

    Medtem ko je M<>N Naredi

    Če je M >

    Write("Vnesite števce in imenovalce ulomkov:");

    ReadLn(A, B, C, D);

    E:= A * D - B * C;

    Če je E = 0, potem WriteLn(E)

    Kimanje (Abs(E), F, G);

    WriteLn("Odgovor: ", E, "/", F)

    Kot je razvidno iz primera, sta deklaracija in telo podprogramov v razdelku z opisi. Glava podprograma vsebuje seznam formalnih parametrov z navedbo njihove vrste, ki jih lahko razdelimo na vhodne in izhodne parametre (pred njimi je storitev Var). Ko je postopek poklican, sta navedena njegovo ime in seznam dejanskih parametrov. Formalni in dejanski parametri se morajo ujemati po količini in vrsti.

    Postopek se imenuje na naslednji način:

    <Идентификатор (имя) процедуры>(<список фактических параметров>);

    npr.

    Kimanje (Abs(E), F, G);

    Glede na metodo prenosa dejanskih vrednosti v podprogram v Turbo Pascal 7.0 obstajajo spremenljivi parametri, parametri vrednosti, konstantni parametri in nizi odprtega tipa, nizi odprtega tipa, parametri postopka, parametri funkcije (podrobnosti v literaturi) .

    Funkcija (za razliko od procedure) vedno vrne eno samo vrednost.

    Pokažimo, kako se spremeni podprogram iz primera, če ga zapišemo kot funkcijo.

    Funkcija Nod(M, N: Integer) : Integer;

    Medtem ko je M<>N Naredi

    Če je M > N, potem M:= M - N Sicer N:= N - M;

    Torej, po seznamu parametrov je naveden tip vrednosti funkcije, v telesu funkcije pa je vsaj enkrat dodeljena spremenljivki, katere ime se ujema z imenom funkcije ustrezni vrednosti.

    Klic funkcije bo naslednji:

    G:= Kimanje(Abs(E), F);

    Na splošno je klic funkcije lahko prisoten v izrazu na desni strani operatorja dodelitve, v izhodni proceduri, kot dejanski parameter v klicu druge podprograme itd.

    Pri reševanju problemov je priporočljivo analizirati pogoj, zapisati rešitev v velikih blokih (ki niso Pascal operatorji), podrobno opisati vsakega izmed blokov (zapisati v obliki blokov, morda še vedno ne Pascal operatorjev) itd., nadaljevati dokler ni vsak od blokov implementiran z jezikovnimi operatorji.

    Primer 2. Dano je naravno število n. Zamenjaj prvo in zadnjo števko te številke.

    Če je nemogoče (N)

    Nato WriteLn("Številk ni mogoče preurediti, prišlo bo do prelivanja")

    WriteLn("Odgovor: ", N)

    Opozoriti je treba, da je treba podrobno opisati logično funkcijo Impossible, ki diagnosticira, ali je permutacija možna, in proceduro Change, ki (če je možna) izvede to permutacijo.

    Funkcija nemogoča (N: celo število) : Boolean;

    Če število (N)< 5

    Potem je nemogoče:= False

    Drugače nemogoče:= (N Mod 10 > 3) Ali

    (N Mod 10 = 3) In

    (N Mod 10000 Div 10 * 10 + N Div 10000 > MaxInt Mod 10000)

    Tukaj je treba podrobneje opisati funkcijo Number, ki vrne število števk v naravnem številu (ker funkcija Impossible vsebuje svoj klic, mora biti funkcija Number pred njo v razdelku opisa).

    Število funkcije (N: celo število) : celo število;

    Var Vsp: Celo število;

    Medtem ko je N > 0 Do

    Vsp:= Vsp + 1; N:= N Div 10

    Na koncu še zadnji postopek.

    Sprememba postopka (Var N: Integer);

    Var Kol, P, S, R: Celo število;

    Kol:= Število(N);

    P:= N Mod 10; (zadnja številka)

    Če je Kol > 1 Potem

    S:= N Div Round(Exp((Kol - 1) * Ln(10)))

    Sicer S:= 0; (prva številka)

    R:= N Mod Round(Exp((Kol - 1) * Ln(10))) Div 10;

    N:= P * Okroglo(Exp((Kol - 1) * Ln(10))) + R * 10 + S

    Možni so tudi podprogrami, ki kličejo sami sebe. Imenujejo se rekurzivni. Ustvarjanje takšnih podprogramov je lepa tehnika programiranja, vendar ni vedno priporočljiva zaradi prevelike porabe računalniškega pomnilnika.

    Primer 3. Poišči največjo števko v zapisu danega naravnega števila.

    program MaxDigit;

    Vnesite NaturLong = 1..(High(LongInt));

    Funkcija Maximum(N: LongInt) : Digit;

    Nato Največ:= N

    Drugače, če je N mod 10 > največ (N div 10)

    Nato Največ:= N mod 10

    Else Maximum:= Maximum(N Div 10)

    Write("Vnesite naravno število: ");

    WriteLn("Največja številka je ", Največ(A))

    Pri izdelavi funkcije Maximum je bilo upoštevano naslednje: če je število sestavljeno iz ene števke, je največje, sicer če zadnja cifra ni največja, jo je treba iskati med ostalimi števkami števila. Pri pisanju rekurzivnega algoritma je treba paziti na robni pogoj, ko se veriga rekurzivnih klicev prekine in se začne njeno obratno »odmotavanje«. V našem primeru je ta pogoj N< 10.

    Rekurzija je podrobneje obravnavana v naslednjem članku.

    Pri reševanju novih problemov lahko poskusite uporabiti že napisane programe. Algoritem, ki je bil predhodno razvit in v celoti uporabljen kot del drugih algoritmov, se imenuje pomožni. Uporaba pomožnih algoritmov vam omogoča, da problem razdelite na dele in ga strukturirate.

    Celoten program lahko razdelimo na dva dela: glavni in pomožni. V glavnem delu se izvaja najenostavnejša obdelava informacij, dostop do različnih pomožni moduli (podprogrami).

    Pomožni algoritem lahko kliče tudi druge pomožne algoritme, dolžina takšne verige klicev je teoretično neomejena. Tu in v nadaljevanju se kot sinonimi uporabljajo naslednji pari besed: algoritem in program, pomožni algoritem in podprogram, ukaz in operater, program in modul. Pomožni in glavni algoritmi niso sami po sebi, ampak v povezavi drug z drugim.

    Pri uporabi pomožnih algoritmov je treba upoštevati način, na katerega se jim posredujejo vrednosti izvornih podatkov in rezultat, dobljen iz njih. Argumenti pomožnega algoritma to so spremenljivke, v katere je treba umestiti začetne podatke za rešitev ustrezne podnaloge. Rezultati pomožnega algoritma to so tudi spremenljivke, ki vsebujejo rezultate reševanja teh podproblemov, rezultat pa je lahko tudi določeno dejanje, ki ga računalnik izvede pod delovanjem podprograma.

    Podprogrami so lahko dveh vrst: podprogrami brez parametrov in podprogrami s parametri. Podprogram je mogoče poklicati od koder koli v glavnem programu ali drugem podprogramu kolikokrat želite.

    Pri delu s podprogrami so pomembni naslednji koncepti: formalni in dejanski parametri. Formalni parametri To so identifikatorji vhodnih podatkov za podprogram. Če formalni parametri prejmejo določene vrednosti, se pokličejo dejansko. Formalni parametri lahko prejmejo določene vrednosti samo v programu, kjer se dostopa do danega modula podprograma. Vrsta in naročilo vnosi za dejanske parametre morajo biti enaki tistim za formalne parametre. V nasprotnem primeru bo rezultat programa nepredvidljiv. Iz tega sledi, da se dejanski parametri uporabljajo pri dostopu do podprograma iz glavnega, formalni parametri pa se uporabljajo samo v samem modulu.

    Podprogram s parametri se uporablja za beleženje ponavljajočih se dejanj z različnimi začetnimi podatki.

    Pri sestavljanju podprogramov s parametri je treba upoštevati naslednja pravila:

    1) vsak podprogram ima svoje ime in seznam formalnih parametrov;

    2) proceduro iz glavnega programa pokliče klicni ukaz, ki se po obliki ne razlikuje od klicanja izvršilnega ukaza. Rezultat je dodeljen eni ali več spremenljivkam, ki so na seznamu formalnih parametrov. Toda rezultat seveda lahko niso samo vrednosti spremenljivk, ampak nekaj dejanj, ki jih izvede računalnik.

    Primer 1. Kot pomožni pri reševanju naloge uporabimo algoritem za iskanje največjega skupnega delitelja dveh naravnih števil: izdelamo program za odštevanje ulomkov ( a, b, c, d naravna števila). Rezultat predstavi kot navaden nezmanjšljiv ulomek.

    Podprogram.

    1. Vnesite naravna števila M, N.
    2. Če je M=N, pojdite na korak 5, sicer pojdite na naslednjo točko.
    3. Če je M>N, potem M:=M-N, drugače N:=N-M.
    4. Pojdite na 2. korak.
    5. Posredujte vrednost M glavnemu programu.
    6. Konec podprograma.

    Glavni program.

    1. Vnesite vrednosti A, B, C, D.
    2. E:=A*D - B*C.
    3. F:=B*D.
    4. Če je E=0, izpišite vrednost E in pojdite na korak 9, sicer pojdite na naslednji korak.
    5. M:=|E|, N:=F, pojdite na podprogram za izračun GCD.
    6. G:= M.
    7. E in F popolnoma razdelite z G.
    8. Natisnite vrednosti E in F.
    9. Konec programa.

    Kot je razvidno iz primera, se deklaracija podprograma funkcije nahaja v razdelku opisov prototipov funkcij, izvedba pa za glavno funkcijo glavni. Glava podprograma vsebuje seznam formalnih parametrov z navedbo njihove vrste, ki jih lahko razdelimo na vhodne in izhodne parametre (pred njimi je &). Na splošno se pri klicanju funkcije s seznamom parametrov brez & uporabijo kopije parametrov znotraj funkcije, ki se po izvedbi izbrišejo. Znak & pove prevajalniku, da je treba uporabiti spremenljivko samo in ne njene kopije. Pri klicu funkcije se določi njeno ime in seznam dejanskih parametrov. Formalni in dejanski parametri se morajo ujemati po količini in vrsti.

    Opis funkcije v C++ je naslednji:

    povratna_vrednost_tip();

    npr.

    Void Nod(int e, int f, int &k); int f1(float a); dolgo f2();

    Funkcija vedno vrne eno samo vrednost. Kot lahko vidite iz primera 1, smo uporabili tip praznina kot povratni tip. Tisti. je prevajalniku nakazal, da naša funkcija ne vrne nobene vrednosti.

    Pokažimo, kako se bo podprogram iz primera spremenil, če je napisan kot funkcija, ki sama vrne vrednost GCD (brez uporabe povratne spremenljivke).

    Int Nod(int m, int n) ( while (m!=n) if (m > n) m -=n; else n -= m; return (n); )

    Torej je v telesu funkcije vsaj en ukaz za vrnitev, ki določa, katero vrednost vrniti kot vrednost funkcije.

    Klic funkcije v glavnem bo naslednji:

    G = Nod(fabs(e), f);

    Na splošno je klic funkcije lahko prisoten v izrazu: na desni strani operacije dodelitve, v izhodnem stavku, kot dejanski parameter pri klicu druge podprograme itd.

    Pri reševanju problemov je priporočljivo analizirati pogoj, zapisati rešitev v velikih blokih (ki niso stavki C++), podrobno opisati vsakega od blokov (zapisano v obliki blokov, morda še vedno niso stavki C++) itd., nadaljevati dokler ni vsak od blokov implementiran z jezikovnimi operatorji.

    Primer 2. Dano naravno število n. Zamenjaj prvo in zadnjo števko te številke.

    Tukaj je treba podrobneje opisati funkcijo Number, ki vrne število števk v naravnem številu (ker funkcija Impossible vsebuje svoj klic, mora biti funkcija Number pred njo v razdelku opisa prototipa).

    Možni so tudi podprogrami, ki kličejo sami sebe. Imenujejo se rekurzivno. Ustvarjanje takšnih podprogramov je lepa tehnika programiranja, vendar ni vedno priporočljiva zaradi prevelike porabe računalniškega pomnilnika.

    Primer 3. Poišči največjo števko v zapisu danega naravnega števila.

    Pri izdelavi funkcije Maximum je bilo upoštevano naslednje: če je število sestavljeno iz ene števke, je največje, sicer če zadnja cifra ni največja, jo je treba iskati med ostalimi števkami števila. Pri pisanju rekurzivnega algoritma je treba paziti na robni pogoj, ko se veriga rekurzivnih klicev prekine in se začne njeno obratno »odmotavanje«. V našem primeru ta pogoj n

    Rekurzija je podrobneje obravnavana v naslednjem članku.

    Testna vprašanja in naloge
    1. Katere algoritme imenujemo pomožni algoritmi?
    2. Koliko pomožnih algoritmov je lahko prisotnih v glavnem algoritmu?
    3. Ali se lahko pomožni algoritmi, napisani za rešitev tega problema, uporabijo za reševanje drugih problemov, kjer bi bila njihova uporaba primerna?
    4. Kateri parametri se imenujejo formalni? dejansko?
    5. Kakšno ujemanje je treba upoštevati med formalnimi in dejanskimi parametri?
    6. Ali je lahko dejanskih parametrov postopka (funkcije) več kot formalnih? Kaj pa manj?
    7. Ali obstajajo podprogrami brez parametrov?
    8. Ali obstajajo kakšne omejitve glede števila parametrov podprograma? Če ne, kako je potem to število omejeno v C++?
    9. V katerem razdelku so podprogrami deklarirani in implementirani v C++?
    10. Kakšne vrste je lahko vrednost funkcije?
    11. Pojasnite metodo sekvenčnega detajliranja pri razvoju programa.
    12. Kateri podprogrami se imenujejo rekurzivni?
    13. Kaj je robni pogoj pri organizaciji rekurzivne podprograme?

    Poglavje 17. Ukazi za klic postopkov

    Kaj je podprogram

    Podprogram je samostojen računalniški program, vključen v kompleksnejši program (v razmerju do podprograma deluje kot glavni ali klicni program). Podprogram lahko pokličete kjer koli v glavnem programu (pogosteje pravijo "pokliči podprogram"). V tem primeru mora procesorsko jedro iti na naslov prvega ukaza podprograma in se po njegovem zaključku vrniti na naslov glavnega programskega ukaza, ki sledi ukazu za klic podprograma.

    Najpogosteje se navajata dva argumenta v prid uporabi podprogramov v tehnologiji programiranja - prihranek prostora v RAM-u in modularnost strukture programa. Podprogram, v katerem je kodiran določen algoritem, je mogoče klicati večkrat in s tem prihraniti prostor v RAM-u, vendar se v tem smislu podprogram ne razlikuje veliko od zanke. Še pomembneje pa je, da podprogrami omogočajo strukturno razdelitev programa za reševanje kompleksnega problema na manjše module, ki rešujejo posamezne podnaloge. Ta modularnost strukture velikega programa močno olajša njegov razvoj.

    Mehanizem za podporo delu s podprogrami mora vsebovati dve glavni vrsti ukazov - ukaz za klic podprograma in ukaz za vrnitev podprograma. Ukaz za klic podprograma mora omogočiti prehod na prvi ukaz klicanega podprograma, ukaz za vrnitev pa mora zagotoviti prehod na ukaz klicnega programa, ki sledi ukazu klica. Ukazi spadajo v kategorijo ukazov, ki nadzorujejo izvajanje programa.

    Na sl. Slika 17.1a prikazuje primer uporabe podprograma. V tem primeru je glavni program, ki se nahaja v RAM-u, z začetkom na naslovu 4000. V glavnem programu je klic podprograma PROC1, ki se nahaja v RAM-u, z začetkom na naslovu 4500. Ko med izvajanjem glavnega programa procesorsko jedro doseže ta ukaz, bo prekinilo izvajanje glavnega programa in nadaljevalo z izvajanjem podprograma PROC1, pri čemer bo njegov začetni naslov 4500 postavil v programski števec. Telo podprograma PROC1 vsebuje dva ukaza za klic podprograma PROC2, ki se nahaja v RAM-u, z začetkom na naslovu 4800. Ko doseže vsakega od teh ukazov, bo jedro procesorja prenehalo z izvajanjem podprograma PROC1 in začelo izvajati podprogram PROC2. Ko v podprogramu naleti na ukaz RETURN, se procesorsko jedro vrne k klicnemu programu in nadaljuje z izvajanjem od ukaza, ki sledi ukazu CALL, ki je povzročil prehod na pravkar zaključen podprogram. Ta postopek je shematično prikazan na sl. 17.1. 6.

    Treba je biti pozoren na naslednje točke:

    podprogram je mogoče poklicati od koder koli v drugih programih
    moduli. Takšnih klicev je lahko poljubno število.

    en podprogram je mogoče poklicati iz drugega, tega pa pokliče tretji. Se imenuje gnezdenje(gnezdenje) klice. Globina vgnezdenja je teoretično lahko poljubna.

    pri vračanju iz podprograma mora biti zagotovljen prehod
    točno na klicni ukaz, ki je sprožil zaključeno sejo izvajanja podprograma.



    riž. 17.1. Ugnezdeni klic podprograma:

    a - klicni in povratni ukazi; b - zaporedje izvajanja ukazov

    Iz vsega tega sledi, da mora procesorsko jedro pri izvajanju ukaza za klic podprograma nekako shraniti povratni naslov (to je naslov ukaza klicnega programa, ki sledi ukazu za klic, ki se izvaja). Svoj povratni naslov lahko shranite na tri mesta:

    register procesorja;

    začetni naslov podprograma;

    zgornja celica sklada.

    Razmislite o strojnem ukazu CALL X, ki se razlaga kot "klicanje podprograma, ki se nahaja na naslovu X." Če se za shranjevanje povratnega naslova uporablja register Rn, mora izvajanje ukaza CALL X potekati na naslednji način (PC je števec ukazov jedra procesorja):

    V tem vnosu je D dolžina trenutnega ukaza. Povratni naslov se nato konča v registru Rn, od koder ga lahko klicani podprogram pridobi in shrani nekje v RAM za kasnejšo vrnitev klicnemu programu.

    Če je sprejeta odločitev, da se povratni naslov shrani na začetni naslov klicane podprograme, bo moralo jedro procesorja pri izvajanju ukaza CALL X izvesti naslednje operacije:

    To je precej priročno, saj je povratni naslov vedno shranjen na mestu, ki ga podprogram (natančneje, njegov razvijalec) točno pozna.

    Oba opisana pristopa sta izvedljiva in se uporabljata v praksi. Njihova edina, a precej pomembna pomanjkljivost je nezmožnost izvajanja ponovni vstop podprogrami Ponovna vnosna narava podprograma pomeni, da ga je mogoče znova poklicati, preden se trenutni klic zaključi. To se na primer zgodi, če je znotraj podprograma poklican drug podprogram, ki pokliče prvega. Podprogrami, ki izvajajo rekurzivne algoritme, morajo biti prav tako vnovični.

    Bolj splošen in zanesljivejši pristop je uporaba povratnega naslova sklada za shranjevanje. Ko procesorsko jedro izvede navodilo za klic podprograma, se povratni naslov postavi v zgornjo celico sklada, in ko izvede ukaz za vrnitev, izloči ta naslov iz zgornje celice sklada.

    Zloženke

    Stack je seznam podatkovnih elementov, običajno besed ali bajtov, katerih dostop je omejen z naslednjim pravilom: elemente tega seznama je mogoče dodati samo na konec in odstraniti samo s konca. Konec seznama se imenuje vrh sklada, njegov začetek pa dno. Ta struktura se včasih imenuje trgovina. Predstavljajte si kup pladnjev v jedilnici. Stranke jemljejo pladnje z vrha, delavci v kavarni pa dodajo čiste pladnje in jih položijo na vrh kupa. Ta mehanizem shranjevanja je dobro opisan s privlačnim izrazom »zadnji vstopi, prvi ven« (LIFO), kar pomeni, da je zadnji podatkovni element, ki je potisnjen na sklad, prvi odstranjen iz njega. Operacija postavitve novega elementa na sklad se pogosto imenuje potiskanje, operacija izločanja zadnjega elementa iz sklada pa se imenuje popping it.

    Podatki, shranjeni v glavnem pomnilniku računalnika, so lahko organizirani v skladu, tako da so zaporedni elementi postavljeni drug za drugim. Predpostavimo, da je prvi element shranjen na naslovu BOTTOM in ko so novi elementi potisnjeni v sklad, so razvrščeni v padajočem vrstnem redu zaporednih naslovov. Tako sklad raste v smeri zmanjševanja naslovov, kar je zelo pogosta praksa.

    Na sl. Slika 17.2 prikazuje, kako je v pomnilniku računalnika nameščen sklad, katerega elementi zasedajo po eno besedo.

    Na dnu vsebuje številsko vrednost 43, na vrhu pa 28. Za sledenje naslovu vrha sklada se uporablja register jedra procesorja, imenovan Kazalec sklada (SP). To je lahko eden od registrov splošnega namena ali register, posebej zasnovan za ta namen.


    riž. 17.2. Sklad besed v RAM-u

    Ob predpostavki, da je RAM bajtno naslovljiv in je beseda dolga 32 bitov, se lahko operacija potiska sklada izvede na naslednji način:

    Premakni NEWITEM.(SP),

    kjer ukaz odštevanja odšteje izvorni operand 4 od operanda rezultata v registru SP in rezultat postavi v register SP. Ta dva ukaza potisneta besedo, shranjeno na naslovu NEWiTEM, na vrh sklada, pri čemer najprej zmanjšata kazalec sklada za 4. Operacijo izpiranja iz sklada lahko izvedete takole:

    Ta dva ukaza premakneta vrednost, shranjeno na vrhu sklada, na drugo mesto v RAM-u na naslov ITEM in nato zmanjšata kazalec sklada za 4, da kaže na element, ki je zdaj na vrhu sklada. Rezultat izvajanja vsake od teh operacij na skladu, prikazanem na sl. 17.2, prikazano na sl. 17.3.



    riž. 17.3. Rezultat operacij sklada

    Če arhitektura podpira načine naslavljanja s samodejnim inkrementalnim in samodejnim zmanjševanjem, ukaz zadostuje za vnos novega elementa v sklad

    Premakni NEWITEM,-(SP),

    in izstrelitev elementa iz sklada lahko izvedete z ukazom

    Premakni (SP)+,ITEM.

    Ko sklad uporablja program, mu je običajno dodeljeno fiksno število lokacij RAM. V tem primeru se morate prepričati, da program ne poskuša potisniti novih elementov na sklad, ki je dosegel največjo velikost. Poleg tega ne sme poskušati izstreliti elementa iz praznega sklada, kar bi se zgodilo v primeru logične napake.

    Predpostavimo, da je sklad napolnjen od naslova 2000 (SPODAJ) do 1500 in več. Na začetku je register, ki deluje kot kazalec sklada, naložen z vrednostjo 2004. Spomnimo se, da se pred potiskanjem novega podatkovnega elementa v sklad vsakič odšteje 4 od vrednosti SP. Zato začetna vrednost 2004 pomeni, da je prvi element sklada bo imel naslov 2000. Za preprečitev poskusov potiskanja elementa v polni sklad ali odstranjevanja elementa iz praznega sklada je potrebna določena zapletenost pri izvajanju operacij potiskanja in izpiranja elementa. Za izvedbo vsake od teh operacij zgornji ukaz ni dovolj - zamenjati ga je treba z zaporedjem ukazov, podanim v tabeli 17.1.

    Ukaz Primerjaj src,dst primerjava izvede operacijo in nastavi zastavice pogojev glede na rezultat. Ne spremeni vrednosti nobenega od operandov. Fragment a tabele 17.1 prikazuje izstrelitev elementa iz sklada, fragment b iste tabele pa postavitev elementa na sklad med spremljanjem praznega in polnega sklada pri izvajanju potiskanja in izpiranja elementa.

    Tabela 17.1

    Oznaka Ekipa Operandi
    mob_info