Prosedyrer og funksjoner i Pascal. Rekursjon. Subrutiner Ofte krever en oppgave at du gjentar en bestemt sekvens av utsagn i ulike deler av programmet. Prosedyrer og funksjoner Presentasjon av prosedyrer og funksjoner

Rekursjon i Pascal Lærer: Tlekhurai Yu.V. Kommunal utdanningsinstitusjon "Lyceum nr. 8" Hva ser du på maleriene? Dette fenomenet i kunsten kalles rekursjon "For å forstå rekursjon, må du først forstå rekursjon." rekursjon - delvis definisjon av et objekt gjennom seg selv, definisjon av et objekt ved å bruke tidligere definerte. Vitenskapelig sett: Rekursjon - en metode for å definere en klasse av objekter eller metoder ved først å spesifisere en eller flere (vanligvis enkle) av dens grunnleggende tilfeller eller metoder, og deretter spesifisere på grunnlag av disse reglene for å konstruere klassen som defineres. Peter Deutsch Peter Deutsch

Menneskelig iterasjon.

Rekursjon er fra Gud.

Rekursjon i fysikk Rekursjon i språk og litteratur Et klassisk eksempel på uendelig rekursjon er to speil plassert overfor hverandre: to korridorer er dannet i dem fra falmende refleksjoner av speil. Et annet eksempel på uendelig rekursjon er selveksitasjonseffekt (positiv tilbakemelding) y elektroniske kretser gevinst, når signalet fra utgangen når inngangen, forsterkes, når igjen inngangen til kretsen og forsterkes igjen. Forsterkere som denne driftsmodusen er standard for kalles selvoscillatorer. Et eksempel på et rekursivt ordbokoppslag: “Presten hadde en hund...” - typisk rekursjon Flere historier av Stanislaw Lem er viet hendelser med uendelig rekursjon: En historie om graver (“The Star Diaries of John the Quiet”), der helten suksessivt går fra en artikkel om graver til en artikkel om graver, derfra til en artikkel om sepulcaria, som igjen inneholder en referanse til artikkelen "sepulcaria". En historie om en intelligent maskin som hadde nok intelligens og latskap til å bygge en lignende for å løse et gitt problem, og betro løsningen til det (resultatet var en uendelig rekursjon, når hver ny bil bygget en som ligner henne selv og overlot oppgaven til henne). Rekursjon i programmering er en måte å organisere en beregningsprosess der en prosedyre eller funksjon refererer til seg selv under utførelsen av dens konstituerende operatører. For at et slikt anrop ikke skal være uendelig, må teksten til subrutinen inneholde en betingelse ved å nå frem som ingen ytterligere anrop skjer. dermed kan et rekursivt anrop bare inkluderes i en av grenene til subrutinen. Eksempel. Beregne faktorialet til et naturlig tall Lag en rekursiv funksjon som beregner faktorialet til tallet n som følger: funksjon f (n: heltall): longint; begynne hvis n = 1 så f:= 1 ellers f:= n * f(n -1); (funksjon f kaller seg selv) avslutte Pascal-program ved bruk av rekursjon: Var n: heltall; a: longint; funksjon faktoriell (n: heltall): longint; begynne hvis n = 1 så faktoriell:= 1 ellers faktoriell:= n * faktoriell (n -1); Slutt; Begynn å skrive('n='); Lesln(n); A:= faktorial(n); Skriv(‘n!=’,a); Readln; slutt. Leonardo fra Pisa Fibonacci

Fibonacci-tall er elementer i en tallrekke

0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, ..., der hvert påfølgende tall er lik summen av de to foregående.

Oppgave: Vis en serie med Fibonacci-tall som består av n elementer. Beskrivelse av variabler: n – antall elementer i serien; a, b - verdier av de to siste elementene i serien; c – buffer ("reserve") variabel; i – teller. Algoritme for å løse problemet: 1. Få verdien av n. 2. Tilordne a og b verdiene 0 og 1 henholdsvis (dette er de første tallene i Fibonacci-serien). Vis dem på skjermen. 3. Start fra det 3. elementet til n: a) vis summen av a og b, b) lagre verdien av variabelen b i c, c) skriv summen av a og b til b, d) tilordne verdien av c til a. Pascal-program som bruker iterasjon: programmet Fibonacci; var a,b,c,i,n: heltall; begynne skriv("n = "); readln(n); a:= 0; Skriv en," "); b:= 1; skriv(b," "); for i:=3 til n begynner skriv(a+b," "); c:= b; b:= a + b; a:=c; slutt; readln; slutt. Pascal-program som bruker rekursjon: Den rekursive definisjonen for å beregne Fibonacci-tall er som følger: Denne definisjonen av Fibonacci-tall kan enkelt konverteres til en rekursiv funksjon: funksjon f(n: Heltall) : longint; begynne Hvis 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. Домашнее задание Написать программу нахождения НОД двух натуральных чисел, используя алгоритм Евклида и рекурсию Даны два натуральных числа EN Og b. Hvis EN= b, deretter node ( EN,b)=a. Hvis EN>b, deretter node ( EN,b)= node ( a -b,b). Hvis EN< b, deretter node ( EN,b)= node ( EN,b-a). Program noddvyxchisel; var a,b: longint; funksjonnikk(a,b:langint): longint; begynne Hvis a = b Så nikk:= a annet hvis a>b så nikk:= nikk(a-b,b) annet nikk:= nikk(a,b-a) Slutt; begynne å skrive('a='); readln(a); skriv('b='); readln(b); A:= nikk(a,b); skriv(‘nikk=’,a); readln; slutt. Problem om tårnene i Hanoi. I dette tilfellet må følgende regler overholdes:

  • Du kan bare flytte én disk om gangen;
  • større disk kan ikke plasseres på mindre disk;
  • den fjernede disken må settes på en hvilken som helst pinne før den andre disken fjernes.
  • Hardtarbeidende buddhistiske munker bærer skiver fra spir til spir dag og natt. Legenden hevder at når munkene er ferdige med arbeidet sitt, vil verdens undergang komme. Man kan beregne at å løse et problem med 64 disker ville kreve 264–1 trekk. Derfor, når det gjelder verdens ende, vil det skje etter fem milliarder århundrer, hvis vi tar i betraktning at en disk beveger seg på ett sekund. Imidlertid ble både problemet og legenden om det oppfunnet i 1883 av matematikeren Edouard Lucas fra College of Saint-Louis.

