Pascal의 프로시저와 함수 재귀. 서브루틴 작업을 수행하려면 프로그램의 다른 부분에서 특정 명령문 순서를 반복해야 하는 경우가 많습니다. 절차 및 기능 절차 및 기능 프레젠테이션

파스칼의 재귀교사: Tlekhurai Yu.V. 시립 교육 기관 "Lyceum No. 8" 그림에서 무엇이 보이나요? 예술에서의 이러한 현상을 재귀 “재귀를 이해하려면 먼저 재귀를 이해해야 합니다.” 재귀 - 객체 자체를 통한 부분 정의, 이전에 정의된 객체를 사용한 객체 정의. 과학적으로 말하자면: 재귀 - 먼저 하나 이상의 기본 사례 또는 메서드를 지정하고 그 기반으로 정의되는 클래스를 구성하기 위한 규칙을 지정하여 개체 또는 메서드의 클래스를 정의하는 방법입니다. 피터 도이치 피터 도이치

인간의 반복.

재귀는 하나님께로부터 온 것입니다.

물리학의 재귀언어와 문학의 재귀 무한 재귀의 전형적인 예는 다음과 같습니다. 서로 마주보는 두 개의 거울: 거울의 희미한 반사로 인해 두 개의 복도가 형성됩니다. 무한 재귀의 또 다른 예는 다음과 같습니다. 자기 여기 효과(양성 피드백) 예 전자 회로얻다, 출력의 신호가 입력에 도달하면 증폭되고 다시 회로의 입력에 도달하여 다시 증폭됩니다. 이 작동 모드가 표준인 증폭기를 자체 발진기라고 합니다. 재귀 사전 항목의 예: "The Priest had a dog..." - 전형적인 재귀 Stanislaw Lem의 여러 이야기는 무한 재귀가 있는 사건에 전념합니다. 무덤에 관한 이야기("The Star Diaries of John the Quiet"), 여기서 영웅은 무덤에 관한 기사에서 무덤에 관한 기사로, 거기에서 무덤에 관한 기사로 연속적으로 이동하며, 여기에는 다시 "sepulcaria"라는 기사에 대한 언급이 포함되어 있습니다. 주어진 문제를 해결하기 위해 비슷한 기계를 만들고 그 해결책을 맡길 만큼 충분한 지능과 게으름을 지닌 지능 기계에 대한 이야기(결과는 무한 재귀였다. 새차자신과 비슷한 것을 만들고 그녀에게 작업을 넘겼습니다.) 프로그래밍의 재귀는 구성 연산자가 실행되는 동안 프로시저나 함수가 자신을 참조하는 계산 프로세스를 구성하는 방법입니다. 이러한 호출이 끝나지 않게 하려면 서브루틴의 텍스트에 도달 시 더 이상 호출이 발생하지 않는 조건이 포함되어야 합니다. 따라서 재귀 호출은 서브루틴 분기 중 하나에만 포함될 수 있습니다. 예. 자연수의 계승 계산 다음과 같이 숫자 n의 계승을 계산하는 재귀 함수를 만듭니다. function f (n: 정수): longint; n = 1이면 시작하고 f:= 1 else f:= n * f(n -1); (함수 f가 자신을 호출함)재귀를 사용하여 파스칼 프로그램을 종료합니다. Var n: 정수; a: 롱린트; 함수 계승(n: 정수): longint; n = 1이면 시작하고 계승:= 1 else 계승:= n * 계승(n -1); 끝; 쓰기 시작('n='); Readln(n); A:= 계승(n); 쓰기('n!=',a); Readln; 끝. 피사 피보나치의 레오나르도

피보나치 수열은 수열의 요소입니다.

0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, .... 여기서 각 후속 숫자는 이전 두 숫자의 합과 같습니다.

과제: n개의 요소로 구성된 일련의 피보나치 수열을 표시합니다. 변수 설명: n - 계열의 요소 수; a, b – 계열의 마지막 두 요소 값 c – 버퍼(“예비”) 변수; 나 – 카운터. 문제 해결을 위한 알고리즘: 1. n 값을 구합니다. 2. a와 b에 각각 0과 1의 값을 할당합니다(피보나치 수열의 첫 번째 숫자입니다). 화면에 표시합니다. 3. 세 번째 요소부터 n까지: a) a와 b의 합을 표시하고, b) 변수 b의 값을 c에 저장하고, c) a와 b의 합을 b에 쓰고, d) 다음의 값을 할당합니다. c에서 a로. 반복을 사용하는 Pascal 프로그램: 프로그램 피보나치; var a,b,c,i,n: 정수; 시작하다 write("n = "); readln(n); a:= 0; 쓰기(a," "); b:= 1; 쓰기(b," "); i:=3 ~ n의 경우 시작합니다. 쓰기(a+b," "); c:=b; b:= a + b; a:=c; 끝; 읽기; 끝. 재귀를 사용하는 파스칼 프로그램:피보나치 수 계산에 대한 재귀 정의는 다음과 같습니다. 피보나치 수의 이 정의는 재귀 함수로 쉽게 변환될 수 있습니다. function f(n: Integer) : longint; 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. Домашнее задание Написать программу нахождения НОД двух натуральных чисел, используя алгоритм Евклида и рекурсию Даны два натуральных числа 그리고 비.만약에 = 비,그런 다음 노드( ,b)=a.만약에 >비,그런 다음 노드( ,b)=노드( a -b,비).만약에 < 비,그런 다음 노드( ,b)=노드( ,b-a). 프로그램 noddvyxchisel; var a,b: longint; 함수 nod(a,b:longint): longint; start a = b이면 nod:= a else if a>b then nod:= nod(a-b,b) else nod:= nod(a,b-a) End; 쓰기 시작('a='); readln(a); 쓰기('b='); readln(b); A:= nod(a,b); write('nod=',a); 읽기; 끝. 하노이 타워에 관한 문제. 이 경우 다음 규칙을 엄격히 준수해야 합니다.

  • 한 번에 하나의 디스크만 이동할 수 있습니다.
  • 더 큰 디스크를 배치할 수 없습니다. 더 작은 디스크;
  • 다른 디스크를 제거하기 전에 제거된 디스크를 아무 핀에나 놓아야 합니다.
  • 열심히 일하는 불교 승려들은 밤낮으로 첨탑에서 첨탑까지 디스크를 운반합니다. 전설에 따르면 승려들이 일을 마치면 세상의 종말이 올 것이라고 합니다. 64개의 디스크로 문제를 해결하려면 264-1번의 이동이 필요하다고 계산할 수 있습니다. 그러므로 세상의 종말은 1초에 하나의 원판이 움직이는 것을 고려하면 50억 세기 후에 일어날 것입니다. 그러나 문제와 그에 대한 전설은 모두 1883년 생루이 대학의 수학자 에두아르 루카스(Edouard Lucas)에 의해 창안되었습니다.

