Procedury a funkce v Pascalu. Rekurze. Podprogramy Úkol často vyžaduje opakování určité sekvence příkazů v různých částech programu. Procedury a funkce Prezentace procedur a funkcí

Rekurze v Pascalu Učitel: Tlekhurai Yu.V. Městský vzdělávací ústav "Lyceum č. 8" Co na obrazech vidíte? Tento fenomén v umění se nazývá rekurze "Abyste porozuměli rekurzi, musíte nejprve porozumět rekurzi." rekurze - částečná definice objektu přes sebe, definice objektu pomocí dříve definovaných. Vědecky řečeno: Rekurze - metoda definování třídy objektů nebo metod tak, že se nejprve specifikuje jeden nebo více (obvykle jednoduchých) jejích základních případů nebo metod a na jejich základě se pak specifikují pravidla pro konstrukci definované třídy. Peter Deutsch Peter Deutsch

Lidská iterace.

Rekurze je od Boha.

Rekurze ve fyzice Rekurze v jazyce a literatuře Klasickým příkladem nekonečné rekurze je dvě zrcadla umístěná proti sobě: z doznívajících odrazů zrcadel se v nich tvoří dvě chodby. Dalším příkladem nekonečné rekurze je efekt samobuzení (pozitivní zpětná vazba) y elektronické obvody získat, když signál z výstupu dosáhne vstupu, je zesílen, opět dosáhne vstupu obvodu a je opět zesílen. Zesilovače, pro které je tento provozní režim standardní, se nazývají samooscilátory. Příklad rekurzivního slovníkového hesla: „Kněz měl psa...“ - typická rekurze Několik příběhů Stanislawa Lema je věnováno incidentům s nekonečnou rekurzí: Příběh o hrobech („Hvězdné deníky Johna Tichého“), ve kterém hrdina postupně přechází od článku o hrobech k článku o sepulcarii, odtud k článku o sepulcaria, který opět obsahuje odkaz na článek „sepulcaria“. Příběh o inteligentním stroji, který měl dostatek inteligence a lenosti postavit podobný, aby vyřešil daný problém, a svěřil mu řešení (výsledkem byla nekonečná rekurze, kdy každý nové auto postavila jí podobnou a předala jí úkol). Rekurze v programování je způsob organizace výpočetního procesu, ve kterém procedura nebo funkce odkazuje sama na sebe během provádění svých základních operátorů. Aby takové volání nebylo nekonečné, musí text podprogramu obsahovat podmínku, po jejímž dosažení nedojde k žádnému dalšímu volání. rekurzivní volání tedy může být zahrnuto pouze do jedné z větví podprogramu. Příklad. Výpočet faktoriálu přirozeného čísla Vytvořte rekurzivní funkci, která vypočítá faktoriál čísla n následovně: function f (n: integer): longint; begin if n = 1 then f:= 1 else f:= n * f(n -1); (funkce f volá sama sebe) konec programu Pascal pomocí rekurze: Var n: integer; a: longint; faktoriál funkce (n: celé číslo): longint; begin if n = 1 then faktoriál:= 1 jinak faktoriál:= n * faktoriál (n -1); Konec; Begin Write(‘n=’); Readln(n); A:= faktoriál(n); Napište(‘n!=’,a); Readln; konec. Leonardo z Pisy Fibonacci

Fibonacciho čísla jsou prvky číselné řady

0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, ..., přičemž každé následující číslo je rovno součtu dvou předchozích.

Úkol: Zobrazte řadu Fibonacciho čísel skládající se z n prvků. Popis proměnných: n – počet prvků řady; a, b – hodnoty posledních dvou prvků řady; c – proměnná buffer („náhradní“); i – čítač. Algoritmus pro řešení úlohy: 1. Získejte hodnotu n. 2. Přiřaďte a a b hodnoty 0 a 1 (toto jsou první čísla Fibonacciho řady). Zobrazte je na obrazovce. 3. Začněte od 3. prvku k n: a) zobrazte součet a a b, b) uložte hodnotu proměnné b do c, c) zapište součet a a b do b, d) přiřaďte a hodnotu C. Program Pascal pomocí iterace: program Fibonacci; var a,b,c,i,n: celé číslo; začít napište("n = "); readln(n); a:= 0; napsat," "); b:= 1; napsat(b," "); pro i:=3 až n začínají napsat(a+b," "); c:= b; b:= a + b; a:=c; konec; readln; konec. Program Pascal využívající rekurzi: Rekurzivní definice pro výpočet Fibonacciho čísel je následující: Tuto definici Fibonacciho čísel lze snadno převést na rekurzivní funkci: function f(n: Integer) : longint; začít Pokud n<= 1 Then f:= n else f:= f(n– 1) + f(n - 2); end; Program chislaFibonacci; var n,i: integer; a: longint; function fib (n: integer): longint; begin If n <= 1 Then fib:= n else fib:= fib(n– 1) + fib(n - 2); End; begin write(‘n=’); readln(n); for i:=0 to n do begin A:= fib (n); write (‘ ’,a); end; readln; end. Домашнее задание Написать программу нахождения НОД двух натуральных чисел, используя алгоритм Евклида и рекурсию Даны два натуральных числа A A b. Li A= b, pak uzel ( A,b) = a. Li A>b, pak uzel ( A,b) = uzel ( a -b,b). Li A< b, pak uzel ( A,b) = uzel ( A,b-a). Program noddvyxchisel; var a,b: longint; funkce nod(a,b:longint): longint; begin If a = b Then nod:= a else if a>b then nod:= nod(a-b,b) else nod:= nod(a,b-a) End; begin write('a='); readln(a); write('b='); readln(b); A:= nod(a,b); napsat(‘kývnout=‘,a); readln; konec. Problém s Hanojskými věžemi. V tomto případě je třeba přísně dodržovat následující pravidla:

  • Najednou lze přesunout pouze jeden disk;
  • větší disk nelze umístit menší disk;
  • vyjmutý disk musí být nasazen na jakýkoli kolík před vyjmutím druhého disku.
  • Tvrdě pracující buddhističtí mniši nosí disky z věže na věž ve dne i v noci. Legenda tvrdí, že až mniši dokončí svou práci, přijde konec světa. Dalo by se spočítat, že řešení problému se 64 disky by vyžadovalo 264–1 tahů. Proto, pokud jde o konec světa, ten nastane po pěti miliardách století, vezmeme-li v úvahu, že se jeden disk pohne za jednu sekundu. Problém i legendu k němu však vymyslel v roce 1883 matematik Edouard Lucas z College of Saint-Louis.

