Разные процедуры и функции


Разные процедуры и функции

Function Hi(X): Byte;

Возвращает старший байт X как целое значение без знака. X — выражение типа Integer или Word.

Function Lo(X): Byte;

Возвращает байт младшего разряда параметра X как целое значение без знака. X — выражение типа Integer или Word.

Function Random[(Range: Integer)];

Возвращает случайное число внутри диапазона 0 Если параметр Range не определен, возвращается случайное число в диапазоне 0 Procedure Randomize;

Инициализирует встроенный генератор случайных чисел произвольным значением (полученным из часов системы).

Function SizeOf(X): Integer;

Возвращает размер объекта X в байтах.

X является переменной или идентификатором типа.

Всегда используйте SizeOf при обращениях к GetMem и т.п.

Процедуры и функции. Понятие подпрограмм. Механизм реализации подпрограмм с помощью процедур

Тема урока: “Процедуры и функции. Понятие подпрограмм. Механизм реализации подпрограмм с помощью процедур”.

Цель: дать учащимся представление о подпрограммах и возможностях их использования. Показать на примерах механизм реализации подпрограмм с помощью процедур и функций.

Образовательная: научиться составлять простейшие подпрограммы, умение анализировать информацию, выделять главное.

Развивающая: развитие речи, умение делать выводы, выделять главное.

Воспитывающая: умение высказывать свое мнение, прислушиваться к чужому, работать коллективно, способность следовать нормам поведения.

Оборудование: компьютер, мультимедийный проектор, презентация по теме урока.

Ход урока

Приветствие, проверка присутствующих. Объяснение хода урока.

II. Актуализация и проверка знаний.

