Advertisement
Guest User

Untitled

a guest
Nov 22nd, 2017
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.59 KB | None | 0 0
  1. //Mantvydas Pleiris IFF-5/6 laboratorinis darbas 3A
  2. #include <iostream>
  3. #include <fstream>
  4. #include <iomanip>
  5. #include <mpi.h>
  6. #include <vector>
  7. #include <string.h>
  8. using namespace std;
  9.  
  10. //Picu objekto struktūra
  11. struct Picos {
  12. char pica[20]; //Picos pavadinimas
  13. int dydis; //Picos dydis
  14. double kaina; //Picos kaina
  15. };
  16. //Pirkimų objekto struktūra
  17. struct Pirkimai {
  18. char pica[20]; //Picos pavadinimas
  19. int kiekis; //Picų kiekis
  20. };
  21. void Rasymas(Pirkimai *B, int dydis);
  22. void Rasymas1(vector<vector<Picos> > &P); //Duomenų spausdinimo metodo P masyvui antraštė
  23. void Rasymas2(vector<vector<Pirkimai> > &V); //Duomenų spausdinimo metodo V masyvui antraštė
  24. void Skaitymas1(vector<vector<Picos> > &P); //Duomenų skaitymo metodo P masyvui antraštė
  25. void Skaitymas2(vector<vector<Pirkimai> > &V); //Duomenų spausdinimo metodo V masyvui antraštė
  26. void Picu_siuntimas(Picos *picos, int dydis, int rank);
  27. Picos *Picu_gavimas(int &dydis, int rank);
  28. void Pirkimu_siuntimas(Pirkimai *pirkimai, int dydis, int rank);
  29. Pirkimai *Pirkimu_gavimas(int &dydis, int rank);
  30. bool PridetiIBMasyva(Pirkimai *B, int &dydis, Picos pica);
  31. bool Salinti(Pirkimai *B, int &dydis, Pirkimai pirkimas);
  32. void Valdymas();
  33. void Skaityti();
  34. void DetiIB();
  35. void SalintiIsB();
  36.  
  37. ifstream fileDuom("IFF5-6_PleirisM_L3_dat1.txt"); //Duomenu failas
  38. //ifstream fileDuom("IFF5-6_PleirisM_L3_dat2.txt"); //Duomenu failas
  39. //ifstream fileDuom("IFF5-6_PleirisM_L3_dat3.txt"); //Duomenu failas
  40. ofstream fileRez("IFF5-6_PleirisM_L3_rez.txt"); //Rezultatu failas
  41.  
  42.  
  43. void Picu_siuntimas(Picos *picos, int dydis, int rank)
  44. {
  45. int byteSk = sizeof(Picos) * dydis;
  46.  
  47. MPI::COMM_WORLD.Send(&byteSk, 1, MPI::INT, rank, 1);
  48. MPI::COMM_WORLD.Send(picos, byteSk, MPI::CHAR, rank, 2);
  49. }
  50.  
  51. Picos *Picu_gavimas(int &dydis, int rank)
  52. {
  53. int byteSk;
  54. MPI_Recv(&byteSk, 1, MPI::INT, rank, 1, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
  55.  
  56. char *bytes = new char[byteSk];
  57. MPI::COMM_WORLD.Recv(bytes, byteSk, MPI::CHAR, rank, 2);
  58.  
  59. Picos *picos = (Picos *)bytes;
  60. dydis = byteSk / sizeof(Picos);
  61.  
  62. return picos;
  63. }
  64. void Pirkimu_siuntimas(Pirkimai *pirkimai, int dydis, int rank)
  65. {
  66. int byteSk = sizeof(Pirkimai) * dydis;
  67.  
  68. MPI::COMM_WORLD.Send(&byteSk, 1, MPI::INT, rank, 1);
  69. MPI::COMM_WORLD.Send(pirkimai, byteSk, MPI::CHAR, rank, 2);
  70. }
  71.  
  72. Pirkimai *Pirkimu_gavimas(int &dydis, int rank)
  73. {
  74. int byteSk;
  75. MPI_Recv(&byteSk, 1, MPI::INT, rank, 1, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
  76.  
  77. char *bytes = new char[byteSk];
  78. MPI::COMM_WORLD.Recv(bytes, byteSk, MPI::CHAR, rank, 2);
  79.  
  80. Pirkimai *pirkimai = (Pirkimai *)bytes;
  81. dydis = byteSk / sizeof(Pirkimai);
  82.  
  83. return pirkimai;
  84. }
  85. //Metodas, kuris deda P masyvo elementus į bendrą masyvą B
  86. bool PridetiIBMasyva(Pirkimai *B, int &dydis, Picos pica)
  87. {
  88. for (int b = 0; b < dydis; b++)
  89. {
  90.  
  91. if (dydis == 0) //Jei masyvas tuščias
  92. {
  93. strcpy(B[b].pica,pica.pica);
  94. B[b].kiekis = 1;
  95. dydis++;
  96. return true;
  97. }
  98. else if (B[b].pica == pica.pica)
  99. {
  100. B[b].kiekis++;
  101. return true;
  102. }
  103. else if (B[b].pica > pica.pica) //Jei dedamas į galą
  104. {
  105. for (int i = dydis; i > b; i--)
  106. {
  107. B[i] = B[i - 1];
  108. }
  109. strcpy(B[b].pica,pica.pica);
  110. B[b].kiekis = 1;
  111. dydis++;
  112. return true;
  113. }
  114. }
  115. return true;
  116. }
  117. //Metodas skirtas šalinti elementus iš B masyvo, kurie sutampa su V masyvo elementais.
  118. bool Salinti(Pirkimai *B, int &dydis, Pirkimai pirkimas)
  119. {
  120. for (int i = 0; i < dydis; i++)
  121. {
  122. if (B[i].pica == pirkimas.pica)
  123. {
  124. if (pirkimas.kiekis >= B[i].kiekis)
  125. {
  126. for (int j = i; j < dydis - 1; j++)
  127. {
  128. B[j] = B[j + 1]; //Perstumiamas masyvas per vieną vietą nuo elemento iki galo.
  129. }
  130. dydis--; //Minusuojamas elementų kiekio skaitliukas
  131. strcpy (B[dydis].pica,0);
  132. B[dydis].kiekis = 0;
  133. }
  134. else //Jei picų kiekis didesnis nei pirkimo masyvo picų kiekis
  135. B[i].kiekis = B[i].kiekis - pirkimas.kiekis;
  136. return true;
  137. }
  138. }
  139. return false;
  140. }
  141.  
  142. void Valdymas()
  143. {
  144. Pirkimai B[20];
  145. int dydis = 0;
  146. int baigtiP = 0;
  147. int baigtiV = 0;
  148.  
  149. while (baigtiP + baigtiV < 18)
  150. {
  151. int a; //baitu skaicius
  152. MPI::Status status;
  153. MPI::COMM_WORLD.Send(&a, 1, MPI::INT, 1, 1);
  154. if(a == 0)
  155. {
  156. if(status.Get_source() < 10)
  157. baigtiP++;
  158. else
  159. baigtiV++;
  160. }
  161. else
  162. {
  163. char r[a];
  164. MPI::COMM_WORLD.Recv(r, a, MPI::CHAR, status.Get_source(), 2);
  165. if(a = sizeof(Picos))
  166. {
  167. Picos pica = *(Picos *)r;
  168. PridetiIBMasyva(B, dydis, pica);
  169. }
  170. else
  171. {
  172. bool pavyko = Salinti(B, dydis, *(Pirkimai *)r);
  173. int reiksme;
  174. if (pavyko == true)
  175. {
  176. reiksme = 1;
  177. }
  178. else if(baigtiP < 9)
  179. {
  180. reiksme = 0;
  181. }
  182. else
  183. {
  184. reiksme = 0;
  185. }
  186. MPI::COMM_WORLD.Send(&reiksme, 1, MPI::INT, status.Get_source(), 4);
  187. }
  188. }
  189. }
  190. Pirkimu_siuntimas(B, dydis, 0);
  191. }
  192.  
  193. int main()
  194. {
  195. MPI::Init();
  196. cout << "Pradzia" << endl;
  197. int rank = MPI::COMM_WORLD.Get_rank();
  198. if (rank == 0)
  199. {
  200. Skaityti();
  201. }
  202. else if (rank < 10)
  203. {
  204. DetiIB();
  205. }
  206. else if (rank < 19)
  207. {
  208. SalintiIsB();
  209. }
  210. else if (rank == 19)
  211. {
  212. Valdymas();
  213. }
  214. MPI::Finalize();
  215. return 0;
  216. }
  217.  
  218. void Skaityti()
  219. {
  220. vector< vector<Picos> > P;
  221. vector< vector<Pirkimai> > V;
  222. Skaitymas1(P);
  223. Skaitymas2(V);
  224. int i = 0;
  225. int j = 0;
  226. while(i < P.size())
  227. {
  228. vector<Picos> picos = P[i];
  229. Picu_siuntimas(&picos[0], picos.size(), i + 1);
  230. i++;
  231. }
  232. while(j < V.size())
  233. {
  234. vector<Pirkimai> pirkimai = V[j];
  235. Pirkimu_siuntimas(&pirkimai[0], pirkimai.size(), j + 10);
  236. j++;
  237. }
  238. int dydis;
  239. Pirkimai *B = Pirkimu_gavimas(dydis, 19);
  240. Rasymas1(P);
  241. Rasymas2(V);
  242. Rasymas(B, dydis);
  243. fileDuom.close(); //Uždaromas duomenų failas
  244. fileRez.close(); //Uždaromas rezultatų failas
  245. }
  246.  
  247. void DetiIB(){
  248. int dydis;
  249. Picos *picos = Picu_gavimas(dydis, 0);
  250. int bytes = sizeof(Picos);
  251. for(int i = 0; i < dydis; i++)
  252. {
  253. MPI::COMM_WORLD.Send(&bytes, 1, MPI::INT, 19, 1);
  254. MPI::COMM_WORLD.Send(&picos[i], bytes, MPI::CHAR, 19, 2);
  255. }
  256. bytes = 0;
  257. MPI::COMM_WORLD.Send(&bytes, 1, MPI::INT, 19, 1);
  258. }
  259. //Metodas skirtas iš duomenų failo pildyti P masyva picomis
  260. void SalintiIsB(){
  261. int dydis;
  262. Pirkimai *pirkimai = Pirkimu_gavimas(dydis,0);
  263.  
  264. bool pavyko[dydis];
  265. bool nepasalinti = true;
  266. int bytes = sizeof(Pirkimai);
  267. while(nepasalinti)
  268. {
  269. nepasalinti = false;
  270. for (int i = 0; i < dydis; i++)
  271. {
  272. if(!pavyko[i])
  273. {
  274. MPI::COMM_WORLD.Send(&bytes, 1, MPI::INT, 19, 1);
  275. MPI::COMM_WORLD.Send(&pirkimai[i], bytes, MPI::CHAR, 19, 2);
  276. int reiksme;
  277. MPI::COMM_WORLD.Recv(&reiksme, 1, MPI::INT, 19, 4);
  278.  
  279. if(reiksme == 1)
  280. {
  281. pavyko[i] = true;
  282. }
  283. else if(reiksme == 0)
  284. {
  285. nepasalinti = true;
  286. }
  287. }
  288. }
  289. }
  290. bytes = 0;
  291. MPI::COMM_WORLD.Send(&bytes, 1, MPI::INT, 19, 1);
  292. }
  293. void Skaitymas1(vector<vector<Picos> > &P) {
  294. int kiekis; //Picerijų kiekis
  295. string picerija; //Picerijos pavadinimas
  296. int picuKiekis; //Picų kiekis
  297.  
  298. fileDuom >> kiekis;
  299. for (int i = 0; i < kiekis; i++)
  300. {
  301. Picos pica; //Picos elementas
  302. vector<Picos> picos; //Picų masyvas
  303. fileDuom >> picerija >> picuKiekis;
  304. for (int j = 0; j < picuKiekis; j++)
  305. {
  306. fileDuom >> pica.pica >> pica.dydis >> pica.kaina;
  307. picos.push_back(pica);
  308. }
  309. P.push_back(picos);
  310. }
  311. }
  312. //Metodas skirtas iš duomenų failą pildyti masyva V pirkimo elementais
  313. void Skaitymas2(vector<vector<Pirkimai> > &V) {
  314. int kiekis; //Pirkėjų kiekis
  315. string pirkejas; //Pirkėjo pavadinimas
  316. int picuKiekis; //Picų kiekis
  317. fileDuom >> kiekis;
  318. for (int i = 0; i < kiekis; i++)
  319. {
  320. Pirkimai pirkimas; //Pirkimų elementas
  321. vector<Pirkimai> pirkimai; //Pirkimų masyvas
  322. fileDuom >> pirkejas >> picuKiekis;
  323. for (int j = 0; j < picuKiekis; j++)
  324. {
  325. fileDuom >> pirkimas.pica >> pirkimas.kiekis;
  326. pirkimai.push_back(pirkimas);
  327. }
  328. V.push_back(pirkimai);
  329. }
  330. }
  331. //Metodas skirtas spausdinimui P masyvo duomenų
  332. void Rasymas1(vector<vector<Picos> > &P) {
  333.  
  334. for (int i = 0; i < P.size(); i++)
  335. {
  336. fileRez << "P masyvas: " << i + 1 << endl;
  337. fileRez << setw(3) << "Nr." << setw(20) << "Pica" << setw(8) << "Dydis" << setw(10) << "Kaina" << endl;
  338. for (int j = 0; j < P[i].size(); j++)
  339. {
  340. fileRez << setw(2) << j + 1 << ")" << setw(20) << P[i][j].pica << setw(8) << P[i][j].dydis << setw(10) << P[i][j].kaina << endl;
  341. }
  342. }
  343. fileRez << setfill('-') << setw(41) << "-" << setfill(' ') << endl;
  344.  
  345. }
  346. //Metodas skirtas spausdinimui V masyvo duomenų
  347. void Rasymas2(vector<vector<Pirkimai> > &V) {
  348. if (fileRez.is_open())
  349. {
  350.  
  351. for (int i = 0; i < V.size(); i++)
  352. {
  353. fileRez << "V masyvas: " << i + 1 << endl;
  354. fileRez << setw(3) << "Nr." << setw(20) << "Pica" << setw(8) << "Kiekis" << endl;
  355. for (int j = 0; j < V[i].size(); j++)
  356. {
  357. fileRez << setw(2) << j + 1 << ")" << setw(20) << V[i][j].pica << setw(8) << V[i][j].kiekis << endl;
  358. }
  359. }
  360. fileRez << setfill('-') << setw(30) << "-" << setfill(' ') << endl;
  361. }
  362. else cout << "Nepavyko atidaryti failo";
  363. }
  364. //B masyvo spausdinimo metodas
  365. void Rasymas(Pirkimai *B, int dydis){
  366.  
  367. if (dydis != 0) //Jei egzistuoja elementai masyve
  368. {
  369. fileRez << "Masyvas B:" << endl;
  370. fileRez << setw(3) << "Nr." << setw(20) << "Pica" << setw(8) << "Kiekis" << endl;
  371. for (int j = 0; j < dydis; j++)
  372. {
  373. fileRez << setw(2) << j + 1 << ")" << setw(20) << B[j].pica << setw(8) << B[j].kiekis << endl;
  374. }
  375. }
  376. else //Jei masyvas tuščias
  377. {
  378. fileRez << "Masyvas B yra tuscias" << endl;
  379. }
  380. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement