Арифметические выражения в Pascal
Арифметические выражения формируются из переменных, констант, функций, знаков операций и круглых скобок. В арифметических выражениях используются следующие арифметические операции:
Выражение |
Тип данных |
Тип результата |
Операция |
Пример |
A+B |
Real Integer Real, Integer |
Real Integer Real |
Сложение |
|
A–B |
Real Integer Real, Integer |
Real Integer Real |
Вычитание |
|
A*B |
Real Integer Real, Integer |
Real Integer Real |
Умножение |
|
A/B |
Real Integer Real, Integer |
Real Real Real |
Деление |
|
A div B |
Integer |
Integer |
Целочисленное деление |
11 div 5 Þ2 10 div 3Þ3 2 div 3Þ0 |
A mod B |
Integer |
Integer |
Деление с остатком |
11 mod 5Þ1 10 mod 3Þ1 14 mod 5Þ4 |
Приоритет операций в порядке убывания: /, *, div, mod, -, +
Для изменения приоритета операций используются круглые скобки.
Например:
(A+B)/(A-B)
Математические функции в Pascal
Функция |
Назначение |
Тип результата |
Abs(X) Arctan(X) Sin(X) Cos(X) Exp(X) Ln(X) Sqr(X) Sqrt(X) Frac(X) Int(X) Round(X) Trunc(X) |
Абсолютное значение аргумента Арктангенс аргумента Синус аргумента Косинус аргумента ex Натуральный логарифм Квадрат аргумента Квадратный корень аргумента Возвращает число, равное дробной части числа Возвращает число, равное целой части числа Возвращает число, равное целой части числа Возвращает число, равное целой части числа |
Совпадает с типом Х Вещественный Вещественный Вещественный Вещественный Вещественный Совпадает с типом Х Вещественный Вещественный Вещественный LongInt LongInt |
Пример программы с использованием арифметических выражений
Program p2;
Const
X=-2;
A=732;
B=3.4;
Var
Z,Y:Real;
BEGIN
Y:=1/(1-1/Sqrt(A+B));
Z:=Arctan(X)/(1-ABS(X));
Write(‘Ý=’,Y,’ Z=’,Z);
END.
Условные выражения и операции отношения в Pascal
Операции отношения выполняют сравнение двух операндов и определяют, истинно значение выражения или ложно. Они используются для управления циклами и в условных операторах.
Операции отношения
Выражение |
Операция |
Результат |
A=B A<>B A>B A<B A>=B A<=B |
Равно Не равно Больше Меньше Больше или равно Меньше или равно |
True, если A= B True, если A <>B True, если A >B True, если A <B True, если A>= B True, если A<= B |
Операции расположены в порядке убывания приоритета.
Например
Выражение Результат
12>=12 True
56>10 True
11<=6 False
Логические выражения и операции в Pascal
Результатом выполнения логического выражения является логическое значение True или False.
Имеется одна унарная логическая операция not (отрицание) и две бинарные операции and (логическое умножение) и or (логическое сложение).
Таблица истинности
Выражение |
Значение А |
Значение В |
Результат |
Not A |
True False |
False True |
|
A and B |
True True False False |
True False True False |
True False False False |
A or B |
True True False False |
True False True False |
True True True False |
Pascal. Урок 2
Арифметические выражения
Рассмотрим подробно арифметические выражения, т.к. именно с их помощью выполняются все вычисления в программе.
Результатом арифметического выражения является целое или вещественное значение. Выражение задает порядок действий над элементами данных и состоит из:
- операндов (констант, переменных, функций);
- знаков операций;
- круглых скобок.
Арифметические операции
Операции определяют действия, которые надо выполнить над операндами. В отличие от традиционной математической записи обязательно указывать все знаки операций.
Например, в выражении (х+у) *5-10 операндами являются переменные х и у, а также константы 5 и 10; а +, * — знаки арифметических операций сложения и умножения соответственно. Символ операции умножения — * (звездочка) должен присутствовать в явном виде. Если все объекты, входящие в выражение, определены в момент их использования (в нашем примере — это переменные х и у), то значение выражения считается определенным.
В простейшем случае выражение может состоять из одной переменной или константы. Круглые скобки ставятся так же, как и в обычных математических выражениях для управления порядком выполнения операций.
Операции 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.
Приоритет операций
Операция | Приоритет | Вид операции |
not, @ | Первый (высший) | Унарная операция |
*, /, div, mod, and, shl, shr | Второй | Операции типа умножения |
+, —, or, xor | Третий | Операции типа сложения |
=, , ,=, in | Четвертый | Операции отношения |
Обратите внимание — операции с равным приоритетом выполняются слева направо. Выражение, заключенное в скобки, перед выполнением вычисляется как отдельный операнд. При наличии вложенных скобок вычисления выполняются, начиная с самых внутренних. В тексте программы необходимо проверять парность расстановки скобок: число открывающих скобок должно быть равно числу закрывающих скобок.
Арифметические процедуры и функции
Стандартная функция | Выполняемое действие | Тип | |
аргумента | результата | ||
abs (x) | |x| | real | real |
integer | integer | ||
sqr (x) | x2 | real | real |
integer | integer | ||
sqrt (x) | x1/2 | real | real |
integer | real | ||
exp (x) | ex | real | real |
integer | real | ||
ln (x) | ln (x) | real | real |
integer | real | ||
sin (x) | sin (x) | real | real |
integer | real | ||
cos (x) | cos (x) | real | real |
integer | real | ||
arctan (x) | arctg (x) | real | real |
integer | real | ||
pi | число Π | – | real |
Вызов стандартной функции осуществляется путем указания в нужном месте программы имени функции (аbs, ln, ехр и др.) и ее аргумента, заключенного в круглые скобки. После вычисления значения функции ее вызов заменяется результатом, и расчет содержащего ее выражения продолжается дальше.
Следует знать:
- аргумент прямых тригонометрических функций sin и соs задается в радианах.
Для преобразования значения угла из радианной меры в градусную необходимо умножить величину угла на число 180/рi.
Для перевода значения угла из градусной меры в радианную необходимо умножить величину угла на число pi/180. - результат функции агсtаn получается в радианах;
- функция random ( N ) возвращает случайное число х, удовлетворяющее условию 0<=х. Тип аргумента и результата — word. В том случае, если нам необходимы целые случайные числа из диапазона A<=х<=B, мы можем получить их, используя выражение A+random (B-A+1).
Если параметр диапазон не указан, то random возвращает число х в диапазоне 0<=х<1. Тип результата — rеаl. В том случае, если нам необходимы вещественные случайные числа из другого диапазона: A < х< B, мы можем задать его при помощи A+B*random.
Перед первым обращением к функции random необходимо с помощью вызова процедуры randomize инициализировать программный генератор случайных чисел. В противном случае при каждом запуске программы датчик будет выдавать одни и те же числа. Эту особенность можно использовать при отладке программы; - процедура dec(х,n) уменьшает значение целочисленной переменной х на n .
Например, х:=10; dec (х, 2); {результат: 8} .
При отсутствии необязательного параметра n процедура принимает вид deс(х) , а значение х уменьшается на единицу; - процедура inc(х,n) увеличивает значение целочисленной переменной х на n.
Например, х:=10; inc(х,3); {результат: 13}.
При отсутствии необязательного параметра n процедура принимает вид inс (х), а значение х увеличивается на единицу; - функция frас(х) вычисляет дробную часть х.
Аргумент и результат — rеаl.
Например write (frас(0.25*11) :4:2); {результат 0.75}; - функция int (х) вычисляет целую часть х.
Аргумент и результат — rеа1.
Например, write(int(422.117) :4:2) ; {результат 422.00}.
Таким образом, х=int (х) +frас (х). - функция преобразования типа trunc(х) возвращает ближайшее целое число, меньше или равное вещественному х, для х>=0 , и больше или равное х, для х<=0 (от truncate, усекать). Таким образом, выполняется отбрасывание десятичных знаков после точки.
Аргумент — rеаl , результат — longint.
Например:
trunc ( 6.7); {результат: 6},
trunc;(-1.6); {результат:-1}. - Функция преобразования типа round(х) возвращает значение х, округленное до ближайшего целого числа (от round, круглый).
Аргумент — rеаl, результат — longint.
Например:
round (6.7); {результат:7},
round(-1.6); {результат:-2}. - Вычисление степени числа выполняется в Тurbо Раsсаl с использованием свойств логарифмов:
c=ab => Ln(c)= b*Ln(a) => c=eb*Ln(a) => c:=exp(b*Ln(a));
Таким образом, нельзя возвести в степень отрицательное число. Для этого можно использовать операторы циклов. - Для вычисления логарифма с основанием а используем:
Loga(x)=Ln(x)/Ln(a); - В Тurbо Раsсаl определены только три тригонометрические функции: sin, соs, аrсtg. Для вычисления остальных тригонометрических функций необходимо использовать известные соотношения:
tg(x)=sin(x)/cos(x);
ctg(x)=cos(x)/sin(x);
csc(x)=1/sin(x);
Оператор присваивания
Оператор присваивания является одним из основных операторов любого языка программирования.
Оператор присваивания предназначен для присваивания переменной значения выражения.
Формат оператора присваивания:
<переменная>:=<выражение>
В операторе присваивания слева от знака присваивания «:=» записывается переменная, а справа – выражение, численное значение которого присваивается этой переменной.
Выполнение оператора присваивания приведет к вычислению выражения и присваиванию значения выражения переменной.
Обязательным является требование, чтобы выражение и переменная были совместимы по присваиванию.
Например, оператор присваивания
y:=x+h/2;
означает, что переменной y присваивается число, полученное в результате вычисления выражения x+h/2 при известных числовых значениях переменных x и h .
Следует обратить внимание, что всем переменным в правой части оператора присваивания ранее уже были присвоены значения предыдущими операторами, например,
x:=0; h:=1;
Рассмотрим пример
t:=t+1;
Здесь переменной t присваивается значение, которое до этого момента имела переменная t, плюс 1. Если переменная t имела до выполнения этого оператора значение равное 7, то после исполнения оператора t:=t+1 значение переменной будет равно 8.
Арифметические выражения
Арифметические выражения строятся из арифметических констант, переменных, функций и операций над ними.
Правила записи и смысл арифметических выражений в Паскале почти не отличаются от обычной математической записи.
В арифметических выражениях используются следующие операции и соответствующие знаки:
Операция | Знак операции |
Сложение | + |
Вычитание | – |
Умножение | * |
Деление | / |
Деление целых чисел | div |
Остаток от деления целых чисел | mod |
Операции +, -, *, / имеют очевидный смысл. Результатом операции div будет целое значение, равное целой части результата деления первого числа на второе. Результатом операции mod будет целое значение, равное остатку от деления (но не дробной части).
Примеры арифметических операций:
Var
a,b,c:integer;
Begin
a:=10; b:=3;
c:=a mod b; {с равно 1 – равно остатку, но не дробной части}
c:= a div b; {с равно 3 – равно целой части }
b:=a+b; {b равно числу 13}
End.
Арифметические операции выполняются в порядке старшинства: сначала вычисление функции, затем умножение, деление, сложение, вычитание.
Если последовательность выполнения операций не определяется их старшинством, действия выполняются слева направо. Желаемый порядок выполнения операций всегда может быть задан соответствующим образом расставленными круглыми скобками. Допускается ставить лишние круглые скобки, если это упрощает чтение формулы.
Рассмотрим арифметическое выражение
-a*x*x+b/x*c+y-c*n/(a-b)
В таблице приведен порядок выполнения операций:
№ | Операция | № | Операция |
1 | a*x | 7 | -a*x*x+b/x*c+y |
2 | a*x*x | 8 | c*n |
3 | -a*x*x | 9 | (a-b) |
4 | b/x | 10 | c*n/(a-b) |
5 | b/x*c | 11 | -a*x*x+b/x*c+y-c*n/(a-b) |
6 | -a*x*x+b/x*c |
ЗАМЕЧАНИЕ. Все данные, входящие в арифметическое выражение, должны быть одного типа.
Исключение составляют только константы и переменные целого типа (integer), которые разрешается использовать в выражениях вещественного типа (real). Если в выражении используются данные целого и вещественного типа, результат операции будет вещественного типа. В других случаях необходимо выполнять преобразование данных.
Пример. Пусть переменные x и y описаны следующим образом:
var
x:integer;
y:real;
Рассмотрим оператор y:= x+2, в котором используются переменные целого, вещественного типов и константа. Результат операции будет вещественного типа, поэтому оператор y:=x+2; является допустимым, хотя справа от присваивания стоит целая переменная и константа;
Следующие операторы являются ошибочными:
x:=y+2 {несовместимость типов: переменной целого типа x присваивается значение переменной вещественного типа y}
x:=y/x {несовместимость типов: операция деления всегда возвращает значение вещественного типа}
Для обеспечения совместимости типов необходимо выполнять преобразования данных. Для преобразования Real в Integer имеются две функции:
Round() – округляет Real до ближайшего целого;
Trunc() – усекает Real путем отбрасывания дробной части.
Правильная запись рассматриваемых операторов: x:=y+2; и x:=y/x; имеет вид:
x:=round(y)+2;
x:=round(y/x);
x:=trunc(y)+2;
x:=trunc(y/x);
Программируя арифметические выражения, нужно иметь в виду следующие основные правила:
- Два знака арифметических операций нельзя писать рядом. Например, следующие записи будут неправильными:
+–a –b – следует писать +(–a) –b
a*–b – следует писать a*(–b)
- Знак умножения опускать нельзя, например, при записи произведения: a*b и 2*n, запись ab и 2n будет неправильной, так как ab воспринимается как идентификатор, а запись 2n не является идентификатором, потому что начинается с цифры.
- В арифметических выражениях допускается использовать только круглые скобки. Количество открывающих круглых скобок должно соответствовать количеству закрывающих круглых скобок. Применение фигурных и квадратных скобок запрещается, так как они имеют особое значение.
- Все данные, входящие в выражения должны быть одного типа. Если в выражении используются данные целого и вещественного типа, результат операции будет вещественного типа.
В арифметических выражениях могут использоваться различные элементарные функции. В языке Турбо Паскаль существуют стандартные функции. Пользователь может не знать, как вычисляется стандартная функция, ему достаточно правильно записать имя функции и ее аргумент. Наиболее часто используемые стандартные функции приведены в таблице:
Функция | Назначение |
Abs(x) | Абсолютное значение аргумента x |
Sqr(x) | Вычисляет квадрат аргумента x |
Sqrt(x) | Вычисляет квадратный корень аргумента x |
Exp(x) | Возвращает экспоненту аргумента ex (степень числа e=2,72) |
Ln(x) | Вычисляет натуральный логарифм аргумента x |
Pi | Значение числа p=3.1415926 |
Frac(x) | Дробная часть числа x |
Int(x) | Целая часть числа x |
Sin(x) | Синус аргумента x (угол в радианах) |
Cos(x) | Косинус аргумента x (угол в радианах) |
Arctan(x) | Арктангенс аргумента x (угол в радианах) |
Randomize | Инициализация генератора случайных чисел |
Random(x) | Если x отсутствует, то значением функции является случайное число типа real из диапазона 0<=…<Если задается значение x, то значением функции будет случайное число из диапазона 0< <x. |
В языке Турбо Паскаль нет операции возведения в степень. При необходимости ее использования можно воспользоваться следующей зависимостью:
x n = exp(n*ln(x));
Примеры записи простых арифметических выражений и операторов присваивания приведены в таблице:
Обычная математическая запись | Запись на Турбо Паскале |
x/(y*z) или x/y/z | |
y*x/z | |
(x+a)/(y+b) | |
1/(m*sqrt(a+b)) | |
x1:=(-b+sqrt(b*b-4*a*c))/(2*a) | |
y:=sin(x) | |
sqr((x+y-z)/2/a) |
Типичные ошибки в записи выражений:
4x+1 Пропущен знак умножения между 4 и x
a+sinx Аргумент x функции sinx не заключен в скобки
((a+b)/sqr(c*7) не хватает закрывающей скобки
ЗАДАЧА2. Вычислить корни квадратного уравнения
a∙x 2 +b∙x + c =0
по известным формулам
Предположим, что дискриминант этого уравнения больше нуля и уравнение имеет только действительные корни. Программа нахождения корней уравнения приведена ниже.
Program a2;
Var {раздел объявления переменных}
X1:real; {1-й корень уравнения}
X2:real; {2-й корень уравнения}
D:integer; {дискриминант уравнения}
A:integer; {коэффициент a}
B:integer; {коэффициент b}
C:integer; {коэффициент c}
Begin
Write(‘Введите коэффициенты a,b,c:’);
Readln(a,b,c); {чтение с клавиатуры коэффициентов}
D:=sqrt(b*b-4*a*c); {вычисление дискриминанта}
X1:=(-b+d)/(2*a); {вычисление 1-го корня уравнения}
X2:=(-b-d)/(2*a); {вычисление 2-го корня уравнения}
Write(‘Корни уравнения равны: ’, x1:8:2, x2:8:2);
End.
Результаты работы программы:
Введите коэффициенты a,b,c:2 –6 4
Корни уравнения равны: 2.00 1.00