第一次blog作业

前言:
第一次写blog啊,有点激动。关于前三次大作业吧,都是围绕面向对象展开的,主要锻炼我们面对对象的能力,关于题目,第五次题目集有五道题目,第六,七次题目集只有三道题目,并且都是按照难度来排列的,但对于我来说,除了电梯的题目其他的都没有难度,但对于我来说,电梯的难度就很大了,以至于一题都没有写出来😭。题目集5主要考察了单个类的掌握情况,题目集6主要考察了多个类的掌握情况,题目集7考察了进阶的多个类的掌握情况,并且都是在以面对对象为基础的
设计与分析:
额,由于第一次电梯题目一直弄不懂电梯的运行规则,导致一直没有思路去写这个程序,因此没有源码来提交,各个题目集的前面几个小题都是没有问题的,在这里就不做太多分析了,主要来看当时怎么写的电梯程序吧。
第一次电梯程序:
/*设计一个电梯类,具体包含电梯的最大楼层数、最小楼层数(默认为1层)当前楼层、运行方向、运行状态,以及电梯内部乘客的请求队列和电梯外部楼层乘客的请求队列,其中,电梯外部请求队列需要区分上行和下行。
电梯运行规则如下:电梯默认停留在1层,状态为静止,当有乘客对电梯发起请求时(各楼层电梯外部乘客按下上行或者下行按钮或者电梯内部乘客按下想要到达的楼层数字按钮),电梯开始移动,当电梯向某个方向移动时,优先处理同方向的请求,当同方向的请求均被处理完毕然后再处理相反方向的请求。电梯运行过程中的状态包括停止、移动中、开门、关门等状态。当电梯停止时,如果有新的请求,就根据请求的方向或位置决定移动方向。电梯在运行到某一楼层时,检查当前是否有请求(访问电梯内请求队列和电梯外请求队列),然后据此决定移动方向。每次移动一个楼层,检查是否有需要停靠的请求,如果有,则开门,处理该楼层的请求,然后关门继续移动。
使用键盘模拟输入乘客的请求,此时要注意处理无效请求情况,例如无效楼层请求,比如超过大楼的最高或最低楼层。还需要考虑电梯的空闲状态,当没有请求时,电梯停留在当前楼层。
请编写一个Java程序,设计一个电梯类,包含状态管理、请求队列管理以及调度算法,并使用一些测试用例,模拟不同的请求顺序,观察电梯的行为是否符合预期,比如是否优先处理同方向的请求,是否在移动过程中处理顺路的请求等。为了降低编程难度,不考虑同时有多个乘客请求同时发生的情况,即采用串行处理乘客的请求方式(电梯只按照规则响应请求队列中当前的乘客请求,响应结束后再响应下一个请求),具体运行规则详见输入输出样例。

输入格式:
第一行输入最小电梯楼层数。
第二行输入最大电梯楼层数。
从第三行开始每行输入代表一个乘客请求。

电梯内乘客请求格式:<楼层数>
电梯外乘客请求格式:<乘客所在楼层数,乘梯方向>,其中,乘梯方向用UP代表上行,用DOWN代表下行(UP、DOWN必须大写)。
当输入“end”时代表输入结束(end不区分大小写)。
输出格式:
模拟电梯的运行过程,输出方式如下:

运行到某一楼层(不需要停留开门),输出一行文本:
Current Floor: 楼层数 Direction: 方向
运行到某一楼层(需要停留开门)输出两行文本:
Open Door # Floor 楼层数
Close Door*/
在这个题目上,我一直搞不懂这个电梯是怎么运行的,有点理解能力不够的感觉,问了同学好几遍,到自己去理解的时候还是有差错,因此错过了截止时间。到了第二个电梯程序时,才明白了一点点,但是等编写好程序运行时,总会出现输出的格式和要求的格式有一点不一样,后面修改了多次,也改不好,emm,大概是没有理解透这个电梯的运行逻辑,并且我认为我自己的java编程能力还不足,在设置状态、开门关门的设计那里总是出现问题,因此第二、第三次电梯程序都没写出来。电梯说是采用了LOOK算法,即先一边到头再执行另一边,但最终也没有理解LOOK算法是什么,也因此输出总是有些问题。下面是我的最终的代码:
import java.util.ArrayList;
import java.util.InputMismatchException;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main {
public static void main(String[] args) {
Dianti dianti = new Dianti();
Scanner scanner = new Scanner(System.in);
try {
dianti.shuru(scanner);
dianti.shuru1(scanner);
dianti.shuchu();
} catch (InputMismatchException e) {
System.out.println("输入不匹配,请输入有效的整数。");
} catch (IndexOutOfBoundsException e) {
System.out.println("索引越界,请检查输入的楼层数据。" + e.getMessage());
} catch (NumberFormatException e) {
System.out.println("无法将输入转换为整数,请检查输入。");
} finally {
scanner.close();
}
}
}

class Dianti {
private ArrayList a;
private ArrayList b;
private String[] c = {"UP", "DOWN"};

public void shuru(Scanner input) {
    a = new ArrayList<>();
    try {
        for (int i = 0; i < 2; i++) {
            int num = input.nextInt();
            a.add(num);
        }
        input.nextLine();
    } catch (InputMismatchException e) {
        throw e;
    }
}

public void shuru1(Scanner input) {
    b = new ArrayList<>();
    if (a.isEmpty()) {
        throw new IndexOutOfBoundsException("a列表为空,无法获取初始楼层。");
    }
    int initialFloor = a.get(0);
    b.add(initialFloor);

    int minFloor = a.get(0);
    int maxFloor = a.get(1);
    Pattern pattern = Pattern.compile("\\d+");
    try {
        while (true) {
            String line = input.nextLine().trim();
            if ("end".equalsIgnoreCase(line)) {
                break;
            }
            Matcher matcher = pattern.matcher(line);
            while (matcher.find()) {
                String numStr = matcher.group();
                try {
                    int number = Integer.parseInt(numStr);
                    if (number < minFloor || number > maxFloor) {
                        System.out.println("楼层 " + number + " 超出有效范围 " + minFloor + "-" + maxFloor + ",已忽略。");
                        continue;
                    }
                    b.add(number);
                } catch (NumberFormatException e) {
                    System.out.println("无效的数字格式: " + numStr);
                }
            }
        }
    } catch (IndexOutOfBoundsException e) {
        throw e;
    }
}

public void shuchu() {
    int cot = b.size();
    try {
        for (int i = 0; i < cot - 1; i++) {
            int current = b.get(i);
            int next = b.get(i + 1);

            if (current == next) {
                handleSameFloor(current);
                continue;
            }

            String direction = getDirection(current, next);
            printMovement(current, next, direction);
        }
    } catch (IndexOutOfBoundsException e) {
        throw e;
    }
}

private void handleSameFloor(int floor) {
    System.out.println("Current Floor: " + floor);
    doorAction(floor);
}

private String getDirection(int current, int next) {
    return next > current ? c[0] : c[1];
}

private void printMovement(int start, int end, String direction) {
    System.out.println("Current Floor: " + start + " Direction: " + direction);

    if (direction.equals(c[0])) {
        for (int j = start + 1; j <= end; j++) {
            System.out.println("Current Floor: " + j + " Direction: " + direction);
            if (j == end) doorAction(j);
        }
    } else {
        for (int j = start - 1; j >= end; j--) {
            System.out.println("Current Floor: " + j + " Direction: " + direction);
            if (j == end) doorAction(j);
        }
    }
}

private void doorAction(int floor) {
    System.out.println("Open Door # Floor " + floor);
    System.out.println("Close Door");
}

}
最终还是不能把我想的代码实现,所以输出总是出错

由于是第一个题目集的,所以没几个类,思路也和LOOK也有点差异,好吧感觉理解能力有点太差了。我写的思路是比大小的方式来决定上升还是下降,所以输出总是错误。
踩坑心得:
第一次写这种大程序作业,导致理解跟不上,导致写不出题目。

像这样,会重复输出楼层,是我理解不到位的问题,加上自身的编码实力不强,导致这种问题的出现。
改进建议:
我得多去联系编程,多去做题目,加强一点理解能力。
总结:
通过三次的联系,我对面向对象的程序有了基本的认识,对面向对象这个概念有了基础的理解,对于文字代码实现这方面,还得做进一步加强。

posted @ 2025-04-20 22:32  小乔大王  阅读(26)  评论(0)    收藏  举报