www.pudn.com > DiskAcess.rar > FrmDiskAcess.cs


using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Text; 
using System.Windows.Forms; 
 
namespace DiskAcess 
{ 
     
 
    public partial class FrmDiskAcess : Form 
    { 
        public FrmDiskAcess() 
        { 
            InitializeComponent(); 
        } 
 
        private void butFCFS_Click(object sender, EventArgs e) 
        { 
            string str1 = this.InputNumber.Text; //输入的磁道访问序列 
            str1 = str1.Trim(); 
            string[] number1 = str1.Split(new char[] { ' ',',','.' }); 
            int[] number2 = new int[number1.Length]; 
                        
             
            string str2 = this.cylinder.Text;    //柱面总数 
            int cylinder = Convert.ToInt32(str2);  
 
            int exe = 0; 
            if (str2 == "0") 
            { 
                MessageBox.Show("请输入柱面总数!"); 
                this.cylinder.Focus(); 
            } 
 
            else 
            { 
 
                //将string类型转化为int类型 
                for (int i = 0; i < number1.Length; i++) 
                { 
                    number2[i] = Convert.ToInt32(number1[i]); 
                } 
 
                //判断是否有大于柱面的磁道 
 
                for (int i = 0; i < number2.Length; i++) 
                { 
                    if (number2[i] > cylinder) 
                    { 
                        MessageBox.Show("访问序列中第" + (i + 1) + "个元素超出柱面范围!"); 
                        this.InputNumber.Focus(); 
                        exe = 1; 
                    } 
                } 
            } 
                //当前磁头位置 
            if (exe == 0) 
            { 
                int position = Convert.ToInt32(this.InputPosition.Text); 
 
                string output1 = "";      //调度过程 
                int SumTrack = 0;         //总磁道数 
 
                //先来先服务算法:根据访问的序列,从当前位置转到第一个访问位,依次进行,磁道总 
                //数为相应两磁道位置之差的总和 
                SumTrack = Math.Abs(position - number2[0]); 
                for (int i = 1; i < number2.Length; i++) 
                { 
                    int n = 0; 
                    n = Math.Abs(number2[i] - number2[i - 1]); 
                    SumTrack += n; 
                } 
 
                output1 += "磁盘调度前位置 " + position.ToString() + ";"; 
                output1 += " 磁盘调度过程如下:"; 
 
                //磁头移动位置转化成string类型 
                for (int i = 0; i < number2.Length; i++) 
                { 
                    output1 += "→"; 
                    output1 += number2[i].ToString(); 
                } 
                output1 += " 磁头移动的总磁道数:" + SumTrack; 
                this.Output.Text = output1; 
            } 
        } 
 
        private void butTime_Click(object sender, EventArgs e) 
        { 
            string str1 = this.InputNumber.Text;                  //输入的磁道访问序列 
            str1 = str1.Trim(); 
            string[] number1 = str1.Split(new char[] { ' ' });    //将字符串以空格为界分装到数组中 
            int[] number2 = new int[number1.Length]; 
            string str2 = this.cylinder.Text;    //柱面总数 
            int cylinder = Convert.ToInt32(str2); 
 
            int exe = 0; 
            if (str2 == "0") 
            { 
                MessageBox.Show("请输入柱面总数!"); 
                this.cylinder.Focus(); 
            } 
            else   
            { 
                //将string类型转化为int类型 
                for (int i = 0; i < number1.Length; i++) 
                { 
                    number2[i] = Convert.ToInt32(number1[i]); 
                } 
                //判断是否有大于柱面的磁道 
 
                for (int i = 0; i < number2.Length; i++) 
                { 
                   if (number2[i] > cylinder) 
                   { 
                       MessageBox.Show("访问序列中第" + (i + 1) + "个元素超出柱面范围!"); 
                       this.InputNumber.Focus(); 
                       exe = 1; 
                   } 
                } 
             } 
             if (exe == 0) 
             { 
 
                ListAcess[] array = new ListAcess[number2.Length];  //类数组 
 
                for (int i = 0; i < array.Length; i++) 
                { 
                array[i] = new ListAcess();     //分配内存 
                array[i].setDis(number2[i]); 
                array[i].setVisit(false); 
                } 
 
                int position = Convert.ToInt32(this.InputPosition.Text); //当前磁道 
                string output2 = ""; 
                output2 += "磁盘调度前位置:" + position.ToString() + "; 磁盘调度过程如下: "; 
 
 
                //最短寻道时间优先算法实现 
                int SumTrack = 0; 
                for (int i = 0; i < array.Length; i++) 
                { 
                int dis = int.MaxValue; 
                int pos = -1; 
                for (int j = 0; j < array.Length; j++) 
                { 
                    if (array[j].getVisit()) 
                        continue; 
                    int n = Math.Abs(position - array[j].getDis()); 
 
                    if (n < dis) 
                    { 
                        dis = n; 
                        pos = j; 
                    } 
                } 
                SumTrack += dis; 
                output2 += "→" + array[pos].getDis().ToString(); 
                array[pos].setVisit(true); 
                position = array[pos].getDis(); 
 
                } 
                output2 += " 磁头移动的总磁道数: " + SumTrack; 
                this.Output.Text = output2; 
                } 
 
          } 
        public class ListAcess 
        { 
            private int dis; 
            private bool visit; 
 
            public int getDis() 
            { 
                return dis; 
            } 
            public bool getVisit() 
            { 
                return visit; 
            } 
            public void setDis(int array) 
            { 
                this.dis = array; 
            } 
            public void setVisit(bool x) 
            { 
                this.visit = x; 
            } 
        }   
 
        private void butclear_Click(object sender, EventArgs e) 
        { 
            this.Output.Text = ""; 
            if (this.InputPosition.Text == "") 
            { 
                MessageBox.Show("请输入要访问的磁道!"); 
                this.InputPosition.Focus(); 
            } 
        } 
 
        private void butClose_Click(object sender, EventArgs e) 
        { 
            Close(); 
        } 
    } 
}