Untitled

mail@pastecode.io avatar
unknown
plain_text
3 years ago
3.1 kB
2
Indexable
Never
#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;
}