Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Массивы

.pdf
Скачиваний:
13
Добавлен:
02.06.2015
Размер:
247.89 Кб
Скачать

ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮ ГОСУДАРСТВЕННОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ

ВЯТСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ

Электротехнический факультет Кафедра электрических станций

ПОДПРОГРАММЫ

МАССИВЫ

Методические указания и задания к лабораторным и практическим занятиям

по дисциплине «Информатика» для студентов дневного отделения

специальностей 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.