Главная страница
Библиотека (скачать книги)
Скачать софт
Введение в программирование
Стандарты для C++
Уроки по C#
Уроки по Python
HTML
Веб-дизайн
Ассемблер в среде Windows
ActiveX
Javascript
Общее о Линукс
Линукс - подробно
Линукс - новое
Delphi
Паскаль для начинающих
Турбопаскаль
Новости
Партнеры
Наши предложения
Архив новостей





Действия со скалярными типами данных

При проведении вычислений с данными скалярных типов (константами и переменными) можно выполнять различные операции. Рассмотрим главные из них.

 

Арифметические операции

Арифметические операции + (сложение), - (вычитание), * (умножение), / (деление) определены для данных целочисленных типов (и их интервалов) и вещественных типов. Тип результата операций +, —, * с целыми операндами - целый, а с вещественными операндами - вещественный. Результат операции / всегда вещественный (но нельзя делить на нуль). Если операнды имеют разные типы, то эти типы должны быть совместимы.

Относительно указанных операций совместимы между собой все целочисленные типы и их интервалы, а для вещественных - все вещественные типы. Если один из операндов целый, а другой вещественный, то перед выполнением операции операнд целого типа приводится к вещественному типу; результат имеет вещественный тип. Этот вещественный тип - тип real или тип extended (если задана директива компилятора {$N+}).

Для целочисленных типов определены еще две важные операции: mod (остаток от деления) и div (целая часть частного), результат целого типа.

Примеры: 11 mod 5 дает 1, 11 div 5 дает 2.

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

program d_3_8;
{ЗАДАЧА. Вычислить время суток по заданному количеству секунд
ПРИЕМЫ
-           использование вычисляемой константы MaxHour для задания ограничения входного данного,
-           задание "разумных" типов переменных,
-           использование операций div и mod,
РЕКОМЕНДАЦИИ}
uses Crt;
const MaxHour = 24*60*60; {максимальное количество секунд в сутках}
var h: 0..23; {часы} m, s: 0..59; {минуты и секунды}
t, n: longint; {задаваемые секунды}
Begin ClrScr; {очистка экрана}
WriteLnC ВЫЧИСЛИТЬ ВРЕМЯ СУТОК ПО ЗАДАННОМУ КОЛИЧЕСТВУ СЕКУНД (<=', MaxHour, ')');
Write(' Задайте время в секундах:'); ReadLn(t);
n:= t div 60;
s := t mod 60;
h := n div 60;
m := n mod 60;
Write(t, ' сек. = ', h, ' час.', m, ' мин.', s, ' сек.');
ReadLn;
end. {Program d_3_8}

 

Особенности выполнения арифметических операций с целочисленными операндами

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

Следующая программа демонстрирует выполнение арифметических операций с целым типом integer. Задавая значения операндов из указанного диапазона можно посмотреть результаты выполнения операций. Особое внимание нужно обратить на выдачу программы, когда значение операнда или результата выходит за границы диапазона типа integer.

program d_3_2;
{ ЗАДАЧА. Продемонстрировать выполнение арифметических операций с операндами типа integer
ПРИЕМЫ
- вычисление выражений в операторах вывода
РЕКОМЕНДАЦИИ
-реализовать выполнение этих же операций с целочисленными типами byte,
shortint, word, longint}
var A, B: integer; {описание переменных}
begin
WriteLn('_ Значения данных целого типа integer',
'задаются диапазоном [-32768, +32767]');
WriteLn('_ Демонстрируется выполнение арифметических',
' операций е операндами этого типа');
WriteLn(' (Посмотрите результаты операций',
' при "приграничных" значениях операндов)');
Write(' Задайте первый операнд = '); ReadLn(A);
Write(' Задайте второй операнд = '); ReadLn(B);
{_вывод результатов выполнения операций_}
WriteLn(A, ' + ', В, ' = ', А + В);       {сложение}
WriteLn(A, ' - ', В, ' = ', А - В);         {вычитание}
WriteLn(A, ' * ', В, ' = ', А * В);       {умножение}
WriteLn(A, ' /', В, ' = ', (А / В));        {деление}
WriteLn(A, ' mod ', В, ' = ', A mod В); {остаток от деления}
WriteLn(A, ' div ', В, ' = ', A div В); {целочисленное деление}
WriteLn('_Программа завершена');
ReadLn;
end. {Program d_3_2}

Ниже приведено одно из изображений на экране при исполнении этой программы, показывающее, что при заданных операндах результаты операций "+" и "*" неверны.

 

_ Значения данных целого типа integer задаются диапазоном [-32768, +32767]
_ Демонстрируется выполнение арифметических операций с операндами этого типа
(Посмотрите результаты операций при "приграничных" значениях операндов)
_ Задайте первый операнд = 30000
_ Задайте второй операнд = 20000
30000+20000 = -15536
30000-20000 = 10000
30000 * 20000 = 17920
30000/20000 = 1.50000000000000Е+0000
30000 mod 20000 = 10000
30000 div 20000 = 1
_Программа завершена

 

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

Результаты операций "+", "-", "*" с операндами типов byte, shortint и integer имеют значение типа integer. Результат этих операций с операндами типа word имеет тип word, а для операндов типа longint - тип longint. Если значение результата этих операций выходит за пределы диапазона указанного выше типа результата, то результат операции неверен (равен значению, которое вычисляется "по модулю" этого диапазона).

Для операндов, имеющих разные целочисленные типы, указанные операции выполняются как для операндов типа longint.

 

Ниже приводится информация о результатах выполнения операций "+" и "*" для разных целочисленных типов данных, полученная с помощью проверочной программы. Приведем только выдачу этой программы (сама программа здесь не приводится).

 

СЛЕДУЮЩИЕ ПРИМЕРЫ ИЛЛЮСТРИРУЮТ ВЫПОЛНЕНИЕ ОПЕРАЦИЙ "+" И "*"

Для типа byte (диапазон [minbyte, maxbyte]=[0, 255])
операции выполняются как с integer-операндами, т.е. словами (2 байта)
byte-операнды: minbyte—1 = -1
byte-операнды: maxbyte+1 = 256
byte-операнды: 100*maxbyte = 25500
byte-операнды: -100*maxbyte = -25500
byte-операнды: 1+maxint = -30036 - неверно, т.к. выходит за mfeger-диапазон
           
Для типа shortint (диапазон [minshortint, maxshortint]=[—128,127])
операции выполняются, как с integer-операндами, т.е. словами(2 байта)
shortint-операнды: minshortint -1 = -129
shortint-операнды: maxshortint +1 = 128
           
Для типа word (диапазон [minword, maxword]=[0, 65535])
операции выполняются "по модулю" в границах этого диапазона
word-операнды: minword -1 = 65535
word-операнды: maxword + 1=0
word-операнды: 100 + maxword = 99
           
Для типов integer (диапазон [minint, maxint]=[-32768, 32767])
и longint (диапазон [minlongint, maxlongint]=[-2147483648, 2147483647])
операции выполняются "по модулю" в границах каждого диапазона
integer-операнды: minint -1 = 32767
integer-операнды: maxint +1 = -32768
longirit-операнды: minlongint -1 = 21474836

Проконтролировать правильность выполнения операций со скалярными целочисленными операндами можно, задав директиву {$Q+}.




 

Комментарии:


Добавить свой комментарий:


Введите значение:
 









   
 

Библиотека программиста. 2009.
Администратор: admin@programmer-lib.ru