业余C/C++ 2008-8-28 21:00
斗胆给大家出道程序设计题(考查面向对象的方法)
[size=2]看到版主发的每日一题,很有感触,不过觉得版主发的题目不能充分体现程序设计的思想和步骤,斗胆出这道题,班门弄斧了。
设计题目:红绿灯情景模拟
一、问题描述:
一条单行车道上设置了一盏红绿交通灯,共由红、黄、绿三色指示灯组成,各色指示灯停留时间各为:红灯10秒,黄灯3秒,绿灯10秒。红灯和绿灯均在起亮后第6秒时开始闪烁,并在第11秒时转换成黄灯。黄灯不闪烁,并在起亮后第4秒时转换为其它灯色。
设红绿灯起始时以红灯起开始它的运作,并以红→黄→绿→黄→红循环工作,直至关闭,且不受人为控制。
与此同时,这条道路在每一秒钟都会随机产生一辆汽车要通过这盏红绿灯,根据交通规则:红灯亮起则汽车停留,绿灯亮起汽车才可行走,而黄灯亮起则只能等待。
假设不计车辆通过红绿灯所花费的时间,即绿灯亮起后第一秒时,不管是因为红灯、黄灯而停滞的车辆,还是在这一秒又随机产生的车辆,均能瞬间通过。并且以后的每一秒产生的车辆也都瞬时通过,直至绿灯熄灭。
请用面向对象的方法(即类和对象的方法)编写一段程序来模拟这样一个情景,并按下列要求反馈相关数据。
二、要求
(1)要求能让用户指定红绿灯的运行时间,到达时间后程序终止(即停止产生随机车辆,红绿灯也停止变换)。
(2)要求能记录如下数据:
①、红绿灯循环工作次数
②、通过车辆的个数
③、车辆因红绿灯而停滞在公路上的时间统计表(如:停1秒的车辆共4辆;停2秒的车辆共6辆;停3秒的车辆共3辆;等等)
④、程序结束时,仍滞留的车辆
(3)可以以动画或文本形式完成,但必须要求打印出如下内容:a、运行时间 b、红绿灯状态(闪烁状态也要反应) c、车辆状态(是否有车,有几辆) d、要求(1)、(2)中的相关内容
(4)(高手练习)记录并生成程序运行时每一秒,红绿灯运行情况及车辆状况的详细表单(涉及MFC及其应用)。
(5)以类和对象方法来实现,并采用标准C++规范要求。
(注:有程序设计经验的老手,看到这里就可以开始你的工作了,以下内容是给需要的朋友做个简略的分析。)
三、程序分析(简单分析,仅供参考):
(1)程序中的类及其对象
指示灯->红灯、黄灯、绿灯
时间->程序执行时间、车辆停留时间、灯的持续时间
车辆->汽车(随机产生)
(2)类的属性
指示灯:a、颜色(int) b、持续时间(int) c、闪烁开始时间(int) d、点燃(int函数) e、熄灭(int函数)
时间:a、项目生成或启动时系统时间 b、项目当前系统时间 c、项目销毁或结束的时间
车辆:a、车辆停滞 b、车辆通过 c、车辆停滞时间
(3)类之间的关系
依赖于 依赖于
车辆-----→指示灯------→时间
(4)程序流程
程序开始-→要求输入运行时间--→检查是否非法数据--→初始化--→程序主循环--→停止循环-→统计数
↑ 是 ↓
←←←←←←←←←←
[/size]
[size=2]据并打印结果-→结束[/size]
[size=2]
程序循环包括:
打印状态
暂停一秒
取系统时间
随机生成车辆
判断灯色
判断汽车可通过与否
判断是否达到指定时间(退出循环的条件)
(5)分析重点
①、最长等待时间
所有车辆中,莫过于这种车最倒霉,当绿灯正好结束,黄灯亮起时它走到了路口,于是要等到下一次黄灯结束绿灯亮起时才能同行。所以最长等待时间为:3秒(黄灯持续时间)+10秒(红灯持续时间)+3秒(黄灯持续时间)=16秒。
②、最多车辆对象
根据题目假设,每一秒随机生成一辆汽车,即如果秒秒都生成汽车,最多生成到绿灯亮时,车辆序便可以重置为0号(即重新计数)。再由黄灯亮起时再记录生成了1号车,2号车,等等。因此,至多定一个16单位的车辆对象数组,即可满足本程序的设计要求,不过要在对象数据被覆盖之前,备份下来,以免遗漏数据。当然,你也可以只用一个对象,甚至动态的生成和删除对象,量力而为之。
③、时间记录
应为编写了时间类,所以可以给每个生成的车辆生成一个时间对象,我是这么想的,只做参考。
④、随机系统
在C++中,随机系统需要一个数值进行初始化,数值不同生成的随机数序列不同,数值相同生成的随机数列就相同。建议大家先以一个确定的数值调试系统,等系统功能完备且没有逻辑错误时,再以系统时间随机初始化随机因子,以达到真正随机的效果。
(6)可能出现的问题
①、红绿灯循环不足一次
因用户规定的运行时间可能不能刚好为26秒(即循环一次的时间)的倍数,故规定不足一次循环也以一次循环记。
②、界面设计
对用动画反应这一情景的朋友,建议使用对话框模式来设计程序。对以文本表达这一过程的朋友,建议采用如下格式(只供参考):
----------------------------------------------------------------------
- 提示:有车辆产生 提示:车辆消失 -
- (闪烁)红灯 系统运行时间:X秒 -
- 黄灯 共停滞车辆:X辆 -
- (闪烁)绿灯 最后仍停滞车辆:X辆 -
----------------------------------------------------------------------
③、忽略绿灯条件下产生的车辆
也许有的朋友会想:如果绿灯下条件下,每产生一辆车,就能瞬间通过的话,那岂不是产不产生车辆与否都没什么关系。因此,干脆在绿灯条件下不生成车辆免得麻烦。可是如此一来,就相当于只是考虑到绿灯条件下,随机程序没能生成车辆的特殊情况,而忽略了车辆产生的一般情况,不符合题设情况。即,此错误可能导致程序的逻辑错误!
以上题目如有表述不严密或明显错误的地方,希望大家指正,此外大家有好的建议也可以提。
:_001 班门弄斧还望不吝赐教![/size]
[[i] 本帖最后由 业余C/C++ 于 2008-8-30 08:53 编辑 [/i]]
大道至简 2008-8-29 21:00
离散事件模拟,数据结构书上就有例子的。
红绿灯的设置感觉很怪,红灯之后是直接亮绿灯的。
业余C/C++ 2008-8-29 22:02
:_002 汗。。 没学过数据结构,只是有空时看下书。
但是,在真实社会中,红绿交通灯确实是三色灯,黄灯提示减速和启动,红绿灯只是个简称。
只是觉得,如果程序设计不能够用于社会实践而只是书本上的东西,又怎么能引起学习者的兴趣了,不是吗?
[[i] 本帖最后由 业余C/C++ 于 2008-8-30 08:50 编辑 [/i]]