Procedūras un funkcijas programmā Pascal. Rekursija. Apakšprogrammas Bieži vien uzdevums prasa atkārtot noteiktu paziņojumu secību dažādās programmas daļās. Procedūras un funkcijas Procedūru un funkciju prezentācija

Rekursija Paskālā Skolotājs: Tlekhurai Yu.V. Pašvaldības izglītības iestāde "Licejs Nr.8" Ko redzi gleznās? Šo fenomenu mākslā sauc rekursija "Lai saprastu rekursiju, vispirms ir jāsaprot rekursija." rekursija - objekta daļēja definīcija caur sevi, objekta definīcija, izmantojot iepriekš definētos. Zinātniski runājot: Rekursija - objektu vai metožu klases definēšanas metode, vispirms norādot vienu vai vairākus (parasti vienkāršus) tās pamatgadījumus vai metodes un pēc tam, pamatojoties uz tiem, precizējot definējamās klases konstruēšanas noteikumus. Pēteris Deutsch Peter Deutsch

Cilvēka iterācija.

Rekursija ir no Dieva.

Rekursija fizikā Rekursija valodā un literatūrā Klasisks bezgalīgas rekursijas piemērs ir divi spoguļi novietoti viens otram pretī: tajos veidojas divi gaiteņi no izgaistošiem spoguļu atspīdumiem. Vēl viens bezgalīgas rekursijas piemērs ir pašiedvesma efekts (pozitīvs atsauksmes) g elektroniskās shēmas iegūt, kad signāls no izejas sasniedz ieeju, tiek pastiprināts, atkal sasniedz ķēdes ieeju un atkal tiek pastiprināts. Pastiprinātājus, kuriem šis darbības režīms ir standarta, sauc par pašoscilatoriem. Rekursīva vārdnīcas ieraksta piemērs: “Priesterim bija suns...” - tipiska rekursija Vairāki Staņislava Lema stāsti ir veltīti incidentiem ar bezgalīgu rekursiju: ​​Stāsts par kapiem (“Jāņa Klusā zvaigžņu dienasgrāmatas”), kurā varonis secīgi pāriet no raksta par kapiem uz rakstu par sepullāciju, no turienes uz rakstu par sepulkāriju, kurā atkal ir atsauce uz rakstu “sepulcaria”. Stāsts par inteliģentu mašīnu, kurai pietika prāta un slinkuma, lai izveidotu līdzīgu, lai atrisinātu doto problēmu, un uzticētu tai risinājumu (rezultāts bija bezgalīga rekursija, kad katra jauna mašīna uzcēla sev līdzīgu un nodeva uzdevumu viņai). Rekursija programmēšanā ir veids, kā organizēt skaitļošanas procesu, kurā procedūra vai funkcija atsaucas uz sevi tās veidojošo operatoru izpildes laikā. Lai šāds izsaukums nebūtu bezgalīgs, apakšprogrammas tekstā ir jābūt nosacījumam, kuru sasniedzot, turpmākais izsaukums nenotiek. tādējādi rekursīvo izsaukumu var iekļaut tikai vienā no apakšprogrammas atzariem. Piemērs. Naturāla skaitļa faktoriāla aprēķināšana Izveidojiet rekursīvu funkciju, kas aprēķina skaitļa n faktoriāli šādi: funkcija f (n: integer): longint; sākt, ja n = 1, tad f:= 1 cits f:= n * f(n -1); (funkcija f izsauc sevi) beigas Pascal programma, izmantojot rekursiju: ​​Var n: integer; a: longint; funkcija faktoriāls (n: vesels skaitlis): longint; sākt, ja n = 1, tad faktoriāls:= 1 else faktoriāls:= n * faktoriāls (n -1); Beigas; Sākt rakstīt ('n='); Readln(n); A:= faktoriāls(n); Write('n!=',a); Readln; beigas. Leonardo no Pizas Fibonači

Fibonači skaitļi ir skaitļu virknes elementi

0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, ..., kurā katrs nākamais skaitlis ir vienāds ar divu iepriekšējo skaitļu summu.

Uzdevums: Parādiet Fibonači skaitļu sēriju, kas sastāv no n elementiem. Mainīgo lielumu apraksts: n – sērijas elementu skaits; a, b – sērijas pēdējo divu elementu vērtības; c – bufera (“rezerves”) mainīgais; i – skaitītājs. Uzdevuma risināšanas algoritms: 1. Iegūstiet n vērtību. 2. Piešķiriet a un b vērtības attiecīgi 0 un 1 (tie ir pirmie Fibonači sērijas skaitļi). Parādiet tos ekrānā. 3. Sākot no 3. elementa līdz n: a) parāda a ​​un b summu, b) saglabā mainīgā b vērtību c, c) ieraksta a un b summu uz b, d) piešķir a vērtību c. Pascal programma, izmantojot iterāciju: programma Fibonači; var a,b,c,i,n: vesels skaitlis; sākt rakstīt ("n = "); readln(n); a:= 0; uzraksti," "); b:= 1; rakstīt (b," "); i:=3 līdz n sāciet rakstīt(a+b," "); c:= b; b:= a + b; a:=c; beigas; readln; beigas. Pascal programma, kas izmanto rekursiju: Rekursīvā definīcija Fibonači skaitļu aprēķināšanai ir šāda: Šo Fibonači skaitļu definīciju var viegli pārvērst rekursīvā funkcijā: funkcija f(n: Integer) : longint; sākt Ja 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 Un b. Ja A= b, tad mezgls ( A,b)=a. Ja A>b, tad mezgls ( A,b)= mezgls ( a -b,b). Ja A< b, tad mezgls ( A,b)= mezgls ( A,ba). Programma noddvyxchisel; var a,b: longint; funkcija nod(a,b:longint): longint; begin If a = b Tad nod:= a else if a>b then nod:= nod(a-b,b) else nod:= nod(a,b-a) End; sākt rakstīt('a='); readln(a); write('b='); readln(b); A:= nod(a,b); write('nod=',a); readln; beigas. Problēma par Hanojas torņiem. Šajā gadījumā ir stingri jāievēro šādi noteikumi:

  • Vienlaikus var pārvietot tikai vienu disku;
  • lielāku disku nevar ievietot mazāks disks;
  • noņemtais disks ir jāuzliek uz jebkuras tapas, pirms tiek noņemts otrs disks.
  • Strādīgi budistu mūki dienu un nakti nēsā diskus no smailes uz smaili. Leģenda vēsta, ka tad, kad mūki pabeigs savu darbu, pienāks pasaules gals. Varētu aprēķināt, ka problēmas atrisināšanai ar 64 diskiem būtu nepieciešamas 264–1 kustības. Tāpēc, kas attiecas uz pasaules galu, tas notiks pēc pieciem miljardiem gadsimtu, ja ņemam vērā, ka viens disks pārvietojas vienā sekundē. Tomēr gan problēmu, gan leģendu par to 1883. gadā izgudroja matemātiķis Edouard Lucas no Senluisas koledžas.

Vienā no trim dimanta smailēm ir 64 apaļi zelta diski. Diskiem ir dažādi rādiusi, un tie atrodas uz smailes dilstošā rādiusu secībā no pamatnes uz augšu. Ir nepieciešams pārnest diskus no pirmās smailes uz otro, nepieciešamības gadījumā izmantojot trešo.

Uzdevums. Izveidojiet rekursīvu programmu, kas atrisinātu iepriekš uzdoto problēmu par Hanojas torņiem ar disku skaitu, kas vienāds ar n (n = 1, 2, ...). Risinājums. Ievadīsim smailēm nosaukumus: a, b, c. Ļaujiet hanoja (n,a,b,c)- nepieciešamā funkcija, kas atgriež disku kustību secību ar a ieslēgts b izmantojot c saskaņā ar iepriekš aprakstītajiem noteikumiem. Ja n=1, mēs zinām, kā atrisināt problēmu. Jums vienkārši jāveic “pārvietošanas” darbība a ieslēgts b" Pieņemsim, ka šo uzdevumu varam atrisināt n – 1 diskiem. Pārvietojiet n–1 disku no a ieslēgts Ar. Pēc tam pārvietojiet vienu atlikušo disku no a ieslēgts b un visbeidzot pārvietojiet n–1 disku no c ieslēgts b. Ievadiet datus: disku skaits uz tapas a; Izvade: sekvencēšana; Step0:(definējiet mainīgā tipu); Step1: (hanojas procedūras apraksts, kas parāda darbību secību); Step1.1:(pārvietojiet (n-1) diskus no piesaistes a uz tapu b); Step1.2:(pārvietojiet n-to disku no a uz c); Step1.3:(pārvietot (n-1) disku no b uz c); (soļi 1.2-1.3 tiek veikti rekursīvi); Step2:(galvenā programma); Step2.1:(ievadiet disku skaitu); 2.2. darbība: (Hanojas procedūras izsaukšana). Problēmas risināšana Pascal programmā bahnya; var n: vesels skaitlis; a,b,c: char; procedūra hanoi(n: integer;a,b,c: char); sākas, ja n>0, tad sākas hanoi(n-1,a,c,b); writeln ("Peremestit disks so sterzhnya ",a," na sterzhen" ",b); hanoi(n-1,c,b,a); beigas; beigas; Sākt rakstīt ("Vvedite naturalnoe chislo n"); readln ( n); a:="a"; b:="b"; c:="c"; hanoja (n,a,c,b); readln; end. Mājas darbs Uzrakstiet programmu grāda aprēķināšanai ar naturālu eksponents Dots: grādu bāze X Eksponents Uz Ja k=0, tad grāds(k,x)=1, Citādi grāds(k,x)= x· grāds(k-1,x) Programma stepen; var y: reāls; n:integer; funkcijas solis(k:vesels skaitlis, x:reāls): reāls; sākums Ja k = 0 Tad solis:= 1 cits solis:= x * solis(k-1,x) Beigas; begin write(‘vvedite osnovanie stepeni x=’); readln(y); write(‘vvedite pokazatel stepeni k=’); Readln(n); write(‘x v stepeni k=’,solis(n,y)); readln; beigas. Patstāvīgs darbs

  • Atrodiet skaitļa ciparu summu
  • Nosakiet, vai dotais naturālais skaitlis ir pirmskaitlis
  • Atrodiet skaitļa pirmo ciparu
  • Pārvērst naturālo skaitli no decimāldaļas s.s. uz bināro
  • Atrodiet veselu skaitļu masīva, kas sastāv no 20 elementiem, elementu summu
  • Apmainiet divu veselu skaitļu vērtības
  • Pasūtiet trīs mainīgo vērtības a, b, c augošā secībā
  • Atrodiet ciparu skaitu dabiskais skaitlis n
  • Atrodiet lielāko no trim dotajiem skaitļiem
  • Atrodiet pozitīvo skaitļu skaitu starp četriem A, B, C, D
Atbildes patstāvīgajam darbam Nr.2 Programma vienkārša; var n, m, s: vesels skaitlis; funkcija prost(m, n:integer): Būla; sākt Ja n = m Tad prost:= true else prost:= (n mod m<>0) un prost (m+1, n); Beigas; sākt rakstīt('n='); Readln(n); M: = 2; Ja prost(m,n), tad rakstiet (n,’prostoechislo’) Citādi rakstiet (n,’sostavnoe’); readln; beigas.

programmu tulkošana;

procedura dvd(n:longint);

Ja n >1 Tad dvd (n div 2);

write(n mod 2);

Apakšprogrammas Bieži vien uzdevums prasa atkārtot noteiktu paziņojumu secību dažādās programmas daļās. Lai vienreiz aprakstītu šo secību un izmantotu to vairākas reizes, programmēšanas valodas izmanto apakšprogrammas. Apakšprogramma ir īpaši izstrādāts programmas bloks tās turpmākai atkārtotai izmantošanai galvenajā programmā Apakšprogrammu izmantošana ļauj realizēt vienu no modernākajām programmēšanas metodēm - strukturētu programmēšanu.


Apakšprogrammas atrisina trīs svarīgas problēmas, kas ievērojami atvieglo programmēšanu: 1. tās novērš nepieciešamību atkārtoti atkārtot līdzīgus fragmentus programmas tekstā, t.i. samazināt programmas apjomu; 2. uzlabos programmas struktūru, padarot to vieglāk saprotamu parsējot; 3.samazināt kļūdu iespējamību, palielināt izturību pret programmēšanas kļūdām un neparedzētām sekām modifikācijas laikā.


Procedūras un funkcijas Paskālā ir divu veidu apakšprogrammas: procedūra (PROCEDURE) un funkcija (FUNCTION). Pascal procedūras un funkcijas tiek deklarētas deklarācijas sadaļā aiz mainīgā sadaļas. ProgrammasProgrammas nosaukums; VAR ... // sadaļa galvenās programmas mainīgo aprakstīšanai; procedūra ProcedureName; var ... begin ...//Procedure body end; sākums // galvenās programmas pamatteksts beigas.


Funkcijām un procedūrām ir parametri (mainīgie, kas nodod vērtību). Tie ir divu veidu: 1) Formālie - tie, kas ir apakšprogrammas aprakstā 2) Faktiskie - tie, kas tiek pārnesti no galvenās programmas uz funkciju vai procedūru. Faktiskajiem parametriem pēc daudzuma, pasūtījuma un veida jāatbilst formālajiem.




Procedūras Procedūras tiek izmantotas, ja apakšprogrammai ir jāiegūst vairāki rezultāti. Pascal ir divu veidu procedūras: procedūras ar parametriem un bez parametriem. Procedūrai var piekļūt, izmantojot procedūras nosaukumu, kam var sekot faktiskie parametri. Kad tiek izsaukta procedūra, starp faktiskajiem un formālajiem parametriem tiek noteikta atbilstība viens pret vienu, pēc tam kontrole tiek nodota procedūrai. Pēc procedūras izpildes vadība tiek nodota nākamajam izsaucošās programmas operatoram pēc procedūras izsaukšanas.


1. piemērs: procedūra bez parametriem, kas izdrukā 60 zvaigžņu virkni. procedūra pr; var i: vesels skaitlis ; sākums i:=1 līdz 60 do rakstīt (* "); writeln; beigas; sākums pr; beigas.


Piemērs 2. Izveidot programmu divu skaitļu c=5 un d=7 apmaiņai programma obmenDan; var c,d:integer; procedūru apmaiņa (a,b:integer); var m:integer; sākt m:=a; a:=b; b:=m; writeln(a,b); beigas; begin writeln("Ievadiet 2 ciparus: "); readln(c,d); maiņa(c,d); writeln(c," ",d); beigas. c5 d 7 a 5 b 7 1) izsaucot obmen procedūru ar diviem parametriem 5 un 7, mainīgajos a un b tiek ievietoti tie paši skaitļi 5 un 7: 2) tad procedūrā atmiņas šūnu vērtības a un b ir pārkārtoti: c5 d 7 a 7 b 5 3) bet mainīgajos c un d dati nav mainījušies, jo tie atrodas citās atmiņas šūnās


Lai mainīgie c un d, a un b atsauktos uz tām pašām atmiņas šūnām (ja mainās a un b vērtības, tad mainīsies arī c, d vērtības), aprakstot formālos parametrus, tas pirms nepieciešamajiem mainīgajiem ir nepieciešams pievienot vārdu VAR: procedure exchange (var a,b:integer); с5 d 7 a b


Piemērs 3. Doti 3 dažādi veselu skaitļu masīvi (katra izmērs nepārsniedz 15). Katrā masīvā atrodiet elementu summu un vidējo aritmētisko. programma proc; var i, n, summa: vesels skaitlis; sr: īsts; procedūras darbs (r:integer; var s:integer; var s1:real); var mas: veselu skaitļu masīvs ; j:integer; sākt s:=0; j:=1 līdz r sāk lasīt (mas[j]); s:=s+mas [j]; beigas; s1:=s/r; beigas;


(galvenā programma) begin for i:=1 to 3 do begin write ("Vvedite razmer",i, "masiva: "); readln(n); darbs(n, summa, sr); (izsaukuma procedūras darbs) writeln ("Summa elementov = ",sum); writeln("Srednearifmeticheskoe = ",sr:4:1); beigas; beigas.


Programmas rezultāts: Programma trīs reizes izsauc darba procedūru, kurā formālie mainīgie r, s, s1 tiek aizstāti ar faktisko n, summa, sr. Procedūra ievada masīva elementus, aprēķina summu un vidējo. Mainīgie lielumi s un s1 tiek atgriezti galvenajā programmā, tāpēc servisa vārds var tiek ievietots pirms to apraksta. Vietējie parametri mas, j ir spēkā tikai procedūrā. Globālie — i, n, summa, sr ir pieejami visā programmā.


Funkcijas Pascal valodā Iebūvēto funkciju kopums Pascal valodā ir diezgan plašs (ABS, SQR, TRUNC utt.). Ja programmā ir iekļauta jauna, nestandarta funkcija, tad tā ir jāapraksta programmas tekstā, pēc kā tai var piekļūt no programmas. Funkcijai tiek piekļūts piešķiršanas operatora labajā pusē, norādot funkcijas nosaukumu un faktiskos parametrus. Funkcijai var būt savas lokālās konstantes, veidi, mainīgie, procedūras un funkcijas. Funkciju apraksts programmā Pascal ir līdzīgs procedūru aprakstam.




4. piemērs. Uzrakstiet a x pakāpes apakšprogrammas funkciju, kur a, x ir jebkuri skaitļi. Izmantosim formulu: a x = e x lprogrammā p2; var f, b, s, t, c, d: reāls; (globālie mainīgie) funkcija stp (a, x: real) : reāls; var y: reāls; ( lokālie mainīgie) begin y:= exp (x * ln (a)) ; stp:= y;(funkcijas nosaukuma piešķiršana apakšprogrammas aprēķinu rezultātam) end; (funkcijas apraksts pabeigts) begin d:= stp (2.4, 5); (dažādu skaitļu un mainīgo pakāpju aprēķina) writeln (d, stp (5,3.5)); lasīt(f, b, s, t); c:= stp (f, s)+stp (b, t); writeln(c); beigas.


