java课程设计报告(模拟电梯系统)

合集下载

JAVA模拟电梯

JAVA模拟电梯

1.import javax.swing.*;2.import java.awt.*;3.import java.util.*;4.public class Hufan extends JFrame{5.static HuPanel hp;6.public static void main(String[] args) {7.new Hufan();8.}9.public Hufan(){10.hp=new HuPanel();11.this.add(hp);12.this.setTitle("模拟电梯");13.this.setSize(350, 650);14.this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);15.this.setVisible(true);16.}17.}18.class HuPanel extends JPanel{19.DianTi dt;20.Person ps;21.public HuPanel(){22.init();23.dt=new DianTi(45, 0);24.//启动电梯线程25.Thread t=new Thread(dt);26.t.start();27.}28.public DianTi getDianTi(){29.return dt;30.}31.public Person getPerson(){32.return ps;33.}34.public void init(){35.Random r=new Random();36.int i=r.nextInt(4)+1;37.switch(i){38.case 1:39.ps=new Person(350,500,0,1);40.break;41.case 2:42.ps=new Person(350,350,0,2);43.break;44.case 3:45.ps=new Person(350,200,0,3);46.break;47.case 4:48.ps=new Person(350,50,0,4);49.break;50.}51.Thread t=new Thread(ps);52.t.start();53.}54.public void paint(Graphics g){55.super.paint(g);56.//画楼梯与楼层57.g.fillRect(30, 0, 6, 600);58.g.fillRect(200, 0, 6, 600);59.g.fillRect(200, 150, 330, 6);60.g.fillRect(200, 300, 330, 6);61.g.fillRect(200, 450, 330, 6);62.g.fillRect(30, 600, 500, 6);63.//画电梯64.g.setColor(Color.gray);65.g.fillRect(dt.x, dt.y, 150, 150);66.//画人67.g.setColor(Color.red);68.g.fillRect(ps.x, ps.y, 50, 100);69.//画要上几楼70.g.setColor(Color.black);71.g.setFont(new Font("宋体",Font.BOLD,17));72.if(ps.endFloor!=0&&ps.direct==0){73.g.drawString("去"+ps.endFloor+"楼", ps.x, ps.y+20);74.}75.//画我走了76.if(ps.direct==1){77.g.drawString("我走了", ps.x, ps.y+20);78.}79.}80.81.}82.class Person implements Runnable{83.int x;84.int y;85.int direct;86.int startFloor;87.int endFloor;88.int speed=5;89.boolean isStop=true;90.boolean isDead=true;91.DianTi dt;92.public Person(int x,int y,int direct,int startFloor){93.this.x=x;94.this.y=y;95.this.direct=direct;96.this.startFloor=startFloor;97.}98.//得到目的楼99.public void getEndF(){100.endFloor=new Random().nextInt(4)+1;101.}102.@Override103.public void run() {104.// TODO Auto-generated method stub105.//得到ps106.dt=Hufan.hp.dt;107.while(isDead){108.if(isStop){109.if(direct==0){110.x-=speed;111.if(x==200){112.while(true){113.this.getEndF();114.//如果目的楼和自己等,重新得到endFloor 115.if(startFloor==endFloor){116.this.getEndF();117.}else{118.break;119.}120.}121.//到了电梯,这时让电梯到自己在的楼层122.dt.topDown=startFloor;123.//启动电梯124.dt.isStop=true;125.//人停止126.isStop=false;127.}128.}else if(direct==1){129.x+=speed;130.//如果到边界。

电梯模拟程序课程设计

电梯模拟程序课程设计

电梯模拟程序课程设计一、课程目标知识目标:1. 让学生理解电梯的工作原理,掌握电梯运行的模拟编程知识。

2. 使学生掌握利用流程图描述电梯运行逻辑的方法。

3. 帮助学生理解并运用条件语句和循环语句实现电梯模拟程序。

技能目标:1. 培养学生运用编程语言(如Scratch或Python)编写简单电梯模拟程序的能力。

2. 培养学生通过流程图分析问题、解决问题的能力。

3. 提高学生团队协作、沟通交流的能力。

情感态度价值观目标:1. 培养学生对编程的兴趣,激发学生主动探索新知识的热情。

2. 培养学生严谨、细心的学习态度,增强面对困难的勇气和毅力。

3. 培养学生遵守程序设计规范,养成良好的编程习惯。

课程性质:本课程为信息技术学科的课程,以项目式学习为主,注重实践操作和团队合作。

学生特点:学生为五年级学生,具备一定的信息技术基础,对新事物充满好奇,喜欢动手操作。

教学要求:教师需引导学生通过自主探究、小组合作等方式完成课程内容,注重培养学生的实践能力和创新精神。

同时,关注学生的个体差异,提供有针对性的指导。

通过本课程的学习,使学生能够达到上述课程目标,实现具体的学习成果。

二、教学内容1. 电梯工作原理介绍:包括电梯的基本结构、运行原理、信号控制系统等,让学生对电梯的运行机制有整体认识。

2. 编程语言基础:回顾并巩固Scratch或Python编程语言的基础知识,如变量、列表、条件语句、循环语句等,为编写电梯模拟程序打下基础。

3. 流程图设计:学习如何利用流程图描述电梯运行的逻辑过程,分析电梯运行中的各种情况,并进行流程图设计。

4. 电梯模拟程序编写:根据流程图,运用所学编程知识,分组合作编写电梯模拟程序,实现基本的运行、停止、开门、关门等功能。

5. 程序调试与优化:指导学生如何调试程序,发现并解决程序中的问题,提高程序的稳定性和运行效率。

教学内容安排和进度:第一课时:电梯工作原理介绍,回顾编程语言基础知识。

第二课时:学习流程图设计,分析电梯运行逻辑。

电梯模拟程序(Java语言编写)

电梯模拟程序(Java语言编写)

import java.awt.*;import javax.swing.*;import java.awt.event.*;import java.io.*;public class LiftMainTest{public static void main(String args[]){new LiftTest("电梯测试");}}//批量数据测试对话框class Dialog extends JDialog implements ActionListener {int Message=0;JPanel DJPanel=new JPanel();JTextField TestField[]=new JTextField[16];JLabel TestLabel1=new JLabel("时间");JLabel TestLabel2=new JLabel("人数");JLabel TestLabel3=new JLabel("起始楼层");JLabel TestLabel4=new JLabel("目标楼层");JButton ok=new JButton("确定");JButton cancel=new JButton("取消");Dialog(JFrame f,String s,boolean b){super(f,s,b);DJPanel.setLayout(new GridLayout(7,3));for(int i=0;i<=15;i++){TestField[i]=new JTextField(4);}DJPanel.add(TestLabel1);DJPanel.add(TestLabel2);DJPanel.add(TestLabel3);DJPanel.add(TestLabel4);DJPanel.add(TestField[0]);DJPanel.add(TestField[1]);DJPanel.add(TestField[2]);DJPanel.add(TestField[3]);DJPanel.add(TestField[4]);DJPanel.add(TestField[5]);DJPanel.add(TestField[6]);DJPanel.add(TestField[7]);DJPanel.add(TestField[8]);DJPanel.add(TestField[9]);DJPanel.add(TestField[10]);DJPanel.add(TestField[11]);DJPanel.add(TestField[12]);DJPanel.add(TestField[13]);DJPanel.add(TestField[14]);DJPanel.add(TestField[15]);DJPanel.add(ok);DJPanel.add(cancel);add(DJPanel);ok.addActionListener(this);cancel.addActionListener(this);setBounds(450,170,300,300);}public void actionPerformed(ActionEvent e)//Dialog监听函数{if(e.getSource()==ok){Message=1;setVisible(false);}else if(e.getSource()==cancel){Message=-1;setVisible(false);}else{;}}}//LiftTest类class LiftTest extends JFrame implements ActionListener {Dialog mydialog;JMenuBar menubar;JMenu menu,submenu,submenuhelp;JMenuItem item1,item2,menuitemhelp;//变量定义int x;int y;int LIsRun=0;//左电梯是否在运行(0或1)int RIsRun=0;//右电梯是否在运行(0或1)int LDirection=0;//左电梯运行方向int RDirection=0;//右电梯运行方向int LWantLevel=0;//乘客目的层数int RWantLevel=0;int LNowLevel=0;//乘客开始时所在层数int RNowLevel=0;int LLiftNowLevel=1;//左电梯目前所在层数int RLiftNowLevel=1;//右电梯目前所在层数int WantDirection=0;//乘客目标运行方向int WaitPeopleNum[]=new int[11];//保留数组(未用)int a=0;int b=0;//线程定义LIO lio=new LIO();RIO rio=new RIO();Thread LStartThread=new Thread(lio);Thread RStartThread=new Thread(rio);//上下电梯的按钮定义JButton Blue10=new JButton(new ImageIcon("10x.gif"));JButton Blue9=new JButton(new ImageIcon("9x.gif"));JButton Blue8=new JButton(new ImageIcon("8x.gif"));JButton Blue7=new JButton(new ImageIcon("7x.gif"));JButton Blue6=new JButton(new ImageIcon("6x.gif"));JButton Blue5=new JButton(new ImageIcon("5x.gif"));JButton Blue4=new JButton(new ImageIcon("4x.gif"));JButton Blue3=new JButton(new ImageIcon("3x.gif"));JButton Blue2=new JButton(new ImageIcon("2x.gif"));JButton Red9=new JButton(new ImageIcon("9s.gif"));JButton Red8=new JButton(new ImageIcon("8s.gif"));JButton Red7=new JButton(new ImageIcon("7s.gif"));JButton Red6=new JButton(new ImageIcon("6s.gif"));JButton Red5=new JButton(new ImageIcon("5s.gif"));JButton Red4=new JButton(new ImageIcon("4s.gif"));JButton Red3=new JButton(new ImageIcon("3s.gif"));JButton Red2=new JButton(new ImageIcon("2s.gif"));JButton Red1=new JButton(new ImageIcon("1s.gif"));//电梯门定义JButton LLiftLDoor=new JButton(new ImageIcon("LLiftLDoor.gif"));//设置门图标JButton LLiftRDoor=new JButton(new ImageIcon("LLiftRDoor.gif"));//设置门图标JButton RLiftLDoor=new JButton(new ImageIcon("RLiftLDoor.gif"));//设置门图标JButton RLiftRDoor=new JButton(new ImageIcon("RLiftRDoor.gif"));//设置门图标//电梯内部按钮定义JButton LPressButton1=new JButton("1");JButton LPressButton2=new JButton("2");JButton LPressButton3=new JButton("3");JButton LPressButton4=new JButton("4");JButton LPressButton5=new JButton("5");JButton LPressButton6=new JButton("6");JButton LPressButton7=new JButton("7");JButton LPressButton8=new JButton("8");JButton LPressButton9=new JButton("9");JButton LPressButton10=new JButton("10");JButton RPressButton1=new JButton("1");JButton RPressButton2=new JButton("2");JButton RPressButton3=new JButton("3");JButton RPressButton4=new JButton("4");JButton RPressButton5=new JButton("5");JButton RPressButton6=new JButton("6");JButton RPressButton7=new JButton("7");JButton RPressButton8=new JButton("8");JButton RPressButton9=new JButton("9");JButton RPressButton10=new JButton("10");量数据测试”按钮的Panel //组件定义JLabel LL=new JLabel("当前电梯内部人数:");JLabel RL=new JLabel("当前电梯内部人数:");JButton Start=new JButton("开始电梯调度模拟");//开始电梯调度模拟按钮JButton Test=new JButton("开始批量数据测试");//开始批量数据测试按钮JTextArea LTextArea=new JTextArea(5,5);JTextArea RTextArea=new JTextArea(5,5);//电梯调度函数Cal(LIsRun,LLiftNowLevel,q,LDirection)int Cal(int x,int y,int z,int w){return(x*(y-z)*w);}//方法函数LiftTest(String s){super(s);setSize(1000,600);setLocation(100,50);//Dialogmydialog=new Dialog(this,"批量数据测试",true);//菜单项设置menubar=new JMenuBar();menu=new JMenu("菜单");submenu=new JMenu("联系作者");submenuhelp=new JMenu("帮助");item1=new JMenuItem("程序简介");item2=new JMenuItem("源代码");menu.add(item1);menu.addSeparator();menu.add(item2);menu.addSeparator();menu.add(submenu);menu.addSeparator();menu.add(submenuhelp);submenu.add(new JMenuItem("作者简介"));submenuhelp.add(new JMenuItem("使用帮助"));menubar.add(menu);setJMenuBar(menubar);//面板布局管理器设置WindowsPanel.setLayout(new GridLayout(1,6)); WaitPeopleNumPanel.setLayout(new GridLayout(10,1)); LeftPanel.setLayout(new GridLayout(3,1));RightPanel.setLayout(new GridLayout(3,1));LeftLiftPanel.setLayout(null);//左电梯运动轨道Panel布局管理器设为空RightLiftPanel.setLayout(null);//右电梯运动轨道Panel布局管理器设为空UpDownButtonPanel.setLayout(new GridLayout(10,2)); LButtonPanel.setLayout(new GridLayout(4,3));RButtonPanel.setLayout(new GridLayout(4,3));LeftLiftPanel.setBackground(Color.green);RightLiftPanel.setBackground(Color.green); UpDownButtonPanel.setBackground(Color.yellow); UpMainPanel.setLayout(new GridLayout(1,2));LBoxPanel.setLayout(null);//左电梯箱Panel布局管理器设为空RBoxPanel.setLayout(null);//右电梯箱Panel布局管理器设为空//电梯箱设置LBoxPanel.setSize(165,51);RBoxPanel.setSize(165,51);LBoxPanel.setLocation(0,459);RBoxPanel.setLocation(0,459);LeftLiftPanel.add(LBoxPanel);RightLiftPanel.add(RBoxPanel);//电梯门设置LLiftLDoor.setEnabled(false);LLiftRDoor.setEnabled(false);RLiftLDoor.setEnabled(false);RLiftRDoor.setEnabled(false);LLiftLDoor.setSize(82,51);LLiftRDoor.setSize(82,51);RLiftLDoor.setSize(82,51);RLiftRDoor.setSize(82,51);LLiftLDoor.setLocation(0,0);LLiftRDoor.setLocation(82,0);RLiftLDoor.setLocation(0,0);RLiftRDoor.setLocation(82,0);LBoxPanel.add(LLiftLDoor);LBoxPanel.add(LLiftRDoor);RBoxPanel.add(RLiftLDoor);RBoxPanel.add(RLiftRDoor);//分别添加两个电梯的10个按钮LButtonPanel.add(LPressButton1);//左电梯LButtonPanel.add(LPressButton2); LButtonPanel.add(LPressButton3); LButtonPanel.add(LPressButton4); LButtonPanel.add(LPressButton5); LButtonPanel.add(LPressButton6); LButtonPanel.add(LPressButton7); LButtonPanel.add(LPressButton8); LButtonPanel.add(LPressButton9); LButtonPanel.add(LPressButton10); RButtonPanel.add(RPressButton1);//右电梯RButtonPanel.add(RPressButton2); RButtonPanel.add(RPressButton3); RButtonPanel.add(RPressButton4); RButtonPanel.add(RPressButton5); RButtonPanel.add(RPressButton6); RButtonPanel.add(RPressButton7); RButtonPanel.add(RPressButton8); RButtonPanel.add(RPressButton9); RButtonPanel.add(RPressButton10);//添加上下电梯按钮至UpDownButtonPanel面板JButton Unabled1=new JButton();Unabled1.setEnabled(false);JButton Unabled2=new JButton();Unabled2.setEnabled(false); UpDownButtonPanel.add(Unabled1);//开始第一个空着UpDownButtonPanel.add(Blue10); UpDownButtonPanel.add(Red9); UpDownButtonPanel.add(Blue9); UpDownButtonPanel.add(Red8); UpDownButtonPanel.add(Blue8);UpDownButtonPanel.add(Red7); UpDownButtonPanel.add(Blue7); UpDownButtonPanel.add(Red6); UpDownButtonPanel.add(Blue6); UpDownButtonPanel.add(Red5); UpDownButtonPanel.add(Blue5); UpDownButtonPanel.add(Red4); UpDownButtonPanel.add(Blue4); UpDownButtonPanel.add(Red3); UpDownButtonPanel.add(Blue3); UpDownButtonPanel.add(Red2); UpDownButtonPanel.add(Blue2); UpDownButtonPanel.add(Red1); UpDownButtonPanel.add(Unabled2);//最后一个空着//等待人数文本框定义JTextField Text10=new JTextField(" 10楼等待人数:",8); Text10.setEditable(false);JTextField Text9=new JTextField(" 9楼等待人数:",8); Text9.setEditable(false);JTextField Text8=new JTextField(" 8楼等待人数:",8); Text8.setEditable(false);JTextField Text7=new JTextField(" 7楼等待人数:",8); Text7.setEditable(false);JTextField Text6=new JTextField(" 6楼等待人数:",8); Text6.setEditable(false);JTextField Text5=new JTextField(" 5楼等待人数:",8); Text5.setEditable(false);JTextField Text4=new JTextField(" 4楼等待人数:",8); Text4.setEditable(false);JTextField Text3=new JTextField(" 3楼等待人数:",8); Text3.setEditable(false);JTextField Text2=new JTextField(" 2楼等待人数:",8); Text2.setEditable(false);JTextField Text1=new JTextField(" 1楼等待人数:",8); Text1.setEditable(false);//向UpMainPanel中添加组件UpMainPanel.add(Start);UpMainPanel.add(Test);//添加等待人数文本框至WaitPeopleNumPanel面板WaitPeopleNumPanel.add(Text10); WaitPeopleNumPanel.add(Text9); WaitPeopleNumPanel.add(Text8); WaitPeopleNumPanel.add(Text7); WaitPeopleNumPanel.add(Text6);WaitPeopleNumPanel.add(Text5);WaitPeopleNumPanel.add(Text4);WaitPeopleNumPanel.add(Text3);WaitPeopleNumPanel.add(Text2);WaitPeopleNumPanel.add(Text1);//分别向LeftPanel(左电梯提示器),RightPanel(右电梯提示器)添加相应组件LeftPanel.add(LButtonPanel);LeftPanel.add(LL);LeftPanel.add(LTextArea);RightPanel.add(RButtonPanel);RightPanel.add(RL);RightPanel.add(RTextArea);//添加至总面板WindowsPanel.add(WaitPeopleNumPanel);WindowsPanel.add(LeftPanel);WindowsPanel.add(LeftLiftPanel);WindowsPanel.add(UpDownButtonPanel);WindowsPanel.add(RightLiftPanel);WindowsPanel.add(RightPanel);//添加监听器Start.addActionListener(this);Test.addActionListener(this);Blue10.addActionListener(this);Blue9.addActionListener(this);Blue8.addActionListener(this);Blue7.addActionListener(this);Blue6.addActionListener(this);Blue5.addActionListener(this);Blue4.addActionListener(this);Blue3.addActionListener(this);Blue2.addActionListener(this);Red9.addActionListener(this);Red8.addActionListener(this);Red7.addActionListener(this);Red6.addActionListener(this);Red5.addActionListener(this);Red4.addActionListener(this);Red3.addActionListener(this);Red2.addActionListener(this);Red1.addActionListener(this);Monitor mon=new Monitor();//新建监听器对象LPressButton1.addActionListener(mon);LPressButton2.addActionListener(mon);LPressButton3.addActionListener(mon);LPressButton4.addActionListener(mon);LPressButton5.addActionListener(mon);LPressButton6.addActionListener(mon);LPressButton7.addActionListener(mon);LPressButton8.addActionListener(mon);LPressButton9.addActionListener(mon);LPressButton10.addActionListener(mon);RPressButton1.addActionListener(mon);RPressButton2.addActionListener(mon);RPressButton3.addActionListener(mon);RPressButton4.addActionListener(mon);RPressButton5.addActionListener(mon);RPressButton6.addActionListener(mon);RPressButton7.addActionListener(mon);RPressButton8.addActionListener(mon);RPressButton9.addActionListener(mon);RPressButton10.addActionListener(mon);//添加至窗口add(WindowsPanel,BorderLayout.CENTER);//主窗体添加至中间add(UpMainPanel,BorderLayout.NORTH);//UpMainPanel添加至北面setVisible(true);//Frame默认是不可见的,所有Panel都是默认可见的validate();//设置组件可见setResizable(false);//设置整个窗体是不可调整大小的setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//右上角“叉号”关闭按钮响应函数}//Runnable接口函数定义class LIO implements Runnable//左电梯接口函数{public void run(){while(true){try{Thread.sleep(5);}//避免CPU使用率达到100%catch(InterruptedException a){}while(LNowLevel!=0){int q=x;if(Cal(LIsRun,LLiftNowLevel,q,LDirection)<=Cal(RIsRun,RLiftNowLevel,q, RDirection))//左电梯近{LNowLevel=0;if(LLiftNowLevel<=q){for(int i=LLiftNowLevel;i<q;i++){LBoxPanel.setLocation(0,(459-i*51));LTextArea.append("妹妹\n");RTextArea.append("哥哥\n");LLiftNowLevel=i;LIsRun=1;LDirection=1;if(LNowLevel!=0&&i==(LNowLevel-1)&&LDirection==1&&WantDirecti on==1)//停留等待4秒{for(int v=1;v<=82;v++)//开门{try{Thread.sleep(49);}catch(InterruptedException a){}LLiftLDoor.setLocation((-v),0);LLiftRDoor.setLocation((82+v),0);}try{Thread.sleep(4000);}catch(InterruptedException a){}for(int v=1;v<=82;v++)//关门{try{Thread.sleep(49);}catch(InterruptedException a){}LLiftLDoor.setLocation((v-82),0);LLiftRDoor.setLocation((163-v),0);}}try{Thread.sleep(1000);}catch(InterruptedException a){}}}else{for(int i=LLiftNowLevel;i>q;i--){LBoxPanel.setLocation(0,(459-(i-2)*51));LTextArea.append("妹妹");RTextArea.append("哥哥");LLiftNowLevel=i;LIsRun=1;LDirection=-1;if(LNowLevel!=0&&i==(LNowLevel+1)&&LDirection==-1&&WantDirection= =-1)//停留等待4秒{for(int v=1;v<=82;v++)//开门{try{Thread.sleep(49);}catch(InterruptedException a){}LLiftLDoor.setLocation((-v),0);LLiftRDoor.setLocation((82+v),0);}try{Thread.sleep(4000);}catch(InterruptedException a){}for(int v=1;v<=82;v++)//关门{try{Thread.sleep(49);}catch(InterruptedException a){}LLiftLDoor.setLocation((v-82),0);LLiftRDoor.setLocation((163-v),0);}}try{Thread.sleep(1000);}catch(InterruptedException a){}}}LIsRun=0;LDirection=0;LLiftNowLevel=q;}else{break;}for(int e=1;e<=82;e++)//开门{if(a==1)//识别用户按下电梯箱内小按钮{x=LWantLevel;LNowLevel=LWantLevel;a=0;//"a"值复位}try{Thread.sleep(49);}catch(InterruptedException a){}LLiftLDoor.setLocation((-e),0);LLiftRDoor.setLocation((82+e),0);}for(int e=1;e<=82;e++){if(a==1)//识别用户按下电梯箱内小按钮{x=LWantLevel;LNowLevel=LWantLevel;a=0;//"a"值复位}try{Thread.sleep(49);}catch(InterruptedException a){}}for(int e=1;e<=82;e++)//关门{if(a==1)//识别用户按下电梯箱内小按钮{x=LWantLevel;LNowLevel=LWantLevel;a=0;//"a"值复位}try{Thread.sleep(49);}catch(InterruptedException a){}LLiftLDoor.setLocation((e-82),0);LLiftRDoor.setLocation((163-e),0);}}}}}class RIO implements Runnable//右电梯接口函数{public void run(){while(true){try{Thread.sleep(5);}catch(InterruptedException a){}while(RNowLevel!=0){int p=y;if(Cal(LIsRun,LLiftNowLevel,p,LDirection)>=Cal(RIsRun,RLiftNowLevel,p,RDir ection))//右电梯近{RNowLevel=0;if(RLiftNowLevel<=p){for(int i=RLiftNowLevel;i<p;i++){RBoxPanel.setLocation(0,(459-i*51));LTextArea.append("妹妹\n");RTextArea.append("哥哥\n");RLiftNowLevel=i;RIsRun=1;RDirection=1;if(RNowLevel!=0&&i==(RNowLevel-1)&&RDirection==1&&WantDirec tion==1)//停留等待4秒{for(int v=1;v<=82;v++){try{Thread.sleep(49);}catch(InterruptedException a){}RLiftLDoor.setLocation((-v),0);RLiftRDoor.setLocation((82+v),0);}try{Thread.sleep(4000);}catch(InterruptedException a){}for(int v=1;v<=82;v++){try{Thread.sleep(49);}catch(InterruptedException a){}RLiftLDoor.setLocation((v-82),0);RLiftRDoor.setLocation((163-v),0);}}try{Thread.sleep(1000);}catch(InterruptedException a){}}}else{for(int i=RLiftNowLevel;i>p;i--){RBoxPanel.setLocation(0,(459-(i-2)*51));LTextArea.append("妹妹");RTextArea.append("哥哥");RLiftNowLevel=i;RIsRun=1;RDirection=-1;if(RNowLevel!=0&&i==(RNowLevel+1)&&RDirection==-1&&WantDirection ==-1)//停留等待4秒{for(int v=1;v<=82;v++){try{Thread.sleep(49);}catch(InterruptedException a){}RLiftLDoor.setLocation((-v),0);RLiftRDoor.setLocation((82+v),0);}try{Thread.sleep(4000);}catch(InterruptedException a){}for(int v=1;v<=82;v++){try{Thread.sleep(49);}catch(InterruptedException a){}RLiftLDoor.setLocation((v-82),0);RLiftRDoor.setLocation((163-v),0);}}try{Thread.sleep(1000);}catch(InterruptedException a){}}}RIsRun=0;RDirection=0;RLiftNowLevel=p;}else{break;}for(int e=1;e<=82;e++){if(b==1)//识别用户按下电梯箱内小按钮{y=RWantLevel;RNowLevel=RWantLevel;b=0;//"b"值复位}try{Thread.sleep(49);}catch(InterruptedException a){}RLiftLDoor.setLocation((-e),0);RLiftRDoor.setLocation((82+e),0);}for(int e=1;e<=82;e++)if(b==1)//识别用户按下电梯箱内小按钮{y=RWantLevel;RNowLevel=RWantLevel;b=0;//"b"值复位}try{Thread.sleep(49);}catch(InterruptedException a){}}for(int e=1;e<=82;e++){if(b==1)//识别用户按下电梯箱内小按钮{y=RWantLevel;RNowLevel=RWantLevel;b=0;//"b"值复位}try{Thread.sleep(49);}catch(InterruptedException a){}RLiftLDoor.setLocation((e-82),0);RLiftRDoor.setLocation((163-e),0);}}}}}//"开始"按钮和"上下键"接口函数public void actionPerformed(ActionEvent e){if(e.getSource()==Start){LStartThread.start();RStartThread.start();}else if(e.getSource()==Test){mydialog.setVisible(true);}else if(e.getSource()==Red1){LNowLevel=1;RNowLevel=1;x=1;y=1;WantDirection=1; }else if(e.getSource()==Red2)LNowLevel=2;RNowLevel=2;x=2;y=2;WantDirection=1;}else if(e.getSource()==Red3){LNowLevel=3;RNowLevel=3;x=3;y=3;WantDirection=1;}else if(e.getSource()==Red4){LNowLevel=4;RNowLevel=4;x=4;y=4;WantDirection=1;}else if(e.getSource()==Red5){LNowLevel=5;RNowLevel=5;x=5;y=5;WantDirection=1;}else if(e.getSource()==Red6){LNowLevel=6;RNowLevel=6;x=6;y=6;WantDirection=1;}else if(e.getSource()==Red7){LNowLevel=7;RNowLevel=7;x=7;y=7;WantDirection=1;}else if(e.getSource()==Red8){LNowLevel=8;RNowLevel=8;x=8;y=8;WantDirection=1;}else if(e.getSource()==Red9){LNowLevel=9;RNowLevel=9;x=9;y=9;WantDirection=1;}else if(e.getSource()==Blue10){LNowLevel=10;RNowLevel=10;x=10;y=10;WantDirection=-1; }else if(e.getSource()==Blue9){LNowLevel=9;RNowLevel=9;x=9;y=9;WantDirection=-1;}else if(e.getSource()==Blue8){LNowLevel=8;RNowLevel=8;x=8;y=8;WantDirection=-1;}else if(e.getSource()==Blue7)LNowLevel=7;RNowLevel=7;x=7;y=7;WantDirection=-1; }else if(e.getSource()==Blue6){LNowLevel=6;RNowLevel=6;x=6;y=6;WantDirection=-1; }else if(e.getSource()==Blue5){LNowLevel=5;RNowLevel=5;x=5;y=5;WantDirection=-1; }else if(e.getSource()==Blue4){LNowLevel=4;RNowLevel=4;x=4;y=4;WantDirection=-1; }else if(e.getSource()==Blue3){LNowLevel=3;RNowLevel=3;x=3;y=3;WantDirection=-1; }else if(e.getSource()==Blue2){LNowLevel=2;RNowLevel=2;x=2;y=2;WantDirection=-1; }else{;}}//左右电梯电梯箱内小按钮监听器class Monitor implements ActionListener{public void actionPerformed(ActionEvent e){if(e.getSource()==LPressButton1){LWantLevel=1;a=1;}else if(e.getSource()==LPressButton2){LWantLevel=2;a=1;}else if(e.getSource()==LPressButton3){LWantLevel=3;a=1;else if(e.getSource()==LPressButton4) {LWantLevel=4;a=1;}else if(e.getSource()==LPressButton5) {LWantLevel=5;a=1;}else if(e.getSource()==LPressButton6) {LWantLevel=6;a=1;}else if(e.getSource()==LPressButton7) {LWantLevel=7;a=1;}else if(e.getSource()==LPressButton8) {LWantLevel=8;a=1;}else if(e.getSource()==LPressButton9) {LWantLevel=9;a=1;}else if(e.getSource()==LPressButton10) {LWantLevel=10;a=1;}else if(e.getSource()==RPressButton1) {RWantLevel=1;b=1;}else if(e.getSource()==RPressButton2) {RWantLevel=2;b=1;}else if(e.getSource()==RPressButton3) {RWantLevel=3;b=1;}else if(e.getSource()==RPressButton4) {RWantLevel=4;b=1;else if(e.getSource()==RPressButton5){RWantLevel=5;b=1;}else if(e.getSource()==RPressButton6){RWantLevel=6;b=1;}else if(e.getSource()==RPressButton7){RWantLevel=7;b=1;}else if(e.getSource()==RPressButton8){RWantLevel=8;b=1;}else if(e.getSource()==RPressButton9){RWantLevel=9;b=1;}else if(e.getSource()==RPressButton10){RWantLevel=10;b=1;}else{;}}}}/*//////////////////////////////////////////////////////////////////////////////////文件说明:程序用java语言编写,自行安装JDK(下载网址:)。

模拟电梯问题实验报告

模拟电梯问题实验报告

电梯模拟问题一、目的与要求1. 掌握线性结构的逻辑特点及存储实现;2. 根据选题,按规范化流程完成课程设计报告:⑴.提供需求分析。

(15分)⑵.列出概要设计。

(包括:抽象数据类型的描述;程序结构图或功能模块图)(20分)⑶.给出详细设计。

(包括:①存储结构的描述;②算法的详细设计,对复杂算法,最好画出其N-S流程图;③函数的调用关系图)(30分)⑷.进行调试分析(注:调试时遇到的问题及解决方法,程序的输出结果及对结果的分析)。

(15分)⑸. 整理设计总结。

(设计心得体会,以及其他总结信息等)(10分)⑹.附有程序清单(注:代码可具有适当注释,用来说明程序的功能、结构)。

(10分)二、设计步骤1、线性结构是有序数据元素的集合,存在着“一对一”的线性关系且只有一个首结点,一个尾结点,首结点只有后继没有前趋,尾结点只有前趋没有后继。

顺序表的存储结构包括顺序表和链表,顺序存储是指将线性表元素按照逻辑顺序依次存储在一组连续的地址单元中。

链式存储是通过结点中的链域将线性表中n个结点按其逻辑顺序链接在一起。

分为:单向链表,双向链表,循环链表。

2、(1)设计一个电梯模拟系统。

这是一个离散的模拟程序,因为电梯系统是乘客和电梯等“活动体”够成的集合,虽然他们彼此交互作用,但是他们的行为是基本独立的。

在离散的模拟中,一模拟时钟决定每个活动体的动作发生的时刻和顺序,系统在某个模拟瞬间处理有待完成的各种事情,然后把模拟时钟推进到某个动作预定要发生的下一个时刻。

可模拟某校五层教学楼的电梯系统,或者九层教学楼的电梯系统。

此程序的关键是模拟好电梯运行状态的转换与乘客进出的同步进行,需要一个函数判断电梯的运行状态,决定电梯的下一个运行状态如电梯的开门,关门,上升,下降,减速,加速等,也需要模拟时钟的函数来判断该运行哪个函数,也需要定义几个结构体存放结点信息。

(2)时钟函数:void DoTime(){//此函数用于模拟时钟while(1){if(Time>MaxTime)return;TestPeople();//两个始终都会被调用的函数Controler();struct Activity* p=activity.next;if(p==NULL){Time=MaxTime;}if(p&&Time>=p->time){//取出活动队头的,检测定时是否到了activity.next=p->next;p->fn();free(p);}Time++;}}其中activity是关键,它是一个链表在链表的头部是计时器时间最小的函数,根据模拟时钟判断是否调用这个函数以及删除这个节点。

电梯控制系统(Java课程设计)内容

电梯控制系统(Java课程设计)内容
当电梯正在上行时,如果上行队列的队列头改变时,系统将同时将这个新的队列头发送给电梯作为它的新目的地。有两种原因引起队列头的改变。
(1)新的请求插入到上行队列头。
(2)电梯到达某个楼层将这个楼层的请求从上行队列的队列头删除,后继的更高楼层号成为对列头。
当电梯正在下行时,如果下行队列的队列头改变时,系统将同时将这个新的队列头发送给电梯作为它的新目的地。有两种原因引起下行队列头的改变。
(2)M被插入到上行队列的合适位置。
(3)如果M被插到上行队列头。
如果电梯正处于上行状态。将M发送给电梯作为目的地。
如果电梯处于停止状态。将M发送给电梯作为目的地。
(4)电梯到达此楼层。
(5)电梯自动打开门(用例9)。
(6)乘客进入电梯。
(7)超重测试(用例6)。
用例2按下某楼层的下行按钮(go down stair)。
用例8打开某层电梯锁(open floor)
此层的楼层请求按钮和电梯内的楼层按钮恢复正常。
用例9自动打开电梯门(auto open door)
(1)电梯到达某楼层。
(2)电梯自动开门。
用例10自动关闭电梯门(auto close door)
(1)电梯门打开的状态达到设置的时限。
(2)关闭电梯门。
A3 类模型
根据分析,我们可以得到下面这些类。
乘客类(Passenger)、管理员类(Manager)、电梯类(Elevator)、电梯门类(ElevatorDoor)、楼层的上行请求按钮类(Go Up Request)、楼层的下请求按钮类(Gequest)、楼层锁类(lock)、指示灯类(Indicate Light)、队列类(Queue)、定时器类(Timer)、异常处理类(Expection)。

电梯模拟课程设计

电梯模拟课程设计

课程设计实验报告课程名称__数据结构__题目名称电梯模拟专业班级学号学生姓名指导教师_2011 年1 月日一、需求分析及实现提示[需求分析](1)、模拟某校五层教学楼的电梯系统。

该楼有一个自动电梯,能在每层停留。

五个楼层由下至上依次称为地下层、第一层、第二层、第三层和第四层,其中第一层是大楼的进出层,即是电梯的“本垒层”,电梯“空闲”时,将来该层候命。

(2)、乘客可随机地进出于任何层。

对每个人来说,他有一个能容忍的最长等待时间,一旦等候电梯时间过长,他将放弃。

(3)、模拟时钟从0开始,时间单位为0.1秒。

人和电梯的各种动作均要耗费一定的时间单位(简记为t):有人进出时,电梯每隔40t测试一次,若无人进出,则关门关门和开门各需要20t每个人进出电梯均需要25t如果电梯在某层静止时间超过300t,则驶回1层候命。

(4)、按时序显示系统状态的变化过程:发生的全部人和电梯的动作序列。

[实现提示](1)楼层由下至上依次编号为0,1,2,3,4。

每目有要求Up(上)和Down(下)的两个按钮,对应l0个变量CallUp[0..4]和CallDown[0..4]。

电梯内5个目标层按钮对应变量CallCar[0..4]。

有人按下某个按钮时,相应的变量就置为1,一旦要求满足后,电梯就把该变量清为0。

(2)电梯处于三种状态之一:GoingUp(上行)、GoingDown(下行)和IdIe(停候)。

如果电梯处于IdIe状态且不在1层,则关门并驶回1层。

在1层停候时,电梯是闭门候命。

一旦收到往另一层的命令,就转入GoingUp或GoingDown状态,执行相应的操作。

(3)用变量Time表示模拟时钟,初值为0,时间单位(t)为0.1秒。

其他重要的变量有:Floor——电梯的当前位置(楼层);D1——值为0,除非人们正在进入和离开电梯;D2——值为0,如果电梯已经在某层停候300t以上;D3——值为0,除非电梯门正开着又无人进出电梯;State——电梯的当前状态(GoingUp,GoingDown,IdIe)。

数据结构——电梯模拟的报告

数据结构——电梯模拟的报告

数据结构——电梯模拟的报告数据结构——电梯模拟的报告⒈引言在现代社会,电梯已经成为了人们生活中不可或缺的一部分。

电梯的运行和调度涉及到众多复杂的算法和数据结构。

为了提高电梯的运行效率和用户体验,本报告将介绍一种电梯模拟的数据结构设计。

⒉背景和目标在城市高楼大厦中,电梯的运行和调度是一个极其重要的问题。

每天数以万计的乘客需要借助电梯上下楼,所以我们需要设计一种电梯调度算法来保证乘客能够快速、方便地到达目的地。

本报告旨在介绍一种基于数据结构的电梯模拟方案,提高电梯的运行效率和用户体验。

⒊系统架构在电梯模拟系统中,主要包括以下几个部分:电梯控制器、电梯队列、乘客请求队列和电梯状态管理模块。

电梯控制器负责接收乘客的请求并将其分配给特定的电梯,电梯队列记录电梯所在楼层和运行方向,乘客请求队列保存尚未得到满足的乘客请求,电梯状态管理模块负责监控电梯的状态和运行情况。

⒋数据结构设计⑴电梯队列电梯队列使用循环数组来保存电梯所在楼层和运行方向。

每个电梯对应一个循环数组,数组中的每个元素表示一个楼层的状态,包括空闲、上升和下降。

⑵乘客请求队列乘客请求队列使用链表来保存尚未得到满足的乘客请求。

每个节点表示一个乘客请求,包括乘客所在楼层和目标楼层。

⑶电梯状态管理模块电梯状态管理模块使用状态机来管理电梯的状态和运行情况。

状态机包括电梯的空闲状态、运行状态和停止状态。

⒌算法设计⑴电梯调度算法电梯调度算法负责根据乘客的请求选择最佳的电梯响应。

常用的电梯调度算法包括最短路径算法、最佳负载均衡算法等。

⑵电梯运行算法电梯运行算法负责根据电梯的状态和所运载乘客的请求,确定电梯下一步的行动。

常用的电梯运行算法包括最近停靠楼层算法、深度优先搜索算法等。

⒍实现和测试在本章节中,将介绍电梯模拟系统的实现细节和测试方法。

主要包括编程语言的选择、具体实现算法的具体实现和性能测试。

⒎总结和展望在本章节中,将总结本文提出的电梯模拟方案的优点和不足,提出可能的改进方向,并展望未来可能的研究方向。

数据结构——电梯模拟的报告

数据结构——电梯模拟的报告

数据结构——电梯模拟的报告数据结构——电梯模拟的报告1. 简介本文档将介绍电梯模拟的实现过程和基本原理。

通过模拟电梯的行为,我们可以更好地理解数据结构在实际应用中的作用和效果。

2. 问题描述在楼房中,电梯通常被用来运送乘客。

电梯内部有多个按钮,表示不同楼层的乘客需求。

乘客可以按下按钮来请求乘坐电梯到达特定楼层。

电梯的运行顺序应该是合理的,比如不会从高楼层下降到低楼层。

本模拟的电梯系统需要满足以下要求:- 电梯能接收来自乘客的请求。

- 电梯能根据请求的楼层,按照合理的顺序运行,将乘客送到目标楼层。

- 当电梯到达目标楼层,乘客可以进入或离开电梯。

- 电梯需要实时更新运行状态,如目标楼层、当前楼层等。

3. 数据结构设计为了实现电梯模拟,我们需要设计合适的数据结构来存储电梯的状态和乘客请求。

以下是我们设计的关键数据结构:3.1 电梯状态电梯的状态包括当前楼层、目标楼层和运行方向等信息。

我们可以使用一个结构体来表示电梯的状态:```c++struct ElevatorState {int currentFloor;int targetFloor;Direction direction;};```其中,`currentFloor`表示当前所在楼层,`targetFloor`表示目标楼层,`direction`表示电梯的运行方向。

3.2 乘客请求乘客请求包括乘客所在楼层和目标楼层。

我们可以使用一个结构体来表示乘客请求:```c++struct Request {int fromFloor;int toFloor;};```其中,`fromFloor`表示乘客所在楼层,`toFloor`表示目标楼层。

3.3 电梯控制器电梯控制器用于管理电梯的状态和乘客请求。

我们可以使用一个队列来存储乘客请求,使用一个变量来保存电梯的当前状态。

以下是电梯控制器的设计:```c++class ElevatorController {private:std::queue<Request> requests;ElevatorState state;public:void addRequest(Request request);void processRequests();};```其中,`addRequest`方法用于添加乘客请求到队列中,`processRequests`用于处理乘客请求并控制电梯的运行。

数据结构设计--电梯模拟系统

数据结构设计--电梯模拟系统

[目录1.引言 ...................................................... 错误!未定义书签。

2.需求分析................................................... 错误!未定义书签。

3. 概要设计.................................................. 错误!未定义书签。

数据结构描述............................................. 错误!未定义书签。

模块设计................................................. 错误!未定义书签。

电梯的模拟流程图......................................... 错误!未定义书签。

4详细设计及实现............................................. 错误!未定义书签。

%全局变量的定义........................................... 错误!未定义书签。

人具体情况的定义......................................... 错误!未定义书签。

队、栈的类型............................................. 错误!未定义书签。

.电梯类型................................................ 错误!未定义书签。

系统类的定义............................................. 错误!未定义书签。

5.调试分析................................................... 错误!未定义书签。

仿真电梯实训报告

仿真电梯实训报告

一、实训目的随着城市化进程的加快,电梯作为高层建筑中不可或缺的交通工具,其安全性、舒适性和智能化水平越来越受到人们的关注。

为了提高我国电梯行业从业人员的专业技能,本实训旨在通过仿真电梯系统的操作和调试,让学生掌握电梯的基本结构、工作原理和操作技能,提高学生的实际动手能力和故障排除能力。

二、实训时间2023年3月15日——2023年3月20日三、实训地点XX职业技术学院电气工程系电梯实训室四、实训内容1. 仿真电梯系统概述仿真电梯系统主要由以下几部分组成:控制系统、驱动系统、轿厢、门系统、井道等。

通过仿真电梯系统,学生可以了解电梯的基本结构和工作原理,掌握电梯的安装、调试和维护技能。

2. 仿真电梯控制系统操作(1)系统启动:打开电源,进入电梯控制系统界面。

(2)设置参数:根据实际需求设置电梯的运行参数,如速度、楼层、开门时间等。

(3)操作电梯:通过控制面板上的按钮进行电梯的启动、停止、开门、关门等操作。

(4)故障排除:根据电梯运行过程中的故障现象,分析故障原因,进行相应的处理。

3. 仿真电梯驱动系统操作(1)检查驱动系统:检查电机、电缆、减速器等部件的完好情况。

(2)调整驱动系统:根据实际需求调整驱动系统的参数,如电机转速、减速器传动比等。

(3)运行测试:启动电梯,进行驱动系统的运行测试,确保系统运行正常。

4. 仿真电梯轿厢、门系统和井道操作(1)检查轿厢、门系统和井道:检查轿厢、门系统和井道的完好情况。

(2)调整轿厢、门系统和井道:根据实际需求调整轿厢、门系统和井道的参数,如轿厢尺寸、门开合速度等。

(3)运行测试:启动电梯,进行轿厢、门系统和井道的运行测试,确保系统运行正常。

五、实训成果1. 学生掌握了仿真电梯的基本结构和工作原理。

2. 学生熟悉了仿真电梯控制系统的操作方法。

3. 学生具备了一定的故障排除能力。

4. 学生提高了实际动手能力和团队协作能力。

六、实训心得1. 仿真电梯实训有助于提高学生的专业技能,为今后从事电梯行业打下坚实基础。

java电梯模拟系统

java电梯模拟系统

目录第一章问题描述 (3)第二章使用语言及涉及的知识 (3)第三章界面设计 (3)第四章模块设计 (7)1.启动界面: (7)2.管理界面(主界面): (7)3.情境模拟界面 (7)4.更改用户楼层: (7)5.设置电梯信息: (8)6.关于: (8)第五章详细设计 (8)1.本程序总共有15个类: (8)2.各类之间的关系:(如下图) (8)3.主要类的属性和主要方法图: (9)第六章程序测试 (10)第七章关键代码段 (15)1.启动电梯: (15)2.电梯载人: (22)3.电梯到达目标层停止: (22)4.电梯门开关: (23)第八章程序缺点及其扩展 (24)1.程序的缺点: (24)2.程序扩展: (25)第一章问题描述电梯管理算法某一幢楼20层,有两部互联的电梯。

基于线程思想,编写一个电梯调度程序。

要求:a)每个电梯里面应该有一些按键:数字键,开门键,关门键等。

b)每层楼的每部电梯门口,应该有上行和下行按钮。

c)两部电梯门口的按钮是互联的,即当一个电梯的按钮按下去的时候,其他电梯的相应按钮也同时点亮,表示也按下去了。

d)调度算法是根据这两部电梯的状态,寻找离当前楼层最近的且和请求同方向的电梯予以响应。

e)所有电梯初始状态都在第一层。

每个电梯如果在它的上层或者下层没有相应请求情况下,则应该停在原地不动。

第二章使用语言及涉及的知识使用语言:Java涉及的知识: java基础知识,Java界面编程,Java绘图技术,Java多线程编程第三章界面设计程序启动界面:程序主界面:情境模拟界面电梯外面:电梯里面更改用户楼层初始化电梯信息界面:版本信息界面:第四章模块设计1.启动界面:在程序启动时,首先启动一个闪屏,显示程序的基本信息,使用户对程序的名称及功能有个大致的印象。

2.管理界面(主界面):管理界面主要分为两大部分,即AB电梯的按钮及显示屏,而每部电梯都包括外面版和内面板。

外面版由上下行按钮和液晶屏组成,内面板包括数字键(楼层号)和开关门键。

模拟电梯的设计与实现实验报告(微机原理)

模拟电梯的设计与实现实验报告(微机原理)

2011年9月目录一理论部分 (2)1课题要求与内容 (2)2 系统方案设计 (3)3 系统硬件设计 (3)4 系统软件设计 (5)二实践部分 (5)1 系统硬件原理简介 (6)2 系统硬件调试中出现的问题及解决措施 (6)3 系统软件 (6)3.1 软件设计 (6)3.2软件调试中出现的问题及解决措施 (6)三附录 (10)一、理论部分理论设计课题名称:模拟电梯的设计与实现1课题要求与内容1.1设计基本要求用键盘、按钮、发光二极管和LED显示单元来模拟电梯工作过程。

