一様分布

/****************************/
/* 一様分布の計算           */
/*      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;
}