用于存放学校的作业便于复习。
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

271 regels
6.9 KiB

  1. //����2-2
  2. #include <iostream>
  3. #include <ctime>
  4. #include <stdlib.h>
  5. #include <time.h>
  6. #include <windows.h>
  7. using namespace std;
  8. #define Status int
  9. #define OVERFLOW 2
  10. #define ERROR 1
  11. #define OK 0;
  12. typedef int QElemType;
  13. int queue_number[10] = { 0 };//queue_number��¼��������
  14. int i, j = 0;//i���ڿͻ�������j���ڴ��ڼ���
  15. int no = 0;//no���ڼ�¼�ͻ����ţ����е�һλ�ͻ�������Ϊ1
  16. int time_length = 0;//time_length��¼ģ����������ʱ��
  17. int window_number = 0;
  18. typedef struct QNode
  19. {
  20. int no;//����
  21. double amount;//�ܽ���
  22. double remain_amount;//δȡ������Ƶ�ǰ�֣�
  23. struct QNode* next;
  24. }QNode, * QueuePtr;
  25. typedef struct
  26. {
  27. QueuePtr front; //��ͷָ��
  28. QueuePtr rear; //��βָ��
  29. }LinkQueue;
  30. Status InitQueue(LinkQueue& Q)
  31. {
  32. Q.front = Q.rear = (QueuePtr)malloc(sizeof(QNode));
  33. if (!Q.front) exit(OVERFLOW);
  34. Q.front->next = NULL;
  35. return OK;
  36. }
  37. Status DestroyQueue(LinkQueue& Q)
  38. {
  39. while (Q.front)
  40. {
  41. Q.rear = Q.front->next;
  42. free(Q.front);
  43. Q.front = Q.rear;
  44. }
  45. return OK;
  46. }
  47. Status QueueEmpty(LinkQueue Q)
  48. {
  49. return (Q.front == Q.rear);
  50. }
  51. Status GetHead(LinkQueue Q, int& e1, double& e2, double& e3)
  52. {
  53. if (Q.front == Q.rear) return ERROR;
  54. e1 = Q.front->next->no;
  55. e2 = Q.front->next->amount;
  56. e3 = Q.front->next->remain_amount;
  57. return OK;
  58. }
  59. Status EnQueue(LinkQueue& Q, int& e1, double& e2, double& e3)
  60. {
  61. QueuePtr p;
  62. p = (QueuePtr)malloc(sizeof(QNode));
  63. if (!p) exit(OVERFLOW);
  64. p->no = e1;
  65. p->amount = e2;
  66. p->remain_amount = e3;
  67. p->next = NULL;
  68. Q.rear->next = p;
  69. Q.rear = p;
  70. return OK;
  71. }
  72. Status DeQueue(LinkQueue& Q, int& e1, double& e2, double& e3)
  73. {
  74. if (Q.front == Q.rear) return ERROR;
  75. QueuePtr p;
  76. p = Q.front->next;
  77. e1 = p->no;
  78. e2 = p->amount;
  79. e3 = p->remain_amount;
  80. Q.front->next = p->next;
  81. if (Q.rear == p) Q.rear = Q.front;
  82. delete p;
  83. return OK;
  84. }
  85. int MinQueue()
  86. {
  87. int s = 10000, k = 0, temp;
  88. for (k = 0;k < window_number;k++)
  89. {
  90. if (queue_number[k] < s)
  91. {
  92. temp = k;
  93. s = queue_number[k];
  94. }
  95. }
  96. return temp;
  97. }
  98. int MaxQueue()
  99. {
  100. int s = -1, k = 0, temp;
  101. for (k = 0;k < window_number;k++)
  102. {
  103. if (queue_number[k] > s)
  104. {
  105. temp = k;
  106. s = queue_number[k];
  107. }
  108. }
  109. return temp;
  110. }
  111. void Remove(LinkQueue& Q)//������һ�����Ƿ���ȡ�ꡣע���ж϶����Ƿ�Ϊ�ա�
  112. {
  113. if (!QueueEmpty(Q))
  114. {
  115. if (Q.front->next->remain_amount <= 1e-8)
  116. {
  117. int e1 = -1;
  118. double e2 = -1, e3 = -1;
  119. DeQueue(Q, e1, e2, e3);
  120. SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
  121. FOREGROUND_INTENSITY | FOREGROUND_GREEN);//������ɫ
  122. cout << "��" << (double)i / 10 + 0.1 << "��ʱ" << j + 1 << "�Ŵ���"
  123. << "��" << e1 << "λ�ͻ�����ҵ����ȡ�߹�" << e2 << "��Ԫ��" << endl;
  124. queue_number[j]--;
  125. }
  126. }
  127. }
  128. void Join(LinkQueue* q)
  129. {
  130. int a = rand() % 60;
  131. //a��ֵ��0-60֮�������ֲ���ֻ�е�a=0��window_number-1ʱ�Ų����¿ͻ�
  132. //ƽ��ÿ6������window_number���ͻ����봰��������Ӧ
  133. if (a < window_number)
  134. {
  135. no++;
  136. double b = double(rand() % 191) / 10 + 1;//b��ֵ��1-20֮�������ֲ�(����0.1)�������û�ȡǮ�Ľ���������λ����Ԫ��
  137. int m = MinQueue();
  138. EnQueue(q[m], no, b, b);
  139. SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
  140. FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN);//���ú�ɫ����ɫ����
  141. cout << "��" << (double)i / 10 + 0.1 << "��ʱ��" << no << "λ�ͻ����봰��"
  142. << m + 1 << "���У���ȡ" << b << "��Ԫ��" << endl;
  143. queue_number[m]++;
  144. }
  145. }
  146. void ChangeQuene(LinkQueue* q)
  147. {
  148. int min = MinQueue(), max = MaxQueue();
  149. while (queue_number[max] - queue_number[min] >= 2)
  150. {
  151. int e1;
  152. double e2, e3;
  153. DeQueue(q[max], e1, e2, e3);
  154. EnQueue(q[min], e1, e2, e3);
  155. SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
  156. FOREGROUND_INTENSITY | FOREGROUND_BLUE);//������ɫ
  157. cout << "��" << e1 << "λ�ͻ��Ӵ���" << max + 1 << "���е���������" << min + 1 << "����" << endl;
  158. queue_number[min]++;
  159. queue_number[max]--;
  160. min = MinQueue();
  161. max = MaxQueue();
  162. }
  163. }
  164. void Withdraw(LinkQueue& Q)
  165. {
  166. if (!QueueEmpty(Q) && i != time_length)
  167. {
  168. Q.front->next->remain_amount -= 0.2;//ÿ0.1��ȡ��0.2��
  169. }
  170. }
  171. void Undone(LinkQueue& Q)
  172. {
  173. while (!QueueEmpty(Q))
  174. {
  175. int e1 = -1;
  176. double e2 = -1, e3 = -1;
  177. DeQueue(Q, e1, e2, e3);
  178. SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
  179. FOREGROUND_INTENSITY | FOREGROUND_GREEN | FOREGROUND_BLUE);//������ɫ����ɫ����
  180. cout << "����" << j + 1 << "���е�" << e1 <<
  181. "λ�ͻ�δ����ҵ����δȡ��" << e2 << "��Ԫ��" << endl;
  182. }
  183. }
  184. int main()
  185. {
  186. cout << "������ģ����������ʱ������λ���룩��1-300֮������������" << endl;
  187. //time_length = 120;
  188. cin >> time_length;
  189. while (time_length <= 0 || time_length > 300)
  190. {
  191. cout << "��������ʱ�䲻����Ҫ�������������룺";
  192. cin >> time_length;
  193. }
  194. cout << "���������д�������1-10֮������������" << endl;
  195. cin >> window_number;
  196. while (window_number <= 0 || window_number > 10)
  197. {
  198. cout << "�������Ĵ�����������Ҫ�������������룺";
  199. cin >> window_number;
  200. }
  201. LinkQueue* q = (LinkQueue*)malloc(window_number * sizeof(LinkQueue));
  202. //���г�ʼ��
  203. for (j = 0;j < window_number;j++)
  204. {
  205. InitQueue(q[j]);
  206. }
  207. srand(time(nullptr));//��������������
  208. //���Ĵ���
  209. for (i = 0;i <= time_length * 10;i++)//ÿ0.1��ѭ��һ�Σ�ֱ������Ԥ��ʱ��
  210. {
  211. //�ȼ�����һ�����Ƿ���ȡ�ꡣע���ж϶����Ƿ�Ϊ��
  212. for (j = 0;j < window_number;j++)
  213. {
  214. Remove(q[j]);
  215. }
  216. //�ٰ��¿ͻ��ӵ������ٵĶ���
  217. Join(q);
  218. //���ж��Ƿ��пͻ���Ҫ����ѡ������
  219. ChangeQuene(q);
  220. //�ٸ���ǰ������һλȡǮ��ע���ж϶����Ƿ�Ϊ��
  221. //ע��i=time_lengthʱȡǮҵ���Ѿ�ֹͣ
  222. for (j = 0;j < window_number;j++)
  223. {
  224. Withdraw(q[j]);
  225. }
  226. Sleep(93);
  227. //100��λΪ���룬��0.1�롣���ǵ���������ʱ�䣬��100��Ϊ93
  228. //����Sleep()�����ľ��Ȳ��ߣ�����ѭ����������̫С
  229. }
  230. //��������ǰ������δȡ��Ǯ���˵�����
  231. SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
  232. FOREGROUND_INTENSITY);//������ɫ��û��������ɫ����Ϊԭɫ
  233. cout << endl << "ȡǮҵ��������" << endl << endl;
  234. for (j = 0;j < window_number;j++)
  235. {
  236. Undone(q[j]);
  237. }
  238. SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
  239. FOREGROUND_INTENSITY);//������ɫ��û��������ɫ����Ϊԭɫ
  240. return 0;
  241. }