楼层设为8层,用键盘键入希望停的楼层,8 个发光二极管显示希望停的楼层,LED 指示电梯当前所在楼层,按钮用来启、停电梯。

电梯正常运行时以每 2 秒1层的速度上升或下降。

并在到达相关楼层时发错声音提示。

1.2提高要求设计几个按钮,模拟更多的电梯运行功能,如:直达按钮。

若按此按钮,电梯按直达方式运行,即对运行期间新键入的停靠楼层(即使是同方向未到楼层)亦不停,直达终点楼层;急停按钮。

电梯运行中,若按此按钮,则电梯立即停在下一到达的楼层。

2.实验内容电梯工作按以下方式运行:2.1假设当前电梯停在某层(LED显示相应楼层,8个发光二极管全灭)。

键入数字键,如键入的数字与当前电梯停靠层相同,则什么也不做,若不同则相应楼层的发光二极管亮;电梯自动判别上升或下降(在运行过程中用八段码来显示楼层变化)一直到达希望停的楼层(八段码显示该楼层,相应LED 灭)。

2.2假设当前电梯正在上升或下降运行(此时八段码显示楼层变化,LED 指示希望抵达的楼层),若键入新的希望停靠的楼层数字(相应的LED 亮),则对同方向(上升或下降)未到的楼层能停靠,对其它情况则先停靠原先希望停的楼层,然后继续运行)。

