- •Е.А. Ледников, а.В. Емельянов Информационные технологии
- •Часть 2
- •150301 – «Машиностроение»
- •Лабораторная работа 10 «Символьные переменные. Тип данных "char"»
- •Лабораторная работа 11 «Подпрограммы»
- •Изучить теоретическую часть работы;
- •Ответить на контрольные вопросы и разобрать примеры;
- •Выполнить все задачи для самостоятельного выполнения.
- •Лабораторная работа 12 «Сложные типы данных. Записи»
- •Изучить теоретическую часть работы;
- •Ответить на контрольные вопросы и разобрать примеры;
- •Выполнить все задачи для самостоятельного выполнения.
- •Лабораторная работа 13 «Файлы»
- •Изучить теоретическую часть работы;
- •Ответить на контрольные вопросы и разобрать примеры;
- •Выполнить все задачи для самостоятельного выполнения.
- •Лабораторная работа 14 «Текстовые файлы»
- •Изучить теоретическую часть работы;
- •Ответить на контрольные вопросы и разобрать примеры;
- •Выполнить все задачи для самостоятельного выполнения.
- •Лабораторная работа 15 «Графические возможности. Графический режим. Система координат»
- •Изучить теоретическую часть работы;
- •Ответить на контрольные вопросы и разобрать примеры;
- •Выполнить все задачи для самостоятельного выполнения.
- •Лабораторная работа 16 «Графические возможности. Абсолютные и относительные координаты. Заполненные фигуры»
- •Изучить теоретическую часть работы;
- •Ответить на контрольные вопросы и разобрать примеры;
- •Выполнить все задачи для самостоятельного выполнения.
- •Лабораторная работа 17 «Сложные типы данных. Множества»
- •Изучить теоретическую часть работы;
- •Ответить на контрольные вопросы и разобрать примеры;
- •Выполнить все задачи для самостоятельного выполнения.
Лабораторная работа 11 «Подпрограммы»
Цель работы:
Изучение структурного программирования.
Порядок выполнения работы:
Изучить теоретическую часть работы;
Ответить на контрольные вопросы и разобрать примеры;
Выполнить все задачи для самостоятельного выполнения.
В практике программирования часто встречаются ситуации, когда по ходу выполнения программы приходится производить одни и те же вычисления или действия. Чтобы исключить повторение одинаковых записей и сделать тем самым программу проще и понятнее, можно выделить эти повторяющиеся фрагменты в самостоятельную часть программы, которая может быть использована многократно по мере необходимости. Такая автономная часть программы, реализующая определённый алгоритм и допускающая обращение к ней из различных частей программы, называется подпрограммой.
Использование подпрограмм позволяет реализовать один из самых прогрессивных методов программирования - структурное программирование.
Язык программирования Turbo Pascal 7.0, даже в сравнении с другими промышленными системами программирования, обладает очень мощными средствами для работы с подпрограммами.
Эта Лабораторная работа посвящена изучению наиболее простой реализации подпрограмм - процедуре без параметров.
Описание процедур без параметров.
Как вы уже знаете, в структуре Pascal-программы предусмотрен специальный раздел для описания подпрограмм - раздел описания процедур и функций. Именно в этом разделе производится описание подпрограмм.
Структура любой подпрограммы почти буквально повторяет структуру всей Pascal-программы, и выглядит следующим образом:
Procedure <имя процедуры>;
Uses <имена модулей>;
Label <имена меток>;
Const <имена констант>;
Type <имена типов пользователя>;
Var <имена локальных переменных>;
<раздел объявления подпрограмм>;
Begin
<операторы>;
End;
Отличия Pascal-программ от подпрограмм.
Единственным отличием процедуры без параметров от Pascal-программы состоит в названии заголовка, которое начинается не служебным словом Program, а служебным словом Procedure. Наличие заголовка процедуры обязательно, в отличие от наличия заголовка программы, который может быть опущен. Кроме того, любая подпрограмма заканчивается служебным словом End и точкой с запятой, в отличие от End с точкой в Pascal-программе.
Вызов процедур без параметров.
Вызов процедуры без параметров осуществляется по имени данной процедуры в теле программы. Имя процедуры воспринимается как оператор. При выполнении этого оператора выполняется вся подпрограмма.
Вложенность подпрограмм.
Допускается использование в одной программе сразу нескольких подпрограмм. Кроме использования одновременно нескольких подпрограмм Pascal-программа допускает использование вложенных подпрограмм. То есть каждая подпрограмма может содержать в себе описание других подпрограмм, которые являются таким образом подпрограммами подпрограмм. Эти подпрограммы, в свою очередь, тоже могут содержать описание своих подпрограмм и так далее.
Структура подпрограмм (блоков) Pascal-программ достаточно традиционна для многих языков и требует определённой дисциплины для доступа к объектам (например переменным, константам, типам пользователя), описанным в различных блоках. Эту дисциплину можно сформулировать в виде следующих правил:
1. Имена объектов, описанных в некотором блоке, считаются известными в пределах данного блока, ВКЛЮЧАЯ и все вложенные блоки.
2. Имена объектов, описанных в блоке, должны быть уникальны в пределах данного блока и могут совпадать с именами объектов из других блоков.
3. Если в некотором блоке описан объект, имя которого совпадает с именем объекта, описанного в объемлющем блоке, то это послед нее имя становится недоступным в данном блоке. Говорят, что имя, описанное в блоке, экранирует (закрывает, делает недоступным) одноимённые объекты из блоков, объемлющих данный. Возвращаясь к предыдущей схеме, можно сказать, что объекты описанные в блоке B, известны (видимы), кроме самого блока B, ещё и в блоках D и E. Имена из блоков C, D, E известны только в пределах соответствующих блоков. Наконец, имена объектов из самого внешнего блока A (то есть блока, соответствующего программе в целом) известны во всех вложенных блоках.
Схематически Pascal-программа содержащая подпрограммы может выглядеть следующим образом:
PROGRAM <главная программа А>;
procedure <подпрограмма B>;
procedure <подпрограмма D>;
begin
<операторы подпрограммы D>;
end;
begin
<операторы подпрограммы B>;
end;
BEGIN
<операторы главной программы A>;
END.
Переменные можно объявлять и внутри подпрограммы. Но в этом случае, переменная объявленная внутри подпрограммы будет доступна только внутри этой подпрограммы. Такие переменные называются локальными переменными.
Преимущества применения подпрограмм.
1. Появляется возможность использовать при написании программ, уже готовые, отработанные фрагменты программ, оформленных в виде подпрограмм.
2. Возможно применение технологии программирования "сверху-вниз". При использовании такой технологии более сложная и громоздкая задача разбивается на ряд простых и маленьких задач, решение которых сводится к написанию подпрограмм, объединяемых, в конечном итоге, в одну программу.
3. Написание больших программ можно разделить между несколькими программистами одновременно, объединив после этого подпрограммы, написанные ими, в одну программу.
4. В результате использования локальных параметров, память используется более рационально, так как память под локальные переменные выделяется только во время работы данной подпрограммы.
procedure TRG2;
{процедура рисования треугольника цвета i}
begin
setcolor(i); {обращение к глобальной (внешней) переменной}
linerel(40,0);
linerel(-40,-40);
linerel(0,40);
end;
В этой процедуре производится обращение к глобальной переменной i, которая обязательно должна быть объявлена во внешней программе и иметь определённое значение. Если использовать процедуру TRG2 в другой программе, то естественно Вы должны будете позаботиться о том, чтобы в ней тоже присутствовала переменная, предназначенная для хранения номера текущего цвета рисования треугольника и обязательно под именем i.
Для того, чтобы созданные пользователем подпрограммы были более универсальными, чтобы их использование в других программах было не таким сложным, во многих языках программирования применяются более совершенные механизмы передачи (обмена) информацией (данными) между программой и её подпрограммами. Полное описание возможных механизмов передачи информации, применяемых в современных алгоритмических языках составляет основу концепции современного структурного программирования, и обладает функциональной избыточностью. Это значит, что задача обмена информацией может быть решена с помощью только некоторой части из всех возможных способов обмена данными. Поэтому все механизмы в полном объёме не применяется ни в одном алгоритмическом языке программирования.
Так как описание и правила применения стандартных (встроенных) процедур ничем не отличаются от описания и правил применения созданных пользователем процедур, мы изучим основные понятия и определения используя уже знакомые Вам и неоднократно применяемые стандартные процедуры.
Процедура очистки экрана ClrScr;
Типичный пример процедур без параметров. Обращение к глобальным параметрам отсутствует.
Если подпрограмма предполагает обмен информацией (данными) с программой, то в её описании, после имени подпрограммы должны быть описаны специальные параметры, с помощью которых и осуществляется предполагаемый информационный обмен. Например:
SetColor(i: byte); {Процедура задает цвет для вывода текста, вычерчивания линий и фигур}
Процедура с параметром.
Параметры, которые записываются в скобках после имени описываемой процедуры называются ФОРМАЛЬНЫМИ ПАРАМЕТРАМИ. После имени формального параметра обязательно указывается его тип. Указанные после имени процедуры параметры указывают на то, что для выполнения данной процедуры необходимы дополнительные данные.
Для выполнения процедуры в программе необходимо осуществить её ВЫЗОВ. Вызов процедуры с параметрами должен быть сопровождён передачей дополнительных данных, необходимых для работы этой процедуры. Таким образом, во время вызова процедуры ФОРМАЛЬНЫЕ (просто занимающие место) параметры должны быть заменены ФАКТИЧЕСКИМИ (реально существующими) параметрами (дополнительными данными). Например: SetColor(5);
Параметры, передаваемые процедуре во время её вызова в программе называются ФАКТИЧЕСКИМИ ПАРАМЕТРАМИ. Фактическими параметрами могут быть как непосредственные значения, так и переменные в которых хранятся требуемые значения. Например: SetColor(t);
В одной процедуре могут использоваться несколько параметров как одного типа данных так и нескольких переменных различных типов данных.
Window(X1, Y1, X2, Y2: byte); {Процедура описывает окно заданного текста с координатами X1, Y1, X2, Y2}
По способу передачи данных параметры можно разделить на несколько категорий:
Параметры-значения
Используются для передачи данных из программы в подпрограмму. Из программы в подпрограмму передаётся копия параметра.
В подпрограмме допустимо любое изменение этой копии. Оригинал, оставшийся в программе, остаётся без изменения. Таким образом обратная передача информации с помощью параметров-значений невозможна. Для создания копии параметра в памяти компьютера, во время работы процедуры, выделяется дополнительная ячейка памяти, поэтому передача большого количества параметров-значений, или параметров-значений большого объёма может в значительной степени загрузить память компьютера, замедлить работу программы и даже привести к аварийной ситуации. Формальный параметр-значение записывается в скобках после имени процедуры своим именем с указанием типа. Например:
Length(s: string);
LineTo(X, Y: integer);
Line(X1, Y1, X2, Y2: integer);
Параметры-переменные
Используются для передачи данных как из программы в подпрограмму так и из подпрограммы в программу. Из программы в подпрограмму передаётся адрес фактического параметра, то есть та ячейка памяти которая его содержит.
В подпрограмме допустимо любое изменение этого параметра. Таким образом все изменения, которые произошли с параметром-переменной в подпрограмме, тут же передаются в главную программу, - возможна обратная передача информации.
При передаче параметров-переменных дополнительных ячеек памяти не выделяется.
Формальные параметры-переменные указываются в заголовке подпрограмме аналогично параметрам-значениям, только перед именем параметра записывается зарезервированное слово VAR. Действие слова VAR распространяется до ближайшей точки с запятой. Например:
Delete (var s: string; i, n: integer); В этой процедуре указаны формальные параметры-значения i, n и параметр переменная s.
Insert (p: string; var s: string; i: integer); - p, i - параметры-значения; s - параметр-переменная.
Параметры-константы используются для передачи данных из программы в подпрограмму. Из программы в подпрограмму передаётся адрес фактического параметра, - та ячейка памяти, которая его содержит. В подпрограмме изменение параметра-константы недопустимо, поэтому передача данных в обратном направлении невозможна. При передаче параметров-констант дополнительных ячеек памяти не выделяется. Формальные параметры-константы указываются в заголовке подпрограммы. Перед именем параметра-константы записывается служебное слово const. Действие слова const распространяется до ближайшей точки с запятой.
При описании подпрограммы формальные параметры различных категорий как правило объединяются в группы. Внутри группы параметры отделяются друг от друга запятыми. Группы разделяются точкой с запятой. При вызове подпрограммы все фактические переменные отделяются друг от друга только запятыми, даже если они не принадлежат одной группе.
Рассмотрим конкретные примеры процедур с параметрами:
Пример 1.
procedure TRG3 (i: integer);
{Процедура рисования треугольника цвета i}
begin
setcolor(i); {обращение к параметру-значению}
linerel(40,0);
linerel(-40,-40);
linerel(0,40);
end;
Пример 2.
PROGRAM EX_26_3;
{Программа преобразования угла из градусной меры в радианную}
USES Crt;
VAR
ch: char;
x: real;
a: real;
PROCEDURE Rad(const alfa: real; var betta: real);
{Процедура преобразования угла из градусной меры в радианную. Параметр-константа alfa предназначена для передачи из программы в процедуру угла в градусах. Параметр-переменная betta предназначена для передачи из процедуры в программу угла в радианах}
BEGIN
betta:=pi*alfa/180;
END;
BEGIN
Repeat
ClrScr;
Writeln('Преобразования угла из градусной меры в радианную');
Write('Введите угол в градусах: ');
Readln(x); Rad(x,a);
Writeln('Ему равен угол в радианах = ',a:6:4);
Writeln('Продолжить вычисления? Enter - да, Пробел - нет');
ch:=ReadKey;
Until ch<>#13;
END.
Рассмотренные в предыдущей лабораторной работе категории параметров не исчерпывают всех вопросов передачи информации в Pascal программах. Использование в качестве параметров сложных типов данных имеет свои конкретные особенности. Рассмотрим особенности использования в качестве параметра подпрограмм данных типа массив.
Массивы и строки открытого типа
В Turbo Pascal 7.0 в качестве параметров можно использовать массивы и строки открытого типа. Открытым массивом (строкой) называется массив без указания типа индекса (размера массива). Например
PROCEDURE Atts(Var mas: array of integer);
В качестве фактического параметра в данной процедуре можно использовать массив любого размера, содержащий элементы того же типа что и формальный открытый массив (в нашем случае integer). Не зависимо от того, какой массив используется в качестве фактического параметра, индексация элементов открытого массива всегда начинается с нуля. Индекс последнего элемента в массиве можно определить с помощью функции для величин порядкового типа High(x).
Такие массивы введены для того, чтобы подпрограмма могла обрабатывать массив любого размера.
Пример 3.
PROGRAM EX_26_4;
{Программа сортировки массива}
Uses Crt;
VAR
m: array[11..20] of integer;
Procedure Vvod (var mas: array of integer);
{Процедура заполнение линейного массива произвольного размера}
Var i: integer;
Begin
ClrScr;
For i:=0 to high(mas) do begin
Write('Введите элемент массива N ',i,' ');
Readln(mas[i]);
end;
End;
Procedure Sort (var mas: array of integer);
{Процедура упорядочивания линейного массива произвольного размера}
Var
ind: boolean;
buf: integer;
i: integer;
Begin
Repeat
ind:=true;
For i:=0 to high(mas)-1 do
if mas[i]<mas[i+1] then begin
buf:=mas[i];
mas[i]:=mas[i+1];
mas[i+1]:=buf;
ind:=false;
end;
Until ind;
End;
Procedure Vyvod ( const mas: array of integer);
{Процедура вывода на экран содержимого
произвольного линейного массива}
Var i: integer;
Begin
Writeln ('Упорядоченный массив');
For i:=0 to High(mas) do Write(mas[i]:5);
Repeat Until Keypressed;
End;
BEGIN {Главная программа}
Vvod(m);
Sort(m);
Vyvod(m);
END.
В этой программе используются три процедуры с параметром массив открытого типа. Эти процедуры могут быть использованы без изменений для обработки любого одномерного массива целых чисел в любой программе. Для работы с многомерными массивами в Turbo Pascal 7.0 такой возможности нет. Если вы желаете создать подпрограмму для работы с многомерным массивом, или просто с конкретным линейным массивом, необходимо помнить следующее: Описание в качестве формального параметра массива с указанием его индексов невозможно. Например процедура
Prim (var m: array[1..10,1..5] of byte);
объявлена быть не может. Необходимо использовать тип-массив. Например:
PROGRAM Ex_26_5;
{Программа определения минимального элемента матрицы }
USES Crt;
TYPE mas=array[1..4,1..4] of integer; {Тип-массив}
VAR tab: mas;
min: integer;
Procedure Vvodmt (var m: mas);
{процедура с использованием типа-массив}
Var
Begin
ClrScr;
For i:=1 to 4 do
For j:=1 to 4 do begin
Write('Введите элемент массива N ',i,' ',j,' ');
Readln(m[i,j]);
end;
End;
Procedure Tmtab (m: mas; var rez: integer);
Var i,j: byte;
Begin
rez:=m[1,1];
for i:=1 to 4 do
for j:=1 to 4 do
if m[i,j]<rez then
rez:=m[i,j];
End;
BEGIN
Vvodmt (tab);
Tmtab (tab, min);
Writeln ('Минимальный элемент в массиве = ', min);
Repeat Until Keypressed;
END.
Как вы знаете оператор безусловного перехода GOTO нельзя использовать для досрочного выхода из подпрограммы. С этой целью используется процедура EXIT.
Функции, это такие подпрограммы, результатом которых обязательно является некоторое значение. Описание функции во многом совпадает с описанием процедуры. Но если имя процедуры используется только для её вызова, то с именем функции, кроме того, связывается её результат.
В описании функции заголовок выглядит следующим образом:
Function Имя (Список формальных параметров): Тип результата;
Как и у процедуры заголовок функции обязателен. Например:
function Chr (X: Byte): Char;
function Odd (X: Longint): Boolean;
function GetX: Integer;
function KeyPressed: Boolean;
Функция предполагает обязательную передачу информации из подпрограммы в программу через имя функции. Поэтому раздел операторов обязательно должен содержать хотя бы один оператор, в котором имени функции присваивается значение результата. В противном случае функция не возвратит результат (вернее возвратит произвольный результат). Для примера рассмотрим две программы вычисления суммы двух чисел, в которых задача решена в первом случае с помощью процедуры, а во втором - с помощью функции:
Пример 1
PROGRAM Ex_27_1;
USES Crt;
VAR x,y,rez: real;
Procedure Summa (var s: real; a,b: real);
Begin
s:=a+b;
End;
BEGIN
ClrScr;
Write ('Введите два числа: '); Readln (x,y);
{Вычисление с помощью процедуры}
Summa (rez,x,y); Writeln ('Сумма = ',rez);
Repeat Until KeyPressed;
END.
Пример 2
PROGRAM Ex_27_1;
USES Crt;
VAR x,y,rez: real;
Function Sum (a,b: real): real;
Begin
Sum:=a+b;
End;
BEGIN
ClrScr;
Write ('Введите два числа: '); Readln (x,y);
{Вычисление с помощью функции}
rez:=Sum (x,y); Writeln ('Сумма = ',rez);
{Непосредственное использование функции в выражениях}
Writeln ('Сумма = ',sum (x,y));
Repeat Until KeyPressed;
END.
Как видите, вызов функции в программе тоже отличается от вызова процедуры. Вызов процедуры всегда представляет собой самостоятельный оператор. Функция не может быть самостоятельным оператором. Вызов функции производится:
1. в различных выражениях;
2. только справа от знака присваивания;
3. как элемент вывода в операторе вывода информации.
По способу передачи данных имя функции можно характеризовать как параметр четвёртой категории. С его помощью производится передача информации только в одном направлении, - от подпрограммы к программе. Но собственно параметром (формальным или фактическим) функция не является. Скорее функция похожа на переменную, значение которой зависит только от параметров функции и доступно только для чтения при непосредственном обращении.
Оформлять некоторую программу как функцию целесообразно только в том случае, если ожидается некоторый результат её работы. Если же последовательность команд ориентирована только на выполнение некоторой последовательности действий (вывод на экран, рисование и т.д.), лучше оформить её как процедуру.
Контрольные вопросы:
Что такое подпрограмма?
В чем состоит отличие процедуры без параметров от Pascal-программы.
Назовите основные составляющие структуры подпрограммы?
Дайте определение «Параметры-значения».
Что такое Функции?
Задания для самостоятельного выполнения
1. Дан целочисленный массив, состоящий из 12 элементов. Определить сумму элементов с чётными индексами и сумму элементов с нечётными индексами. Использовать процедуру для заполнения массива и для вычисления суммы элементов.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2. Составить программу калькулятор. Выполнение операций "+", "-", "*", "/" оформить в виде отдельных подпрограмм.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
3. Составить программу для обработки массива содержащего 10 целых чисел. Определить: 1) сумму элементов массива; 2) среднее арифметическое элементов массива; 3) максимальный элемент массива. Выполнение каждого логического блока программы оформить в виде отдельных процедур.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
4. Составить программу определения гипотенузы, площади, периметра прямоугольного треугольника по введённым с клавиатуры катетам. Расчет провести с использованием процедур.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
5.Составить программу, которая выводит следующее сообщение о своих возможностях
{ 1 - вычисление длины окружности;
2 - вычисление площади круга;
3 - вычисление объёма шара;
5 - выход }
Каждое вычисление должно быть оформлено в виде процедуры.
6. Даны целочисленный массив мas из 10 элементов. Определить
t(mas) + 98
------------- * t(mas),
t(mas) - 98
где t(mas) - среднее арифметическое элементов массива.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
