资源下载地址:https://download.csdn.net/download/sheziqiong/86167141
资源下载地址:https://download.csdn.net/download/sheziqiong/86167141
一、需求分析
明确陈述说明程序设计的任务,强调的是程序要做什么,主要包括:
-
输入的形式和输入值的范围;
输入形式是键盘输入和鼠标输入,键盘输入值的范围是[0,10]的整数,鼠标输入的选择有确认、四种调度算法(时间片轮转调度、优先数调度、最短进程优先调度和最短剩余时间调度优先调度)、开始模拟、清空和退出。
-
输出的形式;
输出的形式为java图形界面显示。根据输入模拟进程调度,输出由动态面板显示出来。
-
程序所能达到的功能;
-
创建进程,模拟四种调度算法,通过图形界面动态显示过程与结果。
-
清空前一次的模拟结果。
-
-
测试数据:包括正确的输入及其输出结果和含有错误的输入及其输出结果。
正确的输入:1、进程数n:0<=n<=10,确认。2、选择四种调度算法。3、开始模拟。
正确的输出结果:能按所选的调度算法正确地执行,并且将结果显示在图形界面窗口。
错误的输入:1、进程数n:n<0||n>10。2、缺少点击确认、四种调度算法、开始模拟等按钮。
错误的输出结果:1、进程数n非法输入时会弹出窗口提示。2、程序无法执行。
二、概要设计
说明本程序中用到的所有抽象数据类型的定义、主程序的流程以及各程序模块之间的层次(调用)关系。
所有抽象数据类型的定义:
Class Main //程序入口,给界面的位置、大小和名称赋值。
Class UI extends JFrame //构建图形界面。
Class Label implements Runnable //刷新界面的数据,形成动态界面。
Class Pcb //定义进程块。
Class comparePri implements Comparator<Pcb> //比较优先级的大小,进行排序。
Class compareTime implements Comparator<Pcb> //比较剩余时间的大小,进行排序。
Class SchedulingMethod //创建进程以及四种调度算法的实现。
主程序的流程:
构建图形界面->各线程启动,形成动态界面->键盘输入进程数->鼠标选择调度方法->开始模拟,数据刷新->清空->重复/退出
各程序模块之间的层次(调用)关系:
三、详细设计
实现概要设计中定义的所有数据类型,对每个操作只需要写出伪码算法;对主程序和其他模块也都需要写出伪码算法(伪码算法达到的详细程度应能够按照伪码算法在计算机键盘上直接输入高级程序设计语言程序);画出函数的调用关系图。
四、调试分析
内容包括:
1.调试过程中遇到的问题是如何解决的以及对设计与实现的讨论和分析;
一开始没有使用线程做动态面板,导致无法实时更新进程的信息属性,监听器和面板刷新加入线程后就解决了问题。
图像界面显示与设计的界面基本一致,实验要求的功能也都实现了。不过在某些功能上还有点瑕疵,比如说只设计了显示当前进程的信息属性,不能一次性观察全部进程的信息属性;“清空”不能一次性清空。
2.算法的时间复杂性(包括基本操作和其他算法的时间复杂性的分析)和改进设想;
算法的时间复杂性不高,只有一个循环,为O(n)。四种调度算法的代码重复率较高,每个改动的地方不多,可以找出相同的地方,整合到一个函数,这样代码就更精简了。
3.设计过程的经验和体会;
这次实验我是先想好图形界面并将其实现才开始写调度算法,然后把操作流程每一步想好,一步一步进行,这样一来图形界面的按钮、文本框和标签需要的功能就能有序的写出来了,不像先在控制台写好调度算法,实现之后连接图形界面的时候需要改大量代码,并且容易出错。虽然过程中遇到不少问题,但是通过自己的思考、在网络翻阅大量帖子寻找答案及其同学的帮助,最终还是把问题解决了。本次实验让我又发现了不少知识盲区,通过做实验的方式加深了对这些问题的印象,还是挺有意思的。
4.实现过程中出现的主要问题及解决方法。
一开始做的图形界面并不满意,接触到绝对布局后就得到了改善。在调试调度方法时,图形界面的数据无法实时刷新,翻阅资料后了解到需要使用多线程才能实现动态界面,于是加了线程给监听器和标签,让数据实时更新。解决这一问题后又遇到了,延迟时间的改变会导致动态界面的数据出现错误显示,后来经过多次的调试,找到了正确的延迟时间。
五、用户使用说明
说明如何使用你编写的程序,详细列出每一步的操作步骤。
- 在文本框里输入进程数n(0<=n<=10),并点击确认。
- 选择调度算法(四选一,有提示当前所选择的调度算法)。
- 点击“开始模拟”。开始模拟进程调度,此时可以观察进程的信息属性的变化情况。
- 点击“清空”。数据全部清空初始化。
- 此时可以选择重新模拟,即重复上述操作;也可以选择退出程序,即点击“退出”,窗口关闭,程序结束运行。
六、测试与运行结果
列出你的测试结果和运行情况(即运行时的关键画面),包括输入和输出。这里的测试数据应该完整和严格,最好多于需求分析中所列。
值得注意的是,报告的各种文档资料,要在程序开发的过程中逐渐充实形成,而不是最后补写。必要时可在报告中附部分关键源代码,但不需要附全部源代码。
初始界面:
非法输入如下图:
代码如下:
boolean error = false;
if((Pattern.compile("[0-9]*")).matcher(text.getText()).matches()) //检查输入的进程数是否为整型
if(Integer.parseInt(text.getText()) >= 0 && Integer.parseInt(text.getText()) <= 10)
SchedulingMethod.setN(Integer.parseInt(text.getText()));
else
error = true;
else
error = true;
if(error)
JFrame newJFrame = new JFrame("非法输入");
正确输入时不弹出窗口提示。
时间片轮转调度如下图所示:
开始模拟:
进程全部运行结束:
清空:
优先数调度如下图所示:
开始模拟:
进程全部运行完:
清空:
最短进程优先调度如下图所示:
开始模拟:
进程全部运行完:
清空:
最短剩余时间优先调度如下图所示:
开始模拟:
进程全部运行完:
清空:
点击退出,程序便结束运行。
代码如下:
btn03 = new JButton("退出");
btn03.setLocation(50,350);
btn03.setSize(200, 100);
btn03.setFont(font);
btn03.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO 自动生成的方法存根
new Thread(new Runnable() {
@Override
public void run() {
// TODO 自动生成的方法存根
System.exit(0);
}
}).start();
}
});
panel.add(btn03);
资源下载地址:https://download.csdn.net/download/sheziqiong/86167141
资源下载地址:https://download.csdn.net/download/sheziqiong/86167141