Guest User

Untitled

a guest
Apr 21st, 2018
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.91 KB | None | 0 0
  1. #define EPSILON 0.00001
  2. #define _USE_MATH_DEFINES
  3. #include <math.h>
  4. #include <windows.h>
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7. #include <process.h>
  8. //--------------------------------------------------------------------
  9. unsigned __stdcall bisekcja (void * parametry); //funkcja watku
  10. //------------------------------------------------------------------------------
  11. HANDLE watekA, watekB, watekC, wyswietl; // zmienne globalne (watki + mutex)
  12. //------------------------------------------------------------
  13. struct przedzial //struktura do podawania przedzialów
  14. {
  15. double poczatek_przedzialu;
  16. double koniec_przedzialu;
  17. };
  18. unsigned int licznik_mz;
  19. //-----------------------------------------------------------
  20. int main(int argc, char * argv[])
  21. {
  22. // to jest watek główny uruchamiany automatycznie
  23. // przez system
  24. unsigned int ida, idb, idc;
  25. struct przedzial przedzial_watku_A, przedzial_watku_B, przedzial_watku_C;
  26. printf("\nSzukam w przedzialach: <-10,-5> <-2,2> <2,7> \n" );
  27. // wypełnianie struktur przekazywanych do watków A i B
  28. przedzial_watku_A.poczatek_przedzialu = -10.0;
  29. przedzial_watku_A.koniec_przedzialu = 5.0;
  30. przedzial_watku_B.poczatek_przedzialu = -2.0;
  31. przedzial_watku_B.koniec_przedzialu = 2.0;
  32. przedzial_watku_C.poczatek_przedzialu = 2.0;
  33. przedzial_watku_C.koniec_przedzialu = 7.0;
  34.  
  35. licznik_mz = 0; // licznik znalezionych miejsc zerowych
  36.  
  37. wyswietl = CreateMutex(NULL, FALSE, NULL); //tworzenie mutexa
  38.  
  39. watekA = (HANDLE) _beginthreadex (NULL, 0, &bisekcja, &przedzial_watku_A, 0, &ida); //tworzenie watkow
  40. watekB = (HANDLE) _beginthreadex (NULL, 0, &bisekcja, &przedzial_watku_B, 0, &idb);
  41. watekC = (HANDLE) _beginthreadex (NULL, 0, &bisekcja, &przedzial_watku_C, 0, &idc);
  42.  
  43. while (licznik_mz != 3);
  44.  
  45. CloseHandle (watekA); //koniec
  46. CloseHandle (watekB);
  47. CloseHandle (watekC);
  48.  
  49. system("pause");
  50. return 0;
  51. }
  52. //-----------------------------------------------------------
  53. double funkcja(double x)
  54. {
  55. return (x*x*x + 4*x*x - 25*x - 28);
  56. }
  57. unsigned __stdcall bisekcja (void * parametry)
  58. {
  59. double pocz, kon, s;
  60. int flaga;
  61. flaga = 0;
  62.  
  63. pocz = ((struct przedzial *) parametry) -> poczatek_przedzialu; //odczytanie krancow przedzialow
  64. kon = ((struct przedzial *) parametry) -> koniec_przedzialu;
  65.  
  66. if(((funkcja(pocz))*(funkcja(kon))) < 0)
  67. {
  68. do
  69. {
  70. s = pocz/2 + kon/2;
  71.  
  72. if(fabs(funkcja(s)) < EPSILON)
  73. {flaga = 1;}
  74. else
  75. {flaga = 0;}
  76.  
  77. if(flaga == 0)
  78. {
  79.  
  80. if(((funkcja(pocz))*(funkcja(s))) < 0.0)
  81. { kon = s;}
  82. else //if(funkcja(s)*funkcja(kon) < 0)
  83. { pocz = s;}
  84. };
  85. }while(flaga == 0);
  86. };
  87.  
  88. WaitForSingleObject(wyswietl, INFINITE); //czekanie na Mutex
  89. if(flaga == 0)
  90. printf("Brak spelnienia warunku roznicy znakow na koncu przedzialu,\n lub brak miejsc zerowych w tym przedziale.\n");
  91. else
  92. printf("\nMiejsce zerowe: %f\n",s);
  93. licznik_mz++;
  94. ReleaseMutex(wyswietl); //wypuszczenie Mutexa
  95.  
  96. _endthreadex(0);
  97. return 0;
  98. }
Add Comment
Please, Sign In to add comment