oop 1~3总结
前言
-
知识点
1.类的基本运用、类与对象的运用、类与数组的运用、关联类的使用2.接口的初步了解与运用
3.日期类的使用这三次作业的最后一题涉及到的知识点比较多,综合性很强。宏观上重点考察的是我们对面向对象技术的整体把握,对程序设计原则的理解与使用,同时在细节上也考察了我们对java语法的掌握。例如:用正则表达式处理输入语句的格式、用数组、列表或Map对数据进行存储、用split()函数分割字符串等等。在完成作业时,由于题目每次都进行迭代,一次比一次难,涉及到的知识点也一次比一次多。
-
题量
整体的题量不算多,但是质量很高,每道题目的侧重点都稍有不同。若能认真完成作业上的题目,将每道题都理解透彻,就会对个人能力的提升有极大的帮助。
-
难度
对我个人而言,最后一题的难度是非常的大。不仅题干长难以理解,并且要有宏观的设计能力,要将不同的类之间的关系理清晰。但是我的基础比较差,有很多基础的语法我还没有搞清楚。再加上这个题目是老师原创的,之前没有见过类似的,我觉得比较抽象,也增加了题目的难度,完成起来很是困难。
设计与分析
第一次作业 答题判题程序-1
设计实现答题程序,模拟一个小型的测试,要求输入题目信息和答题信息,根据输入题目信息中的标准答案判断答题的结果。
输入格式:
程序输入信息分三部分:
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
类图:
源码如下:
import java.util.Scanner;
class Question {
int questionNumber;
String questionContent;
String standardAnswer;
public Question() {
}
public Question(int questionNumber, String questionContent, String standardAnswer) {
this.questionNumber = questionNumber;
this.questionContent = questionContent;
this.standardAnswer = standardAnswer;
}
public void setQuestionContent(String questionContent) {
this.questionContent = questionContent;
}
public String getQuestionContent() {
return questionContent;
}
}
class Paper {
Question[] questions;
String[] standardAnswers;
public Paper(int numQuestions) {
questions = new Question[numQuestions];
standardAnswers = new String[numQuestions];
}
public void addQuestion(Question question, int index) {
questions[index] = question;
}
public void setStandardAnswer(String standardAnswer, int index) {
standardAnswers[index] = standardAnswer;
}
public boolean isCorrectAnswer(AnswerSheet answerSheet, int index) {
return standardAnswers[index].equals(answerSheet.getAnswer(index));
}
public Question getQuestion(int index) {
return questions[index];
}
}
class AnswerSheet {
String[] answers;
public AnswerSheet(int numQuestions) {
answers = new String[numQuestions];
}
public void setAnswer(String answer, int index) {
answers[index] = answer;
}
public String getAnswer(int index) {
return answers[index];
}
}
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int n = input.nextInt();
input.nextLine(); // Consume newline
Paper paper = new Paper(n);
AnswerSheet answerSheet = new AnswerSheet(n);
for (int i = 0; i < n; i++) {
String line = input.nextLine();
String[] input1 = line.split(" *#N: *| *#A: *| *#Q: *");
int num1 = Integer.parseInt(input1[1]) - 1;
String content1 = input1[2];
String standardAnswer1 = input1[3];
Question question= new Question(num1, content1, standardAnswer1);
paper.addQuestion(question, question.questionNumber);
paper.setStandardAnswer(question.standardAnswer, question.questionNumber);
}
String answerInput = input.nextLine();
String[] answers = answerInput.split(" *#A: *");
for (int i = 0; i < n; i++) {
answerSheet.setAnswer(answers[i + 1], i);
}
for (int i = 0; i < n; i++) {
System.out.println(paper.getQuestion(i).getQuestionContent() + "~" + answerSheet.getAnswer(i));
}
for (int i = 0; i < n; i++) {
if (i == n - 1) {
System.out.print(paper.isCorrectAnswer(answerSheet, i));
} else {
System.out.print(paper.isCorrectAnswer(answerSheet, i) + " ");
}
}
}
}
设计思路:
这道题目我是在老师给出来的设计建议上进行的类设计,分别设计了Question、Paper、和AnswerSheet类。
- Question类表示一个题目,包含题号、题目内容和标准答案。这个类提供了带参数的构造函数用于初始化题目对象,以及 getter 和 setter 方法来获取和设置题目内容。
- Paper类用于表示整张试卷,包含了题目数组和标准答案数组。构造函数接受题目数量作为参数,初始化题目和标准答案数组。addQuestion()方法接收Question类的对象和其在数组中的索引位置用来向试卷中添加题目;setStandardAnswer()方法接收传入的标准答案和索引位置用来向试卷中添加标准答案;isCorrectAnswer() 方法用于判断学生的答案是否正确。getQuestion() 方法来获取试卷中的某个题目。
- AnswerSheet类用于表示学生的答题卡,包含了学生的答案数组。构造函数接收题目数量作为参数,初始化答案数组。并且提供了setter和getter方法来获取和设置学生的答案。
- Main类包含了 首先从用户输入读取题目数量 n,然后创建试卷对象和答题卡对象。接着通过循环读取用户输入的每道题目的信息,解析后将题目添加到试卷对象中,并设置标准答案。读取学生的答案输入后,将学生的答案设置到答题卡对象中。最后循环输出每个题目及对应的学生答案,以及判断每个学生答案是否正确。
心得:
第一次的作业在第一时间看到的时候很是惊讶,理解能力较差的我连题目都读不懂,不知道想让我干什么,写的东西也是一团乱麻,最后截止的时候也没得到多少分。但是当我现在来总结时,将这道题目重新做了一遍,比较容易就写出来了并且得到了满分(我可太开心了嘻嘻)。但是还有需要修改的地方,可以让程序更加健壮,这部分后面会讲到。
第二次作业 答题判题程序-2
以下粗体字显示的是在答题判题程序-1基础上增补或者修改的内容。
要求输入题目信息、试卷信息和答题信息,根据输入题目信息中的标准答案判断答题的结果。
输入格式:
程序输入信息分三种,三种信息可能会打乱顺序混合输入:
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、答卷信息
答卷信息按行输入,每一行为一张答卷的答案,每组答案包含某个试卷信息中的题目的解题答案,答案的顺序与试卷信息中的题目顺序相对应。
格式:"#S:"+试卷号+" "+"#A:"+答案内容
格式约束:答案数量可以不等于试卷信息中题目的数量,没有答案的题目计0分,多余的答案直接忽略,答案之间以英文空格分隔。
样例:#S:1 #A:5 #A:22
1是试卷号
5是1号试卷的顺序第1题的题目答案
22是1号试卷的顺序第2题的题目答案
答题信息以一行"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"
样例:3+2=5true
**4+6=~22~false.**
answer is null
3、判分信息
判分信息为一行数据,是一条答题记录所对应试卷的每道小题的计分以及总分,计分输出的先后顺序与题目题号相对应。
格式:题目得分+" "+....+题目得分+"~"+总分
格式约束:
1、没有输入答案的题目计0分
2、判题信息的顺序与输入答题信息中的顺序相同
样例:5 8 0~13
根据输入的答卷的数量以上2、3项答卷信息与判分信息将重复输出。
4、提示错误的试卷号
如果答案信息中试卷的编号找不到,则输出”the test paper number does not exist”。
源码如下:
试卷题目类(****Question_Paper 新增****):用于保存试卷中的题目信息。由于试卷中的题目序
号与题目本身的题号不一致。且题目在不同试卷中的分值可能不一样,因此,设计试卷题目
类。
踩坑心得
- 一开始在写第一题时,我心情比较焦虑,越是焦虑就越是写不出来,反而焦虑之感又增多,对做出来这道题目毫无帮助。用的方法总是报错说数组越界,但是到最后我也没找出来原因。这次在重新做的时候冷静了许多,思路也更加的清晰了。所以面对难题心态一定不能崩掉噢~