Ett av de tre diamantspirene bærer 64 runde gullskiver. Skivene har forskjellige radier og er plassert på spiret i synkende rekkefølge av radier fra bunn til topp. Det er nødvendig å overføre skivene fra det første spiret til det andre, ved å bruke det tredje spiret om nødvendig.

Oppgave. Lag et rekursivt program som vil løse problemet ovenfor om Towers of Hanoi med antall disker lik n (n = 1, 2, ...). Løsning. La oss skrive inn navn på spirene: a, b, c. La hanoi(n,a,b,c)- den nødvendige funksjonen som returnerer sekvensen av diskbevegelser med enb ved hjelp av c i henhold til reglene beskrevet ovenfor. Når n=1 vet vi hvordan vi skal løse problemet. Du trenger bare å utføre "flytte"-operasjonen enb" La oss anta at vi kan løse dette problemet for n – 1 disker. Flytt n–1 disker fra enMed. Deretter flytter du den gjenværende disken fra enb og til slutt flytte n–1 disker fra cb. Inndata: antall skiver på pinne a; Produksjon: sekvensering; Step0:(definer variabeltype); Trinn 1: (beskrivelse av hanoi-prosedyren, som viser handlingssekvensen); Trinn 1.1:(flytt (n-1) disker fra pinne a til pinne b); Trinn 1.2:(flytt den n'te disken fra a til c); Trinn 1.3:(flytt (n-1) disk fra b til c); (trinn 1.2-1.3 utføres rekursivt); Trinn 2:(hovedprogram); Trinn 2.1:(skriv inn antall disker); Trinn 2.2: (kaller hanoi-prosedyren). Løse problemet i Pascal Program bahnya; var n: heltall; a,b,c: char; prosedyre hanoi(n: heltall;a,b,c: char); start hvis n>0 så begynner hanoi(n-1,a,c,b); writeln ("Peremestit disk so sterzhnya ",a," na sterzhen" ",b); hanoi(n-1,c,b,a); slutt; slutt; Begynn å skrive ("Vvedite naturalnoe chislo n"); readln ( n); a:="a"; b:="c"; hanoi (n,a,c,b); X Eksponent Til Hvis k=0, så grad(k,x)=1, Ellers grad(k,x)= x· grad(k-1,x) Program stepen; var y: ekte; n:heltall; funksjonstrinn(k:heltall, x:reell): reell; begynne Hvis k = 0 Så trinn:= 1 annet trinn:= x * trinn(k-1,x) Slutt; begynne å skrive('vvedite osnovanie stepeni x='); readln(y); skriv(‘vvedite pokazatel stepeni k=’); Lesln(n); skriv(‘x v stepeni k=’,trinn(n,y)); readln; slutt. Selvstendig arbeid

  • Finn summen av sifrene til et tall
  • Bestem om et gitt naturlig tall er primtall
  • Finn det første sifferet i et tall
  • Konverter naturlig tall fra desimal s.s. til binær
  • Finn summen av elementene i en heltallsmatrise som består av 20 elementer
  • Bytt om verdiene til to heltall
  • Bestill verdiene til tre variabler a, b, c i stigende rekkefølge
  • Finn antall sifre i naturlig tall n
  • Finn det største av tre gitte tall
  • Finn antall positive tall blant fire A, B, C, D
Svar til selvstendig arbeid nr. 2 Program enkelt; var n, m, s: heltall; funksjon prost(m, n:heltall): boolsk; begynne Hvis n = m Så prost:= true else prost:= (n mod m<>0) og prost (m+l, n); Slutt; begynne å skrive('n='); Lesln(n); M:=2; Hvis prost(m,n) så skriv (n,’prostoechislo’) Else skriv (n,’sostavnoe’); readln; slutt.

program oversettelse;

prosedyre dvd(n:longint);

Hvis n >1 Så dvd (n div 2);

skriv(n mod 2);

Subrutiner Ofte krever en oppgave at du gjentar en bestemt sekvens av utsagn i ulike deler av programmet. For å beskrive denne sekvensen én gang og bruke den mange ganger, bruker programmeringsspråk subrutiner. En subrutine er en spesialdesignet blokk av et program for påfølgende gjentatt bruk i hovedprogrammet Bruken av subrutiner lar deg implementere en av de mest moderne programmeringsmetodene - strukturert programmering


Subrutiner løser tre viktige problemer som i stor grad letter programmeringen: 1. de eliminerer behovet for gjentatte gjentakelser av lignende fragmenter i programteksten, dvs. redusere størrelsen på programmet; 2. vil forbedre strukturen til programmet, noe som gjør det lettere å forstå når du analyserer; 3.redusere sannsynligheten for feil, øke motstanden mot programmeringsfeil og uforutsette konsekvenser under modifisering.


Prosedyrer og funksjoner Det er to typer subrutiner i Pascal: prosedyre (PROSEDYRE) og funksjon (FUNKSJON). Prosedyrer og funksjoner i Pascal er deklarert i deklarasjonsdelen bak variabeldelen. ProgramProgramName; VAR ... // seksjon for å beskrive variabler i hovedprogrammet; prosedyre Prosedyrenavn; var ... begin ...//Procedure body end; start //body av hovedprogrammet slutt.


Funksjoner og prosedyrer har parametere (variabler som passerer en verdi). De kommer i to typer: 1) Formelle - de som er i beskrivelsen av subrutinen 2) Faktiske - de som overføres fra hovedprogrammet til en funksjon eller prosedyre. De faktiske parameterne må samsvare med de formelle i mengde, rekkefølge og type.




Prosedyrer Prosedyrer brukes når en subrutine trenger å oppnå flere resultater. Det er to typer prosedyrer i Pascal: prosedyrer med parametere og uten parametere. En prosedyre åpnes av prosedyrenavnet, som kan følges av faktiske parametere. Når en prosedyre kalles, etableres en en-til-en-korrespondanse mellom de faktiske og formelle parameterne, deretter overføres kontrollen til prosedyren. Etter at prosedyren er utført, overføres kontrollen til neste operatør av det anropende programmet etter å ha kalt prosedyren.


Eksempel 1: En prosedyre uten parametere som skriver ut en streng med 60 stjerner. prosedyre pr; var i: heltall ; begynne for i:=1 til 60 skriv (* "); skrivln; slutt; begynne pr; slutt.


Eksempel 2. Lag et program for å bytte to tall c=5 og d=7 program obmenDan; var c,d:heltall; prosedyreutveksling (a,b:heltall); var m:heltall; begynne m:=a; a:=b; b:=m; skrivln(a,b); slutt; begin writeln("Skriv inn 2 tall: "); readln(c,d); bytte(c,d); writeln(c," ",d); slutt. c5 d 7 a 5 b 7 1) når du kaller obmen-prosedyren med to parametere 5 og 7, plasseres de samme tallene 5 og 7 i henholdsvis variablene a og b: 2) deretter i prosedyren verdiene til minneceller a og b er omorganisert: c5 d 7 a 7 b 5 3) men i variablene c og d er dataene ikke endret, fordi de er i andre minneceller


For at variablene c og d, a og b skal referere til de samme minnecellene (hvis verdiene til a og b endres, vil verdiene til c, d også endres), når man beskriver formelle parametere, er nødvendig for å legge til ordet VAR før de nødvendige variablene: prosedyreutveksling (var a,b:heltall); с5 d 7 a b


Eksempel 3. Gitt 3 forskjellige arrays av heltall (størrelsen på hver overstiger ikke 15). I hver matrise, finn summen av elementene og det aritmetiske gjennomsnittet. program proc; var i, n, sum: heltall; sr: ekte; prosedyrearbeid (r:heltall; var s:heltall; var s1:virkelig); var mas: rekke av heltall ; j:heltall; begynner s:=0; for j:=1 til r begynner lesingen (mas[j]); s:=s+mas [j]; slutt; sl:=s/r; slutt;


(hovedprogram) start for i:=1 til 3 begynn å skrive ("Vvedite razmer",i, "masiva: "); readln(n); arbeid(n, sum, sr); (anropsprosedyrearbeid) writeln ("Summa elementov = ",sum); writeln("Srednearifmeticheskoe = ",sr:4:1); slutt; slutt.


Resultat av programmet: Programmet kaller opp arbeidsprosedyren tre ganger, hvor de formelle variablene r, s, s1 erstattes med faktisk n, sum, sr. Prosedyren legger inn matriseelementer, beregner sum og gjennomsnitt. Variablene s og s1 returneres til hovedprogrammet, så tjenesteordet var plasseres foran beskrivelsen. Lokale parametere mas, j er kun gyldige i prosedyren. Global - i, n, sum, sr er tilgjengelig gjennom hele programmet.


Funksjoner i Pascal Settet med innebygde funksjoner i Pascal-språket er ganske bredt (ABS, SQR, TRUNC, etc.). Hvis en ny, ikke-standard funksjon er inkludert i programmet, må den beskrives i programteksten, deretter kan den nås fra programmet. En funksjon er tilgjengelig på høyre side av tilordningsoperatøren, som indikerer funksjonsnavnet og faktiske parametere. En funksjon kan ha sine egne lokale konstanter, typer, variabler, prosedyrer og funksjoner. Beskrivelsen av funksjoner i Pascal ligner på beskrivelsen av prosedyrer.




Eksempel 4. Skriv en subrutinefunksjon av grad a x, der a, x er alle tall. La oss bruke formelen: a x = e x l i et program p2; var f, b, s, t, c, d: ekte; (globale variabler) funksjon stp (a, x: reell) : reell; var y: ekte; (lokale variabler) begynner y:= exp (x * ln (a)); stp:= y;(tildele et funksjonsnavn til resultatet av subrutineberegninger) end; (funksjonsbeskrivelse fullført) start d:= stp (2.4, 5); (beregne potenser av forskjellige tall og variabler) writeln (d, stp (5,3.5)); les(f, b, s, t); c:= stp (f, s) + stp (b, t); skrivln(c); slutt.


