Исследование данных на предмет экспоненциальности распределения методом хи-квадрат (C++ на C#)
Формулировка задачи:
Здравствуйте, знаю что тем таких много. Есть код который я написал на С++, но нужно переделать в С#.
Или можно просто все "->" заменить на "."?
#define KolInterval 7 // задаем кол-во интервалов
//----------------------------------------
TForm1 *Form1;
int N;
long double Interval = 0;
long double *M = NULL; // динамический массив для элементов
//long double KolPopodanuu_t[KolInterval] = {0};
long double XI[KolInterval] = {0};
//int KolPopodanuu_p[KolInterval] = {0};
long double MAXVALUE = 0;
long double MINVALUE = 0;
Variant vVarApp, books, book ,sheet; // для работы с excel
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ResultClick(TObject *Sender)
{
Series1->Clear();
for(int i = 0; i < N; i++) //Находим максимальное и минимальное значение в массиве
{
if(M[i] > MAXVALUE)
MAXVALUE = M[i];
if(M[i] < MINVALUE)
MINVALUE = M[i];
}
Interval = (MAXVALUE - MINVALUE) / KolInterval; //Высчитываем значение интервала
int KolPopodanuu_p[KolInterval] = {0}; //Создаем массив для практических попаданий
long double KolPopodanuu_t[KolInterval] = {0}; //Создаем массив для теоретических попаданий
for(int j = 0; j < N; j++) //Считаем кол-во попаданий в первый интервал
if(M[j] >= MINVALUE && M[j] < MINVALUE + Interval)
KolPopodanuu_p[0]++;
for(int i=1; i < KolInterval; i++) //Считываем кол-во попаданий в остальные интервалы
for(int j = 0; j < N; j++)
if(M[j] > MINVALUE + Interval * i && M[j] <= MINVALUE + Interval * (i+1))
KolPopodanuu_p[i]++;
long double X = 0; //Среднее арифметическое
long double L = 0; //Лямбда
for(int i = 0; i < N; i++)
X = X + M[i];
X = X/(long double)N; //Вычисляем сред ариф
L = 1/X; //вычисляем лямбда
for(int i = 0; i < KolInterval; i++)
{
KolPopodanuu_t[i] = (exp((-L * Interval * i)) - exp((-L * Interval * (i + 1)))) * N; //Считаем теоретическое ково попаданий
XI[i] = pow(KolPopodanuu_p[i] - KolPopodanuu_t[i], 2) / KolPopodanuu_t[i]; //Считаем ХИ для каждого интервала
}
long double XISUMM=0;
for(int i = 0; i < KolInterval; i++) //Считаем сумму ХИ
{
XISUMM += XI[i];
//ListBox1->Items->Add(FormatFloat( "0.0000", XI[i]));
}
//ListBox1->Items->Add(FormatFloat( "0.0000", XISUMM));
Label1->Caption ="Хи-квадрат равен:" + (FormatFloat( "0.0000", XISUMM)); //Выводим сумму ХИ в Label1
Result->Enabled = false; //Блокируем кнопку "Анализ"
if (XISUMM > 5.3481) Label3->Caption = "Последовательность экспоненциально распределена с вероятностью менее 50%";
if (XISUMM <= 5.3481 && XISUMM >4.5702) Label3->Caption = "Последовательность экспоненциально распределена с вероятностью более 50%";
if (XISUMM <= 4.5702 && XISUMM >3.8276) Label3->Caption = "Последовательность экспоненциально распределена с вероятностью более 60%";
if (XISUMM <= 3.8276 && XISUMM >3.0701) Label3->Caption = "Последовательность экспоненциально распределена с вероятностью более 70%";
if (XISUMM <= 3.0701 && XISUMM >2.2041) Label3->Caption = "Последовательность экспоненциально распределена с вероятностью более 80%";
if (XISUMM <= 2.2041 && XISUMM >1.6354) Label3->Caption = "Последовательность экспоненциально распределена с вероятностью более 90%";
if (XISUMM <= 1.6354 && XISUMM >1.2373) Label3->Caption = "Последовательность экспоненциально распределена с вероятностью более 95%";
if (XISUMM <= 1.2373 && XISUMM >0.8721) Label3->Caption = "Последовательность экспоненциально распределена с вероятностью более 97.5%";
if (XISUMM <= 0.8721) Label3->Caption = "Последовательность экспоненциально распределена с вероятностью более 99%";
//В зависимости от суммы ХИ выводи результат
for ( int i = 0; i < KolInterval; i++ )
Series1->Add(KolPopodanuu_p[i], FloatToStr(i), clBlue);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::LoadClick(TObject *Sender)
{
vVarApp=CreateOleObject("Excel.Application"); //создаем объект ОЛЕ для excel
vVarApp.OlePropertySet("Visible", 0); //Открываем excel
books = vVarApp.OlePropertyGet("Workbooks"); //Открываем "книги"
vVarApp.OlePropertySet("SheetsInNewWorkbook",1); //ОТкрываем "листы"
if(OpenDialog1->Execute())
{
books.Exec(Procedure("Open")<<OpenDialog1->FileName);
book = books.OlePropertyGet("Item",1); //Открываем первую "книгу"
sheet = book.OlePropertyGet("WorkSheets",1); // Открываем первый "лист"
AnsiString cellVal = 0;
int i = 0;
while(1)
{
i++;
cellVal = sheet.OlePropertyGet("Cells",i,1); //Считываем i-й элемент первого столбца
if(cellVal == "") //Пока не встретим пустое значение
break;
}
N = i - 1; //Это кол-во элементов "-1" потому, что пред цикл считает на 1 больше
M = new long double [N]; //Создаем массив элеменентов
for(int j = 1; j < N + 1; j++) // Цикл для заполнения массива элементами из excel
{
cellVal = sheet.OlePropertyGet("Cells",j,1);
M[j - 1] = cellVal.ToDouble();
}
MAXVALUE = M[0]; //присваиваем переменной MAXVALUE значение нулевого элемента
MINVALUE = M[0]; //присваиваем переменной MINVALUE значение нулевого элемента
vVarApp.OlePropertySet("DisplayAlerts",false);
vVarApp.OlePropertySet("Visible", 0);
vVarApp.OleProcedure("Quit");
vVarApp.Clear(); // закрываем excel
if (N < 50) //Проверка на кол-во значений в массиве
{
MessageBoxA(NULL,"Значений должно быть не менее 50","Ошибка",MB_OK);
return;
}
Result->Enabled = true; //Делаем активной кнопку "Анализ"
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
//Provider=MSDASQL.1;Password=root;Persist Security Info=True;User ID=root;Extended Properties="DATABASE=1274_aeg;DSN=DB;OPTION=0;PWD=root;PORT=0;SERVER=localhost;STMT=set names 'cp1251';UID=root"
FILE *F = fopen(".//11.txt","w");
for(int i = 0; i < Edit1->Text.ToInt(); i++)
{
DWORD Start = GetTickCount();
for(int i = 0; i< 99999999; i++)
int y = 0;
// здесь запрос
DWORD End = GetTickCount();
fprintf(F,"%i\n",End - Start);
}
fclose(F);
F = fopen(".//11.txt","r");
int c, sum = 0;
N = Edit1->Text.ToInt();
M = new long double [N]; //Создаем массив элеменентов
for(int j = 0; j < N; j++) // Цикл для заполнения массива элементами из excel
{
while( (c = fgetc(F)) != '\n')
sum = sum * 10 + (c - 48);
M[j] = sum;
sum = 0;
}
MAXVALUE = M[0]; //присваиваем переменной MAXVALUE значение нулевого элемента
MINVALUE = M[0]; //присваиваем переменной MINVALUE значение нулевого элемента
if (N < 50) //Проверка на кол-во значений в массиве
{
MessageBoxA(NULL,"Значений должно быть не менее 50","Ошибка",MB_OK);
return;
}
Result->Enabled = true; //Делаем активной кнопку "Анализ"
fclose(F);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Edit1KeyPress(TObject *Sender, char &Key)
{
if((Key < '0' || Key > '9') && Key != 8) // Этот обработчик стоит для всех Edit-ов (позволяет вводить только цифры)
Key = 0;
}
//---------------------------------------------------------------------------Решение задачи: «Исследование данных на предмет экспоненциальности распределения методом хи-квадрат (C++ на C#)»
textual
Листинг программы
using System;
using System.Windows.Forms;
#define KolInterval
//----------------------------------------
private TForm1 Form1;
private int N;
private double Interval = 0;
private double[] M = 0; // динамический массив для элементов
//long double KolPopodanuu_t[KolInterval] = {0};
private double[] XI = {0};
//int KolPopodanuu_p[KolInterval] = {0};
private double MAXVALUE = 0;
private double MINVALUE = 0;
private Variant vVarApp = new Variant(); // для работы с excel
private Variant books = new Variant();
private Variant book = new Variant();
private Variant sheet = new Variant();
//---------------------------------------------------------------------------
//C++ TO C# CONVERTER NOTE: _fastcall is not available in C#:
//ORIGINAL LINE: __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner)
private TForm1.TForm1(TComponent Owner)
{
this.TForm = Owner;
}
//---------------------------------------------------------------------------
//C++ TO C# CONVERTER WARNING: The original C++ declaration of the following method implementation was not found:
//ORIGINAL LINE: void __fastcall TForm1::ResultClick(TObject *Sender)
//C++ TO C# CONVERTER NOTE: _fastcall is not available in C#:
//---------------------------------------------------------------------------
//C++ TO C# CONVERTER WARNING: The original C++ declaration of the following method implementation was not found:
//ORIGINAL LINE: void __fastcall TForm1::LoadClick(TObject *Sender)
//C++ TO C# CONVERTER NOTE: _fastcall is not available in C#:
//---------------------------------------------------------------------------
//C++ TO C# CONVERTER WARNING: The original C++ declaration of the following method implementation was not found:
//ORIGINAL LINE: void __fastcall TForm1::Button1Click(TObject *Sender)
//C++ TO C# CONVERTER NOTE: _fastcall is not available in C#:
//---------------------------------------------------------------------------
//C++ TO C# CONVERTER WARNING: The original C++ declaration of the following method implementation was not found:
//ORIGINAL LINE: void __fastcall TForm1::Edit1KeyPress(TObject *Sender, sbyte &Key)
//C++ TO C# CONVERTER NOTE: _fastcall is not available in C#:
//---------------------------------------------------------------------------
internal static partial class DefineConstants
{
public const int KolInterval = 7;
}
public partial class TForm1
{
public void ResultClick(TObject Sender)
{
Series1.Clear();
for (int i = 0; i < N; i++) //Находим максимальное и минимальное значение в массиве
{
if (M[i] > MAXVALUE)
MAXVALUE = M[i];
if (M[i] < MINVALUE)
MINVALUE = M[i];
}
Interval = (MAXVALUE - MINVALUE) / DefineConstants.KolInterval; //Высчитываем значение интервала
int[] KolPopodanuu_p = new int[DefineConstants.KolInterval]; //Создаем массив для практических попаданий
double[] KolPopodanuu_t = {0}; //Создаем массив для теоретических попаданий
for (int j = 0; j < N; j++) //Считаем кол-во попаданий в первый интервал
if (M[j] >= MINVALUE && M[j] < MINVALUE + Interval)
KolPopodanuu_p[0]++;
for (int i = 1; i < DefineConstants.KolInterval; i++) //Считываем кол-во попаданий в остальные интервалы
for (int j = 0; j < N; j++)
if (M[j] > MINVALUE + Interval * i && M[j] <= MINVALUE + Interval * (i + 1))
KolPopodanuu_p[i]++;
double X = 0; //Среднее арифметическое
double L = 0; //Лямбда
for (int i = 0; i < N; i++)
X = X + M[i];
X = X / (double)N; //Вычисляем сред ариф
L = 1 / X; //вычисляем лямбда
for (int i = 0; i < DefineConstants.KolInterval; i++)
{
KolPopodanuu_t[i] = (Math.Exp((-L * Interval * i)) - Math.Exp((-L * Interval * (i + 1)))) * N; //Считаем теоретическое ково попаданий
XI[i] = Math.Pow(KolPopodanuu_p[i] - KolPopodanuu_t[i], 2) / KolPopodanuu_t[i]; //Считаем ХИ для каждого интервала
}
double XISUMM = 0;
for (int i = 0; i < DefineConstants.KolInterval; i++) //Считаем сумму ХИ
{
XISUMM += XI[i];
//ListBox1->Items->Add(FormatFloat( "0.0000", XI[i]));
}
//ListBox1->Items->Add(FormatFloat( "0.0000", XISUMM));
Label1.Caption = "Хи-квадрат равен:" + (FormatFloat("0.0000", XISUMM)); //Выводим сумму ХИ в Label1
Result.Enabled = false; //Блокируем кнопку "Анализ"
if (XISUMM > 5.3481)
Label3.Caption = "Последовательность экспоненциально распределена с вероятностью менее 50%";
if (XISUMM <= 5.3481 && XISUMM >4.5702)
Label3.Caption = "Последовательность экспоненциально распределена с вероятностью более 50%";
if (XISUMM <= 4.5702 && XISUMM >3.8276)
Label3.Caption = "Последовательность экспоненциально распределена с вероятностью более 60%";
if (XISUMM <= 3.8276 && XISUMM >3.0701)
Label3.Caption = "Последовательность экспоненциально распределена с вероятностью более 70%";
if (XISUMM <= 3.0701 && XISUMM >2.2041)
Label3.Caption = "Последовательность экспоненциально распределена с вероятностью более 80%";
if (XISUMM <= 2.2041 && XISUMM >1.6354)
Label3.Caption = "Последовательность экспоненциально распределена с вероятностью более 90%";
if (XISUMM <= 1.6354 && XISUMM >1.2373)
Label3.Caption = "Последовательность экспоненциально распределена с вероятностью более 95%";
if (XISUMM <= 1.2373 && XISUMM >0.8721)
Label3.Caption = "Последовательность экспоненциально распределена с вероятностью более 97.5%";
if (XISUMM <= 0.8721)
Label3.Caption = "Последовательность экспоненциально распределена с вероятностью более 99%";
//В зависимости от суммы ХИ выводи результат
for (int i = 0; i < DefineConstants.KolInterval; i++)
Series1.Add(KolPopodanuu_p[i], FloatToStr(i), clBlue);
}
public void LoadClick(TObject Sender)
{
vVarApp = CreateOleObject("Excel.Application"); //создаем объект ОЛЕ для excel
vVarApp.OlePropertySet("Visible", 0); //Открываем excel
books = vVarApp.OlePropertyGet("Workbooks"); //Открываем "книги"
vVarApp.OlePropertySet("SheetsInNewWorkbook",1); //ОТкрываем "листы"
if (OpenDialog1.Execute())
{
books.Exec(Procedure("Open") << OpenDialog1.FileName);
book = books.OlePropertyGet("Item",1); //Открываем первую "книгу"
sheet = book.OlePropertyGet("WorkSheets",1); // Открываем первый "лист"
AnsiString cellVal = 0;
int i = 0;
while (true)
{
i++;
cellVal = sheet.OlePropertyGet("Cells",i,1); //Считываем i-й элемент первого столбца
if (cellVal == "") //Пока не встретим пустое значение
break;
}
N = i - 1; //Это кол-во элементов "-1" потому, что пред цикл считает на 1 больше
M = new double [N]; //Создаем массив элеменентов
for (int j = 1; j < N + 1; j++) // Цикл для заполнения массива элементами из excel
{
cellVal = sheet.OlePropertyGet("Cells",j,1);
M[j - 1] = cellVal.ToDouble();
}
MAXVALUE = M[0]; //присваиваем переменной MAXVALUE значение нулевого элемента
MINVALUE = M[0]; //присваиваем переменной MINVALUE значение нулевого элемента
vVarApp.OlePropertySet("DisplayAlerts",false);
vVarApp.OlePropertySet("Visible", 0);
vVarApp.OleProcedure("Quit");
vVarApp.Clear(); // закрываем excel
if (N < 50) //Проверка на кол-во значений в массиве
{
MessageBox.Show("Значений должно быть не менее 50", "Ошибка", MessageBoxButtons.OK);
return;
}
Result.Enabled = true; //Делаем активной кнопку "Анализ"
}
}
public void Button1Click(TObject Sender)
{
//Provider=MSDASQL.1;Password=root;Persist Security Info=True;User ID=root;Extended Properties="DATABASE=1274_aeg;DSN=DB;OPTION=0;PWD=root;PORT=0;SERVER=localhost;STMT=set names 'cp1251';UID=root"
FILE F = fopen(".//11.txt","w");
for (int i = 0; i < Edit1.Text.ToInt(); i++)
{
uint Start = GetTickCount();
for (int i = 0; i < 99999999; i++)
int y = 0;
// здесь запрос
uint End = GetTickCount();
fprintf(F,"%i\n",End - Start);
}
fclose(F);
F = fopen(".//11.txt","r");
int c;
int sum = 0;
N = Edit1.Text.ToInt();
M = new double [N]; //Создаем массив элеменентов
for (int j = 0; j < N; j++) // Цикл для заполнения массива элементами из excel
{
while ((c = fgetc(F)) != '\n')
sum = sum * 10 + (c - 48);
M[j] = sum;
sum = 0;
}
MAXVALUE = M[0]; //присваиваем переменной MAXVALUE значение нулевого элемента
MINVALUE = M[0]; //присваиваем переменной MINVALUE значение нулевого элемента
if (N < 50) //Проверка на кол-во значений в массиве
{
MessageBox.Show("Значений должно быть не менее 50", "Ошибка", MessageBoxButtons.OK);
return;
}
Result.Enabled = true; //Делаем активной кнопку "Анализ"
fclose(F);
}
public void Edit1KeyPress(TObject Sender, ref sbyte Key)
{
if ((Key < '0' || Key > '9') && Key != 8) // Этот обработчик стоит для всех Edit-ов (позволяет вводить только цифры)
Key = 0;
}
}