Инструменты пользователя

Инструменты сайта


bb:lessons:second-basictypes

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
Следующая версия Следующая версия справа и слева
bb:lessons:second-basictypes [2014/11/23 21:48]
admin
bb:lessons:second-basictypes [2016/04/07 21:42]
prospero78 [Массивы]
Строка 1: Строка 1:
 ====== Урок второй. Базовые типы данных, массивы ====== ====== Урок второй. Базовые типы данных, массивы ======
  
-Что такое тип данных? Зачем мы про него говорим, едва ознакомившись с модулем и журналом? Дело в том, что типы данных - очень, очень важная штука в программировании.+Что такое //тип данных//? Зачем мы про него говорим, едва ознакомившись с //модулем// и //журналом//? Дело в том, что //типы данных// --- //очень, очень важная штука// в программировании.
  
 +Мы знаем, что компьютеры работают с //данными//. А что такое //данные//? Данные --- это факты, //сущности// внешнего мира, представленные таким образом, чтобы компьютер их мог обрабатывать. Ну а типы данных суть множества значений этих данных. Типы данных также вводят ограничения на использование данных.
  
-Мы знаем, что компьютеры работают с данными. А что такое данные? Данные - это факты, сущности внешнего мира, представленные таким образом, чтобы компьютер их мог обрабатывать. Ну а типы данных суть множества значений этих данных. Типы данных также вводят ограничения на использование данных. +Например, //числовой тип// данных говорит нам о том, что переменная этого типа может содержать некий //диапазон целых чисел//. Переменную числового типа можно использовать __только__ для числовых вычислений. Нельзя в число записать букву, это ограничение и нарушать его нельзя, иначе мы запутаемся в том, где у нас слова и где числа, где пирожки и где котята.
- +
- +
-Например, числовой тип данных говорит нам о том, что переменная этого типа может содержать некий диапазон целых чисел. Переменную числового типа можно использовать только для числовых вычислений. Нельзя в число записать букву, это ограничение и нарушать его нельзя, иначе мы запутаемся в том, где у нас слова и где числа, где пирожки и где котята.+
  
 ===== Базовые типы ===== ===== Базовые типы =====
- 
 Это самые простые, неделимые типы. Для них в языке определены базовые операции для вычисления новых значений. Базовыми типами в Обероне являются Это самые простые, неделимые типы. Для них в языке определены базовые операции для вычисления новых значений. Базовыми типами в Обероне являются
-  * INTEGER (целые числа, точные вычисления) +  * ''INTEGER'' (целые числа, точные вычисления) 
-  * REAL (дробные числа, вычисления с округлением) +  * ''REAL'' (дробные числа, вычисления с округлением) 
-  * BOOLEAN (логические значения) +  * ''BOOLEAN'' (логические значения) 
-  * CHAR (символы для печати) +  * ''CHAR'' (символы для печати) 
-  * SET (последовательности)+  * ''SET'' (последовательности)
  
 Попробуем вывести в журнал значения переменных всех типов Попробуем вывести в журнал значения переменных всех типов
  
-<code>MODULE MyTypes;+<code oberon2> 
 +MODULE MyTypes;
  
  IMPORT Log;  IMPORT Log;
Строка 33: Строка 31:
  END Do;  END Do;
  
-END MyTypes.</code>+END MyTypes. 
 +</code>
  
 Что же мы увидим в журнале после выполнения команды '':!: MyTypes.Do'' ? Посмотрим на результат. Что же мы увидим в журнале после выполнения команды '':!: MyTypes.Do'' ? Посмотрим на результат.
  
-<code>2014+<code> 
 +2014
 3.141592920353983 3.141592920353983
 $TRUE $TRUE
Строка 44: Строка 44:
 </code> </code>
  
-Первой строчкой выведен результат вычисления операции сложения. Складываются целые числа, значит и результат будет тоже целочисленным.\\ На второй строчке выводится дробный результат деления двух целых чисел.\\ На третьей строчке мы видим, как выводится значение логического типа (очевидно, что пять больше двух и это истина, то есть TRUE).\\ Символ "А" выведен на четвёртой строчке.\\ И последним выведено перечисление SET. Это множество целых чисел из диапазона 0..31 (подробно на нём мы останавливаться не будем, потому что это выходит за рамки начального курса).+Первой строчкой выведен результат вычисления операции сложения. Складываются целые числа, значит и результат будет тоже целочисленным.\\ На второй строчке выводится дробный результат деления двух целых чисел.\\ На третьей строчке мы видим, как выводится значение логического типа (очевидно, что пять больше двух и это истина, то есть ''TRUE'').\\ Символ "А" выведен на четвёртой строчке.\\ И последним выведено перечисление ''SET''. Это множество целых чисел из диапазона 0..31 (подробно на нём мы останавливаться не будем, потому что это выходит за рамки начального курса).
  
 ===== Составные типы ===== ===== Составные типы =====
