目录
一、算法设计 1
1.算法
思想
教师资格思想品德鉴定表下载浅论红楼梦的主题思想员工思想动态调查问卷论语教育思想学生思想教育讲话稿
1
2.运行环境 1
3.问题描述 1
二、实验步骤及方法 1
三、源程序代码 1
四、运行结果图 14
五、课程总结 15
一、算法设计
1.算法思想
本算法设计一部电梯,通过往返寻找方法,即先查询电梯运行方向的楼层是否存在有其他键被按下,有就继续往该方向运行,如果没有就查询电梯运行反方向的楼层是否有按键被按下,如果有电梯就改变方向,反方向运行。如果没有电梯就停止在该楼层,30秒后如果没有任何键被按下,电梯就自动返回1楼停住。同时,电梯乘客所去的楼层方向与电梯当前方向一致的话,则电梯优先搭载该乘客。随后再搭载去反方向的乘客,以此实现电梯的升降操作。
2.运行环境
本程序用java语言、eclipse平台编写。
3.问题描述
电梯调度算法的基本原则就是如果在电梯运行方向上有人要使用电梯则继续往那个方向运动,如果电梯中的人还没有到达目的地则继续向原方向运动。具体而言,如果电梯现在朝上运动,如果当前楼层的上方和下方都有请求,则先响应所有上方的请求,然后才向下响应下方的请求;反之。
二、实验步骤及方法
1.由于鼠标单击每个楼层按钮时,需要作出相应的动作,所以我们使用jbutton按钮类,通过jbutton的单击事件来模拟楼层按钮并通过改变颜色来表示按钮是否被按下
2.使用数组存储每个按钮的状态,1表示被按下,0表示未被按下。用于电梯是否到达目标层的判断,及按钮颜色的刷新判断;
3.“电梯”也是一个jbutton类,通过改变颜色来模拟电梯的运行,需要在此类中设置一个方向值,用0,1,2分别表示电梯的停止向上向下运行。
三、源程序代码
import java.awt.Color;
import java.awt.Container;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.util.*;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;
public class Lifta{
/**
* @param args
*/
public static void main(String[] args){
Brick brick=new Brick();
} }
class Brick{ //方块类
public int octime=0; //计算开关门事件。
public int j=0;
public String closedoor="关门";
public String close="关";
public String open="开";
JFrame frame=new JFrame("电梯调度算法");
JPanel pan=new JPanel();
JButton but=null;
JButton sign=new JButton(+j+"楼");
JButton openclose=new JButton(closedoor+"");
JButton openkey=new JButton(open+"");
JButton closekey=new JButton(close+"");
public ArrayList blackBrick;; //brick用来依次存放button,程序用button显示蓝色表示有电梯的当前位置。
public ArrayList controlBrick; //controlBrick用来依次存放button,表示每层楼电梯口的是上键和下键,程序用button显示绿色表示对应键被按下。
public int[][] controlTable; //用二维数组controlTable与电梯口的上下键对应,其中如果值1表示button应显示绿色,值0表示button应显示灰色。
public ArrayList numberBrick; //numberBrick用来依次存放button,程序用button显示桔黄色表示电梯内的数字键被按下。
public int[]table; //用二维数组table与电梯内的数字键对应,其中如果值1表示button应显示桔黄色,值0表示button应显示灰色。
public int[] upSignalTable; //纪录向上任务的任务数组,值为1表示相应位的上键被按下。
public int[] downSignalTable; //纪录向下任务的任务数组,值为1表示相应位的下键被按下。
public Timer timer; //计时器。
public LiftThread lift; //控制每个电梯的线程数组。
//==============构造方法(下)初始化========//
public Brick(){
sign.setBounds(0, 0, 80, 40); //起始位置
//开关门部分
openclose.setBounds(80, 0, 80, 40);
openclose.setBackground(Color.yellow);
openkey.setBounds(160, 0, 80, 40);
openkey.addActionListener(new OpencolseListener());//开门按钮添加事件
closekey.setBounds(240, 0, 80, 40);
closekey.addActionListener(new OpencolseListener());//关门按钮添加事件
pan.setLayout(null); //画布绝对定位
Font fnt=new Font("Serief",Font.ITALIC,15); //设置字体样式
//实例化数组
numberBrick=new ArrayList(10);
blackBrick=new ArrayList(10);
controlBrick = new ArrayList(10);
controlTable = new int[10][2];
for (int i = 0; i < 10; i++)
for (int j = 0; j < 2; j++)
controlTable[i][j] = 0;
table = new int[10];
for (int i = 0; i < 10; i++)
table[i] = 0;
upSignalTable = new int[10];
downSignalTable = new int[10];
for (int i = 0; i < 10; i++) {
upSignalTable[i] = 0;
downSignalTable[i] = 0;
}
//********************画图************************
for(int i=10;i>0;i--){
//最左边黑色列
but=new JButton();
but.setFont(fnt);
but.setBounds(0, (11-i)*40, 80, 40);
but.setBackground(Color.BLACK);
blackBrick.add(but);
pan.add(but);
//显示楼层
but=new JButton(+i+"楼");
but.setFont(fnt);
but.setBounds(80, (11-i)*40, 80, 40);
but.addActionListener(new NumberListener(i));
but.setBackground(Color.gray);
numberBrick.add(but);
pan.add(but);
//向上键
but=new JButton("上");
but.setFont(fnt);
but.setBounds(160, (11-i)*40, 80, 40);
if(i!=10)
but.addActionListener(new UpListener(i));
but.setBackground(Color.gray);
controlBrick.add(but);
pan.add(but);
//向下键
but=new JButton("下");
but.setFont(fnt);
but.setBounds(240, (11-i)*40, 80, 40);
if(i!=1)
but.addActionListener(new DownListener(i));
but.setBackground(Color.gray);
controlBrick.add(but);
pan.add(but);
}
//*******************运行部分*****************
pan.add(sign);
pan.add(openclose);
pan.add(openkey);
pan.add(closekey);
frame.add(pan);
frame.setSize(329, 479);
lift = new LiftThread();
frame.setVisible(true);
frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE);
}
//====================================================构造方法(上)=======================================================//
//*************************************************填充方块和设置方法*******************************************************
public void DrawBrick() { //重新刷新整个table,使每个button显示应该的颜色。
for (int i = 1; i <=10; i++){
for(int j=0;j<10;j++)
((JButton) blackBrick.get(j)).setBackground(Color.black);
((JButton) blackBrick.get(10-lift.number)).setBackground(Color.blue);
}
}
public void DrawControlBrick() {//将所电梯口的上下键全部重新按当前状态显示颜色。
for (int i = 0; i < 10; i++)
for(int j=0;j<2;j++)
if (controlTable[i][j] == 1){
((JButton) controlBrick.get(i * 2 + j)).setBackground(Color.green);
}else{
((JButton) controlBrick.get(i * 2 + j )).setBackground(Color.gray);
}
}
public void DrawNumberBrick() {//将所有电梯内的数字键重新按当前状态显示颜色。
for (int i = 0; i < 10; i++)
if (table[i] == 1)
((JButton) numberBrick.get(i )).setBackground(Color.orange);
else
((JButton) numberBrick.get(i )).setBackground(Color.gray);
}
public boolean WorkState() { //判断当前电梯内的数字键是否被按下,如有键被按下,则值为1,如果没有任何键被按下,则值为0。
for (int i = 0; i < 10; i++) {
if (table[i] == 1)
return true;
}
return false;
}
public void setState(int number){ //如果电梯原来停,则改变电梯状态
lift.destination = number;
int x = lift.number;
if (lift.state == 0) {
if (number > x)
lift.state = 1;
if (number < x)
lift.state = 2;
}
}
//*****************************************事件处理部分****************************************
public class UpListener implements ActionListener{ //相应上键被按下的动作。
int L = 1; //当前楼层。
UpListener(int n) {
L = n;
}
public void actionPerformed(ActionEvent e){ //重新显示上下键的颜色并将向上任务加入向上任务数组。
controlTable[10 - L][0] = 1;
setState(L);
DrawControlBrick();
}
}
public class DownListener implements ActionListener{ //相应下键被按下的动作。
int L=0;
public DownListener(int n){
L=n;
}
public void actionPerformed(ActionEvent e) {
controlTable[10-L][1]=1;
setState(L);
DrawControlBrick() ;
}
}
public class NumberListener implements ActionListener { //相应数字键被按下的动作。
int number = 0; //相应的数字键楼层。
NumberListener(int n) {
number = n;
}
public void actionPerformed(ActionEvent e) {
table[10 - number] = 1;
setState(number);
DrawNumberBrick();
}
}
public class OpencolseListener implements ActionListener { //开门关门按钮
//int number = 0;
OpencolseListener() {
//number = n;
}
public void actionPerformed(ActionEvent e) {
octime=500;
System.out.println("事件"+octime);
}
}
//***************************************主要监听器********************************************
public class TimeListener implements ActionListener { //电梯线程的监听器。************************************
TimeListener() {}
public void actionDown(){//检查向下运行的电梯是否还需向下,即检查在此层下还有没有数字键被按下,如果没有,则置电梯状态为停止,并使该电梯内所有数字键还原。
if (lift.state == 2) {
int count = 0;
for (int i = lift.number; i > 0; i--)
if (table[10 - i] == 1||controlTable[10-i][1]==1||controlTable[10-i][0]==1)
count++;
if (count == 0&& lift.number <= lift.destination) {
count=0;
for(int j=lift.number;j<10;j++){
if(table[10-j]==1||controlTable[10-j][1]==1||controlTable[10-j][0]==1){
count++;
} }
if(count>0){
lift.state=1;
//System.out.println("改变方向:向上");
}else{
lift.state = 0;
} } } }
public void actionUp(){//检查向上运行的电梯是否还需向上,即检查在此层上还有没有数字键被按下,如果没有,则置电梯状态为停止,并使该电梯内所有数字键还原。
if (lift.state == 1) {
int count = 0;
for (int i = lift.number; i < 10; i++)
if (table[10 - i] == 1||controlTable[10-i][0]==1||controlTable[10-i][1]==1)
count++;
if (count == 0&& lift.number >=lift.destination) {
count=0;
for(int j=lift.number;j>0;j--){
if(table[10-j]==1||controlTable[10-j][1]==1||controlTable[10-j][0]==1){
count++;
} }
if(count>0){
lift.state=2;
//System.out.println("改变方向:向下");
}else{
lift.state = 0;
} } } }
public void actionPerformed(ActionEvent event) {
int state = lift.state; //纪录电梯当前状态。
if (lift.state!=0&&table[10 - lift.number] == 1) { //如果电梯经过电梯内数字键显示的要到达的楼层,则该数字键状态恢复未按,并重新显示数字键颜色。
table[10 - lift.number] = 0;
DrawNumberBrick();
new openclosThread();
}
if (state != 0&& lift.number == lift.destination) { //如果电梯属于逆向到达,则此任务完成,从任务数组中删除并重新显示上下键的颜色。
if (state == 2&& controlTable[10 - lift.number][state - 1]== 0) {
controlTable[10 - lift.number][2 - state] = 0;
DrawControlBrick();
new openclosThread();
}
if (state == 1&& controlTable[10 - lift.number][state - 1]== 0) {
controlTable[10 - lift.number][2 - state] = 0;
new openclosThread();
DrawControlBrick();
} }
if (state == 1) {//向上电梯经过的向上任务完成,从任务数组中删除并重新显示上下键的颜色。
if (controlTable[10 - lift.number][0] == 1) {
controlTable[10 - lift.number][0] = 0;
new openclosThread();
DrawControlBrick();
} }
if (state == 2) {//向下电梯经过的向下任务完成,从任务数组中删除并重新显示上下键的颜色。
if (controlTable[10 - lift.number][1] == 1) {
controlTable[10 - lift.number][1] = 0;
new openclosThread();
DrawControlBrick();
} }
actionUp(); //判断是否继续向上
actionDown(); //判断是否继续向下
state = lift.state; //如果电梯状态不为停止,则按照运行方向运行。
if (state == 1){
lift.number++;
//System.out.println("向上"+lift.number);
}
if (state == 2){
lift.number--;
//System.out.println("向下"+lift.number);
}
//设置相应电梯的显示器
sign.setText("" + lift.number);
DrawBrick();
new Returnfirstfloor(state);//10秒没人按下任何键,则返回第一层
} }
//***************************************************电梯线程时间控制***************************************************************************
public class openclosThread extends Thread {
public openclosThread() {
}
public void run() {
openclose.setText("开门");
try {
sleep(1000);
} catch (InterruptedException e) {
}
openclose.setText("关门");
} }
public class Returnfirstfloor extends Thread { //如果在30秒内没有人按下任何键,电梯则自动返回第一次;省电(*^__^*) 嘻嘻……
int stater;
int count;
public Returnfirstfloor(int state) {
count=0;
this.stater=state;
start();
}
public void run() {
if(stater==0&&lift.number!=1){
try {
sleep(10000);
}catch (InterruptedException e) {
}
for (int i = 1; i<=10; i++){
if (table[10 - i] == 1||controlTable[10-i][1]==1||controlTable[10-i][0]==1){
count++;
} }
if(count==0){//如果10秒后没人按,就设第一层为1,电梯方向为向下。
table[9] = 1;
lift.state=2;
} } } }
public class LiftThread extends Thread {
public int number = 1; //电梯当前楼层。
public int state = 0; //电梯当前状态,0为停止,1为上升,2为下降。
int destination; //电梯的目的楼层。
int i=0;
public LiftThread() {
start();
i=octime;
System.out.println(""+i);
}
public void run() {
ActionListener timelistener = new TimeListener();
timer = new Timer((1500+i), timelistener);
timer.start();
}
}
}
四、运行结果图
五、课程总结
后来我们首先从网上搜罗了一系列的关于电梯这方面的
资料
新概念英语资料下载李居明饿命改运学pdf成本会计期末资料社会工作导论资料工程结算所需资料清单
,包括电梯调度算法设计的思想,然后又研究了电梯具体运行的时候的响应顺序。了解了电梯的运行原则之后,我们开始本次的课程设计,一开始做的时候比较困难,因为有许多因素要考虑,需要很多的java界面方面和相关控件的知识比较薄弱,后来通过不断的查阅资料,上百度勉强能做出来。
在本次的课程设计实验中我们运用的是扫描算法(SCAN),扫描算法是一种按照楼层顺序依次服务请求,它让电梯在最底层和最顶层之间连续往返运行,在运行过程中响应处在于电梯运行方向相同的各楼层上的请求。它进行寻找楼层的优化,效率比较高,但它是一个非实时算法。扫描算法较好地解决了电梯移动的问题,在这个算法中,每个电梯响应乘客请求使乘客获得服务的次序是由其发出请求的乘客的位置与当前电梯位置之间的距离来决定的,所有的与电梯运行方向相同的乘客的请求在一次电向上运行或向下运行的过程中完成,免去了电梯频繁的来回移动。
总之,在本次的课程设计过程中,我们收获知识,提高能力的同时,也懂得了怎么样去制定、实现
计划
项目进度计划表范例计划下载计划下载计划下载课程教学计划下载
,课程设计是培养学生综合运用所学知识发现提出分析和解决实际问题锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程。随着科学技术发展的日新月异,自从拿到题目到完成整个编程,从理论到实践,可以学到很多很多的东西,同时不仅可以巩固以前所学过的知识,而且学到了很多在书本上没有学到过的知识。通过这次课程设计使我们懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,在设计的过程中发现自己的不足之处,对一些前面学过的知识理解得不够深刻,掌握得不够牢固,在设计中我们遇到了很多编程问题,最后在不断地查阅后,我们慢慢的进入状态,这次课程设计确实加深了我们对操作系统这门课程的理解。