Исследование данных на предмет экспоненциальности распределения методом хи-квадрат (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;
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 4.083 из 5
Похожие ответы