PTA第1~3次作业blog

前言:
java是这学期新接触的语言,刚开始有些不习惯,许多便捷函数不知道,了解少,做题速度比较慢
前几次作业都有难度,花费时间较多,特别是各次作业的最后一题,做的脑子要爆炸了,针对各次作业的最后一题仔细分析能获得特别的的感悟.
1.题目分析:
前三次作业的最后一题都是答题程序,要求的功能越来越多,难度也越来越大
程序的过程:
获取信息->处理信息->输出
技术考点:
答题程序这个题目主要考点就两个
First:类的关联
Second:正则表达式
题目中需要3个类:题目,试卷,答卷
各个类之间互有联系,需要合理的将各个类关联起来,发挥各自的作用
(设计建议:
以下是针对以上题目要求的设计建议,其中的属性、方法为最小集,实现代码中可根据情况添加所需的内容:

题目类(用于封装单个题目的信息):
属性:题目编号、题目内容、标准答案-standardAnswer
方法:数据读写set\get方法、
判题方法(答案-answer):判断答案-answer是否符合标准答案-standardAnswer
试卷类(用于封装整套题目的信息)
属性:题目列表(题目类的对象集合)、题目数量
方法:判题方法(题号-num、答案-answer):判断答案-answer是否符合对应题号的题目标准答案-standardAnswer
保存题目(题号-num、题目-question):将题目保存到题目列表中,保存位置与num要能对应
答卷类(用于封装答题信息)
属性:试卷(试卷类的对象)、答案列表(保存每一题的答案)、判题列表(保存每一题的判题结果true/false)
方法:判题方法(题号-num):判断答案列表中第num题的结果是否符合试卷中对应题号的题目标准答案
输出方法(题号-num):按照题目的格式要求,输出题号为num的题目的内容和答题结果。
保存一个答案(题号-num,答案-answer):保存题号为num的题目的答题结果answer。)

正则表达式则考察了字符串的校检,分组.
格式错误提示信息:
输入信息只要不符合格式要求,均输出”wrong format:”+信息内容。

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

学号+" "+姓名+": "**+题目得分+" "+....+题目得分+"~"+总分
样例#S:2 20201103 #A:1-5 #A:2-4
需要我们检查输入的字符串是否符合要求,再从其中得到我们需要的信息

2.程序设计:

首先根据题目给的信息设计我们需要的类:
class Topic{ private int num; private String content; private String answer; private int grade=0; private String standAnswer; private int topicId; private boolean topicSave=true; private boolean topicFormat = true; }
class Test{ int num=0; Topic[] topics; }
class Student{ String id; String name; }
分别代表题目,试卷,答卷
其中答卷和试卷中含有题目,答卷需要去跟试卷去匹配.
题目输入的信息有5种,还可能打乱顺序输入,我们需要将不同的信息通过不同的操作来处理.

