egisss633

C++ Monitor

Jan 16th, 2018
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.59 KB | None | 0 0
  1. // Lab1b.cpp : Defines the entry point for the console application.
  2. //
  3. #define _CRT_SECURE_NO_WARNINGS
  4.  
  5. #include "stdafx.h"
  6. #include <iostream>
  7. #include <fstream>
  8. #include <string>
  9. #include <iomanip>
  10. #include <thread>
  11. #include <cstdlib>
  12. #include <omp.h>
  13. #include <mutex>
  14.  
  15. using namespace std;
  16. mutex mtx;
  17.  
  18. const int FAK_COUNT = 5;
  19. const int MAX_STUD_FAKULTETE = 10;
  20. const int MAX_LAUKU = 50;
  21.  
  22. struct Studentas {
  23. int eilesNr = 0;
  24. string vardas;
  25. int kursas;
  26. double vidurkis;
  27. };
  28.  
  29. struct Fakultetas {
  30. int studCount;
  31. string pavadinimas;
  32. Studentas studentai[MAX_LAUKU];
  33. };
  34.  
  35. // rikiavimo laukas
  36. struct Laukas {
  37. int laukas;
  38. int kiekis = 0;
  39. };
  40.  
  41. // lauku konteineris
  42. struct Laukai {
  43. int laukuCount;
  44. Laukas laukai[MAX_STUD_FAKULTETE];
  45. };
  46.  
  47. struct Monitor {
  48. Laukai B;
  49.  
  50. void insert(Laukas l, int masyvoNr) {
  51. mtx.lock();
  52.  
  53. int laukoKiekis = -1;
  54. if (B.laukuCount == 0) {
  55. B.laukai[0].laukas = l.laukas;
  56. B.laukai[0].kiekis = l.kiekis;
  57. B.laukuCount++;
  58. laukoKiekis = l.kiekis;
  59. }
  60. else {
  61. bool isNew = true;
  62. for (int i = 0; i < B.laukuCount; i++)
  63. {
  64. if (B.laukai[i].laukas == l.laukas) {
  65. B.laukai[i].kiekis += l.kiekis;
  66. laukoKiekis = B.laukai[i].kiekis;
  67. isNew = false;
  68. }
  69. }
  70. if (isNew) {
  71. int index = findIndexToInsert(l.laukas);
  72. B.laukai[index].laukas = l.laukas;
  73. B.laukai[index].kiekis = l.kiekis;
  74. laukoKiekis = l.kiekis;
  75. }
  76. }
  77.  
  78. cout << "P" << masyvoNr << " prideda " << l.laukas << " lauka. tokiu lauku kiekis: " << laukoKiekis << endl;
  79.  
  80. mtx.unlock();
  81. }
  82.  
  83. int findIndexToInsert(int reiksme) {
  84. for (int i = 0; i < B.laukuCount; i++)
  85. {
  86. if (reiksme > B.laukai[i].laukas) {
  87. for (int j = B.laukuCount - 1; j >= i; j--)
  88. B.laukai[j + 1] = B.laukai[j];
  89.  
  90. B.laukuCount++;
  91. return i;
  92. }
  93. }
  94. B.laukuCount++;
  95. return B.laukuCount - 1;
  96. }
  97.  
  98. //grazina false - nerado arba pasalino visus elementus
  99. //grazina true - rado, pasalino kieki ir dar liko elementu
  100. bool remove(Laukas l, int masyvoNr) {
  101. mtx.lock();
  102. int arRado = false;
  103. for (int i = 0; i < B.laukuCount; i++)
  104. {
  105. if (B.laukai[i].laukas == l.laukas) {
  106. arRado = true;
  107.  
  108. if (B.laukai[i].kiekis <= l.kiekis) {
  109. for (int j = i; j < B.laukuCount; j++)
  110. B.laukai[j] = B.laukai[j + 1];
  111.  
  112. B.laukai[B.laukuCount - 1].laukas = 0;
  113. B.laukai[B.laukuCount - 1].kiekis = 0;
  114. B.laukuCount--;
  115. break;
  116. }
  117.  
  118. B.laukai[i].kiekis -= l.kiekis;
  119. break;
  120. }
  121. }
  122.  
  123. cout << "V" << masyvoNr << " atima " << l.laukas << " lauka. atimamas kiekis: " << arRado << endl;
  124.  
  125. mtx.unlock();
  126. return arRado;
  127. }
  128.  
  129. };
  130.  
  131. Monitor B;
  132. bool BaigeDetiIB = false;
  133.  
  134. void readData(Fakultetas(&fakultetai)[FAK_COUNT], Laukai(&laukaiGrazinami)[FAK_COUNT]);
  135. void printData(Fakultetas(&fakultetai)[FAK_COUNT], Laukai(&laukai)[FAK_COUNT]);
  136. void startThreads(Fakultetas(&fakultetai)[FAK_COUNT], Laukai(&laukai)[FAK_COUNT]);
  137. void executeP(int i, Studentas studentai[], int studCount);
  138. void executeV(int i, Laukas laukai[], int laukuCount);
  139. void printResults();
  140.  
  141. int main()
  142. {
  143. Fakultetas fakultetai[FAK_COUNT];
  144. Laukai laukai[FAK_COUNT];
  145.  
  146. readData(fakultetai, laukai);
  147. printData(fakultetai, laukai);
  148. startThreads(fakultetai, laukai);
  149. printResults();
  150.  
  151. getchar();
  152. return 0;
  153. }
  154.  
  155. void readData(Fakultetas(&fakultetai)[FAK_COUNT], Laukai(&laukaiGrazinami)[FAK_COUNT])
  156. {
  157. ifstream file;
  158. file.open("IFF57_RainysJ_Lab2a_dat_2.txt");
  159.  
  160. string stringLaukas;
  161. string intLaukas;
  162. string doubleLaukas;
  163.  
  164. for (int i = 0; i < FAK_COUNT; i++)
  165. {
  166. file >> fakultetai[i].pavadinimas >> fakultetai[i].studCount;
  167.  
  168. for (int j = 0; j < fakultetai[i].studCount; j++)
  169. {
  170. file >> stringLaukas >> intLaukas >> doubleLaukas;
  171.  
  172. fakultetai[i].studentai[j].kursas = stoi(intLaukas);
  173. fakultetai[i].studentai[j].vidurkis = stod(doubleLaukas);
  174. fakultetai[i].studentai[j].vardas = stringLaukas;
  175. }
  176. }
  177.  
  178. int V_COUNT;
  179. file >> V_COUNT;
  180. for (int i = 0; i < V_COUNT; i++)
  181. {
  182. file >> laukaiGrazinami[i].laukuCount;
  183.  
  184. for (int j = 0; j < laukaiGrazinami[i].laukuCount; j++)
  185. {
  186. file >> laukaiGrazinami[i].laukai[j].laukas >> laukaiGrazinami[i].laukai[j].kiekis;
  187. }
  188. }
  189.  
  190. file.close();
  191. }
  192.  
  193. void printData(Fakultetas(&fakultetai)[FAK_COUNT], Laukai(&laukai)[FAK_COUNT])
  194. {
  195. ofstream file;
  196. file.open("IFF57_RainysJ_Lab2a_rez.txt");
  197.  
  198. for (int i = 0; i < FAK_COUNT; i++)
  199. {
  200. file << "Fakultetas: " << fakultetai[i].pavadinimas << endl;
  201. file << setw(5) << left << "nr." << setw(14) << left << "studentas" << "kursas" << " " << setprecision(3) << "vidurkis" << endl;
  202. file << "-----------------------------------" << endl;
  203.  
  204. for (int j = 0; j < fakultetai[i].studCount; j++)
  205. {
  206. string vardas = fakultetai[i].studentai[j].vardas;
  207. int kursas = fakultetai[i].studentai[j].kursas;
  208. double vidurkis = fakultetai[i].studentai[j].vidurkis;
  209.  
  210. file << setw(5) << j + 1 << left << setw(14) << left << vardas << "| " << kursas << "| " << setprecision(3) << vidurkis << "|" << endl;
  211. }
  212.  
  213. file << "-----------------------------------" << endl;
  214.  
  215. for (int j = 0; j < laukai[i].laukuCount; j++)
  216. {
  217. int laukas = laukai[i].laukai[j].laukas;
  218. int kiekis = laukai[i].laukai[j].kiekis;
  219.  
  220. file << "laukas: " << setw(8) << right << laukas << ", "<< "kiekis: " << setw(8) << right << kiekis << "|" << endl;
  221. }
  222.  
  223. file << "-----------------------------------" << endl << endl;
  224. }
  225.  
  226. file.close();
  227. }
  228.  
  229. void printResults() {
  230. ofstream file;
  231. file.open("IFF57_RainysJ_Lab2a_rez.txt", ios_base::app);
  232.  
  233. file << "B[] = " << endl;
  234. file << "-----------------------------------" << endl;
  235. for (int i = 0; i < B.B.laukuCount; i++)
  236. {
  237. file << "laukas: " << setw(8) << right << B.B.laukai[i].laukas << ", " << "kiekis: " << setw(8) << right << B.B.laukai[i].kiekis << "|" << endl;
  238.  
  239. }
  240. file << "-----------------------------------" << endl;
  241.  
  242. file.close();
  243. }
  244.  
  245. void startThreads(Fakultetas(&fakultetai)[FAK_COUNT], Laukai(&laukai)[FAK_COUNT])
  246. {
  247. int baigusiuDetiGijuCount = 0;
  248. B.B.laukuCount = 0;
  249. int threadsCount = FAK_COUNT * 2;
  250. //thread t[FAK_COUNT * 2];
  251.  
  252. #pragma omp parallel num_threads(FAK_COUNT * 2)
  253. {
  254. int i = omp_get_thread_num();
  255.  
  256. if (i < FAK_COUNT)
  257. executeP(i, fakultetai[i].studentai, fakultetai[i].studCount);
  258. else
  259. executeV(i - FAK_COUNT, laukai[i - FAK_COUNT].laukai, laukai[i - FAK_COUNT].laukuCount);
  260.  
  261.  
  262. if (i < FAK_COUNT - 1)
  263. baigusiuDetiGijuCount++;
  264.  
  265. if(baigusiuDetiGijuCount == FAK_COUNT - 1)
  266. BaigeDetiIB = true;
  267. }
  268.  
  269. //for (int i = 0; i < threadsCount; i++)
  270. //{
  271. // if (i < FAK_COUNT)
  272. // t[i] = thread(executeP, i, fakultetai[i].studentai, fakultetai[i].studCount);
  273. // else
  274. // t[i] = thread(executeV, i - FAK_COUNT, laukai[i - FAK_COUNT].laukai, laukai[i - FAK_COUNT].laukuCount);
  275. //}
  276.  
  277. //for (int i = 0; i < threadsCount; i++)
  278. //{
  279. // t[i].join();
  280. // if (i < FAK_COUNT - 1)
  281. // baigusiuDetiGijuCount++;
  282. // else
  283. // BaigeDetiIB = true;
  284. //}
  285. }
  286.  
  287. void executeP(int ind, Studentas studentai[], int studCount)
  288. {
  289. for (int i = 0; i < studCount; i++)
  290. {
  291. Laukas laukas;
  292. laukas.laukas = studentai[i].kursas;
  293. laukas.kiekis = 1;
  294.  
  295. B.insert(laukas, ind);
  296. }
  297. }
  298.  
  299. void executeV(int ind, Laukas laukai[], int laukuCount)
  300. {
  301. bool arSuktiCikla = true;
  302. bool arLiko[MAX_LAUKU] = { true };
  303. while (arSuktiCikla || !BaigeDetiIB) {
  304. for (int i = 0; i < laukuCount; i++)
  305. {
  306. arLiko[i] = B.remove(laukai[i], ind);
  307. }
  308.  
  309. int likusiuKiekis = 0;
  310. for (int i = 0; i < laukuCount; i++)
  311. {
  312. if (arLiko[i])
  313. likusiuKiekis++;
  314. }
  315.  
  316. if (likusiuKiekis == 0)
  317. arSuktiCikla = false;
  318. }
  319. }
Advertisement
Add Comment
Please, Sign In to add comment