pta1-3次作业

smile0314 / 2024-04-21 / 原文

前言

一:初次学Java

在之前有学过C语言,有一点编程基础,但是对于Java来言是不够的。

二:开始编程

对于Java的编程是痛苦的,更加困难的。但由于Java被广泛应用于企业级应用开发,特别是大型系统和Web应用开发。许多大型公司和组织都在使用Java开发其关键系统。所以Java是必须要学的

第一次pta

设计与分析

PowerDesigner下相应的类图

这是在PowerDesigner下相应的类图,
可以发现对于代码来言是相当的复杂,就是因为第一次写的太复杂导致后面全部重构结构和内容。
对于此代码的类的分别解释,在主类Main中调用了其余了类,在答卷类里包含题目类数组。

为三个主类在类里面分别有着各自的函数作用,封装性体现在此。类与类之间的关系简单
其中有正则表达式,和数组的运用

点击查看代码
 AnswerSheet answerSheet = new AnswerSheet(paper);
        String regex = "#N:(\\d+)\\s+#Q:(.+?)\\s+#A:(.+)";
        String regexForAnswer = "#A:(\\d+)";
        Pattern pattern = Pattern.compile(regex);
        int numProblems = sc.nextInt();sc.nextLine();
        for (int i = 0; i < numProblems; i++) {
            String input = sc.nextLine();

            Matcher matcher = pattern.matcher(input);
            if (matcher.find()) {
                int number = Integer.parseInt(matcher.group(1));
                String content = matcher.group(2);
                String standardAnswer = matcher.group(3);

踩坑心得

在第一次Java大作业中,完全是无厘头的,没有一点思路,还是在同学的帮助下完成的,其中有数组关系很复杂(应该是自己写的

改进

1.因为这是第一次PTA作业(java)所以很多方面考虑不完全,就比如这道题应该使用至少三个类来编写才是正确的解决方法,但是当时本人思考的是一道题它的解法有很多种,每个人都有自己的想法,所以只要能解出来的方法就是好方法,但是我忽略了一件事,那就是之后的PTA发布都会是在之前的基础上迭代的,会越来越难,这就导致我如果继续按照这样的写法就会很麻烦因为几乎每一道题都需要重新思考。
2.所以根据前一点的总结,这道题应该严格按照题目给的建议来进行编写,例如:建三个类,Paper将Answer和Topic关联,输出等方法也是放在了Paper类中,这样会更好

第二次pta

设计与分析

点击查看代码
import java.util.*;

class Question {
    int number;
    String content;
    String answer;

    public Question(int number, String content, String answer) {
        this.number = number;
        this.content = content;
        this.answer = answer;
    }
}

class TestPaper {
    int paperNumber;
    Map<Integer, Integer> questionScores;

    public TestPaper(int paperNumber) {
        this.paperNumber = paperNumber;
        this.questionScores = new HashMap<>();
    }

    public void addQuestionScore(int questionNumber, int score) {
        questionScores.put(questionNumber, score);
    }
}

class AnswerSheet {
    int paperNumber;
    List<Answer> answers;

    public AnswerSheet(int paperNumber) {
        this.paperNumber = paperNumber;
        this.answers = new ArrayList<>();
    }

    public void addAnswer(int questionNumber, String answer) {
        answers.add(new Answer(questionNumber, answer));
    }
}

class Answer {
    int questionNumber;
    String answer;

    public Answer(int questionNumber, String answer) {
        this.questionNumber = questionNumber;
        this.answer = answer;
    }
}

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        Map<Integer, Question> questionMap = new HashMap<>();
        Map<Integer, TestPaper> testPaperMap = new HashMap<>();

        while (scanner.hasNextLine()) {
            String line = scanner.nextLine();
            if (line.equals("end")) {
                break;
            }

            if (line.startsWith("#N:")) {
                String[] parts = line.split(" ");
                int number = Integer.parseInt(parts[0].substring(4));
                String content = parts[1].substring(4);
                String answer = parts[2].substring(4);
                questionMap.put(number, new Question(number, content, answer));
            } else if (line.startsWith("#T:")) {
                String[] parts = line.split(" ");
                int paperNumber = Integer.parseInt(parts[0].substring(4));
                TestPaper testPaper = new TestPaper(paperNumber);
                for (int i = 1; i < parts.length; i++) {
                    String[] qScore = parts[i].split("-");
                    testPaper.addQuestionScore(Integer.parseInt(qScore[0]), Integer.parseInt(qScore[1]));
                }
                testPaperMap.put(paperNumber, testPaper);
            } else if (line.startsWith("#S:")) {
                String[] parts = line.split(" ");
                int paperNumber = Integer.parseInt(parts[0].substring(4));
                AnswerSheet answerSheet = new AnswerSheet(paperNumber);
                for (int i = 1; i < parts.length; i++) {
                    answerSheet.addAnswer(i, parts[i].substring(4));
                }

                // 判断答案
                TestPaper testPaper = testPaperMap.get(paperNumber);
                if (testPaper != null) {
                    System.out.println("alert: full score of test paper" + paperNumber + " is not 100 points");
                    for (Answer answer : answerSheet.answers) {
                        Question question = questionMap.get(answer.questionNumber);
                        if (question != null) {
                            int score = 0;
                            if (question.answer.equals(answer.answer)) {
                                score = testPaper.questionScores.getOrDefault(answer.questionNumber, 0);
                                System.out.println(question.content + "~" + answer.answer + "~true");
                            } else {
                                System.out.println(question.content + "~" + answer.answer + "~false");
                            }
                        }
                    }

                    int totalScore = 0;
                    for (Answer answer : answerSheet.answers) {
                        totalScore += testPaper.questionScores.getOrDefault(answer.questionNumber, 0);
                    }
                    System.out.println(totalScore + " " + "~" + totalScore);
                } else {
                    System.out.println("The test paper number does not exist");
                }
            }
        }
    }
}

其中分别有Question类

TestPaper类

AnswerSheet类

Answer类

PowerDesigner下相应的类图

踩坑心得

第二次大作业和第一次难度直线上升。
在第二次中代码为

点击查看代码
import java.util.*;

class Question {
    int number;
    String content;
    String answer;

    public Question(int number, String content, String answer) {
        this.number = number;
        this.content = content;
        this.answer = answer;
    }
}

class TestPaper {
    int paperNumber;
    Map<Integer, Integer> questionScores;

    public TestPaper(int paperNumber) {
        this.paperNumber = paperNumber;
        this.questionScores = new HashMap<>();
    }

    public void addQuestionScore(int questionNumber, int score) {
        questionScores.put(questionNumber, score);
    }
}

class AnswerSheet {
    int paperNumber;
    List<Answer> answers;

    public AnswerSheet(int paperNumber) {
        this.paperNumber = paperNumber;
        this.answers = new ArrayList<>();
    }

    public void addAnswer(int questionNumber, String answer) {
        answers.add(new Answer(questionNumber, answer));
    }
}

class Answer {
    int questionNumber;
    String answer;

    public Answer(int questionNumber, String answer) {
        this.questionNumber = questionNumber;
        this.answer = answer;
    }
}

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        Map<Integer, Question> questionMap = new HashMap<>();
        Map<Integer, TestPaper> testPaperMap = new HashMap<>();

        while (scanner.hasNextLine()) {
            String line = scanner.nextLine();
            if (line.equals("end")) {
                break;
            }

            if (line.startsWith("#N:")) {
                String[] parts = line.split(" ");
                int number = Integer.parseInt(parts[0].substring(4));
                String content = parts[1].substring(4);
                String answer = parts[2].substring(4);
                questionMap.put(number, new Question(number, content, answer));
            } else if (line.startsWith("#T:")) {
                String[] parts = line.split(" ");
                int paperNumber = Integer.parseInt(parts[0].substring(4));
                TestPaper testPaper = new TestPaper(paperNumber);
                for (int i = 1; i < parts.length; i++) {
                    String[] qScore = parts[i].split("-");
                    testPaper.addQuestionScore(Integer.parseInt(qScore[0]), Integer.parseInt(qScore[1]));
                }
                testPaperMap.put(paperNumber, testPaper);
            } else if (line.startsWith("#S:")) {
                String[] parts = line.split(" ");
                int paperNumber = Integer.parseInt(parts[0].substring(4));
                AnswerSheet answerSheet = new AnswerSheet(paperNumber);
                for (int i = 1; i < parts.length; i++) {
                    answerSheet.addAnswer(i, parts[i].substring(4));
                }

                // 判断答案
                TestPaper testPaper = testPaperMap.get(paperNumber);
                if (testPaper != null) {
                    System.out.println("alert: full score of test paper" + paperNumber + " is not 100 points");
                    for (Answer answer : answerSheet.answers) {
                        Question question = questionMap.get(answer.questionNumber);
                        if (question != null) {
                            int score = 0;
                            if (question.answer.equals(answer.answer)) {
                                score = testPaper.questionScores.getOrDefault(answer.questionNumber, 0);
                                System.out.println(question.content + "~" + answer.answer + "~true");
                            } else {
                                System.out.println(question.content + "~" + answer.answer + "~false");
                            }
                        }
                    }

                    int totalScore = 0;
                    for (Answer answer : answerSheet.answers) {
                        totalScore += testPaper.questionScores.getOrDefault(answer.questionNumber, 0);
                    }
                    System.out.println(totalScore + " " + "~" + totalScore);
                } else {
                    System.out.println("The test paper number does not exist");
                }
            }
        }
    }
}