Jedna ze tří diamantových věží nese 64 kulatých zlatých kotoučů. Disky mají různé poloměry a jsou umístěny na věži v sestupném pořadí poloměrů od základny nahoru. Je nutné přenést disky z první věže do druhé, v případě potřeby použít třetí věž.

Úkol. Vytvořte rekurzivní program, který by vyřešil výše položený problém o Hanojských věžích s počtem disků rovným n (n = 1, 2, ...). Řešení. Zadáme jména věží: a, b, c. Nechat Hanoj ​​(n,a,b,c)- požadovaná funkce, která vrací sekvenci pohybů disků s A na b použitím C podle výše popsaných pravidel. Když n=1 víme, jak problém vyřešit. Stačí provést operaci „přesunout“. A na b" Předpokládejme, že tento problém můžeme vyřešit pro n – 1 disků. Přesunout n–1 disků z A na S. Poté přesuňte zbývající disk A na b a nakonec přesunout n–1 disků z C na b. Vstupní data: počet disků na kolíku a; Výstup: sekvenování; Krok0:(definujte typ proměnné); Krok 1: (popis hanojské procedury, která zobrazuje sekvenci akcí); Krok 1.1: (přesun (n-1) disků z kolíku a na kolík b); Krok 1.2: (přesuňte n-tý disk z a do c); Krok 1.3: (přesuňte (n-1) disk z b do c); (kroky 1.2-1.3 se provádějí rekurzivně); Krok 2: (hlavní program); Krok 2.1: (zadejte počet disků); Krok 2.2: (volání hanojské procedury). Řešení problému v Pascal Program bahnya; var n: celé číslo; a,b,c: char; procedure hanoi(n: integer;a,b,c: char); begin if n>0 then begin hanoi(n-1,a,c,b); writeln ("Peremestit disk so sterzhnya ",a," na sterzhen" ",b); hanoi(n-1,c,b,a); konec; konec; Začátek zápisu ("Vvedite naturalnoe chislo n"); readln ( n); a:="a"; b:="b"; c:="c"; hanoi (n,a,c,b); readln; end. Domácí úkol Napište program pro výpočet stupně s přirozeným exponent Dán: základ stupně X Exponent Na Pokud k=0, pak stupeň(k,x)=1, Jinak stupeň(k,x)= x· stupeň(k-1,x) Program stepen; var y: skutečný; n:integer; funkce step(k:integer, x:real): real; begin If k = 0 Then step:= 1 else step:= x * step(k-1,x) End; begin write(‘vvedite osnovanie stepeni x=’); readln(y); write(‘vvedite pokazatel stepeni k=’); Readln(n); write(‘x v stepeni k=’,step(n,y)); readln; konec. Samostatná práce

  • Najděte součet číslic čísla
  • Určete, zda je dané přirozené číslo prvočíslo
  • Najděte první číslici čísla
  • Převeďte přirozené číslo z desítkové s.s. na binární
  • Najděte součet prvků celočíselného pole skládajícího se z 20 prvků
  • Prohoďte hodnoty dvou celých čísel
  • Uspořádejte hodnoty tří proměnných a, b, c ve vzestupném pořadí
  • Najděte počet číslic v přirozené číslo n
  • Najděte největší ze tří daných čísel
  • Najděte počet kladných čísel mezi čtyřmi A, B, C, D
Odpovědi pro samostatnou práci č. 2 Program jednoduchý; var n, m, s: celé číslo; funkce prost(m, n:integer): boolean; begin If n = m Pak prost:= true else prost:= (n mod m<>0) a prost (m+l, n); Konec; begin write('n='); Readln(n); M:=2; If prost(m,n) then write (n,’prostoechislo’) Else write (n,’sostavnoe’); readln; konec.

překlad programů;

procedura dvd(n:longint);

Jestliže n >1 Pak dvd (n div 2);

write(n mod 2);

