Практическое занятие №21 (1И)
Тема: Анализ типовых алгоритмов обработки чисел, числовых последовательностей и массивов
Цель работы: овладеть основными приемами работы с одномерными и двумерными массивами, уметь различать в двумерном массиве обработку строк и столбцов, а также отличать нахождение первых и последних элементов последовательности, обладающих некоторым свойством
Оборудование: персональный компьютер, подключение к интернету.
Теоретические сведения
Общие сведения
Скалярный тип – простой тип данных. Скалярное данное неделимо. Массив – это структурированный тип данных. Массив состоит из нескольких элементов. Ко всему массиву можно обращаться по его имени. Можно обращаться к его элементу, но для этого надо задать индекс (индексы). Массивы бывают одномерные и многомерные. Для объявления массива необходимо задать типы его индексов и компонент:
ARRAY [Тип индексов] OF ;
Тип компонент массива – это просто тип данных, ассоциированный с каждой компонентой массива. Тип компонент может быть любым REAL, INTEGER, CHAR, BOOLEAN, перечислимым, интервальным. В качестве компоненты массива может быть взят и тип массив.
Тип индекса должен быть одним из упорядоченных типов, т.е. любым скалярным типом, кроме REAL: INTEGER, CHAR, интервальный, перечислимый. Тип индекса определяет границы изменения индекса. Если сделана попытка использовать несуществующую компоненту, то возникает ошибка (ошибка неверного индекса).
Одномерные массивы
Одномерный массив можно задать (объявить) двумя способами:
1. C помощью служебного слова TYPE описывается тип массива, а затем с помощью VAR вводится переменная этого типа.
Общая форма записи
TYPE = ARRAY [тип индекса] OF ;
VAR : ;
2. С помощью слова VAR сразу описывается переменная типа массив.
Общая форма записи
VAR : ARRAY [тип индекса] OF ;
Например, объявление массива из 100 элементов типа REAL можно осуществить двумя способами:
1. type R100 = array [1..100] of real;
var A: R100;
2. var A: array [1..100] of real.
Здесь задан массив с именем А, и его элементы имеют имена: А[1],…,A[100]. Чаще всего для типа индекса используют интервальный тип на основе типов INTEGER и CHAR. Однако можно в качестве индексов брать перечислимый тип.
П р и м е р 1. Подсчет числа вхождений букв в текст определенной длины.
program COUNTER;
var COUNT: array ['a'..'z'] of integer;
CH: char; N: integer;
begin
for CH := 'a' to 'z' do
COUNT [CH] := 0; N := 0;
repeat
read (CH); N := N + 1;
if (CH = 'a') and (CH
COUNT [CH] := COUNT [CH] + 1;
until CH = '.';
for CH := 'a' to 'z' do
writeln (CH, COUNT [CH]:5);
end.
Пояснение. В этом примере тип индекса есть интервальный тип на базе типа CHAR, а тип компонент есть целое число. Таким образом, элементы массива – числа, а их индексы – буквы, т.е. число элементов массива равно 26 (по числу букв латинского алфавита).
Рассмотрим теперь случай, когда тип индекса задан перечислимым типом, а компоненты массива представлены компонентами интервального типа на базе типа INTEGER.
П р и м е р 2. Присваивание переменной с именем месяца числа дней этого месяца.
program NUMBRDAY;
type MONAT = (JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG,
SEP, OKT, NOV, DEC);
var DAY : array [MONAT] of 28..31; T : MONAT;
begin
for T := JAN to DEC do
case T of
JAN, MAR, MAY, JUL, AUG, OKT, DEC: DAY [T] := 31;
APR, JUN, SEP, NOV: DAY [T] := 30;
FEB : DAY [T] := 28;
end;
end.
Многомерные массивы
Для определения позиции элемента в двумерном массиве необходимы два индекса. Любой двумерный массив есть матрица, а матрица есть таблица. Поэтому удобно описывать двумерные массивы путем указания границ изменения индексов (номеров) строк и столбцов.
Например, таблица символов M × N, где M – число строк и N – число столбцов, может быть описана:
var TAB : array [1..M, 1..N] of char;
| Общая форма записи VAR : ARRAY [тип индекса строки, тип индекса столбца] OF ; |
Однако двумерный массив можно интерпретировать как вектор-столбец, каждый элемент которого, в свою очередь, является одномерным массивом (вектор-строка). Этот подход к определению двумерного массива влечет его описание с помощью двух строк, где первая содержит описание строки, а вторая – описание столбца:
type LINE = array [1..N] of char;
STOLB = array [1..M] of LINE;
var TAB : STOLB.
Здесь TAB [I] – переменная типа LINE, а TAB [I][J] – переменная типа CHAR.
| Общая форма записи TYPE = ARRAY [тип индекса] OF ; = ARRAY [тип индекса] OF ; VAR : ; |
Эти два вида определения массивов задают и два способа обращения к элементам массива: TAB [I, J] – в первом случае и TAB [I][J] – во втором. Вполне очевидно, что сказанное выше для двумерного массива распространяется и на массивы большей размерности. Например, описание VAR CUBE : ARRAY [1..M, 1..N, 1..K] OF INTEGER определяет задание трехмерного массива целых чисел.
Примеры работы с массивами
Обработка массивов включает в себя, как правило, следующие компоненты: ввод массива (с клавиатуры или с помощью датчика случайных чисел), вывод полученного массива на экран и собственно его обработка. Все эти компоненты рекомендуется оформлять в виде отдельных процедур. При этом надо учитывать следующий фактор: если процедуре (или функции) будет передаваться массив, то надо объявить в ней этот массив как параметр с атрибутом VAR даже в том случае, если значение массива внутри процедуры не изменяется. Это нужно для того, чтобы не тратить времени и памяти на размещение внутри процедуры копии массива. Заметим, что параметр обязательно должен относиться к типу, имеющему имя.
П р и м е р. Сумма элементов таблицы над верхней диагональю.
program SUMMA;
const M = 10; {число строк таблицы}
N = 10; {число столбцов таблицы}
type LINE = array [1..n] of integer;
TAB = array [1..m] of LINE;
var s, i, j:integer; MAS: TAB;
procedure VVODMASSIV (var MAS: TAB);
begin
for i := 1 to M do
for j := 1 to N do
readln (MAS [i][j]);
end;
procedure VIVODMASSIV (var MAS:TAB);
begin
for i := 1 to M do
begin
for j := 1 to N do
write (MAS [i][j]:4,' '); writeln;
end;
end;
procedure OBRABOTKA (MAS: TAB; var SUM: integer);
begin
SUM := 0;
for i := 1 to M do
for j := 1 to N do
if j i then SUM := SUM + MAS [i][j];
end;
begin
VVODMASSIV (MAS);
writeln ('исходный массив'); VIVODMASSIV (MAS);
OBRABOTKA (MAS, s); writeln;
writeln ('сумма элементов = ',s);
end.
Табличное представление информации одно из самых распространенных, поэтому массивы широко применяются в прикладных программах.
Порядок выполнения работы
Задание 1. Составить программу, позволяющую в одномерном массиве, состоящем из N вещественных элементов, вычислить сумму положительных элементов.
Задание 2. В двумерном массиве, состоящем из целочисленных элементов, в каждом столбце поменять местами наибольший по модулю и последний не принадлежащий интервалу (a, b) элементы массива.
Контрольные вопросы
1. Как описываются в языке Паскаль одномерный и двумерные массивы?
2. Может ли массив содержать разнотипные данные?
3. В каком порядке указываются индексы при обращении к элементам двумерного массива?