zoukankan      html  css  js  c++  java
  • 华为软件编程题:操作系统任务调度问题

      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!
    "); 
     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!
    ", 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!
    "); 
     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("
    "); 
    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("
    "); 
    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("
    "); 
    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
    ", 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("
    "); 
    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
    ", 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 //}
  • 相关阅读:
    POJ 1300 Open Door
    POJ 2230 Watchcow
    codevs 1028 花店橱窗布置
    codevs 1021 玛丽卡
    codevs 1519 过路费
    codevs 3287 货车运输
    codevs 3305 水果姐逛水果街二
    codevs 1036 商务旅行
    codevs 4605 LCA
    POJ 1330 Nearest Common Ancestors
  • 原文地址:https://www.cnblogs.com/andrewlee0708/p/scheduler.html
Copyright © 2011-2022 走看看