如下几例:1)设电梯当前在2层,向上运行,LED指示希望在4层停,此时若键入3,则电梯将在3楼停,然后继续运行至4层停;2)同上情况,若键入的不是3而是5,则电梯将先停在4层,然后运行至5层停;同上情况,若键入的不是3(或5),而是1,则电梯先停在4层,然后运行至1层停。

数据结构课程设计报告--电梯模拟

数据结构课程设计报告--电梯模拟

课程设计课程名称数据结构题目名称 2.8电梯模拟(难度5) 学生学院计算机学院专业班级 XXXXXXXXXX 学号XXXXXXXX学生姓名 XXX 指导教师 XX2013年7月4日电梯模拟系统一、简单介绍1、问题描述设计一个电梯模拟系统,这是一个离散的模拟程序,因为电梯系统是乘客和电梯等“活动体”构成的集合,虽然他们彼此交互作用,但他们的行为是基本独立的,在离散的模拟中,以模拟时钟决定每个活动体的动作发生的时刻和顺序,系统在某个模拟瞬间处理有待完成的各种事情,然后把模拟时钟推进到某个动作预定要发生的下一个时刻。

2、基本要求(1)、模拟某校五层教学楼的电梯系统。

该楼有一个自动电梯,能在每层停留。

五个楼层由下至上依次称为地下层、第一层、第二层、第三层,第四层,其中第一层是大楼的进出层,即是电梯的“本垒层”,电梯“空闲”时,将来到该层候命。

(2)、乘客可随机地进出于任何层。

对每个人来说,他有一个能容忍的最长等待时间,一旦等候电梯时间过长,他将放弃。

(3)、模拟时钟从0开始,时间单位为0.1秒。

人和电梯的各种动作均要消耗一定的时间单位(简记为t),比如:有人进出时,电梯每隔40t测试一次,若无人进出,则关门;关门和开门各需要20t;每个人进出电梯均需要25t;如果电梯在某层静止时间超过300t,则驶回1层侯命。

(4)、按时序显示系统状态的变化过程:发生的全部人和电梯的动作序列。

二、设计目的当初之所以选择做电梯模拟这个课题,主要是因为觉得当今时代需要,所以觉得想尝试一下,因为为了方便,我们都会选择乘坐电梯,既省时间又省力,粗略看了书本里面的描述,觉得应该不难,只是按照要求输出动作序列即可,后来经过老师的辅导,才发现,原来自己选了个最难的课程设计,也问了同学,很多都是因为太难了才没有选这个题目,因为它远比想象中的复杂的多很多,它实际上是模拟现实中的电梯的运行状况,因此要考虑很多现实中遇到的实际情况,坐过电梯的人都会应该有点印象,现实中的电梯是按照每个人按下按钮的时间顺序进行服务的,但是,并不是将一个人接进来后就直接开往其目的楼层就完事,其实,当电梯将某个人送往其目的楼层的过程中,经过某层时,如果此层的人也要用电梯,虽然其按按钮的时间有可能比先前那个人晚,但是电梯依旧会开门将其接入,然后继续送前一个人去目的地,之后再送这个人去他的目的楼层,如果有多人在电梯中时,也是按照申请时间的先后决定先去哪层的,同理,若在某层,电梯中的某个人,或者某几个人要在该层下,电梯也不能忽略这些,而是要先开门使要下的人出去,之后继续开往先前的楼层,所以设计时,每当电梯上升或下降一层后,都应该检测现在电梯所处的这层有没有人有用电梯的请求,或者电梯中的人有没有要在该层下的情况,若有则电梯要在该层停一下,否则继续上升或下降….此外,当电梯停在某一层时不外乎三种情况:1.此层有个人{或有几个人}等候要用电梯 2.电梯中的某个人或者某几个人要在该楼层下 3.则是前面两种情况的结合,此时情况相当复杂,因为,题目要求电梯开门和关门都要消耗一定的时间(题目中没有提电梯上升或者下降一层需要多少时间,所以不妨就假定为30t),而且人进电梯和人出电梯时也要消耗一定的时间,这说明了当同一时刻有至少两个以上的人要进行同一种动作的时候(比方说都是要出电梯,或都是在某一层等电梯,电梯来了后都要进去),但是因为每个人进出电梯都要消耗时间,所以不能单纯的同时让这些人同进或同出电梯,而是要有先后顺序的进出,此为其一………其二,题目中还提到每个人等候电梯到来时,都有一个容忍时间(每个人不一定相同),所以,万一,在他按下按钮到电梯开到他所在的那层楼的间隔时间大于他的最大容忍时间,他会先行离开,但这一切电梯并不知道啊,所以电梯依旧会按照每个申请使用电梯的时间进行服务,正是因为这样,极有可能发生这样的情况:电梯开到某层后打开电梯门,但是既没有人出去,也没有人进来………其三,根据题目中的要求,当电梯停在某层时候,有人进出,电梯每隔40t测试一次,若无人进出,则关门,关门完后,若300t时间内没有人使用,则自动开到第1层等候下次的使用(第1层楼是电梯的‘本垒层’,电梯“空闲”时,将来到该层候命)等等等等…………以上各种情况(还有一些情况这里没列举)都是要在做这道题时需要考虑的,否则这题的‘电梯’根本模拟不起来三、设计概要本程序中所有的抽象数据类型的定义及其相应的操作函数的定义如下:电梯的结构体dianti/*此电梯结构体中分别定义了电梯所在楼层,电梯的现有人数(现实中的电梯有个最大栽客量,在此题中不妨规定为最大12人),以及电梯门的状态(0为关,1为开),至于为什么定义电梯门的状态,并不是多此一举,而是我在调试的过程中发现必须加上的,否则,在一些情况下会出现电梯动作的局部重复,从而导致整个程序的失败*/人的结构体man/*在人的结构体中,分别定义了人的名字(这个有利于区别各个人),最大容忍时间(题目中的要求),所在的楼层,要去的目的楼层,两个标志位,其中一个标志记录该人是否还在电梯里面,另一个标志记录的是该人是否已经使用过电梯*/事件结构体结点SLNode/*在事件的结构体中分别定义了,事件信息,事件发生的时刻,以及指向下一个事件结构结点的指针*/void ListInitiate(SLNode**head)/*初始化链表*/void LinListSort(SLNode *head)/*用按发生时间的顺序给事件链表中的事件排序*/void Destroy(SLNode * *head)/*撤消链表*/void OPEN(SLNode *head,dianti dt,int now)/*电梯开门函数,将电梯开门的事件信息插入到事件链表中去*/void CLOSE(SLNode *head,dianti dt,int now)/*电梯关门函数,将电梯关门的事件信息插入到事件链表中去*/void GET_IN(SLNode *head,dianti dt,int now)/*人进电梯的函数,将人进电梯时候的各种信息插入到事件链表中去*/void GET_OUT(SLNode *head,dianti dt,int now)/*人出电梯的函数,将人出电梯时候的各种信息插入到事件链表中去*/注释:以上四个函数基本是用来完成人和电梯的动作序列int gettime(SLNode *head)/*返回最新事件(即事件涟表最后一个结点)的发生时间,此为该程序中最重要的一个函数之一,并且为调用最频率最高的一个函数*/void print(SLNode *head)/*将事件链表中的事件一一显示出来,即为最后显示电梯和人动作序列的函数*/void Go(SLNode *head,int n,dianti dt,clock_t s[1000],man r[1000])/*电梯运行函数,本程序中最最重要的函数,可以说这是这道程序中的灵魂函数,根据申请使用电梯的所有人的信息,以及所有事件发生时的时刻,将所有情况的处理都放在在其中,所以此函数的代码相当占了程序代码的百分之七十多了(程序总代码长度超过1200行)*/ 注释:以上各个函数以及抽象数据结构的定义都放在头文件”elevator.h”中void main()/*该程序的主函数*/程序流程图如下:四、详细设计本程序的所有抽象数据类型的具体实现一机相应的操作函数的伪算法如下:typedef struct{int lc;//电梯所在楼层int rs;//电梯中的人数,规定最大乘坐人数为12int door;//门的状态0关1开}dianti;typedef struct{char name[50]; //这个人的名字或序号(以示区别)int rrsj;//一个人的容忍时间int lc;//所在楼层int md;//目的楼层int biaozhi; //此标志位记录人使用电梯是否完成或者是否离去,为1表明使用过(离去),否则为0int in; //标志位,为1时表明人在电梯中,否则为0}man;typedef struct Node{char a[1000];//事件信息int mytime;//事件所发生的时间struct Node *next;}SLNode;//初始化链表void ListInitiate(SLNode* *head){if((*head = (SLNode *)malloc(sizeof(SLNode))) == NULL) exit(1);(*head)->next = NULL;}//将事件结点插入到事件链表中的第i个位置中去int ListInsert(SLNode *head,int i,char a[1000],int t){SLNode *p,*q;int j;p=head;j=-1;while(p->next!=NULL && j<i-1){p=p->next;j++;}if(j!=i-1){printf("\n 插入位置参数错!\n");return 0;}if((q=(SLNode *)malloc(sizeof(SLNode))) == NULL) exit(1);q->mytime = t;strcpy(q->a,a);q->next =p->next;p->next =q;return 1;}//用按发生时间的顺序给事件排序void LinListSort(SLNode *head){SLNode *curr,*pre,*p,*q;p=head->next;head->next=NULL;while(p!=NULL){curr=head->next;pre=head;while(curr!=NULL && curr->mytime<=p->mytime){pre=curr;curr=curr->next;}q=p;p=p->next;q->next=pre->next;pre->next=q;}}//销毁链表void Destroy(SLNode * *head){SLNode *p,*p1;p=*head;while(p!=NULL){p1=p;p=p->next;free(p1);}*head = NULL;/*电梯动作:1.开始开门,20t,开门结束;2.开始关门,20t,关门结束;3.从n-1层开始移动,30t,到达第n层;4.开始等待,有人来或者300t,等待结束;人的动作:1.开始等待,x<=最大容忍时间,等待结束;2.开始进门,25t,进门结束;3.开始出门,25t,出门结束;*///电梯开门void OPEN(SLNode *head,dianti dt,int now){char a[1000]={"电梯开始开门......"},b[1000]={"开门完毕!"};ListInsert(head,g,a,now);g++;ListInsert(head,g,b,now+20);g++;dt.door=1; //门的状态为开}//电梯关门void CLOSE(SLNode *head,dianti dt,int now){char a[1000]={"电梯开始关门......"},b[1000]={"关门完毕!"};ListInsert(head,g,a,now);g++;ListInsert(head,g,b,now+20);g++;dt.door=0; //门的状态为关}//人进电梯void GET_IN(SLNode *head,dianti dt,int now){char a[1000]={"人开始进门......"},b[1000]={"已经进入!"};ListInsert(head,g,a,now);g++;ListInsert(head,g,b,now+25);g++;dt.rs++; //电梯人数加一个}//人出电梯void GET_OUT(SLNode *head,dianti dt,int now){char a[1000]={"人开始出门......"},b[1000]={"已经出门!"};ListInsert(head,g,a,now);g++;ListInsert(head,g,b,now+25);g++;dt.rs--; //电梯中的人数减一个}//返回最新事件(即事件涟表最后一个结点)的发生时间int gettime(SLNode *head){SLNode *pre,*curr;curr=head->next;pre=head;while(curr!=NULL){pre=curr;curr=curr->next;}return pre->mytime;}//电梯运行函数void Go(SLNode *head,int n,dianti dt,clock_t s[1000],man r[1000]){int k=0,i,time,m,flag=0,counter=0; //flag 记录是否有多个人在同一层或去同一层楼for(i=0;i<n;i++){if(dt.door==0){ //初始电梯门状态为关着if(dt.lc==r[i].lc&&dt.rs<12&&r[i].biaozhi==0&&r[i].in==0){//人在该楼层,要进去电梯,且电梯人数不超过规定的12人if(i==0) time=s[i]/100; //记录当时时间else time=gettime(head);if(flag==0&&dt.door==0){OPEN(head,dt,time); //开门dt.door=1;}if((time-s[i]/100)<=r[i].rrsj){time=gettime(head);GET_IN(head,dt,time); //若超过此人的最大容忍时间,该人将放弃乘坐电梯r[i].in=1;}else if(((time-s[m]/100)>r[m].rrsj)&&r[m].biaozhi==0){r[m].biaozhi=1;printf("\n此时有人离开,以下为离开的人的信息:\n");printf("时间:%d(单位:t) 发生的事件超过用户的容忍时间,第%d 层楼的人已经离去~~\n",s[m]/100+r[m].rrsj,dt.lc);}time=gettime(head); //获得事件链表最后一个结点的时间(即当前时刻)if(dt.lc==r[i+1].lc) {flag=1;counter++;continue;} //该层的所有人都进入电梯else{if(dt.door==1){time=gettime(head);ListInsert(head,g,"该层已无人进出,关门",time+40); //电梯经过40t时间后,若无人进出,则关门dt.door=0; //置电梯门状态为关g++;CLOSE(head,dt,time+40);}}/* 本层人已经全部进入电梯,接下来电梯启动按每个人事件发生的时间顺序将其送往目的楼层*/flag=0;if(dt.lc<=r[i-counter].md){time=gettime(head);while(dt.lc<=r[i-counter].md){ //开往该层第一个人的目的楼层flag=0;if(dt.lc<r[i-counter].md){dt.lc++;time+=30;}for(m=0;m<n;m++){if(dt.lc==r[m].lc&&r[m].biaozhi==0&&r[m].in==0&&dt.rs<12){//若该楼层有人等候,使其进入if(flag==0&&dt.door==0){OPEN(head,dt,time);dt.door=1;//电梯开门,并设置其门状态为开}if((time-s[m]/100)<=r[m].rrsj){time=gettime(head);GET_IN(head,dt,time);r[m].in=1;}else if(((time-s[m]/100)>r[m].rrsj)&&r[m].biaozhi==0){r[m].biaozhi=1;printf("\n此时有人离开,以下为离开的人的信息:\n");printf("时间:%d(单位:t) 发生的事件超过用户的容忍时间,第%d层楼的人已经离去~~\n",s[m]/100+r[m].rrsj,dt.lc);}flag=1;}//若该楼层有人要出去,使其出电梯,置其状态为1表示该人已经使用过电梯else if(dt.lc==r[m].md&&r[m].biaozhi==0&&r[m].in==1){if(flag==0&&dt.door==0){OPEN(head,dt,time);dt.door=1;}time=gettime(head);GET_OUT(head,dt,time);r[m].biaozhi=1;r[m].in=0;flag=1;}}if(dt.lc==r[i-counter].md) break;if(dt.door==1){time=gettime(head);ListInsert(head,g,"该层已无人进出,关门",time+40); //电梯经过40t时间后,若无人进出,则关门dt.door=0;//置电梯门状态为关g++;CLOSE(head,dt,time+40);time=gettime(head);}}if(dt.door==1){time=gettime(head);ListInsert(head,g,"该层已无人进出,关门",time+40);dt.door=0;g++;CLOSE(head,dt,time+40);}}else if(dt.lc>=r[i-counter].md){time=gettime(head);while(dt.lc>=r[i-counter].md){flag=0;if(dt.lc>r[i-counter].md){dt.lc--; //30t,电梯下降一层time+=30;}for(m=0;m<n;m++){if(dt.lc==r[m].lc&&r[m].biaozhi==0&&r[m].in==0&&dt.rs<12){ //若该楼层有人等候,使其进入if(flag==0&&dt.door==0){OPEN(head,dt,time);dt.door=1;}if((time-s[m]/100)<=r[m].rrsj){time=gettime(head);GET_IN(head,dt,time);r[m].in=1;}else if(((time-s[m]/100)>r[m].rrsj)&&r[m].biaozhi==0){r[m].biaozhi=1;printf("\n此时有人离开,以下为离开的人的信息:\n");printf("时间:%d(单位:t) 发生的事件超过用户的容忍时间,第%d层楼的人已经离去~~\n",s[m]/100+r[m].rrsj,dt.lc);}flag=1;}//若该楼层有人要出去,使其出电梯,置其状态为1表示该人已经使用过电梯else if(dt.lc==r[m].md&&r[m].biaozhi==0&&r[m].in==1){if(flag==0&&dt.door==0){OPEN(head,dt,time);dt.door=1;}time=gettime(head);GET_OUT(head,dt,time);r[m].biaozhi=1;r[m].in=0;flag=1;}}if(dt.lc==r[i-counter].md) break;if(dt.door==1){time=gettime(head);ListInsert(head,g,"该层已无人进出,关门",time+40);dt.door=0;g++;CLOSE(head,dt,time+40);time=gettime(head);}}if(dt.door==1){time=gettime(head);ListInsert(head,g,"该层已无人进出,关门",time+40);dt.door=0;g++;CLOSE(head,dt,time+40);}}i=i-counter;}else if(dt.lc==r[i].md&&r[i].biaozhi==0&&r[i].in==1){ //人在电梯中,在该楼层要出去if(i==0)time=s[0]/100;else time=gettime(head);for(m=0;m<n;m++){if(dt.lc==r[m].lc&&r[m].biaozhi==0&&r[m].in==0&&dt.rs<12){ //若该楼层有人等候,使其进入if(flag==0&&dt.door==0){OPEN(head,dt,time);dt.door=1;}if((time-s[m]/100)<=r[m].rrsj){time=gettime(head);GET_IN(head,dt,time);r[m].in=1;}else if(((time-s[m]/100)>r[m].rrsj)&&r[m].biaozhi==0){r[m].biaozhi=1;printf("\n此时有人离开,以下为离开的人的信息:\n");printf("时间:%d(单位:t) 发生的事件超过用户的容忍时间,第%d层楼的人已经离去~~\n",s[m]/100+r[m].rrsj,dt.lc);}flag=1;}//若该楼层有人要出去,使其出电梯,置其状态为1表示该人已经使用过电梯else if(dt.lc==r[m].md&&r[m].biaozhi==0&&r[m].in==1){if(flag==0&&dt.door==0){OPEN(head,dt,time);dt.door=1;}time=gettime(head);GET_OUT(head,dt,time);r[m].biaozhi=1;r[m].in=0;flag=1;}}if(dt.door==1){time=gettime(head);ListInsert(head,g,"该层已无人进出,关门",time+40);dt.door=0;g++;CLOSE(head,dt,time+40);}}//1...if(dt.lc==r[i].lc&&dt.rs<12&&r[i].biaozhi==0&&r[i].in==0) ,,,,人在该楼层,要进去电梯//2...else if(dt.lc==r[i].md&&r[i].biaozhi==0&&r[i].in==1),,,,,,,,,,人在电梯中,在该楼层要出去//3...else if(dt.lc!=r[i].lc&&dt.rs<12&&r[i].biaozhi==0&&r[i].in==0),,,,,,,,,,,人不在该楼层,要进去电梯//4...else if(dt.lc!=r[i].md&&r[i].biaozhi==0&&r[i].in==1),,,,,,,,,,,人在电梯里,该楼层不是其目的楼层else if(dt.lc!=r[i].lc&&dt.rs<12&&r[i].biaozhi==0&&r[i].in==0){ //3...人不在该楼层,要进去电梯flag=0;if(i==0)time=s[0]/100; //以该事件发生的时间为起始时间else time=gettime(head); //取当前时间if(dt.lc<=r[i].lc){while(dt.lc<=r[i].lc){flag=0;if(dt.lc<r[i].lc){dt.lc++;time+=30;//30t,电梯上升一层}for(m=0;m<n;m++){//若该楼层有人等候,使其进入if(dt.lc==r[m].lc&&r[m].biaozhi==0&&r[m].in==0&&dt.rs<12){if(flag==0&&dt.door==0){OPEN(head,dt,time);dt.door=1;}if((time-s[m]/100)<=r[m].rrsj){time=gettime(head);GET_IN(head,dt,time);r[m].in=1;}elseif(((time-s[m]/100)>r[m].rrsj)&&r[m].biaozhi==0){r[m].biaozhi=1;printf("\n此时有人离开,以下为离开的人的信息:\n");printf("时间:%d(单位:t) 发生的事件超过用户的容忍时间,第%d层楼的人已经离去~~\n",s[m]/100+r[m].rrsj,dt.lc);}flag=1;}//若该楼层有人要出去,使其出电梯,置其状态为1表示该人已经使用过电梯elseif(dt.lc==r[m].md&&r[m].biaozhi==0&&r[m].in==1){if(flag==0&&dt.door==0){OPEN(head,dt,time);dt.door=1;}time=gettime(head);GET_OUT(head,dt,time);r[m].biaozhi=1;r[m].in=0;flag=1;}}if(dt.lc==r[i].lc) break;if(dt.door==1){time=gettime(head);ListInsert(head,g,"该层已无人进出,关门",time+40);dt.door=0;g++;CLOSE(head,dt,time+40);time=gettime(head);}}if(dt.door==1){time=gettime(head);ListInsert(head,g,"该层已无人进出,关门",time+40);dt.door=0;g++;CLOSE(head,dt,time+40);time=gettime(head);}}else if(dt.lc>=r[i].lc){while(dt.lc>=r[i].lc){flag=0;if(dt.lc>r[i].lc){dt.lc--;time+=30;}for(m=0;m<n;m++){//若该楼层有人等候,使其进入if(dt.lc==r[m].lc&&r[m].biaozhi==0&&r[m].in==0&&dt.rs<12){if(flag==0&&dt.door==0){OPEN(head,dt,time);dt.door=1;}if((time-s[m]/100)<=r[m].rrsj){time=gettime(head);GET_IN(head,dt,time);r[m].in=1;}elseif(((time-s[m]/100)>r[m].rrsj)&&r[m].biaozhi==0){r[m].biaozhi=1;printf("\n此时有人离开,以下为离开的人的信息:\n");printf("时间:%d(单位:t) 发生的事件超过用户的容忍时间,第%d层楼的人已经离去~~\n",s[m]/100+r[m].rrsj,dt.lc);}flag=1;}//若该楼层有人要出去,使其出电梯,置其状态为1表示该人已经使用过电梯elseif(dt.lc==r[m].md&&r[m].biaozhi==0&&r[m].in==1){if(flag==0&&dt.door==0){OPEN(head,dt,time);dt.door=1;}time=gettime(head);GET_OUT(head,dt,time);r[m].biaozhi=1;r[m].in=0;flag=1;}}if(dt.lc==r[i].lc) break;if(dt.door==1){time=gettime(head);ListInsert(head,g,"该层已无人进出,关门",time+40);dt.door=0;g++;CLOSE(head,dt,time+40);time=gettime(head);}}if(dt.door==1){time=gettime(head);ListInsert(head,g,"该层已无人进出,关门",time+40);dt.door=0;g++;CLOSE(head,dt,time+40);}}/*接下来将电梯里的人按时间顺序送到各自的目的楼层*/time=gettime(head);if(dt.lc<=r[i].md&&r[i].in==1){while(dt.lc<=r[i].md){flag=0;if(dt.lc<r[i].md){dt.lc++;}for(m=0;m<n;m++){//若该楼层有人等候,使其进入if(dt.lc==r[m].lc&&r[m].biaozhi==0&&r[m].in==0&&dt.rs<12){if(flag==0&&dt.door==0){OPEN(head,dt,time);dt.door=1;}if((time-s[m]/100)<=r[m].rrsj){time=gettime(head);GET_IN(head,dt,time);r[m].in=1;}elseif(((time-s[m]/100)>r[m].rrsj)&&r[m].biaozhi==0){r[m].biaozhi=1;printf("\n此时有人离开,以下为离开的人的信息:\n");printf("时间:%d(单位:t) 发生的事件超过用户的容忍时间,第%d层楼的人已经离去~~\n",s[m]/100+r[m].rrsj,dt.lc);}flag=1;}//若该楼层有人要出去,使其出电梯,置其状态为1表示该人已经使用过电梯elseif(dt.lc==r[m].md&&r[m].biaozhi==0&&r[m].in==1){if(flag==0&&dt.door==0){OPEN(head,dt,time);dt.door=1;}time=gettime(head);GET_OUT(head,dt,time);r[m].biaozhi=1;r[m].in=0;flag=1;}}if(dt.lc==r[i].md) break;if(dt.door==1){time=gettime(head);ListInsert(head,g,"该层已无人进出,关门",time+40);g++;CLOSE(head,dt,time+40);time=gettime(head);}}if(dt.door==1){time=gettime(head);ListInsert(head,g,"该层已无人进出,关门",time+40);dt.door=0;g++;CLOSE(head,dt,time+40);}}else if(dt.lc>=r[i].md&&r[i].in==1){while(dt.lc>=r[i].md){flag=0;if(dt.lc>r[i].md){dt.lc--;time+=30;}for(m=0;m<n;m++){//若该楼层有人等候,使其进入if(dt.lc==r[m].lc&&r[m].biaozhi==0&&r[m].in==0&&dt.rs<12){if(flag==0&&dt.door==0){OPEN(head,dt,time);dt.door=1;}if((time-s[m]/100)<=r[m].rrsj){time=gettime(head);GET_IN(head,dt,time);r[m].in=1;}elseif(((time-s[m]/100)>r[m].rrsj)&&r[m].biaozhi==0){r[m].biaozhi=1;printf("\n此时有人离开,以下为离开的人的信息:\n");printf("时间:%d(单位:t) 发生的事件超过用户的容忍时间,第%d层楼的人已经离去~~\n",s[m]/100+r[m].rrsj,dt.lc);}flag=1;}//若该楼层有人要出去,使其出电梯,置其状态为1表示该人已经使用过电梯elseif(dt.lc==r[m].md&&r[m].biaozhi==0&&r[m].in==1){if(flag==0&&dt.door==0){OPEN(head,dt,time);dt.door=1;}time=gettime(head);GET_OUT(head,dt,time);r[m].biaozhi=1;r[m].in=0;flag=1;}}if(dt.lc==r[i].md) break;if(dt.door==1){time=gettime(head);ListInsert(head,g,"该层已无人进出,关门",time+40);dt.door=0;g++;CLOSE(head,dt,time+40);time=gettime(head);}}if(dt.door==1){time=gettime(head);ListInsert(head,g,"该层已无人进出,关门",time+40);dt.door=0;g++;CLOSE(head,dt,time+40);}}}//1...if(dt.lc==r[i].lc&&dt.rs<12&&r[i].biaozhi==0&&r[i].in==0) ,,,,人在该楼层,要进去电梯//2...else if(dt.lc==r[i].md&&r[i].biaozhi==0&&r[i].in==1),,,,,,,,,,人在电梯中,在该楼层要出去//3...else if(dt.lc!=r[i].lc&&dt.rs<12&&r[i].biaozhi==0&&r[i].in==0),,,,,,,,,人不在该楼层,要进去电梯else if(dt.lc!=r[i].md&&r[i].biaozhi==0&&r[i].in==1){ //4...人在电梯里,该楼层不是其目的楼层flag=0;if(i==0)time=s[0]/100; //以该事件发生的时间为起始时间else time=gettime(head); //取当前时间if(dt.lc<=r[i].md){while(dt.lc<=r[i].md){flag=0;if(dt.lc<r[i].md){dt.lc++;time+=30;}for(m=0;m<n;m++){//若该楼层有人等候,使其进入if(dt.lc==r[m].lc&&r[m].biaozhi==0&&r[m].in==0&&dt.rs<12){if(flag==0&&dt.door==0){OPEN(head,dt,time);dt.door=1;}if((time-s[m]/100)<=r[m].rrsj){time=gettime(head);GET_IN(head,dt,time);r[m].in=1;}else if(((time-s[m]/100)>r[m].rrsj)&&r[m].biaozhi==0){r[m].biaozhi=1;printf("\n此时有人离开,以下为离开的人的信息:\n");printf("时间:%d(单位:t) 发生的事件超过用户的容忍时间,第%d层楼的人已经离去~~\n",s[m]/100+r[m].rrsj,dt.lc);}flag=1;}//若该楼层有人要出去,使其出电梯,置其状态为1表示该人已经使用过电梯else if(dt.lc==r[m].md&&r[m].biaozhi==0&&r[m].in==1){if(flag==0&&dt.door==0){OPEN(head,dt,time);dt.door=1;}time=gettime(head);time=gettime(head);GET_OUT(head,dt,time);r[m].biaozhi=1;r[m].in=0;flag=1;}}if(dt.lc==r[i].md) break;if(dt.door==1){time=gettime(head);ListInsert(head,g,"该层已无人进出,关门",time+40);dt.door=0;g++;CLOSE(head,dt,time+40);time=gettime(head);}}if(dt.door==1){time=gettime(head);ListInsert(head,g,"该层已无人进出,关门",time+40);dt.door=0;g++;CLOSE(head,dt,time+40);}}else if(dt.lc>=r[i].md){while(dt.lc>=r[i].md){flag=0;if(dt.lc>r[i].md){dt.lc--;time+=30;}for(m=0;m<n;m++){//若该楼层有人等候,使其进入if(dt.lc==r[m].lc&&r[m].biaozhi==0&&r[m].in==0&&dt.rs<12){if(flag==0&&dt.door==0){OPEN(head,dt,time);dt.door=1;}if((time-s[m]/100)<=r[m].rrsj){time=gettime(head);GET_IN(head,dt,time);r[m].in=1;}else if(((time-s[m]/100)>r[m].rrsj)&&r[m].biaozhi==0){r[m].biaozhi=1;printf("\n此时有人离开,以下为离开的人的信息:\n");printf("时间:%d(单位:t) 发生的事件超过用户的容忍时间,第%d层楼的人已经离去~~\n",s[m]/100+r[m].rrsj,dt.lc);}flag=1;}//若该楼层有人要出去,使其出电梯,置其状态为1表示该人已经使用过电梯else if(dt.lc==r[m].md&&r[m].biaozhi==0&&r[m].in==1){if(flag==0&&dt.door==0){OPEN(head,dt,time);dt.door=1;}time=gettime(head);GET_OUT(head,dt,time);r[m].biaozhi=1;r[m].in=0;flag=1;}}if(dt.lc==r[i].md) break;if(dt.door==1){time=gettime(head);ListInsert(head,g,"该层已无人进出,关门",time+40);dt.door=0;g++;CLOSE(head,dt,time+40);time=gettime(head);}}if(dt.door==1){time=gettime(head);ListInsert(head,g,"该层已无人进出,关门",time+40);dt.door=0;g++;CLOSE(head,dt,time+40);}}}}}time=gettime(head);if(dt.lc!=1){ListInsert(head,g,"在该层等候300t时间,无人进出,开始返回第一层",time+300);time=gettime(head);if(dt.lc>1){ListInsert(head,g,"电梯已经回到第一层,等候使用......",time+(dt.lc-1)*30);}else {ListInsert(head,g,"电梯已经回到第一层,等候使用......",time+30);}dt.lc=1;}else{time=gettime(head);ListInsert(head,g,"此时电梯已经在第一层,等候使用......",time);}}void print(SLNode *head){SLNode *p;p=head;if(p->next==NULL)printf("\n 错误,链表为空!\n");//此语句为检验之用while(p->next!=NULL){printf("\n时间:%d(单位:t) 动作:%s",p->next->mytime,p->next->a);p->next=p->next->next;}}//欢迎界面void Welcome(){char c;printf("\n\n\n******************************************************************************\ n");printf("______________________________________________________________________________\ n\n\n\n\n");printf(" ______________ 欢迎使用这个关于电梯模拟的软件! _______________\n");printf(" ______________ 制作者:XXX _______________\n");printf(" 班级:XXX 学号:XXXX \n\n");printf("\n\n\n________________________________________________________________~((M o M))~\n\n");printf("******************************************************************************\ n\n\n");printf(" Please input any key to continue~~");c=getche( );fflush(stdin);//不清除缓冲去会出错system("cls");}//主函数int main(){int t,a,k=0,i,flag=0;SLNode *head;//数组,用来存输入数据时候所用时间clock_t start,shijian[1000],In_put[1000][2];//为了保证输入数据时计时暂停,定义一个In_put[]dianti dt;Welcome();printf("\n\n时间单位t:0.1(秒)");printf("\n楼层范围:0--5(层)");printf("\n最大载客量:12(人)\n");start=clock();dt.lc=1; //开始电梯停在第一层dt.rs=0; //电梯最大人数为12,开始时候电梯内人数为空dt.door=0;t=(int)start/100;printf("\n当前时刻:%d(t) 计时开始.....\n",t);ListInitiate(&head);while(1){printf("\n0.下班楼空1.有人要用电梯\n");printf("请选择指令:");scanf("%d",&a);if(a==0){ printf("\n");break;}if(a==1){In_put[k][0]=clock();printf("\n暂停计时,请输入此人的序号(可以为任意字符): ");scanf("%s",ren[k].name);printf("所在楼层: ");scanf("%d",&ren[k].lc);printf("目的楼层: ");scanf("%d",&ren[k].md);printf("最大容忍时间:");scanf("%d",&ren[k].rrsj);In_put[k][1]=clock();k++;}}printf("------------------------------------------------------------------------------");printf("\n以下为要使用电梯的各个人的信息:(根据其申请使用电梯的时间先后顺序排列)\n");for(i=0;i<k;i++){int j;flag=0;for(j=0;j<i;j++){if(ren[i].lc==ren[j].lc){flag=1;break;} //判断这层是否有多个人一起等候电梯}shijian[i]=In_put[i][0]-start;if(flag==1) //若有多个人一起等候电梯,则申请电梯的时间取第一个人的时间printf("时间: %d(单位:t) 人序号:%s 所在楼层:%d 要去楼层:%d",shijian[j]/100,ren[i].name,ren[i].lc,ren[i].md);else if(flag==0)printf("时间: %d(单位:t) 人序号:%s 所在楼层:%d 要去楼层:%d 最大容忍时间:%d",shijian[j]/100,ren[i].name,ren[i].lc,ren[i].md,ren[i].rrsj);start=In_put[i][1]-In_put[i][0]; //计算输入输入数据所用时间}printf("\n------------------------------------------------------------------------------\n");shijian[i]=0;for(i=0;i<k;i++){ren[i].biaozhi=0;ren[i].in=0;}Go(head,k,dt,shijian,ren);LinListSort(head);printf("\n---------------------------------------------------------------------------\n");printf("\n以下为人和电梯的动作:");print(head);printf("\n\n---------------------------------------------------------------------------\n\n");Destroy(&head);return 0;}六、测试分析1、运行程序,进入如下界面:按任意键开始,进入如下选择界面:选择指令“1”,当只有一个人要进电梯的时候,输入数据:选择指令“0”,进入电梯模拟,操作结果如下:2、人数多于1人以及在不同楼层上下电梯的时候,输入数据:选择指令“0”,执行结果如下:七、心得体会此次选的电梯模拟对于我来说,难度实在是太大了,因为我在编程这块都不是很擅长,本来想选个简单的,结果没看清楚本题的难度系数,选了个最难的,在辅导的时候老师说电梯模拟这个最好要用栈和队列,但是由于能力有限,只能用链表来实现一些简单的基本要求,考虑的也不够周全,学的知识不够灵活应用,有些东西只是想得到,但是没有能力实现,也写不出程序。

电梯程序模拟课程设计

电梯程序模拟课程设计

电梯程序模拟课程设计一、课程目标知识目标:1. 理解电梯的基本工作原理,掌握电梯程序设计的关键概念;2. 学会使用流程图和伪代码表达程序设计思路;3. 掌握运用顺序、选择和循环结构进行电梯程序设计。

技能目标:1. 能够运用所学知识,设计出符合实际需求的电梯程序;2. 通过编程实践,提高逻辑思维和问题解决能力;3. 学会与同伴合作,进行程序调试和优化。

情感态度价值观目标:1. 培养学生对编程的兴趣,激发创新精神;2. 培养学生面对问题时的耐心和毅力,增强克服困难的信心;3. 增强学生的团队协作意识,培养良好的沟通与表达能力。

分析课程性质、学生特点和教学要求,本课程目标旨在使学生在理解电梯工作原理的基础上,通过学习程序设计方法,培养其逻辑思维和问题解决能力。

课程将引导学生从实际需求出发,学会分解问题、设计算法,并通过编程实践,实现电梯程序的模拟。

通过本课程的学习,学生将能够将所学知识应用于实际情境,提高其编程技能,并在团队合作中培养良好的沟通与协作能力。

二、教学内容1. 电梯工作原理介绍:分析电梯的基本结构、运行模式和控制系统;- 教材章节:第二章“自动控制系统原理”,第三节“电梯控制系统”。

2. 程序设计基本概念:流程图、伪代码及其在电梯程序设计中的应用;- 教材章节:第四章“程序设计基础”,第一节“流程图与伪代码”。

3. 程序设计结构:顺序结构、选择结构、循环结构在电梯程序设计中的应用;- 教材章节:第四章“程序设计基础”,第二节“程序设计结构”。

4. 电梯程序设计实践:- 任务一:设计一个简单的电梯召唤程序;- 任务二:设计一个具有楼层选择功能的电梯程序;- 任务三:优化电梯程序,实现连续召唤和节能控制。

5. 团队合作与程序调试:分组进行程序设计,相互协作完成程序调试与优化;- 教材章节:第五章“程序调试与优化”,第一节“团队合作与问题解决”。

教学内容安排与进度:第一课时:电梯工作原理介绍,程序设计基本概念;第二课时:程序设计结构,任务一设计;第三课时:任务二设计,团队合作与程序调试;第四课时:任务三优化,总结与展示。

模拟电梯课程设计方案模板

模拟电梯课程设计方案模板

一、课程名称模拟电梯控制系统课程设计二、课程背景随着现代建筑的高度化,电梯作为重要的垂直交通工具,其控制系统的研究与开发显得尤为重要。

本课程设计旨在通过模拟电梯控制系统,让学生深入了解电梯控制系统的原理、设计方法以及实现过程,培养学生的动手能力、创新能力和工程实践能力。

三、课程目标1. 理解电梯控制系统的基本原理和组成;2. 掌握电梯控制系统的设计方法;3. 熟悉常用电梯控制元器件及其应用;4. 培养学生的动手能力、创新能力和工程实践能力;5. 提高学生对电梯控制系统的认识,为今后从事电梯行业打下基础。

四、课程内容1. 电梯控制系统的基本原理与组成2. 电梯控制系统的设计方法3. 常用电梯控制元器件及其应用4. 电梯控制系统的模拟实验5. 电梯控制系统的编程与调试五、课程实施1. 教学方法:采用理论教学与实验实践相结合的方式,注重培养学生的动手能力和创新思维。

2. 教学步骤:(1)理论教学:讲解电梯控制系统的基本原理、组成、设计方法及常用元器件;(2)实验实践:学生分组完成电梯控制系统的模拟实验,包括电路设计、元器件选型、编程与调试;(3)课程设计:学生独立完成电梯控制系统的课程设计,包括设计任务书、电路图、程序代码等。

六、课程评价1. 课堂表现:包括课堂提问、讨论等;2. 实验实践:实验报告、实验成绩;3. 课程设计:设计报告、电路图、程序代码等;4. 期末考核:书面考试、答辩。

七、课程资源1. 教材:《电梯控制系统》、《可编程控制器原理与应用》等;2. 教学课件、实验指导书、设计指南等;3. 电梯控制元器件、实验器材等。

八、课程进度安排1. 第1周:课程介绍、基本原理与组成;2. 第2周:设计方法与常用元器件;3. 第3周:模拟实验(电路设计、元器件选型);4. 第4周:编程与调试;5. 第5周:课程设计(设计任务书、电路图、程序代码);6. 第6周:课程设计(答辩);7. 第7周:课程总结与评价。

1007小组-模拟电梯系统程序详细设计

1007小组-模拟电梯系统程序详细设计

1007小组-模拟电梯系统程序详细设计
版本号:Elevator-CHH-FunctionDesign-002
编制时间:2009年5月30日
编制人员:崔元硕、陈宏立、李冠豪、韩飞
1.1模块1< output >
1.1.1局部数据结构设计
FILE型变量fPtr,用于指向输出文件。

1.1.2算法设计
1.2模块2< getInput >
1.2.1局部数据结构设计
FILE型变量fPtr ,用于指向输出文件。

1.2.2算法设计
1.3.1 局部数据结构设计
Int型变量scan,用作循环控制变量,存储当前搜索楼层1.3.2算法设计
1.2.3局部数据结构设计
Double型变量duration,用于存放已暂停时间
Int型变量i; 用作循环控制变量,存储当前搜索楼层
1.2.4算法设计
EGG库相关模块结构均较简单在此不再赘述。

Java课程设计------电梯控制系统

Java课程设计------电梯控制系统

draeLine(int x1,int y1,int x2,int y2),在坐标(x1,y1)、(x2,y2)之间画一条直线。
drawRect(int x,int y,int width,int height)方法和fillRect(int x,int y,int width,int height)方法分别用当前颜色在指定位置绘制一个矩形框和一个填充的矩形,其中参数x,y分别是矩形的左上角坐标;width,height分别用语指定矩形的宽和高。
用例8打开某层电梯锁(open floor)
此层的楼层请求按钮和电梯内的楼层按钮恢复正常。
用例9自动打开电梯门(auto open door)
(1)电梯到达某楼层。
(2)电梯自动开门。
用例10自动关闭电梯门(auto close door)
(1)电梯门打开的状态达到设置的时限。
(2)关闭电梯门。
A3 类模型
如果电梯门关着。打开电梯门。
如果电梯门开着。保持电梯门开状态。
用例6超重测试(overweight test)
(1)乘客进入电梯。
(2)如果电梯超重感应装置检测到超重。
电梯发出超重警报,并拒绝关闭电梯门。
乘客走出电梯。
电梯解除超重警报,并允许关闭电梯门。
用例7锁住某层电梯锁(lock floor)
此层的楼层请求按钮和电梯内的楼层按钮失效。
(3)按钮除了第一层和顶层,每一层都有两个按钮(上行、下行),乘客可以呼叫上楼或下楼,顶楼只有一个下楼按钮,而第一层只有一个上楼按钮。
电梯里面具有:
(1)标示从“1”到“N”的N个按钮,用于让乘客选择所要的层数;
(2)关门按钮当乘客按下此按钮时,电梯门如果开着将关上,否则不执行任何操作;
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Java课程设计报告组号:第四组课题名称:模拟电梯调度班级:09计一课题组成员姓名及学号:09030101课程设计日期:2011.6.20-2011.6.24地点:秋白楼B720一.正文1)[课程设计目的与要求]○1目的掌握线程的应用及线程在多媒体中的使用,了解线程的运行机制和线程的新建、就绪、运行、挂起、死亡五种状态,对线程由新的认识和巩固。

