//****************************************************************************************************** //** Program rysujacy gestosc rozkladu i dystrybuante ** //** autor: Jacek Kuc ** //** wersja 1.0 dla kompilatora Borland C++ for Windows ver.3.1 ** //** Informacje na temat uzytkowania w pracy licencjackiej: ** //** "Rozklad f-Snedecora i rozklady pokrewne - ich zastosowanie w statystyce i metodach Monte Carlo" ** //** napisanej na Wydziele Matematyki Uniwersytetu Lodzkiego ** //** kopiowanie calosci i fragmentow bez zgody autora zabonione ** //** kontakt z autorem: jk1980@poczta.onet.pl ** //****************************************************************************************************** #include #include #include #include #include #include #define ID_BUTTON_RYSUJ 2001 #define R_FSNEDECORA 0 #define R_CHIKWADRAT 1 #define R_TSTUDENTA 2 #define R_BETA 3 #define PI 3.14159265358979323846 LPCSTR lpszAppName = "Rozklad F Snedecora"; double wartf[1000], wMAX; double dystr[1000], dMAX; double step, scalef, scaled; unsigned int pa, pb; // parametry rozkladu unsigned char cfr, cfg, cfb; // składowe koloru wykresu gestosci unsigned char cdr, cdg, cdb; // składowe koloru wykresu dystrybuanty unsigned int i; unsigned int typ; // rodzaj aktualnie wyswietlanego wykresu unsigned int pfx, pfy; // wsp punktu na ekranie okreslajacego poczatek ukl wsp dla rozkladu unsigned int pdx, pdy; // wsp punktu na ekranie okreslajacego poczatek ukl wsp dla dystrybuanty char buf[100]; static char *endptr; static HWND ComboBox; // wybor typu rozkladu static HWND Edit1, Edit2; // parametry rozkładu static HWND EditRf, EditGf, EditBf; // składowe koloru gestosci static HWND EditRd, EditGd, EditBd; // składowe koloru dystrybuanty static HWND Button1; // przycisk rysuj // Deklarcja procedury okna LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); void rozklad_f_snedecora(double m, double n); void rozklad_chi_kwadrat(double m); void rozklad_tstudenta(double m); void rozklad_beta(double m, double n); double SimpBeta(double m, double n); double SimpGamma(double m); double fun_podc_beta(double m, double n, double x); double fun_podc_gamma(double m, double x); void Dystrybuanta(); // ************************************************************************************** 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; unsigned int typ_wykresu; unsigned int rs; static HDC hDC; switch (message) { // Utworzenie okna case WM_CREATE: hDC = GetDC(hWnd); zad = ((LPCREATESTRUCT)lParam)->hInstance; ComboBox = CreateWindowEx(0, "COMBOBOX", "F Snedecora", CBS_DROPDOWN | WS_CHILD | WS_VISIBLE, 87, 18, 120, 200, hWnd, NULL, zad, NULL); SendMessage(ComboBox, CB_ADDSTRING, 0, (LPARAM) "F-Snedecora"); SendMessage(ComboBox, CB_ADDSTRING, 0, (LPARAM) "chi-kwadrat"); SendMessage(ComboBox, CB_ADDSTRING, 0, (LPARAM) "t-Studenta"); SendMessage(ComboBox, CB_ADDSTRING, 0, (LPARAM) "beta"); SendMessage(ComboBox, CB_SETCURSEL, 0, (LPARAM) 0); Button1 = CreateWindow("BUTTON","Rysuj",WS_CHILD|WS_VISIBLE, 300, 18, 50, 22, hWnd,(HMENU)ID_BUTTON_RYSUJ, zad, NULL); 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); cfr = 0; EditRf = CreateWindowEx(0, "EDIT", "0", WS_CHILD | WS_VISIBLE | WS_BORDER, 370, 20, 30, 20, hWnd, NULL, zad, NULL); cfg = 200; EditGf = CreateWindowEx(0, "EDIT", "200", 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); cdr = 0; EditRd = CreateWindowEx(0, "EDIT", "0", WS_CHILD | WS_VISIBLE | WS_BORDER, 370, 45, 30, 20, hWnd, NULL, zad, NULL); cdg = 100; EditGd = CreateWindowEx(0, "EDIT", "100", WS_CHILD | WS_VISIBLE | WS_BORDER, 420, 45, 30, 20, hWnd, NULL, zad, NULL); cdb = 0; EditBd = CreateWindowEx(0, "EDIT", "0", WS_CHILD | WS_VISIBLE | WS_BORDER, 470, 45, 30, 20, hWnd, NULL, zad, NULL); break; // Okno jest niszczone, więc przeprowadzamy porządki case WM_DESTROY: PostQuitMessage(0); break; // Zmianiają się rozmiary okna case WM_SIZE: break; // Funkcja rysująca. case WM_PAINT: GetClientRect(hWnd, &rc); typ = (unsigned int) SendMessage(ComboBox, CB_GETCURSEL, 0, 0); MoveWindow(ComboBox, ((rc.right-rc.left)/3*2)+(rc.right-rc.left)/6-60, 60, 120, 200, TRUE); MoveWindow(Edit1, ((rc.right-rc.left)/3*2)+(rc.right-rc.left)/6-40, 160, 20, 20, TRUE); MoveWindow(Edit2, ((rc.right-rc.left)/3*2)+(rc.right-rc.left)/6+40, 160, 20, 20, TRUE); MoveWindow(EditRf, ((rc.right-rc.left)/3*2)+(rc.right-rc.left)/6-30, 268, 30, 20, TRUE); MoveWindow(EditGf, ((rc.right-rc.left)/3*2)+(rc.right-rc.left)/6+10, 268, 30, 20, TRUE); MoveWindow(EditBf, ((rc.right-rc.left)/3*2)+(rc.right-rc.left)/6+50, 268, 30, 20, TRUE); MoveWindow(EditRd, ((rc.right-rc.left)/3*2)+(rc.right-rc.left)/6-30, 293, 30, 20, TRUE); MoveWindow(EditGd, ((rc.right-rc.left)/3*2)+(rc.right-rc.left)/6+10, 293, 30, 20, TRUE); MoveWindow(EditBd, ((rc.right-rc.left)/3*2)+(rc.right-rc.left)/6+50, 293, 30, 20, TRUE); MoveWindow(Button1, ((rc.right-rc.left)/3*2)+(rc.right-rc.left)/6-25, 364, 50, 22, TRUE); hBrush = CreateSolidBrush(RGB(200, 200, 200)); FillRect(hDC, &rc, hBrush); DeleteObject(hBrush); // narysowanie ramek hPen = CreatePen(PS_SOLID, 2, RGB(0, 0, 125)); SelectObject(hDC, hPen); RoundRect(hDC, rc.left+10, rc.top+10, rc.right-(rc.right-rc.left)/3-5, rc.bottom-10, 10, 10); RoundRect(hDC, rc.right-(rc.right-rc.left)/3+5, rc.top+10, rc.right-10, rc.top+100, 10, 10); RoundRect(hDC, rc.right-(rc.right-rc.left)/3+5, rc.top+110, rc.right-10, rc.top+200, 10, 10); RoundRect(hDC, rc.right-(rc.right-rc.left)/3+5, rc.top+210, rc.right-10, rc.top+340, 10, 10); RoundRect(hDC, rc.right-(rc.right-rc.left)/3+5, rc.top+350, rc.right-10, rc.top+400, 10, 10); RoundRect(hDC, rc.right-(rc.right-rc.left)/3+5, rc.top+410, rc.right-10, rc.bottom-10, 10, 10); DeleteObject(hPen); TextOut(hDC, ((rc.right-rc.left)/3*2)+(rc.right-rc.left)/6-50, 30, "Typ rozkładu: ", 14); TextOut(hDC, ((rc.right-rc.left)/3*2)+(rc.right-rc.left)/6-60, 130, "Parametry rozkładu: ", 20); TextOut(hDC, ((rc.right-rc.left)/3*2)+(rc.right-rc.left)/6-70, 160, "m = ", 4); TextOut(hDC, ((rc.right-rc.left)/3*2)+(rc.right-rc.left)/6+15, 160, "n = ", 4); TextOut(hDC, ((rc.right-rc.left)/3*2)+(rc.right-rc.left)/6-20, 230, "Kolory:", 7); SetTextColor(hDC, RGB(255, 0, 0)); TextOut(hDC, ((rc.right-rc.left)/3*2)+(rc.right-rc.left)/6-22, 250, "R", 1); SetTextColor(hDC, RGB(0, 255, 0)); TextOut(hDC, ((rc.right-rc.left)/3*2)+(rc.right-rc.left)/6+20, 250, "G", 1); SetTextColor(hDC, RGB(0, 0, 255)); TextOut(hDC, ((rc.right-rc.left)/3*2)+(rc.right-rc.left)/6+60, 250, "B", 1); SetTextColor(hDC, RGB(cfr, cfg, cfb)); TextOut(hDC, ((rc.right-rc.left)/3*2)+(rc.right-rc.left)/6-100, 270, "Gęstość:", 8); SetTextColor(hDC, RGB(cdr, cdg, cdb)); TextOut(hDC, ((rc.right-rc.left)/3*2)+(rc.right-rc.left)/6-134, 295, "Dystrybuanta:", 13); SetTextColor(hDC, RGB(0, 0, 0)); TextOut(hDC, rc.right-(rc.right-rc.left)/3+25, rc.top+440, "Program rysuje gęstości rozkładów:",34); TextOut(hDC, rc.right-(rc.right-rc.left)/3+25, rc.top+460, " - F-Snedecora",16); TextOut(hDC, rc.right-(rc.right-rc.left)/3+25, rc.top+480, " - chi kwadrat",16); TextOut(hDC, rc.right-(rc.right-rc.left)/3+25, rc.top+500, " - t Studenta",15); TextOut(hDC, rc.right-(rc.right-rc.left)/3+25, rc.top+520, " - beta",9); TextOut(hDC, rc.right-(rc.right-rc.left)/3+25, rc.top+560, "Zalecana rozdzielczość 1024x768.",32); TextOut(hDC, rc.right-(rc.right-rc.left)/3+25, rc.top+600, "wersja 1.0, autor: Jacek Kuć, WM UŁ",35); TextOut(hDC, rc.right-(rc.right-rc.left)/3+25, rc.top+660, "-------------------------- Łódź 2004 --------------------------",63); pfx = rc.left+25; pfy = rc.top+(rc.bottom-rc.left)/2-10; pdx = rc.left+25; pdy = rc.top+(rc.bottom-rc.left)-25; // narysowanie ukladow wspolrzednych hPen = CreatePen(PS_SOLID, 2, RGB(0, 0, 0)); SelectObject(hDC, hPen); // gorny uklad wspolrzednych MoveToEx(hDC, rc.left+20, rc.bottom-(rc.bottom-rc.top)/2-10, NULL); LineTo(hDC, rc.right-(rc.right-rc.left)/3-15, rc.bottom-(rc.bottom-rc.top)/2-10); MoveToEx(hDC, rc.left+25, rc.bottom-(rc.bottom-rc.top)/2-5, NULL); LineTo(hDC, rc.left+25, rc.top+20); // strzalka na osi pionowej MoveToEx(hDC, rc.left+25, rc.top+20, NULL); LineTo(hDC, rc.left+25-2, rc.top+30); MoveToEx(hDC, rc.left+25, rc.top+20, NULL); LineTo(hDC, rc.left+25+2, rc.top+30); // strzalka na osi poziomej MoveToEx(hDC, rc.right-(rc.right-rc.left)/3-15, rc.bottom-(rc.bottom-rc.top)/2-10, NULL); LineTo(hDC, rc.right-(rc.right-rc.left)/3-25, rc.bottom-(rc.bottom-rc.top)/2-8); MoveToEx(hDC, rc.right-(rc.right-rc.left)/3-15, rc.bottom-(rc.bottom-rc.top)/2-10, NULL); LineTo(hDC, rc.right-(rc.right-rc.left)/3-25, rc.bottom-(rc.bottom-rc.top)/2-12); // dolny uklad wspolrzednych // os pozioma MoveToEx(hDC, rc.left+20, rc.bottom-25, NULL); LineTo(hDC, rc.right-(rc.right-rc.left)/3-15, rc.bottom-25); // os pionowa MoveToEx(hDC, rc.left+25, rc.bottom-20, NULL); LineTo(hDC, rc.left+25, rc.bottom-(rc.bottom-rc.top)/2+5); // strzelka na osi pionowej MoveToEx(hDC, rc.left+25, rc.bottom-(rc.bottom-rc.top)/2+5, NULL); LineTo(hDC, rc.left+25-2, rc.bottom-(rc.bottom-rc.top)/2+15); MoveToEx(hDC, rc.left+25, rc.bottom-(rc.bottom-rc.top)/2+5, NULL); LineTo(hDC, rc.left+25+2, rc.bottom-(rc.bottom-rc.top)/2+15); // strzalka na osi poziomej MoveToEx(hDC, rc.right-(rc.right-rc.left)/3-15, rc.bottom-25, NULL); LineTo(hDC, rc.right-(rc.right-rc.left)/3-25, rc.bottom-23); MoveToEx(hDC, rc.right-(rc.right-rc.left)/3-15, rc.bottom-25, NULL); LineTo(hDC, rc.right-(rc.right-rc.left)/3-25, rc.bottom-27); DeleteObject(hPen); // narysowanie wykresu switch(typ) { case R_FSNEDECORA: rozklad_f_snedecora(pa, pb); break; case R_CHIKWADRAT: rozklad_chi_kwadrat(pa); break; case R_TSTUDENTA: rozklad_tstudenta(pa); break; case R_BETA: rozklad_beta(pa, pb); break; } Dystrybuanta(); hPen = CreatePen(PS_SOLID, 3, RGB(cfr, cfg, cfb)); SelectObject(hDC, hPen); step = (double)(rc.right-rc.left-(rc.right-rc.left)/3-40)/300; // znalezienie max w tablicy wartf[] celem pozniejszego przeskalowania wMAX = 0; for(i=0;i<299;i++) if(wartf[i]>wMAX) wMAX=wartf[i]; dMAX = 1; scalef = ((rc.bottom-rc.top)/2-50)/wMAX; scaled = ((rc.bottom-rc.top)/2-50)/dMAX; sprintf(buf, "%.2f", wMAX); TextOut(hDC, pfx+6, pfy-scalef*wMAX-18, buf, 4); sprintf(buf, "%.2f", wMAX/2); TextOut(hDC, pfx+6, pfy-scalef*wMAX/2-18, buf, 4); TextOut(hDC, pfx+6, pdy-scaled*dMAX-18, "1.0", 3); TextOut(hDC, pfx+6, pdy-scaled*dMAX/2-18, "0.5", 3); switch(typ) { case R_FSNEDECORA: SetTextColor(hDC, RGB(cfr, cfg, cfb)); sprintf(buf, "Gęstość rozkładu F-Snedecora (m=%d, n=%d) ",(unsigned int)pa,(unsigned int)pb); TextOut(hDC, rc.right-(rc.right-rc.left)/3-350, pfy-scalef*wMAX-20, buf, 42); SetTextColor(hDC, RGB(cdr, cdg, cdb)); sprintf(buf, "Dystrybuanta rozkładu F-Snedecora (m=%d, n=%d) ",(unsigned int)pa,(unsigned int)pb); TextOut(hDC, rc.right-(rc.right-rc.left)/3-350, pdy-scaled*dMAX-20, buf, 47); rs = 60; break; case R_CHIKWADRAT: SetTextColor(hDC, RGB(cfr, cfg, cfb)); sprintf(buf, "Gęstość rozkładu chi-kwadrat (m=%d) ",(unsigned int)pa); TextOut(hDC, rc.right-(rc.right-rc.left)/3-350, pfy-scalef*wMAX-20, buf, 42); SetTextColor(hDC, RGB(cdr, cdg, cdb)); sprintf(buf, "Dystrybuanta rozkładu chi-kwadrat (m=%d) ",(unsigned int)pa); TextOut(hDC, rc.right-(rc.right-rc.left)/3-350, pdy-scaled*dMAX-20, buf, 47); rs = 10; break; case R_TSTUDENTA: SetTextColor(hDC, RGB(cfr, cfg, cfb)); sprintf(buf, "Gęstość rozkładu t-Studenta (m=%d) ",(unsigned int)pa); TextOut(hDC, rc.right-(rc.right-rc.left)/3-350, pfy-scalef*wMAX-20, buf, 42); SetTextColor(hDC, RGB(cdr, cdg, cdb)); sprintf(buf, "Dystrybuanta rozkładu t-Studenta (m=%d) ",(unsigned int)pa); TextOut(hDC, rc.right-(rc.right-rc.left)/3-350, pdy-scaled*dMAX-20, buf, 47); rs = 30; break; case R_BETA: SetTextColor(hDC, RGB(cfr, cfg, cfb)); sprintf(buf, "Gęstość rozkładu beta (m=%d, n=%d) ",(unsigned int)pa,(unsigned int)pb); TextOut(hDC, rc.right-(rc.right-rc.left)/3-350, pfy-scalef*wMAX-20, buf, 42); SetTextColor(hDC, RGB(cdr, cdg, cdb)); sprintf(buf, "Dystrybuanta rozkładu beta (m=%d, n=%d) ",(unsigned int)pa, (unsigned int)pb); TextOut(hDC, rc.right-(rc.right-rc.left)/3-350, pdy-scaled*dMAX-20, buf, 47); rs = 300; break; } // narysowanie rozkładu for(i=0; i<299; i++) { 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); hPen = CreatePen(PS_SOLID, 2, RGB(0, 0, 0)); SelectObject(hDC, hPen); i=0; while(i*rs*step