Untitled
unknown
plain_text
5 years ago
3.1 kB
8
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...