Лабораторная работа №3
Арифметические операции и математические функции
Цель работы:
Получение практических навыков в программировании алгебраичных выражений и использовании математических функций.
Общие сведения:
Арифметическое выражение - это совокупность констант, переменных и функций, объединенная знаками арифметических действий и круглыми скобками таким образом, чтобы данное выражение имело математический смысл.
Арифметические операции
операция
|
действие
|
тип операндов
|
тип результата
|
+
|
сложение
|
целый, вещественный
|
целый, вещественный
|
-
|
вычитание
|
целый, вещественный
|
целый, вещественный
|
*
|
умножение
|
целый, вещественный
|
целый, вещественный
|
/
|
деление
|
целый, вещественный
|
вещественный
|
DIV
|
целочисленное деление
|
целый
|
целый
|
MOD
|
остаток от деления
|
целый
|
целый
|
Правила записи арифметических выражений:
1. Арифметическое выражение записывается в строку.
2. Нельзя ставить подряд два знака арифметических операций.
3. Нельзя опускать знак умножения.
4. Можно использовать только круглые скобки.
5. Приоритет выполнения арифметических операций следующий:
-
Действия в скобках;
-
Вычисление функций;
-
Умножение, деление, DIV, MOD;
-
Сложение, вычитание;
Cтандартные математические функции
обращение
|
тип аргумента
|
тип результата
|
функция
|
Abs(х)
|
целый, вещественный
|
целый, вещественный
|
модуль аргумента
|x|
|
Sin(х)
|
целый, вещественный
|
вещественный
|
синус (х)
|
Cos(х)
|
целый, вещественный
|
вещественный
|
косинус (х)
|
Arctan(х)
|
целый, вещественный
|
вещественный
|
арктангенс (х)
|
Exp(х)
|
целый, вещественный
|
вещественный
|
ех - экспонента
|
Frac(х)
|
целый, вещественный
|
вещественный
|
дробная часть х
|
Int(х)
|
целый, вещественный
|
вещественный
|
целая часть х
|
ln(х)
|
целый, вещественный
|
вещественный
|
натуральный логарифм ln(x)
|
Random (х)
|
целый
|
целый
|
псевдослучайное число [0,х]
|
Round(х)
|
вещественный
|
целый
|
округление до ближайшего целого
|
Trunc(х)
|
вещественный
|
целый
|
округленное число, отбрасывая дробную часть числа x.
|
Sqr(х)
|
целый, вещественный
|
вещественный
|
x2
|
Sqrt(X)
|
целый, вещественный
|
вещественный
|
корень квадратный из х
|
Например, запишем по правилам Паскаля следующее математическое выражение:
На Паскале это выглядит так: 
Возведение в произвольную степень на Паскале
Стандартная функция sqr умеет возводить только во вторую степень.
Требуется вычислить значение с = ab. В зависимости от значений основания a и показателя степени b, вычисление степени может быть реализовано по-разному.
Если a > 0, а b может принимать произвольные вещественные значения, используем известную формулу ab = exp (b * ln a):
c:=exp(b*ln(a));
Если b - целое число (вообще говоря, "не слишком большое" по модулю), а a - любое (не равное нулю при b < 0), возведение в степень может быть реализовано с помощью цикла:
var i:integer;
{...}
c:=1;
for i:=1 to abs(b) do c:=c*a; {перемножение одинаковых сомножителей b раз}
if b<0 then c:=1/c; {учёт знака показателя}
Для целого b и не равного нулю a выгоднее считать с помощью экспоненты и логарифма, не забывая о том, что не существует логарифмов от отрицательных чисел:
c:=exp(b*ln(abs(a))); {степень положительного основания}
if (odd(b)=true) and (a<0) then c:=-c; {если основание отрицательно, а показатель нечетный, то меняем знак}
Вычисление корня произвольной степени на Паскале
Стандартная функция sqrt умеет извлекать только квадратный корень.
Извлечь корень степени n (где n - натуральное) из числа a можно всегда, кроме случая, когда a < 0 и при этом n четно. Извлечь корень степени n из числа a означает возвести число a в степень 1/n. При этом знак корня совпадает со знаком a. Ниже приводится код функции, вычисляющей корень произвольной степени n от своего аргумента a:
function root(a:real;n:word):real;
{Тип word здесь указывает, что n положительно}
var r: real;
begin
r:=exp(ln(abs(a))/n); {корень из модуля}
if a<0 then root:=-r else root:=r {учет знака}
end;
Вычисление логарифмов на Паскале
Стандартная функция ln вычисляет только натуральный логарифм. Для вычисления логарифмов по другим основаниям можно применить формулу log a b = ln b / ln a:
c:=ln(b)/ln(a);
В частности, для вычисления десятичного логарифма lg b можно записать:
c:=ln(b)/ln(10);
Порядок выполнения работы:
Составьте программу, которая подсчитывает и выводит значение t1 и t2 по формулам, которые приведены в Вашем варианте индивидуального задания (номер варианта совпадает с номером в списке журнала). Определите области допустимых значений параметров формул и задайте произвольные значения из этих областей. Значения параметров с именами x и y должны вводиться с клавиатуры, значения остальных - задаваться как начальные значения при объявлении соответствующих переменных. Допускается (и даже желательно) упростить / разложить формулы для того, чтобы обеспечить минимизацию объема вычислений.
Пример

