面向对象程序设计 作业二

C语言程序实现

目前为止有两种比较可行的思路:
第一种就是暑假完成作业时所使用的”先来先服务“思路,即根据乘客请求乘坐电梯的先后次序进行调度。这种思路的优点是公平、简单,每位乘客的请求都能依次的得到处理。
实现步骤:首先构造对应的结构体存储输入的数据,然后将初始时混乱的时间顺序按照升序排序,以便根据时间的先后顺序来调度电梯运行,计算相邻两个请求的时间差来判断电梯是否可以将路径方向相同的乘客带上电梯,最后输出电梯的运行时间及调度状态。附上此种思路的简单代码构成:

#include<stdio.h>
#include<math.h> 
FILE* stream;
FILE* outputfile;
int main ()
{
    struct elevator
    {
        int time;
        int start;
        int end;
    }ele[5],temp;//构造对应的结构体存储数据 
    int i,j,sum=0,t=0;
    stream=fopen("input.txt","r");
    outputfile=fopen("output.txt","w");
    if(stream==NULL)
        printf("error");
    else
    {
        for(i=0;i<5;i++)
        {
            fscanf(stream,"%d %d %d",&ele[i].time,&ele[i].start,&ele[i].end);
        }       
    }//文件输入 
    for(i=0;i<5;i++)
        for(j=0;j<4-i;j++)
        {
            if(ele[j].time>ele[j+1].time)
            {
                temp=ele[j];
                ele[j]=ele[j+1];
                ele[j+1]=temp;
             }
         }//利用冒泡法从小到大排序 
    for(i=0;i<5;i++)
    {
        if(i==0)
        {
            t=ele[i].time;
            t+=fabs(ele[i].start-1)+1+fabs(ele[i].end-ele[i].start);  
        }//计算第一趟所用时间 
        else
        {
            if(ele[i].time-t-fabs(ele[i].start-ele[i-1].end)>0)
                t+=ele[i].time-t-fabs(ele[i].start-ele[i-1].end);//判断电梯是否可以将相同路径的乘客带上电梯
            t+=fabs(ele[i].start-ele[i-1].end)+1+fabs(ele[i].end-ele[i].start);
        }//计算后四趟所用时间 
        sum+=t-ele[i].time;
        if(outputfile==NULL)
            printf("error");
        else
            fprintf(outputfile,"%d时,停靠在%d楼\n",t,ele[i].end);//文件输出 
     }   
    printf("等待时间总和:%d",sum);
    return 0;
 } 

第二种是”电梯往返运动进行扫描“的思路,类似于公交车的运行方式,乘客乘上电梯的次序与乘客请求的路径方向和距离电梯的位置关系来决定,这种思路的好处在于一次扫描中能够将所有与电梯运行方向相同的乘客带上电梯,避免了电梯频繁的来回调度。

C++面向对象实现的类图

1330073-20180506230722165-312367773.png

两者的区别

面向过程是分析出解决问题需要进行的步骤,然后通过调用函数将这些步骤一项一项的加以实现,最终达到解决问题的目的。
面向对象是分析出问题中包含的各种各样的对象与需求,每个对象实现自身的功能并且完成对应的需求,最终代码的组成即为各个对象之间分工合作的结果。

电梯类

class Elevator
{

private:
    int currentFloor;   // 电梯当前楼层 
    int direction;    // 1 代表向上  ,0 代表向下

public:
    int floor = 0;
    int gotofloor(int a, int b);//前往出发点耗时
    int wait(int time, int asktime);//等待请求时间
    int finish(int fromfloor, int tofloor);//前往目的楼层耗时

    Elevator();
    ~Elevator();

};
int Elevator::gotofloor(int a, int b)
{
    a = abs(a - b);
    return a;
}//前往请求楼层耗时

int Elevator::wait(int time, int asktime)
{
    if (asktime > time)
    {
        time = asktime - time;
        return time;
    }
    else
        return 0;
    }//等待下一次请求耗时

int Elevator::finish(int fromfloor, int tofloor)
{
    fromfloor = abs(tofloor - fromfloor);
    return fromfloor;
}//前往目的楼层耗时

Elevator::Elevator()
{

}
Elevator::~Elevator()
{
    cout<<"析构函数"<<endl;
} 

转载于:https://www.cnblogs.com/azeLibertas/p/8999884.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值