hurmawe

courswork_for_Denis

May 4th, 2022 (edited)
804
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 12.02 KB | None | 0 0
  1. #include <stdio.h>                                      //чтение и печать сообщений, циклы
  2. #include <locale.h>                                     //русский язык через setlocale
  3. #include <math.h>                                       //математические операторы. sqrt взятие корня, pow возведение в степень
  4.                                
  5. #include <stdlib.h>//для динамического объявляния массива
  6. #pragma warning(disable : 4996)//короче эта штука нужна, только если, будешь запускать в visual studia, если нет, то удали, если не сработает говори(удалить комментарий перел показом преподу)
  7.  
  8. int id = 0;                                             //текущие положение в формуле
  9. char str[80];                                           //массив для функции
  10.  
  11.  
  12. //объявляем функции, чтобы другие функции могли их найти
  13. float number();                                         //функция чтения цифр
  14. float connection(int mod, float left, float right);     //производит матетические операции
  15. float sqrt_str(float h);                                //взятие корня
  16. float pow_str(float h);                                 //возведение в степень
  17. float staples(float h);                                 //работа со скобками
  18. float manager(int mod, float h);                        //основная функция чтения функции
  19.  
  20. float number()
  21. {
  22.     float n=0.0;
  23.  
  24.     while (str[id] >= '0' && str[id] <= '9')            //пока мы возращаем цифры, записываем её и переходим на следущее
  25.     {
  26.         n = n * 10 + (str[id] - 48);
  27.         id++;
  28.     }
  29.     return n;                                           //возращаем число
  30. }
  31.  
  32. float connection(int mod, float left, float right)
  33. {
  34.     switch (mod)                                        //mod отвечает за оперцию которую мы будем производить с цифрами
  35.     {
  36.     case 1:
  37.         return left + right;                            //возращаем сумму
  38.     case 2:
  39.         return left - right;                            //возращаем разность
  40.     case 3:
  41.         if(right==0)
  42.         {
  43.             printf("Деление на ноль");
  44.             exit(0);
  45.         }
  46.         return left / right;                            //возращаем частное
  47.     case 4:
  48.         return left * right;                            //возращаем произведение
  49.     }
  50. }
  51.  
  52. float sqrt_str(float h)
  53. {
  54.     float n = 0.0;                                      //переменная чтобы записать всё что находится в скобках
  55.     int mod = 1;                                        //установим Mod на 1, так как изначально стоит +
  56.     n = staples(h);                                     //вызываем функцию "staples", чтобы взять корень из всего, что в нем
  57.    
  58.     return sqrt(n);                                     //возращаем результат взятие корня
  59. }
  60.  
  61. float pow_str(float h)
  62. {
  63.     float n = 0.0;                                      //переменная чтобы записать всё что находится в скобках
  64.     int mod = 1;                                        //установим Mod на 1, так как изначально стоит +
  65.     float st;                                               //переменная для степени
  66.     n = staples(h);                                     //вызываем функцию "staples", чтобы возвести в степеь всё, что в скобках
  67.     id++;                                               //перейдем на степень
  68.     if(str[id]=='(')
  69.     {
  70.         id++; st = staples(h); id++;
  71.     }
  72.     else
  73.         st = number();                              //вызываем функцию "number", чтобы записать все число
  74.     return pow(n, st);                                  //возращем результат возведение в степень
  75. }
  76.  
  77. float staples(float h)
  78. {
  79.     int mod = 1;                                        //установим Mod на 1, так как изначально стоит +
  80.     float n=0.0;                                        //переменная чтобы записать всё что находится в скобках
  81.     while (str[id] != ')')                              //читаем пока не найдем конец скобки
  82.     {
  83.         if (str[id] >= '0' && str[id] <= '9')           //условие наличия цифра
  84.         {
  85.             n = connection(mod,n,number());             //вызавем "connection" для соединеия чисел и "number" для получения цифры
  86.         }
  87.         else if (str[id] == ' ')                        //игнорируем пробелы
  88.         {
  89.             id++;                                       //увеличиваем положение так как мы обработали этот символ
  90.         }
  91.         else if (str[id] == '+')                        //меняем модификатор на сумму
  92.         {
  93.             mod = 1;
  94.             id++;
  95.         }
  96.         else if (str[id] == '-')                        //меняем модификатор на разность
  97.         {
  98.             mod = 2;
  99.             id++;
  100.         }
  101.         else if (str[id] == '/')                        //меняем модификатор на частное
  102.         {
  103.             mod = 3;
  104.             id++;
  105.         }
  106.         else if (str[id] == '*')                        //меняем модификатор на произведение
  107.         {
  108.             mod = 4;
  109.             id++;
  110.         }
  111.         else if (str[id] == '(')                        //если мы нашли скобку то считаем все в скобках и соединяем с нашим текущим значением в зависимости от n
  112.         {
  113.             id++;
  114.             n = connection(mod, n, staples(h));         //вызавем "connection" для соединеия чисел и "staples" для подсчета значения в скобках
  115.             id++;
  116.         }
  117.         else if (str[id] == 's')                        //если мы нашл 's' то это корень
  118.         {
  119.             id = id + 2;                                //увеличиваем на 2, так как первый сивол это s, второй скобка
  120.             n = connection(mod, n, sqrt_str(h));        //вызавем "connection" для соединеия чисел и "sqrt_str" для подсчета корня
  121.         }
  122.         else if (str[id] == 'p')                        //если мы нашл 'p' то это степнь
  123.         {
  124.             id = id + 2;
  125.             n = connection(mod, n, pow_str(h));         //вызавем "connection" для соединеия чисел и "pow_str" для подсчета степени
  126.         }
  127.         else if (str[id] == 'x')                        //если мы нашл 'x' то это переменная
  128.         {
  129.             n = connection(mod, n, h);                  //вызавем "connection" для соединеия чисел, где вместо х мы подставляем наш текущий шаг h
  130.             id++;
  131.         }
  132.         else                                            //защита от неверного ввода, если мы её получили,то просим перезаписать всю фукнцию
  133.         {
  134.             printf("Неверный ввод\nВведите ещё раз\n");
  135.             scanf("%s", &str);
  136.             id = 0;
  137.         }
  138.     }
  139.     return n;                                           //возращаем значение в скобках
  140. }
  141.  
  142. float manager(float h)
  143. {
  144.     int mod = 1;                                            //установим Mod на 1, так как изначально стоит +
  145.     float n=0.0;                                        //переменная чтобы записать всё что находится в скобках
  146.     while (str[id] != '\0')                             //читаем функцию, пока не дойдем до конца
  147.     {
  148.         if (str[id] >= '0' && str[id] <= '9')           //условие наличия цифра
  149.         {
  150.             n = connection(mod, n, number());           //вызавем "connection" для соединеия чисел и "number" для получения цифры
  151.         }
  152.         else if (str[id] == ' ')                        //игнорируем пробелы
  153.         {
  154.             id++;                                       //увеличиваем положение так как мы обработали этот символ
  155.         }
  156.         else if (str[id] == '+')                        //меняем модификатор на сумму
  157.         {
  158.             mod = 1;
  159.             id++;
  160.         }
  161.         else if (str[id] == '-')                        //меняем модификатор на разность
  162.         {
  163.             mod = 2;
  164.             id++;
  165.         }
  166.         else if (str[id] == '/')                        //меняем модификатор на частное
  167.         {
  168.             mod = 3;
  169.             id++;
  170.         }
  171.         else if (str[id] == '*')                        //меняем модификатор на произведение
  172.         {
  173.             mod = 4;
  174.             id++;
  175.         }
  176.         else if (str[id] == '(')                        //если мы нашли скобку то считаем все в скобках и соединяем с нашим текущим значением в зависимости от n
  177.         {
  178.             id++;
  179.             n =connection(mod,n,staples(h));            //вызавем "connection" для соединеия чисел и "staples" для подсчета значения в скобках
  180.             id++;
  181.         }
  182.         else if (str[id] == 's')                        //если мы нашл 's' то это корень
  183.         {
  184.             id += 2;                                    //увеличиваем на 2, так как первый сивол это s, второй скобка
  185.             n=connection(mod,n,sqrt_str(h));
  186.             id++;
  187.         }
  188.         else if (str[id] == 'p')                        //если мы нашл 'p' то это степень
  189.         {
  190.             id += 2;
  191.             n=connection(mod,n,pow_str(h));             //вызавем "connection" для соединеия чисел и "pow_str" для подсчета степени
  192.         }
  193.         else if (str[id] == 'x')                        //если мы нашл 'x' то это переменная
  194.         {
  195.             n = connection(mod, n,h);                   //вызавем "connection" для соединеия чисел, где вместо х мы подставляем наш текущий шаг h
  196.             id++;
  197.         }
  198.         else                                            //защита от неверного ввода, если мы её получили,то просим перезаписать всю фукнцию
  199.         {
  200.             printf("Неверный ввод\nВведите ещё раз\n");
  201.             scanf("%s", &str);
  202.             id = 0;
  203.         }
  204.     }
  205.     return n;
  206. }
  207.  
  208. int main()
  209. {
  210.     setlocale(LC_ALL, "Russian");                       //устанавливаем в консоле русский язык
  211.  
  212.     int a=0;                                            // левая граница интеграла
  213.     int b=0;                                            // правая граница интеграла
  214.     int n;                                              // число отрезков
  215.  
  216.     float* array;                                       // указатель на массив
  217.  
  218.     printf("Программа высчета интеграла\nКакой будет шаг?\n");
  219.     scanf("%d", &n);
  220.    
  221.                                    
  222.     array = (float*)malloc(n * sizeof(float));          //массив хранит значения после каждого увеличения
  223.     float sum = 0;                                      //значение интеграла
  224.  
  225.                                                         //сообщения пользователю (просьба ввести границы) и запись его ответов
  226.    
  227.     printf("Укажите левую границы\n");
  228.     scanf("%d", &a);
  229.     printf("Укажите правую границы\n");
  230.     scanf("%d", &b);
  231.  
  232.     float h = ((float) (b-a) )/ n;                      //шаг
  233.     int mod = 1;                                        //1 это плюс, 2 минус, 3 деление, 4 умножение. используется для соединения
  234.     printf("Шаг равен %.2f\n", h);                      //сообщаем пользователю чему равен шаг
  235.    
  236.                                                         //записаь функции в строку
  237.     printf("Введите функцию\nчтобы написать корень напишите <<s(число)>>, например, s(x+1)\nчтобы написать степень напишите <<p(число)степень>>, например p(x+1)4\nдля указания переменной используйте x\nтакже не забывайте закрывать скобки\n");
  238.     scanf("%s",&str);
  239.  
  240.     float j = a;                                        //j отвечает за текущий шаг
  241.     for (int k = 0;k<n+1; k=k+1)                        //просчитываем значения в каждом шаге, и записываем их в массив
  242.     {
  243.         array[k]= manager(j);                       //вызываем главную фукнцию, которая читает фукнцию, введеную пользователем
  244.         id = 0;
  245.         j = j + h;
  246.     }
  247.  
  248.     for (int i = 0; i < n+1; i++)                       //высчет интеграла по правилу трапеции
  249.     {
  250.         if (i == 0 || i == n)
  251.         {
  252.             sum += array[i];
  253.         }
  254.         else
  255.         {
  256.             sum += 2 * array[i];
  257.         }
  258.     }
  259.     sum = sum * (h / 2);
  260.  
  261.     printf("Интеграл приблизительно равен %f", sum);
  262.     return 0;
  263. }
  264.  
  265.  
  266.  
Add Comment
Please, Sign In to add comment