`
逆风的香1314
  • 浏览: 1416690 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

VC面向对象开发分析与设计实例解析

阅读更多
众 所周知,面向对象的程序设计更适合对现实生活中的描述,更加体现了软件的工业化的精神,所以现在大部分的软件开发工作都围绕OOP的思想来进行的。但是在 对现实生活中的实际问题,如何对所研究的系统进行面向对象的分析与设计呢?本篇文章以一个实际的例子,向大家介绍一下如何对实际问题进行分析和设计。

  一.问题描述:

  该实例是一个电梯载客问题,问题的描述如下:
  某贸易中心共10层,设有载客电梯1部。为了处理问题的方便,有以下的限定条件:
  (1) 电梯的运行规则是:可到达每层。
  (2) 每部电梯的最大乘员量均为K人(K值可以根据仿真情况在10~20人之间确定)。
  (3) 仿真开始时,电梯随机地处于其符合运行规则的任意一层,为空梯。
  (4) 仿真开始后,有N人(>20人)在该国际贸易中心的1层,开始乘梯活动。
  (5) 每个人初次所要到达的楼层是随机的,开始在底层等待电梯到来。
  (6) 每个人乘坐电梯到达指定楼层后,再随机地去往另一楼层,依此类推,当每人乘坐过L次(L值可以根据仿真情况在3~10次之间确定)电梯后,第L+1次为下至底层并结束乘梯行为。到所有人结束乘梯行为时,本次仿真结束。
  (7) 电梯运行速度为S秒/层(S值可以根据仿真情况在1~5之间确定),每人上下时间为T秒(T值可以根据仿真情况在2~10之间确定)。
  (8) 电梯运行的方向由先发出请求者决定,不允许后发出请求者改变电梯的当前运行方向,除非是未被请求的空梯。
  最后开发的软件要求:
  (1) 设计一个易于理解的界面,动态显示各梯的载客与运行情况(上、下或停止),动态显示各楼层的人员停留情况与要求乘梯情况;动态显示从仿真开始到目前的时间。
  (2) 可变动的参数(K、N、M、L、S、T)应在程序开始时从对话框输入。

  二.系统分析与设计:

   采用OOP分析的关键就是要对问题的对象空间的分类(类的分析与设计,这一点跟面向过程的流程图设计不太一样),也就是在整个系统中包括那几个类,每个 类包含那些属性特征和行为特征。对于上面的电梯问题,很明显有两个类:即电梯类和乘客类(从所设计到的对象描述可以观察到,但是有的问题即使这一步也要仔 细分析)。电梯类应该反映所有关于电梯状态和行为的信息,而乘客类也应该反映这些信息。综合上面问题的表述,现在将分析结果整理如下:
  乘客类:
Cpassenger
{
bool bInLift; //是否在电梯里
bool bSignal; //发出请求标志
bool bStart; //仿真启动标志(false标志仿真结束)
Cstring flag; //标识每个人得序号以及需求层数
Int iAtFloor; //所在楼层
Int iToFloor; //要去得楼层
Int iLifts; //已经乘坐电梯得次数了
Int number; //乘客得序号
}
  电梯类:
Celevator
{
bool bStart; //仿真开始标志
int iAtFloor; //当前所处得层数得起点
int iToFloor; //即将去得层数
int iPassengers; //电梯里得人数
bool bStop; //电梯停止标志
bool bIsEmptyOperation; //电梯是否空载运行
CArray<CPassenger,CPassenger&> m_passengers; //存放载处于电梯里面得乘客
}
   这里说明一下,CArray<CPassenger,CPassenger&>是MFC里面的一个模板集合类,第一个参数表示该集 合所存储的类别,第二个参数表示对该集合里面的元素所采取的访问方式,这里采用的是引用的访问方式,这种方式通过传递32位指针来进行访问,它同时兼有地 址访问(效率高)和值传递的双重优势,现在一般对大的对象的存取一般提倡使用这种方式。
  另外,这里也引用了view类,定义如下:
class CLiftsimulationView : public CFormView
{
UINT m_nTimer;
int k;
int n;
int l;
int s;
int t;
int floor;
CPassenger m_passenger[100]; //最大为100个乘客
CElevator m_elevator; //一个电梯
int iSrcFloor,iDesFloor; //分别代表载客时得起始楼层和终结楼层,用在ontimer中
int iEmptySrcFloor,iEmptyDesFloor; //分别代表空载时得起始楼层和终结楼层,用在ontimer中
int itimes[41];
DWORD ElapseTime;
void DeleteColor(int src);
void DrawColor(int src,int increment);
};
   这里大致把各个对象的成员设定出来了,为了方便存储,将所有的变量定义为public的类型,这样可以提高存储的效率,当然了,它也破坏了OOP封装的 思想,降低了对象与对象之间的隔离性。这里因为问题不是很复杂,所以我们采用前面的方法。至此,类设计基本结束了,当然了,很多时候不是一开始就可以把类 设计得很好,往往都是要先设计一部分,然后在后面得问题得处理中,还要对原来设计的类结构进行添加和删除工作的。这里要特别注意的是类设计的最终目的是降 低系统的耦合,达到程序逻辑与数据之间的分离,更有利于代码的编制和维护。


  三.代码编制:

  前面已 经完成了类设计,那么剩下来的就是应该是系统逻辑部分的实现了,对于系统整体来说,应该有一个事件侦测体系,用来对系统每个乘客和电梯的状态的侦测,以便 发送或者修改必要的信息,该侦测体系的周期定为1秒钟(可以用定时器实现),然后用串行的方式来模拟并行的。如果把思路总结一下,应该是跟动画片的原理是 一样的:将多个固定和静止的画面定时、按顺序地放映出来,就变成了活动的画面。所以,可以在程序中定义一个主循环,在该循环外进行必要的初始化,进入后每 秒钟执行一次,以遍历方式一一激励当前已经产生的对象,由它们根据自己的当前状态和相关的状态变化规则,决定是否需要改变、改变成什么样的状态,以及按照 上述行为特征的设计展示必要的对象状态。
  根据上面叙述的思想,下面列举主要列出"事件侦测体系"的代码:
  (应该在另外一个函数来触发次函数,即调用SetTimer(1,1000,NULL)即可)
void CLiftsimulationView::OnTimer(UINT nIDEvent) //主要在这里处理所有得逻辑
{ int i=1;
 int j=1;
 int a;
 int flag1=0;
 CString str1,str2;
 CString showtime,sen,m,h;
 DWORD dwTime;
 if (nIDEvent==1) //整个系统来驱动,这个是最小得时间单位
 {if (this->m_elevator.bStart =true) //电梯在仿真
  { //对所有乘客循环查询,类似于消息循环,这是电梯核心程序得入口
   for(i=1;i<=this->n;i++)
    {if (this->m_passenger.bInLift ==false && this->m_passenger.bStart ==true &&  this->m_elevator.bStop==true && this->m_elevator.bIsEmptyOperation==true)
    { //轮询各个乘客得请求
     //只有当电梯停止而且乘客在楼层上得时候,才能进行发信号
     if (this->m_passenger.bSignal ==true)
     {//初始化乘客 srand(::GetTickCount());
      a =rand()%10+1; //产生一个1到10得随机数
      this->m_passenger.iToFloor =a; //该乘客要去得层数
      if (a==this->m_passenger.iAtFloor) //楼层一样得话就放弃此次信号
       if (a ==10)
        this->m_passenger.iAtFloor=a-1;
       else
        this->m_passenger.iAtFloor=a+1;
        str1.Format("%d",this->m_passenger.iToFloor);
        str2.Format("%d",this->m_passenger.number );
        this->m_passenger.flag =str2+"--"+str1; this->m_passenger.bSignal =false;
        //关闭她得信号标志,给别得乘客一个机会
        this->m_passenger.bInLift=true; //进入电梯了(虚拟)
        //初始化电梯,为空载运行作准备
        this->m_elevator.iToFloor =this->m_passenger.iAtFloor;
        this->m_elevator.iPassengers =1;
        this->m_elevator.m_passengers.Add(this->m_passenger);
        this->m_elevator.bStop =false; //表明电梯再运行 this->iEmptySrcFloor  =this->m_elevator.iAtFloor;
        this->iEmptyDesFloor =this->m_elevator.iToFloor ;       
        this->SetDlgItemText(IDC_STATIC18,(LPCTSTR)(str2+"--"+str1));
        //完成空载任务
        this->itimes[4]++;
        if (this->itimes[4]==1)
          SetTimer(4,2000,0); //电梯空载去接乘客
          break; //每次接一个
<script language="javascript" type="text/javascript"> ResizeImages("articlecontentdiv")</script> }
       }
      }
     //判断是否结束仿真
     for(i=1;i<=this->n;i++)
     { if (this->m_passenger.bStart ==true)
       flag1=1; }
     if (flag1==0) //结束仿真
     { KillTimer(1);
      this->m_elevator.bStart =false;
      return;
     }
     //防止没有乘客发信号,系统进入死循环
     for(i=1;i<=this->n;i++)
      { if (this->m_passenger.bInLift ==false && this->m_elevator.bStop ==true && this->m_elevator.bStart ==true)
      { this->m_passenger.bSignal =true; //应该是随机
        break;
      }
      }
     }
    else {
      KillTimer(1); //如果电梯运行标志为false,则停止仿真
    }
    dwTime=::GetTickCount() -this->ElapseTime ;
    dwTime=dwTime/1000;
    sen.Format("%d",dwTime%60);
    h.Format("%d",dwTime/3600);
    m.Format("%d",(dwTime/60)%60);
    showtime=h+" : "+m+" : "+sen;
    this->SetDlgItemText(IDC_STATIC16,showtime);
   }
   else if (nIDEvent==4) //电梯空载运行(去接乘客)
   { if (this->iEmptySrcFloor ==this->iEmptyDesFloor ) //到达目的地了
    { if (this->iEmptySrcFloor !=1 && this->iEmptySrcFloor !=10 )
     {
      this->DrawColor(iEmptySrcFloor,1);
      this->DrawColor(iEmptySrcFloor,-1);
     }
     //因为到站了,所以要把电梯设置为接收信号状态
     this->m_elevator.bStop =true; //电梯不运行了
     this->m_elevator.bIsEmptyOperation =false; //为满载作准备
     this->m_elevator.iAtFloor =this->m_elevator.iToFloor ;
     this->m_elevator.iToFloor=this->m_elevator.m_passengers[0].iToFloor;
     KillTimer(4);
     this->itimes[4]=0;
     this->iSrcFloor =this->m_elevator.iAtFloor;
     this->iDesFloor =this->m_elevator.iToFloor ;
     this->m_elevator.bStop =false; //电梯启动
     this->itimes[2]++;
     if (this->itimes[2]==1)
      SetTimer(2,2000 ,0); //启动乘客上电梯 }
      if (iEmptySrcFloor <iEmptyDesFloor)
      { this->DrawColor(iEmptySrcFloor,1);
       iEmptySrcFloor++; }
      else {
       this->DrawColor(iEmptySrcFloor,-1);
       iEmptySrcFloor--;
       }
    }
    else if(nIDEvent==2) //电梯每隔3秒,电梯是载客运行,还有一种情况是无客运行
    {if (iSrcFloor <iDesFloor)
      { this->DrawColor(iSrcFloor,1);
       iSrcFloor++; }
    else if (iSrcFloor >iDesFloor)
    {
     this->DrawColor(iSrcFloor,-1);
     iSrcFloor--;
    }
    if (iSrcFloor ==iDesFloor) //到达目的地了
    { this->DrawColor(iSrcFloor,1);
     this->DrawColor(iSrcFloor,-1);
     //因为到站了,所以要把电梯设置为接收信号状态
     this->m_elevator.bStop =true;
     this->m_elevator.iAtFloor =this->m_elevator.iToFloor ;
     //进行卸载乘客得操作
     srand(::GetTickCount());
     a =rand()%10+1; //产生一个1到10得随机数
     this->m_elevator.m_passengers[0].iAtFloor =this->m_elevator.m_passengers[0].iToFloor ;
    this->m_elevator.m_passengers[0].iToFloor = a; //该乘客要去得层数
    this->m_elevator.m_passengers[0].iLifts++;
    if (this->m_elevator.m_passengers[0].iLifts ==this->l )
      this->m_elevator.m_passengers[0].bStart =false;
      this->m_elevator.m_passengers[0].bInLift =false; //电梯外面了
      this->m_elevator.m_passengers.RemoveAll();
      this->m_elevator.iPassengers --;
      //为下一次空载作准备
      this->m_elevator.bStop =true;
      this->m_elevator.bIsEmptyOperation =true;
      KillTimer(2);
      this->itimes[2]=0; } }
    CFormView::OnTimer(nIDEvent);
} 
  四.结论:

  至此,全部的设计过程完毕,上面所有代码已经在VC6.0 +Win2000平台下调试成功。从上面的分析可以看出,实际上运用OOP的思想进行设计的时候,关键是类设计,类设计一定要通过对系统对象域的划分来进 行,而关于类里面的具体成员就必须由系统各个部分的功能来进行确定了。总之,类设计不是一天两天的功夫,需要长期的实践才可能达到熟练的程度。
分享到:
评论

相关推荐

    面向对象程序设计与vc实践

    总之,《面向对象程序设计与vc实践》这份资料全面覆盖了从理论到实践的面向对象编程和VC++应用开发的知识点,对于想要学习或提升C++编程技能,尤其是面向Windows平台开发的程序员来说,是一份非常有价值的参考资料。...

    vc面向对象与可视化程序设计

    《VC面向对象与可视化程序设计》是一本深入探讨Microsoft Visual C++编程技术的书籍,尤其注重面向对象编程和可视化界面设计。面向对象编程(Object-Oriented Programming, OOP)是现代软件开发中的核心概念,它通过...

    面向对象程序设计教程与visual c++6.0教程 经典课件与试题 期末考试 本科

    例如,“12311面向对象程序设计与VC6教程1”这样的文件很可能是练习题或案例分析,你应该仔细研究并尝试自己编写代码。 总的来说,本教程的目标是让你不仅理解面向对象编程的理论,还能熟练运用Visual C++ 6.0进行...

    vc 面向对象 计算器

    **VC面向对象计算器** 在计算机科学领域,面向对象编程(Object-Oriented Programming,简称OOP)是一种重要的编程范式,它将程序设计中的实体(如数据和操作数据的方法)封装为独立的对象,使得代码更加模块化、...

    VC 面向对象的地图投影程序实例.rar

    【VC 面向对象的地图投影程序实例】是一款基于Visual C++开发的开源软件,它提供了丰富的地图投影算法,帮助开发者实现对地理数据的高效处理和可视化。在地图学中,地图投影是一种将地球表面的三维空间转换为二维...

    youlishu.rar_vc 面向对象

    面向对象编程(Object-Oriented Programming,简称OOP)是一种编程范式,它将程序设计中的实体(如数据和操作)封装在独立的对象中,强调数据与操作的结合,通过对象之间的交互实现软件功能。VC++是Microsoft开发的...

    C++_VC面向对象程序设计基础

    C++是一种强大的、通用的编程语言,以其..."C++_VC面向对象程序设计基础"这个资料可能是由一系列章节组成的教程,涵盖了上述各个知识点,对于初学者来说是一个很好的起点,可以逐步深入理解并掌握C++的面向对象编程。

    VC++面向对象与可视化程序设计,黄维通

    《VC++面向对象与可视化程序设计》是一本深入探讨使用Microsoft Visual C++进行面向对象编程和可视化应用开发的专业书籍。作者黄维通以其丰富的教学和实践经验,为读者提供了全面而实用的知识体系,涵盖了从基础概念...

    VC信息系统开发实例精选(3)

    通过分析书中提供的源代码,读者可以理解如何组织和设计大型项目的结构,学习如何使用面向对象编程原则来封装、继承和多态化。同时,了解如何编写高效且易于维护的代码,以及如何调试和优化程序性能。 “另类其它”...

    vc类与对象分析与介绍

    在VC++编程环境中,类与对象是面向对象编程的核心概念,它们构成了现代软件设计的基础。本文将深入探讨VC++中的类和对象,帮助初学者理解这两个关键概念。 首先,我们来了解一下类。类是C++中的一种数据类型,它...

    VC++面向对象与可视化程序设计-源代码-黄维通(第二版)

    《VC++面向对象与可视化程序设计》是黄维通教授的经典著作,主要涵盖了面向对象编程的概念和Microsoft Visual C++(简称VC++)的使用。在第二版中,作者深入浅出地介绍了如何利用C++的强大功能,特别是MFC...

    面向对象有限元程序设计及其VC 与Matlab混合编程实现.pdf

    最后,作者通过一个实际的大型水电站地下硐室群围岩稳定性分析案例,验证了所开发的面向对象有限元分析程序的有效性和实用性。这一案例表明,该程序不仅能处理复杂的三维问题,还能适应不同的工程场景,具有很高的...

    VC 基本面向对象演示代码

    总的来说,这个"VC基本面向对象演示代码"资源对于初学者来说是一个宝贵的实践平台,它将理论知识与实际代码结合起来,有助于深入理解和应用面向对象编程概念。通过阅读和运行这些代码,学习者可以更好地掌握如何在...

    VC开发经典模式与实例.rar

    从第3章开始,结合开发实例,根据现代软件工程的相关理论与方法,详细分析了Visual C++在各种管理系统、图形图像、多媒体、串口通信、网络通信等方面的基本理论、实现原理、项目开发与编程方法。 本书附赠光盘中收录...

    黄维通版 Visaul C++面向对象与可视化程序设计课程实例

    这是黄维通老师编写的《Visual C++面向对象与可视化程序设计》(第二版)课本上的各例题的程序源代码,其中部分例题,本人结合自己学习的体会还进行了少量修改并给出了修改后的程序代码。 供大家参考,希望大家在...

    VC6.0程序设计实例1

    【VC6.0程序设计实例1】是针对Visual C++ 6.0这一经典编程环境的一个实例教程集合,主要关注的是通过实际编程示例来帮助学习者理解和掌握C++编程语言以及VC6.0集成开发环境的使用。在这个教程中,你将接触到一系列的...

    vc开发经典模式与实例 源码

     2-3-2 面向对象分析  2-3-3 面向对象设计  2-4 基于构件的软件开发  2-5 本章小结 第3章 图书馆管理系统实例  3-1 系统分析  3-1-1 图书馆管理系统用例分析  3-1-2 功能模块的需求框图  3-2 UML...

Global site tag (gtag.js) - Google Analytics