Массивы
.pdfФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮ ГОСУДАРСТВЕННОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ
ВЯТСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
Электротехнический факультет Кафедра электрических станций
ПОДПРОГРАММЫ
МАССИВЫ
Методические указания и задания к лабораторным и практическим занятиям
по дисциплине «Информатика» для студентов дневного отделения
специальностей 140204, 140211, 140104, 140601,140610
Киров 2009
2
УДК 519.95 С 23
Составители: |
кандидат технических наук, |
|
доцент Р.В. Медов |
Подписано в печать |
|
Усл. печ. л. 3,6 |
Бумага типографская |
|
Печать матричная |
Заказ № |
Тираж |
Бесплатно |
Текст напечатан с оригинал-макета, представленного автором 610000, г. Киров. ул. Московская 36.
© Вятский государственный университет, 2009
3
Введение
Данные методические указания содержат краткие теоретические сведения о подпрограммах и массивах в языке Pascal, а также примеры решения задач с массивами с использованием подпрограмм.
1. Подпрограммы в языке Pascal
Подпрограммой называют обособленную именованную часть программы, обладающую собственным локальным контекстом имен. Подпрограммы размещаются в разделе описания основной программы (или в модулях).
Подпрограммы в языке Pascal реализованы в виде процедур и функций, различающихся назначением и способом их использования.
Подпрограмма в языке Pascal имеет следующую структуру:
1.Заголовок.
2.Раздел описания.
3.Раздел исполнения.
Заголовок определяет тип, имя и параметры подпрограммы. Раздел описания может содержать объявления локальных переменных, констант, типов и вложенных подпрограмм. Раздел исполнения состоит из операторов, реализующих алгоритм подпрограммы.
1.1.Процедуры
Процедура — независимая именованная часть программы, которую можно вызывать по имени для выполнения определенных действий. Упоминание имени процедуры в тексте программы приводит к активизации процедуры и называется ее вызовом.
Все процедуры делятся на встроенные (стандартные) и пользовательские (определенные пользователем).
Описание процедуры состоит из заголовка и тела. Заголовок процедуры записывается следующим образом:
procedure имя процедуры (список формальных параметров);
Список формальных параметров не обязателен. Если он имеется, в нем перечисляются имена формальных параметров и их типы, отделяемые друг от друга точкой с запятой.
Различают входные и выходные параметры: входные служат для передачи в подпрограмму исходных данных для расчетов, а выходные – для передачи результатов расчетов из подпрограммы. При описании выходных параметров в заголовке подпрограммы перед именем параметра ставится слово Var.
Рассмотрим процедуру нахождения периметра P и площади S равностороннего треугольника по известной длине стороны а (P = 3·a; S = 3 /4·a2).
Procedure Triangle (a:real;Var P,S:real); begin
P:=3*a;
4
S:=sqrt(3)/4*sqr(a);
end;
Процедура имеет имя Triangle и три параметра вещественного типа: a – входной параметр, передающий в процедуру значение длины стороны треугольника; P, S – выходные параметры, в которые записываются значения периметра и площади треугольника. Раздел описания в процедуре отсутствует.
Вызов процедуры осуществляется следующим образом:
Triangle(x,y,z); {x,y,z:real} Triangle(2.5,perimeter,square); {perimeter,square:real}
Вкачестве фактических параметров (указываемых при вызове процедуры)
впервом случае выступают три вещественные переменные x,y,z; во втором случае – первым параметром (входным) является вещественное значение, вторым и третьим параметрами – две вещественные переменные perimeter, square. Та-
ким образом, в качестве входного параметра может выступать переменная, константа или какое-то значение, а в качестве выходного параметра – только переменная.
При вызове подпрограммы значение первого фактического параметра (x или 2.5) передается формальному параметру a. В разделе исполнения процедуры по известному параметру a рассчитываются параметры P и S. После окончания процедуры значения фактических параметров y и z (perimeter и square) становятся равными соответственно P и S.
Для каждой подпрограммы составляется отдельная блок-схема (рисунок 1,а), а вызов подпрограммы заключается в специальный блок (рисунок 1,б).
Triangle (a:real;Var
P,S:real)
P:=3*a
S:=sqrt(3)/
4*sqr(a);
Triangle |
Triangle(x,y,z) |
|
а |
б |
|
Рисунок 1 |
5
1.2.Функции
Функция аналогична процедуре, но имеются два отличия: во-первых, функция передает в точку вызова скалярное (одиночное) значение, во-вторых, имя функции может входить в выражение как операнд.
Отличие процедур от функций состоит в том, что процедуры служат для задания совокупности действий, направленных на изменение программной обстановки, а функции, являясь частным случаем процедур, отличаются от них тем, что обязательно возвращают в точку вызова основной программы результат, причем единственный.
Все функции, как и процедуры, делятся на встроенные (стандартные) и пользовательские (определенные пользователем).
Описание функции состоит из заголовка и тела. Заголовок функции: function имя функции (список параметров) : тип результата функции;
При описании функции обязательно должен быть указан тип возвращаемого ее результата. Тип функции может быть целочисленным, вещественным, символьным, булевским, ограниченным, перечислимым и строковым.
Как правило, все параметры для функции являются входными.
В разделе исполнения функции обязательно должен присутствовать оператор, который присваивает имени функции определенное выражение. Результат этого выражения будет являться результатом функции и будет возвращен в точку вызова функции.
Рассмотрим функцию возведения положительного вещественного числа a в степень b, использующую следующую математическую формулу: ab = eb× ln( a) .
Function Power (a,b:real):real; begin
Power:=exp(b*ln(a));
end;
Функция Power имеет результат вещественного типа и два входных параметра a и b. В разделе исполнения имеет только один оператор, присваивающий имени функции результирующее выражение.
Вызов данной функции возможен в любом месте программы, где допустимо записывать выражение вещественного типа. Например:
Z:=Power(x,y); |
{ z = x y } |
X:=5*Power(3.6,4); |
{ x = 5× 3.64 } |
if Power(x,5)>100 then x:=x-2.5;
Как видно из примеров, вызов функции не является самостоятельным оператором, а входит в состав других операторов.
Вызов процедур и функций возможен не только в разделе исполнения основной программы, но и в подпрограммах. При этом необходимо учитывать,
6
что в любой подпрограмме возможен вызов только тех процедур и функций, которые описаны выше по тексту.
2. Одномерные массивы
Массив — это структура данных, которую можно рассматривать как набор переменных одинакового типа, имеющих общее имя. Массивы бывают одномерные и многомерные. Доступ к элементам массива осуществляется по индексу.
Одномерный массив представляет собой проиндексированный список значений одного типа, имеющий общее имя. Как и все переменные, массив в программе должен быть объявлен. Это делается следующим образом:
Var имя: array [н_индекс..к_индекс] of тип;
где имя — имя переменной-массива,
array — зарезервированное слово языка Pascal, обозначающее, что переменная является массивом,
н_индекс и к_индекс — соответственно, начальный и конечный индексы, которыми являются целые константы, определяющие диапазон изменения индексов элементов одномерного массива (то есть размер массива),
тип — тип элементов массива может быть любым.
Пример объявления одномерного массива:
Var m : array [1..20] of integer; mas : array [0..50] of real;
Доступ к элементу массива осуществляется с помощью указания имени массива и индекса элемента в квадратных скобках. Например:
m[1] |
m[i] |
mas[0] |
mas[j] |
Элементы массива можно заполнить, последовательно вводя их значения с клавиатуры. Для ввода больших массивов удобно использовать специальную функцию-генератор случайных чисел. В языке Pascal это функция random(x). Вызов ее без аргумента возвращает случайное вещественное число из интервала [0..1], а вызов с целочисленным аргументом п — случайное целое число из промежутка [0..п-1]. Случайные целые числа, принадлежащие отрезку [а..b], вычисляют по формуле:
а+random(b–а+1).
Например, если необходимо случайное число на отрезке [-10..20], функцию random можно записать следующим образом:
m[i] := –10 + random(31).
Эта функция в языке Pascal обычно используется совместно с процедурой randomize, переустанавливающей базу генерации случайных чисел, то есть
7
позволяющей при последовательных запусках программы получать разные случайные последовательности.
Существуют типовые алгоритмы обработки одномерных массивов. Приведем типовые фрагменты программ на языке Pascal.
Составление и реализацию алгоритмов на языке Pascal рассмотрим на нескольких примерах. Каждый пример будем реализовывать в виде подпрограммы.
Задание 1. Составить процедуры для заполнения элементов одномерного массива с клавиатуры и случайными числами с возможностью выбора пользователем способа заполнения, а также процедуру вывода элементов массива на экран.
В основной программе опишите одномерный массив mas и переменные count, select для хранения количества элементов массива и выбора действия:
Program Massive; Uses wincrt;
Var mas:array[1..20] of integer; count:integer;
Запустите MS Visio и составьте блок-схему подпрограммы заполнения элементов массива случайными числами (рисунок 2).
Input_random(Var
m:array of integer;c:integer)
Randomize
i=0 to c-1
m[i]=random(21)- 10
i=i+1
Input_random
Рисунок 2
8
Наберите процедуру заполнения элементов одномерного массива случайными числами:
Procedure Input_random(Var m:array of integer;c:integer);
Var i:integer; begin
Randomize;
for i:=0 to c-1 do m[i]:=random(21)-10; end;
Далее наберите следующие процедуры:
∙ заполнения элементов одномерного массива с клавиатуры:
Procedure Input_manual(Var m:array of integer;c:integer);
Var i:integer; begin
for i:=0 to c-1 do begin
write('M[',i+1,']=');
readln(m[i]); end;
end;
∙ выбор способа заполнения массива:
Procedure Input_mas(Var m:array of integer;Var c:integer);
Var sposob:integer; begin
write('Введите количество элементов ='); readln(c);
write('Выберите: 1-с клавиатуры, иначе-случайно'); readln(sposob);
if sposob=1 then Input_manual(m,c)
else Input_random(m,c);
end;
∙ вывод элементов массива на экран:
Procedure Output_mas(m:array of integer;c:integer); Var i:integer;
9
begin
for i:=0 to c-1 do write(m[i]:4); writeln;
readln; end;
Самостоятельно составьте блок схемы трех приведенных выше подпрограмм.
Далее наберите текст раздела исполнения основной программы: begin
Repeat clrscr;
Writeln('Выберите действие:'); Writeln('1-Заполнение массива'); Writeln('2-Вывод массива на экран');
readln(select); case select of
1:Input_mas(mas,count);
2:Output_mas(mas,count); end;
until select=0; end.
Запустите программу, проверьте результаты и пригласите преподавателя для проверки.
Задание 2. Составьте процедуру, которая в заданном массиве будет менять порядок расположения элементов на обратный. В основной программе предусмотрите вызов подпрограммы.
Алгоритм выполнения задания:
1.В процедуре:
a.Открыть цикл с параметром от 0 до c div 2-1.
b.В цикле осуществить обмен элементов массива: m[i] и m[c-i-1].
2.В разделе исполнения основной программы:
a.Вывести исходный массив.
b.Запустить процедуру.
10 c. Вывести полученный массив.
Наберите процедуру перестановки элементов массива в обратном порядке:
Procedure Change_mas(Var m:array of integer;c:integer);
Var i,temp:integer;
Begin
for i:=0 to c div 2-1 do begin
temp:=m[i]; m[i]:=m[c-i-1];
m[c-i-1]:=temp; end;
readln; end;
Далее дополните раздел исполнения основной программы, вставив в нужные места следующие строки:
Writeln('3-перестановка в обратном порядке');
. . .
3:begin
Output_mas(mas,count);
Change_mas(mas,count);
Output_mas(mas,count); end;
Проверьте правильность работы, самостоятельно составьте блок-схему подпрограммы, после чего пригласите преподавателя для проверки.
Задание 3. Составьте функцию, которая будет возвращать в качестве своего результата номер первого локального минимума массива (локальный минимум — это элемент, который меньше любого из своих соседей). В основной программе предусмотрите вызов подпрограммы.
Алгоритм выполнения задания:
1.В функции:
a.Открыть цикл с параметром от 1 до c-2.
b.В цикле проверить условие: если текущий элемент меньше двух соседних элементов, то выйти из цикла с помощью break.