|
Лекция
Двумерные и многомерные массивы
Организация данных в виде массивов помогает нам
решать многие задачи. Вот еще одна: разработать программу,
обслуживающую шахматный турнир.
Мы уже решали похожую "спортивную" задачу о конькобежных
соревнованиях. Теперь нужно понять, чем отличается от них
турнир по шахматам (с точки зрения организации данных). В
одиночных соревнованиях каждый участник имеет один результат,
поэтому данные о результатах соревнований удобно хранить в
знакомых нам массивах. Игровой турнир предполагает встречи
участников друг с другом, при этом каждый участник имеет
столько результатов, со сколькими соперниками он встречался.
Обычно результаты турниров заносятся в турнирные таблицы.
Средством обработки таких таблиц в языках программирования
служат двумерные массивы.
1. Описание двумерного массива
В языке паскаль описание двумерного массива
записывается так:
<Имя_массива>: array[<n1>..<n2>,<k1>..<k2>] of [<тип>]
где строки таблицы имеют номера с n1 по n2, а столбцы - с k1
по k2. Запись <Имя_массива>[n,k] указывает на элемент,
стоящий на пересечении n-й строки и k-го столбца. Например,
описание
Tab: array[1..10,1..15] of Integer
задает таблицу из 10 строк и 15 столбцов (всего 10 х 15 = 150
элементов), состоящую из целых чисел. Tab[3,5] указывает на
5-й элемент в 3-й строке.
2. Примеры программ с двумерными массивами.
Пр.1. Транспонировать массив A=(2 1 5)
(3 4 1)
Program Transp;
{const A:array [1..2,1..3] of integer=((2,1,5)(3,4,1));}
var
A:array [1..2,1..3] of integer;
At:array [1..3,1..2] of integer;
j,i:integer;
begin
writeln('Введите элементы массива после каждого нажимая "ввод" ');
for i:=1 to 2 do {колличество строк}
for j:=1 to 3 do {колличество столбцов}
begin
readln(a[i,j]);
At[j,i]:=a[i,j]; {транспонирование}
end;
{печать массива At}
writeln('Транспонированный массив');
for i:=1 to 3 do {колличество строк}
begin
wrireln;
for j:=1 to 2 do write(At[i,j]) {колличество столбцов}
end;
end.
Результат на экране:
2 3
1 4
5 1
Пр.2. Турнирную таблицу для N участников удобно хранить в
двумерном массиве N x N типа Real, т.к. результатом шахматной
партии для каждого участника может быть победа (1 очко),
поражение (0 очков) или ничья (0.5 очка). Вот описание
таблицы: Tab: array[1..N,1..N] of Real.
Для простоты не будем пока рассматривать фамилии
участников, а будем различать их по номерам. Вводить
результаты встреч будем в таком виде: номер первого
участника, номер второго участника, результат первого
участника (количество очков). Понятно, что одна встреча
приводит к заполнению сразу двух элементов таблицы. Так будет
выглядеть фрагмент программы, предназначенный для ввода
результата одной встречи:
writeln('Введите номера участников встречи');
readln(n1,n2);
writeln('Сколько очков у участника ',n1,'?');
readln(Tab[n1,n2]);
Tab[n2,n1]:= 1-Tab[n1,n2];
Эти действия нужно повторять столько раз, сколько
встреч состоится в турнире. Если все запланированные встречи
состоятся, то их количество можно сосчитать по формуле
n(n-1) - подумайте, почему. Однако, может случиться, что по
каким-то причинам часть встреч не состоится, а какие-то будут
сыграны дважды. Поэтому удобнее как-то обозначить окончание
ввода данных в программе, например, после каждой встречи
выяснять, будут ли еще вводиться данные. Вот фрагмент
программы, предназначенный для ввода результатов всех встреч
турнира:
kon:= 'Д';
while kon <> 'Н' do
begin
writeln('Введите номера участников встречи');
readln(n1,n2);
writeln('Сколько очков у участника ',n1,'?');
readln(Tab[n1,n2]);
Tab[n2,n1]:= 1-Tab[n1,n2];
writeln('Будут ли еще встречи? (Д/Н)');
readln(kon);
end;
5. По окончании турнира нужно вывести турнирную таблицу
на экран:
for i:= 1 to N do
begin
for k:= 1 to N do
write(Tab[i,k]:3:1);
writeln;
end;
6. Бывают задачи, в которых данные удобно хранить в виде
трехмерного (и даже четырех- и более -мерного) массива.
Например, результат встречи в футбольном турнире представляет
собой не одно, а три числа - количество забитых и пропущенных
мячей и количество очков (2 - победа, 0 - поражение, 1 -
ничья). Такую таблицу удобно заносить в массив
Football: array[1..N,1..N,1..3] of Integer;
Элемент Football[3,5,2] содержит информацию о количестве
мячей, пропущенных 3-й командой в матче с 5-й командой.
Поразмышляйте самостоятельно над процедурой ввода
результатов футбольного турнира.
Дата добавления: 2015-11-04; просмотров: 22 | Нарушение авторских прав
<== предыдущая лекция | | | следующая лекция ==> |
| | Special schools for special children |