查看完整版本: 斗胆给大家出道程序设计题(考查面向对象的方法)

业余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]]
页: [1]
查看完整版本: 斗胆给大家出道程序设计题(考查面向对象的方法)