OOP课程第二次Blog

1.前言

答题判题程序-4:这次的作业相比第三次增加了填空和多选,难度较大,对于信息的输入和处理都比较复杂。
家居强电电路模拟程序-1:这次作业换成了一个电路类题型,第一题相对简单,只是串联,只要合理将输入的电器存入相应的ArrayList以及hashmap即可,然后便是正确写出一些调节器的逻辑即可进行对电压的计算。
家居强电电路模拟程序-2:这次的大作业将原来的串联改为一个串联和一个并联,相比第一次作业,得新建一个串联电路类,而且要计算各个电器的电阻,然后其余也是将电路的信息存储进map以及ArrayList,最后得出每个电器的分压即可。

2.设计与分析

答题判题程序-4

题目:
设计实现答题程序,模拟一个小型的测试,要求输入题目信息、试卷信息、答题信息、学生信息、删除题目信息,根据输入题目信息中的标准答案判断答题的结果。本题在答题判题程序-3基础上新增的内容统一附加在输出格式说明之后,用粗体标明。

输入格式:

程序输入信息分五种,信息可能会打乱顺序混合输入。

1、题目信息
题目信息为独行输入,一行为一道题,多道题可分多行输入。

格式:"#N:"+题目编号+" "+"#Q:"+题目内容+" "#A:"+标准答案
格式约束:
1、题目的输入顺序与题号不相关,不一定按题号顺序从小到大输入。
2、允许题目编号有缺失,例如:所有输入的题号为1、2、5,缺少其中的3号题。此种情况视为正常。
样例:#N:1 #Q:1+1= #A:2
#N:2 #Q:2+2= #A:4

2、试卷信息

试卷信息为独行输入,一行为一张试卷,多张卷可分多行输入数据。 \

格式:"#T:"+试卷号+" "+题目编号+"-"+题目分值+" "+题目编号+"-"+题目分值+...
格式约束:
题目编号应与题目信息中的编号对应。
一行信息中可有多项题目编号与分值。
样例:#T:1 3-5 4-8 5-2

3、学生信息

学生信息只输入一行,一行中包括所有学生的信息,每个学生的信息包括学号和姓名,格式如下。

格式:"#X:"+学号+" "+姓名+"-"+学号+" "+姓名....+"-"+学号+" "+姓名
格式约束:
答案数量可以不等于试卷信息中题目的数量,没有答案的题目计0分,多余的答案直接忽略,答案之间以英文空格分隔。
样例:
>#S:1 #A:5 #A:22
1是试卷号
5是1号试卷的顺序第1题的题目答案
4、答卷信息

答卷信息按行输入,每一行为一张答卷的答案,每组答案包含某个试卷信息中的题目的解题答案,答案的顺序号与试 卷信息中的题目顺序相对应。答卷中:

格式:"#S:"+试卷号+" "+学号+" "+"#A:"+试卷题目的顺序号+"-"+答案内容+...
格式约束:
答案数量可以不等于试卷信息中题目的数量,没有答案的题目计0分,多余的答案直接忽略,答案之间以英文空格分隔。
答案内容可以为空,即””。
答案内容中如果首尾有多余的空格,应去除后再进行判断。
答卷信息中仅包含试卷号、学号,而没有后续内容的,视为一张空白卷,为有效信息,不做格式错误处理。
样例:
>#T:1 1-5 3-2 2-5 6-9 4-10 7-3
>#S:1 20201103 #A:2-5 #A:6-4
1是试卷号
20201103是学号
2-5中的2是试卷中顺序号,5是试卷第2题的答案,即T中3-2的答案
6-4中的6是试卷中顺序号,4是试卷第6题的答案,即T中7-3的答案
注意:不要混淆顺序号与题号

5、删除题目信息

删除题目信息为独行输入,每一行为一条删除信息,多条删除信息可分多行输入。该信息用于删除一道题目信息,题目被删除之后,引用该题目的试卷依然有效,但被删除的题目将以0分计,同时在输出答案时,题目内容与答案改为一条失效提示,例如:”the question 2 invalid~0”

格式:"#D:N-"+题目号
格式约束:
题目号与第一项”题目信息”中的题号相对应,不是试卷中的题目顺序号。
本题暂不考虑删除的题号不存在的情况。
样例:

#N:1 #Q:1+1= #A:2
#N:2 #Q:2+2= #A:4
#T:1 1-5 2-8
#X:20201103 Tom-20201104 Jack
#S:1 20201103 #A:1-5 #A:2-4
#D:N-2
end

输出:
alert: full score of test paper1 is not 100 points
1+1=5false
the question 2 invalid~0
20201103 Tom: 0 0~0
答题信息以一行"end"标记结束,"end"之后的信息忽略。

输出格式:

1、试卷总分警示

该部分仅当一张试卷的总分分值不等于100分时作提示之用,试卷依然属于正常试卷,可用于后面的答题。如果总分等于100 分,该部分忽略,不输出。
格式:"alert: full score of test paper"+试卷号+" is not 100 points"
约束:有多张试卷时,按输入信息的先后顺序输出警示。

样例:alert: full score of test paper2 is not 100 points

2、答卷信息

一行为一道题的答题信息,根据试卷的题目的数量输出多行数据。

格式:题目内容+""+答案++""+判题结果(true/false)

约束:如果输入的答案信息少于试卷的题目数量,每一个缺失答案的题目都要输出"answer is null" 。

样例:

 answer is null

 3+2=~5~true

 4+6=~22~false.

 answer is null

3、判分信息

判分信息为一行数据,是一条答题记录所对应试卷的每道小题的计分以及总分,计分输出的先后顺序与题目题号相对应。

格式:学号+" "+姓名+": "+题目得分+" "+....+题目得分+"~"+总分
格式约束:
1、没有输入答案的题目、被删除的题目、答案错误的题目计0分
2、判题信息的顺序与输入答题信息中的顺序相同
样例:20201103 Tom: 0 0~0
根据输入的答卷的数量以上2、3项答卷信息与判分信息将重复输出。

4、被删除的题目提示信息

当某题目被试卷引用,同时被删除时,答案中输出提示信息。样例见第5种输入信息“删除题目信息”。

5、题目引用错误提示信息

试卷错误地引用了一道不存在题号的试题,在输出学生答案时,提示”non-existent question~”加答案。例如:

输入:

#N:1 #Q:1+1= #A:2
#T:1 3-8
#X:20201103 Tom-20201104 Jack-20201105 Www
#S:1 20201103 #A:1-4
end
输出:
alert: full score of test paper1 is not 100 points
non-existent question~0
20201103 Tom: 0~0
如果答案输出时,一道题目同时出现答案不存在、引用错误题号、题目被删除,只提示一种信息,答案不存在的优先级最高,例如:

输入:

#N:1 #Q:1+1= #A:2
#T:1 3-8
#X:20201103 Tom-20201104 Jack-20201105 Www
#S:1 20201103
end
输出:
alert: full score of test paper1 is not 100 points
answer is null
20201103 Tom: 0~0
6、格式错误提示信息

输入信息只要不符合格式要求,均输出”wrong format:”+信息内容。

  例如:wrong format:2 #Q:2+2= #4

7、试卷号引用错误提示输出

如果答卷信息中试卷的编号找不到,则输出”the test paper number does not exist”,答卷中的答案不用输出,参见样例8。

8、学号引用错误提示信息

如果答卷中的学号信息不在学生列表中,答案照常输出,判分时提示错误。参见样例9。

本次作业新增内容:

1、输入选择题题目信息

题目信息为独行输入,一行为一道题,多道题可分多行输入。

格式:"#Z:"+题目编号+" "+"#Q:"+题目内容+" "#A:"+标准答案
格式基本的约束与一般的题目输入信息一致。

新增约束:标准答案中如果包含多个正确答案(多选题),正确答案之间用英文空格分隔。
例如:

#Z:2 #Q:宋代书法有苏黄米蔡四家,分别是: #A:苏轼 黄庭坚 米芾 蔡襄
多选题输出:

输出格式与一般答卷题目的输出一致,判断结果除了true、false,增加一项”partially correct”表示部分正确。

多选题给分方式:

答案包含所有正确答案且不含错误答案给满分;包含一个错误答案或完全没有答案给0分;包含部分正确答案且不含错误答案给一半分,如果一半分值为小数,按截尾规则只保留整数部分。
例如:

#N:1 #Q:1+1= #A:2
#Z:2 #Q:党十八大报告提出要加强()建设。A 政务诚信 B 商务诚信 C社会诚信 D司法公信 #A:A B C D
#T:1 1-5 2-9
#X:20201103 Tom
#S:1 20201103 #A:1-5 #A:2-A C
end
输出:
alert: full score of test paper1 is not 100 points
1+1=5false
党十八大报告提出要加强()建设。A 政务诚信 B 商务诚信 C社会诚信 D司法公信~A C~partially correct
20201103 Tom: 0 4~4

2、输入填空题题目信息

题目信息为独行输入,一行为一道题,多道题可分多行输入。

格式:"#K:"+题目编号+" "+"#Q:"+题目内容+" "#A:"+标准答案
格式基本的约束与一般的题目输入信息一致。
例如:#K:2 #Q:古琴在古代被称为: #A:瑶琴或七弦琴
填空题输出:

输出格式与一般答卷题目的输出一致,判断结果除了true、false,增加一项”partially correct”表示部分正确。

填空题给分方式:

答案与标准答案内容完全匹配给满分,包含一个错误字符或完全没有答案给0分,包含部分正确答案且不含错误字符给一半分,如果一半分值为小数,按截尾规则只保留整数部分。

