2 Алгоритм основной программы
3 Алгоритмы функций
3.1 Алгоритм функции для построения графика исходного массива
3.2 Алгоритм функции для построения гистограммы и графика функции Лапласа
4 Текст программы
//Программа для статистических расчетов
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <math.h>
#include <graphics.h>
//Задание констант.
#define COL 256
#define MAX 50
//Инициализация глобальных переменных
int i,y1,y2;
//Функция инициализации графического режима
void initgr(void) //Тип и имя функции
{
int gdriver=DETECT,gmode,errorcode; /*Задание необходимых переменных*/
initgraph( &gdriver, &gmode, "D:\\"); /*Установка видеоадаптера в графический режим*/
errorcode=graphresult(); /*Возращение кода ошибки и присвоение его переменной errorcode*/
if(errorcode != grOk) //Проверка на наличие ошибки
{
printf("Ошибка :%s \n",grapherrormsg(errorcode));
printf("Для останова нажмите любую клавишу \n");
getch();
exit(1);
}
}
//Функция построения графика исходного массива
void graphmas(float V[]) //Тип и имя функции и аргумента
{
y1=3;
y2=6; //Определение изначальных координат по горизонтальной оси
setcolor(7); //Задание цвета
setviewport(20,10,630,235,1); //Создание графического окна
rectangle(1,1,610,225); //Обозначение границ окна
line(1,115,610,115);
for(i=1;i<COL;i++)
{
setcolor(5); //.
line(y1,(115-V[i-1]*0.5),y2,(115-V[i]*0.5)); //Построение графика
y1=y2;
y2+=3; //Смещение координат по горизонтальной оси
}
}
//Функция для построения гистограммы и графика функции Лапласа
void gistfun(float m[],float F[],int k)
{
y1=23;
y2=43;
setcolor(7);
setviewport(20,236,630,470,1);
rectangle(1,1,610,225);
for(i=1;i<=k;i++)
{
setfillstyle(1,5); //Задание типа и цвета заполнения
bar(y1,115,y2,(115-m[i]*50)); /*Построение гистограммы в соответствии с масштабом*/
setcolor(RED);
rectangle(y1,115,y2,(115-m[i]*50));
setcolor(GREEN);
if(i!=k)
line(y1,(115-F[i]*50),y2,(115-F[i+1]*50)); /*Построение графика функции Лапласа*/
y1=y2;
y2+=20;
}
}
void main(void) // Основная функция
{
clrscr();
//Инициализация необходимых переменных
int j;
float ojid,V[COL],sum=0,dis=0,otkl=0,VC[COL],pr,h,y1,y2,k,m[MAX],t[MAX],
F[MAX],fn[MAX],x,xn;
//Приём сигнала.
FILE *fptr; //Инициализация файловой переменной
fptr=fopen("D:\\B1B015.TXT","rt"); //Открытие файла, содержащего сигнал
if(fptr==NULL) //Проверка
{
printf("Ошибка \n");
getch();
exit(1); //
}
for(i=0;i<COL;i++)
{
fscanf(fptr,"%f",&V[i]);
sum+=V[i];
}
fclose(fptr);//Закрытие файла
/*Расчёт математического ожидания, дисперсии и среднеквадратического отклонения*/
ojid=sum/COL; //Определение математического ожидания
printf("\n");
printf("Математическое ожидание = %f \n",ojid);
for(i=0;i<COL;i++)
dis+=(V[i]-ojid)*(V[i]-ojid);
dis/=COL-1; //Дисперсия
otkl=sqrt(dis); //Отклонение
printf("Дисперсия = %f \n" ,dis);
printf("Среднеквадратическое отклонение = %f \n",otkl);
// Расчёт функции Лапласа
for(i=0;i<COL;i++)
VC[i]=V[i]-ojid; //Центрирование
for(i=0;i<COL;i++) //Сортировка методом выбора
for(j=i+1;j<COL;j++)
if(VC[i]>VC[j])
{
pr=VC[i];
VC[i]=VC[j];
VC[j]=pr;
}
h=(VC[255]-VC[0])/(1+3.322*log(COL)); /*Определение длины интервала по формуле Стерджеса*/
y1=VC[0]-h/2; //Начало первого интервала
y2=VC[255]+h; //Конец последнего
k=(y2-y1)/h; //Количество интервалов
k=int(k);
y2=y1+h;
for(i=1;i<=k;i++)
m[i]=0;
for(i=1;i<=k;i++) /*Частота попадания случайной величины в каждый интервал*/
{
for(j=0;j<COL;j++)
if((VC[j]>y1)&&(VC[j]<=y2))
m[i]+=VC[j];
y1=y2;
y2+=h;
}
y1=VC[0]-h/2;
x=0;
for(i=1;i<=k;i++)
{
m[i]=m[i]/COL; //Частость на данном интервале
t[i]=(y1+h/2-ojid)/dis;
y1+=h;
F[i]=exp(-t[i]*t[i]/2)/sqrt(6.28); //Функция Лапласа для текущего интервала
fn[i]=F[i]*h*COL/dis; //Теоретическая частота текущего интервала
x+=(m[i]-fn[i])*(m[i]-fn[i])/fn[i]; //Критерий Пирсона
}
xn=35.5;//Табличное значение расчётной статистики
xn*=xn;
printf("\n");
//Проверка гипотезы о нормальном распределении случайной величины
if(x<=xn)
printf("Нулевая гипотеза принимается на уровне значимости 5%.");
else printf("Гипотеза не принимается. Ищите ошибку.");
printf("\n");
getch();
//Построение графиков
initgr(); //Функция инициализации графического режима
graphmas(V); //Построение графика исходного массива
gistfun(m,F,k); //Гистограмма и функция Лапласа
getch();
closegraph(); //Закрытие графического режима
//Запись исходных данных и результатов расчётов в текстовый файл
fptr=fopen("D:\\kurs\rin.txt","w+t"); /*Создание файла для записи по указанному адресу*/
if(fptr==NULL) //Проверка
{
printf("Ошибка \n");
getch();
exit(1);
}
fprintf(fptr,"Исходные данные:\n");
for(i=0;i<COL;i++)
fprintf(fptr,"%f \n",V[i]); //Запись элементов массива
fprintf(fptr,"Математическое ожидание = %f \n",ojid); /*Запись математического ожидания*/
fprintf(fptr,"Дисперсия = %f \n",dis); //Запись дисперсии
fprintf(fptr,"Среднеквадратическое отклонение = %f \n",otkl); /*Запись отклонения*/
if(x<=xn) //Запись результатов проверки гипотезы гипотезы
fprintf(fptr,"Нулевая гипотеза принимается на уровне значимости 5%.");
else fprintf(fptr,"Гипотеза не принимается. Ищите ошибку.");
fclose(fptr); //Закрытие файла.
}
