Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define EPSILON 0.00001
- #define _USE_MATH_DEFINES
- #include <math.h>
- #include <windows.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <process.h>
- //--------------------------------------------------------------------
- unsigned __stdcall bisekcja (void * parametry); //funkcja watku
- //------------------------------------------------------------------------------
- HANDLE watekA, watekB, watekC, wyswietl; // zmienne globalne (watki + mutex)
- //------------------------------------------------------------
- struct przedzial //struktura do podawania przedzialów
- {
- double poczatek_przedzialu;
- double koniec_przedzialu;
- };
- unsigned int licznik_mz;
- //-----------------------------------------------------------
- int main(int argc, char * argv[])
- {
- // to jest watek główny uruchamiany automatycznie
- // przez system
- unsigned int ida, idb, idc;
- struct przedzial przedzial_watku_A, przedzial_watku_B, przedzial_watku_C;
- printf("\nSzukam w przedzialach: <-10,-5> <-2,2> <2,7> \n" );
- // wypełnianie struktur przekazywanych do watków A i B
- przedzial_watku_A.poczatek_przedzialu = -10.0;
- przedzial_watku_A.koniec_przedzialu = 5.0;
- przedzial_watku_B.poczatek_przedzialu = -2.0;
- przedzial_watku_B.koniec_przedzialu = 2.0;
- przedzial_watku_C.poczatek_przedzialu = 2.0;
- przedzial_watku_C.koniec_przedzialu = 7.0;
- licznik_mz = 0; // licznik znalezionych miejsc zerowych
- wyswietl = CreateMutex(NULL, FALSE, NULL); //tworzenie mutexa
- watekA = (HANDLE) _beginthreadex (NULL, 0, &bisekcja, &przedzial_watku_A, 0, &ida); //tworzenie watkow
- watekB = (HANDLE) _beginthreadex (NULL, 0, &bisekcja, &przedzial_watku_B, 0, &idb);
- watekC = (HANDLE) _beginthreadex (NULL, 0, &bisekcja, &przedzial_watku_C, 0, &idc);
- while (licznik_mz != 3);
- CloseHandle (watekA); //koniec
- CloseHandle (watekB);
- CloseHandle (watekC);
- system("pause");
- return 0;
- }
- //-----------------------------------------------------------
- double funkcja(double x)
- {
- return (x*x*x + 4*x*x - 25*x - 28);
- }
- unsigned __stdcall bisekcja (void * parametry)
- {
- double pocz, kon, s;
- int flaga;
- flaga = 0;
- pocz = ((struct przedzial *) parametry) -> poczatek_przedzialu; //odczytanie krancow przedzialow
- kon = ((struct przedzial *) parametry) -> koniec_przedzialu;
- if(((funkcja(pocz))*(funkcja(kon))) < 0)
- {
- do
- {
- s = pocz/2 + kon/2;
- if(fabs(funkcja(s)) < EPSILON)
- {flaga = 1;}
- else
- {flaga = 0;}
- if(flaga == 0)
- {
- if(((funkcja(pocz))*(funkcja(s))) < 0.0)
- { kon = s;}
- else //if(funkcja(s)*funkcja(kon) < 0)
- { pocz = s;}
- };
- }while(flaga == 0);
- };
- WaitForSingleObject(wyswietl, INFINITE); //czekanie na Mutex
- if(flaga == 0)
- printf("Brak spelnienia warunku roznicy znakow na koncu przedzialu,\n lub brak miejsc zerowych w tym przedziale.\n");
- else
- printf("\nMiejsce zerowe: %f\n",s);
- licznik_mz++;
- ReleaseMutex(wyswietl); //wypuszczenie Mutexa
- _endthreadex(0);
- return 0;
- }
Add Comment
Please, Sign In to add comment