C語言寫的磁碟排程演算法,歡迎大家來討論

ZHUO_SIR發表於2018-05-22
  1. #include<iostream>  
  2. #include<cstdio>  
  3. #include<algorithm>  
  4. #include<cmath>  
  5. using namespace std;  
  6. const int maxn = 100;  
  7. int n, now, s, sum, nnow, everage, p[maxn], b[maxn], sp[maxn], lenp[maxn];  
  8. //顯示結果  
  9. void show()  
  10. {  
  11.     sum = 0;  
  12.     cout <<"        被訪問的下一磁軌號     移動距離(磁軌數)\n";  
  13.     for(int i = 0;i < n; ++i)  
  14.     {  
  15.         printf("                 %3d                  %3d\n", sp[i], lenp[i]);  
  16.         sum += lenp[i];  
  17.     }  
  18.     cout <<"        平均尋道長度: "<<(double)sum/n <<"\n";  
  19. }  
  20. //先來先服務  
  21. void FCFS()  
  22. {  
  23.     for(int i = 0;i < n; ++i)  
  24.     {  
  25.         sp[i] = p[i];  
  26.         if(i)   lenp[i] = abs(sp[i-1] - sp[i]);  
  27.         else    lenp[i] = abs(now  - sp[i]);  
  28.     }  
  29. }  
  30. //最短尋道優先  
  31. void SSTF()  
  32. {  
  33.     nnow = now;  
  34.     int fl[maxn] = {0};  
  35.     for(int i = 0;i < n; ++i)  
  36.     {  
  37.         int minx = 999999, pp;  
  38.         for(int j = 0;j < n; ++j)  
  39.         {  
  40.             if(!fl[j] && abs(nnow - p[j]) < minx)  
  41.             {  
  42.                 minx = abs(nnow - p[j]);  
  43.                 pp = j;  
  44.             }  
  45.         }  
  46.         sp[i] = p[pp];  
  47.         lenp[i] = minx;  
  48.         nnow = p[pp];  
  49.         fl[pp] = 1;  
  50.     }  
  51. }  
  52. //掃描演算法  
  53. bool cmp(int a, int b)  
  54. {  
  55.     return a > b;  
  56. }  
  57. void SCAN()  
  58. {  
  59.     nnow = now;  
  60.     int aa[maxn], bb[maxn], ak = 0, bk = 0;  
  61.     for(int i = 0;i < n; ++i)  
  62.     {  
  63.         if(p[i] < nnow) aa[ak++] = p[i];  
  64.         else bb[bk++] = p[i];  
  65.     }  
  66.     sort(aa, aa+ak,cmp);  
  67.     sort(bb, bb+bk);  
  68.     int i = 0;  
  69.     for(int j = 0;j < bk; ++j)  
  70.     {  
  71.         sp[i] = bb[j];  
  72.         lenp[i++] =  bb[j] - nnow;  
  73.         nnow = bb[j];  
  74.     }  
  75.     for(int j = 0;j < ak; ++j)  
  76.     {  
  77.         sp[i] = aa[j];  
  78.         lenp[i++] = nnow - aa[j];  
  79.         nnow = aa[j];  
  80.     }  
  81. }  
  82. //迴圈掃描演算法  
  83. void CSCAN()  
  84. {  
  85.     nnow = now;  
  86.     int aa[maxn], bb[maxn], ak = 0, bk = 0;  
  87.     for(int i = 0;i < n; ++i)  
  88.     {  
  89.         if(p[i] < nnow) aa[ak++] = p[i];  
  90.         else bb[bk++] = p[i];  
  91.     }  
  92.     sort(aa, aa+ak);  
  93.     sort(bb, bb+bk);  
  94.     int i = 0;  
  95.     for(int j = 0;j < bk; ++j)  
  96.     {  
  97.         sp[i] = bb[j];  
  98.         lenp[i++] =  bb[j] - nnow;  
  99.         nnow = bb[j];  
  100.     }  
  101.     for(int j = 0;j < ak; ++j)  
  102.     {  
  103.         sp[i] = aa[j];  
  104.         lenp[i++] = abs(aa[j] - nnow);  
  105.         nnow = aa[j];  
  106.     }  
  107. }  
  108. int main()  
  109. {  
  110.     xbegin:  
  111.         cout<<"請輸入被訪問的總磁軌數:  ";  
  112.         cin >> n;  
  113.         if(n <= 0 ||  n > 100)  
  114.         {  
  115.             cout <<"輸入不合法,請重新輸入!\n";  
  116.             goto xbegin;  
  117.         }  
  118.     nowCD:  
  119.         cout <<"請輸入當前磁軌: ";  
  120.         cin >> now;  
  121.         if(now < 0)  
  122.         {  
  123.             cout <<"磁軌不存在,請重新輸入!";  
  124.             goto nowCD;  
  125.         }  
  126.     pCD:  
  127.         cout <<"請按順序輸入所有需要訪問的磁軌:";  
  128.         for(int i = 0;i < n; ++i) cin >> p[i];  
  129.         for(int i = 0;i < n; ++i)  
  130.         {  
  131.             b[i] = p[i];  
  132.             if(p[i] < 0)  
  133.             {  
  134.                 cout <<"輸入中有不存在的磁軌,請重新輸入!\n";  
  135.                 goto pCD;  
  136.             }  
  137.         }  
  138.     serve:  
  139.         cout <<"  1、先來先服務演算法(FCFS)\n";  
  140.         cout <<"  2、最短尋道優先演算法(SSTF)\n";  
  141.         cout <<"  3、掃描演算法(SCAN)\n";  
  142.         cout <<"  4、迴圈掃描演算法(CSCAN)\n";  
  143.         cout <<"請輸入所用磁碟排程的演算法: ";  
  144.         cin >> s;  
  145.         if(s < 1 || s > 4)  
  146.         {  
  147.             cout <<"輸入有誤,請重新輸入!\n";  
  148.             goto serve;  
  149.         }  
  150.     work:  
  151.         for(int i = 0;i < n; ++i) p[i] = b[i];  
  152.         if(s == 1) FCFS();  
  153.         else if(s == 2) SSTF();  
  154.         else if(s == 3) SCAN();  
  155.         else CSCAN();  
  156.         show();  
  157.     xend:  
  158.         char ch;  
  159.         cout <<"重新選擇演算法或重新輸入資料?(輸入Y選擇演算法,輸入y重新輸入資料): ";  
  160.         cin >> ch;  
  161.         if(ch == 'Y'goto serve;  
  162.         else if(ch == 'y'goto xbegin;  
  163.         else cout <<"程式結束,謝謝使用!\n";  
  164.     return 0;  
  165. }  

相關文章