Funksjoner En subrutine er en del av et program, utformet som en egen syntaktisk struktur og utstyrt med et navn (en uavhengig programblokk), for å løse individuelle problemer. Beskrivelse av prosedyren: prosedyre () (del for utføring av lokale navn) Start (del for utføring av operatører) Slutt; Funksjonsbeskrivelse: funksjon (): type; (del for å beskrive lokale navn) Start (del for kjørbare setninger) := ; (påkrevd parameter) Slutt; Prosedyrekall: (); Funksjonsanrop: := (); 1. På høyre side av oppdragsoperatøren. 2. I uttrykket i tilstanden til forgreningsoperatøren. 3. I utdataprosedyren, som et resultat av funksjonen. Beskrivelse av subrutiner Prosedyrer


Rekursjon Prosedyrer og funksjoner i Pascal kan kalle seg, d.v.s. har egenskapen rekursivitet. En rekursiv funksjon må nødvendigvis inneholde en betingelse for å avslutte rekursivitet for ikke å få programmet til å gå i loop. Hvert rekursivt kall skaper et nytt sett med lokale variabler. Det vil si at variabler som ligger utenfor den kalte funksjonen ikke endres.


1 funksjon f (n: heltall): heltall; begynne hvis n = 1 så f:= 1 ellers f:= n * f (n -1); (funksjon f kaller seg selv" title="Eksempel 5. Lag en rekursiv funksjon som beregner faktorialet til tallet n på følgende måte: n! = 1 hvis n= 1 n!= (n -1)! · n hvis n > 1 funksjon f (n: heltall): begynner hvis n = 1 så f:= 1 ellers f:= n * f (n -1);" class="link_thumb"> 19 !} Eksempel 5. Lag en rekursiv funksjon som beregner faktoren til tallet n som følger: n! = 1 hvis n= 1 n!= (n -1)! · n hvis n > 1 funksjon f (n: heltall): heltall; begynne hvis n = 1 så f:= 1 ellers f:= n * f (n -1); (funksjon f kaller seg selv) slutt; 1 funksjon f (n: heltall): heltall; begynne hvis n = 1 så f:= 1 ellers f:= n * f (n -1); (funksjon f kaller seg selv"> 1 funksjon f (n: heltall): heltall; begynne hvis n = 1 så f:= 1 ellers f:= n * f (n -1); (funksjon f kaller seg selv) slutt; " > 1 funksjon f (n: heltall): begynn hvis n = 1 så f:= 1 ellers f:= n * f (n -1) (funksjon f kaller seg selv" title="Eksempel 5). Lag en rekursiv funksjon som beregner faktoren til tallet n som følger: n = 1 n! 1 så f:= 1 ellers f:= n * f (n -1);"> title="Eksempel 5. Lag en rekursiv funksjon som beregner faktoren til tallet n som følger: n! = 1 hvis n= 1 n!= (n -1)! · n hvis n > 1 funksjon f (n: heltall): heltall; begynne hvis n = 1 så f:= 1 ellers f:= n * f (n -1); (funksjon f kaller seg selv"> !}



Lysbilde 1

Lysbilde 3

Subrutiner: globale og lokale variabler Alle subrutiner skal beskrives i beskrivelsesdelen. Hver subrutine må ha et navn. Informasjon mellom hovedprogrammet og subrutinene overføres av globale parametere (variabler) som opererer i hvilken som helst del av programmet og har et navn beskrevet i hovedprogrammet. Lokale parametere (variabler) kan brukes i en subrutine - deres navn og verdier har kun betydning innenfor grensene til en gitt subrutine og er ikke tilgjengelige for det anropende programmet

Lysbilde 4

Formelle og faktiske parametere I beskrivelsen av subrutiner er parametere kun angitt med navn, så de kalles formelle. De har ingen mening før subrutinen kalles. De reserverer kun plass for de faktiske parameterne, og fikser nummeret og datatypen. Typer faktiske parametere: Verdiparametere indikerer hvilken verdi som skal tildeles en spesifikk subrutineparameter. Etter at subrutinen avsluttes, tar de på seg sine tidligere verdier, selv om de ble endret i subrutinen. Variable parametere i en subrutine tar plassen til formelle, de kan endre verdien deres under utførelsen av subrutinen og lagre endringene når du går ut av subrutinen (variable parametere er innledet med nøkkelord Var).

Lysbilde 5

Lysbilde 6

Beskrivelse av fremgangsmåten Program Pr1; Const...Type...Var...Prosedyre(); Beskrivende del Start Procedure body Slutt; Begynne...(); ... slutt. Når en prosedyre kalles, erstattes de formelle parameterne med faktiske.

Lysbilde 7

Prosedyren for å beregne summen av to tall program pr1; Usescrt; Var a,b,s:real; prosedyre summa(x,y:real;var z:real); begynne z:=x+y; slutt; begynne clrscr; writeln("skriv inn a,b"); readln(a,b); summa(a,b,s); writeln(" sum av tall ",a:3:1," og ",b:3:1," = ",s:3:1); readln; slutt. x,y,z – formelle parametere, lokale variablene a,b,s– globale variabler a,b,s – faktiske parametere x y z a b s Verdiparametere Parametervariabel

