cyxdbk

导航

题目集5~7的总结性Blog

前言

 这三次题目集围绕Java面向对象编程的核心概念展开,呈现了明显的渐进式难度提升和知识点扩展。题目集5主要考察基础单个类的设计与简单算法实现(如身份证校验码计算、一元二次方程求解、正则表达式的应用、电梯单个类的设计),主要聚焦于单个电梯类的设计,需要使用简单的look算法对电梯内外部的首个请求进行判断。题量适中(5题),难度以基础语法和面向对象入门为主。题目集6开始进行多个类的设计,主要聚焦于单部电梯调度问题的多个类的设计,涉及状态模式、队列管理等核心概念,题量精简(3题),但单题复杂度显著提升。题目集7进一步的考察多个类中的协作关系,在电梯调度问题上进行迭代开发,强化了设计模式应用,虽然题量减少(3题),但系统设计要求更高,需处理多类协作和复杂调度逻辑。三次题目集共同构建了从基础语法到系统设计的完整学习路径,尤其通过电梯问题的三次迭代,生动展现了面向对象设计的演进过程。

设计与分析

题目集5:单部电梯调度问题分析

目标:设计单部可稍带电梯。

算法:LOOK (每到一楼层,对队列中的头请求进行判断)。

电梯:电梯类,电梯请求:添加内部请求,添加外部请求。应停当前楼层,是否有请求,初始方向,更新方向,处理请求,运行

int 最大楼层数;
int 最小楼层数=1;
int 当前楼层=1;
String 运行方向="静止";
String 运行状态="停止";
int[][] 电梯内部请求队列;
int 内部请求数量=0;
int [][] 外部请求队列;
int 外部请求数=0;
public 电梯();
public int get最大楼层数();
public void set最大楼层数(int 最大楼层数);
public int get最小楼层数();
public void set最小楼层数(int 最小楼层数);
public void 添加内部请求(int 楼层);
public void 添加外部请求(int 楼层,String 方向);
public boolean 有请求();
public boolean 应停当前楼层();
public void 处理请求(int 楼层);
public void 初始方向();
public void 更新方向();
public void 运行();

Metrics Details For File 'Main.java.txt'
--------------------------------------------------------------------------------------------

Parameter Value
========= =====
Project Directory D:\PTA\
Project Name SMTest
Checkpoint Name Baseline
File Name Main.java.txt
Lines 501
Statements 347
Percent Branch Statements 34.3
Method Call Statements 47
Percent Lines with Comments 0.0
Classes and Interfaces 1
Methods per Class 1.00
Average Statements per Method 22.00
Line Number of Most Complex Method 472
Name of Most Complex Method Main.main()
Maximum Complexity 5
Line Number of Deepest Block 75
Maximum Block Depth 8
Average Block Depth 4.49
Average Complexity 5.00

--------------------------------------------------------------------------------------------
Most Complex Methods in 1 Class(es): Complexity, Statements, Max Depth, Calls

Main.main() 5, 22, 4, 3

--------------------------------------------------------------------------------------------
Block Depth Statements

0 2
1 10
2 47
3 47
4 57
5 72
6 76
7 20
8 16
9+ 0
--------------------------------------------------------------------------------------------

 踩坑心得

问题1:

public void 添加内部请求(int 楼层){
        if(楼层>=最小楼层数&&楼层<=最大楼层数){
        	boolean 已存在=false;
        	for(int i=0;i<内部请求数量;i++) {
        		if(电梯内部请求队列[i][0]==楼层) {
        			已存在=true;
        			break;
        		}
        	  }
        	if(!已存在) {
           电梯内部请求队列[内部请求数量][1]=1;
           电梯内部请求队列[内部请求数量][0]=楼层;
           内部请求数量++;
           
        }
        }
    }
    public void 添加外部请求(int 楼层,String 方向){
        if(楼层>=最小楼层数&&楼层<=最大楼层数){
        	boolean 已存在=false;
        	if(方向.equals("UP")) {
        		for(int i=0;i<外部上行请求数量;i++) {
        		if(电梯外部上行请求队列[i]==楼层) {
        			已存在=true;
        			break;
        		}
        	  }
        	}
        	else if(方向.equals("DOWN")) {
        		for(int i=0;i<外部下行请求数量;i++) {
        		if(电梯外部下行请求队列[i]==楼层) {
        			已存在=true;
        			break;
        		}
        	  }
        	}
        	if(!已存在) {
        		外部请求队列[外部请求数][0]=楼层;
        		if(方向.equals("UP")) {
        	外部请求队列[外部请求数][1]=2;
        	外部请求队列[外部请求数][2]=1;
            外部请求数++;
            电梯外部上行请求队列[外部上行请求数量++]=楼层;
        }
        	else if(方向.equals("DOWN")) {
        		外部请求队列[外部请求数][1]=3;
        		外部请求队列[外部请求数][2]=1;
                外部请求数++;
                电梯外部下行请求队列[外部下行请求数量++]=楼层;
        	}
        }
        }
    }

