您的位置:首页 > 编程语言

华为2014校园招聘软件编程题:操作系统任务调度问题

2013-09-13 22:49 302 查看
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: