Читайте также:
|
|
Обычный (бесформатный) вывод данныхобладает тем недостатком, что данные, выводимые одним оператором WriteLn и перечисленные в скобках этого оператора через запятую, изображаются на экране подряд, без промежутков. Например, после выполнения фрагмента
c:='Ф'; s:='хорошо'; i:=18; WriteLn(c,s,i)
мы увидим в строке экрана
Ф | х | о | р | о | ш | о |
Мы можем приказать Паскалю отводить под каждое данное столько позиций в строке, сколько нам нужно: WriteLn(c:3,s:8,i:4)
Вот что мы увидим в строке экрана:
Ф | х | о | р | о | ш | о |
Здесь под c отведено поле в три позиции (с 1 по 3), начиная с левого края экрана. Под s отведено поле в 8 позиций (с 4 по 11). Под i отведено поле в 4 позиции (с 12 по 15). Информацией заполняется правая часть поля, а левая часть может остаться пустой.
Еще один недостаток бесформатного вывода: данные типа Real всегда изображаются в неудобочитаемом экспоненциальном виде. Например, после выполнения фрагмента
r:=465.28073; WriteLn(r)
мы увидим на экране
. | E | + |
что означает 4.65280730000231 * 102 или, что то же самое, 465.280730000231. Обратите внимание на откуда-то взявшиеся цифры 231. Их появление связано с неточностью представления вещественных чисел в компьютере.
Еще один пример: r:=0.000000308; WriteLn(r)
. | E | - |
что означает 3.08000000000079 * 10-7 или, что то же самое, 0.000000308000000000079.
Еще пример: r:= -0.000003; WriteLn(r)
- | . | E | - |
что означает -2.99999999999953 * 10-6 или, что то же самое, -0.00000299999999999953, а это практически равно -0.000003.
Как избавиться от экспоненциального вида? Формат:9:3 прикажет Паскалю изобразить число типа Real в привычном для нас виде, отведя под него 9 позиций в строке, из них 3 позиции под дробную часть числа. Пример:
r:=465.28073; WriteLn(r:9:3)
. |
Обратите внимание, что дробная часть округлена, так как она целиком не умещается в отведенный формат.
Еще пример: r:=465.28073; WriteLn(r:10:0)
Еще пример: r:= -465.28073; WriteLn(r:10)
- | . | E | + |
Это у нас получился вывод в "укороченном" экспоненциальном формате.
Переполнение ячеек памяти
После выполнения программы
VAR i:Byte;
BEGIN i:=250; WriteLn(i); i:=i+10; WriteLn(i) END.
мы увидим на экране числа 250 и 4. А почему не 250 и 260? Потому что тип Byte представляет только числа от 0 до 255. Если в процессе выполнения программы значение переменной вышло за диапазон своего типа, Паскаль не замечает ошибки, а в соответствующей ячейкеоказывается ерунда. Это касается всех типов. Впрочем, ценой некоторой потери скорости Паскаль можно легко настроить на проверку выхода за диапазон (см. приложение).
Дерево типов
Паскаль предоставляет солидные возможности для конструирования новых типов. Так, если мы пишем VAR a: array[1..10] of array [2..5] of set of Byte, то имеем в виду, что переменная a является массивом array[1..10], который сконструирован из массивов array [2..5], каждый из которых сконструирован из элементов, являющихся множествами set, каждое из которых сконструировано из элементов типа Byte.
Схема, приводимая ниже, демонстрирует, какие типы из каких можно конструировать. Например, файлы можно конструировать из строк, а записи из массивов. А вот множества из вещественных чисел конструировать нельзя.
Дата добавления: 2015-11-14; просмотров: 49 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Совместимость типов | | | Синтаксисические диаграммы Паскаля |