3.1. Разработка алгоритма решения.
3.1.1. Основной алгоритм
Алгоритм решения задачи - линейный и состоит из:
-
ввода значений x и y;
-
вычисления значения t1;
-
вычисления значения t2;
-
вывода значений t1 и t2.
3.1.2. Оптимизация алгоритма
Перед непосредственным программированием алгоритма проанализируем, как в нем можно изменить объем вычислений.
-
Выражение a*x встречается один раз в первой формуле и дважды - во второй. Следовательно, можно один раз произвести умножение a*x, а потом использовать этот результат.
-
Во второй формуле дважды встречается умножение квадратного корня на тангенс - это вычисление можно так же сделать один раз.
-
Выражение c2-b2 можно разложить на (c+b)*(c-b). До разложения в выражении было две операции умножения (возведение в степень 2) и одна - сложения. После разложения - два сложения и одно умножение, что выгоднее для вычислений.
3.1.3. Ограничения на значения параметров
-
Аргумент функции, которую вычисляет логарифм, не может быть 0 или меньше. Отсюда вытекают требования к значениям: a * x + b > 0; y * x + d > 0
-
Аргумент функции извлечения квадратного корня не может быть меньше 0, отсюда: c2 - b2 >= 0
-
В знаменателе выражения не может быть 0, отсюда:
-
кроме того:
3.2. Определение переменных программы
Для решения задачи нам понадобятся переменные для представления каждого параметра формул - a, b, c, d, x, y и результатов - t1, t2. Кроме того, придется ввести дополнительную переменную a*x для хранения промежуточного результата, необходимого для оптимизации. Тип всех переменных - double.
3.3. Отладка программы
При отладке программы можно проверять правильность выполнения каждой операции. Для этого сложные операторы-выражения, разбиваются на последовательность операторов-выражений, в каждом из которых выполняется только одна операция. Результат каждой такой операции выводится на экран или отслеживается в пошаговом режиме.
4.4. Результаты работы программы
При работе программы на экран было выдано следующее:
Введите x, y >3.3 1.1
t1 = 0.348897
t2 = 0.0133405
Варианты заданий:
1
|
|
|
2
|
|
|
3
|
|
|
4
|
|
|
5
|
|
|
6
|
|
|
7
|
|
|
8
|
|
|
9
|
|
|
10
|
|
|
11
|
|
|
12
|
|
|
13
|
|
|
14
|
|
|
15
|
|
|
16
|
|
|
17
|
|
|
18
|
|
|
19
|
|
|
20
|
|
|
21
|
|
|
22
|
|
|
23
|
|
|
24
|
|
|
25
|
|
|
26
|
|
|
27
|
|
|
28
|
|
|
29
|
|
|
30
|
|
|
31
|
|
| 0>0> |