题目在添加内部请求和外部请求得过程中并未对是否存在相同的请求进行判断,导致逻辑正确却一直答案错误。

问题2:

public boolean 应停当前楼层() {
            if(运行方向.equals("UP")) {
                if(内部请求数量>0&&外部请求数>0) {
                    if(电梯内部请求队列[0][0]==当前楼层&&外部请求队列[0][0]==当前楼层) {
                        电梯内部请求队列[0][1]=0;
                        外部请求队列[0][2]=0;
                        return true;
                    }
                    else if(电梯内部请求队列[0][0]==当前楼层) {
                        电梯内部请求队列[0][1]=0;
                        return true;
                    }
                    else if(外部请求队列[0][0]==当前楼层&&外部请求队列[0][1]==2) {
                        外部请求队列[0][2]=0;
                        return true;
                    }
                    else if(外部请求队列[0][0]==当前楼层&&电梯内部请求队列[0][0]<当前楼层) {
                        外部请求队列[0][2]=0;
                        return true;
                    }
               }
                else if(外部请求数>0) {
                    if(外部请求队列[0][0]==当前楼层) {
                        外部请求队列[0][2]=0;
                        return true;
                    }
                }
                else if(内部请求数量>0) {
                    if(电梯内部请求队列[0][0]==当前楼层) {
                        电梯内部请求队列[0][1]=0;
                        return true;
                    }
                }
            }
            if(运行方向.equals("DOWN")) {
                if(内部请求数量>0&&外部请求数>0) {
                    if(电梯内部请求队列[0][0]==当前楼层&&外部请求队列[0][0]==当前楼层) {
                        电梯内部请求队列[0][1]=0;
                        外部请求队列[0][2]=0;
                        return true;
                    }
                    else if(电梯内部请求队列[0][0]==当前楼层) {
                        电梯内部请求队列[0][1]=0;
                        return true;
                    }
                    else if(外部请求队列[0][0]==当前楼层&&外部请求队列[0][1]==3) {
                        外部请求队列[0][2]=0;
                        return true;
                    }
                    else if(外部请求队列[0][0]==当前楼层&&电梯内部请求队列[0][0]>当前楼层) {
                        外部请求队列[0][2]=0;
                        return true;
                    }
               }
                else if(外部请求数>0) {
                    if(外部请求队列[0][0]==当前楼层) {
                        外部请求队列[0][2]=0;
                        return true;
                    }
                }
                else if(内部请求数量>0) {
                    if(电梯内部请求队列[0][0]==当前楼层) {
                        电梯内部请求队列[0][1]=0;
                        return true;
                    }
                }
            }
            return false;
        }

代码逻辑太过复杂无效代码过多。

问题3:

代码中的属性与方法都使用了中文,没有规范书写。

总结:

对题目的要求需要查看清楚,不要添加过多无效的代码,并且对题目的逻辑要有一个清晰的了解,减小逻辑的复杂度,并且书写需要规范。

题目集6:单部电梯调度程序(类设计)

目标:将题目集5的电梯单个类进行拆分成多个类,使其满足面向对象的思想。

算法:LOOK (每到一楼层,对队列中的头请求进行判断)。

Request:请求类

int floor;
String dir;
boolean isInt;
int status; 
public Request(int floor, String dir, boolean isInt);

Controller:电梯控制器类,应停当前楼层,初始方向,改变方向,运行

Elevator eCtrl;
RequestQueue reqCtrl;
int currFloor;
String dir;
public Controller(Elevator eCtrl, RequestQueue reqCtrl);
public boolean shouldStop();
public void initDir();
public void updateDir();
public void run();

RequestQueue:请求队列类,添加内部请求,添加外部请求,是否有请求,处理请求

Elevator eCtrl;
Request[] intReqQueue;
Request[] extReqQueue;
int intReqCount = 0;
int extReqCount = 0;
int minFloor;
int maxFloors;
public RequestQueue(int minFloor, int maxFloors);public void addIntReq(int floor);
public void addExtReq(int floor, String dir);
public boolean hasReqs();
public void processReq(int currFloor);

Elevator:电梯类,移动电梯,开门,关门

int maxFloors;
int minFloor = 1;
int currFloor = 1;
String dir = "静止";
public Elevator();
public int getCurrFloor();
public void setCurrFloor(int currFloor);
public int getMaxFloors();
public void setMaxFloors(int maxFloors);
public int getMinFloor();
public void setMinFloor(int minFloor);
public void move();
public void openDoor(int floor);
public void closeDoor();