例如:

#N:1 #Q:1+1= #A:2
#K:2 #Q:古琴在古代被称为: #A:瑶琴或七弦琴
#T:1 1-5 2-10
#X:20201103 Tom
#S:1 20201103 #A:1-5 #A:2-瑶琴
end
输出:
alert: full score of test paper1 is not 100 points
1+1=5false
古琴在古代被称为:瑶琴partially correct
20201103 Tom: 0 5~5

3、输出顺序变化

只要是正确格式的信息,可以以任意的先后顺序输入各类不同的信息。比如试卷可以出现在题目之前,删除题目的信息可以出现在题目之前等。

例如:

#T:1 1-5 2-10
#N:1 #Q:1+1= #A:2
#K:2 #Q:古琴在古代被称为: #A:瑶琴或七弦琴
#X:20201103 Tom
#S:1 20201103 #A:1-5 #A:2-古筝
end
输出:
alert: full score of test paper1 is not 100 points
1+1=5false
古琴在古代被称为:古筝false
20201103 Tom: 0 0~0

4、多张试卷信息

本题考虑多个同学有多张不同试卷的答卷的情况。输出顺序优先级为学号、试卷号,按从小到大的顺序先按学号排序,再按试卷号。

例如:

#T:1 1-5 2-10
#T:2 1-8 2-21
#N:1 #Q:1+1= #A:2
#S:2 20201103 #A:1-2 #A:2-古筝
#S:1 20201103 #A:1-5 #A:2-瑶琴或七弦琴
#S:1 20201104 #A:1-2 #A:2-瑟
#S:2 20201104 #A:1-5 #A:2-七弦琴
#X:20201103 Tom-20201104 Jack
#K:2 #Q:古琴在古代被称为: #A:瑶琴或七弦琴
end
输出:
alert: full score of test paper1 is not 100 points
alert: full score of test paper2 is not 100 points
1+1=5false
古琴在古代被称为:瑶琴或七弦琴true
20201103 Tom: 0 10~10
1+1=2true
古琴在古代被称为:古筝false
20201103 Tom: 8 0~8
1+1=2true
古琴在古代被称为:false
20201104 Jack: 5 0~5
1+1=5false
古琴在古代被称为:七弦琴partially correct
20201104 Jack: 0 10~10
新增的题目异常情况的处理与一般题目相同,具体样例参考上一次大作业的样例说明:
答题判题程序-3题面.pdf

输入样例1:
多选题测试,不含删除。例如:

#N:1 #Q:1+1= #A:2
#Z:2 #Q:党十八大报告提出要加强()建设。A 政务诚信 B 商务诚信 C社会诚信 D司法公信 #A:A B C D
#T:1 1-5 2-9
#X:20201103 Tom
#S:1 20201103 #A:1-5 #A:2-A C
end
输出样例1:
在这里给出相应的输出。例如:

alert: full score of test paper1 is not 100 points
1+1=5false
党十八大报告提出要加强()建设。A 政务诚信 B 商务诚信 C社会诚信 D司法公信~A C~partially correct
20201103 Tom: 0 4~4
输入样例2:
填空题测试,不含删除。例如:

#N:1 #Q:1+1= #A:2
#K:2 #Q:古琴在古代被称为: #A:瑶琴或七弦琴
#T:1 1-5 2-10
#X:20201103 Tom
#S:1 20201103 #A:1-5 #A:2-瑶琴
end
输出样例2:
在这里给出相应的输出。例如:

alert: full score of test paper1 is not 100 points
1+1=5false
古琴在古代被称为:瑶琴partially correct
20201103 Tom: 0 5~5
输入样例3:
乱序测试,不含删除。例如:

#T:1 1-5 2-10
#N:1 #Q:1+1= #A:2
#K:2 #Q:古琴在古代被称为: #A:瑶琴或七弦琴
#X:20201103 Tom
#S:1 20201103 #A:1-5 #A:2-古筝
end
输出样例3:
在这里给出相应的输出。例如:

alert: full score of test paper1 is not 100 points
1+1=5false
古琴在古代被称为:古筝false
20201103 Tom: 0 0~0
输入样例4:
两个同学多张不同试卷的答卷,不含删除。例如:

#T:1 1-5 2-10
#T:2 1-8 2-21
#N:1 #Q:1+1= #A:2
#S:2 20201103 #A:1-2 #A:2-古筝
#S:1 20201104 #A:1-2 #A:2-瑟
#S:1 20201103 #A:1-5 #A:2-瑶琴或七弦琴
#S:2 20201104 #A:1-5 #A:2-七弦琴
#X:20201103 Tom-20201104 Jack
#K:2 #Q:古琴在古代被称为: #A:瑶琴或七弦琴
end
输出样例4:
在这里给出相应的输出。例如:

alert: full score of test paper1 is not 100 points
alert: full score of test paper2 is not 100 points
1+1=5false
古琴在古代被称为:瑶琴或七弦琴true
20201103 Tom: 0 10~10
1+1=2true
古琴在古代被称为:古筝false
20201103 Tom: 8 0~8
1+1=2true
古琴在古代被称为:false
20201104 Jack: 5 0~5
1+1=5false
古琴在古代被称为:七弦琴partially correct
20201104 Jack: 0 10~10

答题判题程序-4的做题分析

数据结构设计
基础类
Question: 基础题目类,包含题号、题目内容、答案。
子类:
SingleChoice: 单选题,增加标准答案字段。
MultipleChoice: 多选题,增加标准答案列表字段。
FillBlank: 填空题,增加标准答案字段。
TestPaper: 试卷类,包含试卷号、题目列表(题号与分值映射)。
Student: 学生类,包含学号、姓名。
AnswerSheet: 答卷类,包含学生、试卷号、答案列表(题号与答案映射)。
辅助类
DeleteQuestion: 删除题目的记录,包含题号。

