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

2804

.pdf
Скачиваний:
0
Добавлен:
15.11.2022
Размер:
2.33 Mб
Скачать

ind_min: Integer; begin

randomize;

//записываем в массив случайные числа от

//-6 до 6 //и выводим элементы на экран в столбик

for i:=1 to 20 do begin x[i]:= random * 12 - 6; writeln(x[i]);

end;

//Поиск минимального элемента массива ind_min := 1;

for i := 2 to 20 do begin

if (x[i] < x[ind_min]) then begin ind_min := i;

end; end;

//Выводим индекс и значение найденного элемента

writeln('Минимальный элемент:x[', ind_min,'] = ', x[ind_min]);

end.

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

го числа: randomize(seed) (seed – целое число). При использовании одного и того же значения seed последовательности будут случайных чисел будут одинаковыми.

Далее значения элементов массива последовательно задаются в цикле for, счетчик которого используется в качестве индекса элемента. Функция random возвращает очередной

101

член последовательности случайных чисел: случайное вещественное число в диапазоне от 0 до 1. Очевидно, выражение (random*12 – 6) будет случайным вещественным числом в диапазоне от -6 до 6, что и требуется по условию задачи. Заметим, что если использовать функцию random(n), где n – целое число, то она вернет случайное целое число, лежащее в диапазоне от 0 до n-1.

Следующий цикл for используется для поиска минимального элемента массива. Перед входом в цикл необходимо инициализировать переменную ind_min. Делаем предположение, что первый элемент является минимальным и, соответственно, в переменную ind_min записываем значение 1. На каждом i-м шаге цикла проверяется условие x[i] < x[ind_min], и, если это условие истинно, то в переменную ind_min записывается индекс текущего элемента i. В итоге на выходе из цикла в переменной ind_min будет храниться индекс минимального элемента.

Введите рассмотренную программу в редактор кода и откомпилируйте. Проверьте, выводит ли программа на экран значение минимального элемента массива. Замените процеду-

ру randomize следующей строкой: randomize(10). За-

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

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

Задание 3. Заполнить одномерный массив из 20 элементов типа Integer случайными числами в диапазоне от -10 до 10. Определить, содержит ли данный массив элемент, значение которого равно 8 (вывести на экран сообщение «содержит» или «не содержит»).

Задание 4. Заполнить одномерный массив случайными вещественными числами и упорядочить его элементы по воз-

102

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

Указание. Известно большое количество методов сортировки (упорядочения) элементов массива. В несложном (но не отличающимся высоким быстродействием) «методе пузырьков» сравниваются два соседних элемента массива. Если они расположены в неправильной последовательности, то выполняется обмен этих элементов. Сортировка осуществляется путем многократного обхода по списку элементов, сравнения соседних элементов и при необходимости их обмена (см. рис. 5.3).

Рис. 5.3. Сортировка массива по возрастанию значений методом пузырьков (показан только первый обход массива)

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

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

103

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

Как видно из рис. 5.3, после первого обхода максимальный элемент из еще неупорядоченной части массива переходит в уже упорядоченную часть («тонет» вниз) и оказывается на N-й позиции (где N – число элементов массива). После второго обхода следующий по величине элемент окажется на (N- 1)-й позиции и т.д. Таким образом, после завершения очередного обхода число обрабатываемых элементов (число необходимых итераций внутреннего цикла) уменьшается на 1. Очевидно также, что максимальное число обходов всех элементов массива (т.е. число итераций внешнего цикла), которое может потребоваться для его полной сортировки, равно N – 1.

Блок-схема рассмотренного алгоритма представлена на рис. 5.4. Реализующую данный алгоритм программу создайте самостоятельно.

Рис. 5.4. Блок-схема алгоритма сортировки массива по возрастанию методом пузырьков (a – имя массива; минимальное значение индекса элементов массива – 1, максимальное – N; k,

i – счетчики циклов)

104

Задание 5. Написать программу, в которой двумерный массив a из 4 4 элементов заполняется целыми числами, которые пользователь вводит с клавиатуры, а затем этот массив выводится на экран в виде матрицы. Перед вводом программа должна выдавать сообщения вида:

Введите элемент a[3,1]:

Решение.

program lab_5_p5; var

a: array [1..4, 1..4] of Integer; i,j: Integer;

