对于前三次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
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
private static List
private static List
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等,提高了编程效率。
建议:我个人觉得上课和网络课程的进度差距太大。