lhy-sjava

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

对于前三次pta作业的总结分析
1)前言:知识点:类的设计,类与对象的使用,数组的基本运用,关联类,复杂情境下多种类的设计与使用,类的封装,日期类的基本使用。在后续讲解后还可以用到正则表达,HashMap等知识。
题量:由于每次作业最后一题难度较大,所以简单题目的数量并不多,题量适中。
难度:每次的题目难度大,但都是在同一基础上的要求增加,但对于乱序输入的处理确实是作业过程中的一个难点。
关于Java的学习比起上学期c语言的学习起步较快,因为c语言的基础编码与java基本一致,但学习开始依旧比较困难,对于java程序的编写和具体编码形式不了解,java的面向对象不易理解。在编码过程中很难具体的知道自己应该写什么,比如代码模块设计。总体来说java在定义等基本上比c语言抽象,较难理解。

(2)设计与分析:前三次pta的最后一题答题判题程序为以下题目迭代:

设计实现答题程序,模拟一个小型的测试,要求输入题目信息和答题信息,根据输入题目信息中的标准答案判断答题的结果。

输入格式:
程序输入信息分三部分:

1、题目数量

格式:整数数值,若超过1位最高位不能为0,

样例:34

2、题目内容

一行为一道题,可以输入多行数据。

格式:"#N:"+题号+" "+"#Q:"+题目内容+" "#A:"+标准答案

格式约束:题目的输入顺序与题号不相关,不一定按题号顺序从小到大输入。

样例:#N:1 #Q:1+1= #A:2

     #N:2 #Q:2+2= #A:4

3、答题信息

答题信息按行输入,每一行为一组答案,每组答案包含第2部分所有题目的解题答案,答案的顺序号与题目题号相对应。

格式:"#A:"+答案内容

格式约束:答案数量与第2部分题目的数量相同,答案之间以英文空格分隔。

样例:#A:2 #A:78

  2是题号为1的题目的答案
  78是题号为2的题目的答案

答题信息以一行"end"标记结束,"end"之后的信息忽略。

输出格式:
1、题目数量

格式:整数数值,若超过1位最高位不能为0,

样例:34

2、答题信息

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

格式:题目内容+" ~"+答案

样例:1+1=~2

      2+2= ~4

3、判题信息

判题信息为一行数据,一条答题记录每个答案的判断结果,答案的先后顺序与题目题号相对应。

格式:判题结果+" "+判题结果

格式约束:

 1、判题结果输出只能是true或者false,
 2、判题信息的顺序与输入答题信息中的顺序相同

样例:true false true

