zoukankan      html  css  js  c++  java
  • 面向对象程序设计 作业二

    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楼
    ",t,ele[i].end);//文件输出 
    	 }	 
    	printf("等待时间总和:%d",sum);
    	return 0;
     } 
    

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

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

    两者的区别

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

    电梯类

    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;
    } 
    
  • 相关阅读:
    【OpenCV学习】XML的读写
    【学术研究基础】聚类分析学习
    【OpenCV学习】Laplace变换(视频边界检测)
    【OpenCV学习】DFT变换
    【英语天天读】生命的起跑线
    【OpenCV学习】yml的读取
    【OpenCV学习】Kmean均值聚类对图片进行减色处理
    【英语天天读】born to win
    WinFrom 中 label背景透明
    dev GridControl双击行事件
  • 原文地址:https://www.cnblogs.com/azeLibertas/p/8999884.html
Copyright © 2011-2022 走看看