输入处理
解析器: 设计一个解析器类负责读取输入数据,根据输入的指令(#N, #Z, #K, #T, #X, #S, #D)创建相应的对象实例,并存储到相应容器(如题目列表、试卷列表、学生列表、答卷列表、删除题目列表)中。

核心逻辑
分数计算: 实现一个方法用于计算每份答卷的分数,需要考虑题目类型(单选、多选、填空)的评分逻辑,以及是否题目已被删除的情况。
对于多选题,检查答案是否完全正确或部分正确,根据规则给分。
对于填空题,比较答案与标准答案的相似度,决定是否给分或部分给分。
遇到已删除的题目,直接给0分处理。
试卷总分验证: 检查每张试卷的总分是否为100分,如果不是则记录警告信息。
输出格式化: 根据要求格式化输出所有需要的信息,包括试卷总分警示、答题信息、判分信息、被删除的题目提示、格式错误提示、试卷号或学号引用错误提示等

我的部分代码:

import java.util.*;
import java.util.regex.Pattern;
import java.util.regex.Matcher;
class Question {
    private int number;
    private String content;
    private String answer;
    boolean deleted = false;
    public Question(int number, String content, String answer) {
        this.number = number;
        this.content = content;
        this.answer = answer;
    }
    public int getNumber() {
        return number;
    }
    public String getContent() {
        return content;
    }
    public String getAnswer() {
        return answer;
    }
}
class Student {
    private int id;
    private String name;

    public Student(int id, String name) {
        this.id = id;
        this.name = name;
    }

    public int getId() {
        return id;
    }

    public String getName() {
        return name;
    }
}
class TestPaper {

    private int number;


    private LinkedHashMap<Integer, Integer> questions = new LinkedHashMap<>();

    public TestPaper(int number) {
        this.number = number;
    }

    public void addQuestion(int questionNumber, int score) {
        questions.put(questionNumber, score);
    }
    public int getNumber() {
        return number;
    }


    public LinkedHashMap<Integer, Integer> getQuestions() {
        return questions;
    }
}
class Answer{
    private int num;
    private String answer;
    public Answer(){
    }
    public Answer(int num,String answer){
        this.num=num;
        this.answer=answer;
    }
    public int getNum(){
        return num;
    }

    public String getAnswer() {
        return answer;
    }
}
class AnswerSheet {
    private int number;
    private int id;
    private List<Answer> answers = new ArrayList<>();

    public AnswerSheet() {
    }
    public AnswerSheet(int number,int id) {
        this.number = number;
        this.id = id;
    }
    public void addAnswer(Answer answer) {
        answers.add(answer);
    }

    public int getId() {
        return id;
    }

    public int getNumber() {
        return number;
    }
    public List<Answer> getAnswers() {
        return answers;
    }

}
public class Main {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        LinkedHashMap<Integer, Question> questionMap = new LinkedHashMap<>();
        LinkedHashMap<Integer, TestPaper> testPaperMap = new LinkedHashMap<>();
        ArrayList<Student> studentList =new ArrayList<>();
        ArrayList<AnswerSheet>answerList=new ArrayList<>();
        int Id=0;
        int flag1=0;
        int num1=-1;
        while (scanner.hasNextLine()) {
            String line = scanner.nextLine().trim();
            if (line.equals("end")) {
                processAnswerSheet(answerList, testPaperMap, questionMap,studentList,Id,flag1,num1);
                break;
            } else if (line.startsWith("#N:")) {
                String str=line;
                Pattern pattern = Pattern.compile("#N:(\\s*\\d+\\s*)#Q:(.*)#A:(.*)");
                Matcher matcher = pattern.matcher(str);
                boolean isMatch = matcher.matches() ;
                if(!isMatch){
                    flag1++;
                    System.out.println("wrong format:"+line);

                }else {
                    flag1++;
                    String[] parts = line.split(" ");
                    int number = Integer.parseInt(parts[0].substring(3));
                    String content = parts[1].substring(3);
                    String answer = parts[2].substring(3);
                    Question question = new Question(number, content, answer);
                    questionMap.put(number, question);
                }
            } else if (line.startsWith("#Z:")) {
                String str=line;
                Pattern pattern = Pattern.compile("#Z:(\\s*\\d+\\s*)#Q:(.*)#A:(.*)");
                Matcher matcher = pattern.matcher(str);
                boolean isMatch = matcher.matches() ;
                if(!isMatch){
                    flag1++;
                    System.out.println("wrong format:"+line);
                }else{
                    flag1++;
                        int number = Integer.parseInt(matcher.group(1).trim());
                        String content = matcher.group(2).trim();
                        String answer = matcher.group(3);
                    Question question = new Question(number, content, answer);
                    questionMap.put(number, question);
                }

            } else if (line.startsWith("#K:")) {
                String str=line;
                Pattern pattern = Pattern.compile("#K:(\\s*\\d+\\s*)#Q:(.*)#A:(.*)");
                Matcher matcher = pattern.matcher(str);
                boolean isMatch = matcher.matches() ;
                if(!isMatch){
                    flag1++;
                    System.out.println("wrong format:"+line);
                }else{
                    flag1++;
                    int number = Integer.parseInt(matcher.group(1).trim());
                    String content = matcher.group(2).trim();
                    String answer = matcher.group(3);
                    Question question = new Question(number, content, answer);
                    questionMap.put(number, question);
                }

            } else if (line.startsWith("#T:")) {
                String str=line;
                Pattern pattern = Pattern.compile("#T:\\s*(\\d*)\\s*(\\s*\\d+-\\d+\\s*)*");
                Matcher matcher = pattern.matcher(str);
                boolean isMatch = matcher.matches() ;
                if(!isMatch) {
                    System.out.println("wrong format:" + line);
                    String[] parts = line.split(" ");
                    int number = Integer.parseInt(parts[0].substring(3));
                    num1=number;
                } else  {
                    String[] parts = line.split(" ");
                    int number = Integer.parseInt(parts[0].substring(3));
                    num1=number;
                    TestPaper testPaper = new TestPaper(number);
                    for (int i = 1; i < parts.length; i++) {
                        String[] questionScore = parts[i].split("-");
                        int questionNumber = Integer.parseInt(questionScore[0]);
                        int score = Integer.parseInt(questionScore[1]);
                        testPaper.addQuestion(questionNumber, score);
                    }
                    testPaperMap.put(number, testPaper);
                }
            } else if (line.startsWith("#X:")) {
                String str=line;
                Pattern pattern = Pattern.compile("#X:\\s*(\\d+)\\s*(.*)(-(\\d+)\\s*(.*))*");
                Matcher matcher = pattern.matcher(str);
                boolean isMatch = matcher.matches() ;
                if(!isMatch) {
                    System.out.println("wrong format:" + line);


                }

                else {
                    String[] parts = line.substring(3).split("[-\\s]+");
                    for (int i = 0; i < parts.length; i += 2) {
                        int id = Integer.parseInt(parts[i]);
                        Student student = new Student(id, parts[i + 1]);
                        studentList.add(student);
                    }
                }
            } else if (line.startsWith("#D:N-")) {
                String str=line;
                Pattern pattern = Pattern.compile("#D:N-\\s*\\d+\\s*");
                Matcher matcher = pattern.matcher(str);
                boolean isMatch = matcher.matches() ;
                if(!isMatch) {
                    System.out.println("wrong format:" + line);
                }
                else{
                    int id = Integer.parseInt(line.substring(5));
                    Id = id;
                }
            } else if (line.startsWith("#S:")) {
                String str=line;
                Pattern pattern = Pattern.compile("#S:\\s*(\\d+)\\s+(\\w*)\\s*(#A:\\s*(\\d+-?[^#]*))*");
                Matcher matcher = pattern.matcher(str);
                boolean isMatch = matcher.matches() ;
                if(!isMatch) {
                    System.out.println("wrong format:" + line);
                }
                else{
                    String[] parts = str.split("#S:(|\\s)|#A:|-");
                    String[] parts1=parts[1].split(" ");
                    int number = Integer.parseInt(parts1[0]);
                    int id=Integer.parseInt(parts1[1]);
                    AnswerSheet answerSheet = new AnswerSheet(number, id);
                    for (int i =2; i < parts.length; i +=2) {
                        int num=Integer.parseInt(parts[i].trim());
                        Answer answer=new Answer(num,parts[i+1].trim());
                        answerSheet.addAnswer(answer);
                    }
                    answerList.add(answerSheet);
                }
            }
            else {
                System.out.println("wrong format:"+line);
            }

        }
    }
public static void zf(ArrayList<AnswerSheet> answerList,LinkedHashMap<Integer, TestPaper> testPaperMap,int num1) {
	}
}


答题判题程序-4总结

这个题我的类结构设计:
Question: 代表题目,有题号、题目内容、答案。
Student: 学生类,包含学号、姓名。
TestPaper: 试卷类,包含试卷号和题目(题号与分值映射)的映射。
Answer: 答案类,包含题号和学生的答案内容。
AnswerSheet: 答卷,包含学生、试卷号和答案列表。
主函数流程:
初始化: 准备好数据结构,如HashMap存储题目、试卷、学生列表、答案卡列表。
输入处理: 逐行读取用户输入,解析并根据指令执行相应操作:
添加题目(#N:单选题/多选题/填空题) - 创建试卷(#T:试卷号 题号-分值 题号-分值...) - 添加学生(#X:学号 姓名 学号 姓名...) - 删除题目(#D:N-题号) - 输入答案(#S:试卷号 学号 答案内容 答案内容...`)
异常处理: 对不合规的输入格式输出错误提示。
判卷处理: 调用processAnswerSheet方法。
我的总体逻辑大概没有太大问题,但是对于一些方法以及类的包含的属性还是没能写出来,对题目的理解还是不够深。

家居强电电路模拟程序-1

题目:
智能家居是在当下家庭中越来越流行的一种配置方案,它通过物联网技术将家中的各种设备(如音视频设备、照明系统、窗帘控制、空调控制、安防系统、数字影院系统、影音服务器、影柜系统、网络家电等)连接到一起,提供家电控制、照明控制、电话远程控制、室内外遥控、防盗报警、环境监测、暖通控制、红外转发以及可编程定时控制等多种功能和手段。与普通家居相比,智能家居不仅具有传统的居住功能,兼备建筑、网络通信、信息家电、设备自动化,提供全方位的信息交互功能。请根据如下要去设计一个智能家居强电电路模拟系统。

1、控制设备模拟

本题模拟的控制设备包括:开关、分档调速器、连续调速器。

开关:包括0和1两种状态。

开关有两个引脚,任意一个引脚都可以是输入引脚,而另一个则是输出引脚。开关状态为0时,无论输入电位是多少,输出引脚电位为0。当开关状态为1时,输出引脚电位等于输入电位。
分档调速器

按档位调整,常见的有3档、4档、5档调速器,档位值从0档-2(3/4)档变化。本次迭代模拟4档调速器,每个档位的输出电位分别为0、0.3、0.6、0.9倍的输入电压。
连续调速器

没有固定档位,按位置比例得到档位参数,数值范围在[0.00-1.00]之间,含两位小数。输出电位为档位参数乘以输入电压。
所有调速器都有两个引脚,一个固定的输入(引脚编号为1)、一个输出引脚(引脚编号为2)。当输入电位为0时,输出引脚输出的电位固定为0,不受各类开关调节的影响。

所有控制设备的初始状态/档位为0。

控制设备的输入引脚编号为1,输出引脚编号为2。

2、受控设备模拟

本题模拟的受控设备包括:灯、风扇。两种设备都有两根引脚,通过两根引脚电压的电压差驱动设备工作。

灯有两种工作状态:亮、灭。在亮的状态下,有的灯会因引脚电位差的不同亮度会有区别。
风扇在接电后有两种工作状态:停止、转动。风扇的转速会因引脚的电位差的不同而有区别。
本次迭代模拟两种灯具。

白炽灯:

亮度在0~200lux(流明)之间。
电位差为0-9V时亮度为0,其他电位差按比例,电位差10V对应50ux,220V对应200lux,其他电位差与对应亮度值成正比。白炽灯超过220V。
日光灯:

亮度为180lux。
只有两种状态,电位差为0时,亮度为0,电位差不为0,亮度为180。
本次迭代模拟一种吊扇。

工作电压区间为80V-150V,对应转速区间为80-360转/分钟。80V对应转速为80转/分钟,150V对应转速为360转/分钟,超过150V转速为360转/分钟(本次迭代暂不考虑电压超标的异常情况)。其他电压值与转速成正比,输入输出电位差小于80V时转速为0。
输入信息:

1、设备信息

分别用设备标识符K、F、L、B、R、D分别表示开关、分档调速器、连续调速器、白炽灯、日光灯、吊扇。

设备标识用标识符+编号表示,如K1、F3、L2等。
引脚格式:设备标识-引脚编号,例如:K1-1标识编号为1的开关的输入引脚。

三种控制开关的输入引脚编号为1,输出引脚编号为2。
受控设备的两个引脚编号分别为1、2。
约束条件:

不同设备的编号可以相同。
同种设备的编号可以不连续。
设备信息不单独输入,包含在连接信息中。

2、连接信息

一条连接信息占一行,用[]表示一组连接在一起的设备引脚,引脚与引脚之间用英文空格" "分隔。

格式:"["+引脚号+" "+...+" "+引脚号+"]"
例如:[K1-1 K3-2 D5-1]表示K1的输入引脚,K3的输出引脚,D5的1号引脚连接在一起。
约束条件:

本次迭代不考虑两个输出引脚短接的情况
考虑调速器输出串联到其他控制设备(开关)的情况
不考虑调速器串联到其他调速器的情况。
不考虑各类控制设备的并联接入或反馈接入。例如,K1的输出接到L2的输入,L2的输出再接其他设备属于串联接线。K1的输出接到L2的输出,同时K1的输入接到L2的输入,这种情况属于并联。K1的输出接到L2的输入,K1的输入接到L2的输出,属于反馈接线。
3、控制设备调节信息

开关调节信息格式:

#+设备标识K+设备编号,例如:#K2,代表切换K2开关的状态。
分档调速器的调节信息格式:

#+设备标识F+设备编号+"+" 代表加一档,例如:#F3+,代表F3输出加一档。
#+设备标识F+设备编号+"-" 代表减一档,例如:#F1-,代表F1输出减一档。
连续调速器的调节信息格式:

#+设备标识L+设备编号+":" +数值 代表将连续调速器的档位设置到对应数值,例如:#L3:0.6,代表L3输出档位参数0.6。
4、电源接地标识:VCC,电压220V,GND,电压0V。没有接线的引脚默认接地,电压为0V。

输入信息以end为结束标志,忽略end之后的输入信息。

输出信息:

按开关、分档调速器、连续调速器、白炽灯、日光灯、吊扇的顺序依次输出所有设备的状态或参数。每个设备一行。同类设备按编号顺序从小到大输出。

输出格式:@设备标识+设备编号+":" +设备参数值(控制开关的档位或状态、灯的亮度、风扇的转速,只输出值,不输出单位)
连续调速器的档位信息保留两位小数,即使小数为0,依然显示两位小数.00。
开关状态为0(打开)时显示turned on,状态为1(合上)时显示closed
如:
@K1:turned on
@B1:190
@L1:0.60
本题不考虑输入电压或电压差超过220V的情况。

本题只考虑串联的形式,所以所有测试用例的所有连接信息都只包含两个引脚

本题电路中除了开关可能出现多个,其他电路设备均只出现一次。
电源VCC一定是第一个连接的第一项,接地GND一定是最后一个连接的后一项。

家居电路模拟系列所有题目的默认规则:

1、当计算电压值等数值的过程中,最终结果出现小数时,用截尾规则去掉小数部分,只保留整数部分。为避免精度的误差,所有有可能出现小数的数值用double类型保存并计算,不要作下转型数据类型转换,例如电压、转速、亮度等,只有在最后输出时再把计算结果按截尾规则,舍弃尾数,保留整数输出。

2、所有连接信息按电路从电源到接地的顺序依次输入,不会出现错位的情况。

3、连接信息如果只包含两个引脚,靠电源端的引脚在前,靠接地端的在后。

4、对于调速器,其输入端只会直连VCC,不会接其他设备。整个电路中最多只有一个调速器,且连接在电源上。

家居电路模拟系列1-4题目后续迭代设计:

1、电路结构变化:

迭代1:只有一条线路,所有元件串联
迭代2:线路中包含一个并联电路
迭代3:线路中包含多个串联起来的并联电路
迭代4:并联电路之间可能出现包含关系

电路结构变化示意图见图1。

2、输入信息的变化

串联线路信息:用于记录一段串联电路的元件与连接信息。

例如: #T1:[IN K1-1] [K1-2 D2-1] [D2-2 OUT]
#T1:[IN K1-1] [K1-2 M1-IN][M1-OUT D2-1] [D2-2 GND]
并联线路信息:用于记录一段并联电路所包含的所有串联电路信息。

例如:#M1:[T1 T2 T3]
以上格式仅做参考,格式细节可能会调整,以具体发布的为准。

3、计算方式的变化

迭代1只包含1个受控元件,不用计算电流,之后的电路计算要包含电流、电阻等电路参数。

4、电路元件的变化

每次迭代会增加1-2个新的电路元件。

image.png

图1:电路结构示意图

设计建议:

1、电路设备类:描述所有电路设备的公共特征。

2、受控设备类、控制设备类:对应受控、控制设备

3、串联电路类:一条由多个电路设备构成的串联电路,也看成是一个独立的电路设备

其他类以及类的属性、方法自行设计。

image.png

图2:建议设计类图

输入样例1:
在这里给出一组输入。例如:

[VCC K1-1]
[K1-2 D2-1]
[D2-2 GND]

#K1
end
输出样例1:
在这里给出相应的输出。例如:

@K1:closed
@D2:360
输入样例2:
在这里给出一组输入。例如:

[VCC K1-1]
[K1-2 D2-1]
[D2-2 GND]

#K1
#K1
end
输出样例2:
在这里给出相应的输出。例如:

@K1:turned on
@D2:0
输入样例3:
在这里给出一组输入。例如:

[VCC F1-1]
[F1-2 D2-1]
[D2-2 GND]

#F1+
end
输出样例3:
在这里给出相应的输出。例如:

@F1:1
@D2:0
输入样例4:
在这里给出一组输入。例如:

[VCC F1-1]
[F1-2 D2-1]
[D2-2 GND]

#F1+
#F1+
end
输出样例4:
在这里给出相应的输出。例如:

@F1:2
@D2:288
输入样例5:
在这里给出一组输入。例如:

[VCC F1-1]
[F1-2 D2-1]
[D2-2 GND]

#F1+
#F1+
#F1+
end
输出样例5:
在这里给出相应的输出。例如:

@F1:3
@D2:360

输入样例6:
在这里给出一组输入。例如:

[VCC L1-1]
[L1-2 D2-1]
[D2-2 GND]

#L1:1.00
end
输出样例6:
在这里给出相应的输出。例如:

@L1:1.00
@D2:360
输入样例7:
在这里给出一组输入。例如:

[VCC L1-1]
[L1-2 D2-1]
[D2-2 GND]

#L1:0.68
end
输出样例7:
在这里给出相应的输出。例如:

@L1:0.68
@D2:358
输入样例8:
在这里给出一组输入。例如:

[VCC L1-1]
[L1-2 B2-1]
[B2-2 GND]

#L1:0.68
end
输出样例8:
在这里给出相应的输出。例如:

@L1:0.68
@B2:149
输入样例9:
在这里给出一组输入。例如:

[VCC L1-1]
[L1-2 B2-1]
[B2-2 GND]

#L1:1.00
end
输出样例9:
在这里给出相应的输出。例如:

@L1:1.00
@B2:200
输入样例10:
在这里给出一组输入。例如:

[VCC L1-1]
[L1-2 R2-1]
[R2-2 GND]

#L1:1.00
end
输出样例10:
在这里给出相应的输出。例如:

@L1:1.00
@R2:180

家居强电电路模拟程序-1的做题分析

  1. 定义基础类和对象
    设备基类 (Device): 定义所有设备共有的属性和方法,比如设备ID、设备类型和状态更新方法。

控制设备子类:
开关 (Switch): 添加状态属性(开/关),定义切换状态的方法。
调速器:
分档调速器: 状态为档位,定义增减档位方法。
连续调速器: 状态为连续数值,定义设置数值方法。

受控设备子类:
灯具:
白炽灯: 根据电压计算亮度。
日光灯: 二态亮度。
风扇: 根据电压计算转速。

处理输入信息
读取并解析输入:
设备连接信息:使用列表解析连接关系,构建电路图。
控制命令:识别命令类型,对相应设备执行操作。
建立电路模型:
使用列表存储设备实例,键为设备ID,值为实例。
解析连接信息,构建设备之间的连接关系,注意串联电路的特点。

模拟电路行为
电压传播:
从电源VCC开始,计算每个环节的电压或电位差,根据连接关系依次传递到下一个设备。
对于调速器,先根据其状态调整输入电压,然后传递给下一级。
状态更新:
根据电压计算受控设备的状态(如灯的亮度、风扇的转速)。
调整控制设备状态(如开关的开闭、调速器的档位)。

输出结果
格式化输出:
遍历所有设备,按照规定的格式输出它们的状态或参数。

我的部分代码:


import java.util.*;
//状态  调整   输出电压
class Device {
	String type;
	String id;
	double scV;
	boolean KG;

	public Device() {
	}

	public Device(String type, String id, boolean KG) {
		this.type = type;
		this.id = id;
		this.KG = false;
		this.scV = 0;
	}
    	public int fanhui() {
		if (type.equals("K"))
			return 7;
		else if (type.equals("F"))
			return 6;
		else if (type.equals("L"))
			return 5;
		else if (type.equals("B"))
			return 4;
		else if (type.equals("R"))
			return 3;
		else if (type.equals("D"))
			return 2;
		else
			return 0;
	}
	public String display() {
		return "";
	}

	public void adjust(String command) {
	}

	public void Dqv(double voltage) {
	}

}

class Switch extends Device {

	public Switch(String id) {
		super("K", id, false);
	}

	@Override
	public String display() {
		String kk = "";
		if (KG) {
			kk = "closed";
		} else {
			kk = "turned on";
		}
		return "@K" + id + ":" + kk;
	}

	@Override
	public void adjust(String command) {
		KG = !KG;
	}

	@Override
	public void Dqv(double voltage) {
		if (KG) {
			scV = voltage;
		} else {
			scV = 0;
		}
	}
}

class MultiSpeedController extends Device {
	int speed;

	public MultiSpeedController(String id) {
		super("F", id, true);
		this.speed = 0;
	}

	@Override
	public void adjust(String command) {
		if (command.equals("+") && speed < 3) {
			speed++;
		} else if (command.equals("-") && speed > 0) {
			speed--;
		}
	}

	@Override
	public String display() {
		return "@F" + id + ":" + speed;
	}

	@Override
	public void Dqv(double voltage) {
		scV = speed * 0.3 * voltage;
	}
}

class ContinuousController extends Device {
	double lianxu;

	public ContinuousController(String id) {
		super("L", id, true);
		this.lianxu = 0.00;
	}

	@Override
	public void adjust(String command) {
		lianxu = Double.parseDouble(command);
	}

	@Override
	public String display() {
		return String.format("@L%s:%.2f", id, lianxu);
	}

	@Override
	public void Dqv(double voltage) {
		scV = lianxu * voltage;
	}
}

class IncandescentLamp extends Device {
	public IncandescentLamp(String id) {
		super("B", id, true);
	}

	@Override
	public String display() {
		int lux = 0;
		lux = (scV < 10) ? 0 : (scV >= 220) ? 200 : (int) Math.floor((5 * scV) / 7 + 43);
		return "@B" + id + ":" + lux;
	}

	@Override
	public void Dqv(double voltage) {
		scV = voltage;
	}
}

class FluorescentLamp extends Device {
	public FluorescentLamp(String id) {
		super("R", id, true);
	}

	@Override
	public String display() {
		int lux = scV == 0 ? 0 : 180;
		return "@R" + id + ":" + lux;
	}

	@Override
	public void Dqv(double voltage) {
		scV = voltage;
	}
}

class CeilingFan extends Device {
	public CeilingFan(String id) {
		super("D", id, true);
	}

	@Override
	public String display() {
		int aa;

		if (scV < 80) {
			aa = 0;
		} else if (scV > 150) {
			aa = 360;
		} else {
			aa = (int) Math.floor((scV - 80) * 4 + 80);
		}
		return "@D" + id + ":" + aa;

	}

	@Override
	public void Dqv(double voltage) {
		scV = voltage;
	}
}

public class Main {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		ArrayList<String> change = new ArrayList<>();// #后面的
		ArrayList<String> connec = new ArrayList<>(); // 中间一长串
		ArrayList<String> devicekey = new ArrayList<>();// k1
		while (true) {
			String line = scanner.nextLine().trim();
			if (line.startsWith("[")) {
			} else if (line.startsWith("#")) {
			} else if (line.equals("end")) {
			}
		}
	}

	public static void Control(ArrayList<String> devicekey, ArrayList<String> change) {
		Map<String, Device> devices = new HashMap<>();
		double Dqvv = 220;
		for (int i = 0; i < devicekey.size(); i++) {
			String nextPin = devicekey.get(i);
			String pinInfo = nextPin;
			String deviceKey = pinInfo.trim();
			char start = nextPin.charAt(0);
			switch (start) {
			case 'K': {
			}
			case 'F': {
			}
			case 'L': {
			}
			case 'B': {
			}
			case 'R': {
			}
			case 'D': {
			}
			}
		}
		// 调节
        ArrayList <Device> KG=new ArrayList<>();
                for(int i=0;i<change.size();i++){
            String abc=change.get(i);
            if(abc.startsWith("K")){
            }
        }
		for (int i = 0; i < change.size(); i++) {
			String linee = change.get(i);
            if(linee.startsWith("K"))
            {
                String deviceID = linee.substring(0, 2);
                Device device = devices.get(deviceID);
                if (device != null) {
                    device.adjust("1");
                    if(device.KG==true)
                    {
                          device.Dqv(Dqvv);
                          Dqvv = device.scV;
                    }
                    else if(device.KG==false)
                    {
                        Dqvv =0;
                    }
                }
            }
			else if (linee.startsWith("F")) {
			} else if (linee.startsWith("L")) {
		}
        int xxx=0;
            int flag=0;
            for(int i=0;i<devicekey.size();i++)
            {
                String linee = devicekey.get(i);
            if(linee.startsWith("K"))
            {
                String deviceID = linee.substring(0, 2);
                Device device = (Switch)devices.get(deviceID);
                if(device.KG==false)
                {
                    flag++;
                }
            }
            }
                if(flag!=0)
                {
                Dqvv=0;
                }
            for(int i=0;i<devicekey.size();i++)
            {
                if(devicekey.get(i).startsWith("F"))
                {
                    String deviceID = String.valueOf(devicekey.get(i));
                    Device device = devices.get(deviceID);
                    if(device!=null)
                    {
                        // System.out.println(11111);
                        device.Dqv(Dqvv);
                        Dqvv = device.scV;
                    }
                }
                else if(devicekey.get(i).startsWith("L"))
                {
                    String deviceID = String.valueOf(devicekey.get(i));
                    Device device = devices.get(deviceID);
                    if(device!=null)
                    {
                        device.Dqv(Dqvv);
                    Dqvv = device.scV;
                    }
                }
            }


		for (int i = 0; i < devicekey.size(); i++) {
			String nextPin = devicekey.get(i).trim();
			String deviceKey = devicekey.get(i).trim();
			if (nextPin.startsWith("B")) {
				Device devicee = devices.get(deviceKey);
				devicee.Dqv(Dqvv);

			} else if (nextPin.startsWith("R")) {
				Device devicee = devices.get(deviceKey);
				devicee.Dqv(Dqvv);

			} else if (nextPin.startsWith("D")) {
				Device devicee = devices.get(deviceKey);
				devicee.Dqv(Dqvv);

			}
		}

		ArrayList<Device> arraylist6 = new ArrayList<>();
		for (int i=0;i<devicekey.size();i++) {
            String nextPin = devicekey.get(i).trim();
            String deviceKey = devicekey.get(i).trim();
            			if (nextPin.startsWith("B")) {
				Device devicee = devices.get(deviceKey);
                arraylist6.add(devicee);
			} else if (nextPin.startsWith("R")) {
				Device devicee = devices.get(deviceKey);
                arraylist6.add(devicee);
			} else if (nextPin.startsWith("D")) {
				Device devicee = devices.get(deviceKey);
                arraylist6.add(devicee);
			}
            else if (nextPin.startsWith("F")) {
				Device devicee = devices.get(deviceKey);
                arraylist6.add(devicee);
			}
            else if (nextPin.startsWith("L")) {
				Device devicee = devices.get(deviceKey);
                arraylist6.add(devicee);
			}
            else if (nextPin.startsWith("K")) {
				Device devicee = devices.get(deviceKey);
                arraylist6.add(devicee);
			}
			}
		Comparator<Device> numberComparator = new Comparator<Device>() {
			public int compare(Device o1, Device o2) {
				int a = o1.fanhui();
				int b = o2.fanhui();
				int c = Integer.parseInt(o1.id);
				int d = Integer.parseInt(o2.id);
				if (a > b)
					return -1;
				else if (a == b) {
					if (c > d)
						return 1;
					else
						return -1;
				} else
					return 1;
			}
		};
		Collections.sort(arraylist6, numberComparator);
		for (Device suixcs : arraylist6) {
			System.out.println(suixcs.display());
		}
    }
}


家居强电电路模拟程序-1总结:

这次作业先是定义了一个Device父类,然后几个用电设备继承父类,接着使用正则表达式分割输入的内容,并存入change,connec,devicekey三个arraylist中,写好输入后,写了一个Control方法,方法中定义了一个Map<String, Device> devices = new HashMap<>()来存储用电设备,接着就是根据change来遍历所有的用电设备,然后根据不同的逻辑,给每个设备分电压,最后写了一个比较器,将所有用电设备的信息输出,从而完成这次作业。

家居强电电路模拟程序-2

题目:
智能家居是在当下家庭中越来越流行的一种配置方案,它通过物联网技术将家中的各种设备(如音视频设备、照明系统、窗帘控制、空调控制、安防系统、数字影院系统、影音服务器、影柜系统、网络家电等)连接到一起,提供家电控制、照明控制、电话远程控制、室内外遥控、防盗报警、环境监测、暖通控制、红外转发以及可编程定时控制等多种功能和手段。与普通家居相比,智能家居不仅具有传统的居住功能,兼备建筑、网络通信、信息家电、设备自动化,提供全方位的信息交互功能。请根据如下要去设计一个智能家居强电电路模拟系统。以下题目介绍中加粗的部分为本次迭代在“家居强电电路模拟程序-1”的基础上增加的功能要求。

1、控制设备

本题模拟的控制设备包括:开关、分档调速器、连续调速器。

开关:包括0和1两种状态。

开关有两个引脚,任意一个引脚都可以是输入引脚,而另一个则是输出引脚。开关状态为0时,无论输入电位是多少,输出引脚电位为0。当开关状态为1时,输出引脚电位等于输入电位。
分档调速器

按档位调整,常见的有3档、4档、5档调速器,档位值从0档-2(3/4)档变化。本次迭代模拟4档调速器,每个档位的输出电位分别为0、0.3、0.6、0.9倍的输入电压。
连续调速器

没有固定档位,按位置比例得到档位参数,数值范围在[0.00-1.00]之间,含两位小数。输出电位为档位参数乘以输入电压。
所有调速器都有两个引脚,一个固定的输入(引脚编号为1)、一个输出引脚(引脚编号为2)。当输入电位为0时,输出引脚输出的电位固定为0,不受各类开关调节的影响。

所有控制设备的初始状态/档位为0。

控制设备的输入引脚编号为1,输出引脚编号为2。
所有开关的电阻为 0。

2、受控设备

本题模拟的受控设备包括:灯、风扇。两种设备都有两根引脚,通过两根引脚电压的电压差驱动设备工作。

灯有两种工作状态:亮、灭。在亮的状态下,有的灯会因引脚电位差的不同亮度会有区别。
风扇在接电后有两种工作状态:停止、转动。风扇的转速会因引脚间电位差的不同而有区别。
本次迭代模拟两种灯具。

白炽灯:

亮度在0~200lux(流明)之间。
电位差为0-9V时亮度为0,其他电位差按比例,电位差10V对应50ux,220V对应200lux,其他电位差与对应亮度值成正比。白炽灯超过220V。
日光灯:

亮度为180lux。
只有两种状态,电位差为0时,亮度为0,电位差不为0,亮度为180。
本次迭代模拟一种吊扇。

工作电压区间为80V-150V,对应转速区间为80-360转/分钟。80V对应转速为80转/分钟,150V对应转速为360转/分钟,超过150V转速为360转/分钟(本次迭代暂不考虑电压超标的异常情况)。其他电压值与转速成正比,输入输出电位差小于80V时转速为0。
本次迭代模拟一种落地扇。

工作电压区间为 [80V,150V],对应转速区间为 80-360 转/分钟。电压在[80,100)V 区间对应转速为 80 转/分 钟,[100-120)V 区间对应转速为 160 转/分钟,[120-140)V 区间对应转速为 260 转/分钟,超过 140V 转速 为 360 转/分钟(本次迭代暂不考虑电压超标的异常情况)输入信息:
本次迭代考虑电阻:白炽灯的电阻为 10,日光灯的电阻为 5,吊扇的电阻为 20,落 地扇的电阻为 20
3、输入信息

1)输入设备信息

