Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h> //чтение и печать сообщений, циклы
- #include <locale.h> //русский язык через setlocale
- #include <math.h> //математические операторы. sqrt взятие корня, pow возведение в степень
- #include <stdlib.h>//для динамического объявляния массива
- #pragma warning(disable : 4996)//короче эта штука нужна, только если, будешь запускать в visual studia, если нет, то удали, если не сработает говори(удалить комментарий перел показом преподу)
- int id = 0; //текущие положение в формуле
- char str[80]; //массив для функции
- //объявляем функции, чтобы другие функции могли их найти
- float number(); //функция чтения цифр
- float connection(int mod, float left, float right); //производит матетические операции
- float sqrt_str(float h); //взятие корня
- float pow_str(float h); //возведение в степень
- float staples(float h); //работа со скобками
- float manager(int mod, float h); //основная функция чтения функции
- float number()
- {
- float n=0.0;
- while (str[id] >= '0' && str[id] <= '9') //пока мы возращаем цифры, записываем её и переходим на следущее
- {
- n = n * 10 + (str[id] - 48);
- id++;
- }
- return n; //возращаем число
- }
- float connection(int mod, float left, float right)
- {
- switch (mod) //mod отвечает за оперцию которую мы будем производить с цифрами
- {
- case 1:
- return left + right; //возращаем сумму
- case 2:
- return left - right; //возращаем разность
- case 3:
- if(right==0)
- {
- printf("Деление на ноль");
- exit(0);
- }
- return left / right; //возращаем частное
- case 4:
- return left * right; //возращаем произведение
- }
- }
- float sqrt_str(float h)
- {
- float n = 0.0; //переменная чтобы записать всё что находится в скобках
- int mod = 1; //установим Mod на 1, так как изначально стоит +
- n = staples(h); //вызываем функцию "staples", чтобы взять корень из всего, что в нем
- return sqrt(n); //возращаем результат взятие корня
- }
- float pow_str(float h)
- {
- float n = 0.0; //переменная чтобы записать всё что находится в скобках
- int mod = 1; //установим Mod на 1, так как изначально стоит +
- float st; //переменная для степени
- n = staples(h); //вызываем функцию "staples", чтобы возвести в степеь всё, что в скобках
- id++; //перейдем на степень
- if(str[id]=='(')
- {
- id++; st = staples(h); id++;
- }
- else
- st = number(); //вызываем функцию "number", чтобы записать все число
- return pow(n, st); //возращем результат возведение в степень
- }
- float staples(float h)
- {
- int mod = 1; //установим Mod на 1, так как изначально стоит +
- float n=0.0; //переменная чтобы записать всё что находится в скобках
- while (str[id] != ')') //читаем пока не найдем конец скобки
- {
- if (str[id] >= '0' && str[id] <= '9') //условие наличия цифра
- {
- n = connection(mod,n,number()); //вызавем "connection" для соединеия чисел и "number" для получения цифры
- }
- else if (str[id] == ' ') //игнорируем пробелы
- {
- id++; //увеличиваем положение так как мы обработали этот символ
- }
- else if (str[id] == '+') //меняем модификатор на сумму
- {
- mod = 1;
- id++;
- }
- else if (str[id] == '-') //меняем модификатор на разность
- {
- mod = 2;
- id++;
- }
- else if (str[id] == '/') //меняем модификатор на частное
- {
- mod = 3;
- id++;
- }
- else if (str[id] == '*') //меняем модификатор на произведение
- {
- mod = 4;
- id++;
- }
- else if (str[id] == '(') //если мы нашли скобку то считаем все в скобках и соединяем с нашим текущим значением в зависимости от n
- {
- id++;
- n = connection(mod, n, staples(h)); //вызавем "connection" для соединеия чисел и "staples" для подсчета значения в скобках
- id++;
- }
- else if (str[id] == 's') //если мы нашл 's' то это корень
- {
- id = id + 2; //увеличиваем на 2, так как первый сивол это s, второй скобка
- n = connection(mod, n, sqrt_str(h)); //вызавем "connection" для соединеия чисел и "sqrt_str" для подсчета корня
- }
- else if (str[id] == 'p') //если мы нашл 'p' то это степнь
- {
- id = id + 2;
- n = connection(mod, n, pow_str(h)); //вызавем "connection" для соединеия чисел и "pow_str" для подсчета степени
- }
- else if (str[id] == 'x') //если мы нашл 'x' то это переменная
- {
- n = connection(mod, n, h); //вызавем "connection" для соединеия чисел, где вместо х мы подставляем наш текущий шаг h
- id++;
- }
- else //защита от неверного ввода, если мы её получили,то просим перезаписать всю фукнцию
- {
- printf("Неверный ввод\nВведите ещё раз\n");
- scanf("%s", &str);
- id = 0;
- }
- }
- return n; //возращаем значение в скобках
- }
- float manager(float h)
- {
- int mod = 1; //установим Mod на 1, так как изначально стоит +
- float n=0.0; //переменная чтобы записать всё что находится в скобках
- while (str[id] != '\0') //читаем функцию, пока не дойдем до конца
- {
- if (str[id] >= '0' && str[id] <= '9') //условие наличия цифра
- {
- n = connection(mod, n, number()); //вызавем "connection" для соединеия чисел и "number" для получения цифры
- }
- else if (str[id] == ' ') //игнорируем пробелы
- {
- id++; //увеличиваем положение так как мы обработали этот символ
- }
- else if (str[id] == '+') //меняем модификатор на сумму
- {
- mod = 1;
- id++;
- }
- else if (str[id] == '-') //меняем модификатор на разность
- {
- mod = 2;
- id++;
- }
- else if (str[id] == '/') //меняем модификатор на частное
- {
- mod = 3;
- id++;
- }
- else if (str[id] == '*') //меняем модификатор на произведение
- {
- mod = 4;
- id++;
- }
- else if (str[id] == '(') //если мы нашли скобку то считаем все в скобках и соединяем с нашим текущим значением в зависимости от n
- {
- id++;
- n =connection(mod,n,staples(h)); //вызавем "connection" для соединеия чисел и "staples" для подсчета значения в скобках
- id++;
- }
- else if (str[id] == 's') //если мы нашл 's' то это корень
- {
- id += 2; //увеличиваем на 2, так как первый сивол это s, второй скобка
- n=connection(mod,n,sqrt_str(h));
- id++;
- }
- else if (str[id] == 'p') //если мы нашл 'p' то это степень
- {
- id += 2;
- n=connection(mod,n,pow_str(h)); //вызавем "connection" для соединеия чисел и "pow_str" для подсчета степени
- }
- else if (str[id] == 'x') //если мы нашл 'x' то это переменная
- {
- n = connection(mod, n,h); //вызавем "connection" для соединеия чисел, где вместо х мы подставляем наш текущий шаг h
- id++;
- }
- else //защита от неверного ввода, если мы её получили,то просим перезаписать всю фукнцию
- {
- printf("Неверный ввод\nВведите ещё раз\n");
- scanf("%s", &str);
- id = 0;
- }
- }
- return n;
- }
- int main()
- {
- setlocale(LC_ALL, "Russian"); //устанавливаем в консоле русский язык
- int a=0; // левая граница интеграла
- int b=0; // правая граница интеграла
- int n; // число отрезков
- float* array; // указатель на массив
- printf("Программа высчета интеграла\nКакой будет шаг?\n");
- scanf("%d", &n);
- array = (float*)malloc(n * sizeof(float)); //массив хранит значения после каждого увеличения
- float sum = 0; //значение интеграла
- //сообщения пользователю (просьба ввести границы) и запись его ответов
- printf("Укажите левую границы\n");
- scanf("%d", &a);
- printf("Укажите правую границы\n");
- scanf("%d", &b);
- float h = ((float) (b-a) )/ n; //шаг
- int mod = 1; //1 это плюс, 2 минус, 3 деление, 4 умножение. используется для соединения
- printf("Шаг равен %.2f\n", h); //сообщаем пользователю чему равен шаг
- //записаь функции в строку
- printf("Введите функцию\nчтобы написать корень напишите <<s(число)>>, например, s(x+1)\nчтобы написать степень напишите <<p(число)степень>>, например p(x+1)4\nдля указания переменной используйте x\nтакже не забывайте закрывать скобки\n");
- scanf("%s",&str);
- float j = a; //j отвечает за текущий шаг
- for (int k = 0;k<n+1; k=k+1) //просчитываем значения в каждом шаге, и записываем их в массив
- {
- array[k]= manager(j); //вызываем главную фукнцию, которая читает фукнцию, введеную пользователем
- id = 0;
- j = j + h;
- }
- for (int i = 0; i < n+1; i++) //высчет интеграла по правилу трапеции
- {
- if (i == 0 || i == n)
- {
- sum += array[i];
- }
- else
- {
- sum += 2 * array[i];
- }
- }
- sum = sum * (h / 2);
- printf("Интеграл приблизительно равен %f", sum);
- return 0;
- }
Add Comment
Please, Sign In to add comment