熟练java的动画编程,理解repaint()方法的调用过程及如何通过改写update()方法和双缓冲技术消除动画中出现的闪烁现象。

理解java的容器和组件的应用。

掌握java的事件处理机制:实现ActionListener接口,对事件源添加侦听器,实现actionPerformed()方法用以处理事件源所产生的事件。

另外使组员能够针对具体的有一定代表性的小型综合应用类课题设计、分析,全面掌握面向对象的思想、JAVA语言的应用技巧、方法,从而使组员进一步理解和掌握利用JAVA开发综合系统的过程,学会用java开发工具,同时培养组员的合作意识和团队精神,培养学生对实际系统的采用面向对象的方法进行分析与设计能力,从而使学生提高JAVA语言运用与开发的综合能力。

○2需求分析模拟电梯调度:有一栋三层的楼房,楼内有三个电梯。

要求电梯实现可以正常上下,和到达目的楼层后即停留并且实现开门及关门动作。

电梯需有多层停留功能即:当对同一个电梯需要其在多层都有下客时,电梯要在有下客动作的楼层停留然后自动去下一个有下客动作的楼层,而不需要乘客在次发出请求。

电梯具有距离发出请求的楼层最近的电梯响应请求的功能即:当某一楼层有乘客需要使用电梯时,由距离该楼层最近的电梯去响应,而不是任意一个电梯都可以响应。

