Advertisement
Guest User

Untitled

a guest
May 25th, 2015
268
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.24 KB | None | 0 0
  1. //Piotr Trojanek BDSISK1 Sekcja 2
  2. /*
  3. n - liczba elementow ciogu
  4. k - ilosc procesow
  5. n jest podzielne przez k bez reszty
  6. */
  7. #include <stdio.h>
  8. #include <stdlib.h>
  9. #include <math.h>
  10.  
  11. //obliczanie wartosci i-tego elementu ciagu
  12. double licz (int i,int n){
  13. return ((i*i-12)*(i*i-12)*(i*i-12))/(n*n*n*i*i*i)
  14. }
  15.  
  16. //obliczanie sumy n_per_proc elementow ciagu zaczynajac od p-tego
  17. double func (int p,int n,int n_per_proc){
  18. //wartosc przechowywuje sume
  19. double sum;
  20. sum = 0;
  21. int i = p;
  22. //wartosc koncz¹ca np 4 liczby na element zaczynajac od 1 -> jesli mniejsze niz 5 licz (1,2,3,4)
  23. int ilosc = p+n_per_proc;
  24. //petla liczaca sume czesciowa
  25. for(i;i<ilosc;i++)
  26. {
  27. sum += licz(i,n);
  28. }
  29. return sum;
  30. }
  31.  
  32.  
  33. int main(int argc, char* argv[])
  34. {
  35. //zmienna do ktorej zczytujemy dane ze strumieni
  36. double a;
  37. //ilosc elementow sumy
  38. int n;
  39. //ilosc procesow potomnych
  40. int k;
  41. //zmienna sumujaca kolejne sumy czesciowe dajaca ostateczna sume
  42. double suma = 0;
  43. //element poczatkowy sumy tymczasowej
  44. int start;
  45. //ilosc elementow sumy obliczana przez jeden proces
  46. int n_per_proc;
  47. //ptablice reprezentujace potoki
  48. int stream1[2];
  49. int stream2[2];
  50. //zmienna okreslajaca czy dany proces jest dzieckiem czy nie
  51. int child = 0;
  52. //wprowadzona za mala ilosc argumentow
  53. if(argc < 3)
  54. printf("Za malo argumentow");
  55. //pobranie argumentow
  56. n = atoi(argv[1]);
  57. k = atoi(argv[2]);
  58. //obliczenie ilosci elementow sumy przypadajacej na proces
  59. n_per_proc = n / k;
  60. //tworzenie potokow
  61. pipe(stream1);
  62. pipe(stream2);
  63. int i = 0;
  64. //przypisanie wartosci okreslajacej dziecko badz rodzica
  65. for(i; i < k; i++)
  66. {
  67. if(fork() == 0)
  68. {
  69. child = 1;
  70. break;
  71. }
  72. }
  73. //dzialanie dla rodzica
  74. if(child == 0)
  75. {
  76. //przeslij wartosci poczatkowe sum czesciowych do procesow potomnych (np. n=12,k=3 -> wyslij 1,4,7,10)
  77. for(i=1;i<n;i+=n_per_proc)
  78. {
  79. write(stream1[1], &i, sizeof(int));
  80. }
  81.  
  82. //wyslij polecenie zamkniecia procesu do kazdego procesu
  83. int e = -1;
  84. for(i=0; i < k; i++)
  85. {
  86. write(stream1[1], &e, sizeof(int));
  87. }
  88.  
  89. //odczytaj sumy czesciowe od kazdego procesu i zsumuj je
  90. for(i=0; i < k; i++)
  91. {
  92. read(stream2[0], &a, sizeof(double));
  93. suma = suma + a;
  94. }
  95. //wypisanie wyniku
  96. printf("SUMA = %f\n", suma);
  97. }
  98.  
  99. //dzialanie dla dziecka
  100. if(child == 1)
  101. {
  102.  
  103. while(1)
  104. {
  105. //odczytuj dane wyslane przez rodzica
  106. read(stream1[0], &start, sizeof(int));
  107. //jesli polecenie zamkniecia procesu zakoncz proces
  108. if(start == -1)
  109. {
  110. exit(0);
  111. }
  112. //jesli nie licz sume czesciowa
  113. else
  114. {
  115. //pobranie numeru elementu poczatkowego
  116. double s = func(start,n,n_per_proc);
  117. //wyslanie sumy czesciowej
  118. write(stream2[1], &s, sizeof(double));
  119. }
  120. }
  121. }
  122. return 0;
  123. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement