// - #include #include #include #include #include #include #include #define ID_BUTTON_LOSUJ 2001 #define R_FSNEDECORA 0 #define R_CHIKWADRAT 1 #define R_TSTUDENTA 2 #define R_BETA 3 #define SCALE_FSNEDECORA 200 #define SCALE_CHIKWADRAT 50 #define SCALEX_CHIKWADRAT 500 #define IL_KLAS 20 #define MAX_DO_LOSOWANIA 1000 LPCSTR lpszAppName = "Generator liczb losowych o zadanym rozkładzie"; double wartf[1000], wMAX; double dystr[1000]; double wylosowane[MAX_DO_LOSOWANIA]; unsigned int klasy[IL_KLAS]; unsigned int pfx, pfy; // wsp punktu na ekranie okreslajacego poczatek ukl wsp dla rozkladu unsigned int IleLiczb; // ile liczb ma zostac wylosowanych double step, scalef; unsigned int pa, pb; // parametry rozkładu unsigned char cfr, cfg, cfb; // składowe koloru wykresu gestosci unsigned char chr, chg, chb; // składowe koloru wykresu histogramu char buf[100]; static char *endptr; static HWND EditIleLiczb; // ile liczb ma zostac wylosowanych static HWND ButtonLosuj; // losuj static HWND ListBoxWylosowane; // list box z wylosowanymi liczbami static HWND ComboBoxTyp; // rodzaj rozkladu static HWND Edit1, Edit2; // parametry rozkładu static HWND EditRf, EditGf, EditBf; // składowe koloru gestosci static HWND EditRh, EditGh, EditBh; // składowe koloru histogramu // zmienne wykorzystywane przez generator static double uu[97]; static ip=97; static jp=33; static double cc=362436.0/16777216.0; static double cd=7654321.0/16777216.0; static double cm=16777213.0/16777216.0; void rozklad_f_snedecora(double m, double n); void rozklad_chi_kwadrat(double m); double fun_podc_beta(double m, double n, double x); double fun_podc_gamma(double m, double x); double SimpBeta(double m, double n); double SimpGamma(double m); void Dystrybuanta(void); void Losuj(void); void Sortuj(void); void GEN_Restart(int i, int j, int k, int l); double GEN_uni(void); // Deklarcja procedury okna LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); // ************************************************************************************** int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { MSG msg; // Struktura komunikatu WNDCLASS wc; // Struktura klasy okna HWND hWnd; // Uchwyt głównego okna // Określenie klasy okna wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = (WNDPROC) WndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.hIcon = NULL; wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = NULL; wc.lpszMenuName = NULL; wc.lpszClassName = lpszAppName; // Zarejestrowanie klasy okna if(RegisterClass(&wc) == 0) return FALSE; // Stworzenie głównego okna aplikacji hWnd = CreateWindow( lpszAppName, lpszAppName, WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | WS_SYSMENU | WS_MINIMIZEBOX, 100, 100, 550, 550, NULL, NULL, hInstance, NULL); // Wyjście, jeśli nie powiodło się utworzenie okna if(hWnd == NULL) return FALSE; // Wyświetlenie okna ShowWindow(hWnd, SW_MAXIMIZE); UpdateWindow(hWnd); // Przetwarzanie komunikatów aż do momentu zakończenia działania aplikacji while( GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; } // Procedura okna, obsługuje wszystkie komunikaty skierowane do tego okna LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { HINSTANCE zad; HRGN hrgn; HBRUSH hBrush; HPEN hPen; RECT rc, rcHist; static HDC hDC; double step = 0.05, st=0; unsigned int licz=0, i, j; switch (message) { // Utworzenie okna case WM_CREATE: hDC = GetDC(hWnd); zad = ((LPCREATESTRUCT)lParam)->hInstance; ComboBoxTyp = CreateWindowEx(0, "COMBOBOX", "F Snedecora", CBS_DROPDOWN | WS_CHILD | WS_VISIBLE, 87, 18, 120, 200, hWnd, NULL, zad, NULL); SendMessage(ComboBoxTyp, CB_ADDSTRING, 0, (LPARAM) "F-Snedecora"); SendMessage(ComboBoxTyp, CB_ADDSTRING, 0, (LPARAM) "chi-kwadrat"); SendMessage(ComboBoxTyp, CB_ADDSTRING, 0, (LPARAM) "t-Studenta"); SendMessage(ComboBoxTyp, CB_ADDSTRING, 0, (LPARAM) "beta"); SendMessage(ComboBoxTyp, CB_SETCURSEL, 0, (LPARAM) 0); pa = 8; Edit1 = CreateWindowEx(0, "EDIT", "8", WS_CHILD | WS_VISIBLE | WS_BORDER, 306, 60, 20, 20, hWnd, NULL, zad, NULL); pb = 8; Edit2 = CreateWindowEx(0, "EDIT", "8", WS_CHILD | WS_VISIBLE | WS_BORDER, 372, 60, 20, 20, hWnd, NULL, zad, NULL); ButtonLosuj = CreateWindow("BUTTON","Losuj",WS_CHILD|WS_VISIBLE, 300, 18, 50, 23, hWnd,(HMENU)ID_BUTTON_LOSUJ, zad, NULL); cfr = 200; EditRf = CreateWindowEx(0, "EDIT", "200", WS_CHILD | WS_VISIBLE | WS_BORDER, 370, 20, 30, 20, hWnd, NULL, zad, NULL); cfg = 0; EditGf = CreateWindowEx(0, "EDIT", "0", WS_CHILD | WS_VISIBLE | WS_BORDER, 420, 20, 30, 20, hWnd, NULL, zad, NULL); cfb = 0; EditBf = CreateWindowEx(0, "EDIT", "0", WS_CHILD | WS_VISIBLE | WS_BORDER, 470, 20, 30, 20, hWnd, NULL, zad, NULL); chr = 0; EditRh = CreateWindowEx(0, "EDIT", "0", WS_CHILD | WS_VISIBLE | WS_BORDER, 370, 45, 30, 20, hWnd, NULL, zad, NULL); chg = 0; EditGh = CreateWindowEx(0, "EDIT", "0", WS_CHILD | WS_VISIBLE | WS_BORDER, 420, 45, 30, 20, hWnd, NULL, zad, NULL); chb = 200; EditBh = CreateWindowEx(0, "EDIT", "200", WS_CHILD | WS_VISIBLE | WS_BORDER, 470, 45, 30, 20, hWnd, NULL, zad, NULL); IleLiczb = 100; EditIleLiczb = CreateWindowEx(0, "EDIT", "100", WS_CHILD | WS_VISIBLE | WS_BORDER, 306, 60, 30, 20, hWnd, NULL, zad, NULL); ListBoxWylosowane = CreateWindowEx(0, "LISTBOX", "100", WS_CHILD | WS_VISIBLE | WS_BORDER | WS_HSCROLL | WS_VSCROLL | LBS_MULTICOLUMN, 700, 360, 300, 300, hWnd, NULL, zad, NULL); SendMessage(ListBoxWylosowane, LB_SETCOLUMNWIDTH, 50, (LPARAM) NULL); GEN_Restart(12,34,56,78); rozklad_f_snedecora(pa, pb); // rozklad_chi_kwadrat(pa); Dystrybuanta(); Losuj(); Sortuj(); for(i=0;i=st && wylosowane[j]wMAX) wMAX=wartf[i]; scalef = 300;//((rc.bottom-rc.top)/2-50)/wMAX; for(i=0; i<999; i++) { // rozkład MoveToEx(hDC, rc.left+25+step*i, rc.bottom-(rc.bottom-rc.top)/2-10-wartf[i]*scalef, NULL); LineTo(hDC, rc.left+25+step*(i+1), rc.bottom-(rc.bottom-rc.top)/2-10-wartf[i+1]*scalef); } DeleteObject(hPen); ValidateRect(hWnd, NULL); break; case WM_COMMAND: switch(wParam) { case ID_BUTTON_LOSUJ: SendMessage(EditIleLiczb, WM_GETTEXT, 5, (LPARAM)buf); IleLiczb=strtod(buf, &endptr); SendMessage(Edit1, WM_GETTEXT, 5, (LPARAM)buf); pa=strtod(buf, &endptr); SendMessage(Edit2, WM_GETTEXT, 5, (LPARAM)buf); pb=strtod(buf, &endptr); rozklad_f_snedecora(pa, pb); // rozklad_chi_kwadrat(pa); Dystrybuanta(); Losuj(); Sortuj(); SendMessage(ListBoxWylosowane, LB_RESETCONTENT, 0, 0); for(i=0;il-dystr[j-1]) { j--; } } wylosowane[i] = ((double)j)/SCALE_FSNEDECORA; fprintf(plik, "%d %.3f %.3f %.3f\n", i, l, dystr[j], wylosowane[i]); } fclose(plik); } void Sortuj(void) { unsigned int i, j; double t; for(i=0; ii; j--) { if(wylosowane[j]=32) s+=t; t*=0.6; } uu[ii]=s; } } double GEN_uni(void) { double pom; pom=uu[ip-1]-uu[jp-1]; if(pom<0.0) pom+=1; uu[ip-1]=pom; ip--; if(ip==0) ip=97; jp--; if(jp==0) jp=97; cc-=cd; if(cc<0.0) cc+=cm; pom-=cc; if(pom<0.0) pom+=1; return(pom); }