Строка 52: Строка 52:
 ===== Массивы ===== ===== Массивы =====
  
-Массивы состоят из компонентов одинаковых типов. Это означает, что массив - однородная структура. Доступ к любому компоненту массива производится по индексу. Индекс может быть константой, переменной или вообще вычисляться в результате какой-то операции. Конечно же, индекс может быть только целым числом. В Обероне массивы индексируются с 0. Ну а размер массива задаётся только константой.+//Массивы// состоят из компонентов //одинаковых// типов. Это означает, что массив - //однородная структура//. Доступ к //любому// компоненту массива производится по //индексу//. Индекс может быть константой, переменной или вообще вычисляться в результате какой-то операции. Конечно же, индекс может быть //только целым числом//. В **Обероне** массивы индексируются с 0. Ну а размер массива задаётся только константой.
  
-Массив сам по себе интересная штука. Он сильно облегчает программисту жизнь. Подумайте сами, что легче - тысячу раз объявить переменную типа INTEGER или один раз объявить массив из тысячи элементов типа INTEGER? Конечно, второе. Вот пример:+Массив сам по себе интересная штука. Он сильно облегчает программисту жизнь. Подумайте сами, что легче - тысячу раз объявить переменную типа ''INTEGER'' или один раз объявить массив из тысячи элементов //типа// ''INTEGER''**Конечно**, второе. Вот пример:
  
-<code>MODULE MyArrays;+<code oberon2> 
 +MODULE MyArrays;
  
  VAR  VAR
   
- i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23, i24, i25, i26, i27, i28, i29, i30, i31, i32, i33, i34, i35, i36, i37, i38, i39, i40, i41, i42, i43, i44, i45, i46, i47, i48, i49, i50, i51, i52, i53, i54, i55, i56, i57, i58, i59, i60, i61, i62, i63, i64, i65, i66, i67, i68, i69, i70, i71, i72, i73, i74, i75, i76, i77, i78, i79, i80, i81, i82, i83, i84, i85, i86, i87, i88, i89, i90, i91, i92, i93, i94, i95, i96, i97, i98, i99: INTEGER;+ i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, 
 +                i15, i16, i17, i18, i19, i20, i21, i22, i23, i24, i25, i26, i27,  
 +                i28, i29, i30, i31, i32, i33, i34, i35, i36, i37, i38, i39, i40,  
 +                i41, i42, i43, i44, i45, i46, i47, i48, i49, i50, i51, i52, i53,  
 +                i54, i55, i56, i57, i58, i59, i60, i61, i62, i63, i64, i65, i66,  
 +                i67, i68, i69, i70, i71, i72, i73, i74, i75, i76, i77, i78, i79,  
 +                i80, i81, i82, i83, i84, i85, i86, i87, i88, i89, i90, i91, i92,  
 +                i93, i94, i95, i96, i97, i98, i99: INTEGER;
   
  a: ARRAY 100 OF INTEGER;  a: ARRAY 100 OF INTEGER;
  
-END MyArrays.</code>+END MyArrays. 
 +</code> 
 + 
 +Как видите, разница просто бросается в глаза. В разделе ''VAR'' объявлена **сотня** целочисленных переменных и их так много, что они не умещаются в экран. 
 +Следом объявлен массив ''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 oberon2> 
 +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" и из полученного числа генерируем символ.
  
-Как видите, разница просто бросается в глаза. В разделе VAR объявлена сотня целочисленных переменных и их так много, что они не умещаются в экран+Индексация к двумерному массиву, естественно, делается с помощью двух индексов. Будь у нас трёхмерный массивиндексов бы понадобилось три и так далее.
-Следом объявлен массив a размером тоже в сотню целых чисел, но это объявление куда компактнее. И, главное, использовать эту сотню гораздо удобнее. Можно передавать её как переменную, можно вычислять индекс доступа, можно выбирать любой элемент как если бы это была одна переменная.+
bb/lessons/second-basictypes.txt · Последнее изменение: 2020/10/29 07:08 (внешнее изменение)