Posted By

mhajdukov on 11/30/11


Tagged

red polje


Versions (?)

Implementacija reda pomoću polja


 / Published in: C++
 

implementacija reda pomoću polja

  1. //implementacija pomo���u polja
  2.  
  3. struct qu { // struktura reda
  4. tpacijent podaci[10000];
  5. int front, rear;
  6. };
  7.  
  8. typedef struct qu queue;
  9.  
  10. int AddOne(int n) {
  11. return((n+1)%10000);
  12. }
  13.  
  14. tpacijent FrontQ(queue* Q) { // funkcija koja vraca element s pocetka reda
  15. tpacijent prvi;
  16. prvi = Q->podaci[Q->front];
  17. return prvi;
  18. }
  19.  
  20. void EnQueueQ (tpacijent x, queue* Q) { // funkcija koja unosi novi element na kraj reda
  21. Q->rear=AddOne(Q->rear);
  22. Q->podaci[Q->rear] = x;
  23. }
  24.  
  25. void DeQueueQ(queue* Q){ // funkcija koja brise element s pocetka reda
  26. Q->front = AddOne(Q->front);
  27. }
  28.  
  29. queue* InitQ(queue* Q){ // funkcija za inicijaliziranje novog reda
  30. Q = new queue;
  31. Q->front = 0;
  32. Q->rear = 9999;
  33. return Q;
  34. }
  35.  
  36. bool IsEmptyQ(queue* Q){
  37. if(AddOne(Q->rear) == Q->front) return true;
  38. return false;
  39. }
  40.  
  41.  
  42. //implementacija pomocu pokazivaca
  43.  
  44. struct qu {
  45. tpacijent element;
  46. qu *sljedeci;
  47. };
  48.  
  49. struct que {
  50. qu *front, *rear;
  51. };
  52.  
  53. typedef struct que queue;
  54.  
  55. tpacijent FrontQ(queue* Q) { // funkcija koja se vraca vrijednost elementa na pocetku reda
  56. tpacijent prvi;
  57. prvi = Q->front->sljedeci->element;
  58. return prvi;
  59. }
  60.  
  61. void EnQueueQ (tpacijent x, queue* Q) { // funkcija kojda dodaje novi element na kraj reda
  62. qu* novi = new qu;
  63. novi->element = x;
  64. novi->sljedeci = NULL;
  65. Q->rear->sljedeci=novi;
  66. Q->rear = novi;
  67. }
  68.  
  69. void DeQueueQ(queue* Q) { // funkcija koja brise element s pocetka reda
  70. qu* brisi = Q->front;
  71. Q->front = brisi->sljedeci;
  72. delete brisi;
  73. }
  74.  
  75. queue* InitQ(queue* Q) { // funkcija koja inicijalizira novi red
  76. Q = new queue;
  77. qu* novi = new qu;
  78. Q->front = novi;
  79. Q->rear = novi;
  80. Q->front->sljedeci = NULL;
  81. return Q;
  82. }
  83.  
  84. bool IsEmptyQ(queue* Q) {
  85. if (Q->front == Q->rear) return 1;
  86. else return 0;
  87. }
  88.  
  89.  
  90. //glavni kod
  91.  
  92. #include<iostream>
  93. #include<ctime>
  94. #include<windows.h>
  95. #include<winbase.h>
  96.  
  97. using namespace std;
  98.  
  99. struct tpacijent {
  100. int x;
  101. int y;
  102. int rizik;
  103. };
  104.  
  105. #include "red_polje.h"
  106. //#include "red_pokazivac.h"
  107.  
  108. int N, br=0;
  109.  
  110. tpacijent* generiranje() {
  111. cout << "Koliko pacijenata zelite generirati: ";
  112. cin >> N;
  113. cout << endl;
  114. tpacijent *pacijent = new tpacijent[N];
  115. for (int i=0;i<N;i++) {
  116. cout << "Generiram " << i+1 << ". pacijenta" << endl;
  117. pacijent[i].x = rand()%10000+1;
  118. pacijent[i].y = rand()%10000+1;
  119. // za testiranje programa
  120. // int test = i;
  121. // pacijent[i].x = test;
  122. // pacijent[i].y = test+1000;
  123. }
  124. return pacijent;
  125. };
  126.  
  127. void generiranje_prioriteta(tpacijent pacijent[]) {
  128. for (int i=0;i<N;i++) {
  129. cout << "Generiram prioritet " << i+1 << ". pacijentu" << endl;
  130. pacijent[i].rizik = rand()%4+1;
  131. }
  132. cout << endl;
  133. };
  134.  
  135. void ispis(queue* Q, int izbor) {
  136. tpacijent pom;
  137. cout << endl;
  138. for (int i=0; i<br; i++) {
  139. pom = FrontQ(Q);
  140. DeQueueQ(Q);
  141. cout << "\t" << i+1 << ". u redu-------------------------" << endl
  142. << "\t" << "Dosao " << pom.x /1000.0 << " sekundi nakon prethodnoga " << endl
  143. << "\t" << "Treba " << pom.y /1000.0 << " sekundi u ordinaciji " << endl;
  144. if (izbor == 1)
  145. cout << "\t" << "Razina rizika " << pom.rizik << endl;
  146. EnQueueQ(pom,Q);
  147. }
  148. cout << endl;
  149. }
  150.  
  151. void posluzi_sekvencijalno(queue* Q, tpacijent pacijent[]) {
  152. int vrijeme_ulaz, vrijeme_izlaz;
  153. tpacijent ordinacija;
  154. int ukupno = N;
  155. br = 0;
  156.  
  157. vrijeme_ulaz = time(NULL);
  158.  
  159. EnQueueQ(pacijent[0],Q); br++;
  160.  
  161. for (int i=0;i<N;i++) {
  162. ordinacija = FrontQ(Q);
  163. DeQueueQ(Q); br--;
  164. ukupno--;
  165. cout << i+1 << ". pacijent ulazi u ordinaciju na " << ordinacija.y/1000.0 << " sekundi" << endl;
  166. Sleep(ordinacija.y);
  167. int sat=0;
  168. for (int j=i+1+br;j<N;j++) {
  169. sat = sat + pacijent[j].x;
  170. if(sat < ordinacija.y) {
  171. cout << "Novi pacijent je dosao u meduvremenu" << endl;
  172. EnQueueQ(pacijent[j],Q);
  173. br++;
  174. }
  175. else break;
  176. }
  177. cout << i+1 << ". pacijent izlazi iz ordinacije" << endl;
  178. cout << "Stanje reda: ";
  179.  
  180. if (IsEmptyQ(Q)) {
  181. cout << "Cekaonica je trenutno prazna" << endl << endl;
  182. if (ukupno == 0) {
  183. vrijeme_izlaz = time(NULL);
  184. cout << "Proteklo vrijeme = " << vrijeme_izlaz - vrijeme_ulaz << endl;
  185. return;
  186. }
  187. int razlika = pacijent[i+1].x - ordinacija.y;
  188. Sleep(razlika);
  189. EnQueueQ(pacijent[i+1],Q);
  190. br++;
  191. }
  192. else ispis(Q,0);
  193. }
  194. }
  195.  
  196. void preslozi (queue *Q, int rizik) {
  197. queue* P = InitQ(P);
  198. tpacijent pom;
  199.  
  200. for (int i=0; i<br; i++) {
  201. pom = FrontQ(Q);
  202. DeQueueQ(Q);
  203. if(pom.rizik == rizik)
  204. EnQueueQ(pom,Q);
  205. else
  206. EnQueueQ(pom,P);
  207. }
  208.  
  209. while(!IsEmptyQ(P)){
  210. pom = FrontQ(P);
  211. DeQueueQ(P);
  212. EnQueueQ(pom,Q);
  213. }
  214. };
  215.  
  216. void posluzi(queue* Q, tpacijent pacijent[]) {
  217. int vrijeme_ulaz, vrijeme_izlaz;
  218. tpacijent ordinacija, ceka;
  219. int ukupno = N;
  220. br = 0;
  221.  
  222. vrijeme_ulaz = time(NULL);
  223.  
  224. EnQueueQ(pacijent[0],Q); br++;
  225.  
  226. for (int i=0;i<N;i++) {
  227. ordinacija = FrontQ(Q);
  228. DeQueueQ(Q); br--;
  229. ukupno--;
  230. cout << i+1 << ". pacijent ulazi u ordinaciju na " << ordinacija.y/1000.0 << " sekundi" << endl;
  231. Sleep(ordinacija.y);
  232. int sat=0;
  233. for (int j=i+1+br;j<N;j++) {
  234. sat = sat + pacijent[j].x;
  235. if(sat < ordinacija.y) {
  236. cout << "Novi pacijent je dosao u meduvremenu" << endl;
  237. EnQueueQ(pacijent[j],Q);
  238. br++;
  239. preslozi(Q,1);
  240. preslozi(Q,2);
  241. preslozi(Q,3);
  242. preslozi(Q,4);
  243. }
  244. else break;
  245. }
  246. cout << i+1 << ". pacijent izlazi iz ordinacije" << endl;
  247. cout << "Stanje reda: ";
  248.  
  249. if (IsEmptyQ(Q)) {
  250. cout << "Cekaonica je trenutno prazna" << endl << endl;
  251. if (ukupno == 0) {
  252. vrijeme_izlaz = time(NULL);
  253. cout << "Proteklo vrijeme = " << vrijeme_izlaz - vrijeme_ulaz << endl;
  254. return;
  255. }
  256. int razlika = pacijent[i+1].x - ordinacija.y;
  257. Sleep(razlika);
  258. EnQueueQ(pacijent[i+1],Q);
  259. br++;
  260. preslozi(Q,1);
  261. preslozi(Q,2);
  262. preslozi(Q,3);
  263. preslozi(Q,4);
  264. }
  265. else ispis(Q,1);
  266. }
  267. }
  268.  
  269. int main () {
  270. int izbor, broj_klijenata=0, umanji;
  271. tpacijent *pacijent;
  272. queue* Q = InitQ(Q);
  273. do {
  274. cout << "Izbornik" << endl
  275. << "1. Generiranje polja" << endl
  276. << "2. Sekvencijalno posluzivanje" << endl
  277. << "3. Posluzi" << endl
  278. << "9. Izlaz" << endl
  279. << "Izbor: ";
  280. cin >> izbor;
  281. cout << endl;
  282. switch (izbor) {
  283.  
  284. case 1:
  285. pacijent = generiranje();
  286. cout << endl;
  287. break;
  288.  
  289. case 2:
  290. posluzi_sekvencijalno(Q, pacijent);
  291. cout << endl;
  292. break;
  293.  
  294. case 3:
  295. generiranje_prioriteta(pacijent);
  296. posluzi(Q, pacijent);
  297. cout << endl;
  298. break;
  299.  
  300. case 9:
  301. break;
  302. }
  303. } while (izbor!=9);
  304. return 0;
  305. }

Report this snippet  

You need to login to post a comment.