세 개의 다이아몬드 첨탑 중 하나에는 64개의 둥근 금 디스크가 있습니다. 디스크는 서로 다른 반경을 가지며 바닥에서 상단까지 반경이 내림차순으로 첨탑에 위치합니다. 필요한 경우 세 번째 첨탑을 사용하여 첫 번째 첨탑에서 두 번째 첨탑으로 디스크를 전송해야 합니다.

일. 디스크 수가 n(n = 1, 2, ...)인 하노이 타워에 대해 위에 제시된 문제를 풀 수 있는 재귀 프로그램을 만듭니다. 해결책. 첨탑의 이름을 입력해 보겠습니다. 에이, 비, 씨. 허락하다 하노이(n,a,b,c)- 디스크의 이동 순서를 반환하는 필수 기능 ~에 사용하여 위에서 설명한 규칙에 따라. n=1이면 문제를 해결하는 방법을 알 수 있습니다. "이동" 작업만 수행하면 됩니다. ~에 " n – 1개의 디스크에 대해 이 문제를 해결할 수 있다고 가정해 보겠습니다. n–1개의 디스크를 다음에서 이동합니다. ~에 와 함께. 다음으로 남은 디스크 하나를 ~에 마지막으로 n-1개의 디스크를 ~에 . 입력 데이터: 페그 a의 디스크 수; 산출: 시퀀싱; Step0:(변수 유형 정의); 1단계: (작업 순서를 표시하는 하노이 절차 설명) 단계1.1:((n-1)개의 디스크를 페그 a에서 페그 b로 이동); 단계1.2:(n번째 디스크를 a에서 c로 이동); 단계1.3:(b에서 c로 (n-1) 디스크 이동); (1.2-1.3단계는 재귀적으로 수행됩니다) 2단계:(주 프로그램); Step2.1:(디스크 수 입력); 2.2단계: (하노이 절차 호출) Pascal Program bahnya의 문제 해결; var n: 정수; a,b,c: 문자; 절차 하노이(n: 정수;a,b,c: char); n>0이면 시작하고 hanoi(n-1,a,c,b)를 시작합니다. writeln("Peremestit disk so sterzhnya ",a," na sterzhen" ",b); hanoi(n-1,c,b,a); end; end; Begin write("Vvedite naturalnoe chislo n"); readln( n); a:="a"; b:="b"; c:="c"; 하노이 (n,a,c,b); readln; end. 숙제 자연식으로 학위를 계산하는 프로그램을 작성하세요. 지수 제공: 도수 기준 엑스멱지수 에게 k=0이면 차수(k,x)=1, 그렇지 않으면 차수(k,x)= x· 차수(k-1,x) 프로그램 stepen; var y: 실제; n:정수; 함수 단계(k:정수, x:실수): 실수; 시작 k = 0이면 단계:= 1 else 단계:= x * step(k-1,x) End; 쓰기 시작('vvedite osnovanie stepeni x='); readln(y); write('vvedite pokazatel stepeni k='); Readln(n); write('x v stepeni k=',step(n,y)); 읽기; 끝. 독립적 인 일

  • 숫자의 자릿수 합계 찾기
  • 주어진 자연수가 소수인지 확인
  • 숫자의 첫 번째 숫자 찾기
  • 십진수 s.s에서 자연수를 변환합니다. 바이너리로
  • 20개의 요소로 구성된 정수 배열의 요소 합을 구합니다.
  • 두 정수의 값 바꾸기
  • 세 가지 변수의 값을 순서대로 정렬 에이, 비, 씨오름차순으로
  • 에서 자릿수를 찾아보세요. 자연수 N
  • 주어진 세 숫자 중 가장 큰 숫자 찾기
  • A, B, C, D 네 개 중 양수의 개수를 구합니다.
독립 작업 No. 2에 대한 답변 프로그램은 간단합니다. var n, m, s: 정수; 함수 prost(m, n:정수): 부울; 시작 n = m이면 ​​prost:= true else prost:= (n mod m<>0) 및 프로스트(m+1, n); 끝; 쓰기 시작('n='); Readln(n); M:=2; prost(m,n)이면 (n,'prostoechislo')라고 쓰고, 그렇지 않으면 (n,'sostavnoe')라고 씁니다. 읽기; 끝.

프로그램 번역;

프로시저 dvd(n:longint);

n >1이면 dvd(n div 2);

쓰기(n mod 2);

서브루틴 작업을 수행하려면 프로그램의 다른 부분에서 특정 명령문 순서를 반복해야 하는 경우가 많습니다. 이 시퀀스를 한 번 설명하고 여러 번 적용하기 위해 프로그래밍 언어에서는 서브루틴을 사용합니다. 서브루틴은 메인 프로그램에서 이후에 반복적으로 사용하기 위해 특별히 설계된 프로그램 블록입니다. 서브루틴을 사용하면 가장 현대적인 프로그래밍 방법 중 하나인 구조적 프로그래밍을 구현할 수 있습니다.


