Исследование данных на предмет экспоненциальности распределения методом хи-квадрат (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; } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д