分别用设备标识符K、F、L、B、R、D、A分别表示开关、分档调速器、连续调速器、白炽灯、日光灯、吊扇、落地扇。

设备标识用标识符+编号表示,如K1、F3、L2等。
引脚格式:设备标识-引脚编号,例如:K1-1标识编号为1的开关的输入引脚。

三种控制开关的输入引脚编号为1,输出引脚编号为2。
受控设备的两个引脚编号分别为1、2。
约束条件:

不同设备的编号可以相同。
同种设备的编号可以不连续。
设备信息不单独输入,包含在连接信息中。

2)输入连接信息

一条连接信息占一行,用[]表示一组连接在一起的设备引脚,引脚与引脚之间用英文空格" "分隔。

格式:"["+引脚号+" "+...+" "+引脚号+"]"
例如:[K1-1 K3-2 D5-1]表示K1的输入引脚,K3的输出引脚,D5的1号引脚连接在一起。
约束条件:

不考虑调速器串联到其他调速器的情况。
不考虑调速器串联到其他调速器的情况。
考虑各类设备的并联接入。例如,K1 的输出接到 L2 的输入,L2 的输出再接其他设备属于串联接线。K1 的输出接到 L2 的输出,同时 K1 的输入接到 L2 的输入,这种情况属于并联。
本次迭代的连接信息不单独输入,包含在线路信息中。

