Загрузил zapric

Лабораторная работа №3 Работа с массивами

реклама
Лабораторная работа №3 «Работа с массивами. Обработка одномерных и
двумерных массивов. Использование стандартных функций для работы с
массивами»
Цель работы: сформировать умения по использованию процедурного языка
программирования для построения логически правильных и эффективных программ с
использованием одномерных массивов.
Оборудование, технические и программные средства: персональный
компьютер, система программирования PascalABC.NET.
Теоретические сведения
Массивы являются представителями структурированных типов данных, то есть
таких, переменные которых составлены из более простых элементов согласно
определённому порядку. Константы и переменные структурированных типов позволяют
хранить не одно, а несколько значений, представленных в некоторой структуре.
Массивом называется упорядоченная совокупность элементов одного типа данных.
Различают одномерные массивы и массивы большей размерности (двумерные,
трехмерные и так далее).
Одномерный массив подобен вектору-строке, в которой содержатся значения
одного определенного типа. Для упорядочения элементов массива каждый из них имеет
индекс (упрощенно, порядковый номер). В качестве индексов могут быть использованы
данные любого типа, имеющего внутренний порядок. На практике в качестве индексного
чаще всего используется тип-диапазон, состоящий из целых чисел. Тип-диапазон
записывается следующим образом:
[<нижний индекс> .. <верхний индекс>]
Например, запись [1..10] означает, что индексы элементов массива изменяются от 1
до 10. Нижний индекс не обязательно должен быть равен 1, но практически это наиболее
удобно (в этом случае верхний индекс совпадает с размером массива).
Нумеровать элементы массивов можно не только от единицы, но и от любого
целого числа. Вообще для индексов массивов подходит любой порядковый тип, то есть
такой, который в памяти машины представляется целым числом. Единственное
ограничение состоит в том, что размер массива не должен превышать 64 Кб.
Одномерный массив представляется в программе собственным идентификатором и
должен быть описан как массив-переменная или массив-константа.
Для описания одномерного массива-переменной используется следующая запись:
var
<имя массива>: array [<нижний индекс>..<верхний индекс>] of <тип элементов>;
Например, для описания одномерного массива-переменной с именем m,
состоящего из 10 целых чисел, необходимо сделать следующую запись:
var
m: array [1..10] of integer;
Описание одномерного массива-константы производится аналогично, но с
добавлением значений всех элементов:
const
<имя массива>: array [<нижний индекс>..<верхний индекс>] of <тип элементов> =
(<значение первого элемента>, ..., <значение последнего элемента>);
Например:
const
m: array [1..5] of byte = (33, 44, 11, 55, 22);
Для доступа к элементам одномерного массива в программе используется
следующая запись:
<имя массива>[<индекс элемента>]
Например:
M[5]:=15;
a:=M[1]+14;
Любая программа с массивом имеет, как правило следующую структуру:
1. Описание массива и других переменных;
2. Заполнение массива данными (с клавиатуры, ДСЧ (датчиком случайных чисел),
из файла);
3. Решение поставленных задач (обработка массива);
4. Вывод полученных результатов.
Двумерный массив подобен матрице, то есть состоит из столбцов и строк. Для
обращения к элементам таких массивов используется два индекса — индекс строки и
индекс столбца. Соответственно при описании двумерных массивов указывается два
диапазона изменения индексов. Если число строк матрицы совпадает с числом её
столбцов, то матрица называется квадратной. Про матрицу, имеющую n строк и m
столбцов, говорят, что она имеет размер n*m.
Описание двумерного массива-переменной будет выглядеть следующим образом:
var
<имя массива>: array [<нижний индекс строк>..<верхний индекс строк>,<нижний
индекс столбцов>..<верхний индекс столбцов>] of <тип элементов>;
Например:
var
M: array [1..5,1..4] of real;
Описание двумерного массива-константы выглядит так:
const
<имя массива>: array [<нижний индекс строк>..<верхний индекс строк>,<нижний
индекс столбцов>..<верхний индекс столбцов>] of <тип элементов>=((элементы первой
строки), ..., (элементы последней строки));
Например:
const
M: array [1..2, 1..3] of integer = ((4, -3, 6), (0, -5, 3));
Для обращения к элементу двумерного массива используется следующая запись:
<имя массива>[<индекс строки>,<индекс столбца>]
Например:
M[1,3]
При решении задач с использованием двумерных массивов во всех случаях
организуются вложенные циклы. Вложенные циклы- это циклы, содержащие внутри себя
один или несколько других циклов.
Как правило, ввод, обработка и вывод массива осуществляются поэлементно, с
использованием цикла с параметром. Простейший способ ввода ‒ ввод массива с
клавиатуры.
Над массивами нельзя выполнять арифметические действия (вычитать, складывать
и др.). Все действия выполняются поэлементно.
Порядок выполнения работы
Задание 1.
В системе программирования PascalABC.Net составьте программу по заданию.
Протестируйте работу программы. Выполните задания на модификацию созданной
программы.
Методические указания по выполнению задания:
1. Запустите систему программирования PascalABC.Net.
2. В папке своей группы на диске создайте папку Array1, в дальнейшем все
программы необходимо сохранять в эту папку.
3. На языке программирования PascalABC.Net составьте программу, которая
находит сумму 30 целых чисел. Сохраните файл под именем Zad1.pas.
Одномерный массив – это фиксированное количество элементов одного и того же
типа, объединенных одним именем, где каждый элемент имеет свой номер. Обращение к
элементам массива осуществляется с помощью указания имени массива и номеров
элементов. Нам для работы требуется массив из 30 целых чисел.
Опишем в разделе описания типов свой тип – одномерный массив, состоящий из 30
целых чисел (рисунок 3.1).
Рисунок 3.1 – Описание типа одномерного массива
Напомним, что раздел типов начинается со служебного слова Туре, после этого
идет имя нового типа и его описание. Между именем типа и его описанием ставится знак
«равно». В нашем случае MyArray – имя нового типа данных; Array – служебное слово (в
переводе с английского означает «массив», «набор»); [1..30] – в квадратных скобках
указывается номер первого элемента, затем, после двух точек, номер последнего элемента
массива; Of – служебное слово (в переводе с английского «из»); Integer – тип элементов
массива.
Далее необходимо заполнить наш массив числами, для этого необходимо
воспользоваться циклической конструкцией следующего вида (рисунок 3.2):
Рисунок 3.2 – Цикл для заполнения массива
В данном случае числа вводятся пользователем с клавиатуры.
Далее необходимо воспользоваться циклом для определения суммы чисел (рисунок
3.3):
Рисунок 3.3 – Цикл для вычисления суммы
Тогда решение данной задачи с использованием массива имеет вид:
Рисунок 3.4 – Текст программы для нахождения суммы 30 целых чисел
4. Проверьте правильность работы программы.
5. Измените программу так, чтобы определялась сумма элементов массива,
кратных заданному числу.
Сохраните полученную программу в папке Array1 под именем Zad2.pas.
Решение задачи изменится незначительным образом (рисунок 3.5). Добавляется
описание еще одной переменной для хранения значения числа, на кратность которому
проверяются значения элементов массива.
Появляются операторы:
и изменяется оператор из тела цикла:
Рисунок 3.5 – Строки программы с изменениями
6. Измените программу так, чтобы определялось количество положительных и
отрицательных элементов в данном массиве. Сохраните полученную программу в папке
Array1 под именем Zad3.pas.
Суть основного изменения программы заключается во введении двух переменных
(счетчиков – pos, neg) для хранения значений количества положительных и
отрицательных элементов в массиве (рисунок 3.6).
Рисунок 3.6 – Введение переменных pos, neg
Добавьте в программу следующие строки программного кода (рисунок 3.7):
Рисунок 3.7 – Добавление строк программного кода
7. Измените программу так, чтобы в массив В записывались номера четных
элементов массива А.
Сохраните полученную программу в папке Array1 под именем Zad4.pas.
Введение массива В и работа с ним требует введения переменной j для обращения
к элементам В. Суть решения заключается в просмотре элементов массива А, выявлении
четных элементов и записи их номеров по текущему значению переменной j в массив В.
Решение данной задачи имеет следующий вид, представленный на рисунке 3.8.
Рисунок 3.8 – Текст программы, где в массив В записываются номера четных
элементов массива А.
8. Выполните команду Файл – Новый и составьте программу нахождения
значения и номера всех отрицательных элементов (рисунок 3.9). Сохраните полученную
программу в папке Array1 под именем Zad5.pas.
Рисунок 3.9 – Текст программы
9. Текст программы поиска номеров всех отрицательных элементов в массиве
содержит строки: For i:=1 To n do Измените во второй строке n на n+1 и поставьте перед
текстом программы директиву компилятора {$R+}. Директивы компилятора управляют
режимом компиляции. Директива начинается с символа $ после открывающей скобки
комментария, за которым следует имя директивы (состоящее из одной или нескольких
букв), определяющее ее назначение. Контроль вхождения в диапазон осуществляется с
помощью директивы {$R+} ({$R-}), при этом устанавливается или отменяется генерация
кода контроля вхождения в диапазон. В режиме {$R+} все индексы массивов и строк
контролируются на выход за границы, а все присваивания значений скалярных
переменных и ограниченных типов проверяются на вхождение в диапазон. При выходе за
границы выполнение программы прекращается и выдается сообщение об ошибке.
10. Запустите программу на исполнение. При запуске программы появится ошибка
времени выполнения: Индекс выходит за границы массива. Она является сообщением о
том, что значение переменной i (индекс массива А) вышло за допустимый предел, т.е. за
значение константы n.
11. Формирование значений элементов массива путем ввода их с клавиатуры –
достаточно утомительное занятие. Используйте для этих целей генератор случайных
чисел - Random. Данная функция возвращает случайное число. Выполните команду Файл
– Новый и составьте программу для заполнения массива случайными числами (рисунок
3.10). Сохраните полученную программу в папке Array1 под именем Zad6.pas.
Рисунок 3.10 – Текст программы для заполнения массива случайными числами
12. Запустите несколько раз программу. На экране мы видим одну и ту же
последовательность чисел в диапазоне от 0 до 20.
13. Уберите фигурные скобки у -10 и снова запустите несколько раз программу.
Последовательность чисел на экране одна и та же, но числа из интервала от -10 до
10. Объясните этот факт.
Получите числа из интервала от -17 до 25.
14. Уберите фигурные скобки у процедуры Randomize. Повторите многократный
запуск программы.
Последовательности чисел на экране разные. В чем дело? Наш черный ящик,
функция Random, начинает генерировать в первом случае числа (каким-то неизвестным
нам образом) от фиксированного начального числа. Во втором случае эти начальные
числа меняются от запуска к запуску (процедурой Randomize) и последовательности
получаются разные.
Задание 2.
Используя встроенный задачник системы программирования PascalABC.NET,
выполните решение задач Array4, Array7.
Методические указания по выполнению задания:
1. Создайте новое окно, выполнив команду Файл – Новый.
2. Откройте встроенный задачник системы программирования PascalABC.NET,
для этого выполните команду Модули – Просмотреть задания. В диалоговом окне
Просмотр учебных заданий в поле группа заданий выберите Array, а в поле номер
задания задайте необходимый номер задания и нажмите кнопку Просмотр.
3. Решите данную задачу, используя систему программирования PascalABC.NET,
для этого перейдите в систему программирования PascalABC и выполните команду
Модули – Создать шаблон программы. В окне Загрузка учебного задания в поле
Задание введите Array4 (Array7) и нажмите кнопку Загрузка. После этого в системе
программирования PascalABC загрузится шаблон программы, где указан модуль
подключения задачника и название задачи, которую мы решаем.
4. Просмотрите еще раз решение задачи, для этого выполните команду
Программы – Выполнить или нажмите соответствующую кнопку на панели
инструментов.
5. В разделе описания переменных var выполните описание переменных в
соответствии с условием задачи.
6. Составьте программу для решения задачи и выполните её тестирование. При
необходимости исправьте ошибки. Чтобы задание считалось выполненным, запустите
программу необходимое количество раз.
7. Сохраните созданные программы в папке Array1.
Задание 3.
Используя систему программирования PascalABC.NET, вывести элементы массива
на экран в обратном порядке.
Задание 4.
Исходные данные:
Дана квадратная матрица размера n. Найти максимальный элемент побочной
диагонали этой матрицы.
Решение:
1. Алгоритм задачи:
а) для ввода элементов матрицы организуем цикл с параметром i=1 до n, в котором
будет вложенный цикл j = 1 до n;
б) побочная диагональ состоит из элементов: в первой строке – это последний (n)
элемент, во второй – предпоследний (n – 1), в третьей – (n – 2), в i-той – (n – i + 1);
в) для нахождения максимального элемента заданного диапазона надо сравнивать
каждый его элемент с предыдущим максимальным значением, поэтому для начала
сравнения необходимо присвоить начальное значение max.
Получим алгоритм представленый на рисунке 3.11:
1. Начало;
2. Ввод (N);
3. Для I = 1 до N выполнить
нц
Для J = 1 до N выполнить
Ввод (A[I, J]);
кц
4. Max=0;
5. Для I = 1 до N выполнить
Если A[I, N–I+1]> Max то
Max = A[I, N–I+1];
6. Вывод (Max);
7. Конец.
Рисунок 3.11 - Алгоритм решения задачи в графическом и словесно-формульном
виде
2. Программа на языке Паскаль:
3. Программный код для запуска (рисунок 3.12)
4. Тестирование программы с различными данными (рисунок 3.13)
Рисунок 3.12 – Текст программы
Рисунок 3.13 – Тестирование программы
6 Программа выдает верное значение, но Паскаль не работает с динамическими
массивами, поэтому размер массива не должен превышать 20 элементов если
пользователь ввел число, большее 20, программа предлагает повторить ввод.
Задания к лабораторной работе: Выберите задание из предложенного списка в
соответствии с Вашим порядковым номером в журнале.
1. Даны целые положительные числа m и n. Сформировать целочисленную матрицу
размера m×n, у которой все элементы i-той строки имеют значения 10i (i=1,2…m)
2. Даны целые положительные числа m и n. Сформировать целочисленную матрицу
размера m×n, у которой все элементы j-того столбца имеют значения 5j (j=1,2…n)
3. Даны целые положительные числа m и n. Сформировать целочисленную матрицу
размера m×n, у которой все элементы имеют значения i+j (i=1,2…m; j=1,2…n)
4. Даны целые положительные числа m и n. Сформировать целочисленную матрицу
размера m×n, у которой все элементы имеют значения i‒j (i=1,2…m; j=1,2…n)
5. Дана матрица размера m×n и целое положительное число k (1<k<m). Вывести
элементы k-той строки этой матрицы
6. Дана матрица размера m×n и целое положительное число k (1<k<n). Вывести
элементы k-того столбца этой матрицы
7. Дана матрица размера m×n и целое положительное число k (1<k<n). Вывести
элементы k-того столбца этой матрицы
8. Даны целые положительные числа m, n и k. Сформировать целочисленную
матрицу размера m×n, у которой все элементы имеют значения k+i+j (i=1,2…m; j=1,2…n)
9. Даны целые положительные числа m, n и k. Сформировать целочисленную
матрицу размера m×n, у которой все элементы имеют значения k‒(i+j) (i=1,2…m;
j=1,2…n)
10. Дана матрица размера m×n. Вывести элементы этой матрицы, расположенные в
строках с четными номерами. Вывод производить по строкам.
11. Дана матрица размера m×n. Вывести элементы этой матрицы, расположенные в
строках с нечетными номерами. Вывод производить по строкам.
12. Дана матрица размера m×n. Вывести элементы этой матрицы, расположенные в
столбцах с четными номерами. Вывод производить по столбцам.
13. Дана матрица размера m×n. Вывести элементы этой матрицы, расположенные в
столбцах с нечетными номерами. Вывод производить по столбцам.
14. Дана квадратная матрица размера n. Вывести элементы главной диагонали этой
матрицы.
15. Дана квадратная матрица размера n. Вывести элементы побочной диагонали
этой матрицы.
16. Дана матрица размера m×n. Заменить отрицательные элементы этой матрицы на
1 и вывести полученную матрицу по строкам.
17. Дана матрица размера m×n. Заменить значения отрицательных элементов этой
матрицы на противоположные им значения и вывести полученную матрицу по строкам.
18. Дана матрица размера m×n. Заменить отрицательные элементы этой матрицы на
0, а положительные на 1 и вывести полученную матрицу по строкам.
19. Дана квадратная матрица размера n. Найти сумму элементов главной диагонали
этой матрицы.
20. Дана квадратная матрица размера n. Найти сумму элементов побочной
диагонали этой матрицы.
21. Дана матрица размера m×n. Заменить каждый элемент этой матрицы на 1‒этот
элемент и вывести полученную матрицу по строкам.
22. Дана матрица размера m×n. Для каждой строки найти сумму ее элементов.
23. Дана матрица размера m×n. Для каждого столбца найти сумму его элементов.
24. Дана матрица размера m×n. Для каждой строки найти произведение ее
элементов.
25. Дана матрица размера m×n. Для каждого столбца найти произведение его
элементов.
26. Дана матрица размера m×n. Для каждой строки найти ее минимальный элемент.
27. Дана матрица размера m×n. Для каждого столбца найти его минимальный
элемент.
28. Дана матрица размера m×n. Для каждой строки найти ее максимальный
элемент.
29. Дана матрица размера m×n. Для каждого столбца найти его максимальный
элемент.
30. Дана матрица размера m×n. Найти ее максимальный элемент.
Проверьте файлы, которые были сохранены в папку Array2 в процессе выполнения
практической работы. Заархивируйте папку с помощью программы архиватора,
установленной на ваш компьютер. Передайте полученный архив преподавателю на
проверку.
Контрольные вопросы:
1. Дайте определение массива.
2. Какие типы недопустимы для компонентов массива? Почему?
3. В каком разделе программы надо написать описание данных?
4. Как определяется общее число элементов массива?
5. Что такое индекс? Какие типы данных используется в качестве индекса?
6. Какой массив называется одномерным?
7. Существует ли ограничения на размерность массива?
8. Какой массив называется двумерным?
9. Верно ли, что двумерный массив соответствует понятию прямоугольной
таблицы (матрице)?
10. Верно ли, что двумерные массивы располагаются в памяти таким образом, что
второй индекс изменяется быстрее, чем первый?
11. Как осуществляется доступ каждому элементу двумерного массива?
Скачать