设计:第一次题目主要对java类的创建和基本编码能力进行考察,在题目后有设计建议省去了一些试错。对于输入的读取在学习完正则表达之后会变得简单一些。
这次作业主要建造了三个类Question(问题类),TestPaper(试卷类),AnswerPaper(答卷类)。
Question类:用于封装单个题目的信息,包括题目编号、题目内容和标准答案,以及判断答案是否符合标准答案的方法。
TestPaper类:用于封装整套题目的信息,包括题目列表(以题号作为键,Question对象作为值的HashMap)和题目数量,以及保存题目和判断答案是否符合标准答案的方法。
AnswerPaper类:用于封装答题信息,包括试卷、答案列表和判题列表,以及保存答案、输出题目和答案、获取判题结果的方法。
在Main类中,程序首先读取题目数量,然后读取题目信息并创建TestPaper对象。接着读取答题信息并创建AnswerPaper对象,最后分别输出题目数量、答题信息和判题信息。
`import java.util.*;
class Question {
private int questionId;
private String questionContent;
private String standardAnswer;

public Question(int questionId, String questionContent, String standardAnswer) {
    this.questionId = questionId;
    this.questionContent = questionContent;
    this.standardAnswer = standardAnswer;
}

public int getQuestionId() {
    return questionId;
}

public String getQuestionContent() {
    return questionContent;
}

public String getStandardAnswer() {
    return standardAnswer;
}

}

class TestPaper {
private int testPaperId;
private Map<Integer, Integer> questionScoreMap;

public TestPaper(int testPaperId) {
    this.testPaperId = testPaperId;
    this.questionScoreMap = new HashMap<>();
}

public void addQuestionScore(int questionId, int score) {
    questionScoreMap.put(questionId, score);
}

public int getTotalScore() {
    int totalScore = 0;
    for (int score : questionScoreMap.values()) {
        totalScore += score;
    }
    return totalScore;
}

public int getTestPaperId() {
    return testPaperId;
}

public Map<Integer, Integer> getQuestionScoreMap() {
    return questionScoreMap;
}

}

class Answer {
private int testPaperId;
private List answerList;

public Answer(int testPaperId, List<String> answerList) {
    this.testPaperId = testPaperId;
    this.answerList = answerList;
}

public int getTestPaperId() {
    return testPaperId;
}

public List<String> getAnswerList() {
    return answerList;
}

}

public class Main {
private static List questions;
private static List testPapers;
private static List answers;

public static void main(String[] args) {
    questions = new ArrayList<>();
    testPapers = new ArrayList<>();
    answers = new ArrayList<>();

    readInputData();
    processResults();
}

private static void readInputData() {
    Scanner scanner = new Scanner(System.in);
    while (true) {
        String line = scanner.nextLine();
        if (line.equals("end")) {
            break;
        }
        if (line.startsWith("#N:")) {
            parseQuestion(line);
        } else if (line.startsWith("#T:")) {
            parseTestPaper(line);
        } else if (line.startsWith("#S:")) {
            parseAnswer(line);
        }
    }
}

private static void parseQuestion(String line) {
    String[] parts = line.split(" ");
    int questionId = Integer.parseInt(parts[0].substring(3));
    String questionContent = parts[1].substring(3);
    String standardAnswer = parts[2].substring(3);
    questions.add(new Question(questionId, questionContent, standardAnswer));
}

private static void parseTestPaper(String line) {
    String[] parts = line.split(" ");
    int testPaperId = Integer.parseInt(parts[0].substring(3));
    TestPaper testPaper = new TestPaper(testPaperId);
    for (int i = 1; i < parts.length; i++) {
        String[] questionParts = parts[i].split("-");
        int questionId = Integer.parseInt(questionParts[0]);
        int score = Integer.parseInt(questionParts[1]);
        testPaper.addQuestionScore(questionId, score);
    }
    testPapers.add(testPaper);
}

private static void parseAnswer(String line) {
    String[] parts = line.split(" ");
    int testPaperId = Integer.parseInt(parts[0].substring(3));
    List<String> answerList = new ArrayList<>();
    for (int i = 1; i < parts.length; i++) {
        answerList.add(parts[i].substring(3));
    }
    answers.add(new Answer(testPaperId, answerList));
}

private static void processResults() {
    for (TestPaper testPaper : testPapers) {
        int totalScore = testPaper.getTotalScore();
        if (totalScore != 100) {
            System.out.println("alert: full score of test paper" + testPaper.getTestPaperId() + " is not 100 points");
        }

        for (Answer answer : answers) {
            if (answer.getTestPaperId() == testPaper.getTestPaperId()) {
                Map<Integer, Integer> questionScoreMap = testPaper.getQuestionScoreMap();
                List<String> answerList = answer.getAnswerList();
                StringBuilder sb = new StringBuilder();
                List<Integer> scoreList = new ArrayList<>();
                int totalAnswerScore = 0;
                for (int i = 0; i < answerList.size(); i++) {
                    int questionId = i + 1;
                    int score = questionScoreMap.getOrDefault(questionId, 0);
                    String standardAnswer = "";
                    for (Question question : questions) {
                        if (question.getQuestionId() == questionId) {
                            standardAnswer = question.getStandardAnswer();
                            break;
                        }
                    }
                    String userAnswer = answerList.get(i);
                    boolean isCorrect = userAnswer.equals(standardAnswer);
                    sb.append(questions.get(questionId - 1).getQuestionContent())
                      .append("~")
                      .append(userAnswer)
                      .append("~")
                      .append(isCorrect)
                      .append("\n");
                    scoreList.add(isCorrect ? score : 0);
                    totalAnswerScore += isCorrect ? score : 0;
                }
                System.out.println(sb.toString().trim());
                StringBuilder scoreBuilder = new StringBuilder();
                for (int score : scoreList) {
                    scoreBuilder.append(score).append(" ");
                }
                System.out.println(scoreBuilder.toString().trim() + "~" + totalAnswerScore);
                break;
            }
        }
    }
}

}`
第三次作业加入了学生信息和删除题目的功能。相较前两次作业更加难写。尤其是对于删除题目的处理。我个人觉得题目中答案信息的部分的输入容易混淆造成错误。

(3)采坑心得:1、java语言区分大小写!!!!很多次代码都是因为下意识不区分大小写导致错误
2、类的创建容易忘记写构造方式(可悲的脑子)

(4)改进建议:三次题目的输入大多用数字符号的简单组合,但就像上面第三次作业分析里所说容易混淆。

(5)总结:理解了面向对象编程的概念,包括类、对象、封装、继承和多态等。通过编写类和对象,学会了如何设计更加模块化和可维护的代码。
掌握了Java标准库中一些常用类的使用方法,如String、StringBuilder、ArrayList、HashMap等,提高了编程效率。
建议:我个人觉得上课和网络课程的进度差距太大。

posted on 2024-04-21 12:03  洛怀逸  阅读(51)  评论(0)    收藏  举报