Podprogramy Úkol často vyžaduje opakování určité sekvence příkazů v různých částech programu. Aby bylo možné tuto sekvenci jednou popsat a mnohokrát ji použít, používají programovací jazyky podprogramy. Podprogram je speciálně navržený blok programu pro jeho následné opakované použití v hlavním programu Použití podprogramů umožňuje implementovat jednu z nejmodernějších metod programování - strukturované programování


Podprogramy řeší tři důležité problémy, které značně usnadňují programování: 1. eliminují nutnost opakovaně opakovat podobné fragmenty v textu programu, tzn. snížit velikost programu; 2. zlepší strukturu programu a usnadní jeho pochopení při analýze; 3.snížit pravděpodobnost chyb, zvýšit odolnost vůči programovacím chybám a nepředvídatelným následkům při úpravách.


Procedury a funkce V Pascalu existují dva typy podprogramů: procedura (PROCEDURE) a funkce (FUNCTION). Procedury a funkce v Pascalu jsou deklarovány v deklarační sekci za sekcí proměnných. NázevProgramu; VAR ... // sekce pro popis proměnných hlavního programu; procedura Název_procedury; var ... begin ...//Procedura body end; begin //tělo hlavního programu konec.


Funkce a procedury mají parametry (proměnné, které předávají hodnotu). Jsou dvojího typu: 1) Formální – ty, které jsou v popisu podprogramu 2) Skutečné – ty, které jsou přeneseny z hlavního programu do funkce nebo procedury. Skutečné parametry musí odpovídat formálním co do množství, pořadí a druhu.




Procedury Procedury se používají, když podprogram potřebuje získat více výsledků. V Pascalu existují dva typy procedur: procedury s parametry a bez parametrů. Procedura je přístupná pomocí názvu procedury, po kterém mohou následovat skutečné parametry. Když je zavolána procedura, vytvoří se vzájemná korespondence mezi skutečnými a formálními parametry a poté se řízení přenese na proceduru. Po provedení procedury se řízení předá dalšímu operátorovi volajícího programu po zavolání procedury.


Příklad 1: Procedura bez parametrů, která tiskne řetězec 60 hvězdiček. postup pr; var i: integer ; begin for i:=1 až 60 do write (* "); writeln; end; begin pr; end.


Příklad 2. Vytvořte program pro záměnu dvou čísel c=5 a d=7 program obmenDan; var c,d:integer; výměna procedur (a,b:integer); var m:integer; začít m:=a; a:=b; b:=m; writeln(a,b); konec; begin writeln("Zadej 2 čísla: "); readln(c,d); výměna(c,d); writeln(c," ",d); konec. c5 d 7 a 5 b 7 1) při volání procedury obmen se dvěma parametry 5 a 7 se do proměnných a a b umístí stejná čísla 5 a 7: 2) pak v proceduře hodnoty paměťových buněk a a b jsou přeskupeny: c5 d 7 a 7 b 5 3) ale v proměnných c a d se data nezměnila, protože jsou v jiných paměťových buňkách


Aby proměnné c a d, a a b odkazovaly na stejné paměťové buňky (pokud se změní hodnoty a a b, změní se i hodnoty c, d), při popisu formálních parametrů se je nutné přidat slovo VAR před požadované proměnné: procedure exchange (var a,b:integer); с5 d 7 a b


Příklad 3. Jsou dána 3 různá pole celých čísel (velikost každého nepřesahuje 15). V každém poli najděte součet prvků a aritmetický průměr. program proc; var i, n, součet: celé číslo; sr: skutečný; procedura práce (r:integer; var s:integer; var s1:real); var mas: pole integer ; j:integer; začít s:=0; for j:=1 to r do begin read (mas[j]); s:=s+mas [j]; konec; s1:=s/r; konec;


(hlavní program) begin for i:=1 až 3 do begin write ("Vvedite razmer",i, "masiva: "); readln(n); práce(n, součet, sr); (volání procedury práce) writeln ("Summa elementov = ",součet); writeln("Srednearifmeticheskoe = ",sr:4:1); konec; konec.


Výsledek programu: Program třikrát vyvolá pracovní proceduru, ve které jsou formální proměnné r, s, s1 nahrazeny skutečnými n, sum, sr. Procedura zadá prvky pole, vypočítá součet a průměr. Proměnné s a s1 jsou vráceny do hlavního programu, takže před jejich popis je umístěno servisní slovo var. Lokální parametry mas, j jsou platné pouze v proceduře. Globální - i, n, suma, sr jsou dostupné v celém programu.


Funkce v Pascalu Sada vestavěných funkcí v jazyce Pascal je poměrně široká (ABS, SQR, TRUNC atd.). Pokud je v programu zahrnuta nová, nestandardní funkce, musí být popsána v textu programu, poté je z programu přístupná. Funkce je přístupná na pravé straně operátoru přiřazení s uvedením názvu funkce a skutečných parametrů. Funkce může mít své vlastní lokální konstanty, typy, proměnné, procedury a funkce. Popis funkcí v Pascalu je podobný popisu procedur.