3)输入控制设备调节信息

开关调节信息格式:

#+设备标识K+设备编号,例如:#K2,代表切换K2开关的状态。
分档调速器的调节信息格式:

#+设备标识F+设备编号+"+" 代表加一档,例如:#F3+,代表F3输出加一档。
#+设备标识F+设备编号+"-" 代表减一档,例如:#F1-,代表F1输出减一档。
连续调速器的调节信息格式:

#+设备标识L+设备编号+":" +数值 代表将连续调速器的档位设置到对应数值,例如:#L3:0.6,代表L3输出档位参数0.6。
4)电源接地标识:

VCC,电压220V,GND,电压0V。没有接线的引脚默认接地,电压为0V。

5)输入串联电路信息

一条串联电路占一行,串联电路由按从靠电源端到接地端顺序依次输入的 n 个连接 信息组成,连接信息之间用英文空格" "分隔。

串联电路信息格式:

"#T"+电路编号+":"+连接信息+" "+连接信息+...+" "+连接信息
例如:#T1:[IN K1-1] [K1-2 D2-1] [D2-2 OUT] 一个串联电路的第一个引脚是 IN,代表起始端,靠电源。最后一个引脚是 OUT,代表结尾端, 靠接地。
约束条件:

不同的串联电路信息编号不同。
输入的最后一条电路信息必定是总电路信息,总电路信息的起始引脚是 VCC,结束引脚是 GND。
连接信息中的引脚可能是一条串联或并联电路的 IN 或者 OUT。例如:

#T1:[IN K1-1] [K1-2 T2-IN] [T2-OUT OUT]
#T1:[IN K1-1] [K1-2 T2-IN] [T2-OUT M2-IN] [M2-OUT OUT]

6)输入并联电路信息

一条并联电路占一行,并联电路由其包含的几条串联电路组成,串联电路标识之间用英文空格" "分隔。

格式:

"#M"+电路编号+":"+”[”+串联电路信息+" "+....+" "+串联电路信息+”]”
例如:#M1:[T1 T2 T3]
该例声明了一个并联电路,由 T1、T2、T3 三条串联电路并联而成,三条串联电路的 IN 短 接在一起构成 M1 的 IN,三条串联电路的 OUT 短接在一起构成 M1 的 OUT。
约束条件:

本次迭代不考虑并联电路中包含并联电路的情况,也不考虑多个并联电路串联的情况。
本题不考虑输入电压或电压差超过220V的情况。

输入信息以end为结束标志,忽略end之后的输入信息。

本题中的并联信息所包含的串联电路的信息都在并联信息之前输入,不考虑乱序输入的情况。
电路中的短路如果不会在电路中产生无穷大的电流烧坏电路,都是合理情况,在本题测试点的考虑范围之内。

本题不考虑一条串联电路中包含其他串联电路的情况。例如:

#T3:[VCC K1-1] [K1-2 T2-IN] [T2-OUT K2-1] [K2-2 T1-IN] [T1-OUT GND]
本例中T1\T2两条串联电路实际是T3的一个部分,本题不考虑这种类型的输入,而是当将T1\T2的所有连接信息直接包含在T3中定义。
下次迭代中需要考虑这种类型的输入。
4、输出信息:

按开关、分档调速器、连续调速器、白炽灯、日光灯、吊扇、落地扇的顺序依次输出所有设备的状态或参数。每个设备一行。同类设备按编号顺序从小到大输出。

输出格式:@设备标识+设备编号+":" +设备参数值(控制开关的档位或状态、灯的亮度、风扇的转速,只输出值,不输出单位)
连续调速器的档位信息保留两位小数,即使小数为0,依然显示两位小数.00。
开关状态为0(打开)时显示turned on,状态为1(合上)时显示closed
如:
@K1:turned on
@B1:190
@L1:0.60
5、家居电路模拟系列所有题目的默认规则:

1)当计算电压值等数值的过程中,最终结果出现小数时,用截尾规则去掉小数部分,只保留整数部分。为避免精度的误差,所有有可能出现小数的数值用double类型保存并计算,不要作下转型数据类型转换,例如电压、转速、亮度等,只有在最后输出时再把计算结果按截尾规则,舍弃尾数,保留整数输出。

2)所有连接信息按电路从电源到接地的顺序依次输入,不会出现错位的情况。电源VCC一定是第一个连接的第一项,接地GND一定是最后一个连接的后一项。

3)连接信息如果只包含两个引脚,靠电源端的引脚在前,靠接地端的在后。

4)调速器的输入端只会直连VCC,不会接其他设备。整个电路最多只有连接在电源上的一个调速器,且不包含在并联单路中。

6、家居电路模拟系列1-4题目后续迭代设计:

1)电路结构变化:

迭代1:只有一条线路,所有元件串联
迭代2:线路中包含一个并联电路
迭代3:线路中包含多个串联起来的并联电路
迭代4:并联电路之间可能出现包含关系

电路结构变化示意图见图1。

2)计算方式的变化

迭代1只包含1个受控元件,不用计算电流,之后的电路计算要包含电流、电阻等电路参数。

3)电路元件的变化

每次迭代会增加1-2个新的电路元件。

image.png

图1:电路结构示意图

设计建议:

1、电路设备类:描述所有电路设备的公共特征。

2、受控设备类、控制设备类:对应受控、控制设备

3、串联电路类:一条由多个电路设备构成的串联电路,也看成是一个独立的电路设备

4、并联电路类:继承电路设备类,也看成是一个独立的电路设备

其他类以及类的属性、方法自行设计。

image.png

图2:建议设计类图

输入格式:
请在这里写输入格式。例如:输入在一行中给出2个绝对值不超过1000的整数A和B。

输出格式:
请在这里描述输出格式。例如:对每一组输入,在一行中输出A+B的值。

输入样例1:
在这里给出一组输入。例如:

#T1:[IN K1-1] [K1-2 D2-1] [D2-2 OUT]
#T2:[IN K2-1] [K2-2 D1-1] [D1-2 OUT]
#M1:[T1 T2]
#T3:[VCC L1-1] [L1-2 M1-IN] [M1-OUT D3-1] [D3-2 GND]
#K1
end
输出样例1:
在这里给出相应的输出。例如:

@K1:closed
@K2:turned on
@L1:0.00
@D1:0
@D2:0
@D3:0
输入样例2:
在这里给出一组输入。例如:

#T1:[IN K1-1] [K1-2 D2-1] [D2-2 OUT]
#T2:[IN K2-1] [K2-2 D1-1] [D1-2 OUT]
#M1:[T1 T2]
#T3:[VCC L1-1] [L1-2 M1-IN] [M1-OUT D3-1] [D3-2 GND]
#K1
#L1:1.00
end
输出样例2:
在这里给出相应的输出。例如:

@K1:closed
@K2:turned on
@L1:1.00
@D1:0
@D2:200
@D3:200
输入样例3:
在这里给出一组输入。例如:

#T1:[IN K1-1] [K1-2 D2-1] [D2-2 OUT]
#T2:[IN K2-1] [K2-2 D1-1] [D1-2 OUT]
#M1:[T1 T2]
#T3:[VCC L1-1] [L1-2 M1-IN] [M1-OUT D3-1] [D3-2 GND]
#K1
#K2
#L1:1.00
end
输出样例3:
在这里给出相应的输出。例如:

@K1:closed
@K2:closed
@L1:1.00
@D1:0
@D2:0
@D3:346

家居强电电路模拟程序-2的做题分析

定义基础结构与类
首先,定义基础的数据结构和类来表示电路中的各个元素,包括控制设备(开关、调速器)、受控设备(灯、风扇)以及电路结构(串联、并联)。这些类应该能够表示设备的状态、电阻、输入输出引脚、以及进行状态改变的方法。

设备基类: 包含基础属性如ID、电阻基本状态管理方法。
控制设备子类:实现开关状态控制和调速器档位调整。
受控设备子类:实现亮度计算和转速计算。

电路结构类: 表示串联或并联电路,包含内部的设备连接信息,以及电压、电流计算方法。

解析输入信息
处理输入信息,包括设备连接、控制调节信息、串联电路信息和并联电路信息。这一步骤需要将文本输入转化为内部数据结构,比如创建设备实例、建立设备间的连接关系、记录控制调节命令等。

电路模拟逻辑
设计电路模拟的核心逻辑,包括:
电压和电流计算:从电源开始,依据欧姆定律和电路理论计算各节点的电压、电流。
设备响应:根据电压计算受控设备的响应,如灯的亮度和风扇的转速,考虑电阻影响。
控制操作:根据控制设备的状态或调节命令更新电路状态,如开关的开闭和调速器档位变化。

处理并联电路
并联电路的特殊处理需要额外逻辑来正确计算并联节点的电压和电流分配。

输出处理
实现输出模块,按照指定格式输出所有设备的状态或参数。确保符合题目要求的输出格式,如保留小数点后两位的规则。
我的部分代码:


import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
import java.util.Comparator;
import java.util.Collections;
import java.util.*;
import java.util.Scanner;

class Device {
	String type;
	String id;
	double outputV;

	public Device(String type, String id) {
		this.type = type;
		this.id = id;
		this.outputV = 0;
	}

	public int fanhui() {
		if (type.equals("K"))
			return 7;
		else if (type.equals("F"))
			return 6;
		else if (type.equals("L"))
			return 5;
		else if (type.equals("B"))
			return 4;
		else if (type.equals("R"))
			return 3;
		else if (type.equals("D"))
			return 2;
		else if (type.equals("A"))
			return 1;
		else
			return 0;
	}

	public String getStatus() {
		return " ";
	}

	public void adjust(String command) {

	}

	public void applyInputV(double voltage) {

	}
}

class Switch extends Device {
	boolean Kg;

	public Switch(String id) {
		super("K", id);
		this.Kg = false;
	}

	public boolean getKg() {
		return Kg;
	}

	@Override
	public String getStatus() {
		return "@K" + id + ":" + (Kg ? "closed" : "turned on");
	}

	@Override
	public void adjust(String command) {
		Kg = !Kg;
	}

	@Override
	public void applyInputV(double voltage) {
		outputV = Kg ? voltage : 0;
	}
}

class Fdtsq extends Device {
	int speed;

	public Fdtsq(String id) {
		super("F", id);
		this.speed = 0;
	}

	@Override
	public String getStatus() {
		return "@F" + id + ":" + speed;
	}

	@Override
	public void adjust(String command) {
		if (command.equals("+") && speed < 3) {
			speed++;
		} else if (command.equals("-") && speed > 0) {
			speed--;
		}
	}

	@Override
	public void applyInputV(double voltage) {
		outputV = speed * 0.3 * voltage;
	}
}

class Lxtsq extends Device {
	double setting;

	public Lxtsq(String id) {
		super("L", id);
		this.setting = 0;
	}

	@Override
	public String getStatus() {
		return String.format("@L%s:%.2f", id, setting);
	}

	@Override
	public void adjust(String command) {
		setting = Double.parseDouble(command);
	}

	@Override
	public void applyInputV(double voltage) {
		outputV = setting * voltage;
	}
}

class Bzd extends Device {
	double R;

	public Bzd(String id) {
		super("B", id);
		this.R = 10;
	}

	public double getR() {
		return R;
	}

	@Override
	public String getStatus() {
		int lux = 0;
		if (outputV < 10) {
			lux = 0;
		} else if (outputV >= 10 && outputV < 220) {
			lux = (int) Math.floor((5 * outputV) / 7 + 43);
		} else if (outputV >= 220) {
			lux = 200;
		}
		return "@B" + id + ":" + lux;
	}

	@Override
	public void applyInputV(double voltage) {
		outputV = voltage;
	}
}

class Rgd extends Device {
	double R;

	public Rgd(String id) {
		super("R", id);
		this.R = 5;
	}

	public double getR() {
		return R;
	}

	@Override
	public String getStatus() {
		int lux = outputV == 0 ? 0 : 180;
		return "@R" + id + ":" + lux;
	}

	@Override
	public void applyInputV(double voltage) {
		outputV = voltage;
	}
}

class Ds extends Device {
	double R;

	public Ds(String id) {
		super("D", id);
		this.R = 20;
	}

	public double getR() {
		return R;
	}

	@Override
	public String getStatus() {
		int rpm = outputV < 80 ? 0 : outputV > 150 ? 360 : (int) Math.floor((outputV - 80) * 4 + 80);
		return "@D" + id + ":" + rpm;
	}

	@Override
	public void applyInputV(double voltage) {
		outputV = voltage;
	}
}

class Fan extends Device {
	double R;

	public Fan(String id) {
		super("A", id);
		this.R = 20;
	}

	public double getR() {
		return R;
	}

	@Override
	public String getStatus() {
		int rpm = 0;
		if (outputV < 80) {
			rpm = 0;
		} else if (outputV >= 80 && outputV <= 99) {
			rpm = 80;
		} else if (outputV >= 100 && outputV <= 119) {
			rpm = 160;
		} else if (outputV >= 120 && outputV <= 139) {
			rpm = 260;
		} else if (outputV >= 140) {
			rpm = 360;
		}

		return "@A" + id + ":" + rpm;
	}

	@Override
	public void applyInputV(double voltage) {
		outputV = voltage;
	}
}

class Series {
	String id;
	boolean Kg;
	double R;
	double outputV;
	Map<String, Device> devices = new HashMap<>();

	public Series(String id) {
		this.id = id;
		this.R = 0;
		this.Kg = true;
		this.outputV = 0;
	}

	public double getoutputV() {
		return outputV;
	}

	public void setoutputV(double outputV) {
		this.outputV = outputV;
	}

	public void setR(double r) {
		R = r;
	}

	public void adjust(String command) {
		Kg = !Kg;
	}

	public boolean Kg() {
		return Kg;
	}

	public String getId() {
		return id;
	}

	public double getR() {
		return R;
	}

	public Map<String, Device> getDevices() {
		return devices;
	}

