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 //}