Příklad 4. Napište funkci podprogramu stupně a x, kde a, x jsou libovolná čísla. Použijme vzorec: a x = e x ln a program p2; var f, b, s, t, c, d: skutečný; (globální proměnné) function stp (a, x: real) : real; var y: skutečný; ( lokální proměnné) begin y:= exp (x * ln (a)) ; stp:= y;(přiřazení názvu funkce výsledku výpočtů podprogramu) end; (popis funkce dokončen) begin d:= stp (2.4, 5); (výpočet mocnin různých čísel a proměnných) writeln (d, stp (5,3.5)); read(f, b, s, t); c:= stp (f, s) + stp (b, t); writeln(c); konec.


Funkce Podprogram je část programu, navržená jako samostatná syntaktická struktura a opatřená názvem (samostatný programový blok), pro řešení jednotlivých problémů. Popis procedury: procedure () (sekce pro provádění lokálních jmen) Begin (sekce pro provádění operátorů) End; Popis funkce: function (): typ; (část pro popis místních jmen) Begin (část pro spustitelné příkazy) := ; (povinný parametr) End; Volání procedury: (); Volání funkce: := (); 1. Na pravé straně operátoru přiřazení. 2. Ve výrazu v podmínce operátor větvení. 3. Ve výstupní proceduře jako výsledek funkce. Popis podprogramů Procedury


Rekurze Procedury a funkce v Pascalu mohou volat samy sebe, tzn. mají vlastnost rekurzivity. Rekurzivní funkce musí nutně obsahovat podmínku pro ukončení rekurzivity, aby nezpůsobila zacyklení programu. Každé rekurzivní volání vytváří novou sadu lokálních proměnných. To znamená, že proměnné umístěné mimo volanou funkci se nezmění.


1 funkce f (n: celé číslo): celé číslo; begin if n = 1 then f:= 1 else f:= n * f (n -1); (funkce f volá sama sebe" title="Příklad 5. Vytvořte rekurzivní funkci, která vypočítá faktoriál čísla n takto: n! = 1, pokud n= 1 n!= (n -1)! · n pokud n > 1 funkce f (n: celé číslo): celé číslo; začít, pokud n = 1, pak f:= 1 jinak f:= n * f (n -1); (funkce f volá sama sebe" class="link_thumb"> 19 !} Příklad 5. Vytvořte rekurzivní funkci, která vypočítá faktoriál čísla n následovně: n! = 1, pokud n= 1 n!= (n -1)! · n pokud n > 1 funkce f (n: celé číslo): celé číslo; begin if n = 1 then f:= 1 else f:= n * f (n -1); (funkce f volá sama sebe) end; 1 funkce f (n: celé číslo): celé číslo; begin if n = 1 then f:= 1 else f:= n * f (n -1); (funkce f volá sama sebe"> 1 funkce f (n: celé číslo): celé číslo; begin, pokud n = 1, pak f:= 1 jinak f:= n * f (n -1); (funkce f volá sama sebe) end; " > 1 funkce f (n: celé číslo): celé číslo; začít, pokud n = 1, pak f:= 1 jinak f:= n * f (n -1); (funkce f volá sama sebe" title="Příklad 5 Vytvořte rekurzivní funkci, která vypočítá faktoriál čísla n následovně: n = 1, jestliže n= 1 n!= (n -1)!n, jestliže n > 1 funkce f (n: celé číslo): celé číslo; začít, pokud n = 1, pak f:= 1 jinak f:= n * f (n -1); (funkce f volá sama sebe"> title="Příklad 5. Vytvořte rekurzivní funkci, která vypočítá faktoriál čísla n následovně: n! = 1, pokud n= 1 n!= (n -1)! · n pokud n > 1 funkce f (n: celé číslo): celé číslo; begin if n = 1 then f:= 1 else f:= n * f (n -1); (funkce f volá sama sebe"> !}



Snímek 1

Snímek 3

Podprogramy: globální a lokální proměnné Všechny podprogramy musí být popsány v části popisu. Každý podprogram musí mít název. Informace mezi hlavním programem a podprogramy jsou přenášeny globálními parametry (proměnnými), které fungují v jakékoli části programu a mají název popsaný v hlavním programu. Lokální parametry (proměnné) lze použít uvnitř podprogramu - jejich názvy a hodnoty mají význam pouze v rámci hranic daného podprogramu a nejsou dostupné volajícímu programu

Snímek 4

Formální a skutečné parametry V popisu podprogramů jsou parametry označeny pouze názvy, proto se nazývají formální. Nemají žádný význam, dokud není zavolán podprogram. Vyhrazují pouze prostor pro skutečné parametry, přičemž jejich počet a datový typ je pevně stanoven. Typy skutečných parametrů: Hodnotové parametry udávají, jaká hodnota by měla být přiřazena konkrétnímu parametru podprogramu. Po skončení podprogramu převezmou své předchozí hodnoty, i když byly v podprogramu změněny. Proměnné parametry v podprogramu nahrazují formální, mohou měnit svou hodnotu během provádění podprogramu a uložit změny při ukončení podprogramu (proměnným parametrům předchází klíčové slovo Var).

Snímek 5

Snímek 6

Popis procedury Program Pr1; Const...Type...Var...Procedure(); Popisná část Začátek Tělo procedury Konec; Začít...(); ... konec. Při volání procedury jsou formální parametry nahrazeny skutečnými.

Snímek 7

Postup pro výpočet součtu dvou čísel program pr1; Usescrt; Var a,b,s:real; procedura summa(x,y:skutecne;var z:skutecne); begin z:=x+y; konec; začít clrscr; writeln("zadejte a,b"); readln(a,b); summa(a,b,s); writeln(" součet čísel ",a:3:1," a ",b:3:1," = ",s:3:1); readln; konec. x,y,z – formální parametry, lokální proměnné a,b,s– globální proměnné a,b,s – aktuální parametry x y z a b s Hodnotové parametry Proměnná parametrů

Snímek 8

Snímek 9

Snímek 10

Vypočítejte hodnotu výrazu a:=(3n!+2m!)/(m+n)! Jaký typ proměnných je vhodné použít k nalezení faktoriálu? program pr2; Usescrt; Var m,n,x,y,z:integer; a:skutečný; procedura fakt(d:integer;var q:integer); var i:integer; begin q:=1; pro i:=1 až d do q:=q*i; konec; začít clrscr; writeln("zadejte hodnoty n, m"); readln(n,m); fakt(n,x); fakt(m,y); fakt(m+n,z); a:=(3*x+2*y)/z; writeln("hodnota výrazu s m= ",m:4," a n= ",n:4,"je rovna",a:8:3); readln; konec. N! = 1 · 2 · 3 · ... · N

Snímek 11

Vstupní výstup prvků jednorozměrného pole Funkce Random(X) generuje náhodné číslo od 0 do X typu integer nebo real (před voláním funkce je nutné jej inicializovat pomocí procedury Randomize). Pokud parametr X není uveden, bude výsledek typu Real v rozsahu od 0,0 do 1,0. Získání pole náhodných celých čísel z rozsahu náhodný(B-A+1)+A Úkol: Formulujte vstup prvků jednorozměrného pole pomocí generátoru náhodných čísel (rozsah hodnot od -10 do 20) a výstup prvků jako procedura. Pro A=-10 B=20 náhodně (20-(-10)+1)+(-10)

Snímek 12

Snímek 13

Snímek 14

Popis funkce Funkce jsou určeny k výpočtu pouze jedné hodnoty, 1. Její první rozdíl je tedy v tom, že procedura může mít nové hodnoty pro více parametrů, ale funkce má pouze jednu (to bude výsledek). 2. Druhý rozdíl je v názvu funkce. Skládá se ze slova FUNCTION, za nímž následuje název funkce, dále seznam formálních parametrů v závorkách, za nímž následuje typ výsledku funkce oddělený dvojtečkou. 3. Tělo funkce musí obsahovat alespoň jeden operátor přiřazení, kde název funkce je na levé straně a její hodnota je na pravé straně. Funkce (): Popisný začátek Tělo funkce:=; Konec;

Snímek 15

Vypočítejte hodnotu výrazu a:=(3n!+2m!)/(m+n)! program fn2; Usescrt; Var m,n:integer; a:skutečný; function fact(d:integer) :longint; var i:integer; q:longint; begin q:=1; pro i:=1 až d do q:=q*i; fakt:=q; konec; začít clrscr; writeln("zadejte hodnoty n, m"); readln(n,m); a:=(3*fakt(n)+2*fakt(m))/fakt(m+n);; writeln("hodnota výrazu s m= ",m:4," a n= ",n:4,"je rovna",a:8:3); readln; konec.

Snímek 16

Vytvořte program, který najde ab, tedy b-tou mocninu čísla A, kde A a B jsou celá čísla a B>0, zadané z klávesnice. Sestavte program nahrazením funkce procedurou pr2; Usescrt; Var a,b:integer; c:longint; Funkce stepen(x,y:integer):longint; var i:integer; s:longint; begin s:=1; pro i:=1 až y do s:=s*x; krok:=s; konec; začít clrscr; writeln("zadejte hodnoty a, b"); readln(a,b); C:=krok(a,b); writeln("s=",s); readln; konec.

Snímek 17

Snímek 18

Mechanismus předávání parametrů funkcím a procedurám Co vytiskne procedura a co program? Globální proměnné Lokální proměnné a b 3 3 -3 Adresa c a b c 48 Adresa c A:=b+3 B:=3*a C:=a+b Stav C 24 5 8 Odpovědět

Snímek 19

8. třída. Programování v ABC Pascalu

Učitel informatiky na NIS Uralské fyziky a matematiky Zelenov Boris Aleksandrovich


  • Studenti používají postupy a funkce k řešení problémů
  • Žáci se učí řešit velké problémy tak, že je rozdělují na menší

  • Vyvinout koncept procedur a funkcí v programovacím jazyce.

  • Studenti znají pojmy „procedury“ a „funkce“, určují formální a skutečné parametry

Očekávané výsledky – deskriptory:

1. Zná definici „postupu“

2. Zná definici „funkce“

3. Určuje skutečné a formální parametry

4.Rozlišuje mezi hodnotou a proměnnými parametry

5. Vyhledá volání procedury nebo funkce v programový kód



Elvirin standardní plán

1. Odstraňte papíry

2. Zalévejte květiny

3. Umyjte stoly

4. Otřete sklo

Konec algoritmu

Jak zlepšit organizaci tohoto procesu?




Téma lekce

Podprogramy:


Ishki bagdarlama

Podprogram

Postup

Postup

Parametr

Užitečné fráze:

K předání hodnot proměnných do procedury (funkce) se používají skutečné parametry...

Abyste mohli popsat postup, měli byste nejprve..., pak...


Koncept podprogramu

Definice

Podprogram- Jedná se o samostatnou funkčně nezávislou část programu.

Podprogramy

Postupy


  • eliminovat potřebu opakovaně opakovat podobné fragmenty v textu programu;
  • zlepšit strukturu programu a usnadnit mu pochopení;
  • zvýšit odolnost proti programovým chybám a nepředvídatelným následkům při úpravách programu.

  • Nakreslete plot pomocí programovacího jazyka

V této úloze můžete vytvořit proceduru, která provede algoritmus pro kreslení jednoho fragmentu (plátku), a pak se na tento postup neustále odvolávat a měnit výchozí polohu pera.


  • Popište, jak racionálně nakreslit vánoční stromek v programovacím prostředí

  • Jsou to nezávislé programové fragmenty, navržené zvláštním způsobem a mající své vlastní jméno.

Interakce mezi hlavním programem a podprogramem



Blokové schéma

  • Blok volání podprogramu (procedury nebo funkce).

Název podprogramu (procedury nebo funkce).


Blokové schéma


Popis postupu je následující:

postup jméno (seznam formálních parametrů); sekce popisů začít operátory konec ;


Popis funkce vypadá takto:

funkce jméno (seznam formálních parametrů): návratový typ;

sekce popisů začít operátory konec ;


Umístění v programu

Program ...;

//Sekce popisu Uses, Const, Var, ...

postup A ;

začít ....... konec ;

postup B ;

začít ........ konec ;

Funkce C ;

začít ........ konec ;

//Hlavní program

začít ........ konec .


  • Rozdíl mezi funkcí a procedurou je v tom, že výsledkem provádění operátorů tvořících tělo funkce je vždy jedna hodnota, takže volání funkce lze použít ve vhodných výrazech spolu s proměnnými a konstantami.

Postupy

Funkce

Může mít více výsledků nebo provést nějakou akci

Má pouze jeden výsledek, jehož typ je specifikován samostatně při deklaraci funkce.

Výsledkem mohou být hodnoty libovolného typu – pole, řetězce, čísla atd.

Výsledkem může být pouze hodnota typu real, integer nebo char.

Příkaz volání procedury je samostatný příkaz, který lze použít nezávisle

Volání funkce lze použít pouze jako součást výrazu příslušného typu.

Tělo funkce musí obsahovat alespoň jeden operátor přiřazení s názvem funkce na levé straně.


b pak max:=a jinak max:=b; MaxNumber:= max; end;" width="640"

Postup nebo funkce?

MaxNumber(a,b: integer): integer;

var max: celé číslo;

MaxNumber:= max;


b pak max:=a jinak max:=b; end;" width="640"

Postup nebo funkce?

MaxNumber(a,b: integer; var max: integer);

if ab then max:=a else max:=b;


Postup nebo funkce?

ChangeColor(C1, C2: Word);

TextBackGround(C2)


Postup nebo funkce?

Add(X, Y: Integer): Integer;


Aktuální

  • Uvedeno v hlavní části programu

Formální

  • Určeno v podprogramu
  • Určeno v podprogramu

Procedura je volána operátorem v následujícím formátu:

název procedury (seznam aktuálních parametrů);

  • Seznam skutečných parametrů- toto je jejich seznam oddělený čárkami.

  • Ve standardu jazyka Pascal lze parametry předávat dvěma způsoby – hodnotou a odkazem. Volají se parametry předávané hodnotou parametry-hodnoty, předáno odkazem - parametry-proměnné. Ty se liší tím, že v hlavičce procedury (funkce) jim předchází servisní slovo var.

Předávání parametrů. Formální parametry

Proměnné

Hodnoty

Parametry podle hodnoty

Formální parametry

Proměnné


Formální parametry

Parametry podle hodnoty

  • V první metodě (předávání hodnotou) se hodnoty skutečných parametrů zkopírují do odpovídajících formálních parametrů.

Postup

Název procedury (a, b: celé číslo);

Hlavní program

Při změně těchto hodnot během provádění procedury (funkce) se původní data (aktuální parametry) nemohou změnit


Var c, d: celé číslo;

  • Při přechodu odkazem vedou všechny změny v těle procedury (funkce) s formálními parametry k okamžitým podobným změnám v odpovídajících skutečných parametrech.

Postup

Název procedury (a, b: celé číslo, Var c: reálné);

Hlavní program

Změny nastanou v proměnných volajícího bloku, takže výstupní parametry jsou předávány odkazem. Při volání mohou být jejich odpovídající skutečné parametry pouze proměnné.


Píšete:

1. Skutečné parametry____________

Procedure Kvad(R: real; var S: real);

2. Formální parametry ___________

3. Formální parametry-hodnoty __________

5. Název procedury ___________

6. Přístup k proceduře z programu ______________________


Interaktivní úkol

http://www.bzfar.net/load/podprogrammy_procedury_i_funkcii_parametry/23-1-0-498


Elvira je vedoucí třídy. Bude muset vytvořit plán na generální úklid ve třídě: odstranit papíry, zalít květiny, umýt stoly, otřít sklo. Jak si může lépe zorganizovat práci? Pomozte Elvíře.


Pokročilý plán Elviry

Podprogramy:

Arsen - odkládá papíry

Mila - zalévání květin

Vitaly – myje stoly

Indira – utírání skla

1. Popravte Arsena

2. Běž Mila

3. Popravte Vitalyho

4. Spusťte Indiru

Konec algoritmu


  • S jakými novými strukturami programovacích jazyků jsme se dnes setkali?
  • Pojmenujte studované parametry
  • Jak jsou parametry předávány proceduře?

  • Shrnutí lekce
  • Najít definice: „Místní proměnné“ a „Globální proměnné“
  • Sestavte dvě úlohy, ve kterých můžete používat procedury nebo funkce.

  • Jak byste určili téma lekce? (vymyslete si vlastní jméno)
  • Co si myslíte, že byste se měli naučit v příští lekci?

Pojďme se setkat

další lekce!

Účel lekce

vzdělávací

  • vytvořit mezi studenty jednotný systém pojmů související s pojmy procedura a funkce;
  • naučit, jak používat podprogramy při řešení problémů v Pascalu, a také naučit rozumět tomu, jaký typ podprogramu je potřeba při řešení určitého problému;
  • ukázat základní techniky používání podprogramů;

vzdělávací

  • kultivovat přesnost, pozornost, organizaci;
  • kultura počítačových dovedností;

rozvíjející se

  • rozvíjet logické myšlení, algoritmickou kulturu studentů;
  • rozvíjet znalosti a dovednosti pro vytváření a ladění podprogramů v Pascalu.

Studenti musí:

  • znát pravidla pro zápis procedur bez parametrů a s parametry;
  • znát pravidla pro psaní funkcí;
  • umět aplikovat postupy a funkce k řešení jednoduchých problémů.

Během vyučování

I. Org. moment

II. Úvod. Relevantnost

Rozdejte úkol na kousky papíru ( Příloha 1 ). Najděte opakování.

Někdy na různých místech programu musíte provést téměř stejné sekvence akcí s různými počátečními daty. Takové sekvence akcí mohou být formalizovány ve formě tzv podprogramy (z angličtiny, podprogram) - seskupit operátory do bloku, ke kterému lze přistupovat podle jména a opakovaně.

Podprogramy zkracují text programu, výrazně zkracují dobu jeho provádění a usnadňují život programátorům, kteří mohou vytvářet programy modulárně, tedy sestavením složitého programu z hotových kusů jednodušších komponent. To umožňuje skupině programátorů vytvářet velké programy a skupině školáků vyvíjet a realizovat jakékoli globální projekty

Podprogramy se dělí na procedury a funkce.

Vestavěné (standardní) postupy a funkce jsou část jazyk a lze jej volat jménem bez předchozího popisu. Například , abs, sqrt, ln, sin... jsou funkce (vrací výsledek), readln, write... jsou procedury (nevrací výsledek). Jejich přítomnost značně usnadňuje vývoj aplikačních programů. Nicméně ve většině případů některé charakteristický pro daný program akce nenacházejí přímé analogy v knihovnách Turbo Pascalu a programátor pak musí vyvinout vlastní nestandardní postupy a funkce.

III. Vysvětlení nového materiálu

Uživatelské postupy jsou napsány sebe programátor v souladu se syntaxí jazyka v část popisu podprogramu.

Struktura procedury odpovídá struktuře programu, jedná se o „program v miniatuře“ – je také reprezentován záhlavím a tělem.

Hlavička se skládá z vyhrazeného slova procedura, identifikátoru (název) postupy.

VAR ... // sekce pro popis proměnných hlavního programu

procedura Název_procedury;

//tělo hlavního programu

Zaznamená se volání procedury pro následné provedení v těle hlavního programu.

Příklad 1. Program pro výpočet plochy a obvodu.

Výhody podprogramů:

  • Programy napsané pomocí podprogramů snadnější testování a ladění, mají jasnější logická struktura.
  • Nezávislá povaha podprogramů umožňuje jejich tvorbu svěřit různým programátorům. Tím se práce s programováním rozdělí a tím se zrychlí její dokončení;
  • Použití podprogramů šetří paměť. Paměť pro ukládání proměnných používaných v podprogramu je alokována pouze po dobu jeho činnosti a je uvolněna, jakmile jeho provádění skončí.

Příklad 2 Uživatel zadá dvě strany tří obdélníků. Odvoďte jejich oblasti.

Problém můžete vyřešit takto:

pro i:=1 až 3 do

writeln('Zadejte a a b:');

writeln(‘Oblast=’,a*b);

Za dobrý styl programování se považuje používání procedur. Je zapotřebí postup, který vypočítá plochu obdélníku. Zde je schéma, jak bude hlavní program vypadat:

výpočet

výpočet

výpočet

Textový postup již existuje (viz příklad 1). Vytvořme druhý postup, který vypočítá plochu. Ale abyste mohli vypočítat S, musíte znát 2 strany, takže postup musí ukázat, které strany se mají násobit.

procedura pl (c,d: celé číslo);

writeln(‚plocha obdélníku se stranami‘,c,‘‘ ,d, ‚=‘,S);

Parametr je proměnná, které je přiřazena hodnota. Existovat formální parametry , definované v hlavičce podprogramu a skutečné parametry – výrazy, které určují konkrétní hodnoty při přístupu k podprogramu.

Procedura bude provedena, pokud ji zavoláte jménem a zadáte skutečné parametry , oddělené čárkami a uzavřené v závorkách:

Skutečné parametry musí odpovídat formálním co do druhu a množství.

Takže hlavní program:

pro i:=1 až 3 do

Komentář. Při řešení tohoto problému je nutné zkontrolovat čísla zadaná uživatelem (nesmí být záporná, jinak dojde k přerušení programu).

Vytvořme ověřovací postup:

chyba procedury (f,g:integer);

pokud (f<0) or (g<0) then begin

writeln('strany obdélníku nemohou být záporné');

Stůj; // přerušení programu

Závěrečný program - Dodatek 4

Takže formát postupu:

Postup<имя>(formální parametry);

<операторы>;

Příklad 3 Napište program na prohození míst dvou čísel c=5 a d=7.

výměna programůDan;

var c,d:integer;

výměna procedur (a,b:integer);

m:=a; a:=b; b:=m;

writeln("Zadejte 2 čísla: ");

writeln(c," ",d);

Po spuštění programu můžete vidět, že formální parametry (v proceduře) se změnily, ale ty skutečné (které se používají v hlavním programu) se nezměnily. Podívejme se na obrázek, který ukazuje část paměti RAM:

1) při volání procedury obmen se dvěma parametry 5 a 7 jsou čísla 5 a 7 také umístěna do proměnných a a b:

3) ale v proměnných c a d se data nezměnila, protože jsou v jiných paměťových buňkách.

Aby proměnné c a d, a a b odkazoval na stejné paměťové buňky (pokud se změní hodnoty a a b, změní se i hodnoty c, d) při popisu formálních parametrů je nutné před požadované proměnné přidat slovo VAR:

výměna procedur (var a,b:integer);

Změňte program obmenDan:

Chyba způsobená var. Čísla jsou konstanty, které nelze v proceduře změnit.

Příklad 4. Najděte oblast kruhu pomocí postupu, který pouze vypočítá, ale nezobrazí výsledek na obrazovce.

procedura circle(r:real);

Postup by měl vrátit výsledek:

postup kruh (r:real; var S:real);

readln(a, e);

Komentář: Proměnná v proceduře S slouží k vrácení výsledků procedury do hlavního programu. Při jeho změně se změní i skutečný parametr ve volajícím programu, tzn. proměnná e.

Častěji se k tomu v Pascalu místo procedur používají funkce (podprogramy, které něco vracejí).

Funkce je podobná postupu, ale jsou zde dva rozdíly.

  • Funkce předává programu výsledek své práce – jedinou hodnotu, jejímž nositelem je název její funkce.
  • Název funkce se může objevit ve výrazu jako operand. Funkce vrátí výsledek do bodu svého volání.