Lysbilde 8

Lysbilde 9

Lysbilde 10

Regn ut verdien av uttrykket a:=(3n!+2m!)/(m+n)! For å finne faktoren, hvilken type variabler er passende å bruke? program pr2; Usescrt; Var m,n,x,y,z:heltall; a:real; prosedyrefakta(d:heltall;var q:heltall); var i:heltall; begynne q:=1; for i:=1 til d gjør q:=q*i; slutt; begynne clrscr; writeln("skriv inn verdier n, m"); readln(n,m); faktum(n,x); faktum(m,y); faktum(m+n,z); a:=(3*x+2*y)/z; writeln("verdien av uttrykket med m= ",m:4," og n= ",n:4,"er lik",a:8:3); readln; slutt. N!=1·2·3·…· N

Lysbilde 11

Inndatautdata for elementer i en endimensjonal matrise Tilfeldig(X)-funksjonen genererer et tilfeldig tall fra 0 til X av en heltall eller reell type (før funksjonen kalles, må den initialiseres ved hjelp av Randomize-prosedyren). Hvis X-parameteren ikke er spesifisert, vil resultatet være av typen Real i området fra 0,0 til 1,0. For å få en matrise med tilfeldige heltall fra området random(B-A+1)+A Oppgave: Formuler inngangen til elementer i en endimensjonal matrise ved hjelp av en tilfeldig tallgenerator (verdiområde fra -10 til 20) og utdata av elementer som en prosedyre. For A=-10 B=20 tilfeldig(20-(-10)+1)+(-10)

Lysbilde 12

Lysbilde 13

Lysbilde 14

Beskrivelse av funksjonen Funksjoner er designet for å beregne bare én verdi, 1. Derfor er den første forskjellen at prosedyren kan ha nye verdier for flere parametere, men funksjonen har bare én (det vil være resultatet). 2. Den andre forskjellen er funksjonstittelen. Den består av ordet FUNCTION, etterfulgt av navnet på funksjonen, deretter en liste over formelle parametere i parentes, etterfulgt av typen funksjonsresultat, atskilt med kolon. 3. Funksjonskroppen må inneholde minst én tilordningsoperatør, der funksjonsnavnet er på venstre side, og verdien er på høyre side. Funksjon (): Beskrivende Start Funksjon body:=; Slutt;

Lysbilde 15

Regn ut verdien av uttrykket a:=(3n!+2m!)/(m+n)! program fn2; Usescrt; Var m,n:heltall; a:real; funksjon fakta(d:heltall) :longint; var i:heltall; q:longint; begynne q:=1; for i:=1 til d gjør q:=q*i; faktum:=q; slutt; begynne clrscr; writeln("skriv inn verdier n, m"); readln(n,m); a:=(3*fakta(n)+2*fakta(m))/fakta(m+n);; writeln("verdien av uttrykket med m= ",m:4," og n= ",n:4,"er lik",a:8:3); readln; slutt.

Lysbilde 16

Lag et program som vil finne ab, det vil si den bte potensen av tallet A, der A og B er heltall og B>0, angitt fra tastaturet. Komponer et program ved å erstatte funksjonen med prosedyreprogrammet pr2; Usescrt; Var a,b:heltall; c:longint; Funksjon stepen(x,y:heltall):longint; var i:heltall; s:longint; begynner s:=1; for i:=1 til y gjør s:=s*x; Trinn:=s; slutt; begynne clrscr; writeln("skriv inn verdier a, b"); readln(a,b); C:=trinn(a,b); writeln("s=",s); readln; slutt.

Lysbilde 17

Lysbilde 18

Mekanisme for å overføre parametere til funksjoner og prosedyrer. Hva vil bli skrevet ut av prosedyren og hva av programmet? Globale variabler Lokale variabler a b 3 3 -3 Adresse c a b c 48 Adresse c A:=b+3 B:=3*a C:=a+b Tilstand C 24 5 8 Svar

Lysbilde 19

8. klasse. Programmering i ABC Pascal

Informatikklærer ved NIS i Uralsk fysikk og matematikk Zelenov Boris Aleksandrovich


  • Elevene bruker prosedyrer og funksjoner for å løse problemer
  • Elevene lærer å løse store problemer ved å dele dem opp i mindre

  • Utvikle et konsept av prosedyrer og funksjoner i et programmeringsspråk.

  • Studentene kjenner begrepene "prosedyrer" og "funksjoner", bestemmer formelle og faktiske parametere

Forventede resultater – beskrivelser:

1.Kjenner definisjonen av "prosedyre"

2.Kjenner definisjonen av "funksjon"

3. Bestemmer faktiske og formelle parametere

4.Skiller mellom verdi og variable parametere

5. Finner et kall til en prosedyre eller funksjon i programkode



Elviras standardplan

1. Fjern papirer

2. Vann blomstene

3. Vask pultene

4. Tørk av glasset

Slutt på algoritmen

Hvordan forbedre organiseringen av denne prosessen?




Leksjonens tema

Subrutiner:


Ishki bagdarlama

Subrutine

Fremgangsmåte

Fremgangsmåte

Parameterer

Nyttige setninger:

For å overføre variable verdier til en prosedyre (funksjon), brukes faktiske parametere...

For å beskrive fremgangsmåten bør du først..., deretter...


Konseptet med en subrutine

Definisjon