서브루틴은 프로그래밍을 크게 촉진하는 세 가지 중요한 문제를 해결합니다. 1. 프로그램 텍스트에서 유사한 부분을 반복적으로 반복할 필요가 없습니다. 프로그램 크기를 줄이세요. 2. 프로그램 구조를 개선하여 구문 분석 시 더 쉽게 이해할 수 있도록 합니다. 3. 오류 가능성을 줄이고 프로그래밍 오류에 대한 저항력을 높이고 수정 중 예상치 못한 결과를 초래합니다.


프로시저와 함수 파스칼에는 프로시저(PROCEDURE)와 함수(FUNCTION)라는 두 가지 유형의 서브루틴이 있습니다. 파스칼의 프로시저와 함수는 변수 섹션 뒤의 선언 섹션에서 선언됩니다. 프로그램프로그램이름; VAR ... // 메인 프로그램의 변수를 설명하는 섹션입니다. 프로시저 프로시저이름; var ... 시작 ...//프로시저 본문 end; start //메인 프로그램의 본문 end.


함수와 프로시저에는 매개변수(값을 전달하는 변수)가 있습니다. 1) 형식 - 서브루틴 설명에 있는 형식 2) 실제 - 주 프로그램에서 함수나 프로시저로 전송되는 형식입니다. 실제 매개변수는 수량, 순서 및 유형이 형식적인 매개변수와 일치해야 합니다.




프로시저 프로시저는 서브루틴이 여러 결과를 얻어야 할 때 사용됩니다. 파스칼에는 매개변수가 있는 프로시저와 매개변수가 없는 프로시저라는 두 가지 유형의 프로시저가 있습니다. 프로시저는 실제 매개변수가 뒤에 올 수 있는 프로시저 이름으로 액세스합니다. 프로시저가 호출되면 실제 매개변수와 형식 매개변수 사이에 일대일 대응이 설정되고 제어가 프로시저로 전달됩니다. 프로시저가 실행된 후 프로시저가 호출된 후 호출 프로그램의 다음 연산자로 제어가 전달됩니다.


예제 1: 60개의 별 문자열을 인쇄하는 매개 변수가 없는 프로시저. 절차 홍보; var i: 정수; i:=1 ~ 60에 대한 시작 do write (* "); writeln; end; start pr; end.


예제 2. 두 숫자 c=5와 d=7을 바꾸는 프로그램을 작성하세요. program obmenDan; var c,d:정수; 프로시저 교환(a,b:정수); var m:정수; 시작 m:=a; a:=b; b:=m; writeln(a,b); 끝; start writeln("2개의 숫자를 입력하세요: "); readln(c,d); 교환(c,d); writeln(c," ",d); 끝. c5 d 7 a 5 b 7 1) 두 개의 매개 변수 5와 7을 사용하여 obmen 프로시저를 호출할 때 동일한 숫자 5와 7이 각각 변수 a와 b에 배치됩니다. 2) 프로시저에서 메모리 셀의 값 a와 b는 재배열되었습니다: c5 d 7 a 7 b 5 3) 그러나 변수 c와 d에서는 데이터가 변경되지 않았습니다. 다른 메모리 셀에 있어요


변수 c와 d, a와 b가 동일한 메모리 셀을 참조하려면(a와 b의 값이 변경되면 c, d의 값도 변경됨) 형식 매개변수를 설명할 때 필수 변수 앞에 VAR이라는 단어를 추가해야 합니다. 프로시저 교환(var a,b:integer); с5 일 7 a b


예제 3. 3개의 서로 다른 정수 배열이 주어졌습니다(각각의 크기는 15를 초과하지 않음). 각 배열에서 요소의 합과 산술 평균을 찾습니다. 프로그램 프로세스; var i, n, sum: 정수; sr: 진짜; 프로시저 작업(r:integer; var s:integer; var s1:real); var mas: 정수 배열; j:정수; 시작 s:=0; for j:=1 to r do start read (mas[j]); s:=s+mas[j]; 끝; s1:=s/r; 끝;


(메인 프로그램) start for i:=1 to 3 do start write ("Vvedite razmer",i, "masiva: "); readln(n); 일(n, 합계, sr); (호출 프로시저 작업) writeln ("Summa elementov = ",sum); writeln("Srednearifmeticheskoe = ",sr:4:1); 끝; 끝.


프로그램 결과: 프로그램은 작업 프로시저를 세 번 호출합니다. 여기서 형식 변수 r, s, s1은 실제 n, sum, sr로 대체됩니다. 프로시저는 배열 요소를 입력하고 합계와 평균을 계산합니다. 변수 s 및 s1은 기본 프로그램으로 반환되므로 해당 설명 앞에 서비스 단어 var가 배치됩니다. 로컬 매개변수 mas, j는 프로시저에서만 유효합니다. 글로벌 - i, n, sum, sr은 프로그램 전체에서 사용할 수 있습니다.


Pascal의 함수 Pascal 언어의 내장 함수 세트는 상당히 광범위합니다(ABS, SQR, TRUNC 등). 새로운 비표준 기능이 프로그램에 포함된 경우 프로그램 텍스트에 이를 설명해야 하며 그 후에는 프로그램에서 해당 기능에 액세스할 수 있습니다. 함수 이름과 실제 매개변수를 나타내는 할당 연산자 오른쪽에서 함수에 액세스합니다. 함수는 자체적인 지역 상수, 유형, 변수, 프로시저 및 함수를 가질 수 있습니다. Pascal의 함수 설명은 프로시저 설명과 유사합니다.




예 4. a x 차수의 서브루틴 함수를 작성합니다. 여기서 a, x는 임의의 숫자입니다. 다음 공식을 사용해 봅시다: a x = e x ln a 프로그램 p2; var f, b, s, t, c, d: 실수; (전역변수) function stp (a, x: real) : real; var y: 실제; (지역 변수) start y:= exp (x * ln (a)) ; stp:= y;(서브루틴 계산 결과에 함수 이름 지정) end; (함수 설명 완료) start d:= stp (2.4, 5); (다른 숫자와 변수의 거듭제곱 계산) writeln (d, stp (5,3.5)); 읽기(f, b, s, t); c:= stp(f, s)+stp(b, t); writeln(c); 끝.


