Перевести программу численного интегрирования с Паскаля на Си - C (СИ)
Формулировка задачи:
function f(x:real):real; var s:real; begin if x<=-pi then s:=0 else if x>pi/2 then s:=1 else s:=sin(x); f:=s; end; procedure input(var n:integer;var a:real;var b:real; var e:real); begin n:=10; writeln('Число разбиений: ',n); repeat write('Введите нижнюю границу интегрирования: '); readln(a); write('Введите верхнюю границу интегрирования: '); readln(b); if (a>b) then writeln ('a должно быть меньше b. Повторите ввод! '); until (ae>0): '); readln(e); until (e>0) and (e<1); end; procedure integration(var ln1:real; var ln2:real;var xi:real; var fi:real; n,i:integer; b,e,h,a:real); begin h:=(b-a)/n; ln1:=0; ln2:=2*e; repeat ln1:=ln2; h:=(b-a)/n; ln2:=0; for i:=1 to n do begin xi:=a+(i-1)*h; fi:=F(xi); ln2:=ln2+fi*h; end; n:=n*2; until abs(ln1-ln2)
Решение задачи: «Перевести программу численного интегрирования с Паскаля на Си»
textual
Листинг программы
#include <stdio.h> #include <math.h> double f (double x) { double s; if (x <= (-1.0 * M_PI)) s = 0.0; else if (x > (M_PI / 2.0)) s = 1.0; else s = sin(x); return s; } void input (int n, double *a, double *b, double *e) { printf("Число разбиений: %d\n", n); do { printf("Введите нижнюю границу интегрирования: "); scanf("%lf", a); printf("Введите верхнюю границу интегрирования: "); scanf("%lf", b); if (*a > *b) printf("a должно быть меньше b. Повторите ввод!\n"); } while (*a > *b); do { printf("Введите точность вычисления интеграла e (1>e>0): "); scanf("%lf", e); } while (*e < 0.0 || *e > 1.0); } double integration (int n, double a, double b, double e) { double ln1, ln2, fi, h; int i; ln2 = 2.0 * e; do { ln1 = ln2; h = (double) (b-a) / n; ln2 = 0.0; for (i=0; i<n; i++) { fi = f(a + (double) i*h); ln2 += fi*h; } n *= 2; } while (fabs(ln1-ln2) > e); return ln2; } void output (double a, double b, double e, double r) { printf("Интеграл на промежутке от %.2lf до %.2lf равен:\n", a, b); printf("%.3lf с точностью %.3lf\n", r, e); } int main (void) { int n = 10; double a, b, e, r; input(n, &a, &b, &e); r = integration(n, a, b, e); output(a, b, e, r); return 0; }
Объяснение кода листинга программы
- Программа содержит функцию
f
, которая принимает аргументx
типаdouble
и возвращает результат вычисления функции на основе входного значенияx
. В данном случае, функцияf
вычисляет значение синусаx
. - Функция
input
используется для ввода данных от пользователя. Она запрашивает у пользователя число разбиений, нижнюю и верхнюю границы интегрирования, а также точность вычисления интеграла. Если введенные значения не удовлетворяют условиям, программа повторно запрашивает ввод. - Функция
integration
выполняет численное интегрирование на основе введенных пользователем данных. Она использует метод Симона с линейным интерполированием для вычисления интеграла. - Функция
output
выводит результаты вычислений на экран. Она выводит пределы интегрирования, точность вычисления и результат интегрирования. - В функции
main
определены переменныеn
,a
,b
,e
иr
, которые используются для хранения введенных пользователем данных и результатов вычислений. - Программа запрашивает у пользователя ввод данных, вычисляет интеграл с использованием функции
integration
и выводит результаты на экран с помощью функцииoutput
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д