Procedúry a funkcie v Pascale. Rekurzia. Podprogramy Úloha často vyžaduje zopakovanie určitej postupnosti príkazov v rôznych častiach programu. Procedúry a funkcie Prezentácia procedúr a funkcií

Rekurzia v Pascale Učiteľ: Tlekhurai Yu.V. Mestská vzdelávacia inštitúcia "Lýceum č. 8" Čo vidíte na obrazoch? Tento fenomén v umení sa nazýva rekurzia "Aby ste pochopili rekurziu, musíte najprv pochopiť rekurziu." rekurzia - čiastočná definícia objektu cez seba, definícia objektu pomocou skôr definovaných. Vedecky povedané: Rekurzia - metóda definovania triedy objektov alebo metód tak, že sa najprv špecifikuje jeden alebo viacero (zvyčajne jednoduchých) jej základných prípadov alebo metód a na ich základe sa potom špecifikujú pravidlá pre konštrukciu definovanej triedy. Peter Deutsch Peter Deutsch

Ľudská iterácia.

Rekurzia je od Boha.

Rekurzia vo fyzike Rekurzia v jazyku a literatúre Klasickým príkladom nekonečnej rekurzie je dve zrkadlá umiestnené oproti sebe: z doznievajúcich odrazov zrkadiel sú v nich vytvorené dve chodby. Ďalším príkladom nekonečnej rekurzie je efekt samobudenia (pozit spätná väzba) y elektronické obvody zisk, keď signál z výstupu dosiahne vstup, je zosilnený, opäť dosiahne vstup obvodu a opäť sa zosilní. Zosilňovače, pre ktoré je tento prevádzkový režim štandardný, sa nazývajú samooscilátory. Príklad rekurzívneho slovníkového hesla: „Kňaz mal psa...“ - typická rekurzia Niekoľko príbehov od Stanislawa Lema je venovaných incidentom s nekonečnou rekurziou: Príbeh o hroboch („Hviezdne denníky Johna Tichého“), v ktorom hrdina postupne prechádza od článku o sepulkach k článku o sepulkárii, odtiaľ k článku o sepulkáriách, ktorý opäť obsahuje odkaz na článok „sepulkária“. Príbeh o inteligentnom stroji, ktorý mal dostatok inteligencie a lenivosti na to, aby zostrojil podobný, aby vyriešil daný problém, a zveril mu riešenie (výsledkom bola nekonečná rekurzia, keď každý nové auto postavil jeden podobný sebe a odovzdal jej úlohu). Rekurzia v programovaní je spôsob organizácie výpočtového procesu, v ktorom postup alebo funkcia odkazuje sama na seba počas vykonávania svojich základných operátorov. Aby takéto volanie nebolo nekonečné, musí text podprogramu obsahovať podmienku, pri ktorej už nenastane ďalšie volanie. teda rekurzívne volanie môže byť zahrnuté len v jednej z vetiev podprogramu. Príklad. Výpočet faktoriálu prirodzeného čísla Vytvorte rekurzívnu funkciu, ktorá vypočíta faktoriál čísla n nasledovne: funkcia f (n: celé číslo): longint; začať, ak n = 1, potom f:= 1 inak f:= n * f(n -1); (funkcia f volá sama seba) koniec programu Pascal pomocou rekurzie: Var n: integer; a: longint; faktoriál funkcie (n: celé číslo): longint; begin if n = 1 then faktoriál:= 1 else faktoriál:= n * faktoriál (n -1); Koniec; Begin Write(‘n=‘); Readln(n); A:= faktoriál(n); Napíšte(‘n!=’,a); Readln; koniec. Leonardo z Pisy Fibonacci

Fibonacciho čísla sú prvky číselnej postupnosti

0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, ..., pričom každé nasledujúce číslo sa rovná súčtu dvoch predchádzajúcich.

Úloha: Zobrazte sériu Fibonacciho čísel pozostávajúcu z n prvkov. Popis premenných: n – počet prvkov radu; a, b - hodnoty posledných dvoch prvkov série; c – premenná buffer („náhradná“); i – počítadlo. Algoritmus riešenia úlohy: 1. Získajte hodnotu n. 2. Priraďte a a b hodnoty 0 a 1 (sú to prvé čísla Fibonacciho série). Zobrazte ich na obrazovke. 3. Začnite od 3. prvku po n: a) zobrazte súčet a a b, b) uložte hodnotu premennej b do c, c) zapíšte súčet a a b do b, d) priraďte hodnotu c až a. Program Pascal pomocou iterácie: program Fibonacci; var a,b,c,i,n: celé číslo; začať napíš("n = "); readln(n); a:= 0; napísať," "); b:= 1; napíš(b," "); pre i:=3 až n sa začína napíš(a+b," "); c:= b; b:= a + b; a:=c; koniec; readln; koniec. Program Pascal využívajúci rekurziu: Rekurzívna definícia pre výpočet Fibonacciho čísel je nasledovná: Túto definíciu Fibonacciho čísel možno ľahko previesť na rekurzívnu funkciu: function f(n: Integer) : longint; začať Ak 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. Ak A= b, potom uzol ( A,b) = a. Ak A>b, potom uzol ( A,b)= uzol ( a -b,b). Ak A< b, potom uzol ( A,b)= uzol ( A,b-a). Program noddvyxchisel; var a,b: longint; funkcia 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); napis('b='); readln(b); A:= nod(a,b); napíš(‘prikývnuť=’,a); readln; koniec. Problém s Hanojskými vežami. V tomto prípade je potrebné prísne dodržiavať nasledujúce pravidlá:

  • Naraz môžete presunúť iba jeden disk;
  • väčší disk nemožno umiestniť na menší disk;
  • odstránený disk sa musí nasadiť na akýkoľvek kolík pred odstránením druhého disku.
  • Pracovití budhistickí mnísi nosia disky z veže na vežu vo dne aj v noci. Legenda tvrdí, že keď mnísi dokončia svoju prácu, príde koniec sveta. Dalo by sa vypočítať, že riešenie problému so 64 diskami by vyžadovalo 264–1 ťahov. Preto, čo sa týka konca sveta, ten nastane po piatich miliardách storočí, ak vezmeme do úvahy, že jeden disk sa pohne za jednu sekundu. Problém aj legendu k nemu však vymyslel v roku 1883 matematik Edouard Lucas z College of Saint-Louis.

Jedna z troch diamantových veží nesie 64 okrúhlych zlatých kotúčov. Disky majú rôzne polomery a sú umiestnené na veži v zostupnom poradí polomerov od základne po vrch. Je potrebné preniesť disky z prvej veže do druhej, v prípade potreby použiť tretiu vežu.

Úloha. Vytvorte rekurzívny program, ktorý by vyriešil problém položený vyššie o Hanojských vežiach s počtom diskov rovným n (n = 1, 2, ...). Riešenie. Zadajte mená pre veže: a, b, c. Nechaj Hanoj ​​(n,a,b,c)- požadovaná funkcia, ktorá vracia postupnosť pohybov diskov s a na b použitím c podľa vyššie opísaných pravidiel. Keď n=1 vieme, ako problém vyriešiť. Stačí vykonať operáciu „presunúť“. a na b" Predpokladajme, že tento problém dokážeme vyriešiť pre n – 1 diskov. Presuňte n–1 diskov z a na s. Potom presuňte zostávajúci disk a na b a nakoniec presunúť n–1 diskov z c na b. Vstupné Data: počet diskov na kolíku a; Výkon: sekvenovanie; Krok0:(definujte typ premennej); Krok 1: (opis hanojského postupu, ktorý zobrazuje postupnosť akcií); Krok 1.1: (presun (n-1) diskov z kolíka a na kolík b); Krok 1.2: (presuňte n-tý disk z a do c); Krok 1.3: (presun (n-1) disku z b do c); (kroky 1.2-1.3 sa vykonávajú rekurzívne); Krok 2: (hlavný program); Krok 2.1: (zadajte počet diskov); Krok 2.2: (vyvolanie hanojskej procedúry). Riešenie problému v programe Pascal bahnya; var n: celé číslo; a,b,c: znak; 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); koniec; koniec; Začať písať ("Vvedite naturalnoe chislo n"); readln ( n); a:="a"; b:="b"; c:="c"; hanoi (n,a,c,b); readln; end. Domáca úloha Napíšte program na výpočet stupňa s prirodzeným exponent Daný: stupeň základ X Exponent Komu Ak k=0, potom stupeň(k,x)=1, Inak stupeň(k,x)= x· stupeň(k-1,x) Stupeň programu; var y: skutočný; n:integer; funkcia step(k:integer, x:real): real; begin Ak k = 0 Potom krok:= 1 else krok:= x * krok(k-1,x) Koniec; begin write(‘vvedite osnovanie stepeni x=’); readln(y); write(‘vvedite pokazatel stepeni k=’); Readln(n); write(‘x v stepeni k=’,step(n,y)); readln; koniec. Samostatná práca

  • Nájdite súčet číslic čísla
  • Zistite, či je dané prirodzené číslo prvočíslo
  • Nájdite prvú číslicu čísla
  • Previesť prirodzené číslo z desatinných s.s. na binárne
  • Nájdite súčet prvkov celočíselného poľa pozostávajúceho z 20 prvkov
  • Vymeňte hodnoty dvoch celých čísel
  • Usporiadajte hodnoty troch premenných a, b, c vo vzostupnom poradí
  • Nájdite počet číslic v prirodzené číslo n
  • Nájdite najväčšie z troch daných čísel
  • Nájdite počet kladných čísel medzi štyrmi A, B, C, D
Odpovede na samostatnú prácu č. 2 Program jednoduchý; var n, m, s: celé číslo; funkcia prost(m, n:integer): boolean; begin Ak n = m Potom prost:= true else prost:= (n mod m<>0) a prost (m+l, n); Koniec; begin write('n='); Readln(n); M:=2; Ak prost(m,n) tak napíš (n,‘prostoechislo’) Else napíš (n,’sostavnoe’); readln; koniec.

preklad programov;

postup dvd(n:longint);

Ak n >1 Potom dvd (n div 2);

write(n mod 2);

Podprogramy Úloha často vyžaduje zopakovanie určitej postupnosti príkazov v rôznych častiach programu. Aby bolo možné túto sekvenciu opísať raz a použiť ju mnohokrát, programovacie jazyky používajú podprogramy. Podprogram je špeciálne navrhnutý blok programu pre jeho následné opakované použitie v hlavnom programe.Využitie podprogramov umožňuje realizovať jednu z najmodernejších metód programovania - štruktúrované programovanie