기능 서브루틴은 개별 문제를 해결하기 위해 별도의 구문 구조로 설계되고 이름(독립 프로그램 블록)이 제공되는 프로그램의 일부입니다. 프로시저 설명: 프로시저()(로컬 이름 실행 섹션) Begin(연산자 실행 섹션) End; 기능 설명: 기능(): 유형; (로컬 이름을 설명하는 섹션) Begin (실행 가능한 명령문을 위한 섹션) := ; (필수 매개변수) 끝; 프로시저 호출: (); 함수 호출: := (); 1. 할당 연산자의 오른쪽에 있습니다. 2. 분기 연산자 조건의 표현식에서. 3. 출력 절차에서 함수의 결과. 서브루틴 절차 설명


Pascal의 재귀 프로시저와 함수는 스스로를 호출할 수 있습니다. 재귀적 성질을 가지고 있다. 재귀 함수에는 프로그램이 반복되지 않도록 재귀를 종료하는 조건이 반드시 포함되어야 합니다. 각 재귀 호출은 새로운 지역 변수 세트를 생성합니다. 즉, 호출된 함수 외부에 있는 변수는 변경되지 않습니다.


1 함수 f(n: 정수): 정수; n = 1이면 시작하고 f:= 1 else f:= n * f (n -1); (함수 f는 자신을 호출합니다" title="예제 5. 다음과 같이 숫자 n의 계승을 계산하는 재귀 함수를 만듭니다. n! = 1 if n= 1 n!= (n -1)! · n n > 1인 경우 함수 f(n: 정수): 정수; n = 1이면 시작하고 f:= 1 else f:= n * f(n -1); (함수 f는 자신을 호출합니다." class="link_thumb"> 19 !}예 5. 다음과 같이 숫자 n의 계승을 계산하는 재귀 함수를 만듭니다. n! = 1 n= 1이면 1 n!= (n -1)! · n > 1인 경우 n 함수 f(n: 정수): 정수; n = 1이면 시작하고 f:= 1 else f:= n * f (n -1); (함수 f가 자신을 호출함) end; 1 함수 f(n: 정수): 정수; n = 1이면 시작하고 f:= 1 else f:= n * f (n -1); (함수 f는 자신을 호출합니다."> 1 함수 f (n: 정수): 정수; start if n = 1 then f:= 1 else f:= n * f (n -1); (함수 f는 자신을 호출합니다) end; " > 1 함수 f (n: 정수): 정수; n = 1이면 시작하고 f:= 1 else f:= n * f (n -1); (함수 f는 자신을 호출합니다." title="예 5 다음과 같이 숫자 n의 계승을 계산하는 재귀 함수를 만듭니다: n! = 1, n= 1인 경우 n!= (n -1)!n, n > 1인 경우 함수 f (n: 정수): 정수; start if n = 1 then f:= 1 else f:= n * f (n -1); (함수 f는 자신을 호출합니다."> title="예 5. 다음과 같이 숫자 n의 계승을 계산하는 재귀 함수를 만듭니다. n! = 1 n= 1이면 1 n!= (n -1)! · n > 1인 경우 n 함수 f(n: 정수): 정수; n = 1이면 시작하고 f:= 1 else f:= n * f (n -1); (함수 f는 자신을 호출합니다."> !}



슬라이드 1

슬라이드 3

서브루틴: 전역 및 지역 변수 모든 서브루틴은 설명 섹션에 설명되어야 합니다. 각 서브루틴에는 이름이 있어야 합니다. 메인 프로그램과 서브루틴 간의 정보는 프로그램의 모든 부분에서 작동하고 메인 프로그램에 설명된 이름을 갖는 전역 매개변수(변수)에 의해 전송됩니다. 로컬 매개변수(변수)는 서브루틴 내에서 사용될 수 있습니다. 이름과 값은 주어진 서브루틴의 경계 내에서만 의미를 가지며 호출 프로그램에서는 사용할 수 없습니다.

슬라이드 4

형식 및 실제 매개변수 서브루틴 설명에서 매개변수는 이름으로만 표시되므로 형식이라고 합니다. 서브루틴이 호출될 때까지는 의미가 없습니다. 실제 매개변수를 위한 공간만 예약하여 숫자와 데이터 유형을 고정합니다. 실제 매개변수 유형: 값 매개변수는 특정 서브루틴 매개변수에 할당되어야 하는 값을 나타냅니다. 서브루틴이 끝난 후에는 서브루틴에서 변경된 경우에도 이전 값을 그대로 유지합니다. 서브루틴의 가변 매개변수는 형식 매개변수를 대신하며, 서브루틴 실행 중에 값을 변경할 수 있고 서브루틴을 종료할 때 변경 사항을 저장할 수 있습니다(변수 매개변수 앞에는 예어바르).

슬라이드 5

슬라이드 6

절차 설명 프로그램 Pr1; Const...Type...Var...Procedure(); 설명 부분 시작 프로시저 본문 끝; 시작하다...(); ... 끝. 프로시저가 호출되면 형식 매개변수가 실제 매개변수로 대체됩니다.

슬라이드 7

두 숫자의 합을 계산하는 절차 프로그램 pr1; 사용crt; Var a,b,s:실제; 프로시저 summa(x,y:real;var z:real); 시작 z:=x+y; 끝; clrscr을 시작하십시오; writeln("a,b를 입력하세요"); readln(a,b); 합계(a,b,s); writeln(" 숫자의 합 ",a:3:1," 및 ",b:3:1," = ",s:3:1); 읽기; 끝. x,y,z – 형식 매개변수, 로컬 변수 a,b,s– 전역 변수 a,b,s – 실제 매개변수 x y z a bs 값 매개변수 매개변수 변수

슬라이드 8

슬라이드 9

슬라이드 10

a:=(3n!+2m!)/(m+n)! 표현식의 값을 계산합니다. 계승을 찾으려면 어떤 유형의 변수를 사용하는 것이 적절한가요? 프로그램 pr2; 사용crt; 변수 m,n,x,y,z:정수; a:진짜; 절차 사실(d:integer;var q:integer); var i:정수; 시작 q:=1; i:=1 ~ d do q:=q*i; 끝; clrscr을 시작하십시오; writeln("n, m 값을 입력하세요"); readln(n,m); 사실(n,x); 사실(m,y); 사실(m+n,z); a:=(3*x+2*y)/z; writeln("m= ",m:4," 및 n= ",n:4,"인 표현식의 값은 다음과 같습니다.",a:8:3); 읽기; 끝. N!=1·2·3·…· N

슬라이드 11

1차원 배열 요소의 입력 출력 Random(X) 함수는 0에서 X까지 정수 또는 실수 유형의 난수를 생성합니다(함수를 호출하기 전에 Randomize 프로시저를 사용하여 초기화해야 합니다). X 매개변수를 지정하지 않으면 결과는 0.0~1.0 범위의 Real 유형이 됩니다. Random(B-A+1)+A 범위에서 임의의 정수 배열을 얻으려면 작업: 난수 생성기(값 범위 -10에서 20까지)를 사용하여 1차원 배열 요소의 입력을 공식화하고 요소를 프로시저로 출력합니다. A=-10 B=20 무작위(20-(-10)+1)+(-10)

슬라이드 12

슬라이드 13

슬라이드 14

함수 설명 함수는 하나의 값인 1만 계산하도록 설계되었습니다. 따라서 첫 번째 차이점은 프로시저가 여러 매개변수에 대해 새 값을 가질 수 있지만 함수에는 하나만 있다는 것입니다(결과가 됨). 2. 두 번째 차이점은 기능 제목에 있습니다. 이는 FUNCTION이라는 단어, 함수 이름, 괄호 안의 형식 매개변수 목록, 콜론으로 구분된 함수 결과 유형으로 구성됩니다. 3. 함수 본문에는 하나 이상의 대입 연산자가 포함되어야 합니다. 여기서 함수 이름은 왼쪽에 있고 해당 값은 오른쪽에 있습니다. 함수(): 설명 시작 함수 본문:=; 끝;

슬라이드 15

a:=(3n!+2m!)/(m+n)! 표현식의 값을 계산합니다. 프로그램 fn2; 사용crt; 변수 m,n:정수; a:진짜; 함수 사실(d:integer) :longint; var i:정수; q:longint; 시작 q:=1; i:=1 ~ d do q:=q*i; 사실:=q; 끝; clrscr을 시작하십시오; writeln("n, m 값을 입력하세요"); readln(n,m); a:=(3*사실(n)+2*사실(m))/fact(m+n);; writeln("m= ",m:4," 및 n= ",n:4,"인 표현식의 값은 다음과 같습니다.",a:8:3); 읽기; 끝.

슬라이드 16

키보드에서 입력한 ab, 즉 A와 B는 정수이고 B>0인 숫자 A의 b제곱을 구하는 프로그램을 작성하세요. 해당 기능을 프로시저 프로그램 pr2로 대체하여 프로그램을 작성하십시오. 사용crt; 변수 a,b:정수; c:롱린트; 함수 stepen(x,y:integer):longint; var i:정수; s:longint; 시작 s:=1; for i:=1 ~ y do s:=s*x; 단계:=s; 끝; clrscr을 시작하십시오; writeln("a, b 값을 입력하세요"); readln(a,b); C:=단계(a,b); writeln("s=",s); 읽기; 끝.

슬라이드 17

슬라이드 18

함수와 프로시저에 매개변수를 전달하는 메커니즘 프로시저에서는 무엇을 인쇄하고 프로그램에서는 무엇을 인쇄합니까? 전역 변수 지역 변수 a b 3 3 -3 주소 c a b c 48 주소 c A:=b+3 B:=3*a C:=a+b 상태 C 24 5 8 응답

슬라이드 19

8 학년. ABC Pascal로 프로그래밍하기

Uralsk 물리학 및 수학 NIS의 정보학 교사 Zelenov Boris Aleksandrovich


  • 학생들은 문제 해결을 위해 절차와 기능을 사용합니다.
  • 학생들은 큰 문제를 더 작은 문제로 나누어 해결하는 방법을 배웁니다.

  • 프로그래밍 언어로 프로시저와 함수의 개념을 개발합니다.

  • 학생들은 "절차"와 "기능"의 개념을 알고 형식적 매개변수와 실제 매개변수를 결정합니다.

예상 결과 - 설명:

1. '절차'의 정의를 안다.

2.'기능'의 정의를 안다.

3. 실제 매개변수와 형식 매개변수를 결정합니다.

4. 값 매개변수와 가변 매개변수를 구별합니다.

5. 프로시저나 함수에 대한 호출을 찾습니다. 프로그램 코드



Elvira의 표준 계획

1. 종이 제거

2. 꽃에 물주기

3. 책상 닦기

4. 유리 닦기

알고리즘의 끝

이 프로세스의 구성을 개선하는 방법은 무엇입니까?




수업 주제

서브루틴:


이쉬키 바그달라마

서브루틴

절차

절차

매개변수

유용한 구절:

프로시저(함수)에 변수값을 전달하기 위해서는 실제 매개변수를 사용하는데...

절차를 설명하려면 먼저..., 그다음...


서브루틴의 개념

정의

서브루틴- 이것은 프로그램의 기능적으로 독립적인 별도의 부분입니다.

서브루틴

절차


  • 프로그램 텍스트에서 유사한 부분을 반복적으로 반복할 필요가 없습니다.
  • 프로그램 구조를 개선하여 이해하기 쉽게 만듭니다.
  • 프로그램 수정 중 프로그래밍 오류 및 예상치 못한 결과에 대한 저항력이 향상됩니다.

  • 프로그래밍 언어를 사용하여 울타리 그리기

이 작업에서는 하나의 조각(피켓 펜스)을 그리는 알고리즘을 수행하는 프로시저를 생성한 다음 펜의 초기 위치를 변경하면서 이 프로시저를 지속적으로 참조할 수 있습니다.


  • 프로그래밍 환경에서 효율적으로 크리스마스 트리를 그리는 방법을 설명하세요.

  • 이는 특별한 방식으로 설계되고 고유한 이름을 갖는 독립적인 프로그램 조각입니다.

메인 프로그램과 서브루틴 간의 상호 작용



블록 다이어그램

  • 서브루틴(프로시저 또는 함수) 호출 블록

서브루틴(프로시저 또는 함수) 이름


블록 다이어그램


절차에 대한 설명은 다음과 같습니다.

절차 name(형식 매개변수 목록); 설명 섹션 시작하다운영자 ;


함수 설명은 다음과 같습니다.

기능 name(공식 매개변수 목록): 반환 유형;

설명 섹션 시작하다운영자 ;


프로그램 내 위치

프로그램 ...;

//설명 섹션 Uses, Const, Var, ...

절차 ;

시작하다 ....... ;

절차 ;

시작하다 ........ ;

기능 C ;

시작하다 ........ ;

//메인 프로그램

시작하다 ........ .


  • 함수와 프로시저의 차이점은 함수의 몸체를 구성하는 연산자를 실행한 결과가 항상 단일 값이기 때문에 함수 호출을 변수, 상수와 함께 적절한 표현식으로 사용할 수 있다는 점이다.

절차

기능

여러 결과를 얻거나 일부 작업을 수행할 수 있습니다.

결과는 하나만 있으며, 그 유형은 함수 선언 시 별도로 지정됩니다.

결과는 배열, 문자열, 숫자 등 모든 유형의 값이 될 수 있습니다.

결과는 실수, 정수 또는 문자 유형의 값만 될 수 있습니다.

프로시저 호출 명령은 독립적으로 사용할 수 있는 별도의 명령입니다.

함수 호출은 해당 유형의 표현식의 구성 요소로만 사용할 수 있습니다.

함수 본문에는 왼쪽에 함수 이름이 있는 할당 연산자가 하나 이상 포함되어야 합니다.


b 다음 최대:=a else 최대:=b; 최대번호:= 최대; 끝;" 너비="640"

절차인가, 기능인가?

MaxNumber(a,b: 정수): 정수;

var 최대: 정수;

최대번호:= 최대;


b 다음 최대:=a else 최대:=b; 끝;" 너비="640"

절차인가, 기능인가?

MaxNumber(a,b: 정수; var max: 정수);

ab이면 max:=a else max:=b;


절차인가, 기능인가?

ChangeColor(C1, C2: 워드);

텍스트백그라운드(C2)


절차인가, 기능인가?

Add(X, Y: 정수): 정수;


실제

  • 메인 프로그램 섹션에 표시됨

공식적인

  • 서브루틴에 지정됨
  • 서브루틴에 지정됨

이 프로시저는 다음 형식의 연산자에 의해 호출됩니다.

프로시저 이름(실제 매개변수 목록);

  • 실제 매개변수 목록- 쉼표로 구분하여 나열한 목록입니다.

  • Pascal 언어 표준에서 매개변수는 값과 참조라는 두 가지 방법으로 전달될 수 있습니다. 값으로 전달된 매개변수가 호출됩니다. 매개변수-값, 참조로 전송 - 매개변수-변수. 후자는 프로시저(함수) 헤더에서 앞에 서비스 단어 var가 붙는 점이 다릅니다.

매개변수 전달. 형식적 매개변수

변수

가치

값별 매개변수

형식적 매개변수

변수


형식적 매개변수

값별 매개변수

  • 첫 번째 방법(값 전달)에서는 실제 매개변수의 값을 해당 형식 매개변수에 복사합니다.

절차

프로시저 이름(a, b: 정수);

주요 프로그램

프로시저(함수) 실행 중에 이 값을 변경하면 원본 데이터(실제 매개변수)는 변경할 수 없습니다.


Var c, d: 정수;

  • 참조로 전달하는 경우 형식 매개변수가 있는 프로시저(함수)의 본문에서 발생하는 모든 변경 사항은 해당 실제 매개변수에 즉시 유사한 변경으로 이어집니다.

절차

프로시저 이름(a, b: 정수, Var c: 실수);

주요 프로그램

호출 블록의 변수가 변경되므로 출력 매개변수는 참조로 전달됩니다. 호출되면 해당 실제 매개변수는 변수만 될 수 있습니다.


당신은 쓰기:

1.실제 매개변수___________

절차 Kvad(R: 실수; var S: 실수);

2. 형식 매개변수 ___________

3. 형식 매개변수-값 ​​__________

5.절차명 ___________

6. 프로그램에서 프로시저에 액세스 _____________________


대화형 작업

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


Elvira는 학급 리더입니다. 그녀는 종이 제거, 물꽃 제거, 책상 닦기, 유리 닦기 등 교실의 일반적인 청소 계획을 세워야 합니다. 그녀는 자신의 작업을 어떻게 더 잘 정리할 수 있습니까? 엘비라를 도와주세요.


Elvira의 고급 계획

서브루틴:

아르센 - 서류를 치워둔다

밀라 - 꽃에 물주기

비탈리 – 책상 닦기

인디라 – 유리 닦기

1. 아르센을 처형하라

2. 밀라를 실행하세요

3. 비탈리를 실행

4. 인디라 실행

알고리즘의 끝


  • 오늘 우리는 어떤 새로운 프로그래밍 언어 구조를 만났습니까?
  • 연구된 매개변수 이름 지정
  • 매개변수는 프로시저에 어떻게 전달되나요?

  • 수업 요약
  • 정의 찾기: "지역 변수" 및 "전역 변수"
  • 프로시저나 함수를 사용할 수 있는 두 가지 작업을 구성합니다.

  • 수업의 주제를 어떻게 결정하겠습니까? (자신의 이름을 생각해 보세요)
  • 다음 수업에서는 무엇을 배워야 한다고 생각하시나요?

만나자

다음 수업!

수업의 목적

교육적인

  • 학생들 사이에 통일된 조직을 형성하기 위해 개념의 체계절차와 기능의 개념과 관련된 것;
  • Pascal에서 문제를 해결하기 위해 서브루틴을 사용하는 방법을 가르치고 특정 문제를 해결할 때 어떤 유형의 서브루틴이 필요한지 이해하도록 가르칩니다.
  • 서브루틴 사용을 위한 기본 기술을 보여줍니다.

교육적인

  • 정확성, 주의력, 조직력을 기르십시오.
  • 컴퓨팅 기술 문화;

개발 중

  • 학생들의 논리적 사고, 알고리즘 문화를 개발합니다.
  • Pascal에서 서브루틴을 구성하고 디버그하기 위한 지식과 기술을 개발합니다.

학생들은 다음을 수행해야 합니다:

  • 매개변수가 없는 프로시저와 매개변수가 있는 프로시저 작성 규칙을 알고 있습니다.
  • 함수 작성 규칙을 알고 있습니다.
  • 간단한 문제를 해결하기 위해 절차와 기능을 적용할 수 있습니다.

수업 중에는

I. 조직. 순간

II. 소개. 관련성

종이 조각에 과제를 제시하십시오 ( 부록 1 ). 반복을 찾아보세요.

때때로 프로그램의 다른 위치에서 다른 초기 데이터를 사용하여 거의 동일한 일련의 작업을 수행해야 합니다. 이러한 일련의 작업은 소위 다음과 같은 형태로 공식화될 수 있습니다. 서브루틴 (영어로부터, 서브루틴) –연산자를 이름으로 반복적으로 액세스할 수 있는 블록으로 그룹화합니다.

서브루틴은 프로그램의 텍스트를 단축하고, 실행 시간을 크게 줄여주며, 프로그램을 모듈식으로 생성할 수 있는, 즉 완성된 단순한 구성요소 조각으로 복잡한 프로그램을 조립하여 프로그램을 생성할 수 있는 프로그래머의 작업을 더 쉽게 만듭니다. 이를 통해 프로그래머 그룹은 대규모 프로그램을 만들고 학생 그룹은 글로벌 프로젝트를 개발하고 구현할 수 있습니다.

서브루틴은 프로시저와 기능으로 구분됩니다.

내장된(표준) 절차와 기능은 다음과 같습니다. 부분언어를 사용하며 이름으로 부를 수 있습니다. 사전 설명 없이.예를 들어 , abs, sqrt, ln, sin...은 함수(결과 반환)이고, readln, write...는 프로시저(결과를 반환하지 않음)입니다. 이들의 존재는 응용 프로그램 개발을 크게 촉진합니다. 그러나 대부분의 경우 일부 특정한주어진 프로그램에 대해 동작은 터보 파스칼 라이브러리에서 직접적인 유사점을 찾지 못하므로 프로그래머는 자신의 동작을 개발해야 합니다. 비표준절차와 기능.

III. 신소재의 설명

사용자 절차가 작성됩니다. 우리 스스로프로그래머는 언어의 구문에 따라 서브루틴 설명 섹션.

프로시저의 구조는 프로그램의 구조를 따르며, 이는 "미니어처 프로그램"이며 헤더와 본문으로도 표시됩니다.

헤더는 예약어 프로시저, 식별자로 구성됩니다. (이름)절차.

VAR ... // 메인 프로그램의 변수를 설명하는 섹션

프로시저 프로시저이름;

//메인 프로그램 본문

후속 실행을 위한 프로시저 호출이 기록됩니다. 메인 프로그램의 본문에서.

예시 1. 면적과 둘레를 계산하는 프로그램입니다.

서브루틴의 장점:

  • 서브루틴을 사용하여 작성된 프로그램 테스트 및 디버깅이 더 쉽고,그들은 더 명확하다 논리적 구조.
  • 서브루틴의 독립적인 특성으로 인해 서브루틴 작성을 다양한 프로그래머에게 맡길 수 있습니다. 이렇게 하면 프로그래밍 작업이 분할되어 완료가 가속화됩니다.
  • 서브루틴을 사용하면 메모리가 절약됩니다. 서브루틴에 사용되는 변수를 저장하는 메모리는 해당 작업 동안에만 할당되며 실행이 끝나면 즉시 해제됩니다.

예시 2. 사용자는 세 개의 직사각형의 두 변을 입력합니다. 그들의 영역을 도출하십시오.

다음과 같이 문제를 해결할 수 있습니다.

for i:=1 to 3 do

writeln('a와 b를 입력하세요:');

writeln('면적=',a*b);

프로시저를 사용하는 것이 좋은 프로그래밍 스타일로 간주됩니다. 직사각형의 면적을 계산하는 절차가 필요합니다. 기본 프로그램의 개략적인 모습은 다음과 같습니다.

계산

계산

계산

텍스트 프로시저가 이미 존재합니다(예제 1 참조). 면적을 계산하는 두 번째 프로시저를 만들어 보겠습니다. 하지만 S를 계산하려면 2개의 변을 알아야 하므로 절차에서는 어느 변을 곱해야 하는지 표시해야 합니다.

절차 pl(c,d: 정수);

writeln('변이 있는 직사각형의 영역 ',c, ' ' ,d, '=',S);

매개변수는 값이 할당된 변수입니다. 존재하다 형식적 매개변수 , 서브루틴 헤더에 정의됨 실제 매개변수 – 서브루틴에 접근할 때 특정 값을 지정하는 표현식.

이름으로 호출하고 실제 매개변수를 지정하면 프로시저가 실행됩니다. , 쉼표로 구분하고 괄호로 묶습니다.

실제 매개변수는 형식 및 수량 면에서 형식 매개변수와 일치해야 합니다.

따라서 주요 프로그램은 다음과 같습니다.

for i:=1 to 3 do

논평.이 문제를 해결하려면 사용자가 입력한 숫자를 확인해야 합니다(음수가 아니어야 합니다. 그렇지 않으면 프로그램이 중단됩니다).

확인 절차를 만들어 보겠습니다.

프로시저 오류(f,g:정수);

만약 (f<0) or (g<0) then begin

writeln('사각형의 변은 음수일 수 없습니다.');

정지; // 프로그램 중단

최종 프로그램 – 부록 4

따라서 절차의 형식은 다음과 같습니다.

절차<имя>(공식 매개변수);

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

예시 3. 두 숫자 c=5와 d=7의 자리를 바꾸는 프로그램을 작성하세요.

프로그램 교환Dan;

var c,d:정수;

프로시저 교환(a,b:정수);

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

writeln("2개의 숫자를 입력하세요: ");

writeln(c," ",d);

프로그램을 시작한 후 형식 매개변수(프로시저에서)의 위치가 변경되었지만 실제 매개변수(주 프로그램에서 사용되는)는 변경되지 않은 것을 볼 수 있습니다. RAM의 일부를 보여주는 그림을 살펴보겠습니다.

1) 두 개의 매개변수 5와 7을 사용하여 obmen 프로시저를 호출할 때 숫자 5와 7도 각각 변수 a와 b에 배치됩니다.

3) 그러나 변수 c와 d에서는 데이터가 변경되지 않았습니다. 그들은 다른 메모리 셀에 있습니다.

변수 c와 d, a와 b의 순서로 동일한 메모리 셀을 참조했습니다. (a와 b의 값이 변경되면 c, d의 값도 변경됩니다.) 형식 매개변수를 설명할 때 필수 변수 앞에 VAR이라는 단어를 추가해야 합니다.

프로시저 교환(var a,b:integer);

obmenDan 프로그램을 변경합니다:

var로 인한 오류입니다. 숫자는 프로시저에서 변경할 수 없는 상수입니다.

예시 4. 계산만 하고 결과를 화면에 표시하지 않는 과정을 이용하여 원의 넓이를 구합니다.

프로시져 서클(r:실제);

프로시저는 결과를 반환해야 합니다.

프로시저 서클(r:실제; var S:실제);

readln(a, e);

논평:프로시저 S의 변수는 프로시저의 결과를 기본 프로그램으로 반환하는 데 사용됩니다. 변경되면 호출 프로그램의 실제 매개변수도 변경됩니다. 변수 마.

이를 위해 Pascal에서는 프로시저 대신 함수(무언가를 반환하는 서브루틴)가 사용되는 경우가 더 많습니다.

기능은 절차와 유사하지만 두 가지 차이점이 있습니다.

  • 이 함수는 작업 결과를 프로그램에 전송합니다. 단일 값은 해당 함수의 이름이 전달됩니다.
  • 함수 이름은 표현식에서 피연산자로 나타날 수 있습니다. 이 함수는 호출 지점에 결과를 반환합니다.

예를 들어, sqr(x) –는 x 값을 제곱하고 숫자 x의 제곱의 계산된 값을 호출 지점에 반환합니다. y:=sqr(x);

사용자 정의 함수는 함수 헤더와 함수 본문으로 구성됩니다. 함수의 본문은 프로그램과 구조가 유사합니다. 레이블, 상수, 유형 등에 대한 설명입니다. 이 절차의 범위 내에서만 유효합니다.

기능<имя>(공식 매개변수):<тип результата>;

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

명령문 섹션에는 함수 이름에 값을 할당하는 명령문이 하나 이상 포함되어야 합니다. 마지막 할당 결과가 콜 포인트로 반환됩니다.

실시예 5. 원의 넓이에 관한 문제를 다시 풀어봅시다.

함수 원(r:실수): 실수;

a:=원(5); (반드시 할당되어야 함)

실시예 6. 1!+2!+…+n을 찾아보세요!

우리는 계승을 찾는 기능을 사용합니다. 왜냐하면 그것을 입력으로 제공하고 결과를 얻기 때문입니다.

함수 사실(a:integer): 정수;

i:=1 할 일

줄에서 사실:=fact*I;

사실은 매개변수와 함께 호출되어야 하기 때문에 컴파일러는 오류를 발견합니다. 따라서 일반적으로 결과가 배치되는 추가 변수가 도입됩니다. 그런 다음 이 결과가 사실 변수에 할당됩니다.

프로그램 계승;

var sum,n,j: 정수;

함수 사실(a: 정수): 정수;

var i,d: 정수;

i:=1 할 일

j:=1 ~ n의 경우

합계:=합+사실(j);

IV. 수업 요약

이때 프로그래밍 과정은 산업용 소프트웨어 생산기반을 둔 프로그래밍 기술. 대부분의 전문가들은 이렇게 생각한다. 하향식 프로그램 설계 방법복잡한 문제를 해결하는 데 가장 적합합니다. 먼저 작업을 일반적인 용어로 정의한 다음 그 구조를 점차적으로 명확하게 합니다. 다음 단계에서는 각 하위 작업이 여러 개의 하위 작업으로 나뉩니다. 복잡한 문제의 개별 부분에 대한 솔루션은 독립적인 프로그램 블록, 즉 서브루틴입니다.

V. 숙제

문제 해결(서면):

  1. 입력된 문자열의 모든 문자 a를 *로 바꾸는 프로시저를 만듭니다.
  2. 두 가지 제안이 주어집니다. 그 안에 있는 "n" 글자의 총 개수를 구하세요. (문장에서 "n" 글자 수를 계산하는 함수를 정의합니다.)