2008年北大作業系統實踐

yyy111發表於2008-11-07

一、從一個文字檔案讀入首空閑塊和空閑塊數,格式如下(要求最多32行)

21 20

41 10

53 5

……

其中一行要求有兩個數

二、從讀入的數中判斷有沒有上下鄰塊,如果有要進行合併(回收)。

三、輸出回收過的空閑塊。(我的理解是不應該有相鄰的塊存在,因為已經經過合併了)

程式比較簡單,我的做法可能有的地方欠妥,歡迎大家指正,謝謝

(日文系統.net 2003中除錯通過:)

  1. #include "stdafx.h" 
  2. typedef struct FreeBlock
  3. {
  4.     int firstBlock; //首空閑塊塊號 
  5.     int count;      //空閑塊數 
  6. }FreeBlock;
  7. /**************空閑塊讀入****************/
  8. int inputFromFile(FreeBlock *tables)
  9. {
  10.     int i = 0,j;
  11.     char strTem[20],strNum[20],strFile[256],*p,*q;
  12.     printf("請輸入檔名:");
  13.     scanf("%s",strFile);
  14.     FILE *file = fopen(strFile,"r");
  15.     if(file==NULL)
  16.     {
  17.         printf("輸入的檔案%s不存在/n",strFile);
  18.         return -1;
  19.     }
  20.     while(!feof(file)&&i<32)//空閑塊數最大32個  
  21.     {
  22.         p = strTem;
  23.         
  24.         fgets(p,20,file);//一次讀入整行資料 
  25.         for(j=0;j<1 && (q = strchr(p,' '));j++) //檔案分割符為空格 
  26.         {           
  27.             memset(strNum,0,sizeof(strNum)*sizeof(char));
  28.             strncpy(strNum,p,q-p);
  29.             (&tables[i])->firstBlock = atoi(strNum); //一行僅存首空閑塊和空閑塊數 
  30.             p=q+1;
  31.         }
  32.         (&tables[i])->count = atoi(p);
  33.         i++;
  34.     }
  35.     fclose(file);
  36.     return 0;
  37. }
  38. /**************空閑塊回收****************/
  39. int reclaimBlock(FreeBlock *tables)
  40. {
  41.     int i,j;
  42.     for(i=1;i<32;i++)
  43.     {
  44.         for(j=0;j<=i;j++)
  45.         {
  46.             //上鄰空閑塊 
  47.             if((&tables[i])->firstBlock + (&tables[i])->count == (&tables[j])->firstBlock)
  48.             {
  49.                 //覆蓋上鄰 
  50.                 (&tables[i])->count += (&tables[j])->count;
  51.                 (&tables[j])->firstBlock = 0;
  52.                 (&tables[j])->count = 0;
  53.             }
  54.             //下鄰空閑塊 
  55.             if((&tables[i])->firstBlock == (&tables[j])->firstBlock + (&tables[j])->count)
  56.             {
  57.                 (&tables[j])->count += (&tables[i])->count;
  58.                 //覆蓋下鄰 
  59.                 (&tables[i])->firstBlock = 0;
  60.                 (&tables[i])->count = 0;
  61.             }
  62.         }       
  63.     }
  64.     return 0;
  65. }
  66. /**************初始化****************/
  67. void init(FreeBlock *tables)
  68. {
  69.     int i=0;
  70.     while(i<32)
  71.     {
  72.         (&tables[i])->firstBlock = 0;
  73.         (&tables[i])->count = 0;
  74.         i++;
  75.     }
  76. }
  77. /**************空閑塊顯示****************/
  78. void displayBlock(FreeBlock *tables)
  79. {
  80.     int i,j=0;
  81.     printf("空閑塊首塊號   空閑塊個數/n");
  82.     for(i=0;i<32;i++)
  83.     {
  84.         if((&tables[i])->firstBlock!=0)
  85.             printf("%8d%8d/n",(&tables[i])->firstBlock,(&tables[i])->count);
  86.         else
  87.             j++;
  88.     }
  89.     for(i=0;i<j;i++)
  90.         printf("%8d%8d/n",0,0);
  91. }
  92. int _tmain(int argc, _TCHAR* argv[])
  93. {
  94.     int i=0;
  95.     FreeBlock freeTables[32]; //空閑塊 
  96.     init(freeTables);//初始化 
  97.     //讀入檔案 
  98.     i = inputFromFile(freeTables);
  99.     if(i==-1)//輸入錯誤 
  100.     {
  101.         system("pause");
  102.         return -1;
  103.     }
  104.         
  105.     //回收空閑塊 
  106.     reclaimBlock(freeTables);
  107.     //顯示空閑塊 
  108.     displayBlock(freeTables);
  109.     system("pause");
  110.     return 0;
  111. }

 

相關文章