- 论坛徽章:
- 0
|
在上一贴中“2012华为杯 西南赛区 初试第三题”说了GDB不少坏话。在看了《GDB调试程序[陈皓]》后,决定再找些题目试试。
欢迎任何评论!
3.操作系统任务调度问题。操作系统任务分为系统任务和用户任务两种。其中,系统任务的优先级 < 50,用户任务的优先级 >= 50且 <= 255。优先级大于255的为非法任务,应予以剔除。现有一任务队列task[],长度为n,task中的元素值表示任务的优先级,数值越小,优先级越高。函数scheduler实现如下功能,将task[] 中的任务按照系统任务、用户任务依次存放到 system_task[] 数组和 user_task[] 数组中(数组中元素的值是任务在task[] 数组中的下标),并且优先级高的任务排在前面,数组元素为-1表示结束。
例如:task[] = {0, 30, 155, 1, 80, 300, 170, 40, 99}
system_task[] = {0, 3, 1, 7, -1}
user_task[] = {4, 8, 2, 6, -1}
函数接口
void scheduler(int task[], int n, int system_task[], int user_task[])- #include <stdio.h>
- #include <stdlib.h>
- #define DEBUG 0
- void scheduler(int task[], int n, int system_task[], int user_task[]);
- int
- main(int argc, char *argv[])
- {
- int n, i, j;
- int task[] = {0, 30, 155, 1, 80, 300, 170, 40, 99};
- n = sizeof(task) / sizeof(int);
- int system_task[n];
- int user_task[n];
- scheduler(task, n, system_task, user_task);
- printf("\ntask[] is :\n");
- for(i = 0; i < n; i++){
- printf("%d ", task[i]);
- }
-
- printf("\n\nsystem_task[] is :\n");
- for(i = 0; i < n && system_task[i] != -1; i++){
- printf("%d ", system_task[i]);
- }
- printf("%d",system_task[i]);
-
- printf("\n\nuser_task[] is :\n");
- for(i = 0; i < n && user_task[i] != -1; i++){
- printf("%d ", user_task[i]);
- }
- printf("%d", user_task[i]);
- printf("\n");
- }
- /*
- *scheduler处理函数
- */
- void
- scheduler(int task[], int n, int system_task[],int user_task[])
- {
- int i, j, min_val;
- int min_in_task_ptr;
- int *fill_ptr;
- int *task_ptr[n];
- int **tmp_ptr_ptr;
- for(i = 0; i < n; i++){
- task_ptr[i] = &task[i];
- }
- /*将task_ptr[]从小到大的排列*/
- for(i = 0; i < n; i++){
- min_val = *task_ptr[i];
- min_in_task_ptr = i;
- fill_ptr = task_ptr[i];
- /*寻找task_ptr后面的最小值和它的指针*/
- for(j = i; j < n; j++){
- if(*task_ptr[j] < min_val){
- min_val = *task_ptr[j];
- min_in_task_ptr = j;
- }
- }
- #if DEBUG
- printf("min_val:%d min_ptr:%d ", min_val, *task_ptr[min_in_task_ptr]);
- printf("min_ptr-task:%d\n", min_in_task_ptr);
- #endif
- /*交换指针*/
- task_ptr[i] = task_ptr[min_in_task_ptr];
- /*min_ptr-task怎么和我期望的有差距呢?
- * 哦,task数组中的数据顺序没有变化。
- * */
- //task_ptr[i] = task_ptr[min_ptr - task];
- task_ptr[min_in_task_ptr] = fill_ptr;
- #if DEBUG
- printf("%d\ttask_ptr[] is :", i);
- for(j = 0; j < n; j++){
- printf("%d ", *task_ptr[j]);
- }
- printf("\n");
- #endif
- }
- int count_sys = 0;
- int count_user = 0;
- for(i = 0; i < n; i++){
- if(*task_ptr[i] < 50){
- system_task[count_sys] = task_ptr[i] - task;
- count_sys++;
- } else if(*task_ptr[i] > 255){
- printf("%d", *task_ptr[i]);
- } else {
- user_task[count_user] = task_ptr[i] - task;
- count_user++;
- }
- }
- system_task[count_sys] = -1;
- user_task[count_user] = -1;
- }
复制代码 总结:
看到一个师弟对这个三道题目的评价“其实就是逻辑思维,根本不涉及库函数算法神马的。。。”
嗯,对于我来说,着重练习的是逻辑思维,GDB调试。
编这三个练习的时候我感觉到比华为杯2012西南赛区初赛题目要顺手一些。特别是对于调试也“身”有体会了。看了《GDB调试程序[陈皓]》后,感觉原来GDB还不错。同时,也喜欢上了在程序中加上条件编译,这样调试程序就更方便了。目前我的调试前后的时间各占了一半,我还会做得更好的。
喜欢GDB的打印数组 p *task_ptr[0]@9 。开始对这个的理解错误,运行结果让我匪夷所思。原来
p task_ptr[0]@9 才是打印排了序的指针。但显示的是指针,不容易阅读。此时,我想起了条件编译,感觉不错。
在第三个练习中,用了指针数组,用得还不太熟悉。(暂且忽略解决方法的好坏~)尽管看书的时候,指针的应用都能理解,但和自己动手相比差别还是大。 |
|