3.3 Таблицы и матрицы (большая вычислительная мощность)
Даже в небольших программах этот тип данных часто очень полезен.
Строго говоря, таблицы и матрицы — не отдельный тип данных, а особый способ организации данных, потому что данные в них относятся к уже рассмотренным типам: числовым и/или строковым. Таблицы и матрицы имеют схожую структуру.
Предположим, мы хотим хранить названия двенадцати месяцев года в какой-то переменной. Понятно, что для хранения названий месяцев переменные должны быть строковыми.
Не лучшей идеей будет хранить эти названия в отдельных строковых переменных — всего 12 переменных, по одной на месяц:
Код: Выделить всё
Mes1$ = "enero"
Mes2$ = "febrero"
...
Mes12$ = "diciembre"
Это не вызовет ошибки, но будет очень громоздко.
Гораздо лучше объявить строковую переменную-таблицу:
Эта инструкция
DIM задаёт размер переменной Mes$ (со знаком доллара — строковая) в 12 элементов, то есть 12 переменных с одним именем. Как обратиться к каждой?
Ответ: с помощью индекса — числа в скобках.
Разумеется, прежде чем обращаться к элементам, нужно заполнить таблицу названиями месяцев, иначе в каждом элементе будет пустая строка "":
Код: Выделить всё
Mes$(1) = "enero"
Mes$(2) = "febrero"
...
Mes$(12) = "diciembre"
Теперь у нас есть большое преимущество: достаточно числа от 1 до 12, чтобы связать номер месяца (1–12) с его названием, благодаря нумерованной таблице.
Такой тип данных (таблица) экономит массу работы, а при использовании циклов (мы их рассмотрим) вычислительная мощность значительно возрастает. В этом примере всего 12 элементов, но можно сделать таблицу на 25 000 элементов, например с названиями астероидов.
Рассмотренный пример — одномерная таблица: индекс от 1 до 12 для месяца. Но можно сделать таблицу для месяцев с двумя измерениями:
Теперь для каждого элемента от 1 до 12 есть 31 элемент — дни. Эта двумерная таблица содержит уже не 12, а 12 × 31 = 372 элемента. Мы знаем, что не во всех месяцах 31 день. Ничего страшного: несуществующие дни просто игнорируются, соответствующие ячейки не используются. Так мы охватим все 365 дней года.
Я не забыл убрать $ из имени Mes, потому что теперь хочу, чтобы таблица была числовой.
Что можно хранить в каждом элементе такой таблицы? Например, количество осадков в литрах на квадратный метр для определённой зоны в этот день и месяц.
Чтобы обратиться к осадкам за 17 апреля, используем индексы Mes(4,17), а за 8 августа — Mes(8,8).
А если нужно хранить эту информацию для 250 населённых пунктов?
Добавим ещё одно измерение:
Пожалуй, теперь такую таблицу лучше назвать Lluvia (осадки), так как именно эти данные она содержит:
Теперь у таблицы внушительные размеры. Каждое длинное целое, как мы видели, занимает 4 байта, а в таблице 12 × 31 × 250 элементов, по 4 байта каждый = 372 000 байт, то есть примерно 363 Кбайт памяти.
Этим 250 населённым пунктам нужно присвоить коды от 1 до 250. Допустим, мы хотим узнать осадки за 25 марта в посёлке «Вильяконехос-де-Арриба», имеющем (предположим) код 197. Обращение к элементу таблицы будет таким:
С тремя индексами и циклами потенциал обработки больших объёмов информации растёт экспоненциально. Если добавить обработку этих данных и наглядное представление на бумаге или экране, становится понятна привлекательность информатики.
Такие таблицы можно воспринимать как электронные таблицы: одно измерение — строки, другое — столбцы, третье — листы, наложенные друг на друга.
Нет никаких препятствий для создания таблиц или матриц с 4 и более измерениями; ограничивает только память. Действительно стоит знать и уметь использовать эти простые, но мощные структуры данных.
В предыдущей трёхмерной таблице видно, что такой тип переменной не просто облегчает работу — без него программирование было бы почти невозможным или крайне утомительным. Мы видели, что таблица содержит 12 × 31 × 250 = 93 000 переменных. Представьте, каково было бы инициализировать нулями все 93 000 переменных одну за другой — пришлось бы написать 93 000 инструкций вида:
Код: Выделить всё
Lluvia(1,1,1) = 0
Lluvia(1,1,2) = 0
...
Lluvia(12,31,250) = 0
Вместо этого с помощью таблицы и трёх вложенных циклов те же 93 000 присваиваний делаются всего в семь строк:
Код: Выделить всё
For Mes = 1 To 12
For Dia = 1 To 31
For Poblacion = 1 To 250
Lluvia(Mes,Dia,Poblacion) = 0
Next Poblacion
Next Dia
Next Mes