Untitled
unknown
plain_text
4 years ago
3.1 kB
4
Indexable
#include <windows.h> #include <stdio.h> #include <stdlib.h> #include <process.h> #include <cmath> #include <cstdlib> //zdefiniowanie dokładności, tak jak bylo zadane w poleceniu #define DOKLADNOSC 0.000001 unsigned __stdcall Bisekcja(void* miejscazerowe); //Stworzenie struktury która określa przedziały, oraz znacznie ułatwia pracę i przejrzystość kodu typedef struct _przedzialy { double a; double b; } przedzialy; //Zdefiniowanie sekcji krytycznej CRITICAL_SECTION sekcja_krytyczna; int main() { przedzialy przedzial_1, przedzial_2, przedzial_3; unsigned int identyfikator_watku[3]; HANDLE hwatki[3]; //uzupełnienie danych przedzial_1.a = -100.5; przedzial_1.b = -0.2; przedzial_2.a = 0; przedzial_2.b = 2.2; przedzial_3.a = 2.5; przedzial_3.b = 4; //wlaczenie sekcji krytycznej, zeby mogl wejsc do niej tylko 1 watek InitializeCriticalSection(&sekcja_krytyczna); //stworzenie 3 nowych wątków,oraz przypisanie ich do funkcji hwatki[0] = (HANDLE)_beginthreadex(NULL, 0, Bisekcja, (void*) &przedzial_1, 0, &identyfikator_watku[0]); hwatki[1] = (HANDLE)_beginthreadex(NULL, 0, Bisekcja, (void*) &przedzial_2, 0, &identyfikator_watku[1]); hwatki[2] = (HANDLE)_beginthreadex(NULL, 0, Bisekcja, (void*) &przedzial_3, 0, &identyfikator_watku[2]); //Oczekiwanie aż wątki skończą pracę WaitForMultipleObjects(3, hwatki, TRUE, INFINITE); //Drukowanie końca obliczeń printf("\n\nObliczenia zostały zakończone\n"); //Zamknięcie uściskow oraz wylaczenie sekcji krytycznej CloseHandle(hwatki[0]); CloseHandle(hwatki[1]); CloseHandle(hwatki[2]); DeleteCriticalSection(&sekcja_krytyczna); return 0; } unsigned __stdcall Bisekcja(void* miejscazerowe) { //pozyskanie adresu a oraz b przedzialy* wsk = (przedzialy*)miejscazerowe; //uzupelnienie danych double a = wsk->a; double b = wsk->b; double xs; //zmienne pomocniczne Fa=f(a) Fb=f(b) Fxs=f(xs)zmienne wprowadzone, żeby mozna bylo rozczytac sie w kodzie double Fa; double Fb; double Fxs; Fa = (1.5 * (a * a * a) - 4 * (a * a) - 2 * a + 1); Fb = (1.5 * (b * b * b) - 4 * (b * b) - 2 * b + 1); xs = ((a + b) / 2); Fxs = (1.5 * (xs * xs * xs) - 4 * (xs * xs) - 2 * xs + 1); printf("\n\nPrzedzial w ktorych szukane bylo miejsce zerowe (%f,%f))", a, b); //sprawdzenie podstawowego warunku bisekcji f(a)*f(b)<0 if (Fa * Fb >= 0) { printf("Warunki Bisekcji sa niespelnione"); return 0; } //Petla warunkow bisekcji while (xs = ((a + b) / 2), Fxs = (1.5 * (xs * xs * xs) - 4 * (xs * xs) - 2 * xs + 1), fabs(Fxs) > DOKLADNOSC) { if (Fxs == 0) { printf("Znaleziono miejsce zerowe,jest to %f\n", xs); return 0; } else { if (Fa * Fxs < 0) { b = xs; } else if (Fb * Fxs < 0) { a = xs; } } } //otworzenie sekcji krytycznej, aby tylko 1 wątek mógł wydrukować wynik EnterCriticalSection(&sekcja_krytyczna); printf("\nZnaleziono miejsce zerowe, jest to %f", xs); //Zamknięcie sekcji krytycznej LeaveCriticalSection(&sekcja_krytyczna); //Zakończenie pracy wątku _endthreadex(0); return 0; }
Editor is loading...