Metrics Details For File '7.java.txt'
--------------------------------------------------------------------------------------------

Parameter Value
========= =====
Project Directory D:\PTA\
Project Name SMTest2
Checkpoint Name Test
File Name 7.java.txt
Lines 373
Statements 280
Percent Branch Statements 31.1
Method Call Statements 55
Percent Lines with Comments 0.0
Classes and Interfaces 5
Methods per Class 4.60
Average Statements per Method 10.04
Line Number of Most Complex Method 150
Name of Most Complex Method ControlOperation.shouldStopAtCurrentFloor()
Maximum Complexity 53
Line Number of Deepest Block 166
Maximum Block Depth 6
Average Block Depth 3.29
Average Complexity 6.35

--------------------------------------------------------------------------------------------
Most Complex Methods in 5 Class(es): Complexity, Statements, Max Depth, Calls

ControlOperation.ControlOperation() 1, 4, 2, 0
ControlOperation.initialDirection() 5, 6, 3, 1
ControlOperation.run() 6, 13, 4, 11
ControlOperation.shouldStopAtCurrentFloor() 53, 83, 6, 26
ControlOperation.updateDirection() 32, 36, 6, 2
Elevator.closeDoor() 1, 1, 2, 1
Elevator.Elevator() 1, 0, 0, 0
Elevator.getCurrentFloor() 1, 1, 2, 0
Elevator.getMaxFloor() 1, 1, 2, 0
Elevator.getMinFloor() 1, 1, 2, 0
Elevator.move() 3, 4, 3, 2
Elevator.openDoor() 1, 1, 2, 1
Elevator.setCurrentFloor() 1, 1, 2, 0
Elevator.setMaxFloor() 1, 1, 2, 0
Elevator.setMinFloor() 1, 1, 2, 0
Main.main() 7, 30, 5, 8
PassengerRequest.PassengerRequest() 1, 5, 2, 0
RequestQueue.addExternalRequest() 8, 7, 5, 0
RequestQueue.addInternalRequest() 6, 7, 5, 0
RequestQueue.hasRequest() 3, 3, 3, 0
RequestQueue.processRequest() 10, 19, 5, 2
RequestQueue.RequestQueue() 1, 2, 2, 0
RequestQueue.RequestQueue() 1, 4, 2, 1

--------------------------------------------------------------------------------------------
Block Depth Statements

0 6
1 43
2 60
3 38
4 50
5 54
6 29
7 0

9+ 0
--------------------------------------------------------------------------------------------

 

 

 

 

 踩坑心得

问题1:

在将单个电梯类修改为面向对象得多个类得过程中,对要设计成哪些类,类里用哪些方法不清晰,导致在修改过程中思路不清晰,浪费了大量的时间。

总结

在编写代码之前,要先厘清需要哪些类和类中的方法要哪些,首先设计类图再编写代码,这样可以节省大量时间。

题目集7:单部电梯调度程序(类设计-迭代)

目标:将题目集6的类进行迭代修改。

算法:LOOK (每到一楼层,对队列中的头请求进行判断)

Elevator:电梯类,移动电梯,开门,关门

int maxFloor;
int minFloor = 1;
int currentFloor = 1;
String direction = "静止";
public Elevator()
public int getCurrentFloor()
public void setCurrentFloor(int currentFloor)
public int getMaxFloor()
public void setMaxFloor(int maxFloor)
public int getMinFloor()
public void setMinFloor(int minFloor)
public void move()
public void openDoor(int floor)
public void closeDoor()

PassengerRequest:请求类

int floor1;
int floor2;
String direction;
boolean isInternalRequest;
int status;
public PassengerRequest(int floor1, int floor2, String direction, boolean isInternalRequest)

RequestQueue:请求队列类,添加内部请求,添加外部请求,是否有请求,处理请求

Elevator elevatorControl;
PassengerRequest[] internalRequestQueue;
PassengerRequest[] externalRequestQueue;
int internalRequestCount = 0;
int externalRequestCount = 0;
int minFloor;
int maxFloor;
public RequestQueue(int minFloor, int maxFloor)
public void addInternalRequest(int floor)
public void addExternalRequest(int floor1, int floor2, String direction)
public boolean hasRequest()
public void processRequest(int currentFloor)

ControlOperation:电梯控制器类,应停当前楼层,初始方向,改变方向,运行

Elevator elevatorControl;
RequestQueue requestControl;
int currentFloor;
String runningDirection;
public ControlOperation(Elevator elevatorControl, RequestQueue requestControl)
public boolean shouldStopAtCurrentFloor()
public void initialDirection()
public void updateDirection()
public void run()

Metrics Details For File '7-3.java.txt'
--------------------------------------------------------------------------------------------

