THE BELL

Есть те, кто прочитали эту новость раньше вас.
Подпишитесь, чтобы получать статьи свежими.
Email
Имя
Фамилия
Как вы хотите читать The Bell
Без спама

Простейшим числовым типом данных в Паскале являются целые типы, предназначенные для хранения целых чисел. Целые числа в Паскале принято делить на два типа: со знаком и без знака. Числа со знаком – это целочисленный тип, в который входят как положительные, так и отрицательные числа, без знака – только положительные.

Ниже приведены две таблицы с целочисленными типами. Сначала выпишем типы целых чисел со знаком :


Тип Байт Диапазон значений
shortint 1 -128 ... 127
smallint 2 -32768 ... 32767
integer, longint 4 -2147483648 ... 2147483647
int64 8 -9223372036854775808 ... 9223372036854775807

А это целочисленные типы без знака :


Тип Байт Диапазон значений
byte 1 0 ... 255
word 2 0 ... 65535
longword, cardinal 4 0 ... 4294967295
uint64 8 0 ... 18446744073709551615

Как видно, в первой колонке стоит название типа, во второй – количество байт, занимаемое в памяти числами этого типа, в третьей – соответственно диапазон возможных значений. В числах со знаком есть два типа – integer и longint (буквально «целый» и «длинный целый»), которые являются синонимами. То есть вы можете в разделе описаний использовать как одно название, так и другое.

Аналогично во второй таблице (неотрицательные целые числа в Паскале) есть также два целочисленных типа-синонима размером 4 байта – longword и cardinal , поэтому используйте либо одно, либо другое.

Ещё можно заметить, что если числа первой таблицы условно перенести в правую часть относительно нуля (сдвинуть интервал вправо так, чтобы минимальным числом оказался 0), то мы получим интервалы целых чисел второй таблицы, лежащие в соответствующих строках. Так, если в 1-байтовом типе shortint к левой и правой границам прибавить 128, то получим тип byte (0..255); если в 2-байтовом типе smallint к границам прибавить 32768, то получим соответствующий 2-байтовый тип без знака word (0..65535) и т.д.

Всё это случается потому, что в целочисленных типах без знака числа могут быть разделены ровно надвое: половина чисел – в отрицательную часть, половина – в положительную. А почему тогда в числах со знаком левая граница по абсолютной величине на 1 больше за правую границу? – спросите вы. Например, в типе shortint минимум -128, тогда как максимум всего 127 (по модулю на 1 меньше). А это потому, что в правую часть входит также и 0, и об этом надо знать и помнить.

Так зачем же целые числа в Паскале делить на столько типов? Почему не обойтись, например, наибольшим из целочисленных типов в PascalABC.Net и Free Pascal – int64 – это почти 9 с половиной квинтиллионов (!) как с минусом, так и с плюсом? Да по простой банальной (?) причине – экономия памяти. Если вам надо сложить два небольших однобайтовых положительных числа (0..255), а вы эти числа описали как int64 (8 байт), то на это ушло в 8 раз больше памяти. А если программа большая и переменных много, то экономия памяти встает очень резко. Причем нет смысла использовать целые типы со знаком, если в задаче речь идет о таких величинах, как длина, масса, расстояние, время и т.п.

В разделе сайта Задачник Абрамяна (подраздел Integer) понаблюдайте за использованием различных целочисленных типов в Паскале.

Каждый тип обозначает подмножество целых чисел:

Тип Диапазон Формат
ShortInt -128..127 Знаковый 8 бит
Integer -32768.. Знаковый 16 бит
LongInt -2147483648.. Знаковый 32 бита
Byte 0..255 Беззнаковый 8 бит
Word 0..65535 Беззнаковый 16 бит

Все целочисленные типы являются порядковыми . Максимальным значениям Integer и LongInt соответствуют константы MaxInt и MaxLongInt . Максимальные и минимальные значения других целочисленных типов можно получать, изпользуя функции Low и High .

Ада

Пакет Interfaces:

В этом пакете объявлены целочисленные типы с диапазонами, не зависимыми от компилятора и операционной среды.

Тип Диапазон Формат
Integer_8 -128..127 Знаковый 8 бит
Integer_16 -32768..32767 Знаковый 16 бит
Integer_32 -2147483648..2147483647 Знаковый 32 бита
Integer_64 -2**63 .. 2**63 - 1 Знаковый 64 бита
Unsigned_8 0..255 Беззнаковый 8 бит
Unsigned_16 0..65535 Беззнаковый 16 бит
Unsigned_32 0..4294967296 Беззнаковый 32 бита
Unsigned_64 0 .. 2**64 - 1 Беззнаковый 64 бита