Subrutine– Dette er en egen funksjonelt uavhengig del av programmet.

Subrutiner

Prosedyrer


  • eliminere behovet for å gjenta lignende fragmenter gjentatte ganger i programteksten;
  • forbedre strukturen til programmet, noe som gjør det lettere å forstå;
  • øke motstanden mot programmeringsfeil og uforutsette konsekvenser under programmodifikasjoner.

  • Tegn et gjerde ved hjelp av et programmeringsspråk

I denne oppgaven kan du lage en prosedyre som vil utføre algoritmen for å tegne ett fragment (plukkgjerde), og deretter stadig referere til denne prosedyren, endre startposisjonen til pennen


  • Beskriv hvordan du effektivt kan tegne et juletre i et programmeringsmiljø

  • De er uavhengige fragmenter av programmer, designet på en spesiell måte og har sitt eget navn.

Interaksjon mellom hovedprogrammet og subrutinen



Blokkdiagram

  • Subrutine (prosedyre eller funksjon) anropsblokk

Subrutinenavn (prosedyre eller funksjon).


Blokkdiagram


Beskrivelsen av prosedyren er som følger:

fremgangsmåte navn (liste over formelle parametere); beskrivelsesdelen begynne operatører slutt ;


Funksjonsbeskrivelsen ser slik ut:

funksjon navn (liste over formelle parametere): returtype;

beskrivelsesdelen begynne operatører slutt ;


Plassering i programmet

Program ...;

//Beskrivelsesdel Bruker, Const, Var, ...

fremgangsmåte EN ;

begynne ....... slutt ;

fremgangsmåte B ;

begynne ........ slutt ;

Funksjon C ;

begynne ........ slutt ;

//Hovedprogram

begynne ........ slutt .


  • Forskjellen mellom en funksjon og en prosedyre er at resultatet av å utføre operatorene som danner kroppen til funksjonen alltid er en enkelt verdi, så å kalle en funksjon kan brukes i passende uttrykk sammen med variabler og konstanter.

Prosedyrer

Funksjoner

Kan ha flere resultater eller utføre en handling

Har bare ett resultat, hvis type spesifiseres separat når funksjonen deklareres.

Resultatene kan være verdier av enhver type - matriser, strenger, tall, etc.

Resultatet kan bare være en verdi av typen reell, heltall eller char.

Prosedyrekall-kommandoen er en egen kommando som kan brukes uavhengig

Et funksjonskall kan bare brukes som en komponent av et uttrykk av den aktuelle typen.

Funksjonskroppen må inneholde minst én tilordningsoperatør med funksjonsnavnet på venstre side.


b deretter max:=a annet max:=b; MaxNumber:= maks; end;" width="640"

Prosedyre eller funksjon?

MaksTall(a,b: heltall): heltall;

var maks: heltall;

MaxNumber:= maks;


b deretter max:=a annet max:=b; end;" width="640"

Prosedyre eller funksjon?

MaksTall(a,b: heltall; var maks: heltall);

hvis ab så max:=a annet max:=b;


Prosedyre eller funksjon?

ChangeColor(C1, C2: Word);

TextBackGround(C2)


Prosedyre eller funksjon?

Add(X, Y: Heltall): Heltall;


Faktiske

  • Angitt i hovedprogramdelen

Formell

  • Spesifisert i subrutinen
  • Spesifisert i subrutinen

Prosedyren kalles av en operatør med følgende format:

prosedyrenavn (liste over faktiske parametere);

  • Liste over faktiske parametere- Dette er en liste over dem adskilt med komma.

  • I Pascal-språkstandarden kan parametere sendes på to måter - etter verdi og ved referanse. Parametre som sendes av verdi kalles parametere-verdier, overført ved referanse - parametere-variabler. Sistnevnte skiller seg ut ved at de i prosedyre-(funksjons)-overskriften er innledet med tjenesteordet var.

Passerer parametere. Formelle parametere

Variabler

Verdier

Parametre etter verdi

Formelle parametere

Variabler


Formelle parametere

Parametre etter verdi

  • I den første metoden (som passerer ved verdi), blir verdiene til de faktiske parameterne kopiert til de tilsvarende formelle parameterne.

Fremgangsmåte

Prosedyrenavn (a, b: heltall);

Hovedprogram

Når du endrer disse verdiene under utførelsen av en prosedyre (funksjon), kan ikke de opprinnelige dataene (faktiske parametere) endres


Var c, d: heltall;

  • Ved referanse vil alle endringer som skjer i hoveddelen av en prosedyre (funksjon) med formelle parametere føre til umiddelbare lignende endringer i de tilsvarende faktiske parameterne.

Fremgangsmåte

Prosedyrenavn (a, b: heltall, Var c: ekte);

Hovedprogram

Endringer skjer i variablene til den kallende blokken, så utdataparametere sendes ved referanse. Når de kalles, kan deres tilsvarende faktiske parametere bare være variabler.


Du skriver:

1. Faktiske parametere___________

Prosedyre Kvad(R: ekte; var S: ekte);

2. Formelle parametere ___________

3. Formelle parametere-verdier __________

5. Prosedyrenavn ___________

6. Få tilgang til en prosedyre fra programmet __________________


Interaktiv oppgave

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


Elvira er klasseleder. Hun må lage en plan for generell rengjøring i klasserommet: fjern papirer, vann blomster, vask pulter, tørk av glass. Hvordan kan hun organisere arbeidet sitt bedre? Hjelp Elvira.


