Перевести вычисление интеграла с Pascal - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Помогите перевести программу с Паскаля на Си
Program P1;
Var x0,x1,n,nom,N0,C1: integer;
    s0,s1,sh,xt0,sm0,int0,xt1,sm1,int1,PU: real; //Описываем типы данных
function Sinus(gradus : real) : real; // Функция синуса для задания сигнала
 var rad : real;
 begin
   rad:= gradus*Pi/180;
   Sinus:= sin(rad);
 end;
function integral(x:real):real; // Определенный интеграл, для использования
var                            //в 3 и 4 блоке структуры оптимального приема
 n1,i : integer; 
 a,b,shag,sum,itog : real; 
 BEGIN
 write('Начало интегрирования a = '); readln(a); 
 write('Конец интегрирования b = '); readln(b); 
 write('Количество разбиений интервала n = '); readln(n1); 
 
 shag:=(b-a)/n1; 
 sum:=0; 
 for i:=1 to n-1 do 
 sum := sum + sinus(shag*i+a); 
 sum := sum + (sinus(a)+sinus(b))/2; 
 itog:=(b-a)/n * sum;
 Integral:=itog;
 End;
 
Begin  // Начало программы.
Randomize;
n:=Random(100); //Зададим шум, использую ГСЧ.
N0:=Random(1000);
Writeln('Ввод значения сигналов S0 и S1'); //Вводим извествые сигналы S0 и S1.
Readln(x0,x1);
s0:=sinus(x0); s1:=sinus(x1);
sh:=sinus(n);
Writeln('Предположим, что передавался сигнал:');
Readln(nom); //Будем считать что передавался либо сигнал S0, либо сигнал S1.
C1:=0; //Значение порога.
If nom=1 Then
   Begin // При условии что в самом начале передавался S0.
        xt0:=s0+sh; //Смесь сигнала и шума
        sm0:=s0*xt0; // Результат после блока 2.
        int0:=(2/N0)*integral(sm0); //Результат после блока 4.
        
        xt1:=s1+sh; //Смесь сигнала и шума.
        sm1:=s1*xt1; // Результат после блока 1.
        int1:=(2/N0)*integral(sm1); //Результат после блока 3
        Writeln;
        
        PU:=s0-s1; // Блок 5.
        //Пороговое устройство. Блок 6.
        If PU>=C1 Then Writeln('Гипотеза Н0')  //Блок 7. Гипотезы.
                  Else Writeln('Гипотеза Н1'); //Блок 7.
   End
   Else
       Begin
        xt1:=s1+sh; //Смесь сигнала и шума
        sm1:=s1*xt1; // Результат после блока 2.
        int0:=(2/N0)*integral(sm1); //Результат после блока 3
        
        xt0:=s0+sh; //Смесь сигнала и шума
        sm0:=s0*xt0; // Результат после блока 2.
        int0:=(2/N0)*integral(sm0); //Результат после блока 4
        Writeln;
        
        PU:=s1-s0;
        If PU>=C1 Then Writeln('Гипотеза Н0')  //Блок 7. Гипотезы.
                  Else Writeln('Гипотеза Н1'); //Блок 7.
       End;
End.
проверка на запуск: Ввод значения сигналов S0 и S1 56 -56 Предположим, что передавался сигнал: 1 Начало интегрирования a = 0 Конец интегрирования b = 15 Количество разбиений интервала n = 1 Начало интегрирования a = 0 Конец интегрирования b = 15 Количество разбиений интервала n = 1 Гипотеза Н0

Решение задачи: «Перевести вычисление интеграла с Pascal»

textual
Листинг программы
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<math.h>
 
#define PI 3.14159265
 
int x0,x1,n,nom,N0,C1;
double s0,s1,sh,xt0,sm0,int0,xt1,sm1,int1,PU;
 
double Sinus(double gradus)
{
    double rad=gradus*PI/180.0;
    return sin(rad);
}
 
double integral(double x)
{
    int n1,i;
    double a,b,shag,sum,itog;
    printf("%s","Начало интегрирования a = ");
    scanf("%lf",&a);
    printf("%s","Конец интегрирования b = ");
    scanf("%lf",&b);
    printf("%s","Количество разбиений интервала n = ");
    scanf("%d",&n1);
    shag=double((b-a)/n1);
    sum=0.0;
    for(i=1;i<n+1;i++) sum=sum+Sinus(shag*i+a);
    sum=sum+(Sinus(a)+Sinus(b))/2.0;
    itog=(double((b-a)/n))*sum;
    return itog;
}
 
int main(void)
{
    srand(time(NULL));
    n=rand()%100;
    N0=rand()%1000;
    printf("%s","Ввод значения сигналов S0 и S1\n");
    scanf("%d%d",&x0,&x1);
    s0=Sinus(x0);
    s1=Sinus(x1);
    sh=Sinus(n);
    printf("%s","Предположим, что передавался сигнал:\n");
    scanf("%d",&nom);
    C1=0;
    if(nom==1)
    {
        xt0=s0+sh;
        sm0=s0*xt0;
        int0=(double(2.0/N0))*integral(sm0);
        xt1=s1+sh;
        sm1=s1*xt1;
        int1=(double(2.0/N0))*integral(sm1);
        printf("%s","\n");
        PU=s0-s1;
        if(PU>=C1) printf("%s","Гипотеза Н0\n");
        else printf("%s","Гипотеза Н1\n");
    }
    else
    {
        xt1=s1+sh;
        sm1=s1*xt1;
        int0=(double(2.0/N0))*integral(sm1);        
        xt0=s0+sh;
        sm0=s0*xt0;
        int0=(double(2.0/N0))*integral(sm0);
        printf("%s","\n");        
        PU=s1-s0;
        if(PU>=C1) printf("%s","Гипотеза Н0\n");
        else printf("%s","Гипотеза Н1\n");
    }
    return 0;
}

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

  1. Ввод значения сигналов S0 и S1
  2. Вычисление начального и конечного значений интервала интегрирования a и b
  3. Вычисление количества разбиений интервала n
  4. Вычисление шага разбиения shag
  5. Вычисление суммы Sinus(shag*i+a) для i от 1 до n
  6. Вычисление суммы Sinus(a)+Sinus(b))/2.0
  7. Вычисление итогового значения интеграла itog
  8. Вычисление значения сигналов s0 и s1
  9. Вычисление значения PU=s0-s1
  10. Проверка гипотезы Н0 или Н1 в зависимости от значения PU и переменной C1
  11. Вывод значения PU
  12. Вывод сообщения о том, какая гипотеза подтвердилась
  13. Возврат значения 0, чтобы указать, что программа успешно завершилась

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


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

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

15   голосов , оценка 3.933 из 5
Похожие ответы