Пакет Standard (подключается автоматически):

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

Тип Не уже, чем у... Обычно является...
Short_Short_Integer Integer_8
Short_Integer Integer_16
Integer Integer_16 Integer_32
Long_Integer Integer_32 Integer_32
Long_Long_Integer Integer_64

Несмотря на то, что я в правой колонке выписал битность каждого типа, использовать я рекоммендую только Integer и Long_Integer. Для всех остальных битностей предпочтительней типы Integer_x. Компилятор - это как частный сыщик. Чем больше от него недоговорок, тем меньше он будет полезен. Кто знает, какими битностями будут обладать стандартные типы на платформе Win128.

Кроме указанных типов, в Standard есть часто используемые:

Natural is Integer range 0 .. Integer"Last;
Positive is Integer range 1 .. Integer"Last;

Система типов языка Ада продумана лучше, чем в Borland Pascal. В Borland Pascal нельзя скомпилировать такую программу:

program Test_Word;

var
I: Word; { из лучших побуждений }

begin
for I:= 0 to -1 do { Constant out of range }
begin
end;
end.

Индекс -1 - это обычное явление, если работать с массивами, начальный индекс которых 0. Если массив пустой, то верхняя граница цикла for (длина массива минус один) как раз и получается -1. Вместо вызова ошибки этот цикл должен просто ничего не делать. В языке Ада таких проблем не возникнет. Используйте Natural и Positive на здоровье.

Данные – это общее понятие для всего того, с чем оперирует ЭВМ.

Переменные, используемые для хранения данных в языке Паскаль, могут быть различных типов. Это, в частности, связано со стремлением получать более компактные и быстродействующие программы, использующие меньшее количество памяти при своей работе.

Например, для хранения небольших чисел требуется меньше памяти, чем для хранения больших. Целые числа из диапазона 0-255 занимают лишь 1 байт памяти, тогда как бльшие числа требуют бльшего количества байт. Если по логике работы программы известно, что результат не превысит 255, то для его хранения достаточно использовать однобайтовую переменную.

С другой стороны, современные процессоры обычно по-разному обрабатывают целые и вещественные числа. Например, команды целочисленной арифметики в процессорах i80x86 выполняются непосредственно в основном АЛУ и требуют относительно немного процессорного времени. Тогда как операции с вещественными числами выполняются математическим сопроцессором, который, хотя и обладает большими возможностями по обработке, но требует гораздо больше времени для получения результата.

Поэтому, если по логике работы алгоритма не требуется использование вещественных чисел, нет смысла задействовать громоздкую «плавающую» арифметику. Указав в программе, что данная переменная является целочисленной, программист фактически даёт инструкцию компилятору обрабатывать её быстрым АЛУ основного процессора, не задействуя без необходимости сопроцессор.

Кроме того, для разных типов данных могут быть определены различные операции. Например, бессмысленно выполнять операцию деления для строк символов или делать сложение вещественной переменной с логической. Если при декларации переменной указывается её тип, компилятор получает возможность следить за правильностью выражений, в которых эта переменная будет использоваться. Это позволяет немного сократить число ошибок в программе.

В Паскале существуют простые, составные и ссылочные типы данных. Сейчас мы познакомимся подробно лишь с первыми из них, а об остальных поговорим на следующих лекциях.

К простым типам относятся:

– логический

– целые типы

– вещественные типы

– символьный

1. Логический тип (тип boolean)

Логическое значение - это одно из двух значений истинности, которые обозначаются зарезервированными именами false и true .

Логический тип определен так, что false < true . Операции отношения всегда дают логический результат. Например, отношение



при x = 0, y = 0 дает false ; при x = 0, y = 10 – значение true .

2. Целые типы данных

Значениями переменных целого типа являются элементы ограниченного подмножества целых чисел; это подмножество определяется конкретной реализацией.

В стандартном Паскале определен только один целый тип данных – тип integer . Число типа integer занимает два байта памяти; при этом нулевой бит определяет знак числа.

В той реализации Паскаля, с которой мы будем работать, в переменных типа integer можно хранить целые числа в диапазоне от –32768 до +32767.

