Учебный центр "ANIT Texno Inform"
Опубликован: 25.06.2014 | Доступ: свободный | Студентов: 2595 / 849 | Длительность: 24:39:00
Специальности: Программист
Лекция 12:

Массивы простые, многомерные и динамические

< Лекция 11 || Лекция 12: 123 || Лекция 13 >

Многомерный массив

Массивы, которые мы до сих пор разбирали, были одномерными - визуально их можно представить, как цепочку ячеек или одну строку таблицы. Однако бывают ситуации, когда этого недостаточно. Допустим, нужно сохранить какую-то таблицу. Одномерный массив с такой задачей не справится. Для этого существуют многомерные массивы, которые имеют размерность от двух и больше. Например, объявить двухмерные массивы из 5 строк и 10 колонок можно следующим образом:

var
   a: array[1..5, 1..10] of string;
   b: array[0..4, 0..9] of integer;
    

То есть, в квадратных скобках через запятую указывается диапазон вначале строк, а затем колонок. Визуально, такой массив можно было бы представить так:

Таблица 13.1. Представление двухмерного массива a
1,1 1,2 1,3 1,4 1,5 1,6 1,7 1,8 1,9 1,10
2,1 2,2 2,3 2,4 2,5 2,6 2,7 2,8 2,9 2,10
3,1 3,2 3,3 3,4 3,5 3,6 3,7 3,8 3,9 3,10
4,1 4,2 4,3 4,4 4,5 4,6 4,7 4,8 4,9 4,10
5,1 5,2 5,3 5,4 5,5 5,6 5,7 5,8 5,9 5,10

Обратиться к отдельному элементу массива можно двумя способами:

a[2, 9]:= 'Строка 1';  //1-й способ
a[3][10]:= 'Строка 2';  //2-й способ
    

В первом случае мы обращаемся к элементу во второй строке, девятой колонке. Во втором - к третьей строке, десятой колонке. Первый способ обращения к элементу кажется компактней, его мы и будем использовать впредь.

Доработаем наш проект. Что, если мы будем конвертировать нашу температуру не только в Фаренгейты, но и в Кельвины (единица термодинамической температуры в СИ - Международной Системе Единиц)? Пересчет Цельсия в Кельвины еще проще, чем в Фаренгейты: нужно к температуре по Цельсию прибавить 273,15. Для этого нам потребуется вместо одномерного массива объявить двухмерный. Измените код над служебным словом implementation:

atemp: array[1..2, -100..200] of real;
    

В первой строке у нас будут Фаренгейты, во второй - Кельвины. А колонки мы отведем под требуемый диапазон. Далее, нам потребуется изменить цикл в событии OnCreate формы:

procedure TfMain.FormCreate(Sender: TObject);
var
  i: smallint;
begin
  for i:= -100 to 200 do begin
    atemp[1, i]:= i * 9/5 + 32;  //Фаренгейты
    atemp[2, i]:= i + 273.15;  //Кельвины
  end;
end;
    

Обратите внимание: поскольку нам в цикле требуется выполнить не один оператор, а два, нам пришлось заключить их в программные скобки begin…end, сделав составной оператор. Далее, все просто: для строки 1 нашего массива мы рассчитываем Фаренгейты, как в прошлый раз. А для строки 2 уже Кельвины.

Но нам потребуется переделать и событие кнопки OnClick:

procedure TfMain.Button1Click(Sender: TObject);
begin
  ShowMessage(SE1.Text + ' Цельсия будет равно:' + #13 +
              FloatToStr(atemp[1, SE1.Value]) + ' Фаренгейта' + #13 +
              FloatToStr(atemp[2, SE1.Value]) + ' Кельвина');
end;
    

С кодом, надеюсь, вы разберетесь самостоятельно? Итак, если пользователь введет, например, 36 градусов Цельсия, то нажав на кнопку, получит следующее сообщение:

Сгенерированное программой сообщение

Рис. 13.4. Сгенерированное программой сообщение

Но размерность массива может быть и больше. Трехмерный массив визуально можно представить следующим образом:

Визуальное представление трехмерного массива

Рис. 13.5. Визуальное представление трехмерного массива

Объявить подобный массив можно было бы так:

var
   a: array[1..5, 1..5, 1..5] of integer;
    

А обращаться к отдельным элементам так:

a[2, 3, 4]:= 12;
    

Как бы выглядел четырехмерный массив визуально вообще невозможно представить. У вас есть возможность работать хоть с десятимерным массивом, однако в практике программирования обычно используют одно- и двухмерные массивы, и очень редко возникает надобность в трехмерном. Не забывайте про один из основных принципов программирования, который сами программисты называют KISS (Keep It Simple, Stupid - будь проще, дурачок). Этот принцип подразумевает, что код программы не стоит усложнять без нужды - сложный код тяжелее воспринимается самим программистом, больше нагружает процессор, а ошибки времени выполнения (run time errors - ошибки, возникающие во время выполнения программы, обычно это логические ошибки) в таком коде сложнее отслеживать.

< Лекция 11 || Лекция 12: 123 || Лекция 13 >
Инга Готфрид
Инга Готфрид
Александр Скрябнев
Александр Скрябнев

Через WMI, или используя утилиту wmic? А может есть еще какие более простые пути...