while (str.compareTo("end") != 0) {
            int i = 0;
            if (str.charAt(1) == 'N') {
                if(!str.matches("#N:\\s*\\d+\\s*#Q:.*\\s*#A:.*"))
                {
                    System.out.println("wrong format:"+str);
                }else {
                    String regStr = "#N:\\s*(\\d+)\\s*#Q:(.*)\\s*#A:(.*)";
                    Pattern pattern = Pattern.compile(regStr);
                    Matcher matcher = pattern.matcher(str);
                    boolean format = false;
                    int num = 0;
                    String content = null;
                    String answer = null;
                    while (matcher.find()) {
                        format = matcher.matches();
                        if (format) {
                            num = Integer.parseInt(matcher.group(1));
                            content = matcher.group(2).trim();
                            answer = matcher.group(3);
                        }
                    }
                    Topic[] topics1 = new Topic[topics.length + 1];
                    int sum = 0;
                    for (i = 0; i < topics.length; i++) {
                        topics1[i] = topics[i];
                    }
                    topics1[i] = new Topic();
                    topics1[i].setNum(num);
                    topics1[i].setContent(content);
                    topics1[i].setStandAnswer(answer);
                    topics1[i].setTopicFormat(format);
                    topics = topics1;
                }
            } else if (str.charAt(1) == 'T') {
                if(!str.matches("#T:\\s*(\\d*)\\s*(\\s*\\d+-\\d+\\s*)*")){
                    System.out.println("wrong format:"+str);
                }else {
                    Test[] tests1 = new Test[tests.length + 1];
                    int ii = 0;
                    for (ii = 0; ii < tests.length; ii++) {
                        tests1[ii] = tests[ii];
                    }
                    tests1[ii] = new Test();
                    Topic[] topics1 = new Topic[0];
                    String regStr = "#T:(\\d+)";
                    Pattern pattern = Pattern.compile(regStr);
                    Matcher matcher = pattern.matcher(str);
                    while (matcher.find()) {
                        tests1[ii].num = Integer.parseInt(matcher.group(1));
                    }
                    regStr = "(\\d+)-(\\d+)";
                    pattern = Pattern.compile(regStr);
                    matcher = pattern.matcher(str);
                    while (matcher.find()) {
                        int number = Integer.parseInt(matcher.group(1));
                        int grade = Integer.parseInt(matcher.group(2));
                        Topic[] topics2 = new Topic[topics1.length + 1];
                        for (i = 0; i < topics1.length; i++) {
                            topics2[i] = topics1[i];
                        }
                        topics2[i] = new Topic();
                        topics2[i].setNum(number);
                        topics2[i].setGrade(grade);
                        topics1 = topics2;
                    }
                    tests1[ii].setTopics(topics1);
                    tests = tests1;
                }
            } else if (str.charAt(1) == 'S') {
                if(!str.matches("#S:\\s*(\\d+)\\s+(\\w*)\\s*(#A:\\s*(\\d+-?[^#]*))*")){
                    System.out.println("wrong format:"+str);
                }else {
                    Answer[] answers1 = new Answer[answers.length + 1];
                    int ii = 0;
                    Topic[] topics1 = new Topic[0];
                    for (ii = 0; ii < answers.length; ii++) {
                        answers1[ii] = answers[ii];
                    }
                    answers1[ii] = new Answer();
                    String regStr = "#S:(\\d+)\\s([0-9]+)";
                    Pattern pattern = Pattern.compile(regStr);
                    Matcher matcher = pattern.matcher(str);
                    while (matcher.find()) {
                        answers1[ii].num = Integer.parseInt(matcher.group(1));
                        answers1[ii].id = matcher.group(2);
                    }
                    regStr = "#A:(\\d+)\\-([^#]*)";
                    pattern = Pattern.compile(regStr);
                    matcher = pattern.matcher(str);
                    while (matcher.find()) {
                        Topic[] topics2 = new Topic[topics1.length + 1];
                        for (i = 0; i < topics1.length; i++) {
                            topics2[i] = topics1[i];
                        }
                        topics2[i] = new Topic();
                        topics2[i].setTopicId(Integer.parseInt(matcher.group(1)));
                        topics2[i].setAnswer(matcher.group(2).replace(" ",""));
                        topics1 = topics2;
                    }
                    Arrays.sort(topics1, new Comparator<Topic>() {
                        @Override
                        public int compare(Topic o1, Topic o2) {
                            return o1.getTopicId() - o2.getTopicId();
                        }
                    });
                    answers1[ii].setTopics(topics1);
                    answers = answers1;
                }
            } else if (str.charAt(1) == 'X') {
                if(!str.matches("#X:\\s*(\\d+)\\s*(.*)(-(\\d+)\\s*(.*))*")){
                    System.out.println("wrong format:"+str);
                }else {
                    int ii = 0;
                    String regStr = "([0-9]+)\\s([a-zA-Z]+)";
                    Pattern pattern = Pattern.compile(regStr);
                    Matcher matcher = pattern.matcher(str);
                    while (matcher.find()) {
                        Student[] students1 = new Student[students.length + 1];
                        for (ii = 0; ii < students.length; ii++) {
                            students1[ii] = students[ii];
                        }
                        students1[ii] = new Student();
                        students1[ii].id = matcher.group(1);
                        students1[ii].name = matcher.group(2);
                        students = students1;
                    }
                }
            } else if (str.charAt(1) == 'D') {
                if (!str.matches("#D:\\s*N-\\d+")) {
                    System.out.println("wrong format:"+str);
                } else {
                    int ii = 0;
                    int topicId = 0;
                    String regStr = "#D:N-(\\d+)";
                    Pattern pattern = Pattern.compile(regStr);
                    Matcher matcher = pattern.matcher(str);
                    while (matcher.find()) {
                        topicId = Integer.parseInt(matcher.group(1));
                    }
                    for (ii = 0; ii < topics.length; ii++) {
                        if (topics[ii].getNum() == topicId) {
                            topics[ii].setTopicSave(false);
                        }
                    }
                }
            } else {
                System.out.println("wrong format:"+str);
            }
            str=sc.nextLine();
        }

因为题目要求当输入"end"时结束,所以使用while循环来重复输入信息,再根据输入的信息的相同的,使用判断第一个英文字符是什么来判断输入的是哪种信息.
输入信息后,先通过正则表达式校检格式

if(!str.matches("#N:\\s*\\d+\\s*#Q:.*\\s*#A:.*"))
                {
                    System.out.println("wrong format:"+str);
                   }

正则表达式的语法要求自学,我通过多次练习终于掌握了这个功能,校检后就需要通过分组去获取需要的信息并将其储存至程序的数组中.

 String regStr = "#N:\\s*(\\d+)\\s*#Q:(.*)\\s*#A:(.*)";
                    Pattern pattern = Pattern.compile(regStr);
                    Matcher matcher = pattern.matcher(str);
                    boolean format = false;
                    int num = 0;
                    String content = null;
                    String answer = null;
                    while (matcher.find()) {
                        format = matcher.matches();
                        if (format) {
                            num = Integer.parseInt(matcher.group(1));
                            content = matcher.group(2).trim();
                            answer = matcher.group(3);
                        }
                    }