Кроме того, в Турбо-Паскале имеются дополнительные целые типы данных:

1) тип shortint – короткое целое длиной один байт со знаком (знак занимает нулевой бит), пределы изменения -128 .. 127;

2) тип byte – короткое целое длиной один байт без знака (все восемь бит - двоичные цифры), пределы изменения 0 .. 255;

3) тип word – целое длиной два байта (слово) без знака, пределы изменения 0 .. 65535;

4) тип longint – длинное целое длиной 4 байта со знаком, пределы изменения - 2 147 483 648 .. 2 147 483 647.

Для целых значений допустимы следующие арифметические операции:

Сложение;

– вычитание;

* умножение;

div деление нацело (обратите внимание, что традиционный знак деления «/» возвращает в Паскале дробное число, поэтому результат такой операции не может быть присвоен целочисленной переменной).

mod остаток от деления.

В арифметическом выражении не могут стоять рядом два знака операции. Например, нельзя писать a * -b. Здесь нужно писать a * (-b).

Старшинство операций :

1) выражения в скобках;

2) *, div, mod (мультипликативные операции);

3) +, – (аддитивные операции).

Операции одинакового старшинства выполняются слева направо.

Операции возведения в степень в Паскале нет. Для целых показателей степени эта операция может быть заменена многократным умножением.

Целый результат дают следующие предописанные функции:



1) abs(i) – абсолютное значение целого аргумента i;

2) sqr(i) – квадрат значения целого аргумента i;

3) trunc(R) – целое, получающееся в результате отбрасывания дробной части числа R;

4) round(R) – целое, получающееся путем округления R.

trunc(3.3) = 3; round(3.3) = 3;

trunc(3.5) = 3; round(3.5) = 4;

trunc(3.8) = 3; round(3.8) = 4;

trunc(-3.3) = -3; round(-3.3) = -3;

trunc(-3.8) = -3; round(-3.8) = -4.

3. Вещественные типы

Вещественные числа – это числа с плавающей запятой. Широкое их использование характерно для инженерно-технических задач.

При отсутствии сопроцессора реализуется только один вещественный тип – тип real ; при наличии сопроцессора реализуются также типы single , double , extended , comp . Вещественные типы отличаются друг от друга количеством разрядов, отводимых для представления мантиссы и порядка.

Для типа real определены четыре арифметических операции:

Сложение - вычитание

* умножение / деление

Результатом операций «+», «–», «*» является вещественное значение, если хотя бы один из операндов имеет тип real . Операция «/» дает вещественное значение и в том случае, когда оба ее операнда имеют целочисленный тип.

Стандартные функции abs(x) и sqr(x) дают вещественный результат, если их аргумент x имеет тип real . Вне зависимости от типа аргумента следующие стандартные функции всегда дают вещественный результат: sin(x), cos(x), ln(x), exp(x), arctan(x), sqrt(x) (корень квадратный).

Вещественный результат при вещественном аргументе дают также функции

Int(x) - целая часть вещественного значения x;

Frac(x) - дробная часть вещественного значения x.

4. Символьный тип данных (тип char)

Значениями переменных символьного типа являются элементы конечного и упорядоченного множества символов. Этот набор может быть неодинаков на различных ЭВМ.

Значение переменной символьного типа обозначается одним символом, заключенным в апострофы.

"A" "a" "8" """" (апостроф пишется дважды)

Вне зависимости от реализации для символьного типа справедливы следующие допущения.

1) Десятичные цифры от "0" до "9" упорядочены в соответствии с их значениями и записаны одна за другой.

2) Имеются все большие буквы латинского алфавита от "A" до "Z". Это множество упорядочено по алфавиту, но не обязательно связно. Следовательно, в любой реализации должно выполняться "I" < "J".

3) Могут быть малые буквы латинского алфавита от "a" до "z". Если это так, то это множество букв упорядочено по алфавиту, но не обязательно связно.

Для символьного типа определены две взаимно обратные функции преобразования ord и chr:

k = ord(ch) – порядковый номер символа ch;

ch = chr(k) – символ с порядковым номером k.

Для символьного типа определены все операции отношения.

Считается, что ch1 < ch2, если ord(ch1) < ord(ch2).

Структура Паскаль-программы

Паскаль-программа состоит из заголовка программы и некоторого блока:

Заголовок программы;

Блок.

Заголовок состоит из ключевого слова program и имени программы:

Program Example;

Блок содержит разделы описаний, в которых определяются все локальные по отношению к данной программе объекты, и раздел операторов, где заданы действия, которые необходимо выполнить над данными объектами. Блок состоит из следующих разделов:

1. Раздел описания меток.

2. Раздел описания констант

3. Раздел описания типов

4. Раздел описания переменных.

5. Раздел описания процедур и функций.

6. Раздел операторов.

В блоке может отсутствовать любой из разделов кроме раздела операторов.

1. Раздел описания меток

Любой оператор в программе может быть промаркирован меткой. Метка ставится перед оператором и отделяется от него двоеточием. Все метки должны быть описаны в разделе описания меток.

Label 10, 20, Met15;

2. Раздел описания констант

Этот раздел определяет некоторые идентификаторы как синонимы констант.

TextString = "Нажмите клавишу Enter";

Константа pi является предописанной и равна

pi = 3.1415926536 .

Использование идентификаторов констант улучшает читаемость программы и облегчает ее модификацию.

3. Раздел описания типов

Типы данных real, integer, boolean, char являются предопределенными и используются в разделе описания переменных. Если программисту требуется ввести новый тип данных, то его нужно описать в разделе описания типов.

Подробнее об описании новых типов мы поговорим позднее.

4. Раздел описания переменных

Каждое имя переменной, массива или другого объекта программы должно быть приведено в разделе описания переменных.

Var i, j, k: integer;

5. Раздел описания процедур и функций

Назначение и структура раздела будут изложены при рассмотрении процедур и функций.

6. Раздел операторов

Раздел содержит в себе операторы, реализующие обработку информации в программе. Раздел операторов - это частный случай составного оператора, который включает в себя один или несколько операторов, заключенных в «операторные скобки» begin … end. Разделителем между операторами является точка с запятой. На последующих лекциях мы будем изучать основные операторы языка Паскаль.

Раздел №9 (2 часа)

Оператор присваивания. Ввод-вывод
в программах на Паскале

Оператор присваивания. Запись арифметических выражений

Процедуры ввода данных с клавиатуры

Процедуры вывода данных на экран

Основы программирования
Каждый профессионал когда-то был чайником. Наверняка вам знакомо состояние, когда “не знаешь как начать думать, чтобы до такого додуматься”. Наверняка вы сталкивались с ситуацией, когда вы просто не знаете, с чего начать. Эта книга ориентирована как раз на таких людей, кто хотел бы стать программистом, но совершенно не знает, как начать этот путь. ...

Почти все целочисленные типы данных относятся к . Эти типы данных представляют целые числа в определённом диапазоне. Конкретные наименования целочисленных типов и диапазоны значений зависят от конкретного языка программирования, от компилятора и от режима компиляции. Подробнее об этом надо узнавать в документации на компилятор.

Например, тип данных Integer в Delphi имеет диапазон -2147483648…2147483647, в то время как в Turbo Pascal тип данных Integer представляет числа в диапазоне -35768…32767. В Free Pascal диапазон значений типа Integer определяется выбранным режимом.

Так как Lazarus использует компилятор Free Pascal, то всё сказанное о типах данных по отношению к Free Pascal справедливо и для Lazarus.

Итак, целочисленные типы данных Free Pascal перечислены в таблице 13.1.

Таблица 13.1. Целочисленные типы данных Free Pascal (Lazarus).

Тип Размер, байт Диапазон значений
Byte 1 0…255
Shortint 1 -128…127
Smallint 2 -35768…32767
Word 2 0…65535
Integer 2 или 4 Зависит от режима компиляции
Cardinal 4 0…4294967295
Longint 4 -2147483648…2147483647
Longword 4 0...4294967295
Int64 8 -9223372036854775808...9223372036854775807
QWord 8 0...18446744073709551615

ПРИМЕЧАНИЕ
В Free Pascal типы Int64 и QWord не являются ! Это означает, что вы не можете использовать их, например, для индексных переменных в циклах. Однако я привёл их здесь, чтобы отдельно не описывать в будущем и собрать в одном месте все целочисленные типы Free Pascal. Если какие-то слова вам не понятны - не пугайтесь. В своё время я обо всём расскажу подробнее.

А теперь несколько пояснений к таблице.

В колонке ТИП приведены идентификаторы типов данных (ключевые слова, которые указывают компилятору, к какому типу относятся те или иные данные). Как использовать эти идентификаторы, вы узнаете в следующих уроках.

В колонке РАЗМЕР указан размер, который занимает тип данных в памяти компьютера. Например, целое положительное число можно представить разными типами: Byte , Word , Cardinal и др. Однако число типа Cardinal будет занимать в памяти 4 байта, в то время как число типа Byte – всего лишь 1 байт. Поэтому, если вы точно знаете, что число, с которым вы работаете, никогда не примет значение больше 255, то лучше определять его как тип Byte , так как это позволит сэкономить место в памяти компьютера. Хотя здесь не всё так однозначно (нюансы распределения памяти и других ресурсов компьютера выходят за рамки ).

В колонке ДИАПАЗОН указан диапазон значений, которым оперирует тип данных. Например, число типа Byte может принимать значения от 0 до 255.

А теперь практика. Напишем программу, которая выводит на экран диапазоны значений всех целочисленных типов данных. Исходный код этой программы приведён ниже:

Листинг 13.1. Программа вывода на экран диапазонов целых чисел. program td; {$mode objfpc}{$H+} uses {$IFDEF UNIX}{$IFDEF UseCThreads} cthreads, {$ENDIF}{$ENDIF} Classes { you can add units after this }; begin Writeln("Byte: ", Low(Byte), "..", High(Byte)); Writeln("Shortint: ", Low(Shortint), "..", High(Shortint)); Writeln("Smallint: ", Low(Smallint), "..", High(Smallint)); Writeln("Word: ", Low(Word), "..", High(Word)); Writeln("Integer: ", Low(Integer), "..", High(Integer)); Writeln("Cardinal: ", Low(Cardinal), "..", High(Cardinal)); Writeln("Longint: ", Low(Longint), "..", High(Longint)); Writeln("Longword: ", Low(Longword), "..", High(Longword)); Writeln("Int64: ", Low(Int64), "..", High(Int64)); Writeln("QWord: ", Low(QWord), "..", High(QWord)); Readln; end.

Стандартная функция Low определяет минимальное значение типа данных. Фунцкия High определяет максимальное значение. С функциями WriteLn и ReadLn вы уже немного знакомы. Более подробно о подпрограммах (процедурах и функциях) мы будем говорить в соответствующем разделе .

Напоследок скажу, как записываются целочисленные данные в программе. Да также как и везде - просто пишите число, без кавычек и каких-либо дополнительных символов. Например, так

10
178
35278

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

Free Pascal поддерживает четыре формата записи целого числа:

  1. Десятичная запись . Просто число, например 10.
  2. Шестнадцатеричная запись . Число с префиксом $. Например, шестнадцатеричное число $10 равно десятичному 16.
  3. Восьмеричная запись . Число с префиксом &. Например, восьмеричное число &10 равно десятичному 8.
  4. Двоичная запись . Число с префиксом %. Например, двоичное число %10 равно десятичному 2.

Домашнее задание:

Создайте программу, которая выводит на экран диапазоны значений целых чисел (листинг 13.1). Откомпилируйте программу и запустите её. Убедитесь, что эти значения соответствуют указанным в таблице 13.1.

В исходном коде программы найдите строку, которая задаёт режим компиляции:

{$mode objfpc}{$H+}

В этой строке вместо слова objfpc напишите слово tp . То есть итоговая строка должна выглядеть так:

{$mode tp}{$H+}

Запустите программу. Посмотрите диапазон значений типа Integer . Сделайте выводы.

Учитесь думать как программист, то есть логически. Никто вам до пенсии не будет всё разжёвывать, как это делаю сейчас я. Надо привыкать думать самостоятельно. Иначе вы скатитесь к “обезьяньему принципу обучения”, и тогда ваши шансы стать классным программистом приблизятся к нулю. Чтобы помочь вам не скатиться на уровень “зубрёжки”, я буду периодически оставлять пробелы в вашем обучении, чтобы вы постарались сами додуматься до каких-то вещей.

Намного лучше, если вы сами додумаетесь до неправильного решения , сами найдёте ошибку и сами её исправите, чем будете всегда использовать чужие правильные решения и тупо их копировать.

THE BELL

Есть те, кто прочитали эту новость раньше вас.
Подпишитесь, чтобы получать статьи свежими.
Email
Имя
Фамилия
Как вы хотите читать The Bell
Без спама