| Предыдущая версия справа и слева
Предыдущая версия
Следующая версия
|
Предыдущая версия
|
bb:lessons:second-basictypes [2014/11/23 21:49] admin [Массивы] |
bb:lessons:second-basictypes [2020/10/29 07:08] (текущий) |
| ====== Урок второй. Базовые типы данных, массивы ====== | ====== Урок второй. Базовые типы данных, массивы ====== |
| |
| Что такое тип данных? Зачем мы про него говорим, едва ознакомившись с модулем и журналом? Дело в том, что типы данных - очень, очень важная штука в программировании. | [[bb:lessons|]] |
| |
| | Что такое тип данных? Зачем мы про него говорим, едва ознакомившись с модулем и журналом? Дело в том, что типы данных --- очень, очень важная штука в программировании. |
| |
| Мы знаем, что компьютеры работают с данными. А что такое данные? Данные - это факты, сущности внешнего мира, представленные таким образом, чтобы компьютер их мог обрабатывать. Ну а типы данных суть множества значений этих данных. Типы данных также вводят ограничения на использование данных. | Мы знаем, что компьютеры работают с данными. А что такое данные? Данные --- это факты, сущности внешнего мира, представленные таким образом, чтобы компьютер их мог обрабатывать. Ну а типы данных суть множества значений этих данных. Типы данных также вводят ограничения на использование данных. |
| |
| Например, числовой тип данных говорит нам о том, что переменная этого типа может содержать некий диапазон целых чисел. Переменную числового типа можно использовать только для числовых вычислений. Нельзя в число записать букву, это ограничение и нарушать его нельзя, иначе мы запутаемся в том, где у нас слова и где числа, где пирожки и где котята. | Например, числовой тип данных говорит нам о том, что переменная этого типа может содержать некий диапазон целых чисел. Переменную числового типа можно использовать только для числовых вычислений. Нельзя в число записать букву, это ограничение и нарушать его нельзя, иначе мы запутаемся в том, где у нас слова и где числа, где пирожки и где котята. |
| Как видите, разница просто бросается в глаза. В разделе VAR объявлена сотня целочисленных переменных и их так много, что они не умещаются в экран. | Как видите, разница просто бросается в глаза. В разделе VAR объявлена сотня целочисленных переменных и их так много, что они не умещаются в экран. |
| Следом объявлен массив ''a'' размером тоже в сотню целых чисел, но это объявление куда компактнее. И, главное, использовать эту сотню в виде массива гораздо удобнее. Можно передавать её как переменную, можно вычислять индекс доступа, можно выбирать любой элемент как если бы это была одна переменная. | Следом объявлен массив ''a'' размером тоже в сотню целых чисел, но это объявление куда компактнее. И, главное, использовать эту сотню в виде массива гораздо удобнее. Можно передавать её как переменную, можно вычислять индекс доступа, можно выбирать любой элемент как если бы это была одна переменная. |
| | |
| | Конечно же, массивы могут состоять не только из целых чисел. Пожалуйста, любой базовый тип к вашим услугам. Делайте массивы типа REAL, и храните в них дробные числа. Можно хранить логические значения BOOLEAN. Можно хранить символы CHAR, в таком случае у нас образуются символьные цепочки, в которых можно хранить имена, названия и даже тексты. |
| | |
| | Но элементами массива могут быть не только базовые типы, но и другие массивы. Вот пример многомерного массива: |
| | |
| | ''matrix: ARRAY 10 OF ARRAY 10 OF ARRAY 10 OF ARRAY 10 CHAR;'' |
| | |
| | Как этот четырёхмерный массив должен выглядеть, довольно сложно представить. Надо что-то попроще. Давайте попробуем увидеть, как выглядит содержимое двумерного массива символов из 10 строк и 10 столбцов |
| | |
| | ''matrix10x10: ARRAY 10 OF ARRAY 10 OF CHAR;'' |
| | |
| | Если такой двумерный массив заполнить произвольными символами и затем вывести в журнал, то получится что-то вроде этого: |
| | <code> |
| | Q Q T A A I E I U X |
| | V A D Y A O O O V B |
| | T P A H B [ L [ \ X |
| | Z L H K V E J I F \ |
| | N W J J U R O G Q A |
| | ] E O Y P T V U [ Y |
| | X B K S A T R T ^ J |
| | P Y A H D E L J Q Y |
| | S C F L Z J Q M W Q |
| | C U J Z I I Y F ] C</code> |
| | |
| | Программа, заполняющая двумерный массив и выводящая его в журнал так, как показано, выглядит так: |
| | |
| | <code>MODULE MyArrays; |
| | |
| | IMPORT ObxRandom, Log; |
| | |
| | VAR |
| | matrix10x10: ARRAY 10 OF ARRAY 10 OF CHAR; |
| | |
| | PROCEDURE Do*; |
| | VAR i, j: INTEGER; s: ARRAY 10 OF CHAR; |
| | BEGIN |
| | FOR i := 0 TO 9 DO |
| | FOR j := 0 TO 9 DO |
| | matrix10x10[i, j] := CHR(ORD('A') + ENTIER(ObxRandom.Uniform() * 30)) |
| | END |
| | END; |
| | FOR i := 0 TO 9 DO |
| | FOR j := 0 TO 9 DO |
| | Log.Char(matrix10x10[i, j]); Log.Char(' ') |
| | END; |
| | Log.Ln |
| | END |
| | END Do; |
| | |
| | END MyArrays.</code> |
| | |
| | Как видите, здесь уже используется вычисление индексов массива для доступа к его элементам. Причём это вычисление делается внутри двух циклов. Циклы мы рассмотрим на следующем уроке, а тут стоит прокомментировать использование модуля ObxRandom для вычисления случайного дробного числа в диапазоне 0..1. Мы увеличиваем это число в 30 раз, чтобы получить диапазон 0..30, затем используем встроенную в язык функцию ENTIER для преобразования числа из дробного в целое. После чего прибавляем результат к коду символа "A" и из полученного числа генерируем символ. |
| | |
| | Индексация к двумерному массиву, естественно, делается с помощью двух индексов. Будь у нас трёхмерный массив, индексов бы понадобилось три и так далее. |