Вопрос 10. Построить информационный граф и сеть Петри для вычисления арифметического выражения


Добавил:DMT
Дата создания:30 декабря 2007, 18:45
Дата обновления:30 декабря 2007, 18:46
Просмотров:8073 последний позавчера, 5:31
Комментариев: 3

Вопрос 10. Построить информационный граф и сеть Петри для вычисления арифметического выражения .

up

Комментарии для "Вопрос 10. Построить информационный граф и сеть Петри для вычисления арифметического выражения "


Пользователь: kate
Сообщений: 9
Статус: Незримый
Зарегистрирован:
4 января 2008, 14:05
Был:28 января 2008, 21:05
kate
smsup
Дата: 8 января 2008, 13:17 Сообщение № 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 40
  9. class channel
  10. // класс каналов
  11. {
  12. double *buf;
  13. // буфер для передачи данных
  14. int size;
  15. // размер буфера
  16. HANDLE s,
  17. empty,
  18. // семафоры
  19. full;
  20. int countr, countw;
  21. // указатели для чтения и записи
  22. public:
  23. channel (int nn): size(nn)
  24. // конструктор
  25. {
  26. buf = new double[nn];
  27. // память для буфера
  28. countr=0; countw=0;
  29. s=CreateSemaphore(NULL,1,1,NULL);
  30. // создание семафоров
  31. empty=CreateSemaphore(NULL,nn,nn,NULL);
  32. full = CreateSemaphore(NULL,0,nn,NULL);
  33. }
  34. void operator << (double d)
  35. // операция записи в канал
  36. {
  37. WaitForSingleObject(empty, INFINITE);
  38. // ожидание свободных мест
  39. WaitForSingleObject(s, INFINITE);
  40. buf[countw++]=d;
  41. // запись в очередь
  42. if (countw==size) countw=0;
  43. ReleaseSemaphore(s,1,NULL);
  44. ReleaseSemaphore(full,1,NULL);
  45. // увеличение числа запи-сей
  46. }
  47. void operator >> (double& d)
  48. // операция чтения из канала
  49. {
  50. WaitForSingleObject(full, INFINITE);
  51. // ожидание данных
  52. WaitForSingleObject(s, INFINITE);
  53. d = buf[countr]; countr++;
  54. // чтение из циклической очереди
  55. if (countr==size) countr = 0;
  56. ReleaseSemaphore(s,1,NULL);
  57. ReleaseSemaphore(empty,1,NULL);
  58. // увеличение числа свободных мест
  59. }
  60. };
  61. channel *pc[14];
  62. DWORD WINAPI plus(LPVOID)
  63. // поток для сложения
  64. {
  65. int j;
  66. double d1,d2;
  67. for (j=0; j<n; j++)
  68. // цикл
  69. {
  70. *pc[3]>>d1;*pc[1]>>d2;
  71. // прием данных из каналов 3 и 1
  72. *pc[7]<<(d1+d2);
  73. // передача суммы в канал 7
  74. }
  75. return 1;
  76. }
  77. DWORD WINAPI cosinus(LPVOID)
  78. // поток для вычисления косинуса
  79. {
  80. int j;
  81. double d2;
  82. for (j=0; j<n; j++)
  83. // цикл
  84. {
  85. *pc[7]>>d2;
  86. // прием из канала 7
  87. *pc[8]<<cos(d2);
  88. // передача в канал 8
  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. {
  100. *pc[4]>>d1;*pc[8]>>d2;
  101. // прием данных из каналов 4 и 8
  102. *pc[10]<<(d1+d2);
  103. // передача суммы в канал 10
  104. }
  105. return 1;
  106. }
  107. DWORD WINAPI sinus(LPVOID)
  108. // поток для вычисления синуса
  109. {
  110. int j;
  111. double d2;
  112. for (j=0; j<n; j++)
  113. // цикл
  114. {
  115. *pc[5]>>d2;
  116. // прием из канала 5
  117. *pc[9]<<sin(d2);
  118. // передача в канал 9
  119. }
  120. return 1;
  121. }
  122. DWORD WINAPI mult(LPVOID)
  123. // поток для умножения
  124. {
  125. int j;
  126. double d1, d2;
  127. for (j=0; j<n; j++)
  128. // цикл
  129. {
  130. *pc[9]>>d1; *pc[10]>>d2;
  131. // прием данных из каналов 9 и 10
  132. *pc[12]<<(d1*d2);
  133. // умножение и отправление в канал 12
  134. }
  135. return 1;
  136. }
  137. DWORD WINAPI sinus2(LPVOID)
  138. // поток для вычисления синуса
  139. {
  140. int j;
  141. double d2;
  142. for (j=0; j<n; j++)
  143. // цикл
  144. {
  145. *pc[0]>>d2;
  146. // прием из канала 0
  147. *pc[6]<<sin(d2);
  148. // передача в канал 6
  149. }
  150. return 1;
  151. }
  152. DWORD WINAPI mult2(LPVOID)
  153. // поток для умножения
  154. {
  155. int j;
  156. double d1, d2;
  157. for (j=0; j<n; j++)
  158. // цикл
  159. {
  160. *pc[2]>>d1; *pc[6]>>d2;
  161. // прием данных из каналов 2 и 6
  162. *pc[11]<<(d1*d2);
  163. // умножение и отправление в канал 11
  164. }
  165. return 1;
  166. }
  167. DWORD WINAPI plus3(LPVOID)
  168. // поток для сложения
  169. {
  170. int j;
  171. double d1,d2;
  172. for (j=0; j<n; j++)
  173. // цикл
  174. {
  175. *pc[12]>>d1;*pc[11]>>d2;
  176. // прием данных из каналов 12 и 11
  177. *pc[13]<<(d1+d2);
  178. // передача суммы в канал 13
  179. }
  180. return 1;
  181. }
  182. void main()
  183. // главный поток
  184. {
  185. channel c[14]={13,13,13,13,13,13,13,13,13,13,13,13,13,13};
  186. // инициализация каналов
  187. int i;
  188. // каждый из них состоит из 10 элементов
  189. for (i=0; i<14;i++) pc[i] = &c[i];
  190. // указатели на каналы
  191. // запуск потоков
  192. CreateThread(NULL,0,plus,0,0,0);
  193. CreateThread(NULL,0,cosinus,0,0,0);
  194. CreateThread(NULL,0,plus2,0,0,0);
  195. CreateThread(NULL,0,sinus,0,0,0);
  196. CreateThread(NULL,0,mult,0,0,0);
  197. CreateThread(NULL,0,sinus2,0,0,0);
  198. CreateThread(NULL,0,mult2,0,0,0);
  199. CreateThread(NULL,0,plus3,0,0,0);
  200. double x,y,z;
  201. for (i=0; i<n; i++)
  202. {
  203. x=i; y=i+1;
  204. c[0]<<y; c[1]<<y;
  205. // запись в каналы 0,1,2,3,4,5
  206. c[2]<<x; c[3]<<x;
  207. c[4]<<x; c[5]<<x;
  208. }
  209. for (i=0; i<n; i++)
  210. {
  211. c[13]>>z; cout<<"\n"<<z;
  212. // чтение и вывод результатов
  213. cout<<"==";
  214. cout<<(double)(i*sin(i+1)+sin(i)*(i+cos(i+i+1))) ;
  215. // сравнение со значениями
  216. }
  217. getch();
  218. }
При использовании обязательна ссылка на http://DMTSoft.ru
Пользователь: ruslan
Сообщений: 23
Статус: Незримый
Зарегистрирован:
5 января 2008, 2:42
Был:29 января 2008, 21:23
ruslan
smsup
Дата: 16 января 2008, 1:46 Сообщение № 2
Информационный граф


image1
Пользователь: lilo
Сообщений: 38
Статус: Незримый
Зарегистрирован:
8 января 2008, 12:39
Был:9 апреля 2008, 19:55
lilo
smsup
Дата: 16 января 2008, 16:06 Сообщение № 3
а зачем прога? в задании же вроде нет