停车场管理-数据结构课程设计报告.doc_第1页
停车场管理-数据结构课程设计报告.doc_第2页
停车场管理-数据结构课程设计报告.doc_第3页
停车场管理-数据结构课程设计报告.doc_第4页
停车场管理-数据结构课程设计报告.doc_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

数据结构与算法设计课程设计任务书题 目模拟停车场管理学生姓名学号专业班级数学0901设计内容与要求【问题描述】设停车场T只有一个可停放几辆汽车的狭长通道S1,且只有一个大门可供汽车进出。汽车在停车场内按车辆到达的先后顺序依次排列,若车场内已停满几辆汽车,则后来的汽车只能在门外的便道上等候,一旦停车场内有车开走,则排在便道上的第一辆车即可进入;当停车场内某辆车要离开时,由于停车场是狭长的通道,在它之后开入的车辆必须先退出车场为它让路,待该辆车开出大门后,为它让路的车辆再按原次序进入车场。在这里假设汽车不能从便道上开走。试设计一个停车场管理程序【软件功能】1.汽车经过车牌号的标记后进入此停车场管理。2.模拟实现停车场T,通道S1内的停车位以及汽车。3.可以看到汽车在停车场内的详细信息 4.有美观良好的图形用户界面。【算法思想】1. 停车场和车辆规避所通过两个栈来模拟。当停车场内的汽车要离开时,后边停放的汽车为其让路所要停放的地方称为车辆规避所。2. 先进入通道的汽车可以先计入停车场,所以,通道通过一个队列来模拟。3. 设计一个汽车类,汽车类中有车牌号,停车位置(指停在停车场内,通道内,还是车辆规避所内)两个属性。4. 一辆汽车首先进入通道,由于车牌号也汽车一一对应,故通过随机产生车牌号来模拟随机出现在通道内的汽车,将车牌号保存在汽车类中的车牌号属性中。5. 进入通道时,需要检查通道内是否有汽车,若有,则需要在通道内等待,若没有,则检查停车场内是否有空车位,若没有,则仍需要在通道内等待,若有,则可以进入停车场停车。6. 当汽车要离开停车场时,此辆汽车后边停放的汽车从后往前一次进入车辆规避所,当此辆汽车离开后,车辆规避所内的汽车在依次进入停车场(车辆规避所和汽车都是栈来模拟的,所以会遵循后进先出的原则)。7. 有汽车离开后,检查通道内是否有汽车,如果有,则可进入停车场。【提交成果】1.“数据结构与算法设计课程设计任务书”一份,打印装袋;2.“数据结构与算法设计课程设计报告”一份,打印装袋;3、上面两项内容的word文档,通过电子邮件交到指导教师。起止时间2012 年 6 月18日 至 2012 年7月 1 日指导教师签名 2012年 6 月 18 日 系(教研室)主任签名 2012年 6 月 18 日学生签名年 月 日注明:内容限1页数据结构与算法设计课程设计1、 程序设计说明书【设计题目】模拟停车场管理【问题描述】设停车场T只有一个可停放几辆汽车的狭长通道S1,且只有一个大门可供汽车进出。汽车在停车场内按车辆到达的先后顺序依次排列,若车场内已停满几辆汽车,则后来的汽车只能在门外的便道上等候,一旦停车场内有车开走,则排在便道上的第一辆车即可进入;当停车场内某辆车要离开时,由于停车场是狭长的通道,在它之后开入的车辆必须先退出车场为它让路,待该辆车开出大门后,为它让路的车辆再按原次序进入车场。在这里假设汽车不能从便道上开走。试设计一个停车场管理程序【软件功能】1.汽车经过车牌号的标记后进入此停车场管理。2.模拟实现停车场T,通道S1内的停车位以及汽车。3.可以看到汽车在停车场内的详细信息 4.有美观良好的图形用户界面。【算法思想】1.停车场和车辆规避所通过两个栈来模拟。当停车场内的汽车要离开时,后边停放的汽车为其让路所要停放的地方称为车辆规避所。2.先进入通道的汽车可以先计入停车场,所以,通道通过一个队列来模拟。3.设计一个汽车类,汽车类中有车牌号,停车位置(指停在停车场内,通道内,还是车辆规避所内)两个属性。4.一辆汽车首先进入通道,由于车牌号也汽车一一对应,故通过随机产生车牌号来模拟随机出现在通道内的汽车,将车牌号保存在汽车类中的车牌号属性中。5.进入通道时,需要检查通道内是否有汽车,若有,则需要在通道内等待,若没有,则检查停车场内是否有空车位,若没有,则仍需要在通道内等待,若有,则可以进入停车场停车。6.当汽车要离开停车场时,此辆汽车后边停放的汽车从后往前一次进入车辆规避所,当此辆汽车离开后,车辆规避所内的汽车在依次进入停车场(车辆规避所和汽车都是栈来模拟的,所以会遵循后进先出的原则)。7.有汽车离开后,检查通道内是否有汽车,如果有,则可进入停车场。【逻辑结构设计】程序运行开始后,首先随机产生车牌号,由于汽车可能进入停车场,也可能不进入,为了模拟这个,我们给定了一个范围,如果产生的随机数落入到这个范围内,则表示该汽车准备进入停车场,此时,汽车现进入通道内,如果通道内已有汽车等待,则此汽车也排在后边等待,如果它前面没有汽车,这时检查停车场内是否有空车位,如果有,则进入停车场停车,如果没有,则在通道内等待。汽车离开也是随机的,这时,我们随机产生一个随机停车位数,如果这个数在停车场的停车位总数内,并且此车位上停有汽车,则此汽车准备离开停车场,此时,检查此汽车的后边是否有汽车,如果有,他后边的汽车由后往前依次进入车辆规避所,当此汽车离开后,车辆规避所里的汽车再依次进入停车场。当有汽车离开后,检查通道内是否有汽车,如果有,则可以进入停车场停车。【存储结构设计】1.汽车的抽象数据类型:public class Car public static final int ON_STOPPTING = 0;/指示Car当前停放在停车场中public static final int ON_PAVEMENT = 1;/指示Car当前停放在便道上public static final int ON_OTHER_PLACE = 3;/指示Car当前停放在其他地方private final String licensePlate;/记录Car牌照号码private int state;/记录Car的当前状态,即停在何处public Car(String lp, int s) ;/构造方法1public Car(String lp);/构造方法2public void setState(int s) ;/设置Car当前停放状态public int getState() ;/获取Car当前停放状态public String getLicensePlate() ;/获取Car车牌号码2.停车场的抽象数据类型:public class Stack Object elements;/栈元素数组final int MAX_NUM;/栈最大容量int top;/栈顶指针public Stack(int capacity) ; /构造函数public boolean isFull() ; /栈满否public boolean isEmpty()/栈空否public E getEementAt(int index) ; /取指定位置的元素public void push(E e) ; /入栈public E pop();/出栈public E peek() ;/取栈顶3.便道的抽象数据类型:public class LinkedQueueprotected Node front;/对头节点protected Node rear;/队尾节点protected int count;/节点个数public LinkedQueue();/创建一个空public LinkedQueue(int size) ;/创建一个空队public boolean append(E e) ;/入队public boolean empty() ; /判队空public E getFront() ;/获得队首public E remove() ;/出队public E getElementAt(int index) ;/获取指定位置的节点public int getElementCount(); /获取队的长度【基本操作设计】欢迎界面上有两个按钮,”进入”和”离开”。点击“离开”则退出程序。点击“进入”则进入到演示界面。演示界面的右下端有一个“开始演示”按钮,当点击后,开始模拟停车场管理就开始演示。【模块流程图】1开始主界面进入结束演示界面开始演示模拟汽车到达模拟汽车离开离开接收指令2结束模拟汽车到达产生随机车牌号是否在范围内通道内是否有车进入通道是否是否停车场是否有空位通道内等待是否是否否是进入停车场通道内等待结束结束结束3模拟汽车离开产生随机车位号是否在范围内是否后边是否有汽车结束是否否是后边的汽车依次进入车辆规避所汽车离开结束汽车离开车辆规避所中的汽车回到停车场结束【界面设计】1. 主界面2. 演示界面【用户手册】1. 停车场和便道内的车位数相等,都是10个车位2. 随机车牌是1到100000中的一个数,可以进入到停车场得车牌的范围是10000到99999.3. 随机车位是1到15中的一个数,车位的范围是1到10,随机车位在设定的范围内,并且此车位上有汽车,则汽车执行离开操作,否则不执行。4. 每4秒钟,会先产生一个随机车牌号,然后再产生一个随机车位号。一共会产生20个随机车牌号和20个随机车位号。5. 当20次结束后,如果再点击“开始演示”则程序会再次产生20个随机车牌号和20个随机车位号后停止2、 程序上机调试报告【语法错误及其排除】(1) 空指针异常。在测试代码时经常遇见这个错误,原因是,变量没有被正确调用。调试这个错误时很麻烦的,需要一点一点去检查出现错误的语句以及相关的语句。经过仔细检查,果然是我在调用变量时出现的错误,一点点修改后,程序终于跑通了。(2) 数组下标越界异常。车位是从1开始的,而数组下标是从0开始的,刚开始时,没有注意到这一点,导致最后一个车位上的车不能正常进出。经检查后,将将车位与数组下标对应起来这样就正确了。【算法错误及其排除】(1) 刚开始产生随机数时,由于未将进入停车场的汽车入栈,导致在汽车想要出栈时,程序运行错误。当将入栈语句加入,并且在出栈时判断了栈是否不为空后,出栈正常,程序正常运行。3、 程序测试结果【测试数据】车位数为10每4秒钟产生一个随机车牌号和一个随机车位号。一共会产生20个随机车牌号和20个随机车位号。【输出结果】1.程序开始运行2.一次循环结束后(即产生了20个随机数后)【程序性能评价】此程序整体来说,性能优良,汽车的进入和离开通过随机数来控制。免去了手动输入的麻烦,也可以更加真实的模拟停车场系统。【性能改进方向】此程序也有不足的地方,比如说,程序指定了停车场和便道内的车位数,改进的方向就是车位数由用户来制定,由于这次编程时间太少,没有来的及实现。还有一个不足的地方就是,20个随机数是通过20此循环来产生的,如果20个随机数没有产生完,程序就不能关闭,除非强制关闭,这也是一个需要改进的地方。【收获及体会】4、 源程序代码(1) 菜单界面package edu.cqit.ParkSimulation;import java.awt.BorderLayout;import java.awt.Dimension;import java.awt.FlowLayout;import java.awt.Toolkit;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.ImageIcon;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JPanel;/绘制菜单界面public class BeginFrame extends JFrame implements ActionListenerpublic BeginFrame()setLayout(new BorderLayout();JLabel jl=new JLabel(new ImageIcon(src/image/welcome.jpg),JLabel.CENTER);JPanel jp1=new JPanel();jp1.add(jl);add(jp1,BorderLayout.CENTER);JPanel jp2=new JPanel(new FlowLayout();JButton jb1=new JButton(进入);JButton jb2=new JButton(离开);jb1.addActionListener(this);jb2.addActionListener(this);jp2.add(jb1);jp2.add(jb2);add(jp2,BorderLayout.SOUTH);setResizable(false);setSize(400,330);Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();/获取电脑的宽和高Dimension windowsSize = getSize();/获取组件的宽高setLocation(screenSize.width - windowsSize.width) / 2,(screenSize.height - windowsSize.height) / 2);/将组件显示到当前电脑桌面的中心setVisible(true);setTitle(停车场模拟管理程序);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);/按钮的监听Overridepublic void actionPerformed(ActionEvent e) String comm=e.getActionCommand();if(进入.equals(comm)ParkSimulation aParkSimulation = new ParkSimulation(10);Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();/获取电脑的宽和高Dimension windowsSize = aParkSimulation.getSize();/获取组件的宽高aParkSimulation.setLocation(screenSize.width - windowsSize.width) / 2,(screenSize.height - windowsSize.height) / 2);/将组件显示到当前电脑桌面的中心aParkSimulation.setTitle(停车场模拟管理程序);setVisible(false);/开始界面隐藏aParkSimulation.setVisible(true);/主界面显示elseSystem.exit(0);/关闭程序(2) 汽车类package edu.cqit.ParkSimulation;/* * 汽车类Car,记录汽车的牌照号码和汽车的当前状态,当前状态用于区分每辆汽车 * 所处的位置。 * */public class Car / / 汽车可能的停放位置/ /* 指示Car当前停放在停车场中, 用于setState */public static final int ON_STOPPTING = 0;/* 指示Car当前停放在便道上, 用于setState */public static final int ON_PAVEMENT = 1;/* 指示Car当前在其他地方, 用于setState */public static final int ON_OTHER_PLACE = 3;/ / 汽车属性/ /* * 记录Car牌照号码 * see #getLicensePlate() */private final String licensePlate;/* * 记录Car的当前状态, 一下常量之一: * ON_STOPPING、 * ON_PAVEMENT或 * ON_OTHER_PLACE(默认)。 * see #getState() */private int state;/* * 创建一个指定车牌及当前停放状态的Car。 * * param lp 要创建的Car车牌 * param s 要创建的Car当前停放状态 */public Car(String lp, int s) licensePlate = lp;state = s;/* * 创建一个指定车牌且在其他地方的Car。 * * param lp 要创建的Car车牌 */public Car(String lp) licensePlate= lp;state = ON_OTHER_PLACE;/* * 设置Car当前停放状态。 * * param s 当前停放状态 - Car中定义的以下常量之一:ON_STOPPING、 * ON_PAVEMENT或ON_OTHER_PLACE(默认)。 */public void setState(int s) switch (state) case ON_STOPPTING:state = s;break;case ON_PAVEMENT:state = s;break;default: / 指定状态为其他值时,默认设置状态为ON_OTHER_PLACEstate = ON_OTHER_PLACE;break;/* * 获取Car当前停放状态。 * * return Car当前停放状态 - Car中定义的以下常量之一:ON_STOPPING、 * ON_PAVEMENT或ON_OTHER_PLACE。 */public int getState() return state;/* * 获取Car车牌号码。 * * return Car车牌号码 */public String getLicensePlate() return licensePlate;(3)汽车按钮类,用于模拟显示停车场和便道内的汽车package edu.cqit.ParkSimulation;import java.awt.Insets;import javax.swing.ImageIcon;import javax.swing.JButton;/汽车按钮类,用于模拟显示停车场和便道内的汽车public class ImageButton extends JButton public static final ImageIconcarIcon = new ImageIcon(src/image+ java.io.File.separator +car_icon.jpg);public static final int LEAVE = 0;public static final int COME = 1;public ImageButton() this(null);public ImageButton(String text) super(text);setIcon(carIcon);setHorizontalTextPosition(RIGHT);/文字的水平对齐方式在右边setHorizontalAlignment(LEFT);/图标的水平对齐方式为左边setMargin(new Insets(0,0,0,0);/设置按钮边框和标签之间的空白setOpaque(false);/如果为 true,则该组件绘制其边界内的所有像素。否则该组件可能不绘制部分或所有像素,从而允许其底层像素透视出来setBorderPainted(false);/按钮的边框不显示setEnabled(false);/按钮是否使用setContentAreaFilled(false);/如果该属性为 true,则按钮将绘制内容区域。/如果希望有一个透明的按钮,比如只是一个图标的按钮,那么应该将此属性设置为 false。public void setState(int state, String text) setText(text);switch (state) case COME:setEnabled(true);break;default:setEnabled(false);break;(4)链式队列package edu.cqit.ParkSimulation;import java.util.NoSuchElementException;/链式队列public class LinkedQueue implements Queue protected Node front;/对头节点protected Node rear;/队尾节点protected int count;/节点个数/* * Creates a new queue without elements. */public LinkedQueue() /创建一个空队front = rear = null;count = 0;/* * Creates a new queue without elements. */public LinkedQueue(int size) /创建一个空队front = rear = null;count = 0;public boolean append(E e) /入队Node newNode = new Node(e, rear);if (count = 0) front = rear = newNode; else rear.setNext(newNode);rear = newNode;count+;return true;/判队空public boolean empty() return (count = 0);public E getFront() /获得队首if (empty() throw new NoSuchElementException(队列已空!);return front.getElement();public E remove() /出队if (empty() throw new NoSuchElementException(队列已空!);Node tempNode = front;if (front = rear) front = rear = null; else front = front.next;count-;return tempNode.getElement();public E getElementAt(int index) /获取指定位置的节点if (front = null) throw new NoSuchElementException(队列已空!);Node node = front;for (int i = 0; i index; i+) node = node.next;return node.getElement();public int getElementCount() /获取队的长度return count;public Object toArray() Object aEs = new Objectcount;Node node = front;for (int i = 0; (i aEs.length) & (node != null); i+) aEsi = node.getElement();node = node.next;return aEs; (5)信息显示类,用于显示汽车进出停车场的详细信息package edu.cqit.ParkSimulation;import java.awt.Color;import javax.swing.JTextArea;import javax.swing.text.Document;/信息显示类,用于显示汽车进出停车场的详细信息public class MessagePanel extends JTextArea public MessagePanel() /构造方法1super();public MessagePanel(String text) /构造方法2super(text);public MessagePanel(Document doc) /构造方法3super(doc);public MessagePanel(int rows, int columns) /构造方法4super(rows, columns);public MessagePanel(String text, int rows, int columns) /构造方法5super(text, rows, columns);public MessagePanel(Document doc, String text, int rows, int columns) /构造方法6super(doc, text, rows, columns);public void initialize() setBackground(Color.BLUE);/设置背景色setForeground(Color.WHITE);/设置此组件的前景色setEditable(false);/是否可以编辑setDragEnabled(true);/启用自动拖动处理public void append(String str) /追加要显示的字符串super.append(str);update(this.getGraphics();(6)队列接口package edu.cqit.ParkSimulation;import java.util.NoSuchElementException;/队列接口public interface Queue boolean append(E e) throws Exception;/入队E remove() throws NoSuchElementException;/出队E getFront() throws NoSuchElementException;/获得队首boolean empty();/队空否(7)节点类package edu.cqit.ParkSimulation;/节点类public class Node protected E element;/数据域protected Node next;/指针域(指向下一个节点)public Node(E obj, Node nextval) /节点构造方法1element = obj;/数据域赋值next = nextval;/指针域指向下一个节点public Node(Node nextval) /节点构造方法1element = null;next = nextval;public E getElement() return element;public Node getNext() return next;public void setElement(E obj) element = obj;public void setNext(Node nextval) next = nextval;public String toString() return element.toString();(8)栈package edu.cqit.ParkSimulation;/栈public class Stack Object elements;/栈元素数组final int MAX_NUM;/栈最大容量int top;/栈顶指针/构造函数public Stack(int capacity) MAX_NUM = capacity;elements = new ObjectMAX_NUM;top = 0;/栈满否public boolean isFull() return (top = MAX_NUM);/栈空否public boolean isEmpty() return (top = 0);/取指定位置的元素public E getEementAt(int index) if (index = MAX_NUM | index 0) throw new ArrayIndexOutOfBoundsException(index);return (E) elementsindex;/入栈public void push(E e) throws Exception if (isFull() throw new Exception(堆栈已满!);elementstop+ = e;/出栈public E pop() if (isEmpty() throw new NullPointerException(堆栈已空!);return (E) (elements-top);/取栈顶public E peek() if (isEmpty() throw new NullPointerException(堆栈已空!);return (E) (elementstop-1);(9)显示停车场和便道的面板package edu.cqit.ParkSimulation;import java.awt.BorderLayout;import java.awt.GridLayout;import javax.swing.AbstractButton;import javax.swing.ButtonGroup;import javax.swing.JComponent;import javax.swing.JPanel;import javax.swing.JScrollPane;public class StopPanel extends JPanel /* 能加入此容器的组件最大数 */private intmaxCompCount;/* Title组件 */private JComponenttitleComponent;/* 容纳加入此容器的组件 */private JComponentcontentComponent;/* 容纳加入此容器的按钮 */private ButtonGroupgroup;/* 此容器中组件布局方式 */private GridLayoutcomponentLayout;/* * 创建一个具有指定标题,指定初始可添加组件数量及组件对齐方式的容器。 * param title要添加的标题组件 * param titlePos标题组件的位置 * param maxComCount可添加组件的数量 * param align组件对齐方式 */public StopPanel(JComponent title, int maxComCount) titleComponent = title;group = new ButtonGroup();this.maxCompCount= maxComCount; init();/* * 创建一个空标题,指定初始可添加组件数量及组件对齐方式的容器。 * param maxComCount可添加组件数量初始值 * param align组件对齐方式 */public StopPanel(int maxComCount) this(null, maxComCount);/* * 初始化容器。 */private void init() setLayout(new BorderLayout();contentComponent = new JPanel();componentLayout = new GridLayout(maxCompCount, 1);contentComponent.setLayout(componentLayout);add(new JScrollPane(contentComponent), BorderLayout.CENTER);if (titleComponent != null) add(titleComponent, BorderLayout.NORTH);/* * 将指定组件添加到容器。 * param b要添加的组件 * return如果添加成功返回true,否则返回false。 */ public void addButton(AbstractButton b) if (b = null) throw new NullPointerException();if (group.getButtonCount() = maxCompCount) return;group.add(b);contentComponent.add(b);/* * 从容器中移出指定 * param b */public void removeButton(AbstractButton b) if (b = null) throw new NullPointerException();group.remove(b);contentComponent.remove(b);/* * 获取组件之间的水平间距。 * return组件之间的水平间距 */public int getHgap() return componentLayout.getHgap();/* * 获取组件之间的垂直间距。 * return组件之间的垂直间距 */public int getVgap() return componentLayout.getVgap();/* * 将组件之间的水平间距设置为指定值。 * param hgap组件之间的水平间距 */public void setHgap(int hgap) componentLayout.setHgap(hgap);/* * 将组件之间的垂直间距设置为指定值。 * param vgap组件之间的垂直间距 */public void setVgap(int vgap) componentLayout.setVgap(vgap);/* * 更新组件 */public void updateComponent() update(getGraphics();repaint();(10)主界面package edu.cqit.ParkSimulation;import java.awt.BorderLayout;impor

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论