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 */
#include<stdio.h>
#include<stdlib.h>
void scheduler(int task[],int n,int system_task[],int user_task[]){
if(NULL==task||n<1||NULL==system_task||NULL==user_task){
printf("The args of function are not correct!\n");
return ;
}
int i,j,k;
for(k=0;k<n;k++){ //借助system_task,保持task数组元素从小到大的下标。
system_task[k]=k;
}
for(k=0;k<n;k++){ //借助user_task排序,保持task的数据不变
user_task[k]=task[k];
}
for(i=0;i<n-1;i++){
for(j=0;j<n-i-1;j++){
if(user_task[j]>user_task[j+1]){
//对user_task进行冒泡排序
user_task[j]=user_task[j]^user_task[j+1];
user_task[j+1]=user_task[j]^user_task[j+1];
user_task[j]=user_task[j]^user_task[j+1];
//保存冒泡排序前的下标
system_task[j]=system_task[j]^system_task[j+1];
system_task[j+1]=system_task[j]^system_task[j+1];
system_task[j]=system_task[j]^system_task[j+1];
}
}
}
for(i=0,j=0;i<n;i++){
if(task[system_task[i]>=0]&&task[system_task[i]]<50){
//什么事也不做
}else if(task[system_task[i]>=50]&&task[system_task[i]]<=255){
user_task[j]=system_task[i];
j++;
system_task[i]=-1; //这时候system_task里面不在需要保存大于50的下标了。置为-1;
}else{
printf("Task %d is error task\n",task[system_task[i]]);
user_task[j++]=-1;
}
}
user_task[j]=-1; //j以后的都是不在需要的数据了。j下标的元素置为-1
}
int main(){
int task[10]={89,15,12,58,46,89,57,46,112,59};
int system_task[10];
int user_task[10];
int i;
scheduler(task,10,system_task,user_task);
//打印task数组任务
for(i=0;i<10;i++){
printf("%d ",task[i]);
}
printf("\n");
//打印系统任务
for(i=0;i<10;i++){
if(system_task[i]!=-1){
printf("%d ",system_task[i]);
}else{
break;
}
}
printf("\n");
//打印用户任务
for(i=0;i<10;i++){
if(user_task[i]!=-1){
printf("%d ",user_task[i]);
}else{
break;
}
}
printf("\n");
return 0;
}