Перевести вычисление интеграла с Pascal - C (СИ)
Формулировка задачи:
Помогите перевести программу с Паскаля на Си
проверка на запуск:
Ввод значения сигналов S0 и S1
56 -56
Предположим, что передавался сигнал:
1
Начало интегрирования a = 0
Конец интегрирования b = 15
Количество разбиений интервала n = 1
Начало интегрирования a = 0
Конец интегрирования b = 15
Количество разбиений интервала n = 1
Гипотеза Н0
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.Решение задачи: «Перевести вычисление интеграла с 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;
}
Объяснение кода листинга программы
- Ввод значения сигналов S0 и S1
- Вычисление начального и конечного значений интервала интегрирования a и b
- Вычисление количества разбиений интервала n
- Вычисление шага разбиения shag
- Вычисление суммы Sinus(shag*i+a) для i от 1 до n
- Вычисление суммы Sinus(a)+Sinus(b))/2.0
- Вычисление итогового значения интеграла itog
- Вычисление значения сигналов s0 и s1
- Вычисление значения PU=s0-s1
- Проверка гипотезы Н0 или Н1 в зависимости от значения PU и переменной C1
- Вывод значения PU
- Вывод сообщения о том, какая гипотеза подтвердилась
- Возврат значения 0, чтобы указать, что программа успешно завершилась