Elviras avanserte plan

Subrutiner:

Arsen - legger fra seg papirene

Mila - vanning av blomster

Vitaly – vasker skrivebord

Indira – tørker av glasset

1. Utfør Arsen

2. Løp Mila

3. Utfør Vitaly

4. Kjør Indira

Slutt på algoritmen


  • Hvilke nye programmeringsspråkstrukturer har vi møtt i dag?
  • Navngi de studerte parameterne
  • Hvordan overføres parametere til en prosedyre?

  • Leksjonssammendrag
  • Finn definisjoner: "Lokale variabler" og "Globale variabler"
  • Komponer to oppgaver der du kan bruke prosedyrer eller funksjoner.

  • Hvordan vil du bestemme temaet for leksjonen? (kom opp med ditt eget navn)
  • Hva synes du du bør lære i neste leksjon?

La oss møtes

neste leksjon!

Hensikten med leksjonen

pedagogisk

  • å danne et samlet blant studentene begrepssystem relatert til begrepene prosedyre og funksjon;
  • lære hvordan du bruker subrutiner for å løse problemer i Pascal, og også lære å forstå hvilken type subrutine som er nødvendig når du løser et bestemt problem;
  • vise grunnleggende teknikker for bruk av subrutiner;

pedagogisk

  • dyrke nøyaktighet, oppmerksomhet, organisering;
  • kultur for databehandling;

utvikle seg

  • utvikle logisk tenkning, algoritmisk kultur for studenter;
  • utvikle kunnskap og ferdigheter for å komponere og feilsøke subrutiner i Pascal.

Studentene må:

  • kjenne reglene for å skrive prosedyrer uten parametere og med parametere;
  • kjenne reglene for å skrive funksjoner;
  • kunne bruke prosedyrer og funksjoner for å løse enkle problemer.

I løpet av timene

I. Org. øyeblikk

II. Introduksjon. Relevans

Gi ut oppgaven på lapper ( Vedlegg 1 ). Finn repetisjoner.

Noen ganger på forskjellige steder i programmet må du utføre nesten de samme handlingssekvensene med forskjellige innledende data. Slike handlingsrekkefølger kan formaliseres i form av såkalte subrutiner (fra engelsk, subrutine) – grupper operatører i en blokk som kan nås med navn og gjentatte ganger.

Subrutiner forkorter teksten til et program, reduserer utføringstiden betydelig og gjør livet enklere for programmerere som kan lage programmer modulært, det vil si ved å sette sammen et komplekst program fra ferdige deler av enklere komponenter. Dette lar en gruppe programmerere lage store programmer, og en gruppe skoleelever å utvikle og implementere alle globale prosjekter

Subrutiner er delt inn i prosedyrer og funksjoner.

Innebygde (standard) prosedyrer og funksjoner er del språk og kan kalles ved navn uten forutgående beskrivelse. For eksempel , abs, sqrt, ln, sin... er funksjoner (retur et resultat), readln, write... er prosedyrer (returnerer ikke et resultat). Deres tilstedeværelse letter i stor grad utviklingen av applikasjonsprogrammer. Men i de fleste tilfeller noen spesifikk for dette handlingsprogrammet er det ingen direkte analoger i bibliotekene Turbo Pascal, og så må programmereren utvikle sin egen ikke-standard prosedyrer og funksjoner.

III. Forklaring av nytt materiale

Brukerprosedyrer er skrevet oss programmerer i samsvar med syntaksen til språket i delrutinebeskrivelsesdelen.

Strukturen til prosedyren følger strukturen til programmet, det er et "program i miniatyr" - det er også representert av en overskrift og en kropp.

Overskriften består av den reserverte ordprosedyren, identifikatoren (Navn) prosedyrer.

VAR ... // seksjon for å beskrive variabler i hovedprogrammet

prosedyre Prosedyrenavn;

//body av hovedprogrammet

Prosedyrekallet for påfølgende utførelse registreres i hoveddelen av hovedprogrammet.

Eksempel 1. Program for å beregne areal og omkrets.

Fordeler med subrutiner:

  • Programmer skrevet ved hjelp av subrutiner lettere å teste og feilsøke, de har en klarere logisk struktur.
  • Den uavhengige naturen til subrutiner gjør at opprettelsen av dem kan overlates til forskjellige programmerere. På denne måten blir programmeringsarbeidet delt, og fullføringen blir dermed fremskyndet;
  • Bruk av subrutiner sparer minne. Minne for lagring av variabler brukt i en subrutine tildeles bare for varigheten av operasjonen og frigjøres så snart utførelsen avsluttes.

Eksempel 2. Brukeren legger inn to sider av tre rektangler. Utlede sine områder.

Du kan løse problemet slik:

for i:=1 til 3 do

writeln('Skriv inn a og b:');

writeln(‘Område=’,a*b);

Det anses som god programmeringsstil å bruke prosedyrer. En prosedyre er nødvendig som vil beregne arealet til et rektangel. Her er hvordan hovedprogrammet vil se ut skjematisk:

beregning

beregning

beregning

Tekstprosedyren eksisterer allerede (se eksempel 1). La oss lage en andre prosedyre som beregner arealet. Men for å regne ut S må du kjenne 2 sider, så prosedyren må vise hvilke sider den skal multiplisere.

prosedyre pl (c,d: heltall);

writeln('areal av et rektangel med sider',c, '',d, '=',S);

