c++ / Лаб 2. Арифметические операции и математические функции
.pdfЛабораторная работа №2 Тема: Арифметические операции и математические функции.
Цель работы: получение практических навыков в программировании алгебраических выражений и использовании математических функций.
Теоретические сведения
Стандартные математические функции находятся в файле math.h. abs - абсолютное значение целого числа - |x|
int abs(int x);
labs - абсолютне значення "длинного" целого числа - |x|: long labs(long x);
fabs - абсолютное значение числа с плавающей точкой - |x|: double fabs(double x);
sqrt - извлечение квадратного корня: double sqrt(double x);
pow - возведение в степень:
double pow(double x, double y);
cos - косинус - cos x (здесь и далее x задается в радианах): double cos(double x);
sin - синус - sin x:
double sin(double x); tan - тангенс - tg x:
double tan(double x); acos - арккосинус - arccos x:
double cos(double x); asin - арксинус - arcsin x:
double sin(double x); atan - арктангенс - arctg x:
double atan(double x); atan2 - арктангенс - arctg x/y:
double atan2(double x, double y); exp - експонента :
double exp(double x); log - натуральный логарифм - ln x:
double log(double x);
log10 - десятичный логарифм - log10x: double log10(double x);
Темы для предварительной проработки
Типы данных языка C.
Объявление переменных.
Функции стандартного ввода-вывода.
арифметические операции
порядок выполнения операций
стандартные математические функции
Задание
Составьте программу, которая подсчитывает и выводит значение t1 и t2 по формулам, которые приведены в Вашем варианте индивидуального задания. Определите области допустимых значений параметров формул и задайте произвольные значения из этих областей. Параметры, которые имеют имена: n и m - целые, остальные параметры - с плавающей точкой. Значения параметров с именами x и y должны вводиться с клавиатуры, значения остальных - задаваться как начальные значения при объявлении соответствующих переменных. Допускается (и даже желательно) упростить / разложить формулы для того , чтобы обеспечить минимизацию объема вычислений .
|
Варианты индивидуальных заданий |
|
|
|
|
Вариант 0 |
|
Вариант 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 |
Вариант 00
Примеры решения задач (вариант 00)
Основной алгоритм
Алгоритм решения задачи - линейный и состоит из:
ввода значений x и y;
вычисления значения t1;
вычисления значения t2;
вывода значений t1 и t2.
Оптимизация алгоритма
Перед непосредственным программированием алгоритма проанализируем, как в
нем можно изменить объем вычислений.
Выражение ax встречается один раз в первой формуле и дважды - во второй. Следовательно, можно один раз произвести умножение a*x, а потом использовать этот результат.
Во второй формуле дважды встречается умножение квадратного корня на тангенс - это вычисление можно так же сделать один раз.
Выражение c2-b2 можно разложить на (c+b)(c-b). До разложения в выражении было две операции умножения (возведение в степень 2) и одна - сложения. После разложения - два сложения и одно умножение, что выгоднее для вычислений.
Ограничения на значения параметров
Аргумент функции, которую вычисляет логарифм, не может быть 0 или меньше. Отсюда вытекают требования к значениям:
a * x + b > 0; y * x + d > 0
Аргумент функции извлечения квадратного корня не может быть меньше 0,
отсюда: c2 - b2 >= 0
В знаменателе выражения не может быть 0, отсюда: кроме того:
Определение переменных программы
Для решения задачи нам понадобятся переменные для представления каждого параметра формул - a, b, c, d, x, y и результатов - t1, t2. Кроме того, придется ввести дополнительную переменную ax для хранения промежуточного результата , необходимого для оптимизации. Тип всех переменных - double.
Разработка текста программы
Программа начинается с включения файлов:
#include <stdio.h> #include <math.h>
в которых находятся описания функций вводавывода и математических функций соответственно.
Далее открываем главную функцию: int main(void)
Включаем описания переменных (см. п.5.2): double x,y;
double a=12.5, b=1.3; double c=14.1, d=2.7; double t1, t2;
double ax;
Вводятся значения для переменных x и y: printf("Введите x, y >");
scanf("%lf %lf",&x,&y);
Далее вычисляется первое промежуточное значение: ax=a*x;
ипервый результат: t1=(b*log(ax+b)/a+d*log(y*x+d)/y)/c;
Вычисляется второй промежуточный результат: ax=sqrt((c-b)*(c+b))*tan(ax);
ивычисляется второй окончательный результат: t2=log((ax+b)/(ax-b))/2/a/b;
Полученные результаты выводятся на экран: printf("t1 = %lg\n",t1); printf("t2 = %lg\n",t2);
Полный текст программы.
#include "stdafx.h" #include <iostream> #include <iomanip> #include <stdio.h> #include <conio.h> #include <math.h> #include <windows.h>
int _tmain(int argc, _TCHAR* argv[]) {double x,y;
/* параметры, которые задаются в программе */
double a=12.5, |
b=1.3; |
|
double c=14.1, |
d=2.7; |
|
double t1, t2; |
/* |
результаты */ |
double ax; |
/* |
рабочая переменная */ |
setlocale(0,"Rus"); // отображение русских букв в консоли printf("Введите x, y >");
scanf("%lf %lf",&x,&y); ax=a*x;
t1=(b*log(ax+b)/a+d*log(y*x+d)/y)/c; ax=sqrt((c-b)*(c+b))*tan(ax); t2=log((ax+b)/(ax-b))/2/a/b; printf("t1 = %lg\n",t1);
printf("t2 = %lg\n",t2); getch();
return 0;
}
Дополнительное задание 1
Создать интерфейс позволяющий выбрать один из вариантов расчета параметров, которые будут заданы в виде таблицы (выбор должен осуществляться по порядковому номеру и по типу выражения):
П/п |
Тип |
Выражение |
1 |
Логарифм |
t=1/(b^3)*(ln(y/x – a^2*x^2/(2*y^2))) |
2 |
Корень |
t=1/(b^0,5)*(y^0,5/x – a^0,5*x^2/(2*y^0,5))) |
3 |
Тригонометрия |
t=cos(bx+0,5)*sin(y/x – a^0,5*x^2) |
Дополнительное задание 2
Добавить возможность изменения формулы (замена имен параметров или операций).