(注:当存在距离该楼层最近的电梯且该电梯正在远离该楼层运动时该电梯不响应,当存在多个电梯距离该楼层最近时由编号低的电梯响应而不是全都响应。

2)[本人在课程设计中承担的任务]在课程设计中我主要负责事件处理,并判断该事件是何种事件,需要做出怎样的响应。

同时确定各电梯的工作状态,以及判断该事件是否应该得到响应若响应该事件那么应由哪一个电梯去响应。

当然我所做的还有判断哪一个电梯距离发出请求的楼层最近,此时由距离该楼层最近的电梯响应请求,若距离最近的电梯处于远离该楼层的运动状态时则由下一个最近的电梯响应,若存在多个电梯距离最近,那么由编号低的响应。

总的来说我的工作是考虑各种情况下给控制电梯各种动作(上、下、开门、关门、电梯响应、楼层)的变量赋予正确的值以实现电梯的正常运作。

3)[程序中使用的数据结构及符号说明]由于电梯有三个楼层也有三层,所以要实现各电梯之间互不影响就需要由不同的变量去控制电梯的动作。

这也是为什么程序中变量较多的原因。

下面是对本段程序中使用到得变量的解释说明:Object str:获取的组件信息赋予str(按钮名)。

String st:获取的组件信息赋予st(按钮上的内容)。