	public void addDevice(String key, Device device) {
		devices.put(key, device);
	}
}

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		List<String> change = new ArrayList<>();// 调节
		Map<String, Series> series = new HashMap<>();// 1 series1
		List<String> BL = new ArrayList<>();// 并联的电路数量
		while (sc.hasNextLine()) {
			String line = sc.nextLine().trim();
			if (line.startsWith("#T")) {
				String id1 = line.substring(2, 3);
				Series series1 = new Series(id1);
				String part[] = line.substring(4).split(" ");
				for (int i = 1; i < part.length; i += 2) {
					String a = part[i].substring(0, 2);
					if (a.startsWith("K")) {
						String id = String.valueOf(a.charAt(1));
						Device device = new Switch(id);
						series1.addDevice(a, device);
					} else if (a.startsWith("F")) {
						String id = String.valueOf(a.charAt(1));
						Device device = new Fdtsq(id);
						series1.addDevice(a, device);
					} else if (a.startsWith("L")) {
						String id = String.valueOf(a.charAt(1));
						Device device = new Lxtsq(id);
						series1.addDevice(a, device);
					} else if (a.startsWith("B")) {
						String id = String.valueOf(a.charAt(1));
						Device device = new Bzd(id);
						series1.addDevice(a, device);
					} else if (a.startsWith("R")) {
						String id = String.valueOf(a.charAt(1));
						Device device = new Rgd(id);
						series1.addDevice(a, device);
					} else if (a.startsWith("D")) {
						String id = String.valueOf(a.charAt(1));
						Device device = new Ds(id);
						series1.addDevice(a, device);
					} else if (a.startsWith("A")) {
						String id = String.valueOf(a.charAt(1));
						Device device = new Fan(id);
						series1.addDevice(a, device);
					}
				}
				series.put(id1, series1);
			} else if (line.startsWith("#M")) {

				String s = line.substring(4);
				for (int i = 2; i < s.length(); i += 3) {
					BL.add(String.valueOf(s.charAt(i)));// 字符转换为字符串对象

				}
			} else if (line.startsWith("#")) {
				line = line.substring(1);
				change.add(line);
			} else if (line.equals("end")) {
				Control(change, series, BL);
				break;
			}
		}
	}

	public static void Control(List<String> change, Map<String, Series> series, List<String> BL) {
		for (Map.Entry<String, Series> entry : series.entrySet()) {
			Series series1 = entry.getValue();
			Map<String, Device> device1 = series1.getDevices();
			for (int i = 0; i < change.size(); i++) {
				String did = change.get(i);
				if (did.startsWith("K")) {
					String deviceID = did.substring(0, 2);
					Device device = device1.get(deviceID);
					if (device != null) {
						device.adjust("1");
					}
				} else if (did.startsWith("F")) {
					String deviceID = did.substring(0, 2);
					String command = did.substring(2);
					Device device = device1.get(deviceID);
					if (device != null) {
						device.adjust(command);
					}
				} else if (did.startsWith("L")) {
					String deviceID = did.substring(0, 2);
					String command = did.substring(3);
					Device device = device1.get(deviceID);
					if (device != null) {
						device.adjust(command);
					}
				}
			}
		}
		for (Map.Entry<String, Series> entry : series.entrySet()) {
			Series series1 = entry.getValue();
			Map<String, Device> device1 = series1.getDevices();
			double R = 0;
			for (Map.Entry<String, Device> entry1 : device1.entrySet()) {
				String did = entry1.getKey();
				if (did.startsWith("K")) {
					Switch device = (Switch) entry1.getValue();
					if (device.getKg() == false) {
						series1.adjust("1");
					}
				} else if (did.startsWith("B")) {
					Bzd device = (Bzd) entry1.getValue();
					R += device.getR();
				} else if (did.startsWith("R")) {
					Rgd device = (Rgd) entry1.getValue();
					R += device.getR();
				} else if (did.startsWith("D")) {
					Ds device = (Ds) entry1.getValue();
					R += device.getR();
				} else if (did.startsWith("A")) {
					Fan device = (Fan) entry1.getValue();
					R += device.getR();
				}
			}
			series1.setR(R);
		}
		Series seriesr[] = new Series[BL.size()];
		double arr[] = new double[series.size()];
		for (int i = 0, j = 0; j < series.size() && i < BL.size(); i++, j++) {
			String s = BL.get(i);
			for (Map.Entry<String, Series> entry : series.entrySet()) {
				if (s.equals(entry.getKey())) {
					seriesr[j] = entry.getValue();
				}
			}
		}
		double r = 0;
		int c = 0;
		for (int i = 0; i < seriesr.length; i++) {
			Map<String, Device> deviceMap = seriesr[i].getDevices();
			for (Map.Entry<String, Device> entry1 : deviceMap.entrySet()) {
				if (entry1.getValue() instanceof Bzd) {
					Bzd device = (Bzd) entry1.getValue();
					r = r + device.getR();
				} else if (entry1.getValue() instanceof Rgd) {
					Rgd device = (Rgd) entry1.getValue();
					r = r + device.getR();
				} else if (entry1.getValue() instanceof Ds) {
					Ds device = (Ds) entry1.getValue();
					r = r + device.getR();
				} else if (entry1.getValue() instanceof Fan) {
					Fan device = (Fan) entry1.getValue();
					r = r + device.getR();
				}
			}
			arr[c] = r;
			c++;
			r = 0;
		}
		int count = 0;
		Series aa = null;
		int a = series.size();
		double bb = 0;
		for (Map.Entry<String, Series> entry1 : series.entrySet()) {
			count++;
			if (count == a) {
				aa = entry1.getValue();
				break;
			}
		}
		Map<String, Device> deviceMap2 = aa.getDevices();
		for (Map.Entry<String, Device> entry1 : deviceMap2.entrySet()) {
			if (entry1.getValue() instanceof Bzd) {
				Bzd device = (Bzd) entry1.getValue();
				bb = bb + device.getR();
			} else if (entry1.getValue() instanceof Rgd) {
				Rgd device = (Rgd) entry1.getValue();
				bb = bb + device.getR();
			} else if (entry1.getValue() instanceof Ds) {
				Ds device = (Ds) entry1.getValue();
				bb = bb + device.getR();
			} else if (entry1.getValue() instanceof Fan) {
				Fan device = (Fan) entry1.getValue();
				bb = bb + device.getR();
			}
		}
		arr[arr.length - 1] = bb;
		int size = series.size();
		Series[] seriesn = new Series[size];
		int i = 0;
		for (Series seriess : series.values()) {
			seriesn[i++] = seriess;
		}

		double sum_of_inverses = 0;
		int flag = 0; // 如果需要统计开关打开的并联支路数量,这个可以保留

		for (int k = 0; k < seriesn.length - 1; k++) {
			Series series4 = seriesn[k];
			if (series4.Kg() == true) { // 只考虑开关打开的支路
				double R_k = arr[k]; // 假设arr[k]是第k个Series对应的电阻值
				sum_of_inverses += 1 / R_k; // 累加电阻的倒数
				flag++; // 如果需要,统计有效支路数
			}
		}

		double R1 = sum_of_inverses != 0 ? 1 / sum_of_inverses : 0; // 计算并联总电阻
		double R2 = 0;
		int f = seriesn.length - 1;
		Series series5 = seriesn[f];
		if (series5.Kg() == true) {
			R2 = arr[f] + R2;
		} else {
			R2 = R2;
		}
		int e = seriesn.length - 1;
		Series series7 = seriesn[e];
		voltage1 = voltage;
		voltage3 = voltage;
		if (series7.Kg() == true && flag > 1) {
		}
        else if(series7.Kg()==true&&flag==0){
		} else if (series7.Kg() == false) {
		}
		ArrayList<Device> arraylist6 = new ArrayList<>();
		for (Map.Entry<String, Series> entry : series.entrySet()) {
			Series series1 = entry.getValue();
			Map<String, Device> device1 = series1.getDevices();
			for (Map.Entry<String, Device> entry1 : device1.entrySet()) {
				arraylist6.add(entry1.getValue());
			}
		}
		Comparator<Device> numberComparator = new Comparator<Device>() {
			public int compare(Device o1, Device o2) {
				int a = o1.fanhui();
				int b = o2.fanhui();
				int c = Integer.parseInt(o1.id);
				int d = Integer.parseInt(o2.id);
				if (a > b)
					return -1;
				else if (a == b) {
					if (c > d)
						return 1;
					else
						return -1;
				} else
					return 1;
			}
		};
		Collections.sort(arraylist6, numberComparator);
		for (Device suixcs : arraylist6) {
			System.out.println(suixcs.getStatus());
		}
	}
}


家居强电电路模拟程序-2总结:

这次的作业明显比第一次要复杂蛮多,因为加入了电阻等,而且还有一条并联电路,在这次作业中,我定义了一个Device父类,然后各个电器设备继承,然后定义了一个串联电路类,用于存放每一条串联电路的信息,然后便是用正则表达式处理输入,存入change和BL两个arraylist中,并定义了一个series的map,用于存放每一条电路,以便后面的处理,然后,定义了一个Control方法,先是遍历series这个map,来设好调节设备的系数,然后计算每条路的电阻,并将这些电阻存入一个arr数组中,接着,根据不同的电路情况,得出电路的阻值,从而根据开始设定好的电压对电路的用电设备进行分压,最后根据写好的一个比较器将所有电器的状态进行输出。

3.踩坑心得

在答题判题程序-4中,我没能完全实现question类中 单选题、多选题、填空题等类,然后评分的方法未完成,实际应实现根据题目类型(单选、多选、填空)计算分数,考虑题目是否被删除,以及处理答案与标准答案的比较逻辑。最后就是输出格式: 缺少按要求输出判题结果、总分、格式错误提示等信息的实现。
在第一次的电路大题中,我在处理开关时出现了问题,起初并未考虑多个开关的情况,导致电压的设定有问题,后面我就在我给电器设定电压之前,在循环遍历一次所有开关,如果有断路直接设为0,这样就成功将电压设好,不过最终的代码还是有错误,在开关-吊扇这个点还是没过去,我认为可能还是在处理调节设备时出现了问题。
在第二次的电路大题中,我不应该将电阻每条路的电阻存入一个arr数组,这样写太麻烦,应该在series方法中定义一个getR方法,这样方便调用,而且更简单,其次,在分几种情况讨论电路的通断时,写的太麻烦了,每次遍历都要设很多参数,来给电器设备分压,有时候自己都不知道参数是什么,最后,就是在调节设备分档调速器那里逻辑写的有问题,只考虑了调节一次,然后分压就有问题,导致一些测试点过不去。

4.改进建议

在每次写之前,都要想好要建什么类,然后怎么存储输入信息,arraylist以及map的存储要合理,否则在使用时难以调用,在处理逻辑方面也要考虑全面,能调用方法的话尽量不要每次都重复写一些代码,这样可以减少冗余,最后就是要认真分析每个题目的特点,想好了再写,这样成功率会高一些。

5.总结

在对待每一个大题,都要仔细想清楚建什么类,类应该包含什么属性和方法,然后利用arraylist和map时也要知道要存哪些信息,在一些处理逻辑中要仔细且全面的想明白再去写。然后就是要熟练掌握map以及arraylist还有conparator等接口的使用方法,这对做题很有帮助,最后就是要坚持写,遇到过不去的测试点应该多次调试,反复思考,这样才会有更大的收获。

posted @ 2024-06-04 21:35  李燕鹏  阅读(51)  评论(2)    收藏  举报