Предыдущая версия справа и слева
Предыдущая версия
Следующая версия
|
Предыдущая версия
Следующая версия
Следующая версия справа и слева
|
bb:lessons:second-basictypes [2016/04/07 21:36] prospero78 [Урок второй. Базовые типы данных, массивы] |
bb:lessons:second-basictypes [2016/04/07 21:41] prospero78 [Массивы] |
| |
===== Базовые типы ===== | ===== Базовые типы ===== |
| |
Это самые простые, неделимые типы. Для них в языке определены базовые операции для вычисления новых значений. Базовыми типами в Обероне являются | Это самые простые, неделимые типы. Для них в языке определены базовые операции для вычисления новых значений. Базовыми типами в Обероне являются |
* INTEGER (целые числа, точные вычисления) | * ''INTEGER'' (целые числа, точные вычисления) |
* REAL (дробные числа, вычисления с округлением) | * ''REAL'' (дробные числа, вычисления с округлением) |
* BOOLEAN (логические значения) | * ''BOOLEAN'' (логические значения) |
* CHAR (символы для печати) | * ''CHAR'' (символы для печати) |
* SET (последовательности) | * ''SET'' (последовательности) |
| |
Попробуем вывести в журнал значения переменных всех типов | Попробуем вывести в журнал значения переменных всех типов |
| |
<code>MODULE MyTypes; | <code oberon2> |
| MODULE MyTypes; |
| |
IMPORT Log; | IMPORT Log; |
END Do; | END Do; |
| |
END MyTypes.</code> | END MyTypes. |
| </code> |
| |
Что же мы увидим в журнале после выполнения команды '':!: MyTypes.Do'' ? Посмотрим на результат. | Что же мы увидим в журнале после выполнения команды '':!: MyTypes.Do'' ? Посмотрим на результат. |
| |
<code>2014 | <code> |
| 2014 |
3.141592920353983 | 3.141592920353983 |
$TRUE | $TRUE |
</code> | </code> |
| |
Первой строчкой выведен результат вычисления операции сложения. Складываются целые числа, значит и результат будет тоже целочисленным.\\ На второй строчке выводится дробный результат деления двух целых чисел.\\ На третьей строчке мы видим, как выводится значение логического типа (очевидно, что пять больше двух и это истина, то есть TRUE).\\ Символ "А" выведен на четвёртой строчке.\\ И последним выведено перечисление SET. Это множество целых чисел из диапазона 0..31 (подробно на нём мы останавливаться не будем, потому что это выходит за рамки начального курса). | Первой строчкой выведен результат вычисления операции сложения. Складываются целые числа, значит и результат будет тоже целочисленным.\\ На второй строчке выводится дробный результат деления двух целых чисел.\\ На третьей строчке мы видим, как выводится значение логического типа (очевидно, что пять больше двух и это истина, то есть ''TRUE'').\\ Символ "А" выведен на четвёртой строчке.\\ И последним выведено перечисление ''SET''. Это множество целых чисел из диапазона 0..31 (подробно на нём мы останавливаться не будем, потому что это выходит за рамки начального курса). |
| |
===== Составные типы ===== | ===== Составные типы ===== |
===== Массивы ===== | ===== Массивы ===== |
| |
Массивы состоят из компонентов одинаковых типов. Это означает, что массив - однородная структура. Доступ к любому компоненту массива производится по индексу. Индекс может быть константой, переменной или вообще вычисляться в результате какой-то операции. Конечно же, индекс может быть только целым числом. В Обероне массивы индексируются с 0. Ну а размер массива задаётся только константой. | //Массивы// состоят из компонентов //одинаковых// типов. Это означает, что массив - //однородная структура//. Доступ к //любому// компоненту массива производится по //индексу//. Индекс может быть константой, переменной или вообще вычисляться в результате какой-то операции. Конечно же, индекс может быть //только целым числом//. В **Обероне** массивы индексируются с 0. Ну а размер массива задаётся только константой. |
| |
Массив сам по себе интересная штука. Он сильно облегчает программисту жизнь. Подумайте сами, что легче - тысячу раз объявить переменную типа INTEGER или один раз объявить массив из тысячи элементов типа INTEGER? Конечно, второе. Вот пример: | Массив сам по себе интересная штука. Он сильно облегчает программисту жизнь. Подумайте сами, что легче - тысячу раз объявить переменную типа ''INTEGER'' или один раз объявить массив из тысячи элементов //типа// ''INTEGER''? **Конечно**, второе. Вот пример: |
| |
<code>MODULE MyArrays; | <code oberon2> |
| MODULE MyArrays; |
| |
VAR | VAR |
a: ARRAY 100 OF INTEGER; | a: ARRAY 100 OF INTEGER; |
| |
END MyArrays.</code> | END MyArrays. |
| </code> |
| |
Как видите, разница просто бросается в глаза. В разделе VAR объявлена сотня целочисленных переменных и их так много, что они не умещаются в экран. | Как видите, разница просто бросается в глаза. В разделе ''VAR'' объявлена **сотня** целочисленных переменных и их так много, что они не умещаются в экран. |
Следом объявлен массив ''a'' размером тоже в сотню целых чисел, но это объявление куда компактнее. И, главное, использовать эту сотню в виде массива гораздо удобнее. Можно передавать её как переменную, можно вычислять индекс доступа, можно выбирать любой элемент как если бы это была одна переменная. | Следом объявлен массив ''a'' размером тоже в сотню целых чисел, но это объявление куда компактнее. И, главное, использовать эту сотню в виде массива гораздо удобнее. Можно передавать её как переменную, можно вычислять индекс доступа, можно выбирать любой элемент как если бы это была одна переменная. |
| |
Конечно же, массивы могут состоять не только из целых чисел. Пожалуйста, любой базовый тип к вашим услугам. Делайте массивы типа REAL, и храните в них дробные числа. Можно хранить логические значения BOOLEAN. Можно хранить символы CHAR, в таком случае у нас образуются символьные цепочки, в которых можно хранить имена, названия и даже тексты. | Конечно же, массивы могут состоять //не только// из целых чисел. Пожалуйста, любой базовый тип к вашим услугам. Делайте массивы типа ''REAL'', и храните в них //дробные// числа. Можно хранить //логические// значения ''BOOLEAN''. Можно хранить символы ''CHAR'', в таком случае у нас образуются символьные цепочки, в которых можно хранить имена, названия и даже тексты. |
| |
Но элементами массива могут быть не только базовые типы, но и другие массивы. Вот пример многомерного массива: | Но элементами массива могут быть не только базовые типы, но и другие массивы. Вот пример многомерного массива: |
P Y A H D E L J Q Y | P Y A H D E L J Q Y |
S C F L Z J Q M W Q | S C F L Z J Q M W Q |
C U J Z I I Y F ] C</code> | C U J Z I I Y F ] C |
| </code> |
| |
Программа, заполняющая двумерный массив и выводящая его в журнал так, как показано, выглядит так: | Программа, заполняющая двумерный массив и выводящая его в журнал так, как показано, выглядит так: |
| |
<code>MODULE MyArrays; | <code oberon2> |
| MODULE MyArrays; |
| |
IMPORT ObxRandom, Log; | IMPORT ObxRandom, Log; |
END Do; | END Do; |
| |
END MyArrays.</code> | END MyArrays. |
| </code> |
| |
Как видите, здесь уже используется вычисление индексов массива для доступа к его элементам. Причём это вычисление делается внутри двух циклов. Циклы мы рассмотрим на следующем уроке, а тут стоит прокомментировать использование модуля ObxRandom для вычисления случайного дробного числа в диапазоне 0..1. Мы увеличиваем это число в 30 раз, чтобы получить диапазон 0..30, затем используем встроенную в язык функцию ENTIER для преобразования числа из дробного в целое. После чего прибавляем результат к коду символа "A" и из полученного числа генерируем символ. | Как видите, здесь уже используется //вычисление индексов массива// для доступа к его элементам. Причём это вычисление делается внутри двух //циклов//. Циклы мы рассмотрим на следующем уроке, а тут стоит прокомментировать использование модуля ''ObxRandom'' для вычисления случайного дробного числа в диапазоне 0..1. Мы увеличиваем это число в 30 раз, чтобы получить диапазон 0..30, затем используем встроенную в язык функцию ''ENTIER'' для преобразования числа из дробного в целое. После чего прибавляем результат к коду символа "A" и из полученного числа генерируем символ. |
| |
Индексация к двумерному массиву, естественно, делается с помощью двух индексов. Будь у нас трёхмерный массив, индексов бы понадобилось три и так далее. | Индексация к двумерному массиву, естественно, делается с помощью двух индексов. Будь у нас трёхмерный массив, индексов бы понадобилось три и так далее. |