Funkcijas Apakšprogramma ir programmas daļa, kas veidota kā atsevišķa sintaktiska struktūra un nodrošināta ar nosaukumu (neatkarīgs programmas bloks), kas paredzēta atsevišķu problēmu risināšanai. Procedūras apraksts: procedūra () (sadaļa vietējo nosaukumu izpildei) Begin (sadaļa izpildoperatoriem) Beigs; Funkcijas apraksts: funkcija (): tips; (sadaļa vietējo nosaukumu aprakstīšanai) Begin (sadaļa izpildāmiem priekšrakstiem) := ; (obligāts parametrs) End; Procedūras izsaukums: (); Funkcijas izsaukums: := (); 1. Piešķiršanas operatora labajā pusē. 2. Izteiksmē zarojuma operatora stāvoklī. 3. Izvades procedūrā, funkcijas rezultātā. Apakšprogrammu apraksts Procedūras


Rekursija Pascal procedūras un funkcijas var sevi saukt, t.i. piemīt rekursivitātes īpašība. Rekursīvajai funkcijai obligāti jāietver nosacījums rekursivitātes izbeigšanai, lai neizraisītu programmas cilpu. Katrs rekursīvs izsaukums rada jaunu lokālo mainīgo kopu. Tas nozīmē, ka mainīgie, kas atrodas ārpus izsauktās funkcijas, netiek mainīti.