En parameter er en variabel som er tildelt en verdi. Eksistere formelle parametere , definert i subrutineoverskriften, og faktiske parametere – uttrykk som spesifiserer spesifikke verdier når du får tilgang til en subrutine.

Prosedyren vil bli utført hvis du kaller den ved navn og spesifiserer de faktiske parameterne , atskilt med komma og omsluttet i parentes:

De faktiske parameterne må samsvare med de formelle i type og mengde.

Så, hovedprogrammet:

for i:=1 til 3 do

Kommentar. Når du løser dette problemet, er det nødvendig å sjekke tallene som er angitt av brukeren (de må ikke være negative, ellers vil programmet bli avbrutt).

La oss lage en bekreftelsesprosedyre:

prosedyrefeil (f,g:heltall);

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

writeln('sidene av et rektangel kan ikke være negative');

stanse; // programavbrudd

Endelig program – Vedlegg 4

Så formatet på prosedyren:

Fremgangsmåte<имя>(formelle parametere);

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

Eksempel 3. Skriv et program for å bytte to tall c=5 og d=7.

programutvekslingDan;

var c,d:heltall;

prosedyreutveksling (a,b:heltall);

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

writeln("Skriv inn 2 tall: ");

writeln(c," ",d);

Etter å ha startet programmet, kan du se at de formelle parameterne (i prosedyren) har endret plass, men de faktiske (som brukes i hovedprogrammet) er ikke endret. La oss se på figuren som viser en del av RAM:

1) når du kaller obmen-prosedyren med to parametere 5 og 7, blir tallene 5 og 7 også plassert i henholdsvis variablene a og b:

3) men i variablene c og d har ikke dataene endret seg, fordi de er i andre minneceller.

For variablene c og d, a og b refererte til de samme minnecellene (hvis verdiene til a og b endres, vil verdiene til c, d også endres) når du beskriver formelle parametere, er det nødvendig å legge til ordet VAR før de nødvendige variablene:

prosedyreutveksling (var a,b:heltall);

Endre obmenDan-programmet:

Feil på grunn av var. Tall er konstanter som ikke kan endres i en prosedyre.

Eksempel 4. Finn arealet av en sirkel ved å bruke en prosedyre som bare utfører en beregning, men som ikke viser resultatet på skjermen.

prosedyre sirkel(r:ekte);

Prosedyren skal returnere resultatet:

prosedyresirkel (r:real; var S:real);

readln(a, e);

Kommentar: Variabelen i prosedyre S brukes til å returnere resultatene av prosedyren til hovedprogrammet. Når den endres, endres også den faktiske parameteren i det anropende programmet, dvs. variabel e.

Oftere, for dette i Pascal, i stedet for prosedyrer, brukes funksjoner (subrutiner som returnerer noe).

Funksjonen ligner prosedyren, men det er to forskjeller.

  • Funksjonen overfører resultatet av arbeidet til programmet - en enkelt verdi, hvis bærer er navnet på funksjonen.
  • Funksjonsnavnet kan vises i et uttrykk som en operand. Funksjonen returnerer resultatet til punktet for kallet.

For eksempel vil sqr(x) – kvadrere verdien x og returnere den beregnede verdien av kvadratet av tallet x til call pointet: y:=sqr(x);

En brukerdefinert funksjon består av en funksjonsoverskrift og en funksjonstekst. Hoveddelen av funksjonen er lik programmets struktur. Beskrivelse av etiketter, konstanter, typer osv. kun gyldig innenfor rammen av denne prosedyren.

Funksjon<имя>(formelle parametere):<тип результата>;

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

Utsagnsdelen må inneholde minst én utsagn som tildeler en verdi til funksjonsnavnet. Resultatet av siste oppdrag returneres til melderen.

Eksempel 5. La oss omarbeide problemet om arealet av en sirkel.

funksjon sirkel (r:virkelig): ekte;

a:=sirkel(5); (MÅ tildeles)

Eksempel 6. Finn 1!+2!+…+n!

Vi bruker funksjonen med å finne faktoren, fordi vi mater den som input og får resultatet.

funksjonsfakta (a:heltall): heltall;

for i:=1 å gjøre

I linjen faktum:=fakta*I;

kompilatoren vil finne en feil, fordi fakta må kalles med parametere. Derfor introduseres vanligvis en tilleggsvariabel som resultatet plasseres i. Og så blir dette resultatet tilordnet faktavariabelen:

program factorial;

var sum,n,j: heltall;

funksjonsfakta (a: heltall): heltall;

var i,d: heltall;

for i:=1 å gjøre

for j:=1 til n do

sum:=sum+fakta(j);

IV. Leksjonssammendrag

På dette tidspunktet blir programmeringsprosessen til industriell programvareproduksjon basert programmeringsteknologier. De fleste eksperter mener det top-down programdesignmetode best egnet for å løse komplekse problemer. Først defineres oppgaven i generelle termer, deretter blir strukturen gradvis avklart. På neste trinn er hver deloppgave på sin side delt inn i en rekke andre. Løsningen på et separat fragment av et komplekst problem er en uavhengig programblokk - en subrutine.

V. Lekser

Løs problemer (skriftlig):

  1. Lag en prosedyre som erstatter alle bokstavene a i den angitte strengen med *.
  2. Det gis to forslag. Finn det totale antallet bokstaver "n" i dem. (Definer en funksjon for å beregne antall bokstaver "n" i en setning.)