begin

//Ввод элементов массива for i:=1 to 4 do

for j:=1 to 4 do begin

write('Введите элемент a[',i,',',j,']:'); readln(a[i,j]);

end;

//Вывод массива в виде матрицы writeln('Матрица A:');

for i:=1 to 4 do begin for j:=1 to 4 do begin

write(a[i,j],' '); end;

writeln; //переводим курсор на след. строку end;

end.

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

105

Задание 6. Заполнить два массива A и B из 5 5 элементов случайными целыми числами в диапазоне от 1 до 6. Программа должна вывести массивы на экран в виде матриц, а также вычислить и вывести на экран:

a) матрицу C = A+B;

б) матрицу D = A B.

Указание. Чтобы получить случайное целое число в диапазоне от 1 до 6, используйте выражение random(6)+1 или функцию random(1,6).

Вычисление элементов матриц C и D производите по известным из математики правилам:

cij

aij bij ,

 

m

dij

aik bkj ,

 

k 1

где m – число столбцов матрицы A, которое должно быть равно числу строк матрицы B (в нашем случае обе матрицы квадратные, m = 5).

3.Контрольные вопросы и задания

1.Что такое массив, для чего он используется?

2.Как объявить одномерный массив в языке Pascal? Что такое элемент массива и индекс элемента?

3.Как обратиться к отдельному элементу массива?

4.Что произойдет, если при работе программы индекс элемента массива выйдет за границы массива?

5.Как объявить многомерный массив в языке Pascal?

6.Чем динамический массив отличается от статического?

7.Как изменить длину динамического массива?

8.Нарисуйте блок-схему алгоритма поиска максимального элемента одномерного массива.

9.Завершите вручную (на листке бумаги) пузырьковую сортировку массива, показанного на рис. 5.3.

10.Поясните алгоритм пузырьковой сортировки массива.

106

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

Лабораторная работа № 6

ПОДПРОГРАММЫ В ЯЗЫКЕ PASCAL

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

1.Теоретическая часть

1.1.Назначение и виды подпрограмм

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

Использование подпрограмм позволяет решать следующие задачи:

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

оптимизировать программы по объему занимаемой памяти за счет возможности неоднократного вызова одной и той же подпрограммы;

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

дулями.

В языке Pascal подпрограммы делятся на два вида: процедуры и функции. Отличие между ними состоит в том, что

107

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

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

1.2. Описание процедур и функций

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

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

procedure имя(список формальных параметров); раздел описаний

begin

операторы end;

Описание функции имеет вид:

function имя(список формальных параметров): тип

возвращаемого значения;

раздел описаний begin

операторы end;

Операторы, расположенные между операторными скобками begin - end, образуют тело подпрограммы.

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

108

следуют двоеточие и тип. Если секция предваряется ключевым словом var, то это означает, что параметры передаются по ссылке. Если ключевое слово var перед секцией отсутствует, то это означает, что параметры передаются по значению. Отличия между этими двумя механизмами передачи параметров будут рассмотрены далее в п. 1.4.

Раздел описаний, расположенный внутри процедуры или функции, может содержать те же подразделы, что и раздел описаний основной программы (label, type, const, var), а также описания других подпрограмм. Описанные в этом разделе метки, типы, константы и переменные являются локальными: область их видимости ограничивается телом данной подпрограммы. Заметим, что метки, типы, константы и переменные, описанные в разделе описаний основной программы, являются глобальными: их можно использовать во всех расположенных ниже подпрограммах и основном блоке программы. В случае совпадения имен локальной и глобальной переменной будет использована локальная переменная.

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

имя_функции := результат;

В PascalABC.Net с этой целью вместо переменной имя_функции можно использовать специальную перемен-

ную Result.

Далее в качестве примера приведено описание функции Sum, которая имеет два формальных параметра a и b и возвращает результат сложения двух вещественных чисел:

function Sum(a,b: Real): Real; begin

Sum := a + b;{или Result:= a + b в PascalABC}

end;

109

1.3. Вызов подпрограммы из основной программы

Для вызова подпрограммы из основной программы (или другой подпрограммы) используется оператор вызова, имеющий следующий вид:

Имя_подпрограммы(список фактических параметров);

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

1.4. Передача параметров по ссылке и по значению

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

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

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

110

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]