1 funkcija f (n: vesels skaitlis): vesels skaitlis; sākt, ja n = 1, tad f:= 1 cits f:= n * f (n -1); (funkcija f izsauc sevi" title="Piemērs 5. Izveidojiet rekursīvu funkciju, kas aprēķina skaitļa n faktoriālu šādi: n! = 1, ja n= 1 n!= (n -1)! ja n > 1 funkcija f (n: vesels skaitlis): vesels skaitlis; sākt, ja n = 1, tad f:= 1 else f:= n * f (n -1); (funkcija f izsauc pati sevi" class="link_thumb"> 19 !} Piemērs 5. Izveidojiet rekursīvu funkciju, kas aprēķina skaitļa n faktoriālu šādi: n! = 1, ja n= 1 n!= (n -1)! · n, ja n > 1 funkcija f (n: vesels skaitlis): vesels skaitlis; sākt, ja n = 1, tad f:= 1 cits f:= n * f (n -1); (funkcija f izsauc sevi) end; 1 funkcija f (n: vesels skaitlis): vesels skaitlis; sākt, ja n = 1, tad f:= 1 cits f:= n * f (n -1); (funkcija f izsauc sevi"> 1 funkcija f (n: vesels skaitlis): vesels skaitlis; sākas, ja n = 1, tad f:= 1 else f:= n * f (n -1); (funkcija f izsauc sevi) beigas; " > 1 funkcija f (n: vesels skaitlis): vesels skaitlis; sāciet, ja n = 1, tad f:= 1 else f:= n * f (n -1); (funkcija f izsauc sevi" title="Piemērs 5 Izveidojiet rekursīvo funkciju, kas aprēķina skaitļa n faktoriālu šādi: n = 1, ja n= 1 n!= (n -1)!n, ja n > 1 funkcija f (n: vesels skaitlis): vesels skaitlis; sākt, ja n = 1, tad f:= 1 cits f:= n * f (n -1); (funkcija f izsauc sevi"> title="Piemērs 5. Izveidojiet rekursīvu funkciju, kas aprēķina skaitļa n faktoriālu šādi: n! = 1, ja n= 1 n!= (n -1)! · n, ja n > 1 funkcija f (n: vesels skaitlis): vesels skaitlis; sākt, ja n = 1, tad f:= 1 cits f:= n * f (n -1); (funkcija f izsauc sevi"> !}



1. slaids

3. slaids

Apakšprogrammas: globālie un lokālie mainīgie Visas apakšprogrammas jāapraksta apraksta sadaļā. Katrai apakšprogrammai ir jābūt nosaukumam. Informācija starp galveno programmu un apakšprogrammām tiek pārraidīta ar globāliem parametriem (mainīgajiem), kas darbojas jebkurā programmas daļā un kuriem ir nosaukums, kas aprakstīts galvenajā programmā. Vietējos parametrus (mainīgos) var izmantot apakšprogrammā - to nosaukumiem un vērtībām ir nozīme tikai noteiktās apakšprogrammas robežās un tie nav pieejami izsaucējai programmai.

4. slaids

Formālie un faktiskie parametri Apakšprogrammu aprakstā parametri tiek norādīti tikai ar nosaukumiem, tāpēc tos sauc par formāliem. Tiem nav nozīmes, kamēr nav izsaukta apakšprogramma. Tie rezervē vietu tikai faktiskajiem parametriem, fiksējot to skaitu un datu tipu. Faktisko parametru veidi: Vērtību parametri norāda, kāda vērtība jāpiešķir konkrētam apakšprogrammas parametram. Pēc apakšprogrammas beigām tās iegūst iepriekšējās vērtības, pat ja apakšprogrammā tās tika mainītas. Mainīgie parametri apakšprogrammā aizstāj formālo, tie var mainīt savu vērtību apakšprogrammas izpildes laikā un saglabāt izmaiņas, izejot no apakšprogrammas (mainīgo parametru priekšā ir atslēgvārds Var).

5. slaids

6. slaids

Procedūras apraksts Programma Pr1; Const...Type...Var...Procedure(); Aprakstošā daļa Sākt Procedūras pamatteksts Beigas; Sākt...(); ... beigas. Kad tiek izsaukta procedūra, formālie parametri tiek aizstāti ar faktiskajiem.

7. slaids

Divu skaitļu summas aprēķināšanas kārtība programma pr1; Usescrt; Var a,b,s:real; procedūra summa(x,y:real;var z:real); sākt z:=x+y; beigas; sākt clrscr; writeln("ievadiet a, b"); readln(a,b); summa(a,b,s); writeln(" skaitļu summa ",a:3:1," un ",b:3:1," = ",s:3:1); readln; beigas. x,y,z – formālie parametri, lokāli mainīgie a,b,s– globālie mainīgie a,b,s – faktiskie parametri x y z a b s Vērtību parametri Parametru mainīgais

8. slaids

9. slaids

10. slaids

Aprēķini izteiksmes vērtību a:=(3n!+2m!)/(m+n)! Lai atrastu faktoriālu, kāda veida mainīgos ir piemēroti izmantot? programma pr2; Usescrt; Var m,n,x,y,z:vesels skaitlis; a:real; procedura fakts(d:integer;var q:integer); var i:integer; sākt q:=1; ja i:=1 līdz d, veic q:=q*i; beigas; sākt clrscr; writeln ("ievadiet vērtības n, m"); readln(n,m); fakts(n,x); fakts(m,y); fakts(m+n,z); a:=(3*x+2*y)/z; writeln("izteiksmes vērtība ar m= ",m:4," un n= ",n:4,"ir vienāda ar",a:8:3); readln; beigas. N!=1·2·3·…· N

11. slaids

Viendimensijas masīva elementu ievades izvade Funkcija Random(X) ģenerē nejaušu vesela vai reāla veida skaitli no 0 līdz X (pirms funkcijas izsaukšanas tā ir jāinicializē, izmantojot Randomize procedūru). Ja parametrs X nav norādīts, rezultāts būs Real tipa diapazonā no 0,0 līdz 1,0. Lai iegūtu nejaušu veselu skaitļu masīvu no diapazona nejaušs(B-A+1)+A Uzdevums: Formulējiet viendimensijas masīva elementu ievadi, izmantojot nejaušo skaitļu ģeneratoru (vērtību diapazons no -10 līdz 20) un elementu izvadīšana kā procedūra. Ja A=-10 B=20 nejauši (20-(-10)+1)+(-10)

12. slaids

13. slaids

14. slaids

Funkcijas apraksts Funkcijas ir paredzētas, lai aprēķinātu tikai vienu vērtību, 1. Tāpēc tās pirmā atšķirība ir tāda, ka procedūrai var būt jaunas vērtības vairākiem parametriem, bet funkcijai ir tikai viens (tas būs rezultāts). 2. Otrā atšķirība ir funkcijas nosaukumā. Tas sastāv no vārda FUNCTION, kam seko funkcijas nosaukums, pēc tam iekavās norādīts formālo parametru saraksts, kam seko funkcijas rezultāta veids, atdalot to ar kolu. 3. Funkcijas pamattekstā ir jābūt vismaz vienam piešķiršanas operatoram, kur funkcijas nosaukums ir kreisajā pusē, bet tā vērtība ir labajā pusē. Funkcija (): Aprakstošais sākums Funkcijas pamatteksts:=; Beigas;

15. slaids

Aprēķini izteiksmes vērtību a:=(3n!+2m!)/(m+n)! programma fn2; Usescrt; Var m,n:integer; a:real; funkcija fact(d:integer) :longint; var i:integer; q:longint; sākt q:=1; ja i:=1 līdz d, veic q:=q*i; fakts:=q; beigas; sākt clrscr; writeln ("ievadiet vērtības n, m"); readln(n,m); a:=(3*fakts(n)+2*fakts(m))/fakts(m+n);; writeln("izteiksmes vērtība ar m= ",m:4," un n= ",n:4,"ir vienāda ar",a:8:3); readln; beigas.

16. slaids

Izveidojiet programmu, kas atradīs ab, tas ir, skaitļa A bth, kur A un B ir veseli skaitļi un B>0, kas ievadīti no tastatūras. Sastādiet programmu, funkciju aizstājot ar procedūru programmu pr2; Usescrt; Var a,b:integer; c:longint; Funkcija stepen(x,y:integer):longint; var i:integer; s:longint; sākt s:=1; i:=1 līdz y veic s:=s*x; solis:=s; beigas; sākt clrscr; writeln ("ievadiet vērtības a, b"); readln(a,b); C:=solis(a,b); writeln("s=",s); readln; beigas.

17. slaids

18. slaids

Mehānisms parametru nodošanai funkcijām un procedūrām Ko izdrukās procedūra un ko programma? Globālie mainīgie Lokālie mainīgie a b 3 3 -3 Adrese c a b c 48 Adrese c A:=b+3 B:=3*a C:=a+b Stāvoklis C 24 5 8 Atbildēt

19. slaids

8. klase. Programmēšana ar ABC Pascal

Uralskas fizikas un matemātikas NIS informātikas skolotājs Zeļenovs Boriss Aleksandrovičs


  • Problēmu risināšanai studenti izmanto procedūras un funkcijas
  • Studenti mācās atrisināt lielas problēmas, sadalot tās mazākās

  • Izstrādāt procedūru un funkciju koncepciju programmēšanas valodā.

  • Studenti zina jēdzienus “procedūras” un “funkcijas”, nosaka formālos un faktiskos parametrus

Paredzamie rezultāti — deskriptori:

1. zina “procedūras” definīciju

2. zina “funkcijas” definīciju

3.Nosaka faktiskos un formālos parametrus

4.Atšķir vērtību un mainīgo parametrus

5. Atrod izsaukumu uz procedūru vai funkciju programmas kods



Elvīras standarta plāns

1. Izņemiet papīrus

2. Laistiet ziedus

3. Nomazgājiet rakstāmgaldus

4. Noslaukiet stiklu

Algoritma beigas

Kā uzlabot šī procesa organizāciju?




Nodarbības tēma

Apakšprogrammas:


Ishki bagdarlama

Apakšprogramma

Procedūra

Procedūra

Parametrs

Noderīgas frāzes:

Lai nodotu mainīgās vērtības procedūrai (funkcijai), tiek izmantoti faktiskie parametri...

Lai aprakstītu procedūru, vispirms vajadzētu..., tad...


Apakšprogrammas jēdziens

Definīcija

Apakšprogramma- Šī ir atsevišķa funkcionāli neatkarīga programmas daļa.

Apakšprogrammas

Procedūras


  • novērst nepieciešamību atkārtoti atkārtot līdzīgus fragmentus programmas tekstā;
  • uzlabot programmas struktūru, padarot to vieglāk saprotamu;
  • palielināt izturību pret programmēšanas kļūdām un neparedzētām sekām programmas modifikāciju laikā.

  • Uzzīmējiet žogu, izmantojot programmēšanas valodu

Šajā uzdevumā varat izveidot procedūru, kas izpildīs viena fragmenta (sētas žoga) zīmēšanas algoritmu, un pēc tam pastāvīgi atsaukties uz šo procedūru, mainot pildspalvas sākotnējo stāvokli.


  • Aprakstiet, kā programmēšanas vidē efektīvi uzzīmēt Ziemassvētku eglīti

  • Tie ir neatkarīgi programmu fragmenti, kas izstrādāti īpašā veidā un kuriem ir savs nosaukums.

Galvenās programmas un apakšprogrammas mijiedarbība



Blokshēma

  • Apakšprogrammas (procedūras vai funkcijas) izsaukuma bloks

Apakšprogrammas (procedūras vai funkcijas) nosaukums


Blokshēma


Procedūras apraksts ir šāds:

procedūru nosaukums(formālo parametru saraksts); aprakstu sadaļa sākt operatoriem beigas ;


Funkcijas apraksts izskatās šādi:

funkciju nosaukums (formālo parametru saraksts): atgriešanās veids;

aprakstu sadaļa sākt operatoriem beigas ;


Atrašanās vieta programmā

Programma ...;

//Apraksta sadaļa Lietošanas, Const, Var, ...

procedūru A ;

sākt ....... beigas ;

procedūru B ;

sākt ........ beigas ;

Funkcija C ;

sākt ........ beigas ;

//Galvenā programma

sākt ........ beigas .


  • Atšķirība starp funkciju un procedūru ir tāda, ka operatoru, kas veido funkcijas pamattekstu, izpildes rezultāts vienmēr ir viena vērtība, tāpēc funkcijas izsaukšanu var izmantot atbilstošās izteiksmēs kopā ar mainīgajiem un konstantēm.

Procedūras

Funkcijas

Var būt vairāki rezultāti vai veikt dažas darbības

Ir tikai viens rezultāts, kura veids tiek norādīts atsevišķi, deklarējot funkciju.

Rezultāti var būt jebkura veida vērtības - masīvi, virknes, skaitļi utt.

Rezultāts var būt tikai vērtība, kuras veids ir real, integer vai char.

Procedūras izsaukšanas komanda ir atsevišķa komanda, ko var izmantot neatkarīgi

Funkcijas izsaukumu var izmantot tikai kā atbilstošā tipa izteiksmes sastāvdaļu.

Funkcijas pamattekstā ir jābūt vismaz vienam piešķiršanas operatoram ar funkcijas nosaukumu kreisajā pusē.


b, tad max:=a cits max:=b; MaxNumber:= max; beigas;" platums = "640"

Procedūra vai funkcija?

MaxNumber(a,b: integer): vesels skaitlis;

var max: vesels skaitlis;

MaxNumber:= max;


b, tad max:=a cits max:=b; beigas;" platums = "640"

Procedūra vai funkcija?

MaxNumber(a,b: vesels skaitlis; var max: vesels skaitlis);

ja ab, tad max:=a else max:=b;


Procedūra vai funkcija?

ChangeColor(C1, C2: Word);

TextBackGround (C2)


Procedūra vai funkcija?

Pievienot(X, Y: vesels skaitlis): vesels skaitlis;


Faktiskais

  • Norādīts galvenajā programmas sadaļā

Formāls

  • Norādīts apakšprogrammā
  • Norādīts apakšprogrammā

Procedūru izsauc operators ar šādu formātu:

procedūras nosaukums (faktisko parametru saraksts);

  • Faktisko parametru saraksts- šis ir to saraksts, kas atdalīts ar komatiem.

  • Pascal valodas standartā parametrus var nodot divos veidos – pēc vērtības un pēc atsauces. Tiek izsaukti parametri, kas nodoti pēc vērtības parametri-vērtības, nodots ar atsauci - parametri-mainīgie. Pēdējie atšķiras ar to, ka procedūras (funkcijas) galvenē tiem priekšā ir pakalpojuma vārds var.

Parametru nodošana. Formālie parametri

Mainīgie lielumi

Vērtības

Parametri pēc vērtības

Formālie parametri

Mainīgie lielumi


Formālie parametri

Parametri pēc vērtības

  • Pirmajā metodē (pārejot pēc vērtības) faktisko parametru vērtības tiek kopētas attiecīgajos formālos parametros.

Procedūra

Procedūras nosaukums (a, b: vesels skaitlis);

Galvenā programma

Mainot šīs vērtības procedūras (funkcijas) izpildes laikā, sākotnējie dati (faktiskie parametri) nevar mainīties


Var c, d: vesels skaitlis;

  • Pārejot ar atsauci, visas izmaiņas, kas notiek procedūras (funkcijas) ar formāliem parametriem pamattekstā, nekavējoties izraisa līdzīgas izmaiņas attiecīgajos faktiskajos parametros.

Procedūra

Procedūras nosaukums (a, b: vesels skaitlis, Var c: reāls);

Galvenā programma

Izsaucošā bloka mainīgajos notiek izmaiņas, tāpēc izvades parametri tiek nodoti pēc atsauces. Izsaucot, to atbilstošie faktiskie parametri var būt tikai mainīgie.


Tu raksti:

1.Faktiskie parametri___________

Procedūra Kvad(R: reāls; var S: reāls);

2. Formālie parametri ___________

3. Formālie parametri-vērtības__________

5.Procedūras nosaukums ___________

6. Piekļuve procedūrai no programmas _________________________


Interaktīvs uzdevums

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


Elvīra ir klases vadītāja. Viņai būs jāsastāda vispārējās uzkopšanas plāns klasē: jānoņem papīri, jāaplej puķes, jānomazgā galdi, jānoslauka stikli. Kā viņa var labāk organizēt savu darbu? Palīdzi Elvīrai.


Elvīras uzlabotais plāns

Apakšprogrammas:

Arsens - noliek papīrus

Mila - ziedu laistīšana

Vitālijs – mazgā rakstāmgaldus

Indira – slauka stiklu

1. Izpildīt Arsenu

2. Palaidiet Milu

3. Izpildīt Vitāliju

4. Skrien Indira

Algoritma beigas


  • Kādas jaunas programmēšanas valodas struktūras mēs šodien esam satikuši?
  • Nosauciet pētītos parametrus
  • Kā parametri tiek nodoti procedūrai?

  • Nodarbības kopsavilkums
  • Atrodiet definīcijas: “Vietējie mainīgie” un “Globālie mainīgie”
  • Izveidojiet divus uzdevumus, kuros varat izmantot procedūras vai funkcijas.

  • Kā jūs noteiktu nodarbības tēmu? (izdomā savu vārdu)
  • Kas, jūsuprāt, būtu jāiemācās nākamajā nodarbībā?

Satiekamies

nākamā nodarbība!

Nodarbības mērķis

izglītojošs

  • veidot studentu vidū vienotu jēdzienu sistēma saistīti ar procedūras un funkcijas jēdzieniem;
  • iemācīt izmantot apakšprogrammas uzdevumu risināšanā Paskālā, kā arī iemācīt saprast, kāda veida apakšprogramma ir nepieciešama, risinot noteiktu problēmu;
  • parādīt apakšprogrammu lietošanas pamatmetodes;

izglītojošs

  • audzināt precizitāti, uzmanību, organizētību;
  • skaitļošanas prasmju kultūra;

attīstot

  • attīstīt studentu loģisko domāšanu, algoritmisko kultūru;
  • attīstīt zināšanas un prasmes, lai izveidotu un atkļūdotu apakšprogrammas Pascal.

Studentiem ir:

  • zināt noteikumus rakstīšanas procedūrām bez parametriem un ar parametriem;
  • pārzināt rakstīšanas funkciju noteikumus;
  • prast pielietot procedūras un funkcijas vienkāršu problēmu risināšanai.

Nodarbību laikā

I. Org. brīdis

II. Ievads. Atbilstība

Izsniedziet uzdevumu uz papīra lapiņām ( 1.pielikums ). Atrodiet atkārtojumus.

Dažkārt dažādās programmas vietās ir jāveic gandrīz vienādas darbību secības ar dažādiem sākuma datiem. Šādas darbību secības var formalizēt t.s apakšprogrammas (no angļu valodas, apakšprogramma) - sagrupējiet operatorus blokā, kuram var piekļūt pēc nosaukuma un atkārtoti.

Apakšprogrammas saīsina programmas tekstu, ievērojami samazina to izpildes laiku un atvieglo dzīvi programmētājiem, kuri var izveidot programmas modulāri, tas ir, saliekot sarežģītu programmu no pabeigtām vienkāršāku komponentu daļām. Tas ļauj programmētāju grupai izveidot lielas programmas un skolēnu grupai izstrādāt un īstenot jebkādus globālus projektus.

Apakšprogrammas ir sadalītas procedūrās un funkcijās.

Iebūvētās (standarta) procedūras un funkcijas ir daļa valodā un to var saukt vārdā bez iepriekšēja apraksta. Piemēram , abs, sqrt, ln, sin... ir funkcijas (atgriež rezultātu), readln, write... ir procedūras (neatgriež rezultātu). To klātbūtne ievērojami atvieglo lietojumprogrammu izstrādi. Tomēr vairumā gadījumu daži specifisks konkrētai programmai darbības neatrod tiešus analogus Turbo Pascal bibliotēkās, un tad programmētājam ir jāizstrādā savs. nestandarta procedūras un funkcijas.

III. Jaunā materiāla skaidrojums

Lietotāja procedūras ir uzrakstītas mēs paši programmētājs saskaņā ar valodas sintaksi apakšprogrammas apraksta sadaļa.

Procedūras struktūra atbilst programmas struktūrai, tā ir "programma miniatūrā" - to attēlo arī galvene un pamatteksts.

Galvene sastāv no rezervētās vārda procedūras, identifikatora (vārds) procedūras.

VAR ... // sadaļa galvenās programmas mainīgo aprakstīšanai

procedūra ProcedureName;

//galvenās programmas pamatteksts

Procedūras aicinājums turpmākai izpildei tiek ierakstīts galvenās programmas pamattekstā.

1. piemērs. Programma platības un perimetra aprēķināšanai.

Apakšprogrammu priekšrocības:

  • Programmas, kas rakstītas, izmantojot apakšprogrammas vieglāk pārbaudīt un atkļūdot, viņiem ir skaidrāks loģiskā struktūra.
  • Apakšprogrammu neatkarīgais raksturs ļauj to izveidi uzticēt dažādiem programmētājiem. Tādā veidā programmēšanas darbs tiek sadalīts un līdz ar to tiek paātrināta tā pabeigšana;
  • Apakšprogrammu izmantošana ietaupa atmiņu. Atmiņa apakšprogrammā izmantoto mainīgo lielumu glabāšanai tiek piešķirta tikai uz tās darbības laiku un tiek atbrīvota, tiklīdz tās izpilde beidzas.

2. piemērs. Lietotājs ievada trīs taisnstūru divas malas. Atvasiniet to apgabalus.

Jūs varat atrisināt problēmu šādi:

i:=1 līdz 3 darīt

writeln('Ievadiet a un b:');

writeln('Apgabals=',a*b);

Procedūru izmantošana tiek uzskatīta par labu programmēšanas stilu. Ir nepieciešama procedūra, kas aprēķinās taisnstūra laukumu. Lūk, kā shematiski izskatīsies galvenā programma:

aprēķins

aprēķins

aprēķins

Teksta procedūra jau pastāv (sk. 1. piemēru). Izveidosim otru procedūru, kas aprēķina laukumu. Bet, lai aprēķinātu S, ir jāzina 2 malas, tāpēc procedūrā jāparāda, kuras puses tai jāreizina.

procedūra pl (c,d: vesels skaitlis);

writeln(‘taisnstūra laukums ar malām ’,c, ‘’ ,d, ‘=’,S);

Parametrs ir mainīgais, kam tiek piešķirta vērtība. Pastāv formālie parametri , kas definēts apakšprogrammas galvenē, un faktiskie parametri – izteiksmes, kas norāda konkrētas vērtības, piekļūstot apakšprogrammai.

Procedūra tiks izpildīta, ja to izsauksit pēc nosaukuma un norādīsiet faktiskos parametrus , atdalīts ar komatiem un likts iekavās:

Faktiskajiem parametriem pēc veida un daudzuma ir jāatbilst formālajiem.

Tātad, galvenā programma:

i:=1 līdz 3 darīt

komentēt. Risinot šo problēmu, ir jāpārbauda lietotāja ievadītie skaitļi (tie nedrīkst būt negatīvi, pretējā gadījumā programma tiks pārtraukta).

Izveidosim verifikācijas procedūru:

procedūras kļūda (f,g:integer);

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

writeln('taisnstūra malas nevar būt negatīvas');

apstāties; // programmas pārtraukums

Noslēguma programma - 4. pielikums

Tātad procedūras formāts:

Procedūra<имя>(formālie parametri);

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

3. piemērs. Uzrakstiet programmu divu skaitļu c=5 un d=7 vietu samainīšanai.

programmu apmaiņaDan;

var c,d:integer;

procedūru apmaiņa (a,b:integer);

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

writeln("Ievadiet 2 ciparus: ");

writeln(c," ",d);

Pēc programmas palaišanas var redzēt, ka formālie parametri (procedūrā) ir mainījušies vietām, bet faktiskie (kas tiek lietoti galvenajā programmā) nav mainījušies. Apskatīsim attēlu, kas parāda daļu no RAM:

1) izsaucot obmen procedūru ar diviem parametriem 5 un 7, skaitļus 5 un 7 ievieto arī attiecīgi mainīgajos a un b:

3) bet mainīgajos c un d dati nav mainījušies, jo tie atrodas citās atmiņas šūnās.

Lai mainīgajiem c un d, a un b atsaucās uz tām pašām atmiņas šūnām (ja mainās a un b vērtības, mainīsies arī c, d vērtības) aprakstot formālos parametrus, pirms nepieciešamajiem mainīgajiem jāpievieno vārds VAR:

procedūru apmaiņa (var a,b:integer);

Mainiet programmu obmenDan:

Kļūda, jo var. Skaitļi ir konstantes, kuras nevar mainīt procedūrā.

4. piemērs. Atrodiet apļa laukumu, izmantojot procedūru, kas tikai aprēķina, bet nerāda rezultātu ekrānā.

procedūru aplis(r:real);

Procedūrai jāatgriež rezultāts:

procedūru aplis (r:real; var S:real);

readln(a, e);

komentēt: Mainīgais procedūrā S tiek izmantots, lai atgrieztu procedūras rezultātus galvenajā programmā. Kad tas mainās, mainās arī faktiskais parametrs izsaucošajā programmā, t.i. mainīgais e.

Biežāk šim nolūkam Paskālā procedūru vietā tiek izmantotas funkcijas (apakšprogrammas, kas kaut ko atgriež).

Funkcija ir līdzīga procedūrai, taču ir divas atšķirības.

  • Funkcija pārraida programmai sava darba rezultātu - vienu vērtību, kuras nesējs ir tās funkcijas nosaukums.
  • Funkcijas nosaukums izteiksmē var parādīties kā operands. Funkcija atgriež rezultātu tās izsaukuma punktā.