Podprogramy riešia tri dôležité problémy, ktoré výrazne uľahčujú programovanie: 1. eliminujú potrebu opakovaného opakovania podobných fragmentov v texte programu, t.j. znížiť veľkosť programu; 2. zlepší štruktúru programu a uľahčí mu pochopenie pri analýze; 3.znížiť pravdepodobnosť chýb, zvýšiť odolnosť voči programovacím chybám a nepredvídaným následkom pri úprave.


Procedúry a funkcie V Pascale existujú dva typy podprogramov: procedúra (PROCEDURE) a funkcia (FUNCTION). Procedúry a funkcie v Pascale sú deklarované v sekcii deklarácií za sekciou premenných. NázovProgramu; VAR ... // sekcia pre popis premenných hlavného programu; procedure NázovProcedúry; var ... begin ...//Koniec tela procedúry; begin //telo hlavného programu koniec.


Funkcie a procedúry majú parametre (premenné, ktoré odovzdávajú hodnotu). Sú dvoch typov: 1) Formálne - tie, ktoré sú v popise podprogramu 2) Aktuálne - tie, ktoré sa prenášajú z hlavného programu do funkcie alebo procedúry. Skutočné parametre musia zodpovedať formálnym v množstve, poradí a druhu.




Postupy Postupy sa používajú, keď podprogram potrebuje získať viacero výsledkov. V Pascale existujú dva typy procedúr: procedúry s parametrami a bez parametrov. K procedúre sa pristupuje pomocou názvu procedúry, za ktorým môžu nasledovať aktuálne parametre. Keď sa zavolá procedúra, vytvorí sa vzájomná zhoda medzi skutočnými a formálnymi parametrami, potom sa kontrola prenesie na procedúru. Po vykonaní procedúry sa riadenie prenesie na ďalšieho operátora volajúceho programu po zavolaní procedúry.


Príklad 1: Procedúra bez parametrov, ktorá vytlačí reťazec 60 hviezdičiek. postup pr; var i: integer ; begin for i:=1 až 60 do write (* "); writeln; end; begin pr; end.


Príklad 2. Vytvorte program na zámenu dvoch čísel c=5 a d=7 program obmenDan; var c,d:integer; výmena procedúr (a,b:integer); var m:integer; začať m:=a; a:=b; b:=m; writeln(a,b); koniec; begin writeln("Zadaj 2 cisla: "); readln(c,d); výmena(c,d); writeln(c," ",d); koniec. c5 d 7 a 5 b 7 1) pri volaní procedúry obmen s dvoma parametrami 5 a 7 sa do premenných a a b umiestnia rovnaké čísla 5 a 7: 2) potom v procedúre hodnoty pamäťových buniek a a b sú preusporiadané: c5 d 7 a 7 b 5 3) ale v premenných c a d sa údaje nezmenili, pretože sú v iných pamäťových bunkách


Aby premenné c a d, a a b odkazovali na rovnaké pamäťové bunky (ak sa zmenia hodnoty a a b, zmenia sa aj hodnoty c, d), pri popise formálnych parametrov sa je potrebné pridať slovo VAR pred požadované premenné: procedure exchange (var a,b:integer); с5 d 7 a b


Príklad 3. Dané 3 rôzne polia celých čísel (veľkosť každého nepresahuje 15). V každom poli nájdite súčet prvkov a aritmetický priemer. program proc; var i, n, súčet: celé číslo; sr: skutočný; procedure work (r:integer; var s:integer; var s1:real); var mas: pole integer ; j:integer; begin s:=0; for j:=1 to r do begin read (mas[j]); s:=s+mas [j]; koniec; s1:=s/r; koniec;


(hlavný program) begin for i:=1 až 3 do begin write ("Vvedite razmer",i, "masiva: "); readln(n); práca(n, súčet, sr); (zavolajte prácu procedúry) writeln ("Summa elementov = ",sum); writeln("Srednearifmeticheskoe = ",sr:4:1); koniec; koniec.


Výsledok programu: Program trikrát vyvolá pracovný postup, v ktorom sú formálne premenné r, s, s1 nahradené skutočným n, sum, sr. Procedúra zadá prvky poľa, vypočíta súčet a priemer. Premenné s a s1 sa vrátia do hlavného programu, takže servisné slovo var je umiestnené pred ich popisom. Lokálne parametre mas, j sú platné len v procedúre. Global - i, n, sum, sr sú dostupné v celom programe.


Funkcie v jazyku Pascal Sada vstavaných funkcií v jazyku Pascal je pomerne široká (ABS, SQR, TRUNC atď.). Ak je v programe zahrnutá nová, neštandardná funkcia, musí byť popísaná v texte programu, po ktorom je možné k nej pristupovať z programu. Funkcia je prístupná na pravej strane operátora priradenia, ktorá uvádza názov funkcie a aktuálne parametre. Funkcia môže mať svoje vlastné lokálne konštanty, typy, premenné, procedúry a funkcie. Popis funkcií v Pascal je podobný popisu procedúr.




Príklad 4. Napíšte funkciu podprogramu stupňa a x, kde a, x sú ľubovoľné čísla. Použime vzorec: a x = e x ln a programe p2; var f, b, s, t, c, d: skutočný; (globálne premenné) funkcia stp (a, x: real) : real; var y: skutočný; ( lokálne premenné) begin y:= exp (x * ln (a)) ; stp:= y;(priradenie názvu funkcie k výsledku výpočtov podprogramu) end; (popis funkcie dokončený) begin d:= stp (2.4, 5); (výpočet mocnin rôznych čísel a premenných) writeln (d, stp (5,3.5)); read(f, b, s, t); c:= stp (f, s) + stp (b, t); writeln(c); koniec.


Funkcie Podprogram je časť programu, navrhnutá ako samostatná syntaktická štruktúra a opatrená názvom (samostatný programový blok), na riešenie jednotlivých problémov. Popis procedúry: procedure () (sekcia pre vykonávanie lokálnych názvov) Begin (sekcia pre vykonávanie operátorov) End; Popis funkcie: function (): typ; (časť pre popis miestnych názvov) Begin (časť pre spustiteľné príkazy) := ; (povinný parameter) Koniec; Volanie procedúry: (); Volanie funkcie: := (); 1. Na pravej strane operátora priradenia. 2. Vo výraze v podmienke operátora vetvenia. 3. Vo výstupnom postupe ako výsledok funkcie. Popis podprogramov Postupy


Rekurzia Procedúry a funkcie v Pascale sa môžu volať samy seba, t.j. majú vlastnosť rekurzivity. Rekurzívna funkcia musí nevyhnutne obsahovať podmienku na ukončenie rekurzivity, aby nespôsobila zacyklenie programu. Každé rekurzívne volanie vytvára novú množinu lokálnych premenných. To znamená, že premenné umiestnené mimo volanej funkcie sa nezmenia.


1 funkcia f (n: celé číslo): celé číslo; začať, ak n = 1, potom f:= 1 inak f:= n * f (n -1); (funkcia f sa volá" title="Príklad 5. Vytvorte rekurzívnu funkciu, ktorá vypočíta faktoriál čísla n takto: n! = 1, ak n= 1 n!= (n -1)! · n ak n > 1 funkcia f (n: celé číslo): celé číslo; začať, ak n = 1, potom f:= 1 inak f:= n * f (n -1); (funkcia f volá sama seba" class="link_thumb"> 19 !} Príklad 5. Vytvorte rekurzívnu funkciu, ktorá vypočíta faktoriál čísla n takto: n! = 1, ak n= 1 n!= (n -1)! · n ak n > 1 funkcia f (n: celé číslo): celé číslo; začať, ak n = 1, potom f:= 1 inak f:= n * f (n -1); (funkcia f sa volá) end; 1 funkcia f (n: celé číslo): celé číslo; začať, ak n = 1, potom f:= 1 inak f:= n * f (n -1); (funkcia f volá samu seba"> 1 funkcia f (n: celé číslo): celé číslo; začiatok, ak n = 1, potom f:= 1 inak f:= n * f (n -1); (funkcia f sa volá) koniec; " > 1 funkcia f (n: celé číslo): celé číslo; začať, ak n = 1, potom f:= 1 inak f:= n * f (n -1); (funkcia f sa volá" title="Príklad 5 Vytvorte rekurzívnu funkciu, ktorá vypočíta faktoriál čísla n takto: n = 1, ak n= 1 n!= (n -1) n, ak n > 1 funkcia f (n: celé číslo): celé číslo; začať, ak n = 1, potom f:= 1 inak f:= n * f (n -1); (funkcia f volá samu seba"> title="Príklad 5. Vytvorte rekurzívnu funkciu, ktorá vypočíta faktoriál čísla n takto: n! = 1, ak n= 1 n!= (n -1)! · n ak n > 1 funkcia f (n: celé číslo): celé číslo; začať, ak n = 1, potom f:= 1 inak f:= n * f (n -1); (funkcia f volá sama seba"> !}



Snímka 1

Snímka 3

Podprogramy: globálne a lokálne premenné Všetky podprogramy musia byť popísané v časti s popisom. Každý podprogram musí mať názov. Informácie medzi hlavným programom a podprogramami sú prenášané globálnymi parametrami (premennými), ktoré fungujú v ktorejkoľvek časti programu a majú názov popísaný v hlavnom programe. Lokálne parametre (premenné) môžu byť použité vo vnútri podprogramu - ich názvy a hodnoty majú význam iba v rámci hraníc daného podprogramu a nie sú dostupné pre volajúci program

Snímka 4

Formálne a skutočné parametre V popise podprogramov sú parametre označené iba názvami, preto sa nazývajú formálne. Nemajú žiadny význam, kým sa nezavolá podprogram. Vyhradzujú len priestor pre skutočné parametre, pričom fixujú ich počet a typ údajov. Typy skutočných parametrov: Hodnotové parametre označujú, aká hodnota by mala byť priradená konkrétnemu parametru podprogramu. Po skončení podprogramu prevezmú svoje predchádzajúce hodnoty, aj keď boli v podprograme zmenené. Premenné parametre v podprograme nahrádzajú formálne parametre, môžu zmeniť svoju hodnotu počas vykonávania podprogramu a uložiť zmeny pri výstupe z podprogramu (premenným parametrom predchádza kľúčové slovo Var).

Snímka 5

Snímka 6

Popis procedúry Program Pr1; Const...Type...Var...Procedure(); Opisná časť Začiatok Telo procedúry Koniec; Začať...(); ... koniec. Pri volaní procedúry sa formálne parametre nahradia skutočnými.

Snímka 7

Postup výpočtu súčtu dvoch čísel program pr1; Usescrt; Var a,b,s:real; procedure summa(x,y:real;var z:real); begin z:=x+y; koniec; začať clrscr; writeln("zadaj a,b"); readln(a,b); summa(a,b,s); writeln(" súčet čísel ",a:3:1," a ",b:3:1," = ",s:3:1); readln; koniec. x,y,z – formálne parametre, lokálne premenné a,b,s– globálne premenné a,b,s – aktuálne parametre x y z a b s Hodnotové parametre Premenná parametra

Snímka 8

Snímka 9

Snímka 10

Vypočítajte hodnotu výrazu a:=(3n!+2m!)/(m+n)! Aký typ premenných je vhodné použiť na nájdenie faktoriálu? program pr2; Usescrt; Var m,n,x,y,z:integer; a:skutočný; procedura fakt(d:integer;var q:integer); var i:integer; begin q:=1; pre i:=1 až d do q:=q*i; koniec; začať clrscr; writeln("zadajte 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 rovná",a:8:3); readln; koniec. N! = 1 · 2 · 3 · ... · N

Snímka 11

Vstupný výstup prvkov jednorozmerného poľa Funkcia Random(X) generuje náhodné číslo od 0 do X typu celé číslo alebo real (pred volaním funkcie je potrebné ho inicializovať pomocou procedúry Randomize). Ak parameter X nie je zadaný, výsledok bude typu Real v rozsahu od 0,0 do 1,0. Získanie poľa náhodných celých čísel z rozsahu náhodný(B-A+1)+A Úloha: Formulujte vstup prvkov jednorozmerného poľa pomocou generátora náhodných čísel (rozsah hodnôt od -10 do 20) a výstup prvkov ako procedúra. Pre A=-10 B=20 náhodné (20-(-10)+1)+(-10)

Snímka 12

Snímka 13

Snímka 14

Popis funkcie Funkcie sú navrhnuté tak, aby vypočítali iba jednu hodnotu, 1. Preto jej prvým rozdielom je, že procedúra môže mať nové hodnoty pre viacero parametrov, ale funkcia má iba jednu (to bude výsledok). 2. Druhý rozdiel je v názve funkcie. Pozostáva zo slova FUNCTION, za ktorým nasleduje názov funkcie, potom zoznam formálnych parametrov v zátvorkách, za ktorým nasleduje typ výsledku funkcie oddelený dvojbodkou. 3. Telo funkcie musí obsahovať aspoň jeden operátor priradenia, pričom názov funkcie je na ľavej strane a jej hodnota na pravej strane. Funkcia (): Popisný začiatok Telo funkcie:=; Koniec;

Snímka 15

Vypočítajte hodnotu výrazu a:=(3n!+2m!)/(m+n)! program fn2; Usescrt; Var m,n:integer; a:skutočný; function fact(d:integer) :longint; var i:integer; q:longint; begin q:=1; pre i:=1 až d do q:=q*i; fakt:=q; koniec; začať clrscr; writeln("zadajte 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 rovná",a:8:3); readln; koniec.

Snímka 16

Vytvorte program, ktorý nájde ab, teda b-tú mocninu čísla A, kde A a B sú celé čísla a B>0, zadané z klávesnice. Vytvorte program nahradením funkcie procedúrou pr2; Usescrt; Var a,b:integer; c:longint; Funkcia stepen(x,y:integer):longint; var i:integer; s:longint; begin s:=1; pre i:=1 až y do s:=s*x; krok:=s; koniec; začať clrscr; writeln("zadajte hodnoty a, b"); readln(a,b); C:=krok(a,b); writeln("s=",s); readln; koniec.

Snímka 17

Snímka 18

Mechanizmus odovzdávania parametrov funkciám a procedúram Čo vytlačí procedúra a čo program? Globálne premenné Lokálne premenné 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 Odpoveď

Snímka 19

8. trieda. Programovanie v ABC Pascal

Učiteľ informatiky NIS Uralskej fyziky a matematiky Zelenov Boris Aleksandrovich


  • Žiaci využívajú postupy a funkcie na riešenie problémov
  • Žiaci sa učia riešiť veľké problémy tak, že ich rozložia na menšie

  • Vypracovať koncept procedúr a funkcií v programovacom jazyku.

  • Študenti poznajú pojmy „postupy“ a „funkcie“, určujú formálne a skutočné parametre

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

1. Pozná definíciu „postupu“

2. Pozná definíciu „funkcie“

3. Určuje skutočné a formálne parametre

4.Rozlišuje medzi hodnotou a premennými parametrami

5. Nájde volanie procedúry alebo funkcie v programový kód



Elvirin štandardný plán

1. Odstráňte papiere

2. Polejte kvety

3. Umyte stoly

4. Utrite sklo

Koniec algoritmu

Ako zlepšiť organizáciu tohto procesu?




Téma lekcie

Podprogramy:


Ishki bagdarlama

Podprogram

Postup

Postup

Parametre

Užitočné frázy:

Na odovzdanie hodnôt premenných do procedúry (funkcie) sa používajú skutočné parametre...

Ak chcete opísať postup, mali by ste najprv..., potom...


Koncept podprogramu

Definícia

Podprogram- Ide o samostatnú funkčne nezávislú časť programu.

Podprogramy

Postupy


  • eliminovať potrebu opakovane opakovať podobné fragmenty v texte programu;
  • zlepšiť štruktúru programu a uľahčiť mu pochopenie;
  • zvýšiť odolnosť voči programovým chybám a nepredvídaným následkom pri úpravách programu.

  • Nakreslite plot pomocou programovacieho jazyka

V tejto úlohe môžete vytvoriť postup, ktorý vykoná algoritmus na kreslenie jedného fragmentu (plot), a potom sa na tento postup neustále odvolávať a meniť počiatočnú polohu pera.


  • Popíšte, ako efektívne nakresliť vianočný stromček v programovacom prostredí

  • Sú to nezávislé programové fragmenty, navrhnuté špeciálnym spôsobom a majúce svoje vlastné meno.

Interakcia medzi hlavným programom a podprogramom



Bloková schéma

  • Blok volania podprogramu (postupu alebo funkcie).

Názov podprogramu (postupu alebo funkcie).


Bloková schéma


Popis postupu je nasledovný:

postup meno (zoznam formálnych parametrov); sekcia popisov začať operátorov koniec ;


Popis funkcie vyzerá takto:

funkciu meno(zoznam formálnych parametrov): návratový typ;

sekcia popisov začať operátorov koniec ;


Umiestnenie v programe

Program ...;

//Časť popisu Uses, Const, Var, ...

postup A ;

začať ....... koniec ;

postup B ;

začať ........ koniec ;

Funkcia C ;

začať ........ koniec ;

//Hlavný program

začať ........ koniec .


  • Rozdiel medzi funkciou a procedúrou je v tom, že výsledkom vykonania operátorov, ktoré tvoria telo funkcie, je vždy jedna hodnota, takže volanie funkcie možno použiť vo vhodných výrazoch spolu s premennými a konštantami.

Postupy

Funkcie

Môže mať viacero výsledkov alebo vykonať nejakú akciu

Má iba jeden výsledok, ktorého typ sa pri deklarácii funkcie špecifikuje samostatne.

Výsledkom môžu byť hodnoty akéhokoľvek typu - polia, reťazce, čísla atď.

Výsledkom môže byť iba hodnota typu real, integer alebo char.

Príkaz na volanie procedúry je samostatný príkaz, ktorý možno použiť nezávisle

Volanie funkcie možno použiť len ako súčasť výrazu vhodného typu.

Telo funkcie musí obsahovať aspoň jeden operátor priradenia s názvom funkcie na ľavej strane.


b potom max:=a else max:=b; MaxNumber:= max; end;" width="640"

Postup alebo funkcia?

MaxNumber(a,b: integer): integer;

var max: celé číslo;

MaxNumber:= max;


b potom max:=a else max:=b; end;" width="640"

Postup alebo funkcia?

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

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


Postup alebo funkcia?

ChangeColor(C1, C2: Word);

TextBackGround(C2)


Postup alebo funkcia?

Add(X, Y: Integer): Integer;


Skutočné

  • Uvedené v hlavnom programe

Formálne

  • Určené v podprograme
  • Určené v podprograme

Procedúru volá operátor v nasledujúcom formáte:

názov procedúry (zoznam skutočných parametrov);

  • Zoznam skutočných parametrov- toto je ich zoznam oddelený čiarkami.

  • V štandarde jazyka Pascal možno parametre odovzdávať dvoma spôsobmi – hodnotou a odkazom. Volajú sa parametre odovzdané hodnotou parametre-hodnoty, prenášané odkazom - parametre-premenné. Tie sa líšia tým, že v hlavičke procedúry (funkcie) im predchádza servisné slovo var.

Odovzdávanie parametrov. Formálne parametre

Premenné

hodnoty

Parametre podľa hodnoty

Formálne parametre

Premenné


Formálne parametre

Parametre podľa hodnoty

  • V prvej metóde (prechádzanie hodnotou) sa hodnoty skutočných parametrov skopírujú do zodpovedajúcich formálnych parametrov.

Postup

Názov procedúry (a, b: celé číslo);

Hlavný program

Pri zmene týchto hodnôt počas vykonávania procedúry (funkcie) sa pôvodné údaje (aktuálne parametre) nemôžu zmeniť


Var c, d: celé číslo;

  • Pri prechode odkazom všetky zmeny vyskytujúce sa v tele procedúry (funkcie) s formálnymi parametrami vedú k okamžitým podobným zmenám v zodpovedajúcich skutočných parametroch.

Postup

Názov procedúry (a, b: celé číslo, Var c: skutočné);

Hlavný program

Zmeny nastanú v premenných volajúceho bloku, takže výstupné parametre sa odovzdávajú odkazom. Pri volaní môžu byť ich zodpovedajúce skutočné parametre iba premenné.


Píšete:

1. Skutočné parametre____________

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

2. Formálne parametre ___________

3. Formálne parametre-hodnoty __________

5. Názov postupu ___________

6. Prístup k procedúre z programu ______________________


Interaktívna úloha

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


Elvira je vedúcou triedy. Bude musieť vypracovať plán na všeobecné upratovanie v triede: odstrániť papiere, zaliať kvety, umyť stoly, utrieť sklo. Ako si môže lepšie zorganizovať prácu? Pomôžte Elvíre.


Pokročilý plán Elviry

Podprogramy:

Arsen - odkladá papiere

Mila - polievanie kvetov

Vitaly – umýva stoly

Indira – utieranie skla

1. Popravte Arsena

2. Bež Mila

3. Popravte Vitalija

4. Spustite Indiru

Koniec algoritmu


  • S akými novými štruktúrami programovacieho jazyka sme sa dnes stretli?
  • Pomenujte študované parametre
  • Ako sa parametre odovzdávajú procedúre?

  • Zhrnutie lekcie
  • Nájdite definície: „Lokálne premenné“ a „Globálne premenné“
  • Zostavte dve úlohy, v ktorých môžete použiť procedúry alebo funkcie.

  • Ako by ste určili tému hodiny? (vymysli si svoje meno)
  • Čo by ste sa podľa vás mali naučiť v nasledujúcej lekcii?

Stretnime sa

ďalšia lekcia!

Účel lekcie

vzdelávacie

  • vytvárať medzi študentmi jednotný systém pojmov súvisiace s pojmami procedúra a funkcia;
  • naučiť, ako používať podprogramy pri riešení problémov v jazyku Pascal, a tiež naučiť pochopiť, aký typ podprogramu je potrebný pri riešení určitého problému;
  • ukázať základné techniky používania podprogramov;

vzdelávacie

  • kultivovať presnosť, pozornosť, organizáciu;
  • kultúra počítačových zručností;

rozvíjanie

  • rozvíjať logické myslenie, algoritmickú kultúru študentov;
  • rozvíjať vedomosti a zručnosti na vytváranie a ladenie podprogramov v jazyku Pascal.

Študenti musia:

  • poznať pravidlá písania procedúr bez parametrov a s parametrami;
  • poznať pravidlá písania funkcií;
  • vedieť aplikovať postupy a funkcie na riešenie jednoduchých problémov.

Počas vyučovania

I. Org. moment

II. Úvod. Relevantnosť

Rozdajte úlohu na kúsky papiera ( Príloha 1 ). Nájdite opakovania.

Niekedy na rôznych miestach programu musíte vykonať takmer rovnaké sekvencie akcií s rôznymi počiatočnými údajmi. Takéto postupnosti akcií môžu byť formalizované vo forme tzv podprogramy (z angličtiny, podprogram) – zoskupiť operátorov do bloku, ku ktorému je možné pristupovať podľa názvu a opakovane.

Podprogramy skracujú text programu, výrazne skracujú čas jeho vykonávania a uľahčujú život programátorom, ktorí môžu vytvárať programy modulárne, teda poskladaním zložitého programu z hotových kusov jednoduchších komponentov. To umožňuje skupine programátorov vytvárať veľké programy a skupine školákov rozvíjať a implementovať akékoľvek globálne projekty.

Podprogramy sú rozdelené na procedúry a funkcie.

Zabudované (štandardné) postupy a funkcie sú časť jazyk a možno ho volať menom bez predchádzajúceho popisu. Napríklad , abs, sqrt, ln, sin... sú funkcie (vrátiť výsledok), readln, write... sú procedúry (nevrátiť výsledok). Ich prítomnosť výrazne uľahčuje vývoj aplikačných programov. Vo väčšine prípadov však niektoré konkrétne pre tento akčný program neexistujú žiadne priame analógy v knižniciach Turbo Pascal, a potom musí programátor vyvinúť svoj vlastný neštandardné postupy a funkcie.

III. Vysvetlenie nového materiálu

Používateľské postupy sú napísané my sami programátor v súlade so syntaxou jazyka v časť popisu podprogramu.

Štruktúra procedúry zodpovedá štruktúre programu, je to „program v miniatúre“ - je reprezentovaný aj hlavičkou a telom.

Hlavička pozostáva z vyhradeného slova procedure, identifikátora (názov) postupy.

VAR ... // sekcia pre popis premenných hlavného programu

procedure NázovProcedúry;

//telo hlavného programu

Zaznamená sa volanie procedúry na následné vykonanie v tele hlavného programu.

Príklad 1 Program na výpočet plochy a obvodu.

Výhody podprogramov:

  • Programy napísané pomocou podprogramov jednoduchšie testovanie a ladenie, majú jasnejšie logická štruktúra.
  • Nezávislý charakter podprogramov umožňuje ich tvorbu zveriť rôznym programátorom. Tým sa rozdelí programátorská práca a tým sa urýchli jej dokončenie;
  • Používanie podprogramov šetrí pamäť. Pamäť na ukladanie premenných používaných v podprograme je alokovaná len na dobu jeho činnosti a uvoľňuje sa hneď po ukončení jeho vykonávania.

Príklad 2 Používateľ zadá dve strany troch obdĺžnikov. Odvodiť ich oblasti.

Problém môžete vyriešiť takto:

pre i:=1 až 3 do

writeln('Zadajte a a b:');

writeln(‘Oblasť=’,a*b);

Za dobrý štýl programovania sa považuje používanie procedúr. Je potrebný postup, ktorý vypočíta plochu obdĺžnika. Ako bude hlavný program schematicky vyzerať:

kalkulácia

kalkulácia

kalkulácia

Textový postup už existuje (pozri príklad 1). Vytvorme druhý postup, ktorý vypočíta plochu. Ale aby ste mohli vypočítať S, potrebujete poznať 2 strany, takže postup musí ukázať, ktoré strany sa majú násobiť.

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

writeln(‚oblasť obdĺžnika so stranami‘,c,‘‘ ,d, ‚=‘,S);

Parameter je premenná, ktorej je priradená hodnota. Existovať formálne parametre , definovaný v hlavičke podprogramu a skutočné parametre – výrazy, ktoré špecifikujú konkrétne hodnoty pri prístupe k podprogramu.

Procedúra sa vykoná, ak ju zavoláte menom a zadáte skutočné parametre , oddelené čiarkami a uzavreté v zátvorkách:

Skutočné parametre sa musia typom a množstvom zhodovať s formálnymi.

Takže hlavný program:

pre i:=1 až 3 do

Komentujte. Pri riešení tohto problému je potrebné skontrolovať užívateľom zadané čísla (nesmú byť záporné, inak sa program preruší).

Vytvorme overovací postup:

chyba procedúry (f,g:integer);

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

writeln('strany obdĺžnika nemôžu byť záporné');

zastaviť; // prerušenie programu

Záverečný program - Dodatok 4

Takže formát postupu:

Postup<имя>(formálne parametre);

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

Príklad 3 Napíšte program na výmenu miest dvoch čísel c=5 a d=7.

výmena programuDan;

var c,d:integer;

výmena procedúr (a,b:integer);

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

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

writeln(c," ",d);

Po spustení programu môžete vidieť, že formálne parametre (v postupe) sa zmenili, ale skutočné (ktoré sa používajú v hlavnom programe) sa nezmenili. Pozrime sa na obrázok, ktorý zobrazuje časť pamäte RAM:

1) pri volaní procedúry obmen s dvoma parametrami 5 a 7 sa čísla 5 a 7 umiestnia aj do premenných a a b:

3) ale v premenných c a d sa údaj nezmenil, pretože sú v iných pamäťových bunkách.

Aby premenné c a d, a a b odkazoval na rovnaké pamäťové bunky (ak sa zmenia hodnoty a a b, zmenia sa aj hodnoty c, d) pri popise formálnych parametrov je potrebné pred požadované premenné pridať slovo VAR:

výmena procedúr (var a,b:integer);

Zmeňte program obmenDan:

Chyba spôsobená var. Čísla sú konštanty, ktoré sa v procedúre nedajú zmeniť.

Príklad 4. Nájdite oblasť kruhu pomocou postupu, ktorý iba vypočíta, ale nezobrazí výsledok na obrazovke.

postup kruh(r:real);

Postup by mal vrátiť výsledok:

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

readln(a, e);

komentár: Premenná v procedúre S sa používa na vrátenie výsledkov procedúry do hlavného programu. Pri jeho zmene sa mení aj skutočný parameter vo volajúcom programe, t.j. premenná e.

Častejšie sa na to v Pascale namiesto procedúr používajú funkcie (podprogramy, ktoré niečo vracajú).

Funkcia je podobná postupu, existujú však dva rozdiely.

  • Funkcia prenáša do programu výsledok svojej práce – jedinú hodnotu, ktorej nositeľom je názov jej funkcie.
  • Názov funkcie sa môže objaviť vo výraze ako operand. Funkcia vráti výsledok do bodu svojho volania.