第三次pta

设计与分析

点击查看代码
import java.util.*;

class Question {
    int number;
    String content;
    String answer;

    public Question(int number, String content, String answer) {
        this.number = number;
        this.content = content;
        this.answer = answer;
    }
}

class TestPaper {
    int paperNumber;
    Map<Integer, Integer> questionScores;

    public TestPaper(int paperNumber) {
        this.paperNumber = paperNumber;
        this.questionScores = new HashMap<>();
    }

    public void addQuestionScore(int questionNumber, int score) {
        questionScores.put(questionNumber, score);
    }
}

class Student {
    int id;
    String name;

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

class AnswerSheet {
    int paperNumber;
    Student student;
    List<String> answers;

    public AnswerSheet(int paperNumber, Student student) {
        this.paperNumber = paperNumber;
        this.student = student;
        this.answers = new ArrayList<>();
    }

    public void addAnswer(String answer) {
        answers.add(answer);
    }
}

class DeletedQuestion {
    int questionNumber;

    public DeletedQuestion(int questionNumber) {
        this.questionNumber = questionNumber;
    }
}

class InvalidQuestionReference {
    int questionNumber;
    String answer;

    public InvalidQuestionReference(int questionNumber, String answer) {
        this.questionNumber = questionNumber;
        this.answer = answer;
    }
}

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        Map<Integer, Question> questionMap = new HashMap<>();
        Map<Integer, TestPaper> testPaperMap = new HashMap<>();
        Map<Integer, Student> studentMap = new HashMap<>();
        List<AnswerSheet> answerSheets = new ArrayList<>();
        List<DeletedQuestion> deletedQuestions = new ArrayList<>();
        List<InvalidQuestionReference> invalidQuestionReferences = new ArrayList<>();

        while (scanner.hasNextLine()) {
            String line = scanner.nextLine();
            if (line.equals("end")) {
                break;
            }

            if (line.startsWith("#N:")) {
                String[] parts = line.split(" ");
                int number = Integer.parseInt(parts[0].substring(4));
                String content = parts[1].substring(4);
                String answer = parts[2].substring(4);
                questionMap.put(number, new Question(number, content, answer));
            } else if (line.startsWith("#T:")) {
                String[] parts = line.split(" ");
                int paperNumber = Integer.parseInt(parts[0].substring(4));
                TestPaper testPaper = new TestPaper(paperNumber);
                for (int i = 1; i < parts.length; i++) {
                    String[] qScore = parts[i].split("-");
                    testPaper.addQuestionScore(Integer.parseInt(qScore[0]), Integer.parseInt(qScore[1]));
                }
                testPaperMap.put(paperNumber, testPaper);
            } else if (line.startsWith("#X:")) {
                String[] parts = line.split(" ");
                for (int i = 1; i < parts.length; i++) {
                    String[] studentInfo = parts[i].split("-");
                    int id = Integer.parseInt(studentInfo[0]);
                    String name = studentInfo[1];
                    studentMap.put(id, new Student(id, name));
                }
            } else if (line.startsWith("#S:")) {
                String[] parts = line.split(" ");
                int paperNumber = Integer.parseInt(parts[0].substring(4));
                int studentId = Integer.parseInt(parts[1]);
                Student student = studentMap.get(studentId);
                AnswerSheet answerSheet = new AnswerSheet(paperNumber, student);
                for (int i = 2; i < parts.length; i++) {
                    String[] answerInfo = parts[i].substring(4).split("-");
                    answerSheet.addAnswer(answerInfo[1]);
                }
                answerSheets.add(answerSheet);
            } else if (line.startsWith("#D:")) {
                int questionNumber = Integer.parseInt(line.substring(4));
                deletedQuestions.add(new DeletedQuestion(questionNumber));
            }
        }


        for (AnswerSheet answerSheet : answerSheets) {
            TestPaper testPaper = testPaperMap.get(answerSheet.paperNumber);
            if (testPaper != null) {
                System.out.println("alert: full score of test paper" + answerSheet.paperNumber + " is not 100 points");
                for (String answer : answerSheet.answers) {
                
            } else {
                System.out.println("The test paper number does not exist");
            }
        }


        for (DeletedQuestion deletedQuestion : deletedQuestions) {
            System.out.println("the question " + deletedQuestion.questionNumber + " invalid~0");
        }


        for (InvalidQuestionReference invalidQuestionReference : invalidQuestionReferences) {
            System.out.println("non-existent question~" + invalidQuestionReference.answer);
        }
    }
}

以上代码并不完全正确(还有一大部分bug)
在第三次pta中共有6类
1.Question

2.TestPaper

3.Student

4.AnswerSheet

5.DeletedQuestion

6. InvalidQuestionReference

PowerDesigner下相应的类图

踩坑心得

这道题以及不是踩坑了,到后面已经是完全错了,改一错一。完全就是问别人怎么去写,自己已经没有思路了。

总结

1.在写pta的时候认识到Java的难度大,不能像学C语言一样去单纯的靠自己,更多的是问同学,网上的自我学习。java需要我们沉淀下来慢慢琢磨,慢慢推敲,吃透所有的知识点,以便以后更加复杂的运用。
2.在后续写题当中要学会先分析题目,绘画大纲,在开始分析每一个要求和自己需要建立什么类和类里面都成员。
3.一定要把老师上课的内容学懂,在不懂的问题一定要多问同学,多独立思考。