КаталогИндекс раздела
НазадОглавлениеВперед


Лабораторная работа ╧3

Арифметические операции и математические функции языка С

1. Цель работы

     Целью лабораторной работы является получение практических навыков в програмировании алгеброичных выражений и использовании математических функций библиотеки языка C.

2. Темы для предварительной проработки

3. Задания для выполнения

     Составьте програму, которая подсчитывает и выводит значение t1 и t2 по формулам, которые приведены в Вашем варианте индивидуального задания. Определите области допустимых значений параметров формул и задайте произвольные значения из этих областей. Параметры, которые имеют имена: n и m - целые, остальные параметры - с плавающей точкой. Значения параметров с именами x и y должны вводиться с клавиатуры, значения остальных - задаваться как начальные значения при объявлении соответствующих переменных.      Допускается (и даже желательно) упростить / разложить формулы для того , чтобы обеспечить минимизацию объема вычислений .

4. Варианты индивидуальных заданий

 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      

5. Пример решения задачи (вариант 30)

     5.1. Разработка алгоритма решения.

     5.1.1. Основной алгоритм
     Алгоритм решения задачи - линейный и состоит из:

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

      Выражение ax встречается один раз в первой формуле и дважды - во второй. Следовательно, можно один раз произвести умножение a*x, а потом использовать этот результат.

    Во второй формуле дважды встречается умножение квадратного корня на тангенс - это вычисление можно так же сделать один раз.

    Выражение c2-b2 можно разложить на (c+b)(c-b). До разложения в выражении было две операции умножения (возведение в степень 2) и одна - сложения. После разложения - два сложения и одно умножение, что выгоднее для вычислений.

     5.1.3. Ограничения на значения параметров
     Аргумент функции, которую вычисляет логарифм, не может быть 0 или меньше. Отсюда вытекают требования к значениям:

     a * x + b > 0; y * x + d > 0

     Аргумент функции извлечения квадратного корня не может быть меньше 0, отсюда:

     c2 - b2 >= 0

     В знаменателе выражения не может быть 0, отсюда:

     

кроме того:

     

     5.2. Определение переменных программы

     Для решения задачи нам понадобятся переменные для представления каждого параметра формул - a, b, c, d, x, y и результатов - t1, t2. Кроме того, придется ввести дополнительную переменную ax для хранения промежуточного результата , необходимого для оптимизации. Тип всех переменных - double.

     5.3. Разработка текста программы

     Программа начинается с включения файлов:

    #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); 

     Полный текст программы приводится ниже.

/**************************************************/
/*            Лабораторная работа ╧3              */
/*       Арифметические выражения и функции       */
/*         Пример решения. Вариант ╧30.           */
/**************************************************/
#include <stdio.h>
#include <math.h>
int main(void) {
 /* параметры, которые вводятся */
 double x,y;
 /* параметры, которые задаются в программе */
 double a=12.5,  b=1.3;
 double c=14.1,  d=2.7;
 double t1, t2;   /* результаты */
 double ax;       /* рабочая переменная */

  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);
  return 0;
}

     5.4. Отладка программы

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

     5.5. Результаты работы программы

При работе программы на экран было выдано следущее:

Введите x, y >3.3 1.1
t1 = 0.348897
t2 = 0.0133405

     5.6. Выводы

При выполнении лабораторной работы изучены следующие темы:


Приложение. Некоторые стандартные математические функции.

Стандартные математические функции находятся в файле 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); 


КаталогИндекс раздела
НазадОглавлениеВперед