using System;
using System.Collections.Generic;
using System.Text;
namespace OS_1
{
class PCB
{
public PCB() //构造函数,初始化为0
{
time = 0;
priority = 0;
}
public void setTime(int time) //设置time
{
this.time = time;
}
public int getTime() //获得time
{
return time;
}
public void setPriority(int priority) //设置priority
{
this.priority = priority;
}
public int getPriority() //获得priority
{
return priority;
}
public void setId(int Id) //设置Id
{
this.Id = Id;
}
public int getId() //获得Id
{
return Id;
}
int time, priority, Id; //time表示运行时间,priority表示优先级
}
class chose
{
public void order(int[] num) //冒泡算法
{
int x = 0, y = 0, z = 0;
for (x = 0; x
for (y = 0; y
if (num[y]
{
z = num[y];
num[y] = num[y + 1];
num[y + 1] = z;
}
}
public void choseJC() //选择执行的进程
{
PCB[] myPCB = new PCB[5];
for (int i = 0; i
{
myPCB[i] = new PCB();
myPCB[i].setId(i);
}
for (int i = 0; i
{
try //输入非数字时捕获异常
{
Console.Write("请设置{0}号进程的运行时间:", i + 1);
int time = Int32.Parse(Console.ReadLine());
if (time
{
Console.WriteLine("\n请输入合理数值\n");
i--;
continue;
}
myPCB[i].setTime(time);
Console.WriteLine();
Console.Write("请设置{0}号进程的优先级:", i + 1);
int priority = Int32.Parse(Console.ReadLine());
if (priority
{
Console.WriteLine("\n请输入合理数值\n");
i--;
continue;
}
myPCB[i].setPriority(priority);
Console.WriteLine();
}
catch (Exception e)
{
//Console.WriteLine(e.Message);
Console.WriteLine("\n请输入合法数值!\n");
i--;
continue;
}
}
int[] orderPriority = new int[5]; //顺序存放优先级的数组 for (int i = 0; i
{
orderPriority[i] = myPCB[i].getPriority();
}
order(orderPriority); //排序
Console.WriteLine("\n\n\n");
Dictionary orderPriorityId =
new Dictionary(); //以“字典”形式存放优先级和Id
for (int i = 0; i
{
orderPriorityId.Add(myPCB[i].getPriority(), myPCB[i].getId());
}
Queue orderPCB = new Queue(); //以Id形式顺序存放进程的队列
for (int i = 0; i
{
int Id = orderPriorityId[orderPriority[i]] //通过优先级查“字典”得到Id
orderPCB.Enqueue(Id);
}
Console.Write("初始队列为: { ");
for (int i = 0; i
{
int j = (int)orderPCB.Dequeue();
Console.Write("{0}号 ", j + 1);
orderPCB.Enqueue(j);
}
Console.WriteLine("}\n");
Console.WriteLine("按进程优先级得到的进程执行顺序为:\n");
while (true)
{
try
{
int i = (int)orderPCB.Dequeue();
int time = myPCB[i].getTime() - 1;
Console.WriteLine("运行{0}号进程,剩余运行时间{1}\n", i + 1, time);
myPCB[i].setPriority(time);
myPCB[i].setTime(myPCB[i].getTime() - 1);
if (time != 0)
{
orderPCB.Enqueue(i);
}
Console.Write("目前队列中状态为: { "
for (i = 0; i
{
int j = (int)orderPCB.Dequeue();
Console.Write("{0}号 ", j + 1);
orderPCB.Enqueue(j);
}
Console.WriteLine("}\n");
}
catch (Exception e)
{
break;
}
}
}
}
class Program
{
static void Main(string[] args)
{
chose mychose = new chose();
mychose.choseJC();
}
}
);
}
思路:使用一个类存放进程的运行时间和优先级及进程Id。并定义长度为5的类数组。由另一个进行进程的选择,由用户设定5个进程的运行时间和优先级,当输入不合理数据时提示用户重新输入。完成后将5个进程的优先级存入一个数组中,使用冒泡法从大到小进程排序。使用“字典”这个数据结构将优先级设为key,进程Id设为value。从而根据优先级查字典得到对应的进程Id。然后用队列存储进程Id并依次出队,出队进程优先级减1,运行时间减1。如果运行时间不为0则插入到队尾。直至运行为0。当全部进程时间均为0时,程序结束。
数据结构及算法:使用两个类,一个类存放进程信息,一个处理进程得到应执行的进程。使用用一个数组存放进程优先级,并采用冒泡法从大到小进程排序。使用字“字典”存放优先级和进程Id。使用队列存放进程,并以出队方式表示进程执行
using System;
using System.Collections.Generic;
using System.Text;
namespace OS_1
{
class PCB
{
public PCB() //构造函数,初始化为0
{
time = 0;
priority = 0;
}
public void setTime(int time) //设置time
{
this.time = time;
}
public int getTime() //获得time
{
return time;
}
public void setPriority(int priority) //设置priority
{
this.priority = priority;
}
public int getPriority() //获得priority
{
return priority;
}
public void setId(int Id) //设置Id
{
this.Id = Id;
}
public int getId() //获得Id
{
return Id;
}
int time, priority, Id; //time表示运行时间,priority表示优先级
}
class chose
{
public void order(int[] num) //冒泡算法
{
int x = 0, y = 0, z = 0;
for (x = 0; x
for (y = 0; y
if (num[y]
{
z = num[y];
num[y] = num[y + 1];
num[y + 1] = z;
}
}
public void choseJC() //选择执行的进程
{
PCB[] myPCB = new PCB[5];
for (int i = 0; i
{
myPCB[i] = new PCB();
myPCB[i].setId(i);
}
for (int i = 0; i
{
try //输入非数字时捕获异常
{
Console.Write("请设置{0}号进程的运行时间:", i + 1);
int time = Int32.Parse(Console.ReadLine());
if (time
{
Console.WriteLine("\n请输入合理数值\n");
i--;
continue;
}
myPCB[i].setTime(time);
Console.WriteLine();
Console.Write("请设置{0}号进程的优先级:", i + 1);
int priority = Int32.Parse(Console.ReadLine());
if (priority
{
Console.WriteLine("\n请输入合理数值\n");
i--;
continue;
}
myPCB[i].setPriority(priority);
Console.WriteLine();
}
catch (Exception e)
{
//Console.WriteLine(e.Message);
Console.WriteLine("\n请输入合法数值!\n");
i--;
continue;
}
}
int[] orderPriority = new int[5]; //顺序存放优先级的数组 for (int i = 0; i
{
orderPriority[i] = myPCB[i].getPriority();
}
order(orderPriority); //排序
Console.WriteLine("\n\n\n");
Dictionary orderPriorityId =
new Dictionary(); //以“字典”形式存放优先级和Id
for (int i = 0; i
{
orderPriorityId.Add(myPCB[i].getPriority(), myPCB[i].getId());
}
Queue orderPCB = new Queue(); //以Id形式顺序存放进程的队列
for (int i = 0; i
{
int Id = orderPriorityId[orderPriority[i]] //通过优先级查“字典”得到Id
orderPCB.Enqueue(Id);
}
Console.Write("初始队列为: { ");
for (int i = 0; i
{
int j = (int)orderPCB.Dequeue();
Console.Write("{0}号 ", j + 1);
orderPCB.Enqueue(j);
}
Console.WriteLine("}\n");
Console.WriteLine("按进程优先级得到的进程执行顺序为:\n");
while (true)
{
try
{
int i = (int)orderPCB.Dequeue();
int time = myPCB[i].getTime() - 1;
Console.WriteLine("运行{0}号进程,剩余运行时间{1}\n", i + 1, time);
myPCB[i].setPriority(time);
myPCB[i].setTime(myPCB[i].getTime() - 1);
if (time != 0)
{
orderPCB.Enqueue(i);
}
Console.Write("目前队列中状态为: { "
for (i = 0; i
{
int j = (int)orderPCB.Dequeue();
Console.Write("{0}号 ", j + 1);
orderPCB.Enqueue(j);
}
Console.WriteLine("}\n");
}
catch (Exception e)
{
break;
}
}
}
}
class Program
{
static void Main(string[] args)
{
chose mychose = new chose();
mychose.choseJC();
}
}
);
}
思路:使用一个类存放进程的运行时间和优先级及进程Id。并定义长度为5的类数组。由另一个进行进程的选择,由用户设定5个进程的运行时间和优先级,当输入不合理数据时提示用户重新输入。完成后将5个进程的优先级存入一个数组中,使用冒泡法从大到小进程排序。使用“字典”这个数据结构将优先级设为key,进程Id设为value。从而根据优先级查字典得到对应的进程Id。然后用队列存储进程Id并依次出队,出队进程优先级减1,运行时间减1。如果运行时间不为0则插入到队尾。直至运行为0。当全部进程时间均为0时,程序结束。
数据结构及算法:使用两个类,一个类存放进程信息,一个处理进程得到应执行的进程。使用用一个数组存放进程优先级,并采用冒泡法从大到小进程排序。使用字“字典”存放优先级和进程Id。使用队列存放进程,并以出队方式表示进程执行