正则表达式语法:


信息处理完成后就是输出:
首先题目要求未满100分的试卷要输出
(1、试卷总分警示

该部分仅当一张试卷的总分分值不等于100分时作提示之用,试卷依然属于正常试卷,可用于后面的答题。如果总分等于100 分,该部分忽略,不输出。

格式:"alert: full score of test paper"+试卷号+" is not 100 points"

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

)

for (int i = 0; i < tests.length; i++) {
            Topic[] topics1 = tests[i].getTopics();
            int sum = 0;
            for (int j = 0; j < topics1.length; j++) {
                sum += topics1[j].getGrade();
            }
            if (sum != 100) {
                System.out.println("alert: full score of test paper" + tests[i].num + " is not 100 points");
            }
        }

这个是必需要的所以单独用一个for循环完成
然后输出判卷信息:

for(int i=0;i<answers.length;i++){
            for(int j=0;j<tests.length;j++){
                if(answers[i].getNum()==tests[j].getNum()){
                    int ii=0;
                    int[] grade=new int[0];
                    int sum=0;
                    for(int k=0;k<answers[i].topics.length&&k<tests[j].topics.length;k++){
                        int l=answers[i].topics[k].getTopicId()-1;
                        boolean textTopicSave=false;
                        boolean notFind=true;
                        for(int m=0;m<topics.length;m++) {
                            if(topics[m].getNum()==tests[j].topics[l].getNum()) {
                                notFind=false;
                                textTopicSave=topics[m].isTopicSave();
                                if(!topics[m].isTopicSave()||!topics[m].isTopicFormat()){
                                    tests[j].topics[l].setGrade(0);
                                }
                                int[] grade1 = new int[grade.length + 1];
                                for ( ii = 0; ii < grade.length; ii++) {
                                    grade1[ii] = grade[ii];
                                }
                                boolean check = false;
                                if (answers[i].topics[k].getAnswer().equals(topics[m].getStandAnswer())) {
                                    check = true;
                                    grade1[ii] = tests[j].topics[l].getGrade();
                                    sum += tests[j].topics[l].getGrade();
                                }else {
                                    grade1[ii]=0;
                                }
                                grade=grade1;
                                if(textTopicSave&&topics[m].isTopicFormat()){
                                    System.out.println(topics[m].getContent() + "~" + answers[i].topics[k].getAnswer() + "~" + check);
                                }else if(!textTopicSave){
                                    System.out.println("the question "+topics[m].getNum()+" invalid~0");
                                } else if (!topics[m].isTopicFormat()) {
                                    System.out.println("non-existent question~0");
                                }
                            }
                        }
                        if(notFind){
                            int[] grade1 = new int[grade.length + 1];
                            for ( ii = 0; ii < grade.length; ii++) {
                                grade1[ii] = grade[ii];
                            }
                            grade1[ii]=0;
                            grade=grade1;
                            System.out.println("non-existent question~0");
                        }
                    }
                    for(int o=answers[i].topics.length;o<tests[j].topics.length;o++){
                        System.out.println("answer is null");
                        int[] grade1 = new int[grade.length + 1];
                        for (  ii = 0; ii < grade.length; ii++) {
                            grade1[ii] = grade[ii];
                        }
                        grade1[ii]=0;
                        grade=grade1;
                    }
                    boolean findName=false;
                    for(int iii=0;iii<students.length;iii++){
                        if(students[iii].id.equals(answers[i].id)){
                            findName=true;
                            System.out.print(students[iii].id+" "+students[iii].name+": ");
                        }
                    }
                    if(findName) {
                        for (int p = 0; p < grade.length; p++) {
                            if (p != grade.length - 1) {
                                System.out.print(grade[p] + " ");
                            } else {
                                System.out.println(grade[p] + "~" + sum);
                            }
                        }
                    }else {
                        System.out.println(answers[i].id+" not found");
                    }
                }else {
                    System.out.println("The test paper number does not exist");
                }
            }
            if(tests.length==0){
                System.out.println("The test paper number does not exist");
            }
        }

这里使用了多个for循环****去实现试卷与答卷的匹配,答卷和试卷与题目的匹配,略显繁琐臃肿.
思路是循环给出的所以答卷,然后一个个去匹配符合的试卷和题目,再根据信息去判卷输出.


踩坑心得:
没有根据题目要求去选择最适合的数据储存类,这题如果使用map,根据map键值对的特性会更加的方便,代码会更加的简洁.
结构有些混乱,后期可以删除整合一些代码,优化结构

改进建议
使用map数组,简化代码,优化下程序结构
再多了解下正则表达式的使用,下次在写程序时可以加快速度,使得有更多的时间去改进程序

总结
对java语言的使用还不是很熟练,对许多函数有些生疏,后面需要花费大量时间去加深对java语言的了解,多使用java语言做题来增加熟练度.

posted @   俞博昊  阅读(12)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示