3.3.1. Арифметические выражения

Рассмотрим подробно арифметические выражения, т. к. именно с их помощью выполняются все вычисления в программе.

Результатом арифметического выражения является целое или вещественное значение. Выражение задает порядок действий над элементами данных и состоит из:

• операндов (констант, переменных, функций);

• круглых скобок;

• знаков операций.

 меню

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

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

Например, в выражении (х+у) *5-10 операндами являются переменные х и у, а также константы 5 и 10; а +, * — знаки арифметических операций сложения и умножения соответственно. Символ операции умножения — * (звездочка) должен присутствовать в явном виде. Если все объекты, входящие в выражение, определены в момент их использования (в нашем примере — это переменные х и у), то значение выражения считается определенным.

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

При использовании двух знаков операций нежелательно, чтобы они стояли рядом: а*-b. Лучше заключить второй операнд в скобки: а*(-b).

 меню        вверх

Операции DIV и MOD

Целочисленное деление div (от division, деление) отличается от обычной операции деления тем, что возвращает целую часть частного, а дробная часть отбрасывается — 13 div 3 = 4, а не 4,(3). Результат div всегда равен нулю, если делимое меньше делителя.

Например:

11 div 5 = 2

10 div 3 = 3

2 div 3 = 0

123 div 4 = 30

17 div -5 = -3

-17 div 5 = -3

-17 div -5 = 3

Взятие остатка от деления mod (от modulus, мера) вычисляет остаток, полученный при выполнении целочисленного деления.

Например:

10 mod 5 = 0

11 mod 5 = 1

10 mod 3 = 1

14 mod 5 = 4

17 mod - 5 = 2

-17 mod 5 = -2

-17 mod -5 = -2

Аргументы операций div и mod — целые числа. Взаимосвязь между операциями div и mod проста. Для а>0 и b>0 справедливо:

A mod b = a – (a div b)*b

(a div b)*b + (a mod b) = a

Обратите внимание — операцию mod можно использовать, чтобы узнать, кратно ли целое а целому b. А именно, а кратно b тогда и только тогда,когда а mod b = 0 (см. лиcтинг 3.6).

 меню        вверх

Арифметические процедуры и функции

В арифметических выражениях часто используются следующие стандартные функции (табл. 3.1).

Таблица 3.1. Стандартные функции

Стандартная функцияВыполняемое действиеТип
аргументарезультата
abs (x)|x|realreal
integerinteger
sqr (x)x2realreal
integerinteger
sqrt (x)x1/2realreal
integerreal
exp (x)exrealreal
integerreal
ln (x)ln (x)realreal
integerreal
sin (x)sin (x)realreal
integerreal
cos (x)cos (x)realreal
integerreal
arctan (x)arctg (x)realreal
integerreal
piчисло Π - real

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

Следует знать:

• аргумент прямых тригонометрических функций sin и соs задается в радианах. Для преобразования значения угла из радианной меры в градусную необходимо умножить величину угла на число 180/рi. Для перевода значения угла из градусной меры в радианную необходимо умножить величину угла на число pi/180(см. листинг 3.1);

• результат функции агсtаn получается в радианах.

Кроме приведенных в табл.3.1 также используются следующие стандартные процедуры и функции:

• функция random ( диапазон) возвращает случайное число х, удовлетворяющее условию 0<=х<диапазон. Тип аргумента и результата — word. В том случае, если нам необходимы целые случайные числа из диапазона b>x>=a,мы можем получить их, используя выражение random (b-a)+a. Если параметр диапазон не указан, то random возвращает число х в диапазоне 0<=х<1. Тип результата — rеа1. В том случае, если нам необходимы вещественные случайные числа из другого диапазона: b>x>=а, мы можем задать его при помощи random*b+a. Перед первым обращением к функции random необходимо с помощью вызова процедуры randomize инициализировать программный генератор случайных чисел. В противном случае при каждом запуске программы датчик будет выдавать одни и те же числа. Эту особенность можно использовать при отладке программы;

• процедура dec(х,n) уменьшает значение целочисленной переменной х на n . Например, х:=10; dec (х, 2); {результат: 8} . При отсутствии необязательного параметра n процедура принимает вид deс(х) , а значение х уменьшается на единицу;