Napríklad sqr(x) – odmocní hodnotu x a vráti vypočítanú hodnotu druhej mocniny čísla x do hlásiča: y:=sqr(x);

Používateľom definovaná funkcia pozostáva z hlavičky funkcie a tela funkcie. Telo funkcie má podobnú štruktúru ako program. Popis návestí, konštánt, typov atď. platné len v rámci tohto konania.

Funkcia<имя>(formálne parametre):<тип результата>;

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

Časť príkazov musí obsahovať aspoň jeden príkaz, ktorý priraďuje hodnotu názvu funkcie. Výsledok posledného priradenia sa vráti do hlásiča.

Príklad 5. Poďme prepracovať problém s oblasťou kruhu.

funkčný kruh (r:real): skutočný;

a:=kruh(5); (MUSÍ byť pridelené)

Príklad 6. Nájdite 1!+2!+…+n!

Používame funkciu hľadania faktoriálu, pretože ho podávame ako vstup a dostávame výsledok.

funkcia fakt (a:integer): integer;

pre i:=1 urobiť

V riadku fakt:=fakt*I;

kompilátor nájde chybu, pretože fakt sa musí volať s parametrami. Preto sa zvyčajne zavádza dodatočná premenná, do ktorej sa umiestni výsledok. A potom sa tento výsledok priradí k premennej faktu:

programový faktoriál;

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

funkcia fakt (a: integer): integer;

var i,d: celé číslo;

pre i:=1 urobiť

pre j:=1 až n do

sum:=sucet+skutocnost(j);

IV. Zhrnutie lekcie

V tomto čase sa proces programovania zmení na výroba priemyselného softvéru založené programovacie technológie. Väčšina odborníkov je toho názoru metóda návrhu programu zhora nadol najvhodnejšie na riešenie zložitých problémov. Najprv sa úloha definuje všeobecne, potom sa postupne objasňuje jej štruktúra. V ďalšom kroku je každá podúloha rozdelená na niekoľko ďalších. Riešením samostatného fragmentu komplexného problému je samostatný programový blok - podprogram.

V. Domáca úloha

Riešenie problémov (písomne):

  1. Vytvorte procedúru, ktorá nahradí všetky písmená a v zadanom reťazci znakom *.
  2. Uvádzajú sa dva návrhy. Nájdite v nich celkový počet písmen „n“. (Definujte funkciu na výpočet počtu písmen „n“ vo vete.)