Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1317554
  • 博文数量: 168
  • 博客积分: 2124
  • 博客等级: 大尉
  • 技术积分: 2590
  • 用 户 组: 普通用户
  • 注册时间: 2011-09-16 23:51
文章分类

全部博文(168)

文章存档

2014年(6)

2013年(74)

2012年(71)

2011年(17)

分类: C/C++

2013-08-16 15:50:06

其实这是很久之前写的一个程序,现在已经面试笔试完了,发现还有一个没发的,发过来


点击(此处)折叠或打开

  1. /********************************************************
  2. 3.操作系统任务调度问题。
  3. 操作系统任务分为系统任务和用户任务两种。
  4. 其中,系统任务的优先级 < 50,用户任务的优先级 >= 50且 <= 255。
  5. 优先级大于255的为非法任务,应予以剔除。现有一任务队列task[],长度为n,task中的元素值表示任务的优先级,数值越小,优先级越高。
  6. 函数scheduler实现如下功能,将task[] 中的任务按照系统任务、用户任务依次存放到 system_task[] 数组和 user_task[] 数组中
  7. (数组中元素的值是任务在task[] 数组中的下标),并且优先级高的任务排在前面,数组元素为-1表示结束。
  8. 例如:task[] = {0, 30, 155, 1, 80, 300, 170, 40, 99}
  9. system_task[] = {0, 3, 1, 7, -1} user_task[] = {4, 8, 2, 6, -1}

  10. 函数接口 void scheduler(int task[], int n, int system_task[], int user_task[])
  11. ************************************************************/

  12. /*
  13. void scheduler(int task[], int n, int system_task[], int user_task[])
  14. */

  15. #include<stdio.h>
  16. /*************************************************
  17. 编程思路:
  18.  一.将task数组内容复制过来(一般都这么用),对数组B进行排序,并将下标储存在相同数组大小的一个数组tmp中
  19.  二.按找优先级的顺序进行归类,并通过相同下标在数组tmp中找到原先的task的下标值
  20.         具体的方法是用数组B和原先的数组task比较,有元素相同,那么下标放在数组tmp中
  21.  三.赋值,并长度自加
  22.  四.最后一位赋予-1
  23. **************************************************/
  24. void scheduler(int task[], int n, int system_task[], int user_task[]);
  25. void swap(int *, int *);


  26. void swap(int *p1, int *p2)
  27. {
  28.     int tmp;
  29.     tmp = *p1;
  30.     *p1 = *p2;
  31.     *p2 = tmp;
  32. }

  33. void scheduler(int task[], int n, int system_task[], int user_task[])
  34. {
  35.     int task_len, system_len, user_len, i, j, min;
  36.     

  37.     int *task_b = (int *)malloc(sizeof(int) * n);
  38.     int *tmp = (int *)malloc(sizeof(int) * n);


  39.     memcpy(task_b, task, sizeof(int)*n);
  40.     
  41.     system_len = user_len = 0;

  42.     
  43.     for(i = 0; i < n - 1; i++)
  44.     {
  45.         min = i;
  46.         
  47.         for(j = i + 1; j < n; j++)
  48.             if(task_b[j] < task_b[min])
  49.                 min = j;
  50.         if(min != i)
  51.             swap(&task_b[i], &task_b[min]);
  52.     }
  53.     
  54.     for(i = 0; i < n; i++)
  55.     {
  56.         for(j = 0; j < n; j++)
  57.             if(task_b[i] == task[j])
  58.             {
  59.                 tmp[i] = j;
  60.                 continue;
  61.             }
  62.     }

  63.     for(i = 0; i < n; i++)
  64.     {
  65.         if(task_b[i] < 55)
  66.         {    
  67.             system_task[system_len] = tmp[i];
  68.             system_len++;
  69.         }
  70.         if(task_b[i] >= 55 && task_b[i] <=255)
  71.         {
  72.             user_task[user_len] = tmp[i];
  73.             user_len++;
  74.         }
  75.     }

  76.     system_task[system_len] = -1;
  77.     user_task[user_len] = -1;
  78.     
  79.     free(task_b);
  80.     free(tmp);
  81. }

  82. int main(int argc, char **argv)
  83. {
  84.     int i;
  85.     int system_task[10] = {0};
  86.     int user_task[10] = {0};
  87.     
  88.     int task[] = {0, 30, 155, 1, 80, 300, 170, 40, 99};
  89.     
  90.     scheduler(task, 9, system_task, user_task);
  91.     
  92.     for(i = 0; i < 10; i++)
  93.     {
  94.         printf("system_task[%d] = %d\n", i,system_task[i]);
  95.     }
  96.     
  97.     for(i = 0; i < 10; i++)
  98.     {
  99.         printf("user_task[%d] = %d\n", i, user_task[i]);
  100.     }
  101.     
  102.     while(1);
  103. }

阅读(1259) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~