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 FibonacciFibonacciho čí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
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 programuSní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 · ... · NSní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ětSní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ě):
- Vytvořte proceduru, která nahradí všechna písmena a v zadaném řetězci znakem *.
- 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ě.)