/****************************/
/* 一様分布の計算 */
/* coded by Y.Suganuma */
/****************************/
#include <stdio.h>
/****************************************/
/* 一様分布の計算(P(X = x), P(X < x)) */
/* x : データ */
/* a,b : 区間 */
/* pr : P(X = x) */
/* return : P(X < x) */
/****************************************/
#include <math.h>
double uniform(double x, double a, double b, double *pr)
{
double f = 0.0, y;
if (x < a) {
*pr = 0.0;
f = 0.0;
}
else if (x > b) {
*pr = 0.0;
f = 1.0;
}
else {
y = 1.0 / (b - a);
*pr = y;
f = y * (x - a);
}
return f;
}
/********/
/* main */
/********/
int main()
{
double a, b, x, pr, f, h, p;
int sw;
char file1[100], file2[100];
FILE *out1, *out2;
printf("下限(a)は? ");
scanf("%lf", &a);
printf("上限(b)は? ");
scanf("%lf", &b);
printf("目的とする結果は? \n");
printf(" =0 : 確率の計算( P(X = x) 及び P(X < x) の値)\n");
printf(" =1 : p%値( P(X > u) = 0.01p となるuの値) ");
scanf("%d", &sw);
if (sw == 0) {
printf("グラフ出力?(=1: yes, =0: no) ");
scanf("%d", &sw);
// 密度関数と分布関数の値
if (sw == 0) {
printf(" データは? ");
scanf("%lf", &x);
f = uniform(x, a, b, &pr);
printf("P(X = %f) = %f, P( X < %f) = %f (区間 [%f, %f])\n", x, pr, x, f, a, b);
}
// グラフ出力
else {
printf(" 密度関数のファイル名は? ");
scanf("%s", file1);
printf(" 分布関数のファイル名は? ");
scanf("%s", file2);
out1 = fopen(file1,"w");
out2 = fopen(file2,"w");
printf(" 刻み幅は? ");
scanf("%lf", &h);
for (x = a; x < b+0.5*h; x += h) {
if (x > b-0.5*h && x < b+0.5*h)
x = b;
f = uniform(x, a, b, &pr);
fprintf(out1, "%f %f\n", x, pr);
fprintf(out2, "%f %f\n", x, f);
}
}
}
// %値
else {
printf("%の値は? ");
scanf("%lf", &x);
p = 0.01 * x;
f = b - p * (b - a);
printf("%f%値 = %f (区間 [%f, %f])\n", x, f, a, b);
}
return 0;
}