Язык программирования Паскаль 5.ppt
- Количество слайдов: 43
Язык программирования Паскаль Процедуры и функции Способы передачи параметров 1
Повторение 1 Что будет выведено на экран после выполнения процедуры? Var A: array[1. . 10] of integer; Procedure AAA; Var I, P: integer; Begin For I: =10 downto 1 do A[I]: =2+I-11; For I: =1 to 10 do Begin P: =A[I]; A[I]: =A[10 -I+1]; A[10 -I+1]: =P; End; For I: =1 to 10 do writeln(A[I]); End; 1 1, 0, -1, -2, -3, 0, 0, 0 2 -8, -7, -6, -5, -4, -3, -2, -1, 0, 1 3 -9, -8, -7, -6, -5, -4, -3, -2, -1, 0 4 0, 1, 2, 3, 4, -5, -6, -7, -8, -9 5 1, 0, -1, -2, -3, -4, -5, -6, -7, -8 2 Ответ: 2
Повторение 2 Program PR; var A: array[1. . 10] integer; I, S, K: integer; begin S: =0; K: =1; for I: =10 downto 1 do A[I]: =I; for I: =1 to 10 do : =S+A[I]*K; K: =K+1; S writeln(S) end. Ответ: В A. 385 of B. 55 C. 386 D. 56 E. При выполнении произойдет ошибка. 3
Повторение 3 Что будет выведено на экран после выполнения программы? Program PR 10; Const N=5; var A: array[1. . 2*N] of integer; I, J, K, X: integer; begin for I: =N Down. To 1 do A[I]: =2*I+1; X : = 0; K : = 0; for I: =N Down. To 1 do If A[I] mod 4 = 1 Then Begin For J: =N+K Down. To I+1 DO A[J+1]: = A[J]; A [I+1]: = X; Inc (K); End; for I: =1 to N+K do writeln(A[I]: 6) end. A. 3, 5, 7, 9, 11 B. 3, 0, 5, 0, 7, 0, 9, 0, 11, 0 C. 3, 0, 5, 7, 0, 9, 11 D. 3, 5, 0, 7, 9, 0, 11 E. Программа написана с ошибкой и работать не будет 4 Ответ: D
Повторение 4 Что будет напечатано после выполнения программы? Var A: array[1. . 10] of integer; I, P, K: integer; Begin For I: =10 downto 1 do A[i] : = 2*I - 1; P: =0; For I: =10 downto 1 do If A[I] mod 3 =1 then Begin For K: =I to 10 -P-1 do A[K]: =A[K+1]; P: =P+1; End; For I: =1 to 10 -P do writeln(A[I]); End. A. 3, 5, 9, 11, 15, 17 B. 3, 7, 11, 15, 19 C. 17, 15, 11, 9, 3, 5 D. 19, 15, 11, 7, 3 E. 1, 9, 15 5 Ответ: A
Процедуры и функции l l l При решении новых задач можно попытаться воспользоваться ранее написанными программами. Алгоритм, ранее разработанный и целиком используемый в составе других алгоритмов, называется вспомогательным. Применение вспомогательных алгоритмов позволяет разбить задачу на части, структурировать ее. Вся программа условно может быть разделена на две части: основную и вспомогательную. В основной части производится простейшая обработка информации, организуется обращение к разным вспомогательным модулям (подпрограммам). Вспомогательный алгоритм тоже может вызывать другие вспомогательные, длина такой цепочки вызовов теоретически не ограничена. Вспомогательными и основными алгоритмы являются не сами по себе, а по отношению друг к другу. 6
l l l Использование подпрограмм позволяет сделать основную программу более наглядной, понятной, а в случае, когда одна и та же последовательность команд встречается в программе несколько раз, даже более короткой и эффективной. В языке Паскаль существует два вида подпрограмм: процедуры и функции, определяемые программистом. Процедурой в Паскале называется именованная последовательность инструкций, реализующая некоторое действие. Функция отличается от процедуры тем, что она должна обязательно выработать значение определенного типа. Процедуры и функции, используемые в программе, должны быть соответствующим образом описаны до первого их упоминания. Вызов процедуры или функции производится по их имени. 7
Функции Рассмотрим задачу вычисления суммы тангенсов трёх чисел x, y, z. Для её решения можно воспользоваться следующей программой: Program tangens; Var x, y, z: real; Begin Read. Ln(x, y, z); Writeln((sin(x)/cos(x)+sin(y)/cos(y)+sin(z)/cos(z)): 8: 2) End. l 8
В операторе вывода три раза повторяется одно и то же выражение для вычисления тангенса: sin(x)/cos(x) с разными значениями параметра. В Паскале нет стандартной функции для его вычисления. l Функцию можно написать самим и в этом случае программа будет иметь следующий вид: Program tangens; Var x, y, z: real; Function tan(a: real): real; Begin tan: =sin(a)/cos(a) End; Begin Read. Ln(x, y, z); Writeln((tan(x)+tan(y)+tan(z)): 8: 2) End. l 9
Функция – это подпрограмма, в результате работы которой получается скалярная величина (т. е. одно значение), которая обязательно присваивается переменной с тем же именем, что и имя функции. Вызов функций, созданных пользователем, производится аналогично вызову стандартных функций, то есть внутри выражений либо в операторе присваивания, либо в операторе вывода. l Описание функций: Function <имя функции> (<список формальных параметров>): <тип результата>; <описательная часть> Begin <тело функции> <имя функции>: =<выражение>; end; l Описание функции идет после описания переменных, до начала основной части. l 10
l l l Значения, передаваемые в функцию, называются фактическими параметрами. В предыдущей задаче в качестве фактических параметров использовались переменные x, y, z. Параметры, описываемые внутри функции, называются формальными. Желательно, чтобы их имена не совпадали с именами фактических во избежание путаницы. При вызове функции формальному параметру присваивается значение фактического. Имя функции одновременно является и именем переменной, которой будет присвоен результат выполнения функции, поэтому необходимо, чтобы был описан её тип. Если имя функции используется в левой части оператора присваивания, то оно играет роль обычной переменной и пишется без параметров: tan: =sin(a)/cos(a). Это можно делать только внутри самой функции. Если имя функции записывается в правой части оператора присваивания или внутри оператора вывода, то это означает вызов функции и наличие параметров необходимо: b: =tan(x) или write(tan(x)). 11
l l В качестве фактических параметров могут использоваться не только переменные, но и выражения: writeln(tan((x+y+z)*2)). В этом случае при вызове функции формальный параметр получит значение этого выражения. В нашем случае переменная a получит значение (x+y+z)*2. Раздел описаний может иметь такие же подразделы, как и раздел описаний основной программы (описание процедур и функций - в том числе). Однако все описанные здесь объекты "видимы" лишь в этой процедуре. Они здесь локальны также, как и имена формальных параметров. 12
Задача 1. Вычислить площадь четырёхугольника со сторонами a, b, c, d и диагональю e. Для вычисления площади такого четырёхугольника, необходимо вычислить площади двух треугольников, из которых он состоит, а затем сложить. Для вычисления площади отдельного треугольника можно воспользоваться формулой Герона. Program geron; Var a, b, c, d, e: real; Function S(x, y, z: real): real; Var p: real; {локальная переменная. Память выделяется тогда, когда функция начинает свою работу. После завершения работы эта часть памяти освобождается, и значение переменной будет снова неопределено} Begin p: =(x+y+z)/2; S: =sqrt(p*(p-x)*(p-y)*(p-z)) End; Begin Readln(a, b, c, d, e); Writeln(‘S=’, (S(a, b, e)+S(c, d, e)): 8: 2) End. 13
Задача 2. Найти наибольший общий делитель для значений a+b, |a-b| и a*b. l Идея решения состоит в следующем математическом факте: если х, у, z — три натуральных числа, то НОД(х, у, z) = =НОД(х, у), z). Т. е. нужно найти НОД двух величин, а затем НОД полученного значения и третьего числа. l Будем использовать функцию для вычисления наибольшего общего делителя двух произвольных чисел. Для этого воспользуемся правилом Эвклида: НОД(M-N, N), если M>N НОД(M, N)= НОД(M, N-M), если N>M N, если N=M l Проверить эту формулу на числах 24 и 40. l 14
Program NOD; Var a, b, rez: integer; Function Evklid(M, N: integer): integer; Begin While M<>N do If M<>N then M: =M-N Else N: =N-M; Evklid: =N End; Begin Read. Ln(a, b); Rez: =Evklid(a+b, abs(a-b)), a*b); Writeln(‘НОД=’, Rez) End. 15
l l l Задача 3. Написать функцию, определяющую, относится ли заданное число к простым. Простое число – это число, которое делится только на 1 и само на себя. Для того, чтобы проверить, является ли число N простым, необходимо последовательно делить его на все числа, начиная с 2 до числа N. Если окажется, что ни на одно из чисел N не делится, то оно простое. В действительности, достаточно делить N на числа от 2 до N div 2. Возьмём, к примеру, число 10. Очевидно, что на числа, превышающие 10 div 2=5, оно нацело делиться не будет. В программе будем использовать функцию, возвращающую логическое значение true, если число простое и false – в противном случае. 16
Program prime; Var k: integer; is: boolean; Function isprime(N: integer): Boolean; Var j: integer; is: boolean; Begin is: = true; j: =2; While (j<=N div 2) and is do Begin If N mod j = 0 then is: =false; j: =j+1 End; isprime: =is End; Begin Readln(K); If isprime(k) then writeln(‘Простое’) else writeln(‘Не простое’) End. 17
Процедуры l l Если функции используются в том случае, когда в основную программу должна быть возвращена скалярная величина, то процедуры удобнее использовать в следующих случаях: - если в основную программу должна быть возвращена величина нескалярного типа (например, массив), - если в основную программу должно быть возвращено несколько значений, - если в основную программу ничего не должно возвращаться. 18
Описание процедур имеет следующий вид: Procedure <имя процедуры> [(<список формальных параметров>)]; <описательная часть> begin <тело процедуры> end; l Обращение к процедуре производится по следующей схеме: <имя процедуры> [(<фактические параметры>)]; l Вызов процедуры осуществляется отдельной командой, то есть вызов внутри операторов присваивания и вывода недопустим: <Имя процедуры> (<Фактический параметр 1>, <Фактический параметр 2>, …); l 19
l При вызове процедур и функций необходимо соблюдать следующие правила: l l l количество фактических параметров должно совпадать с количеством формальных; соответствующие фактические и формальные параметры должны совпадать по порядку следования и по типу. Имена формальных и фактических параметров могут совпадать. Это не приводит к проблемам, так как соответствующие им переменные все равно будут различны из-за того, что хранятся в разных областях памяти. Кроме того, все формальные параметры являются временными переменными - они создаются в момент вызова подпрограммы и уничтожаются в момент выхода из нее. 20
Способы передачи параметров И в процедурах, и в функциях формальные параметры делятся на два типа: l 1) параметры, передаваемые по значению, l 2) параметры, передаваемые по ссылке. l Но, если в функциях параметры, передаваемые по ссылке, практически не используются, то для процедур такие параметры обязательно должны присутствовать, если в программу необходимо возвратить какой-либо результат. l Описание параметров, передаваемых по ссылке (параметры-переменные): Var <список переменных>: <тип>; l Описание параметров, передаваемых по значению (параметры-значения): <список переменных>: <тип>; l При использовании обоих типов параметров в описании одной процедуры, они отделяются друг от друга точкой с запятой. l 21
Параметры-переменные При передаче параметров по ссылке (это формальный параметр, перед которым стоит служебное слово Var) изменения формального параметра внутри процедуры приводят к аналогичному изменению фактического параметра. То есть формальный и фактический параметр являются именем одной и той же ячейки памяти (передается адрес фактического параметра, который должен быть обязательно переменной!): l Пример. Program a; Y X Var b, c: integer; Procedure Q(Var x, y: integer); Begin X: =5; c b Y: =10 End; Begin B: =1; c: =2; Q(b, c); Write(b, c) End. l После выполнения процедуры осуществляется возврат на оператор основной программы, который следует за вызовом процедуры. Какие значения будут выведены на экран? 22
Параметры-значения При передаче параметров по значению формальный параметр считается локальной переменной, действующей только в пределах процедуры. При вызове процедуры он получает начальное значение, равное значению фактического параметра и после этого никакой связи между ними не существует. То есть создаётся копия переменной. Внутри подпрограммы возможны любые действия с данным параметром, но это никак не отражается на значениях переменных вне процедуры. l Пример Program a; Var b, c: integer; Y X Procedure Q(X, Y: integer); Begin X: =5; Y: =10 c b End; Begin B: =1; c: =2; Q(b, c); Write(b, c) End. l Какие значения будут выведены на экран? . l 23
l. Обычно параметры-значения используются для передачи в подпрограмму исходных данных, а параметры-переменные – для возврата результата. l. Записать с использованием процедуры программу вычисления площади четырёхугольника. Program geron; Var a, b, c, d, e, s 1, s 2: real; Procedure Square(x, y, z: real; Var s: real); Var p: real; Begin p: =(x+y+z)/2; S: =sqrt(p*(p-x)*(p-y)*(p-z)) End; Begin Readln(a, b, c, d, e); Square(a, b, e, S 1); Square(c, d, e, S 2); Writeln(‘S=’, S 1+S 2) End. В качестве параметров-значений можно передавать и переменные, и константы. В качестве параметров-переменных – только переменные. Например, будет ошибочной запись: Square(5, 6, 8, 10) 24
Задача 1. Написать программу, запрашивающую 5 целых чисел (N<=999999) и выводящих в текстовый файл все цифры этих чисел через запятую в обратном порядке. Program number; Var a: longint; i: byte; f: text; procedure cifra(x: longint); var k: byte; begin while x<>0 do begin k: =x mod 10; write(f, k, ’, ’); x: =x div 10 end; writeln(f) end; begin assign(f, ’f. dat’); rewrite(f); for i: =1 to 5 do begin read(a); a: =abs(a); cifra(a) end; close(f) end. l 25
l Задача 2. Что получится в результате работы программы: Program example; Var a, b, c: integer; Procedure One(x, y: integer; Var z: integer); Begin X: =y+2; y: =z*3; z: =5; Writeln(x, ’ ‘, y, ’ ‘, z) End; Procedure Two(x: integer; var z, y: integer); Begin X: =y+z; y: =y+10; Writeln(x, ’ ‘, y, ’ ‘, z) End; Begin a: =1; b: =2; c: =3; Two(b, a, c); writeln(b, ’ ‘, a, ’ ‘, c); One(a, b, c); writeln(a, ’ ‘, b, ’ ‘c) End. Ответ: 4 13 1 2 1 13 4 39 5 125 26
Область действия описания переменных 1. Имена переменных, описанных в некоторой подпрограмме, считаются известными в пределах данной подпрограммы, включая и все вложенные подпрограммы. Такая "передача" параметров из основной программы в подпрограмму считается плохим стилем программирования. Т. к. повторно использовать такую подпрограмму затруднительно из -за того, что нужно помнить, какое количество параметров неявно было передано в подпрограмму и что они означают. Лучше всего осуществлять явную передачу параметров в подпрограмму, используя механизм формальных и фактических параметров. 27
l Имена переменных, описанных в подпрограмме, должны быть разными в пределах данной подпрограммы и могут совпадать с именами переменных из других подпрограмм. 28
l Пусть вторая подпрограмма вызывается из первой. Во второй подпрограмме описана переменная с именем, которое существует в первой подпрограмме. Тогда переменная из второй подпрограммы делает "невидимой" (недоступной) переменную из первой подпрограммы. 29
Описание подпрограмм l l При использовании процедур и функций в Паскале допускается их описание не только внутри основной программы, но и внутри других процедур и функций. В Паскале действуют правила: l l Каждый программный объект должен быть описан перед своим использованием. То есть описание объекта должно предшествовать его первому появлению в других программных фрагментах. Внутренняя подпрограмма не может вызывать подпрограмму, по отношению к которой она является вложенной. 30
Рассмотрим схему условного описания подпрограмм в некоторой условной программе: Из основной программы можно Основная программа обратиться к A и B. Обращение в внутренним процедурам невозможно, так как они являются Процедура A локальными по отношению к тем Процедура A 1 процедурам, внутри которых Процедура A 2 описаны, и не видны из основной программы. Из A можно обратиться к A 1 и A 2. Процедура B Обращение к процедуре B недопустимо, так как она описана Процедура B 1 позже процедуры A. Процедура B 2 Из процедуры B можно обратиться в её внутренним процедурам B 1 и Процедура B 21 B 2, а также к процедуре A, так как Процедура B 22 её описание предшествует вызову. Из процедуры B 2 можно вызвать B 21 и B 22, а также процедуры A и B 1. Из процедуры B 22 можно вызвать A, B 1 и B 21. 31
Типы формальных параметров должны обязательно обозначаться идентификатором. Например, недопустимы следующие записи (кроме Паскаля АВС): 1) Procedure S(Var a: 1. . 100). l Допустим следующий вариант: Type c=1. . 100; Procedure S(Var a: c); l 2) Procedure S(Var m: array[1. . 12] of Integer); l Допустим следующий вариант: Type Tarray=[1. . 12] of Integer; ; Procedure S(Var a: Tarray); 32
Тестовые задания на использование процедур и функций 11 При каком описании формальных параметров следующая ниже программа напечатает три числа: 2 3 1 ? Program M; Var x, y, z: integer; Procedure P(. . ); Var z: integer; begin z: =a; a: =b; b: =c; c: =z end; begin x: =1; y: =2; z: =3; P(x, y, z); writeln(x, y, z) end. 1 Var a, b, c: integer; 2 Var a, b: integer; c: integer; 3 a, b, c: integer; 4 a, b: integer; Var c: integer; 5 a: integer; Var b, c: integer; Ответ: 1 33
Что будет выведено на экран после выполнения процедуры? Var A: array[1. . 10] of integer; Procedure AAA; Var I, P: integer; Begin For I: =10 downto 1 do A[I]: =2+I-11; For I: =1 to 5 do Begin P: =A[I]; A[I]: =A[10 -I+1]; A[10 -I+1]: =P; End; For I: =1 to 10 do writeln(A[I]); End; 1 1, 0, -1, -2, -3, 0, 0, 0 2 -8, -7, -6, -5, -4, -3, -2, -1, 0, 1 3 -9, -8, -7, -6, -5, -4, -3, -2, -1, 0 4 0, 1, 2, 3, 4, -5, -6, -7, -8, -9 5 1, 0, -1, -2, -3, -4, -5, -6, -7, -8 Ответ: 5 34
13 Запишите, что будет выведено на печать после выполнения программы. var m, n: Byte; Function NOD(a, b: Byte): Byte; Begin While a<>b Do If a>b Then a: =a-b Else b: =b-a; NOD: =a End; Begin m: =36; n: =56; Writeln(NOD(m, n), ’ ‘, m, ’ ‘, n); End. 1 4 4 4 2 4 36 4 3 4 4 56 4 4 36 56 5 36 36 56 Ответ: 4 35
4 Что будет выведено на экран после выполнения программы, если N=3? Program A; Var j, N: integer; Procedure picture (k: integer); Var i: integer; begin for i: =k downto 1 do write(‘*’); for i: =1 to k do write(‘+’); writeln end; begin readln(N); for j: =N downto 1 do picture(j) end. A. +++*** B. +*+*+* C. +*+*+* D. +++*** E. ***+++ ++** +*+* ++** **++ +* +* *+ Ответ: E 36
5 Выбрать верное описание заголовка функции (процедуры): A. procedure X(a, b: integer; Var x: char); B. function Y(a: integer; b: char): CHAR; C. function A(x: integer); D. procedure B(x: integer; Var y: integer): boolean; Ответ: B 37
Какая из приведенных ниже процедур «переворачивает» определенный в программе и переданный в процедуру в качестве параметра массив B: ARR ( меняет местами первый и последний его элементы, второй и предпоследний и т. д. )? Здесь ARR=array[1. . 11] of integer; Procedure P 1(A: ARR); Var I, C: integer; Begin for I: =1 to 11 div 2 do begin C: =A[I]; A[I]: =A[11 I+1]; A[11 -I+1]: =C end; Procedure P 2(A: ARR); P 3(A: ARR); Var I, C: integer; Begin for I: =1 to 11 do for I: =1 to 11 div begin C: =A[I]; 2 do begin A[I]: =A[11 - A[I]: =A[11 I+1]; A[11 -I+1]: =C A[11 end I+1]: =A[I] end; end End; Ответ: P 1 38
7 Найти неправильно описанную функцию: A. function f(a: char): integer; begin f: =ord(a); if f<0 then f: =–f end; B. function f(a: char): integer; Var r: integer; begin r: =ord(a); if r<0 then r: =–r; f: =r end; C. function h(x: integer): integer; begin h: =round(sqrt(x)) end; D. function h(x: integer): integer; Var k: real; begin k: =sqrt(x); h: =round(k) end; E. function h(x: integer): integer; begin h: =trunc(sqrt(x)) end; Ответ: A 39
8 Определите, какой массив А будет сформирован в результате вызова функции М в приведенной ниже программе? Program P 22; Const N=1; Type TA=array[N. . N] of integer; Var A: TA; Function M(F: integer): TA; Var I: integer; Begin for I: =-1 to 1 do AR[I]: =AR[I 1]*F end; Begin A: =M(1000) end. A. Массив из нулевых элементов В. Массив степеней числа 1000 С. При выполнении программы произойдет ошибка D. При трансляции программы произойдет ошибка E. Массив, включающий числа 3464, -9408 и 29184 Ответ: D. 40
9 В программе описаны переменные I: integer; R: real; C: char; Какой из приведенных ниже заголовков процедур или функций соответствует вызову F в операторе C : = F( I, 5, R, 5*I, C, ‘R’)? A. function F(var A: integer; B: integer; var C: real; D: real; var E: char; G: char); B. function F(var A: integer; B: integer; var C: real; D: real; var E: char; G: char): char; C. procedure F(var A: integer; B: integer; var C: real; D: real; var E: char; G: char); D. function F(A: integer; var B: integer; var C: real; D: real; var E: char; G: char): char; E. function F(var A: integer; B: integer; C: real; var D: real; var E: char; G: char): char; Ответ: В. 41
10 В процедуру в качестве параметра передаётся массив. Указать, можно ли передать такой параметр, и если можно, определить, какой способ передачи потребует меньше памяти при вызове процедуры. A. нельзя передать B. по ссылке C. по значению D. Одинаково E. Зависит от типа элементов Ответ: В. 42
11 В программе сделаны следующие описания: const A=15; var X: integer; Y: real; C: char; а также описана процедура, заголовок которой имеет вид procedure PR(var A: real; B: integer; C: real; var D: integer; E: char); Определить, какой из приведенных ниже операторов будет верным вызовом процедуры PR. A. X: =PR(Y, A, 0. 5, X, C); B. PR(Y, A, A*2, X, ‘X’); C. PR(0. 5, 2, Y, X, C); D. PR(Y, X, Y/2, A+1, C); E. PR(Y, A, 0. 5, X, ‘ABCDE’); Ответ: В. 43
Язык программирования Паскаль 5.ppt