• процедура inc(х,n) увеличивает значение целочисленной переменной х на n. Например, х:=10; inc(х,3);{(результат: 13}. При отсутствии необязательного параметра n процедура принимает вид inс (х), а значение х увеличивается на единицу;

• функция frас(х) вычисляет дробную часть х. Аргумент и результат — rеа1. Например write (frас(0.25*11) :4:2); {результат 0.75};

• функция int (х) вычисляет целую часть х. Аргумент и результат — rеа1. Например, write(int(422.117) :4:2) ; {результат 422.00}. Таким образом, х=int (х) +frас (х).

 меню        вверх

Функции TRUNC и ROUND

При работе с целочисленной арифметикой нельзя смешивать операнды целого и вещественного типов. Пусть i — переменная целого типа, а х — вещественного. Тогда для получения целочисленного результата их суммирования необходимо воспользоваться одной из функций trunc или round: trunc (х) ИЛИ round (х).

• Функция преобразования типа trunc(х) возвращает ближайшее целое число, меньше или равное вещественному х для х>=0 , и больше или равное х для х<=0 (от truncate, усекать). Таким образом, выполняется отбрасывание десятичных знаков после точки. Аргумент — rеа1 , результат — longint .

Например, trunc ( 6.7); {результат: 6}, trunc;(-1.6); {результат:-1}.

• Функция преобразования типа round(х) возвращает значение х, округленное до ближайшего целого числа (от round, круглый). Аргумент — rеа1, результат — longint.

Например, round (6.7); {результат:7}, round(-1.6); {результат:-2.

 меню        вверх

Возведение в степень

Вычисление степени числа выполняется в Тurbо Раsсаl с использованием свойств логарифмов:

Таким образом, нельзя возвести в степень отрицательное число. Для этого можно использовать операторы циклов.

 меню        вверх

Полезные формулы

Для вычисления логарифма с основанием а используем:

В Тurbо Раsсаl определены только три тригонометрические функции: sin, соs, аrсtg (табл. 3.1). Для вычисления остальных тригонометрических, функций необходимо использовать известные соотношения:

 меню        вверх

Приоритет операций

Последовательность выполнения операций в составе выражения происходит с учетом их приоритета (старшинства). В табл. 3.2 приведен порядок выполнения всех основных операций (арифметических и логических). Подробнее о логических операциях будет рассказано ниже (см. разд. 3.8.1).

Таблица 3.2. Порядок выполнения основных операций

ОперацияПриоритетВид операции
not, @Первый (высший)Унарная операция
*, /, div, mod, and, shl, shrВторойОперации типа умножения
+, —, or, xorТретийОперации типа сложения
=, < >, <, >,<=, >=, inЧетвертыйОперации отношения

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

Например:

• в выражении 3+4*5 умножение * выполняется перед сложением +, потому что его приоритет выше. Для изменения порядка используйте скобки: (3+4) *5;

• выражения а*b/с и (а*b) /с вычисляются одинаково, т. к. приоритеты умножения и деления равны, а знак операции умножения стоит левее знака деления. Для изменения порядка действий необходимы скобки: а*(Ь/с).

Листинг 3.1 содержит программу вычисления площади треугольника по двум сторонам и углу между ними. Угол вводится в градусах и переводится в радианы.

Листинг 3.1. Вычисление площади треугольника

uses crt;
var
    a,b: real; { длины сторон }
    angle: real; ( величина угла в градусах }
    area: real; { площадь треугольника }
begin
    textbackground(blue); { цвет фона }
    textcolor(green); ( цвет символов }
    clrscr; ( очистка экрана }
    writeln('Вычисление площади треугольника');
    write('Введите длины двух сторон треугольника в одной строке (см.):');
    readln(a,b);
    write('Введите угол между сторонами в градусах: ');
    readln(angle);
    { переводим угол в радианы }
    angle:=angle*pi/180;
    { area=a*h/2, где h (высота треугольника) может быть }
    { вычислена по формуле: h=b*sin(angle) }
    area:=a*b*sin(angle)/2;
    writeln('Площадь треугольника:', area:7:3,' кв.см.');
    readln;
end.

Комментарии

Процедура clrscr очищает экран и помещает курсор в его левый верхний угол. Для того чтобы процедура clrscr была доступна программе, в ее начало помещается строка uses crt;.

Листинг 3.2 содержит программу, которая вычисляет месячные выплаты m по займу в s рублей на n лет под процент р. Вычисления выполняются по формулам:

Листинг 3.2. Вычисление ежемесячных выплат по займу

var
    m, s,p, r,n, a,d: real;
    rub,kop: integer; { целая и дробная часть числа (рубли и копейки)
begin
    writeln('Введите заем, процент и количество лет в одной строке: ');
    readln(s,p,n);
    r:=р/100;
    а:=ехр(ln(1+r)*n); { вычисление степени числа через логарифм }
    m:=(s*r*a)/(12*(a-1));
    m:=trunc(100*m+0.5)/100; { округление до копейки }
    d:=m*n*12-s; { общая прибыль }
    writeln;
    rub:= round(s*100) div 100; kop:= round(s*100) mod 100;
    write('Взято ',rub,' руб. ',kop,' коп. ');
    write('под ',p:5:2,'% на ',n:5:2,' лет');
    writeln;
    rub:= round(m*100) div 100; kop:= round(m*100) mod 100;
    writeln('Месячная выплата = ',rub,' руб. ',kop,' коп. ');
    rub:= round(d*100) div 100; kop:= round(d*100) mod 100;
    writeln('Общая прибыль = ',rub,' руб. ',kop,' коп. ');
end.

Для преобразования числа в денежный формат (выделения рублей и копеек) в программе используются операции div и mod. Обратите внимание, что в тексте программы трижды повторяется пара операторов для выделения значений рублей и копеек (rub и кор), при этом меняется только имя переменной: s, m, d (заем, выплата и прибыль). Возникает закономерный вопрос: можно ли записать эти операторы один раз, а затем трижды "вызвать" их для вычисления результата — переменных rub и кор, подставляя каждый раз имена различных исходных данных — переменных s, m и d.

Листинг 3.3 содержит программу, вычисляющую сумму цифр трехзначного числа.

Листинг 3.3. Вычисление суммы цифр трехзначного числа

var i,first,second,third,sum: integer;
begin
    write('Введите целое трехзначное число: ');readln(i);
    first :=i div 100; { выделение первой цифры числа }
    second:=i div 10 mod 10;{ выделение второй цифры числа }
    third :=i mod 10; { выделение третьей цифры числа }
    sum:=first+second+third;
    writeln('Сумма цифр числа ',100*first+10*second+third,' - ', sum) ;
end.

 предыдущая         меню        вверх         следующая

Hosted by uCoz