Перевести программу численного интегрирования с Паскаля на Си - 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;
}

Объяснение кода листинга программы

  1. Программа содержит функцию f, которая принимает аргумент x типа double и возвращает результат вычисления функции на основе входного значения x. В данном случае, функция f вычисляет значение синуса x.
  2. Функция input используется для ввода данных от пользователя. Она запрашивает у пользователя число разбиений, нижнюю и верхнюю границы интегрирования, а также точность вычисления интеграла. Если введенные значения не удовлетворяют условиям, программа повторно запрашивает ввод.
  3. Функция integration выполняет численное интегрирование на основе введенных пользователем данных. Она использует метод Симона с линейным интерполированием для вычисления интеграла.
  4. Функция output выводит результаты вычислений на экран. Она выводит пределы интегрирования, точность вычисления и результат интегрирования.
  5. В функции main определены переменные n, a, b, e и r, которые используются для хранения введенных пользователем данных и результатов вычислений.
  6. Программа запрашивает у пользователя ввод данных, вычисляет интеграл с использованием функции integration и выводит результаты на экран с помощью функции output.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 3.8 из 5