int a,b,c:三个临时变量,主要用于记录各电梯当前位置(y1,y2,y3)与产生请求的楼层的差值,用以判断哪一个电梯距离该楼层最近。

int y1,y2,y3:记录各电梯的位置,同时通过加1减1控制电梯的上下,y1对应第一个电梯y2对应第二个电梯y3对应第三个电梯。

int number[]:记录电梯有效信息,有4个元素(本程序中第一个元素未用),number[1]=1时说明第一个电梯响应number[2]=2时说明第二个电梯响应number[3]=3时说明第三个电梯响应。

number[]值为0时未响应即电梯未有动作。

int s:控制电梯的上下动作,s=1时电梯向上运动s=-1电梯向下运动。

int n1[],n2[],n3[]:记录各电梯中所响应的楼层信息,n1[]、n2[]、n3[]各对应一二三号电梯,且各有三个元素各对应于一二三层楼。

n1[]、n2[]、n3[]中元素值为1说明对应楼层有响应即电梯到达该楼层时要停留并开关门。

值为0说明无响应。

boolean moving1,moving2,moving3:记录电梯的状态,moving1、moving2、moving3各对应一二三号电梯。

值为true时电梯处于动作状态(上下或开关门),值为false时电梯处于静止状态。

boolean open1,open2,open3:电梯的开门关门控制变量,open1、open2、open3各控制一二三号电梯的开关门动作。

值为true时允许电梯开门,值为false时允许电梯关门。

int a1,a2,a3,b1,b2,b3,c1,c2,c3:记录各电梯响应的楼层信息,与n1[],n2[],n3[]用处差不多,但不可少。

a1、a2、a3分别对应n1[0]、n1[1]、n1[2]以此类推b,c对应n2,n3。

其主要目的是当电梯到达最后一个目的楼层后将电梯的有效信息number[]的值设置为0。

这是n1[],n2[],n3[]无法做到的,应为在到达相应的目的楼层后n1[],n2[],n3[]中的相应值也就设置为0了。

Button bt1···:各组件(各楼层及各电梯的按钮)。

4)[程序流程图]由于此程序中情况众多,因此流程图中的判断框较多也较复杂。

下面给出一个较简单的流程图。

5)[程序运行时的初值和运行结果]程序开始运行时,未点击任何按钮所以对于我的程序部分来说不存在初始值,只有y1=440,y2=440,y3=440open1=false,open2=false,open3=falsemoving1=false,moving2=false,moving3=falsen1[]={0,0,0},n2[]={0,0,0},n3[]={0,0,0},number[]={0,0,0,0}此时三个电梯均处于第一层。

下面分几种情况分别说明一下程序实现的电梯调度的过程:○1.若开始时点击bt1即第一层的up按钮,则通过计算得出三个电梯均距离第一层最近,所以由一号电梯响应请求。

此时open1=true,number[1]=1随即一号电梯门打开并关上,此时点击一号电梯上的楼层按钮,比如bt5即第三层。

此时各变量值为:S=1y1=440,y2=440,y3=440open1=false,open2=false,open3=falsemoving1=true,moving2=false,moving3=falsen1[]={0,0,1},n2[]={0,0,0},n3[]={0,0,0},number[]={0,1,0,0}随即电梯向上移动到达三楼后open1=true,number[1]=1开门并关门此时:S=1y1=140,y2=440,y3=440open1=false,open2=false,open3=falsemoving1=false,moving2=false,moving3=falsen1[]={0,0,0},n2[]={0,0,0},n3[]={0,0,0},number[]={0,0,0,0}此时再点击bt1,则通过计算得出二号和三号电梯距离第一层最近,所以由二号电梯响应请求。

此时open2=true,number[2]=2随即二号电梯门打开并关上,此时点击二号电梯上的楼层按钮,比如bt24即第二层。

此时各变量值为:S=1y1=140,y2=440,y3=440open1=false,open2=false,open3=falsemoving1=false,moving2=true,moving3=falsen1[]={0,0,0},n2[]={0,1,0},n3[]={0,0,0},number[]={0,0,2,0}随即电梯向上移动到达二楼后open2=true,number[2]=2开门并关门此时:S=1y1=140,y2=290,y3=440open1=false,open2=false,open3=falsemoving1=false,moving2=false,moving3=falsen1[]={0,0,0},n2[]={0,0,0},n3[]={0,0,0},number[]={0,0,0,0}此时点击bt21即第二层的up按钮,则通过计算的出二号电梯距离第二层最近,所以由二号电梯响应请求。

此时open2=true,number[2]=2随即二号电梯门打开并关上,此时点击二号电梯上的楼层按钮,比如bt25即第三层。

此时各变量值为:S=1y1=140,y2=290,y3=440open1=false,open2=false,open3=falsemoving1=false,moving2=true,moving3=falsen1[]={0,0,0},n2[]={0,0,1},n3[]={0,0,0},number[]={0,0,2,0}随即电梯向上移动到达三楼后open2=true,number[2]=2开门并关门此时:S=1y1=140,y2=140,y3=440open1=false,open2=false,open3=falsemoving1=false,moving2=false,moving3=falsen1[]={0,0,0},n2[]={0,0,0},n3[]={0,0,0},number[]={0,0,0,0}○2.若开始时点击bt1,,则通过计算得出三个电梯均距离第一层最近,所以由一号电梯响应请求。

此时open1=true,number[1]=1随即一号电梯门打开并关上,此时点击一号电梯上的楼层按钮,比如bt5即第三层。

此时各变量值为:S=1y1=440,y2=440,y3=440open1=false,open2=false,open3=falsemoving1=true,moving2=false,moving3=falsen1[]={0,0,1},n2[]={0,0,0},n3[]={0,0,0},number[]={0,1,0,0}随即电梯开始向上移动,若在一号电梯向上移动并且过了第二层但没到第三层时点击bt21即二楼的up按钮,则经过计算得到一号电梯距离二楼最近,但是由于一号电梯正处于远离二楼的运动状态中所以一号电梯不响应请求,由二号电梯响应,此时:S=1290<y1<140,y2=440,y3=440open1=false,open2=false,open3=falsemoving1=true,moving2=true,moving3=falsen1[]={0,0,1},n2[]={0,1,0},n3[]={0,0,0},number[]={0,1,2,0}随即二号电梯向上移动,显然一号电梯比二号电梯早到达目的楼层,当一号电梯到达目的楼层时open1=true,number[1]=1,open2=false,number[2]=2,一号电梯开门并关门此时:S=1y1=140,290<y2<440,y3=440open1=false,open2=false,open3=falsemoving1=false,moving2=true,moving3=falsen1[]={0,0,0},n2[]={0,1,0},n3[]={0,0,0},number[]={0,0,2,0}当二号电梯到达目的楼层时open2=true,number[2]=2,此时二号电梯开门并关门此时:S=1y1=140,y2=290,y3=440open1=false,open2=false,open3=falsemoving1=false,moving2=false,moving3=falsen1[]={0,0,0},n2[]={0,0,0},n3[]={0,0,0},number[]={0,0,0,0}○3.若开始时点击按钮bt1,则由一号电梯响应请求此时open1=true,number[1]=1随即一号电梯门打开并关上,此时点击一号电梯上的楼层按钮,比如bt5和bt4即第三层和第二层。

相关文档
最新文档