- •Содержание
- •Раздел 2.Программирование на процедурном языке turbo pascal 3
- •Раздел 2.Программирование на процедурном языке turbo pascal Лабораторная работа №1. Знакомство с интегрированной средой Turbo Pascal 7.0. Разработка первой программы.
- •Лабораторная работа № 2. Разработка программ, реализующих линейный процесс в среде Turbo Pascal 7.0.
- •Лабораторная работа № 3. Разработка программы, включающей различные форматы ввода/вывода данных средствами языка Pascal.
- •Лабораторная работа № 4. Вычисление алгебраических выражений с использованием стандартных процедур и функций языка Pascal.
- •Лабораторная работа № 5. Разработка программы для решения текстовой задачи в среде Turbo Pascal 7.0.
- •Лабораторная работа № 6. Вычисление заданного выражения при произвольных значениях переменных с использованием нескольких окон на одном экране. Работа с цветом в текстовом режиме.
- •Лабораторная работа № 7. Использование языка программирования для разработки программ вычисления математических выражений с использованием оператора if.
- •If выражение then оператор1
- •Лабораторная работа № 8. Разработка программы для решения текстовых задач, содержащих ветвление
- •Лабораторная работа № 9. Использование языка программирования для реализации разветвляющихся алгоритмов с использованием выражения – селектора в среде Turbo Pascal 7.0.
- •Лабораторная работа № 10. Разработка программ для реализации простых циклических алгоритмов средствами языка Pascal.
- •Лабораторная работа № 11. Разработка программ, включающих алгоритмы работы с числом
- •Лабораторная работа № 12. Реализация задачи табулирования функции на заданном отрезке в среде Turbo Pascal.
- •Лабораторная работа № 13. Вычисление суммы бесконечного ряда с заданной степенью точности в среде Turbo Pascal.
- •Лабораторная работа № 14. Разработка программ, включающих циклический процесс средствами языка Turbo Pascal.
- •Лабораторная работа № 15. Разработка программы реализации текстовой задачи, содержащей условия и циклы.
- •Лабораторная работа № 16. Разработка программы реализации задачи, содержащей одномерный массив данных.
- •Лабораторная работа № 17. Разработка программы реализации задачи, содержащей двумерный массив данных.
- •Лабораторная работа № 18. Методы сортировки массива в среде Turbo Pascal
- •Лабораторная работа № 19. Разработка программы работы со строками в среде Turbo Pascal
Лабораторная работа № 16. Разработка программы реализации задачи, содержащей одномерный массив данных.
Цель работы:
закрепить теоретические знания о понятии «массив»
овладение навыками алгоритмизации структур, содержащих массивы
научиться использовать возможности языка программирования для реализации алгоритмов , содержащих одномерные массивы данных
закрепить практические навыки по составлению тестов и отладке программы
Оборудование:
программная часть – интегрированная среда Turbo Pascal 7.0
аппаратная часть - ПЭВМ IBM PC/XT
задание на выполнение работы в электронном варианте
Теоретическая часть
Если работа программы связана с хранением и обработкой большого количества однотипных переменных, для их представления в программе можно использовать массивы.
Например, пусть программа пользователя выполняет некоторые действия над последовательностью целых чисел, насчитывающей сто элементов i1, i2, ..., i100 которые требуется сохранить до конца ее работы. Вместо того чтобы описывать указанные переменные сто раз, можно один раз объявить целочисленную переменную i, состоящую из ста элементов, — массив.
Массив представляет собой совокупность данных одного типа с общим для всех элементов именем.
Элементы массива пронумерованы, и обратиться к каждому из них можно по номеру (или нескольким номерам — например, для элемента таблицы задается номер строки и столбца). Номера элементов массива иначе называются индексами, а сами элементы массива — переменными с индексами (индексированными переменными).
Обратите внимание — данные в массивах сохраняются, как и в случае использования обычных неиндексированных переменных, только до конца работы программы. Для их долговременного хранения программа должна записать данные в файл.
Характеристики массива:
тип — общий тип всех элементов массива;
размерность (ранг) — количество индексов массива;
диапазон изменения индекса (индексов) — определяет количество элементов в массиве.
Вектор (одномерный массив) — это пример массива, в котором элементы нумеруются одним индексом.
Если в массиве хранится таблица значений (матрица), то такой массив называется двумерным, его элементы нумеруются двумя индексами — номером строки и столбца соответственно. Массивы еще большей размерности (трехмерные, четырехмерные и т. д.) на практике встречаются довольно редко.
В качестве номера (индекса) элемента массива, в общем случае, используется выражение порядкового типа. Наиболее часто индекс — это целая константа или переменная типа integer, реже — типа char или boolean.
При обращении к элементу массива индекс указывается в квадратных скобках после имени массива. Например, а[3], Ь[1,2]. Однако использование элементов массива в качестве обычных переменных не дает существенной выгоды. Массивы ценны тем, что их индексы сами могут быть переменными или выражениями, обеспечивая доступ не к одному, а к последовательности элементов. Обработка массивов производится при изменении индексов элементов.
Например, в случае использования выражения следующие переменные удобно применять для просмотра в цикле элементов массива:
a[i] — всех элементов;
a[2*i] — элементов, стоящих на четных местах;
a[2*i-i] — элементов, стоящих на нечетных местах.
Описание массива в разделе VAR
Самый простой способ описания массива — это объявить переменную в разделе описания переменных var с использованием зарезервированного слова array (т. е. массив). В общем виде описание выглядит так:
• для одномерного массива:
var ИмяМассива: array[НижняяГраница.. ВерхняяГраница] of ТипЭлементов;
Например:
var a: array[1..100] of integer; { 100 элементов — целые числа }
b: array[0..50] of char; { 51 элемент — символы }
с: array[-3..4] of boolean; { 8 элементов — логические значения }
• для двумерного массива:
var
ИмяМассива: array[НижняяГраницаИндекс1.. ВерхняяГраницаИндекс1, НижняяГраницаИндекс2.. ВерхняяГраницаИндекс2] of ТипЭлементов;
Например, пусть в памяти компьютера расположена таблица чисел:
-
1
2
3
4
5
6
7
8
9
10
11
12
Каждое число в таблице имеет целочисленный тип (integer), это — тип элементов. Для адресации элементов таблицы требуется два индекса — номер строки и номер столбца (размерность массива равна двум). Индекс 1 в данном примере принимает значения от 1 до 3. Индекс 2 может меняться от 1 до 4. Нижняя граница индекса в описании массива отделяется от верхней двумя точками. Нижняя граница показывает наименьшее возможное значение индекса, верхняя — наибольшее. Очевидно, что нижняя граница не может превосходить верхнюю. Таким образом, описание двумерного массива у выглядит так:
var у: array[1..3,1..4] of integer;
Например, при необходимости подсчитать частоту появления в некотором тексте различных букв латинского алфавита, можно воспользоваться вектором счетчиков, индекс которого (латинские буквы) меняется от а до z, а элементы (целые числа) после подсчета указывают, сколько раз встречается в тексте данная буква.
var count: array ['a'..'z'] of integer;
Описание массива требуется компилятору для выделения памяти под его элементы.
Обратите внимание — при выполнении программы вовсе не обязательно заполнять все ячейки данными, т. е. реальное количество элементов в массиве может быть меньше, чем указано при описании, но ни в коем случае не должно быть больше.
При объявлении массива нельзя задавать границы индексов при помощи переменных. Память под массив выделяется компилятором до выполнения программы, а переменные получают значения только в ходе ее выполнения.
При описании массива удобно использовать предварительно определенные именованные константы (см. разд. 2.2.4), которые задают количество элементов. Употребление констант при описании массива предпочтительно, т. к. в случае изменения размеров массива не нужно будет вносить исправления по всему тексту программы, достаточно только один раз изменить значение именованной константы.
Например, опишем двумерный вещественный массив matrix с maxrow строк И maxcol столбцов:
const
maxrow=10; maxcol=15;
var
m,n: integer; { реальное количество строк и столбцов массива }
matrix: array [1..maxrow, 1..maxcol] of real;
Массив также можно описать как типизированную константу в разделе описания констант. Список значений элементов массива при этом заключается в круглые скобки.
Например:
const
х: array[1..5] of integer=(l,3,5,7,9);
у: array[1..2,1..3] of integer=((1,3,5), (2, 4,6));
В памяти компьютера будет расположена таблица чисел:
-
1
3
5
2
4
6
В этом примере не просто выделяется память под массив, а происходит заполнение ячеек заданными значениями по строкам.
Элементы такого массива можно изменять в ходе программы, как и любые другие типизированные константы.
Описание массива как типизированной константы используется на практике:
• для задания массивов с неизменными значениями элементов, например, массив из названий дней недели или количества дней в каждом месяце года;
• при отладке программы, чтобы каждый раз не заполнять массив "вручную" при запуске программы.
Помните:
• границы изменения индекса должны быть константами, причем очень удобно использовать именованные константы;
• нижняя граница индекса чаще всего равна 1, т. е. обычно элементы массива нумеруются, начиная с единицы. Иногда нумерация начинается с нуля.
Например,
var х: аггау[0. .5]of integer; — массив содержит 6 элементов, номера — с нулевого по пятый. Другие способы нумерации применяются редко;
• для ввода, вывода и обработки массивов удобно применять циклы, особенно удобен в этих случаях цикл for, т. к. номера элементов следуют по порядку друг за другом с единичным шагом.
Заполнение массива данными
Массив, описанный как типизированная константа, уже содержит данные.
Массивы, объявленные в разделе описания переменных, необходимо заполнить данными, прежде чем выполнять с ними какие-либо действия.
Значения элементов массива также можно задать следующими способами:
• при вводе данных с клавиатуры (см. листинг 4.1);
• с помощью датчика случайных чисел (см. листинг 4.2);
• присваиванием заданных значений;
• считывая значения элементов из файла.
В любом случае для заполнения массива используется цикл. Наиболее удобен цикл for, причем для многомерных массивов применяются вложенные циклы.
Например, "слепой", без использования комментариев, ввод с клавиатуры:
• вектора из 5 элементов:
for i:=l to 5 do readln(a[i]);
• матрицы размером 3x2 (всего потребуется ввести 6 чисел):
for i:=l to 3 do
for j :=1 to 2 do
readln(a[i,j]);
На практике ввод элементов массива обычно сопровождается выводом соответствующих поясняющих текстов.
Ввод данных с клавиатуры является основным, но не единственным способом заполнения массивов. Довольно часто массив заполняется при помощи присваивания элементам определенных или случайных значений.
Например, фрагмент программы заполнения одномерного массива х из n элементов случайными числами в диапазоне от 0 до 99 включительно выглядит так:
randomize; {инициализация датчика случайных чисел }
for i:=l to n do x[i]:=random(100);
Заполнение массивов случайными числами часто используется при математическом моделировании и в играх для создания "случайной" ситуации.
Нередко приходится заполнять массив нулевыми значениями — обнулять его.
Например, обнуление элементов двумерного массива а выглядит следующим образом:
for i:=l to n do
for j:=1 to m do
a[i, j]:=0;
Вывод значений элементов массива также выполняется в цикле for с использованием операторов write и writein.
Например, вывод вектора из 5 элементов:
• в столбец:
for i:=l to 5 do writein(a[i]);
• в одну строку, через пробел-разделитель:
for i:=l to 5 do write(a[i],' ');
• с заданием формата, где под каждый элемент отводится 4 позиции:
for i:=l to 5 do write(a[i] : 4) ;
Вывод матриц в стандартной форме записи — по строкам и столбцам — выполняется при помощи оператора writein; (без параметра). Он используется после вывода текущей строки матрицы для перевода курсора в начало следующей строки экрана:
for i:=l to n do
begin
for j:=1 to m do
write(a[i,j]:4) ;
writein;
end;
Часто требуется вычислить сумму элементов массива, их среднее арифметическое значение или найти значения и номера максимального и минимального элементов, а также изменить значения элементов массива и т. д. При этом для одномерного и двумерного массивов используются аналогичные алгоритмы, но в случае двумерного массива требуются вложенные циклы.
Действия с одномерными массивами
Условимся, что в векторе а содержится n элементов.
• Вычисление суммы элементов:
s:=0;
for i:=1 to n do s:=s+a[i]; { обычное накопление суммы в s }
• Вычисление произведения элементов:
s: =1;
for i:=l to n do s:=s*a[i]; { накопление произведения в s }
• Подсчет количества элементов, удовлетворяющих какому-либо условию. Например, подсчет количества четных чисел в целочисленном массиве:
k:=0;
for i:=l to n do
if a[i] mod 2=0 then k:=k+l; { увеличиваем на 1 счетчик четных чисел, если число делится на 2 }
• Поиск элемента с заданным значением. Найти элемент — это значит выяснить его номер в массиве.
i:=0; { номер элементов массива }
repeat
i:=i+l; until(a[i]=0) { нашли } or (i=n) { массив кончился };
if a[i]=0 then writeln('Номер первого нулевого элемента = ',i)
else writeln('Таких элементов нет');
• Поиск максимального элемента и его номера.
Переменная max хранит значение максимума, k — его номер в массиве:
max:=а[1]; к:=1; { поиск начинаем с первого элемента }
for i:=2 to n do { перебираем элементы, начиная со второго } if a[i]>max then
max:=a[i]; k:=i; { запоминаем значение и номер элемента, который больше всех предыдущих}
end;
Аналогично, при смене знака min>a[i] находится минимальный элемент min.
• Изменение значений элементов.
Например, пусть в массиве а хранятся зарплаты n сотрудников. Тем сотрудникам, у которых зарплата меньше минимально возможной суммы, поднимем зарплату до этого минимального значения minzp.
minzp:=3000;
for i:=l to n do
if minzp>a[i] then a[i]:=minzp;
Практическая часть
Пример:
Рассмотрим пример алгоритма, содержащего цикл с наперед известным количеством проходов (повторений). Алгоритм решает задачу накопления суммы положительных элементов одномерного массива Z длины N ( под длиной массива понимается количество его элементов ). Блок-схема алгоритма дана на рисунке ниже.
Циклический алгоритм
Вначале в блоке 2 производится ввод двух переменных N и Z. Первая из них представляет одну ячейку. В нее записывается одна константа – число, равное количеству элементов массива Z. Именно такое количество ячеек объединяет другая переменная – Z.
Следует подчеркнуть, что если бы ввод этих переменных в блоке 2 производился в противоположном порядке, то это привело бы к ошибке. Действительно, невозможно заполнить N ячеек массива Z, когда самое N еще не известно (оно будет введено позже Z). Далее в блоке 3 переменной S присвоено начальное значение 0. Это сделано для того, чтобы приготовить ячейку к дальнейшему накоплению необходимой суммы.
Блоки 4-6 представляет собой сам цикл, в котором накапливается сумма.
Вернемся к блок-схеме. Заголовок ее цикла представлен блоком 4. Роль счетчика цикла играет переменная i, которая должна в цикле изменяться от 1 до N. Поскольку шаг явно не указан, то по умолчанию он подразумевается равным 1. Тело цикла образуют блоки 5 и 6.
Сразу после входа в цикл переменная i примет начальное значение i = 1. Далее в блоке 5 выполняется проверка положительности первого элемента массива Z (т. к. i = 1). Если этот элемент действительно положителен, то в блоке б он будет добавлен к переменной S, после чего выполняется возврат к заголовку цикла. Если этот элемент не положителен (т. е. нуль или отрицательный), то будет выполнен переход сразу к заголовку цикла, минуя блок суммирования 6.
На втором круге цикла счетчик i в заголовке увеличится на 1 и станет равным 2. Теперь, при новом выполнении тела цикла, в блоке 5 проверяется на положительность второй элемент массива Z и, если он положителен, то добавляется в сумму и т. д. Последний раз тело цикла выполнится при i = N. При этом значении счетчика проверяется последний элемент массива. Наконец, в заголовке цикла i примет значение N+1. Это значение выходит за предписанный предел, следовательно, произойдет выход из цикла и управление перейдет блоку 7. В этом блоке выводится накопленная сумма и алгоритм закончит работу.
Задания для самостоятельного выполнения
Ознакомиться с теоретическими сведениями по теме «Массивы».
Составить программу для обработки одномерного массива в соответствии с вариантом задания, указанного в таблице.
Составить блок-схему решения задачи.
Разработать программу в среде Turbo Pascal 7.0.
Составить систему тестов и проверить работу программу на всех возможных значениях исходных данных.
Ответить на контрольные вопросы.
Результаты выполнения лабораторной работы оформить в виде отчета.
Индивидуальные задания:
Вариант |
Имя матрицы и размеры |
Действия |
Условия и ограничения |
1. |
X (100) |
Вычислить сумму и количество элементов массива Х, удовлетворяющих условию задачи. |
0 Xi 1 |
2. |
A (80) |
Вычислить среднее арифметическое значение элемента массива А. |
Ai 0 |
3. |
X(70) |
Переписать отрицательные элементы массива Х в массив Y и подсчитать их количество. |
-1 Xi 1 |
4. |
В (50) |
Определить максимальный элемент массива В и его порядковый номер. |
Xi>0 |
5. |
С (40) |
Вычислить минимальный элемент массива С и его номер. |
Xi<0 |
6. |
D(80) |
Найти максимальный и минимальный элементы массива D и поменять их местами. |
— |
7. |
Y(20) |
Вычислить среднее геометрическое элементов массива Y. |
Yi>o |
8. |
Z (30) |
Расположить в массиве R cначала положительные, а затем отрицательные элементы массива Z. |
— |
9. |
N (50) |
Определить сумму элементов массива N, кратных трем. |
ni/3*3=ni |
10. |
X(N) |
Вычислить сумму и количество элементов массива Х, удовлетворяющих условию задачи. |
Xi > 0, N 30 |
11. |
A (N) |
Заполнить одномерный массив элементами, отвечающими следующему соотношению: a1=1; a2=1; ai=ai-2+ai-1 (i = 3, 4, ..., n). |
Ai > 0, N 50 |
12. |
X(N) |
Переписать в массив Y подряд элементы массива Х, равные некоторому числу К. |
Xi > 0, N 40 |
13. |
X(N) |
Переписать подряд в массив Y положительные и в массив Z отрицательные элементы массива Х. |
N 40 |
14. |
T(N) |
Дан линейный массив целых чисел. Подсчитать, сколько в нем различных чисел. |
N<=20 |
15. |
V(15) |
Дано 15 целых чисел. Распечатать их в обратном порядке по 6 чисел в строке. |
— |
Контрольные вопросы
Что такое массив?
Что такое индекс?
Как объявляются массивы?
Как можно заполнить массив?
Каким образом можно вывести массив на экран?
В чем состоит особенность организации цикла при обработке массива?
Как найти минимальный элемент в массиве?
Как найти максимальный элемент в массиве?
Укажите особенности программ, использующих массивы.
