Информатика. Программирование для библиотечных специалистов. Учебное пособие
.pdfСоставим процедуру для вычисления степени целого числа.
Procedure Degree (x,y: Integer; Var st:Longint); Var i: Integer; {описательная часть}
Begin {тело процедуры} st:= 1;
For i:= 1 To у Do st :=t * x; End.
Первая строчка описания — это заголовок процедуры, который начинается со слова Procedure. Процедура названа именем Degree. В скобках записан список формальных параметров, т.е. перечислены переменные с указанием их типа. Мы используем три параметра:
‒первый — основание степени, т.е. число, которое надо возвести в степень;
‒второй — показатель степени;
‒третий — результат.
Первые два формальных параметра — параметрызначения, третий — параметр-переменная, и перед ним указано слово Var. Все они описаны как целые (х и у — переменные типа Integer, a st — типа Longint, так как степенная функция быстро возрастает).
После заголовка процедуры следуют разделы описаний. В приведенном нами примере есть только раздел описания переменных, в котором раскрывается одна переменная i (счетчик цикла). Тело процедуры ограничивается служебными словами begin и end, только после end ставится точка с запятой. В приведенном примере в теле процедуры при помощи арифметического цикла вычисляется степень числа х.
В структуре основной программы описание процедур и функций располагаются в описательной части, т.е. до служебного слова begin, с которого начинается исполняемая часть.
Вся программа для решения нашей задачи может иметь следующий вид:
Program Example;
Var a, n: Integer; s: Longint;
Procedure Degree (x,y: Integer; Var st: Longint); Var i:Integer;
Begin
71
st:=1;
For i:=l To у Do st: = st*x; End; Begin
Writeln ('Введите два числа — основание и показатель степени');
Readin (а, п);
Degree (a, n, s); {обращение к процедуре} Writeln ('Результат', s);
Readin;
End.
Тестирование: когда A = 2, n = 3, тогда s = 8. Подпрограммы-функции. Мы уже пользовались встро-
енными функциями Паскаля. Кроме них мы можем писать свои функции, которые отличаются от процедур тем, что:
−функция возвращает при обращении к ней одно единственное значение, и это значение простого типа (массив или множество не могут быть значениями функции);
−вызов подпрограммы-функции производится просто путем указания ее имени в составе какого-либо выражения или
всписке аргументов подпрограммы. Это может быть арифметическое выражение, если функция арифметическая. Имя функции
ввызывающей программе может появиться только в правой части оператора присваивания.
Описание функции, создаваемой программистом, выглядит так:
function имя_функции (параметр_1 : тип_1; параметр_2 : тип_2;
. . . пapaметр_N : тип__М) : тип функции; раздел описаний функции
begin
раздел операторов функции имя_функции := выражение; end;
Слово function является зарезервированным словом языка Pascal. Имя функции выбирается программистом в соответствии
собычными правилами и используется для вызова функции в тексте программы. Параметры — это список переменных
суказанием их типов. В отличие от стандартных функций параметров может быть сколько угодно.
72
Тип функции — это тип значения, которое вычисляет функция. Он обязан быть простым.
Вслед за заголовком располагается тело функции, которое устроено аналогично программе или процедуре. Есть важное требование — в теле функции должен присутствовать оператор присваивания:
Примеры:
PROZ9
program kombinatorica; var a1,a2,a3:longint;
c,k,n:integer;
function factorial(n:integer):longint; var i:integer;
rez:longint; begin
rez:=1;
for I:=1 to n do rez:=rez*i; factorial:=rez; end;
begin readln(n,k); a1:=factorial(n); a2:=factorial(k);
a3:=factorial(n-k); c:=a1 div(a2*a3); writeln(c);
readln;
end.
PROZ10
Program example_10; var n1,n2:longint;
k1,k2:byte;
function Quant(x:longint):byte; var k:byte;
Begin k:=0;
while x<>0 do begin
inc(k);
x:=x div 10;
73
end;
quant:=k;
end; Begin
writeln ('введите 2 числа'); readln(n1,n2); k1:=quant(n1); k2:=quant(n2);
if k1=k2 then writeln ('одинаковое кол-во цифр')
else if k1>k2 then writeln |
('в первом |
числе |
цифр больше') |
числе цифр |
боль- |
else writeln ('во втором |
||
ше'); |
|
|
readln; |
|
|
end. |
|
|
Практический блок
Изучите теоретический материал, введите на ПК программные коды всех примеров, протестируйте их и проанализируйте, как используются подпрограммы в качестве процедур и функций. Выявите их отличия.
Вопросы и задания для самостоятельной работы
1.Какие проблемы возникают в практике программирования и как они решаются?
2.Каковы основные принципы структурного программирования?
3.Почему наличие полноценных процедур и функций является принципиально важным для структурноориентированного языка высокого уровня?
4.Назовите базовые алгоритмические структуры.
5.Из каких разделов состоит программа?
6.Является ли заголовок программы обязательным?
7.Какие разделы описаний вы уже знаете?
8.Каким служебным словом начинается раздел описания констант? Приведите пример описания константы.
74
9. Каким служебным словом начинается раздел описания типов? Приведите пример описания типа.
10.Каким служебным словом начинается раздел описания переменных? Приведите пример описания переменных.
11.Как оформляется тело основной программы?
12.Приведите примеры использования технологии структурного программирования в гуманитарных областях знаний.
13.В чем заключается метод пошаговой детализации?
14.Что называется вспомогательным алгоритмом? Как он реализован в программировании?
15.Что называется подпрограммой? В чем отличие от программы?
16. В чем сходство и различие подпрограмм-процедур
иподпрограмм-функций в языке Turbo Pascal?
17.В чем различие между стандартными и определенными пользователем подпрограммами? Приведите примеры.
18.Как осуществляется механизм передачи данных и результатов между программой и подпрограммой в языке
Turbo Pascal?
19.Что называется параметром? Формальные и фактические параметры, взаимосвязь между ними?
20.Для чего используется исполнение программы в пошаговом режиме с заходом в процедуры и как это осуществить?
21.Чем отличаются локальные и глобальные переменные? Какова область их действия?
22.В чем отличие между параметрами-переменными и па- раметрами-значениями и в каких ситуациях целесообразно использовать те и другие?
23.В чем, в принципе, заключается рекурсия и как она реализована на Pascal?
Творческий блок
1. В приведенных примерах определите, какие алгоритмы выполняются в этих программах?
75
Пример 1 program maximum;
var a,b,c,d:real;
function max2(x,y:real):real; begin
if x>y then max2:=x else max2:=y; end;
begin
write('vvedite 4 chisla:');readln(a,b,c,d); writeln('maximum
is',a:5:2,b:5:2,c:5:2,d:5:2,'=',
max2(max2(a,b),max2(c,d)):5:2);
readln;
end.
Пример 2
program treug1;
var x1,x2,x3,x4,y1,y2,y3,y4,s,pl,a,b,c:real; i:integer;
function dlina(x,y,x1,y1:real):real; begin dlina:=sqrt(sqr(x-x1)+sqr(y-y1)); end;
procedure plo(a,b,c:real;var pl:real); var p:real;
begin p:=(a+b+c)/2;
pl:=sqrt(p*(p-a)*(p-b)*(p-c)); end;
2. Даны фрагменты программ. Укажите, какие из параметров являются параметрами-значениями, какие — парамет- рами-переменными.
Что будет выдано на печать при исполнении программ? Перечислите локальные и глобальные переменные.
program primer; var c,d:integer;
procedure A(x,y:integer); begin
y:=x+10;
end;
procedure A1(x:integer; var y:integer);
76
begin y:=x+10;
end;
procedure A2(var x,y:integer); begin
y:=x+10;
end; BEGIN
c:=2; d:=0; A(c,d); writeln(d);
c:=2; d:=0; A1(c,d); writeln(d);
c:=2; d:=0; A2(c,d); writeln(d); readln; end.
3. Задача. Необходимо найти площадь выпуклого четырехугольника, заданного координатами своих вершин.
77
ТЕМА 10. СТРУКТУРИРОВАННЫЕ ТИПЫ ДАННЫХ, ТАБЛИЦЫ КАК СПОСОБ ОРГАНИЗАЦИИ ДАННЫХ.
ОДНОМЕРНЫЙ МАССИВ
Теоретический блок
Основная цель создания всей вычислительной техники заключается в быстрой обработке большого количества данных. Во всех задачах предыдущих тем использовались простые типы данных, т.е. каждой переменной соответствовала одна ячейка памяти разной длины, которая однозначно идентифицировалась. Однако все увеличивающееся количество данных инициировало разработку структурированных данных.
Структурированный тип данных характеризуется наличием нескольких компонент, т.е. состоит из некоторого множества элементов. В языке Turbo Pascal допускается вложенность типов, т.е. каждый элемент может быть структурированным типом. Различают пять структурированных типов: строки, множества, записи, файлы, массивы.
В обычной жизни основным средством структурирования являются таблицы — линейные (с одной строкой) и двумерные
(состоящие из |
строк и столбцов). В программировании |
по аналогии |
с таблицами разработаны одномерные |
и двумерные массивы. |
|
Массив — упорядоченная совокупность однотипных дан- |
|
ных, предназначенная для хранения информации. Одномерный массив — это массив, каждый элемент ко-
торого характеризуется одной мерой — его порядковым номером.
а
2 |
0 |
15 |
|
… |
-5 |
1 |
2 |
3 |
|
… |
n |
Для каждого элемента одномерного массива характерно: |
|||||
|
|
|
a[3]:=15 |
|
|
имя массива индекс элемента |
значение элемента |
||||
|
|
78 |
|
|
|
Так как все элементы массива хранятся в памяти ПК последовательно, а память ПК ограничена, то перед началом работы необходимо зарезервировать место под массив, т.е. описать его, используя служебное слово array. В данном описании зарезервируется 100 ячеек целого типа.
Var a: array [1..100] of integer;
Другой способ связан с понятием типа данных. В языке Turbo Pascal предусмотрен механизм создания новых типов, которые принято называть пользовательскими или конструируемыми. Их можно создавать на основе стандартных и ранее созданных типов. Описание новых типов происходит в разделе TYPE. После этого можно в разделе Var создавать переменные этих типов. Также можно сразу описывать новый тип при создании переменной в разделе Var.
type
имя типа = array [список индексов] of тип
Здесь имя типа — правильный идентификатор; список индексов — список одного или нескольких индексных типов, разделенных запятыми; тип — любой тип данных.
Const
n = 5; type
mas = array [1..n] of integer; var
a: mas; i: byte;
Три способа описания одного и того же типа массива:
type {1} M1 = array [0..5] of integer; M2 = array [char] of M1;
M3 = array [-2..2] of M2;
{2} M3 = array [-2..2] of array [char] of array [0..5] of integer;
{3} M3 = array [-2..2,char,0..5] of integer; var A:M3;
{Обращаться к элементам массива можно следующим образом:}
begin
read (A[-1,'a',3]);
79
read (A[1]['x'][0]); A[1]['c',1]:=100; end.
Глубина вложенности, т.е. количество индексов, при определении массивов не ограничена. Играет роль только суммарный объем данных в программе. В стандартном режиме работы Turbo Pascal этот объем ограничен размерами сегмента, т.е. 64 килобайт. Целиком над массивами допускается применение только операции присваивания массивов (подмассивов) одинаковых типов. Остальные операции должны выполняться поэлементно.
Заполнение одномерного массива
Блок-схема алгоритма заполнения одномерного массива a[i], состоящего из n элементов.
Заполнение массива осуществляется тремя способами: 1. Заполнение константой (с помощью формулы)
program tabl; var i,n:integer;
80