Piemēram, sqr(x) – liks kvadrātā vērtību x un atgriezīs izsaukuma punktā aprēķināto skaitļa x kvadrāta vērtību: y:=sqr(x);

Lietotāja definēta funkcija sastāv no funkcijas galvenes un funkcijas pamatteksta. Funkcijas pamatteksts pēc struktūras ir līdzīgs programmai. Etiķešu apraksts, konstantes, veidi utt. spēkā tikai šīs procedūras ietvaros.

Funkcija<имя>(formālie parametri):<тип результата>;

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

Paziņojuma sadaļā ir jābūt vismaz vienam priekšrakstam, kas funkcijas nosaukumam piešķir vērtību. Pēdējā uzdevuma rezultāts tiek atgriezts izsaukuma punktā.

5. piemērs. Pārstrādāsim problēmu par apļa laukumu.

funkciju aplis (r:real): reāls;

a:=aplis(5); (OBLIGĀTI jāpiešķir)

6. piemērs. Atrodi 1!+2!+…+n!

Mēs izmantojam faktoriāla atrašanas funkciju, jo mēs to ievadām kā ievadi un iegūstam rezultātu.

funkcijas fakts (a:integer): vesels skaitlis;

i:=1, kas jādara

Rindā fakts:=fakts*I;

kompilators atradīs kļūdu, jo fakts ir jāizsauc ar parametriem. Tāpēc parasti tiek ieviests papildu mainīgais, kurā tiek ievietots rezultāts. Un tad šis rezultāts tiek piešķirts fakta mainīgajam:

programmas faktoriāls;

var summa,n,j: vesels skaitlis;

funkcijas fakts (a: vesels skaitlis): vesels skaitlis;

var i,d: vesels skaitlis;

i:=1, kas jādara

j:=1 līdz n darīt

summa:=summa+fakts(j);

IV. Nodarbības kopsavilkums

Šajā laikā programmēšanas process pārvēršas par rūpnieciskās programmatūras ražošana pamatā programmēšanas tehnoloģijas. Lielākā daļa ekspertu uzskata, ka programmas izstrādes metode no augšas uz leju vispiemērotākais sarežģītu problēmu risināšanai. Pirmkārt, uzdevums tiek definēts vispārīgi, pēc tam pakāpeniski tiek noskaidrota tā struktūra. Nākamajā solī katrs apakšuzdevums, savukārt, tiek sadalīts vairākos citos. Sarežģītas problēmas atsevišķa fragmenta risinājums ir neatkarīgs programmas bloks - apakšprogramma.

V. Mājas darbs

Atrisiniet problēmas (rakstiski):

  1. Izveidojiet procedūru, kas visus burtus a ievadītajā virknē aizstāj ar *.
  2. Ir divi priekšlikumi. Atrodiet tajos esošo burtu “n” kopējo skaitu. (Definējiet funkciju, lai aprēķinātu burtu “n” skaitu teikumā.)