- 論壇徽章:
- 0
|
在上一貼中“2012華為杯 西南賽區(qū) 初試第三題”說了GDB不少壞話。在看了《GDB調(diào)試程序[陳皓]》后,決定再找些題目試試。
歡迎任何評(píng)論!
3.操作系統(tǒng)任務(wù)調(diào)度問題。操作系統(tǒng)任務(wù)分為系統(tǒng)任務(wù)和用戶任務(wù)兩種。其中,系統(tǒng)任務(wù)的優(yōu)先級(jí) < 50,用戶任務(wù)的優(yōu)先級(jí) >= 50且 <= 255。優(yōu)先級(jí)大于255的為非法任務(wù),應(yīng)予以剔除,F(xiàn)有一任務(wù)隊(duì)列task[],長(zhǎng)度為n,task中的元素值表示任務(wù)的優(yōu)先級(jí),數(shù)值越小,優(yōu)先級(jí)越高。函數(shù)scheduler實(shí)現(xiàn)如下功能,將task[] 中的任務(wù)按照系統(tǒng)任務(wù)、用戶任務(wù)依次存放到 system_task[] 數(shù)組和 user_task[] 數(shù)組中(數(shù)組中元素的值是任務(wù)在task[] 數(shù)組中的下標(biāo)),并且優(yōu)先級(jí)高的任務(wù)排在前面,數(shù)組元素為-1表示結(jié)束。
例如:task[] = {0, 30, 155, 1, 80, 300, 170, 40, 99}
system_task[] = {0, 3, 1, 7, -1}
user_task[] = {4, 8, 2, 6, -1}
函數(shù)接口
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處理函數(shù)
- */
- 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數(shù)組中的數(shù)據(jù)順序沒有變化。
- * */
- //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;
- }
復(fù)制代碼 總結(jié):
看到一個(gè)師弟對(duì)這個(gè)三道題目的評(píng)價(jià)“其實(shí)就是邏輯思維,根本不涉及庫函數(shù)算法神馬的。。!
嗯,對(duì)于我來說,著重練習(xí)的是邏輯思維,GDB調(diào)試。
編這三個(gè)練習(xí)的時(shí)候我感覺到比華為杯2012西南賽區(qū)初賽題目要順手一些。特別是對(duì)于調(diào)試也“身”有體會(huì)了。看了《GDB調(diào)試程序[陳皓]》后,感覺原來GDB還不錯(cuò)。同時(shí),也喜歡上了在程序中加上條件編譯,這樣調(diào)試程序就更方便了。目前我的調(diào)試前后的時(shí)間各占了一半,我還會(huì)做得更好的。
喜歡GDB的打印數(shù)組 p *task_ptr[0]@9 。開始對(duì)這個(gè)的理解錯(cuò)誤,運(yùn)行結(jié)果讓我匪夷所思。原來
p task_ptr[0]@9 才是打印排了序的指針。但顯示的是指針,不容易閱讀。此時(shí),我想起了條件編譯,感覺不錯(cuò)。
在第三個(gè)練習(xí)中,用了指針數(shù)組,用得還不太熟悉。(暫且忽略解決方法的好壞~)盡管看書的時(shí)候,指針的應(yīng)用都能理解,但和自己動(dòng)手相比差別還是大。 |
|