Фронтальный опрос по вопросам:

  • Что такое программа?
  • Какова структура программы?
  • С чего начинается основная часть программы? Как её закончить?
  • Обязателен ли заголовок программы?
  • Какие разделы описаний вы знаете?
  • С чего начинается раздел констант?
  • Как описать переменные?
  • III. Теоретическая часть. Лекция.

    Язык программирования Pascal позволяет разделять программу на отдельные части, которые называются подпрограммами. Термин подпрограмма говорит о том, что она подобна и подчинена основной программе.

    Подпрограмма — это повторяющаяся группа операторов, оформленная в виде самостоятельной программной единицы. Она записывается однократно, а в соответствующих местах программы обеспечивается лишь обращение к ней по имени

    Подпрограммы решают три важные задачи, значительно облегчающие программирование:

    1. избавляют от необходимости многократно повторять в тексте программы аналогичные фрагменты, т.е. сократить объём программы;
    2. улучшат структуру программы, облегчая понимание при разборе;
    3. уменьшают вероятность появления ошибок, повышают устойчивость к ошибкам программирования и непредвиденным последствиям при модификации.


    Подпрограммы имеют структуру, аналогичную главной программе. Они содержат заголовок со специальным словом — признаком подпрограммы, имя и, при необходимости, списки передаваемых на обработку и получаемых из подпрограммы данных. Затем могут располагаться все имеющиеся в главной программе разделы описаний: меток, констант, типов и переменных. В этих разделах описываются данные, используемые только внутри подпрограммы и являющиеся промежуточными при её выполнении. Такие данные называются локальными. В подпрограмме могут участвовать переменные, описанные в главной программе. Эти данные называются глобальными, их значения и подпрограмма, и главная программа берут из общей памяти.

    Подпрограммы могут быть стандартными, определёнными системой Pascal, и собственными, т.е. созданные отдельным пользователем.

    Подпрограммы вызываются из определённого места программы, выполняют некоторые действия, после чего возвращают управление в место вызова.

    Подпрограммы делятся на две категории: процедуры и функции. Процедура — подпрограмма, имеющая любое количество входных и выходных данных.

    Любая процедура начинается с заголовка, который является её обязательной частью. Он состоит из служебного слова Procedure, за которым следует имя процедуры, а в круглых скобках — список формальных параметров. После заголовка могут идти те же разделы, что и в программе.

    Procedure [(формальные параметры)]

    Результат выполнения процедуры — это одно или несколько значений. Оно передаётся в основную программу как значение её параметра. При вызове процедуры её формальные параметры заменяются фактическими в порядке их следования.

    Процедура может быть описана без параметров и с параметрами. Параметры -это данные из заголовка процедуры, как передаваемые её на обработку, так и получаемые в виде результатов.

    СЛАЙД 1. ПРОЦЕДУРЫ БЕЗ ПАРАМЕТРОВ

    Описание процедуры без параметров имеет вид:

    Процедура без параметров может реализовывать любой алгоритм. Все переменные, над которыми производят действия операторы процедуры, определяются в вызывающей программе, им присваиваются необходимые для выполнения процедуры значения.

    Для удобства передачи данных в процедуру и получения из неё результата используются формальные и фактические параметры.

    Формальные — условные обозначения в описании процедуры — описываются в её заголовке. Фактические — с которыми требуется выполнить процедуру — перечисляются при вызове процедуры. Формальные и фактические параметры должны соответствовать по количеству, типу и порядку следования. Формальные параметры описываются только в заголовке процедуры и больше нигде. Их описание похоже на описание данных в разделе переменных и может также содержать слово var.

    СЛАЙД 2. ПРОЦЕДУРЫ С ПАРАМЕТРАМИ

    Процедура NOD c параметрами может иметь заголовок:

    procedure NOD (a,b: integer; var k: integer);

    Вызов этой процедуры: NOD (x,y,m);

    Переменные в заголовке процедуры — формальные параметры, заменяемые при выполнении процедуры на конкретные значения переменных Х и У. В заголовке процедуры NOD описаны формальные параметры: a и b — входные данные , для которых находится наибольший общий делитель; k — результат работы процедуры. При вызове процедуры переменная a примет значение х, а переменная b — значение y. Результат работы процедуры при вызове попадёт в ячейку с именем m, которой соответствует формальный параметр k.

    IV. Практическая часть.

    А теперь применим полученные теоретические знания на практике. Решим задачу: Составить процедуру вычисления наименьшего общего кратного двух натуральных чисел. (с использованием процедуры с параметром, процедуры без параметра, функции.)

    Учащиеся решают задачу в группах (в среде редактора Pascal ) :

    — 1 группа — решение задачи с использованием процедуры с параметром;

    — 2 группа — решение задачи с использованием процедуры без параметра;

    Учитель контролирует работу групп. После того, как все группы справились с задачей, учитель демонстрирует слайды с правильным решением.

    Процедура вычисления наименьшего общего кратного

    двух натуральных чисел с использованием процедуры с параметром.

    Процедура вычисления наименьшего общего кратного двух натуральных чисел с использованием процедуры без параметра

    — выучить материалы лекции.

    — Задача: Используя процедуру, упорядочить значения трёх переменных a, b и c в порядке их убывания.

    Учащиеся делятся впечатлениями от урока, рассказывают, что им понравилось, а что можно было бы сделать по другому.

    Разные процедуры и функции

    Процедуры и функции

    Введение подпрограмм было очень важным шагом на пути развития программирования, поскольку позволяло создавать большие программы по частям.
    Подпрограммой называется именованная логически законченная группа операторов языка, которую можно вызвать для выполнения по имени любое количество раз из различных мест программы.
    Программу, состоящую только из большого числа инструкций (операторов) называют монолитной; программу, состоящую из процедур и функций, называют модульной. Часто модули такой программы сами состоят из модулей более низкого уровня, т.е. модульная программа имеет иерархическую структуру. Модульные программы проще для создания, легче для понимания и удобнее для использования, чем монолитные.
    В Паскале существуют два типа подпрограмм — процедуры и функции.

    Любая процедура начинается с заголовка. Он состоит из зарезервированного слова Procedure, за которым следует идентификатор (имя) процедуры, а в круглых скобках — список формальных параметров с указанием типа каждого параметра. В отличие от основной программы процедура завершается не точкой, а точкой с запятой.


    Procedure Sort(R: integer; F: real);
    Procedure Sum;

    Имя процедуры уникально в пределах программы. Тело процедуры по структуре аналогично программе.

    Пример.
    Процедура ввода N целых чисел. Пусть в основной программе определен тип:

    Type Mas=array[1..100] of integer;

    Процедура может иметь вид:

    Procedure Nget(Var M:Mas;N:integer);
    Var
    I: integer; < параметр цикла >
    Begin
    Writeln(‘Введите ‘, N:4, ‘ целых чисел ‘);
    For I:= 1 to N do Read(M[i]);
    End;

    Для вызова процедуры в основной программе или другой подпрограмме следует записать оператор, состоящий из имени процедуры и списка фактических параметров, которые должны совпадать по количеству, типу и порядке следования с формальными параметрами процедуры.
    Например, Nget(M,K); означает, что вызывается процедура Nget для ввода K целых чисел в массив М .Параметр К — типа Integer, а М — массив типа Mas.

    Формальные и фактические параметры

    Формальные параметры подпрограммы указывают, с какими параметрами следует обращаться к этой подпрограмме ( количество параметров, их последовательность, типы).
    При обращении к подпрограмме формальные параметры заменяются на эквивалентные фактические параметры вызывающей программы или подпрограммы. Типы соответствующих фактических и формальных параметров должны быть идентичны.
    Различают два вида формальных параметров:

    • параметры — значения (эти параметры в основной программе подпрограммой не меняются);
    • параметры — переменные (эти параметры подпрограмма может изменить в основной программе).

    Параметры — значения передаются основной программой в подпрограмму в виде копии своего значения и, следовательно, собственный параметр программы подпрограммой измениться не может.
    Параметр — значение указывается в заголовке подпрограммы своим именем и через двоеточие -типом. Если параметров — значений одного типа несколько, их можно указать через запятую, а затем уже указать общий тип. Отдельные группы параметров отделяются друг от друга точкой с запятой.

    Procedure Vvod(A, B, C : real; N : integer);
    Function Mmax(X, Y : real) : real;

    Тип параметров в секции формальных параметров должен быть указан в виде определенного ранее идентификатора типа. Так, запись

    Procedure HHL(I: array[1..40] of real);

    является ошибочной. Тип переменной следует определить ранее в разделе описания типов блока:

    Тype Mas siv = array[1..15] of real;
    Procedure HHL(I: Massiv);

    В качестве фактического параметра на месте параметра-значения при вызове подпрограммы может выступать любое выражение, совместимое с ним по типу, например:

    Параметры — переменные передаются основной программой в подпрограмму своими адресами. Следовательно, подпрограмма имеет доступ к этим параметрам и может их изменять.
    Параметр — переменная указывается в заголовке подпрограммы аналогично параметру — значению, но только перед именем параметра записывается зарезервированное слово VAR. Ключевое слово VAR свидетельствует о том, что при вызове процедуры надо использовать имя переменной, а не выражение или константу. Действие слова VAR распространяется до ближайшей точки с запятой.
    Пример.

    Procedure MAXMIN(VAR MAX, MIN: real; A: Massiv; N: Word);

    Здесь MAX, MIN — параметры — переменные;
    A, N — параметры — значения.

    Тип параметров — переменных может быть любым и также при их описании в заголовке нельзя вводить новый тип. Допускается использование параметра-переменной без указания типа:

    Procedure FUNC(VAR F);

    Здесь F — параметр — переменная без типа ( вместо него можно использовать, например, любые переменные простого типа, типа массив, типа запись и т.д.).
    Итак, если процедура должна возвратить в программу определенные результаты, они должны быть описаны как параметры-переменные, т.е. в сочетании со словом VAR , в противном случае результаты не будут возвращены. Например, после выполнения программы, обменивающей значения двух переменных,

    Program PRIMER;
    Var
    X, Y: integer;
    Procedure OBMEN(var M, N : integer);
    Var
    T: integer;
    Begin
    T:=M;
    M:=N;
    N:=T
    End;

    При выполнении программы будет напечатано

    При отсутствии слова VAR в заголовке процедуры X и Y после вызова OBMEN(X,Y) не изменились бы и программа напечатала бы две одинаковые строки

    Функция аналогична процедуре, но имеется два основных отличия. Первое отличие функции в ее заголовке. Она состоит из слова Function, за которым следует имя функции, далее в круглых скобках необязательный список формальных параметров и тип возвращаемого функцией значения.
    Второе отличие заключается в том, что в разделе операторов имени функции хотя бы раз должно быть присвоено значение.

    Program ProcsAndFuncts;
    Var
    N: integer;

    Procedure SayHello;
    Begin
    Writeln (‘Привет!’);
    End;

    Function Seventeen : integer;
    Begin
    Seventeen := 17;
    End;

    Для вызова функции в основной программе следует в выражении, в котором необходимо использовать значение функции, указать имя функции со списком фактических параметров, которые должны совпадать по количеству и типам с формальными параметрами функции, например: Funk:=Sqr(R)/Faktorial(M);
    В этом операторе:

    Sqr(R) — вызов стандартной функции возведения в квадрат с фактическим параметром R;
    Faktorial(M) — вызов функции, вычисляющей факториал с фактическим параметром M.

    Локальные и глобальные переменные

    Переменные, которые описаны в подпрограмме, принадлежат подпрограмме, называют локальными. Те же переменные, которые объявлены в главной программе, называют глобальными. Рассмотрим пример, позволяющий внести ясность в вопрос ,связанный с использованием локальных и глобальных переменных. Составим программу вычисления площади полной поверхности треугольной пирамиды, если заданы длины шести ее ребер. Вычисление площади треугольника по формуле Герона опишем в виде функции:

    Var
    A, B, C, AB, BC, CA, S : real;


    Begin < Основная программа >
    Writeln(‘Введите длины ребер пирамиды’);
    Readln(A, B, C, AB, BC, CA);
    Writeln(‘Площадь полной поверхности’);
    Writeln(‘треугольной пирамиды с ребрами:’);
    Writeln(‘ ‘, A, B, C, AB, BC, CA);
    S:= STR(A,B,C)+STR(A,AB,CA)+ STR(B,AB,BC)+STR(C,CA,BC);
    <Три последних слагаемых - площадь боковых граней>
    Writeln(‘ равна ‘,S);
    End.

    В данном примере три имени — A, B, C — употреблены и в главной программе, и внутри функции. Все имена формальных параметров, описанные внутри функции (процедуры), вне этой функции (процедуры) недоступны, их как бы не видно. Внутри процедуры доступны наряду с локальными все глобальные имена, если только они не совпадают с локальными. В последнем случае локальное имя как бы заслоняет глобальное, для процедуры оно ближе. Если в описании функции STR по неосторожности вставить инструкции присваивания переменным AB, BC, CA, значения глобальных переменных изменятся; на глобальные переменные A, B, C изнутри функции повлиять нельзя.

    Методы и средства конструирования программ

    При разработке больших программ зачастую работа распределяется между несколькими программистами, каждый из которых создает и отлаживает логически завершенную часть программы и записывает ее в отдельный файл. После окончания отладки все составные части объединяются в одну программу. Такой способ написания программ реализуется в языке Паскаль с помощью директивы компилятора $I, которая включает любые расположенные в отдельных файлах фрагменты.

    Тело включаемых файлов не должно содержать директивы включения других файлов.

    Процедуры и функции

    Работа с файлами.

    Как уже говорилось выше в пособии рассматривается работа только с текстовыми файлами. Для организации текстового файла прежде всего необходимо в разделе описаний объявить соответствующую файловую переменную оператором:

    VAR имя файловой переменной: TEXT;

    Далее в программе надо осуществить связывание файловой переменной с именем файла на диске процедурой ASSIGN:

    ASSIGN (имя файловой переменной, имя файла на диске);

    Далее файл необходимо открыть одной из следующих процедур:

    REWRITE(имя файловой переменной);

    RESET(имя файловой переменной);

    APPEND(имя файловой переменной);

    Процедура REWRITE открывает файл для чтения из него данных, RESET – для записи данных в файл, APPEND для дозаписи данных в файл.

    Для обработки текстовых файлов используются процедура READ, READLN и WRITE, WRITELN, обеспечивающие соответственно чтение и запись величин в текстовый файл. Общий формат этих процедур при работе с текстовым файлом:

    READ(имя файловой переменной; переменная1, переменная2,…переменнаяN);

    WRITE(имя файловой переменной; переменная1, переменная2,…переменнаяN);

    Процедура READ обеспечивает ввод данных общим потоком из одной строки, а READLN приводит к обязательному переходу к следующей строке текстового файла. Все вышесказанное в равной мере относится и к операциям записи с помощью процедур WRITE и WRITELN.

    После работы с файлом его необходимо закрыть командой:

    CLOSE(имя файловой переменной);

    В Паскале для обработки признака конце файла используется логическая функция EOF, аргументом которой является имя файловой переменной и которая принимает значение истина тогда, когда достигнут конец файла.

    Созданный файл с данными можно открыть в какой-либо программе, например в Excel, и работать там с ним.

    Пример 14. Программа расчета функции y=sin(2x)/x и вывода значений х и y в файл REZULT.DAT на диске D: и на экран монитора.

    FOR I:=1 TO 20 DO BEGIN

    Подпрограммой называется именованная логически законченная группа операторов языка программирования, которую можно вызвать по имени для выполнения любое количество раз из различных мест программы. В Паскале для организации подпрограмм используются процедуры и функции.

    Процедура – это независимая поименованная часть программы, предназначенная для выполнения определенных действий. Она состоит из заголовка и тела. Процедуру вызывается оператором вызова процедуры (см. Простые операторы), после выполнения процедуры, программы продолжает работу с оператора, следующего непосредственно за оператором вызова процедуры. Имя процедуры не может входит в выражения в качестве операнда.

    Функцияаналогична процедуре, но она передает в точку вызова скалярное значение (результат своей работы) и имя функции может входит в выражение как операнд.

    Процедуры и функции могут быть встроенными (или стандартными), т.е. являющимися частью языка, и пользовательскими, т.е. организованные самим программистом.

    Наиболее часто используемые арифметические встроенные функции:

    ABS(X) – вычисление абсолютной величины Х;

    ARСTAN(X) – вычисление угла, тангенс которого равен Х, значение угла представляется в радианах;

    COS(X) – вычисление косинуса Х, параметр задает значение угла в радианах;

    SIN(X) — вычисление косинуса Х, параметр задает значение угла в радианах;


    EXP(X) – вычисления значения е Х ;

    INT(X) – вычисление целой части Х;

    LN(X) – вычисление натурального логарифма Х;

    SQR(X) – возведение значения Х в квадрат;

    SQRT(X) – извлечение квадратного корня из Х;

    PI – функция возвращает значение числа p;

    RANDOM(N) – генерирует значение случайного числа в диапазоне от 0 до N, тип результата целочисленный;

    RANDOM – генерирует значение случайного числа в диапазоне от 0 до 0,99, тип результата вещественный.

    При необходимости вычисления других тригонометрических функций пользуются формулами:

    В Паскале нет функции возведения в степень, поэтому для вычисления Z X необходимо записать EXP(X*LN(Z)), причем число Z должно быть больше нуля.

    Встроенные процедуры ввода-вывода (WRITE, WRITELN, READ, READLN) были рассмотрены ранее.

    Функция, определенная пользователем, состоит из заголовка и тела функции и имеет формат:

    FUNCTION имя функции[(формальные параметры)]:тип результата;

    Тип результата – тип возвращаемого функцией значения. Тело функции представляет собой локальный блок, по структуре аналогичный программе. В разделе операторов должен находится по крайней мере один оператор, присваивающий идентификатору функции значение.

    Обращение к функции осуществляется по имени с указанием списка аргументов. Каждый аргумент должен соответствовать формальным параметрам, указанным в заголовке функции, и иметь тот же тип. Формат обращения к функции:

    имя функции [(фактические параметры)];

    Процедуры пользователя.Описание такой процедуры включает заголовок (имя) и тело процедуры. Заголовок состоит из зарезервированного слова PROCEDURE, имени процедуры и необязательного заключенного в круглые скобки списка формальных параметров с указанием типа каждого параметра. Имя процедуры – идентификатор, уникальный в пределах программы, тело процедуры – локальный блок по структуре аналогичный программе на Паскале. Формат записи процедуры:

    PROCEDURE имя процедуры[(формальные параметры)];

    Для обращения к процедуре используется оператор вызова процедуры:

    имя процедуры[(фактические параметры)];

    Список фактических параметров заключается в круглые скобки, параметры отделяются друг от друга запятыми. Список параметров может отсутствовать, если процедуре не передается никаких значений. Между фактическими параметрами в операторе вызова процедуры и формальными параметрами в заголовке описания процедуры устанавливается взаимно-однозначное соответствие: количество и тип формальных параметров равны количеству и типу фактических параметров.

    Если процедура возвращает в программу какие-либо значения, то соответствующие переменные должны быть описаны в разделе описаний переменных. [10, 11]

    Пример 15. Программы нахождения факториала:

    Определение процедур и функций в Pascal

    Использование подпрограмм является главной особенностью структурного программирования. По сути, подпрограмма представляет собой составной оператор, объединяющий ряд простых операторов. При этом этот «составной оператор» оснащается именем и внешне оформляется как программа. В подпрограмме бывают свои константы, переменные и другие атрибуты полноценной программы. Локальные переменные никак не связаны с одноименными глобальными переменными (относящимися к основной программе).

    Зачем нужны подпрограммы? Их использование удобно, когда в программе несколько раз решается одна и та же подзадача, но для разных наборов данных. Кроме того, использование подпрограмм естественно для человека, которому проще воспринимать логически связанные объекты, чем множество разнородных данных.

    Программный код подпрограммы описывается единожды перед телом основной программы, затем из основной программы можно им пользоваться многократно. Обращение к этому программному коду из тела основной программы осуществляется по его имени (имени подпрограммы).

    В большинстве языков структурного программирования подпрограммы существуют только в виде функций. В Паскале же их два типа: процедуры и функции. Их заголовки выглядят соответственно так:

    procedure имя (параметры);

    function имя (параметры): тип результата;

    Между функциями и процедурами есть существенное отличие. Значение, полученное в результате выполнения кода функции, жестко соотносится с ее именем путем присвоения этому имени конкретного значения. Тип, который может принять вычисляемое значение, указывается в заголовке функции (тип результата). И в теле основной программы функция вызывается только в том случае, если ее имя фигурирует в каком-либо выражении. В то время как процедура вызывается отдельно.

    Параметры не являются обязательным компонентом, однако их использование повышает гибкость процедуры или функции, т.к. они перестают быть привязанными к определенным данным.

    Когда процедура или функция вызываются, то в скобках вместо формальных параметров, указываются фактические параметры (аргументы). Это могут быть либо конкретные значения, либо переменные из основной программы.

    Тело подпрограммы, как и любого составного оператора на языке Паскаль, ограничивается скобками begin и end.

    Процедуры и функции

    Использование процедур и функций в программах


    Чтобы программы было проще понимать и записывать, следует делать их более компактными. Для этого в языке программирования Turbo Pascal имеются средства, позволяющие разбивать программу на логически связанные блоки (подпрограммы), каждый из которых решает некоторую подзадачу и могут выполняться в программе неоднократно. Это процедуры и функции.

    Процедуры и функции — это законченные программные единицы, имеющие собственное имя, которые решают некоторую подзадачу.

    Процедуры и функции помещаются в раздел описаний программы сразу же после описания переменных и перед словом Begin, указывающим начало ее основной части.

    Структура описания процедур и функций до некоторой степени похожа на структуру программы: у них также имеются заголовок, раздел описаний и исполняемая часть. Более подробно структура процедуры рассмотрена в соответствующих разделах. Раздел описаний содержит те же подразделы, что и раздел описаний программы: описания констант, типов, меток, переменных. Исполняемая часть содержит собственно операторы процедуры или функции.

    Если две подпрограммы, описанные на одном уровне, содержат взаимные вызовы друг друга, то используется механизм предварительных описаний.

    Предварительное описание содержит заголовок подпрограммы, а вместо тела записывается служебное слово Forward. В этом случае заголовок полного описания может быть записан без списка параметров и (для функций) без типа результата.

    Procedure A(X,Y: Real): Forward;

    Procedure B(A,B: Integer): Forward;

    Процедуры и функции различаются назначением и способом использования.

    На вход подпрограммы в качестве исходных данных поступает совокупность параметров — аргументов, а на выходе формируются параметры — результаты. Причем процедура позволяет получить один или несколько результатов, а функция — только один.

    Для обмена информацией между процедурами и функциями и другими блоками программы существует механизм входных и выходных параметров. Входными параметрами называют величины, передающиеся из вызывающего блока в подпрограмму (исходные данные для подпрограммы), а выходными — передающиеся из подпрограммы в вызывающий блок (результаты работы подпрограммы).

    Одна и та же подпрограмма может вызываться неоднократно, выполняя одни и те же действия с разными наборами входных данных. Параметры, использующиеся при записи текста подпрограммы в разделе описаний, называют формальными, а те, что используются при ее вызове — фактическими.

    Формальные параметры в заголовке процедур и функций записываются в виде и отделяются друг от друга точкой с запятой:

    var имя параметра: имя типа

    Ключевое слово var может отсутствовать. Если параметры однотипны, то их имена можно перечислять через запятую, указывая общее для них имя типа. При описании параметров можно использовать только стандартные имена типов, либо имена типов, определенные с помощью команды type. Список формальных параметров может отсутствовать.

    Допустимы способы задания формальных параметров:

    1. Параметры-значения — параметры, перед которыми отсутствует служебное слово Var и за которыми следует идентификатор типа.

    Это наиболее распространенный и простой способ. Параметр — обычная локальная переменная. Любые действия внутри подпрограммы никак не отражаются на значениях переменной вне подпрограммы.

    2. Параметры-переменные — параметр, перед которым ставиться слово Var и далее тип.

    Передаются по ссылке. Способ используется, когда необходимо передать некоторое значение в точку вызова подпрограммы. В этом случае формальные параметры считаются синонимами соответствующих фактических параметров.

    При этом фактические параметры должны быть переменными (не выражениями) того же типа, что и формальные параметры.

    Переменные файловых типов могут передаваться в подпрограмму только как параметры — переменные.

    3. Безтиповые параметры — это параметры со словом Var и не имеющие типа.

    Фактический параметр, соответствующий формальному нетипизированному, должен представлять собой переменную любого типа (но не выражение).

    Единственным способом использования таких параметров является «наделение» их определённым типом.

    К процедурам и функциям обращаются (их вызывают) из главной программы по имени с указанием фактических параметров.

    Правила вызова процедур и функций:

    • o количество фактических параметров должно совпадать с количеством формальных;
    • o соответствующие фактические и формальные параметры должны совпадать по порядку следования и по типу.

    Имена формальных и фактических параметров могут совпадать. Это не приводит к проблемам, так как соответствующие им переменные все равно будут различны из-за того, что хранятся в разных областях памяти. Кроме того, все формальные параметры являются временными переменными — они создаются в момент вызова подпрограммы и уничтожаются в момент выхода из нее.

    Чем отличаются понятия функции, процедуры и метода в программировании?

    Функция — подпрограмма, выполняющая какие-либо операции и возвращающая значение.
    Процедура — подпрограмма, которая только выполняет операции, без возврата значения.
    Метод — это функция или процедура, которая принадлежит классу или экземпляру класса.

    как бы да, но. только на самом начальном этапе, что бы угомонить хаос в голове новичка ))

    в дальнейшем, все интереснее все эти понятия контекстно зависимые, контекстом является парадигма программирования и/или конкретный язык

    1 — в контексте парадигм, из данных понятий уникально одно Метод, как уже было сказано D3lphi, это нечто принадлежащее классу. класс, в свою очередь, это фундаментальное понятие ООП основанного на классах (шарм ситуации в том, что ООП бывает тоже разное ;))


    в этом случае чаще принято уточнять что метод — это один из видов челнов класса (бывают еще поля, свойства, интерфейсы но это уже контекст конкретного языка) .. и как верно заметил Griboks — он реализуется функцией или процедурой

    но .. есть много языков, где понятия метод нет вообще

    а еще есть функциональное программирование .. эта парадигма частично присутствует во многих современных языках, однако есть языки, где любой код только функция

    2 — из контекста языков:

    понятие процедура в явном виде, чаще всего употребляют преподаватели, которые сами учились на языках типа Fortran, Pascal или родственных, и либо не имели другого опыта вообще, либо иной опыт был на много скромнее

    сейчас доминируют языки, основывающиеся на Си синтаксисе, даже java и js в данном вопросе станут родственниками классического Си

    а в нем нет понятия процедуры, только функции.. а на случай, когда функция не обязана возвращать какую либо величину, просто указывается тип возвращаемого значения void

    смешение всего этого на примере C# — в этом языке, все есть объект. а любой исполняемый код это метод, и методы реализуются только функциями (в тч void функциями)

    Разные процедуры и функции

    В языке Паскаль, как и в большинстве языков программирования, предусмотрены средства, позволяющие оформлять вспомогательный алгоритм как подпрограмму. Это бывает необходимо тогда, когда какой-либо подалгоритм неоднократно повторяется в программе или имеется возможность использовать некоторые фрагменты уже разработанных ранее алгоритмов. Кроме того, подпрограммы применяются для разбиения крупных программ на отдельные смысловые части в соответствии с модульным принципом в программировании.

    Для использования подалгоритма в качестве подпрограммы ему необходимо присвоить имя и описать алгоритм по правилам языка Паскаль. В дальнейшем, при необходимости вызвать его в программе, делают вызов подпрограммы упоминанием в нужном месте имени соответствующего подалгоритма со списком входных и выходных данных. Такое упоминание приводит к выполнению входящих в подпрограмму операторов, работающих с указанными данными. После выполнения подпрограммы работа продолжается с той команды, которая непосредственно следует за вызовом подпрограммы.

    В языке Паскаль имеется два вида подпрограмм — процедуры и функции.

    Процедуры и функции помещаются в раздел описаний программы. Для обмена информацией между процедурами и функциями и другими блоками программы существует механизм входных и выходных параметров. Входными параметрами называют величины, передающиеся из вызывающего блока в подпрограмму (исходные данные для подпрограммы), а выходными — передающиеся из подрограммы в вызывающий блок (результаты работы подпрограммы).

    Одна и та же подпрограмма может вызываться неоднократно, выполняя одни и те же действия с разными наборами входных данных. Параметры, использующиеся при записи текста подпрограммы в разделе описаний, называют формальными, а те, что используются при ее вызове — фактическими.

    Описание и вызов процедур и функций

    Структура описания процедур и функций до некоторой степени похожа на структуру Паскаль-программы: у них также имеются заголовок, раздел описаний и исполняемая часть. Раздел описаний содержит те же подразделы, что и раздел описаний программы: описания констант, типов, меток, процедур, функций, перменных. Исполняемая часть содержит собственно операторы процедур.

    Формат описания процедуры имеет вид:

    Формат описания функции:

    Формальные параметры в заголовке процедур и функций записываются в виде:

    и отделяются друг от друга точкой с запятой. Ключевое слово var может отсутствовать (об этом далее). Если параметры однотипны, то их имена можно перечислять через запятую, указывая общее для них имя типа. При описании параметров можно использовать только стандартные имена типов, либо имена типов, определенные с помощью команды type.Список формальных параметров может отсутствовать.

    Вызов процедуры производится оператором, имеющим следующий формат:

    Список фактических параметров — это их перечисление через запятую. При вызове фактические параметры как бы подставляются вместо формальных, стоящих на тех же местах в заголовке. Таким образом происходит передача входных параметров, затем выполняются операторы исполняемой части процедуры, после чего происходит возврат в вызывающий блок. Передача выходных параметров происходит непосредственно во время работы исполняемой части.

    Вызов функции в Турбо Паскаль может производиться аналогичным способом, кроме того имеется возможность осуществить вызов внутри какого-либо выражения. В частности имя функции может стоять в правой части оператора присваивания, в разделе условий оператора if и т.д.

    Для передачи в вызывающий блок выходного значения функции в исполняемой части функции перед возвратом в вызывающий блок необходимо поместить следующую команду:

    При вызове процедур и функций необходимо соблюдать следущие правила:

    • количество фактических параметров должно совпадать с количеством формальных;
    • соответствующие фактические и формальные параметры должны совпадать по порядку следования и по типу.

    Заметим, что имена формальных и фактических параметров могут совпадать. Это не приводит к проблемам, так как соответствующие им переменные все равно будут различны из-за того, что хранятся в разных областях памяти. Кроме того, все формальные параметры являются временными переменными — они создаются в момент вызова подпрограммы и уничтожаются в момент выхода из нее.

    Рассмотрим использование процедуры на примере программы поиска максимума из двух целых чисел.

    Аналогичную задачу, но уже с использованием функций, можно решить так:

    Волгоградский государственный педагогический университет
    Кафедра алгебры, геометрии и информатики

    Разные процедуры и функции

    Процедуры и функции

    Введение подпрограмм было очень важным шагом на пути развития программирования, поскольку позволяло создавать большие программы по частям.
    Подпрограммой называется именованная логически законченная группа операторов языка, которую можно вызвать для выполнения по имени любое количество раз из различных мест программы.
    Программу, состоящую только из большого числа инструкций (операторов) называют монолитной; программу, состоящую из процедур и функций, называют модульной. Часто модули такой программы сами состоят из модулей более низкого уровня, т.е. модульная программа имеет иерархическую структуру. Модульные программы проще для создания, легче для понимания и удобнее для использования, чем монолитные.
    В Паскале существуют два типа подпрограмм — процедуры и функции.

    Любая процедура начинается с заголовка. Он состоит из зарезервированного слова Procedure, за которым следует идентификатор (имя) процедуры, а в круглых скобках — список формальных параметров с указанием типа каждого параметра. В отличие от основной программы процедура завершается не точкой, а точкой с запятой.

    Procedure Sort(R: integer; F: real);
    Procedure Sum;


    Имя процедуры уникально в пределах программы. Тело процедуры по структуре аналогично программе.

    Пример.
    Процедура ввода N целых чисел. Пусть в основной программе определен тип:

    Type Mas=array[1..100] of integer;

    Процедура может иметь вид:

    Procedure Nget(Var M:Mas;N:integer);
    Var
    I: integer; < параметр цикла >
    Begin
    Writeln(‘Введите ‘, N:4, ‘ целых чисел ‘);
    For I:= 1 to N do Read(M[i]);
    End;

    Для вызова процедуры в основной программе или другой подпрограмме следует записать оператор, состоящий из имени процедуры и списка фактических параметров, которые должны совпадать по количеству, типу и порядке следования с формальными параметрами процедуры.
    Например, Nget(M,K); означает, что вызывается процедура Nget для ввода K целых чисел в массив М .Параметр К — типа Integer, а М — массив типа Mas.

    Формальные и фактические параметры

    Формальные параметры подпрограммы указывают, с какими параметрами следует обращаться к этой подпрограмме ( количество параметров, их последовательность, типы).
    При обращении к подпрограмме формальные параметры заменяются на эквивалентные фактические параметры вызывающей программы или подпрограммы. Типы соответствующих фактических и формальных параметров должны быть идентичны.
    Различают два вида формальных параметров:

    • параметры — значения (эти параметры в основной программе подпрограммой не меняются);
    • параметры — переменные (эти параметры подпрограмма может изменить в основной программе).

    Параметры — значения передаются основной программой в подпрограмму в виде копии своего значения и, следовательно, собственный параметр программы подпрограммой измениться не может.
    Параметр — значение указывается в заголовке подпрограммы своим именем и через двоеточие -типом. Если параметров — значений одного типа несколько, их можно указать через запятую, а затем уже указать общий тип. Отдельные группы параметров отделяются друг от друга точкой с запятой.

    Procedure Vvod(A, B, C : real; N : integer);
    Function Mmax(X, Y : real) : real;

    Тип параметров в секции формальных параметров должен быть указан в виде определенного ранее идентификатора типа. Так, запись

    Procedure HHL(I: array[1..40] of real);

    является ошибочной. Тип переменной следует определить ранее в разделе описания типов блока:

    Тype Mas siv = array[1..15] of real;
    Procedure HHL(I: Massiv);

    В качестве фактического параметра на месте параметра-значения при вызове подпрограммы может выступать любое выражение, совместимое с ним по типу, например:

    Параметры — переменные передаются основной программой в подпрограмму своими адресами. Следовательно, подпрограмма имеет доступ к этим параметрам и может их изменять.
    Параметр — переменная указывается в заголовке подпрограммы аналогично параметру — значению, но только перед именем параметра записывается зарезервированное слово VAR. Ключевое слово VAR свидетельствует о том, что при вызове процедуры надо использовать имя переменной, а не выражение или константу. Действие слова VAR распространяется до ближайшей точки с запятой.
    Пример.

    Procedure MAXMIN(VAR MAX, MIN: real; A: Massiv; N: Word);

    Здесь MAX, MIN — параметры — переменные;
    A, N — параметры — значения.

    Тип параметров — переменных может быть любым и также при их описании в заголовке нельзя вводить новый тип. Допускается использование параметра-переменной без указания типа:

    Procedure FUNC(VAR F);

    Здесь F — параметр — переменная без типа ( вместо него можно использовать, например, любые переменные простого типа, типа массив, типа запись и т.д.).
    Итак, если процедура должна возвратить в программу определенные результаты, они должны быть описаны как параметры-переменные, т.е. в сочетании со словом VAR , в противном случае результаты не будут возвращены. Например, после выполнения программы, обменивающей значения двух переменных,

    Program PRIMER;
    Var
    X, Y: integer;
    Procedure OBMEN(var M, N : integer);
    Var
    T: integer;
    Begin
    T:=M;
    M:=N;
    N:=T
    End;

    При выполнении программы будет напечатано

    При отсутствии слова VAR в заголовке процедуры X и Y после вызова OBMEN(X,Y) не изменились бы и программа напечатала бы две одинаковые строки

    Функция аналогична процедуре, но имеется два основных отличия. Первое отличие функции в ее заголовке. Она состоит из слова Function, за которым следует имя функции, далее в круглых скобках необязательный список формальных параметров и тип возвращаемого функцией значения.
    Второе отличие заключается в том, что в разделе операторов имени функции хотя бы раз должно быть присвоено значение.

    Program ProcsAndFuncts;
    Var
    N: integer;

    Procedure SayHello;
    Begin
    Writeln (‘Привет!’);
    End;

    Function Seventeen : integer;
    Begin
    Seventeen := 17;
    End;

    Для вызова функции в основной программе следует в выражении, в котором необходимо использовать значение функции, указать имя функции со списком фактических параметров, которые должны совпадать по количеству и типам с формальными параметрами функции, например: Funk:=Sqr(R)/Faktorial(M);
    В этом операторе:

    Sqr(R) — вызов стандартной функции возведения в квадрат с фактическим параметром R;
    Faktorial(M) — вызов функции, вычисляющей факториал с фактическим параметром M.

    Локальные и глобальные переменные

    Переменные, которые описаны в подпрограмме, принадлежат подпрограмме, называют локальными. Те же переменные, которые объявлены в главной программе, называют глобальными. Рассмотрим пример, позволяющий внести ясность в вопрос ,связанный с использованием локальных и глобальных переменных. Составим программу вычисления площади полной поверхности треугольной пирамиды, если заданы длины шести ее ребер. Вычисление площади треугольника по формуле Герона опишем в виде функции:

    Var
    A, B, C, AB, BC, CA, S : real;

    Begin < Основная программа >
    Writeln(‘Введите длины ребер пирамиды’);
    Readln(A, B, C, AB, BC, CA);
    Writeln(‘Площадь полной поверхности’);
    Writeln(‘треугольной пирамиды с ребрами:’);
    Writeln(‘ ‘, A, B, C, AB, BC, CA);
    S:= STR(A,B,C)+STR(A,AB,CA)+ STR(B,AB,BC)+STR(C,CA,BC);
    <Три последних слагаемых - площадь боковых граней>
    Writeln(‘ равна ‘,S);
    End.


    В данном примере три имени — A, B, C — употреблены и в главной программе, и внутри функции. Все имена формальных параметров, описанные внутри функции (процедуры), вне этой функции (процедуры) недоступны, их как бы не видно. Внутри процедуры доступны наряду с локальными все глобальные имена, если только они не совпадают с локальными. В последнем случае локальное имя как бы заслоняет глобальное, для процедуры оно ближе. Если в описании функции STR по неосторожности вставить инструкции присваивания переменным AB, BC, CA, значения глобальных переменных изменятся; на глобальные переменные A, B, C изнутри функции повлиять нельзя.

    Методы и средства конструирования программ

    При разработке больших программ зачастую работа распределяется между несколькими программистами, каждый из которых создает и отлаживает логически завершенную часть программы и записывает ее в отдельный файл. После окончания отладки все составные части объединяются в одну программу. Такой способ написания программ реализуется в языке Паскаль с помощью директивы компилятора $I, которая включает любые расположенные в отдельных файлах фрагменты.

    Тело включаемых файлов не должно содержать директивы включения других файлов.

    Подпрограммы (процедуры и функции)

    При решении новых задач можно попытаться воспользоваться ранее написанными программами. Алгоритм, ранее разработанный и целиком используемый в составе других алгоритмов, называется вспомогательным. Применение вспомогательных алгоритмов позволяет разбить задачу на части, структурировать ее.

    Вся программа условно может быть разделена на две части: основную и вспомогательную. В основной части производится простейшая обработка информации, организуется обращение к разным вспомогательным модулям (подпрограммам).

    Вспомогательный алгоритм тоже может вызывать другие вспомогательные, длина такой цепочки вызовов теоретически не ограничена. Здесь и далее следующие пары слов используются как синонимы: алгоритм и программа, вспомогательный алгоритм и подпрограмма, команда и оператор, программа и модуль. Вспомогательными и основными алгоритмы являются не сами по себе, а по отношению друг к другу.

    При использовании вспомогательных алгоритмов необходимо учитывать способ передачи значений исходных данных для них и получения результата от них. Аргументы вспомогательного алгоритма — это переменные, в которых должны быть помещены исходные данные для решения соответствующей подзадачи. Результаты вспомогательного алгоритма — это также переменные, где содержаться результаты решения этих подзадач, а также результатом может быть конкретное действие, которое совершает компьютер под действием подпрограммы.

    Подпрограммы могут быть двух видов: подпрограмма без параметров и подпрограмма с параметрами. Обращение к подпрограмме может быть организовано из любого места основной программы или другой подпрограммы сколько угодно раз.

    При работе с подпрограммами важными являются понятия формальных и фактических параметров. Формальные параметры — это идентификаторы входных данных для подпрограммы. Если формальные параметры получают конкретные значения, то они называются фактическими. Формальные параметры могут получить конкретные значения только в той программе, где производится обращение к данному модулю-подпрограмме. Тип и порядок записи фактических параметров должны быть такими же, как и формальных параметров. В противном случае результат работы программы будет непредсказуемым. Из этого следует, что фактические параметры используются при обращении к подпрограмме из основной, а формальные параметры — только в самом модуле.

    Подпрограмма с параметрами используется для записи многократно повторяющихся действий при разных исходных данных. Подпрограммы с параметрами можно разделить на два типа: подпрограммы-функции и просто подпрограммы с параметрами (их называют процедурами).

    При составлении подпрограмм с параметрами надо соблюдать следующие правила:

    1) каждая подпрограмма имеет свое имя и список формальных параметров;

    2) процедура из основной программы вызывается командой вызова, которая по форме ничем не отличается от вызова команды исполнителя. Результат присваивается одной или нескольким переменным, которые находятся в списке формальных параметров. Но результатом могут быть, конечно, не только значения переменных, но какое либо действие, выполненное ЭВМ.

    Пример 1. Используем алгоритм нахождения наибольшего общего делителя двух натуральных чисел в качестве вспомогательного при решении задачи: составить программу вычитания дробей (a, b, c, d — натуральные числа). Результат представить в виде обыкновенной несократимой дроби.

    1) Ввести натуральные числа M, N.

    2) Если M=N, перейти к п. 5, иначе к следующему пункту.

    3) Если M>N, то M:=M-N, иначе N:=N-M.

    4) Перейти к п. 2.

    5) Передать значение M в основную программу.

    6) Конец подпрограммы.

    1) Ввести значения A, B, C, D.

    4) Если E=0, вывести значение E и перейти к п. 9, иначе перейти к следующему пункту.

    5) M:=|E|, N:=F, перейти к подпрограмме вычисления НОД.

    7) E и F нацело разделить на G.

    8) Вывести значения E и F на печать.

    Var A, B, C, D, G, E, F : Integer;

    Procedure Nod(M, N : Integer; Var K : Integer);

    If M > N Then M := M — N Else N := N — M;

    Write(‘Введите числители и знаменатели дробей:’);

    If E = 0 Then WriteLn(E)

    WriteLn(‘Ответ: ‘, E, ‘/’, F)

    Как видно из примера, объявление и тело подпрограмм находится в разделе описаний. В заголовке подпрограммы содержится список формальных параметров с указанием их типа, которые условно можно разделить на входные и выходные (перед ними стоит служебное Var). При обращении к процедуре указывается ее имя и список фактических параметров. Формальные и фактические параметры должны соответствовать по количеству и по типу.

    Вызов процедуры осуществляется следующим образом:


    По способу передачи фактических значений в подпрограмму в Turbo Pascal 7.0 выделяют параметры-переменные, параметры-значения, параметры-константы и массивы открытого типа, строки открытого типа, параметры-процедуры, параметры-функции (подробности — в литературе).

    Функция (в отличие от процедуры) всегда возвращает единственное значение.

    Покажем, как изменится подпрограмма из примера, если ее записать в виде функции.

    Function Nod(M, N : Integer) : Integer;

    If M > N Then M := M — N Else N := N — M;

    Итак, после списка параметров указывается тип значения функции, а в теле функции хотя бы один раз встречается присваивание переменной, имя которой совпадает с именем функции, соотответствующего значения.

    Вызов функции будет следующим:

    Вообще, вызов функции может присутствовать в выражении, стоящем: в правой части оператора присваивания, в процедуре вывода, в качестве фактического параметра в вызове другой подпрограммы и т.д.

    При решении задач целесообразно проанализировать условие, записать решение в крупных блоках (не являющихся операторами Pascal), детализировать каждый из блоков (записав в виде блоков, возможно, по-прежнему не операторов Pascal), и т.д., продолжать до тех пор, пока каждый из блоков не будет реализован с помощью операторов языка.

    Пример 2. Дано натуральное число n. Переставить местами первую и последнюю цифры этого числа.

    Write(‘Введите натуральное число: ‘);

    Then WriteLn(‘Невозможно переставить цифры, возникнет переполнение’)

    Можно заметить, что необходимо детализировать логическую функцию Impossible, которая диагностирует, возможна ли перестановка, и процедуру Change, которая эту перестановку (в случае, если она возможна) выполняет.

    Function Impossible(N : Integer) : Boolean;

    If Number(N) 3) Or

    (N Mod 10 = 3) And

    (N Mod 10000 Div 10 * 10 + N Div 10000 > MaxInt Mod 10000)

    Здесь необходимо детализировать функцию Number, возвращающую количество цифр в записи натурального числа (т.к. функция Impossible содержит ее вызов, то в разделе описаний функция Number должна ей предшествовать).

    Function Number(N : Integer) : Integer;

    Var Vsp : Integer;

    Vsp := Vsp + 1; N := N Div 10

    Наконец, последняя процедура.

    Procedure Change(Var N : Integer);

    Var Kol, P, S, R : Integer;

    S := N Div Round(Exp((Kol — 1) * Ln(10)))

    R := N Mod Round(Exp((Kol — 1) * Ln(10))) Div 10;

    N := P * Round(Exp((Kol — 1) * Ln(10))) + R * 10 + S

    Возможны также подпрограммы, которые вызывают сами себя. Они называются рекурсивными. Создание таких подпрограмм является красивым приемом программирования, но не всегда целесообразно из-за чрезмерного расхода памяти ЭВМ.

    Пример 3. Найти максимальную цифру в записи данного натурального числа.

    Type NaturLong = 1..(High(LongInt));

    Function Maximum(N : LongInt) : Digit;

    If N Maximum(N Div 10)

    Then Maximum := N mod 10

    Else Maximum := Maximum(N Div 10)

    Write(‘Введите натуральное число: ‘);

    При создании функции Maximum было использовано следующее соображение: если число состоит из одной цифры, то она является максимальной, иначе если последняя цифра не является максимальной, то ее следует искать среди других цифр числа. При написании рекурсивного алгоритма следует позаботиться о граничном условии, когда цепочка рекурсивных вызовов обрывается и начинается ее обратное «раскручивание». В нашем примере это условие N

    Илон Маск рекомендует:  Что такое код pdf_get_pdi_value
    Понравилась статья? Поделиться с друзьями:
    Кодинг, CSS и SQL