Parameter Value
========= =====
Project Directory D:\PTA\
Project Name SMTest4
Checkpoint Name Baseline
File Name 7-3.java.txt
Lines 392
Statements 280
Percent Branch Statements 31.1
Method Call Statements 55
Percent Lines with Comments 0.0
Classes and Interfaces 5
Methods per Class 4.60
Average Statements per Method 10.04
Line Number of Most Complex Method 150
Name of Most Complex Method ControlOperation.shouldStopAtCurrentFloor()
Maximum Complexity 53
Line Number of Deepest Block 166
Maximum Block Depth 6
Average Block Depth 3.29
Average Complexity 6.35

--------------------------------------------------------------------------------------------
Most Complex Methods in 5 Class(es): Complexity, Statements, Max Depth, Calls

ControlOperation.ControlOperation() 1, 4, 2, 0
ControlOperation.initialDirection() 5, 6, 3, 1
ControlOperation.run() 6, 13, 4, 11
ControlOperation.shouldStopAtCurrentFloor() 53, 83, 6, 26
ControlOperation.updateDirection() 32, 36, 6, 2
Elevator.closeDoor() 1, 1, 2, 1
Elevator.Elevator() 1, 0, 0, 0
Elevator.getCurrentFloor() 1, 1, 2, 0
Elevator.getMaxFloor() 1, 1, 2, 0
Elevator.getMinFloor() 1, 1, 2, 0
Elevator.move() 3, 4, 3, 2
Elevator.openDoor() 1, 1, 2, 1
Elevator.setCurrentFloor() 1, 1, 2, 0
Elevator.setMaxFloor() 1, 1, 2, 0
Elevator.setMinFloor() 1, 1, 2, 0
Main.main() 7, 30, 5, 8
PassengerRequest.PassengerRequest() 1, 5, 2, 0
RequestQueue.addExternalRequest() 8, 7, 5, 0
RequestQueue.addInternalRequest() 6, 7, 5, 0
RequestQueue.hasRequest() 3, 3, 3, 0
RequestQueue.processRequest() 10, 19, 5, 2
RequestQueue.RequestQueue() 1, 2, 2, 0
RequestQueue.RequestQueue() 1, 4, 2, 1

--------------------------------------------------------------------------------------------
Block Depth Statements

0 6
1 43
2 60
3 38
4 50
5 54
6 29
7 0
8 0
9+ 0
--------------------------------------------------------------------------------------------

 

 

踩坑心得

第三次题目集较前两次来讲还是比较简单的,完成作业只需修改少量的代码,只是修改完之后有一些不再需要的属性可以删去,但我删去实在是太难了,所有的逻辑都要进行修改,所以我只是添加了一些新的属性然后只做略微修改,虽然完成了作业,但这还是不可取的。

改进建议

将长度过长的shouldStopAtCurrentFloor()方法进行拆分,将内部请求和外部请求的判断分别写一个方法进行判断,减少深层嵌套并添加代码的可维护性;

增强健壮性,包括增加楼层范围校验、处理边界条件和一些在测试中没有的特殊情况的判断;

数据结构上用队列替代数组来优化请求管理效率;

对代码添加一些注释,增加代码的可读性,便于后续的修改;

注意代码编写的规范性,对于属性与方法的命名要满足命名规则;

总结

这次电梯题目的三次作业最令我痛苦的是第一次作业,刚开始对这个题目进行分析的时候看了很久的题目都没有厘清电梯运行的逻辑,每天绞劲脑汁的思考电梯的运行逻辑,每次一有新的思路就赶紧修改代码测试,但每次修改完都会出现新的问题,但经过我不断的思考和完善逻辑,还是终于将第一次作业给写出来了,这之后的第二次和第三次作业就比较好推进了,在厘清了逻辑的情况下只用将单个类按面向对象的思路拆分再进行修改代码就能较好的完成作业。

但在完成作业的过程中,为了完成作业,我忽视了一些可能出现但在测试中没有的特殊情况,而且停止逻辑编写的也比较直白,if-else嵌套层次太高并且重复的代码也挺多的,而且对注释也不是很重视,代码都没有写注释,给我在后续的修改中带来了很大的困难,每次要运用一个属性我都要找好久这个属性叫什么,并且在隔天修改代码的时候感觉我在看天书一样,不知道这些英文代表着哪些属性和方法。

总之,这次的作业还是存在很大的完善空间的,而我在面向对象的学习上也还存在着不少的问题,类与类之间的关系还不能很好的编写,导致代码的耦合程度较高,在后续的学习中还要加强这方面的学习。

 

posted on 2025-04-17 21:43  啦~~~~~~~~~~啦  阅读(25)  评论(0)    收藏  举报