Процедуры и функции. В языке Паскаль механизм подпрограмм реализуется в виде процедур и функций, которые вводятся в программе с помощью своего описания, но структура их такая же, как структура подпрограмм. Подпрограмма - повторяющаяся группа операторов, оформленная в виде самостоятельной программной единицы. Она записывается однократно, а в соответствующих местах программы обеспечивается обращение к ней по имени.
Процедура предназначена для выполнения некоторой последовательности. Любая процедура начинается с заголовка, который является её обязательной частью. Схема: Procedure (список формальных параметров); begin end; Список формальных параметров может быть не обязательным. Результатом выполнения процедуры является одно или несколько значений, они передаются в основную программу как значение её параметров, при вызове процедуры в теле программы её формальные параметры заменяются фактическими в порядке их следования.
Фактические параметры – это параметры, которые передаются процедуре при обращении к ней. Формальные параметры – переменные фиктивно присутствующие в процедуре и определяющие тип и место подстановки фактических параметров, над которыми производятся действия. Все формальные параметры делятся на два вида: - переменные параметры и параметры значения. Параметры переменные это те формальные параметры, перед которыми стоит служебное слово Var. Они передаются по ссылке (передается адрес фактического параметра), тогда когда необходимо передать некоторые новые значения в точке вызова процедуры из программы. Изменение значения формальных параметров приводит к изменению соответствующих фактических параметров, и они получают новые значения. Параметры значения это такие формальные параметры, перед которыми служебное слово Var не ставиться, и идёт передача по значению, т.е. передается только копия значений этих параметров.
Составить программу, которая будет находить a в степени n. 1 Program pr1; 2Var a,n: integer; 3 s: longint; 4 procedure D ( x,y:integer; var st : longint); 5 var i: integer; 6 begin 7 st:=1; 8 for i:=1 to y do st :=st*x; 9 end; 10 begin 11 writeln (введите 2 числа); 12 readln(a,n); 13 D (a,n,s); {обращение к процедуре} 14 writeln (результат,s); 15 readln; 16 end.
4- заголовок, который состоит из служебного слова и названия. В скобках список формальных параметров: x –основание, y- степень -- параметры значения. st- результат – параметр переменная. 5- описательная часть, состоит из раздела описания переменных. Здесь описана одна локальная переменная тело процедуры. Здесь вычисляется степень некоторого числа с помощью цикла for. 13- вызов процедуры. Процедура вызывается как оператор, состоящий из имени процедуры. В скобках передаются фактические параметры. В этом примере a, n, s передают свои значения в соответствии с формальными параметрами: x, y, st. После завершения работы процедуры переменные a и n имеют те же значения, что и при вызове, а s получает новое значение.
Функция Отличия от процедуры 1. Функция предназначена, для того чтобы вычислять только одно значение. 2. Отличие в заголовке. Схема: Function ( ): ; ; begin ; := ; end;
В теле функции должен обязательно присутствовать оператор присваивания, где в левой части имя функции, а в правой - её значение. В противном случае значение не будет определенно. Пример Составить программу, подсчитывающую число сочетаний без повторений из n элементов по k элементу. C n k =n!/k!(n-k)!
1 program pr7; 2 var n, k: integer; 3a1, a2, a3, c: longint; 4 function f(n: integer): longint; 5 var i: integer; 6 rez: longint; 7 begin 8 rez:=1; 9 for i:=1 to n do 10 rez:= rez*i; 11 f:=rez; { присвоение значения имени функции} 12 end; 13 begin { начало основного блока программы} 14 writeln( введите n и k); 15 readln(n,k); 16 a1:=f(n); 17 a2:=f(k); 18 a3:=f(n-k); 19 c:=a1 div (a2*a3); 20 writeln(результат,c); 21 readln; 22 end.
4 – заголовок, в скобках формальный параметр n тип функции – longint. 5-6 – описательная часть ( локальные переменные) i- переменная для цикла rez- переменная для накопления значения факториала тело цикла. Результат вычисления присваивается имени функции, таким образом она получает свое значение. Затем идет тело основной программы Действие функции выполняется тогда, когда в основной части программы необходимо найти значение функции, т.ё в момент обращения к этой функции её вызов осуществляется внутри некоторого выражения. Обращение записывается в виде имени функции за которым следует в круглых скобках список параметров. Параметры, записываемые в обращении к функции, называются фактическими, а параметры указанные в её описании называются формальными. В нашей функции n –формальный параметр, а n и kфактический. Формальное n и n-фактическое компьютер не путает, так как области их действия не совпадают. Таким образом, в описание функции можно вводить различные имена, не заглядывая в другие части программы.
Структурированные типы. Множество значений или переменных с одним общим именем называются структурированными (составными) типами. Существует несколько способов построения структурированных или составных типов, каждый, из которых отличается способом обращения к отдельным компонентам. Существует четыре разновидности: 1 Регулярный тип (массивы); 2 Комбинированный тип (записи); 3 Файловый тип (файлы); 4 Множественный тип (множества).
Файловый тип. Мы рассматривали задачи, где исходные данные и результаты не сохранялись. В Паскале есть возможность записать их на диск. Для этого их оформляют в виде файлов, которые хранятся на диске точно так же как и программа. Под файлом понимают набор данных. В языке Паскаль файл представляет собой последовательность элементов одного типа. Все компоненты файла имеют общее имя, но они становятся доступными, после того как будут пройдены все предыдущие значения. Количество элементов файла может быть любым, т.е. заранее не фиксируется. После каждого элемента автоматически компилятором ставится признак конца элемента, а в конце файла, ставиться признак конца файла.
Описание переменной файлового типа а)типизированные файлы Схема: Var : file of ; Например, Var ft : file of integer; m : file of char; - файл символьных данных Эти файлы называются типизированные, т.к. у них указан тип их элементов. Все компоненты имеют общее имя, а каждый имеет ещё свой номер. Начальный элемент имеет нулевой номер. Действие с файлами производиться по элементарно, причём в них участвует тот элемент, который указывает текущий указатель, перемещающийся в результате выполнения действия на следующий элемент.
б)Текстовые файлы. Это файлы, содержащие символы, разделенные на строки, причем в конце каждой строки стоит признак конца строки. У текстовых файлов есть различия: элементами этих переменных являются символы, и они имеют строковую структуру; при чтении и записи числа преобразуются автоматически. Схема описания текстового файла: Var : text; Например, Var ft1 : text; Обработка типизированных и текстовых файлов одинакова (за исключением признака конца файла или строки и некоторых стандартных функций).
1. Связь переменной файлового типа с конкретным внешним файлом. В Паскале файл является некоторой переменной и ему можно присвоить имя. Существует операционная система, которая использует имена файлов. Для установления связи между переменной файла в Паскале и именем файла операционной системы существует стандартная процедура Assign. Assign (, ); Например, Assign( ft, d :/ t.dat); Файл в данный момент времени может быть только для записи или только для чтения из файла.
2. Чтение файла Для чтения файла в программе необходимо открыть файл для чтения, процедура называется Reset. Reset ( ); Прочитать данные можно с помощью процедуры Read. Read (, ); Close ( );
3. Запись файла. Для записи файла необходимо следующее: Связать с внешним файлом на диске. Assign (, ); Открыть файл для записи с помощью rewrite. rewrite( ); Записать с помощью write. write(, ); Close ( );
4. Признак конца файла (строки) Так как по определению число элементов не задается заранее, то в Паскале введен признак конца файла (строки). Эта логическая функция EOF (EOLN) используется для определения, достигнут ли конец файла (строки), истина(true), в противном случае (false). Для определения конца файла используется оператор цикла: While not EOF ( ) do(пока не достигнут конец файла) Для определения конца строки используется оператор цикла: While not EOLN ( ) do (пока не достигнут конец строки).
Пример. Прочитать файл целых чисел и вывести их на экран. Program pr8; var F1: file of integer; begin assign (F1,a.dat); reset(F1); while not EOF (F1) do begin read(F1,n); writeln(n); end; close(F1); readln; end.
Массивы (регулярный тип). Одномерный массив –фиксированное количество элементов одного и того же типа объединенных одним именем, где каждый элемент имеет свой номер. Одномерный массив описывается следующим образом: 1) : array [n1..n2] of ; Например, var a: array [1..10] of integer; 2) type m = array [1..30] of integer; var a: m;
Работа с элементами одномерного массива осуществляется внутри цикла (любого), например, Sum:=0; For i:=1 to 4 do begin A[i]:= random(56)-20; Writeln(a[i]); if a[i]<0 then Sum:=sum +a[i]; End; Способы задания одномерных массивов задание с клавиатуры; с помощью генератора случайных чисел; с помощью формулы. считывание из файла. Примеры – см практику.
Двумерный массив. Массив, положение элементов которого описывается двумя индексами, называется двумерным. Их можно представить в виде прямоугольной таблицы Схема объявления: 1) Var a:array[1..n,1..m ] of Например, Var a:array[1..2,1..3 ] of integer; 2) Type d m1=array [1..n,1..m] of ; Var a: d m1; Программа большинства задач с двумерным массивом строиться на основе вложенных циклов. Обычно внешний цикл работает по строкам матрицы, т.е. с его помощью выбирается требуемая строка матрицы, а внутренний цикл по столбцам матрицы и для задания элемента массива могут быть использованы операторы присваивания и операторы ввода данных. Способы задания матриц такие же как и одномерных массивов. задание с клавиатуры; с помощью генератора случайных чисел; с помощью формулы. считывание из файла.
Найти сумму элементов матрицы 4x4. Program pr12; Type mas = array [1..4,1..4] of integer; Var i, j, sum: integer; a: mas; begin Sum:=0; For i:=1 to 4 do begin For j:=1 to 4 do begin A[i,j]:= random(101)-50; Sum:=sum +a[i,j]; Write(a[i,j]:4); End; Writeln;(для перехода на след. строчку) End; Writeln(сумма=,sum); readln; End.
Спасибо за внимание С наступающим Новым годом!