Například sqr(x) – odmocní hodnotu x a vrátí vypočítanou hodnotu druhé mocniny čísla x do hlásiče: y:=sqr(x);

Uživatelem definovaná funkce se skládá z hlavičky funkce a těla funkce. Tělo funkce má podobnou strukturu jako program. Popis štítků, konstant, typů atd. platné pouze v rámci tohoto řízení.

Funkce<имя>(formální parametry):<тип результата>;

<операторы>;

Sekce příkazů musí obsahovat alespoň jeden příkaz, který přiřazuje hodnotu názvu funkce. Výsledek posledního přiřazení se vrátí do hlásiče.

Příklad 5. Pojďme přepracovat problém o oblasti kruhu.

funkční kruh (r:real): skutečný;

a:=kruh(5); (MUSÍ být přiřazeno)

Příklad 6. Najděte 1!+2!+…+n!

Použijeme funkci hledání faktoriálu, protože jej přivádíme jako vstup a dostáváme výsledek.

funkce fakt (a:integer): integer;

pro i:=1 udělat

V řádku fakt:=fakt*Já;

kompilátor najde chybu, protože fact musí být volána s parametry. Proto se obvykle zavádí další proměnná, do které se umístí výsledek. A pak se tento výsledek přiřadí proměnné fakt:

programový faktoriál;

var sum,n,j: celé číslo;

fakt funkce (a: celé číslo): celé číslo;

var i,d: celé číslo;

pro i:=1 udělat

pro j:=1 až n do

sum:=soucet+skutecnost(j);

IV. Shrnutí lekce

V tomto okamžiku se proces programování změní na výroba průmyslového softwaru na základě programovací technologie. Většina odborníků je toho názoru metoda návrhu programu shora dolů nejvhodnější pro řešení složitých problémů. Nejprve je úkol obecně definován, následně je postupně objasňována jeho struktura. V dalším kroku je každý dílčí úkol rozdělen na řadu dalších. Řešením samostatného fragmentu složitého problému je samostatný programový blok – podprogram.

V. Domácí úkol

Řešení problémů (písemně):

  1. Vytvořte proceduru, která nahradí všechna písmena a v zadaném řetězci znakem *.
  2. Jsou uvedeny dva návrhy. Najděte v nich celkový počet písmen „n“. (Definujte funkci pro výpočet počtu písmen „n“ ve větě.)