Вопрос 8. Построить сеть Петри для волновой системы, вычисляющей векторную операцию


Добавил:DMT
Дата создания:30 декабря 2007, 18:42
Дата обновления:30 декабря 2007, 18:43
Просмотров:6557 последний сегодня, 0:59
Комментариев: 2

Вопрос 8. Построить сеть Петри для волновой системы, вычисляющей векторную операцию

up

Комментарии для "Вопрос 8. Построить сеть Петри для волновой системы, вычисляющей векторную операцию "


Пользователь: rina
Сообщений: 5
Статус: Незримый
Зарегистрирован:
8 января 2008, 12:34
Был:8 января 2008, 12:39
rina
smsup
Дата: 8 января 2008, 12:37 Сообщение № 1
Код на C++
  1. #include <windows.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. #include <dos.h>
  5. #include <iostream.h>
  6. #include <conio.h>
  7. #include <math.h>
  8. #define n 20
  9. class channel // класс каналов
  10. {
  11. double *buf; // буфер для передачи данных
  12. int size; // размер буфера
  13. HANDLE s,
  14. empty, // семафоры
  15. full;
  16. int countr, countw; // указатели для чтения и записи
  17. public:
  18. channel (int nn): size(nn) // конструктор
  19. {
  20. buf = new double[nn]; // память для буфера
  21. countr=0; countw=0;
  22. s=CreateSemaphore(NULL,1,1,NULL); // создание семафоров
  23. empty=CreateSemaphore(NULL,nn,nn,NULL);
  24. full = CreateSemaphore(NULL,0,nn,NULL);
  25. }
  26. void operator << (double d)
  27. // операция записи в канал
  28. {
  29. WaitForSingleObject(empty, INFINITE);
  30. // ожидание свободных мест
  31. WaitForSingleObject(s, INFINITE);
  32. buf[countw++]=d;
  33. // запись в очередь
  34. if (countw==size) countw=0;
  35. ReleaseSemaphore(s,1,NULL);
  36. ReleaseSemaphore(full,1,NULL);
  37. // увеличение числа запи-сей
  38. }
  39. void operator >> (double& d)
  40. // операция чтения из канала
  41. {
  42. WaitForSingleObject(full, INFINITE);
  43. // ожидание данных
  44. WaitForSingleObject(s, INFINITE);
  45. d = buf[countr]; countr++;
  46. // чтение из циклической очереди
  47. if (countr==size) countr = 0;
  48. ReleaseSemaphore(s,1,NULL);
  49. ReleaseSemaphore(empty,1,NULL);
  50. // увеличение числа свободных мест
  51. }
  52. };
  53. channel *pc[11];
  54. DWORD WINAPI cosinus(LPVOID)
  55. // поток для вычисления косинуса
  56. {
  57. int j;
  58. double d2;
  59. for (j=0; j<n; j++)// цикл
  60. {
  61. *pc[0]>>d2;// прием из канала 0
  62. *pc[4]<<cos(d2);// передача в канал 4
  63. }
  64. return 1;
  65. }
  66. DWORD WINAPI plus(LPVOID)// поток для сложения
  67. {
  68. int j;
  69. double d1,d2;
  70. for (j=0; j<n; j++)// цикл
  71. {
  72. *pc[2]>>d1;*pc[4]>>d2;
  73. // прием данных из каналов 2 и 4
  74. *pc[6]<<(d1+d2);
  75. // передача суммы в канал 6
  76. }
  77. return 1;
  78. }
  79. DWORD WINAPI sinus(LPVOID) // поток для вычисления синуса
  80. {
  81. int j;
  82. double d2;
  83. for (j=0; j<n; j++)// цикл
  84. {
  85. *pc[1]>>d2;
  86. // прием из канала 1
  87. *pc[5]<<sin(d2);
  88. // передача в канал 5
  89. }
  90. return 1;
  91. }
  92. DWORD WINAPI plus2(LPVOID)
  93. // поток для сложения
  94. {
  95. int j;
  96. double d1,d2;
  97. for (j=0; j<n; j++) // цикл
  98. {
  99. *pc[3]>>d1;*pc[5]>>d2;
  100. // прием данных из каналов 3 и 5
  101. *pc[7]<<(d1+d2);
  102. // передача суммы в канал 7
  103. }
  104. return 1;
  105. }
  106. DWORD WINAPI sinus2(LPVOID)
  107. // поток для вычисления синуса
  108. {
  109. int j;
  110. double d2;
  111. for (j=0; j<n; j++)// цикл
  112. {
  113. *pc[6]>>d2;// прием из канала 6
  114. *pc[8]<<sin(d2); // передача в канал 8
  115. }
  116. return 1;
  117. }
  118. DWORD WINAPI cosinus2(LPVOID)
  119. // поток для вычисления косинуса
  120. {
  121. int j;
  122. double d2;
  123. for (j=0; j<n; j++)// цикл
  124. {
  125. *pc[7]>>d2;// прием из канала 7
  126. *pc[9]<<cos(d2);// передача в канал 9
  127. }
  128. return 1;
  129. }
  130. DWORD WINAPI mult(LPVOID)
  131. // поток для умножения
  132. {
  133. int j;
  134. double d1, d2;
  135. for (j=0; j<n; j++) // цикл
  136. {
  137. *pc[8]>>d1; *pc[9]>>d2;
  138. // прием данных из каналов 8 и 9
  139. *pc[10]<<(d1*d2);
  140. // умножение и отправление в канал 10
  141. }
  142. return 1;
  143. }
  144. void main()// главный поток
  145. {
  146. channel c[11]={10,10,10,10,10,10,10,10,10,10,10};
  147. // инициализация каналов
  148. int i;
  149. // каждый из них состоит из 10 элементов
  150. for (i=0; i<11;i++) pc[i] = &c[i];
  151. // указатели на каналы
  152. // запуск потоков
  153. CreateThread(NULL,0,cosinus,0,0,0);
  154. CreateThread(NULL,0,plus,0,0,0);
  155. CreateThread(NULL,0,sinus,0,0,0);
  156. CreateThread(NULL,0,sinus2,0,0,0);
  157. CreateThread(NULL,0,plus2,0,0,0);
  158. CreateThread(NULL, 0,cosinus2,0,0,0);
  159. CreateThread(NULL,0,mult,0,0,0);
  160. double u,v,z;
  161. for (i=0; i<n; i++)
  162. {
  163. u=i; v=i+1;
  164. c[0]<<v; c[1]<<u;
  165. // запись в каналы 0,1,2,3
  166. c[2]<<u; c[3]<<v;
  167. }
  168. for (i=0; i<n; i++)
  169. {
  170. c[10]>>z; cout<<"\n"<<z;
  171. // чтение и вывод результатов
  172. cout<<"==";
  173. cout<<(double)(sin(i+cos(i+1))*cos(sin(i)+(i+1))) ;
  174. // сравнение со значениями
  175. }
  176. getch();
  177. }
При использовании обязательна ссылка на http://DMTSoft.ru

Пользователь: kate
Сообщений: 9
Статус: Незримый
Зарегистрирован:
4 января 2008, 14:05
Был:28 января 2008, 21:05
kate
smsup
Дата: 8 января 2008, 13:30 Сообщение № 2

image1