1 /* scheduler.cpp
2 * 操作系统任务调度问题。操作系统任务分为系统任务和用户任务两种。
3 * 其中,系统任务的优先级 < 50,用户任务的优先级 >= 50且 <= 255。
4 * 优先级大于255的为非法任务,应予以剔除。现有一任务队列task[],
5 * 长度为n,task中的元素值表示任务的优先级,数值越小,优先级越高。
6 * 函数scheduler实现如下功能,将task[] 中的任务按照系统任务、用户任务
7 * 依次存放到 system_task[] 数组和 user_task[] 数组中
8 * (数组中元素的值是任务在task[] 数组中的下标),
9 * 并且优先级高的任务排在前面,数组元素为-1表示结束。
10 */
11
12 #include <stdio.h>
13 #include <stdlib.h>
14 #include <string.h>
15
16 #define N 100
17
18 void scheduler(int task[], int n, int system_task[], int user_task[])
19 {
20 if (task == NULL || n < 0 || system_task == NULL || user_task == NULL)
21 {
22 printf("The task queue is empty!\n");
23 return;
24 }
25 int i = 0, j = 0, k = 0;
26 int temp = 0;
27 //Set the content of system_task[] and user_task[]
28 for (i = 0; i < n; i++)
29 {
30 system_task[i] = i;
31 }
32 memset(user_task, 0xff, n * sizeof(int));
33
34 //Use bubble sort to order task[] from small to large
35 //Use system_task[] to record the subscript of task[]
36 for (i = 0; i < n - 1; i++)
37 {
38 for (j = 0; j < n - 1 - i; j++)
39 {
40 if (task[j] > task[j + 1])
41 {
42 temp = task[j + 1];
43 task[j + 1] = task[j];
44 task[j] = temp;
45
46 temp = system_task[j + 1];
47 system_task[j + 1] = system_task[j];
48 system_task[j] = temp;
49 }
50 }
51 }
52
53 //Judge and fulfill system_task and user_task
54 for (i = 0, j = 0, k = 0; i < n; i++)
55 {
56 if (task[i] >= 0 && task[i] < 50)
57 {
58 system_task[j] = system_task[i];
59 if (i > j)
60 {
61 system_task[i] = -1;
62 }
63 j++;
64 }
65 else if (task[i] >= 50 && task[i] <= 255)
66 {
67 user_task[k] = system_task[i];
68 system_task[i] = -1;
69 k++;
70 }
71 else
72 {
73 printf("Task %d is illegal!\n", task[i]);
74 system_task[i] = -1;
75 }
76 }
77 }
78
79 int main()
80 {
81 int n = 0;
82 int i = 0;
83 printf("Please input the quantity of task, less than %d :", N);
84 scanf("%d", &n);
85 if (n > N || n < 0)
86 {
87 printf("The quantity is too large or illegal!\n");
88 return 1;
89 }
90
91 int *task = (int *)malloc(n * sizeof(int));
92 int *system_task = (int *)malloc(n * sizeof(int));
93 int *user_task = (int *)malloc(n * sizeof(int));
94
95 printf("Please input the task queue : ");
96 for (i = 0; i < n; i++)
97 {
98 scanf("%d", &task[i]);
99 }
100
101 scheduler(task, n, system_task, user_task);
102
103 printf("The system_task array is : ");
104 for (i = 0; i < n; i++)
105 {
106 if (system_task[i] == -1)
107 {
108 break;
109 }
110 else
111 {
112 printf("%d ", system_task[i]);
113 }
114 }
115 printf("\n");
116
117 printf("The user_task array is : ");
118 for (i = 0; i < n; i++)
119 {
120 if (user_task[i] == -1)
121 {
122 break;
123 }
124 else
125 {
126 printf("%d ", user_task[i]);
127 }
128 }
129 printf("\n");
130
131 delete []task, system_task, user_task;
132 return 0;
133 }
134
135 //#include <stdio.h>
136 //#include <string.h>
137 //#include <malloc.h>
138 //#include <iostream>
139 //
140 //void scheduler(int task[], int n, int system_task[], int user_task[])
141 //{
142 // int i;
143 // int j = 0;
144 // int *p, *pp, *p_user, *pp_user;
145 // int index = 0;
146 // int count, count2;
147 // int min = 0;
148 // int k = 0;
149 // p = (int *)malloc(sizeof(int) * n);
150 // for (i = 0; i < n; i++)
151 // {
152 // p[i] = 0;
153 // }
154 // pp = (int *)malloc(sizeof(int) * n);
155 // for (i = 0; i < 0; i++)
156 // {
157 // pp[i] = 0;
158 // }
159 // p_user = (int *)malloc(sizeof(int) * n);
160 // for (i = 0; i < n; i++)
161 // {
162 // p_user[i] = 0;
163 // }
164 // pp_user = (int *)malloc(sizeof(int) * n);
165 // for (i = 0; i < n; i++)
166 // {
167 // pp_user[i] = 0;
168 // }
169 //
170 // for (i = 0; i < n; i++)
171 // {
172 // if (task[i] < 50)
173 // {
174 // system_task[j] = task[i];
175 // pp[j] = i;
176 // j++;
177 // count = j;
178 // }
179 // else if (task[i] <= 255)
180 // {
181 // user_task[k] = task[i];
182 // pp_user[k] = i;
183 // k++;
184 // count2 = k;
185 // }
186 // else
187 // {
188 // //Is this line necessary?
189 // task[i] = task[i];
190 // }
191 // }
192 //
193 // for (i = 0; i < count; i++)
194 // {
195 // //"%3d" and "%d "(with a blank behind %d), which is better?
196 // printf("%3d", system_task[i]);
197 // }
198 // printf("\n");
199 //
200 // for (i = 0; i < count; i++)
201 // {
202 // min = system_task[0];
203 // for (j = 1; j < count; j++)
204 // {
205 // if (system_task[j] < min)
206 // {
207 // min = system_task[j];
208 // p[i] = j;
209 // }
210 // }
211 // system_task[p[i]] = 51;
212 // }
213 //
214 // pp[count] = -1;
215 // for (i = 0; i < count; i++)
216 // {
217 // printf("%3d", pp[p[i]]);
218 // }
219 // printf("%3d\n", pp[count]);
220 //
221 // //then deal with user_task
222 // for (i = 0; i < count2; i++)
223 // {
224 // printf("%4d", user_task[i]);
225 // }
226 // printf("\n");
227 //
228 // for (i = 0; i < count2; i++)
229 // {
230 // min = user_task[0];
231 // for (j = 1; j < count2; j++)
232 // {
233 // if (user_task[j] < min)
234 // {
235 // min = user_task[j];
236 // p_user[i] = j;
237 // }
238 // }
239 // user_task[p_user[i]] = 256;
240 // }
241 //
242 // pp_user[count2] = -1;
243 // for (i = 0; i < count2; i++)
244 // {
245 // printf("%4d", pp_user[p_user[i]]);
246 // }
247 // printf("%3d\n", pp_user[count2]);
248 //}
249 //
250 //int main()
251 //{
252 // int task[9] = {0, 30, 155, 1, 80, 300, 170, 40, 99};
253 // int system_task[9] = {0};
254 // int user_task[9] = {0};
255 // scheduler(task, 9, system_task, user_task);
256 // return 0;
257 //}