📄
字号:
/*1、试编写求概率密度或分布律的通用函数,调用格式为Y=pdf(name,X,A);Y=pdf(name,X,A,B);Y=pdf(name,X,A,B,C)
返回参数为A,B,C的以name为分布的概率密度或分布律在X处的取值,name的值可为
bino--二项分布 poiss--泊松分布
unif--均匀分布 exp--指数分布
norm--正态分布调用例:
pdf('norm',0.7733,0,1)
结果:0.2958
注:即求标准正态分布密度函数在0.7733的值。
2、试编写求分布函数的通用函数,调用格式为
Y=cdf(name,X,A);Y=cdf(name,X,A,B);Y=cdf(name,X,A,B,C)
返回参数为A,B,C的以name为分布的分布函数在X处的取值,name的值可为
bino--二项分布 poiss--泊松分布
unif--均匀分布 exp--指数分布
norm--正态分布调用
例:
cdf('norm',2,3,2)
结果:0.3085
注:设X~N(3,22),求P{X不超过2}
答案:*/
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include<malloc.h>
#include<string.h>
#define PI 3.14159
#define Min exp(-4)
/*******************************第一问***************************/
//求n的阶陈
double C(int n)
{
int i=n;
double s=1.0;
while(i>0)
{
s*=i;
i--;
}
return(s);
}
//求r的k次幂
double M(double r,int k)
{
double T=1.0;
int i=1;
while(i<=k)
{
T*=r;
i++;
}
return(T);
}
//求仅有一个参数的函数值
double pdf(char *s,double x,double A)
{
int k;
k=(int)x;
if(strcmp(s,"poiss")==1)
return((M(A,k)*exp(-A))/C(k));
else if(strcmp(s,"exp")==1)
return((1/A)*exp(-x/A));
else
{
printf("调用错误!\n");
return(-1.0);
}
}
//求有两个参数的函数值
double pdf(char *s,double x,double A,double B)
{
int n,k;
double t;
n=(int)A;
k=(int)x;
if(strcmp(s,"bino")==1)
{
if(B>1)
{
printf("输入错误-->概率不能大于1\n");
return(-1.0);
}
else
{
if(x>A)
{
printf("输入错误-->成功次数不会大于实验次数!\n");
return(-1.0);
}
else
return((C(n)/(C(k)*C(n-k)))*M(B,k)*M(1-B,n-k));
}
}
else if(strcmp(s,"unif")==1)
{
if(x<A||x>B)
return(0.0);
else
return(1/fabs(A-B));
}
else if(strcmp(s,"norm")==1)
{
t=-((x-A)*(x-A))/(2*B*B);
return(1/((sqrt(2*PI)*B))*exp(t));
}
else
{
printf("调用错误!\n");
return(-1.0);
}
}
/*******************************第二问***************************/
//求一个函数的积分
double SubAdd(double(*f)(double t),double a,double b)
{
double x;//自变量
double y=Min;//增量
double sum=0.0;//累积和
x=a;
while(fabs(x-b)>Min)
{
sum+=f(x)*y;
x+=y;
}
return(sum);
}
void output()
{
printf("*****************************************************************************\n");
printf("\n\t\tbino-->二项分布\t\tpoiss--泊松分布\n\n\t\tunif--均匀分布\t\texp--指数分布\n\n\t\tnorm--正态分布调用\n");
printf("\n****************************************************************************\n");
}
//函数归类
void main()
{
output();
//double (*f)(double t);
//printf("积分为:\n");
//printf("%lf",SubAdd(f,PI/2,PI));
char* s;
double x,A,B;
printf("请输入函数名:\n");
s=(char*)malloc(6*sizeof(char));
gets(s);
if(strcmp(s,"norm")==1)
{
printf("输入三个参数:x(自便量),u(数学期望),r(标准差)\n");
scanf("%lf%lf%lf",&x,&A,&B);
printf("The result is : %lf\n",pdf(s,x,A,B));
}
else if(strcmp(s,"poiss")==1)
{
printf("输入两个参数:k(点值),r( ranmita)\n");
scanf("%lf%lf",&x,&A);
printf("The result is :%lf\n",pdf(s,x,A));
}
else if(strcmp(s,"unif")==1)
{
printf("输入三个参数:x(点),A(下界),B(上界)\n");
scanf("%lf%lf%lf",&x,&A,&B);
printf("The result is : %lf\n",pdf(s,x,A,B));
}
else if(strcmp(s,"bino")==1)
{
printf("输入三个参数:,k(事件A发生次数),n(实验次数),p(事件A发生的概率)\n");
scanf("%lf%lf%lf",&x,&A,&B);
printf("The result is : %lf\n",pdf(s,x,A,B));
}
else if(strcmp(s,"exp")==1)
{
printf("输入两个参数:x(点),O(sinta)\n");
scanf("%lf%lf",&x,&A);
printf("The result is :%lf\n",pdf(s,x,A));
}
free(s);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -