前段时间老师在PTA上发布了三次大作业,这几次大作业的难度都比较高,对我来说除了前面的题目,最后的大分数压轴题我每次都做不出来。
这与上个学期学的C语言作业难度简直不是一个等级的,不过JAVA老师也在上课期间一直强调,“我们JAVA课程一定要做出改变,不能说怕学生挂科就把难度设置的很低,这样是起不到学习的作用的“。
上个学期学的C语言感觉就是代码行数不多,逻辑就会比较清晰,流程很线性,一步步来,构建相应的函数,调用关系,就可以比较轻松的解决问题。
但是,这一套显然在JAVA身上不好用,JAVA是面向对象的语言,而C语言是面向过程的。这两种语言从根本上就有着天差地别的区别。也许就是这种思考问题的差异化,导致我做题目感到异常困难。
当然,毕竟是自己的专业课,再困难也要努力克服。
下面我会逐一分析前几次的大作业题目,分析自己学习过程中的错误并吸取经验教训。
第一次大作业:
1:设计一个风扇Fan类 这个比较简单,就是初步认识一下JAVA的题目,用到了get set 方法。没什么分析的。
2:创建一个类Student,和上面的题目同理。
3:创建学生类,包含
属性:学号(String)、姓名(String)、语文成绩(int)、数学成绩(int)、物理成绩(int) 同理。
4:成绩计算-2-关联类 这一题开始有一定的难度了,第一次出现了关联类,一道题目不止一个类了,并且各种类之间还有相互关系。这一题开始把我难住了一会儿,不过仔细想想,也就是一道题里多写几个类而已,然后搞清楚每个类里面有什么属性和方法就行了,也不算太难。
5:第五题,最难的一题来了,见到题目的第一眼,我就看到了长长的题目,很多要求,而且还要使用三个类。这一题我可以说是想了很久。
题目:设计实现答题程序,模拟一个小型的测试,要求输入题目信息和答题信息,根据输入题目信息中的标准答案判断答题的结果。
输入格式:
程序输入信息分三部分:
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
除此之外还需要用到三个类:
题目类(用于封装单个题目的信息):
属性:题目编号、题目内容、标准答案-standardAnswer
方法:数据读写set\get方法、
判题方法(答案-answer):判断答案-answer是否符合标准答案-standardAnswer
试卷类(用于封装整套题目的信息)
属性:题目列表(题目类的对象集合)、题目数量
方法:判题方法(题号-num、答案-answer):判断答案-answer是否符合对应题号的题目标准答案-standardAnswer
保存题目(题号-num、题目-question):将题目保存到题目列表中,保存位置与num要能对应
答卷类(用于封装答题信息)
属性:试卷(试卷类的对象)、答案列表(保存每一题的答案)、判题列表(保存每一题的判题结果true/false)
方法:判题方法(题号-num):判断答案列表中第num题的结果是否符合试卷中对应题号的题目标准答案
输出方法(题号-num):按照题目的格式要求,输出题号为num的题目的内容和答题结果。
保存一个答案(题号-num,答案-answer):保存题号为num的题目的答题结果answer。
我的答案:
我设计的题目类:
`class Question {
private int number;
private String content;
private String standardAnswer;
public Question(int number, String content, String standardAnswer) {
this.number = number;
this.content = content;
this.standardAnswer = standardAnswer;
}
public int getNumber() {
return number;
}
public String getContent() {
return content;
}
public String getStandardAnswer() {
return standardAnswer;
}
public boolean isCorrect(String answer) {
return standardAnswer.equals(answer);
}
}包含题目号,内容,答案属性。get set方法,判断方法。 然后是试卷类:
class Exam {
private Map<Integer, Question> questions;
private int questionCount;
public Exam() {
questions = new HashMap<>();
questionCount = 0;
}
public void addQuestion(Question question) {
questions.put(question.getNumber(), question);
questionCount++;
}
public boolean checkAnswer(int number, String answer) {
Question question = questions.get(number);
if (question != null) {
return question.isCorrect(answer);
}
return false;
}
public int getQuestionCount() {
return questionCount;
}
public List<Question> getQuestions() {
return new ArrayList<>(questions.values());
}
}用到了HashMap,判读题号和答案,保存题目的方法。 然后是答卷类:
class AnswerSheet {
private Exam exam;
private List
private List
public AnswerSheet(Exam exam) {
this.exam = exam;
this.answers = new ArrayList<>();
this.results = new ArrayList<>();
}
public void addAnswer(String answer) {
answers.add(answer);
}
public void evaluateAnswers() {
for (int i = 0; i < answers.size(); i++) {
results.add(exam.checkAnswer(i + 1, answers.get(i)));
}
}
public void printAnswersAndResults() {
List<Question> questions = exam.getQuestions();
for (int i = 0; i < questions.size(); i++) {
System.out.println(questions.get(i).getContent() + " ~" + answers.get(i));
}
for (boolean result : results) {
System.out.print(result ? "true" : "false" + " ");
}
System.out.println();
}
}`
这里用到了List。
可能是因为对List和HashMap不够理解,导致在最后一题大作业卡了好久,程序一直报错,一直不能输出想要的结果。无奈提交时间已经到了,只能放弃。
第二次大作业:
前三题比较简单,在此就不分析了。
依然是来到大作业的最后一题,这一题是在第一次题目的基础上增加功能。比如:程序输入信息分三种,三种信息可能会打乱顺序混合输入;试卷总分警示该部分仅当一张试卷的总分分值不等于100分时作提示之用,试卷依然属于正常试卷,可用于后面的答题。如果总分等于100分,该部分忽略,不输出。因为第一次大作业最后一题没能做出来,导致第二次修改增加功能也没法做,再加上那段时间C语言的课设马上就要提交了,导致第二次大作业也没能完成。
但总体还是有一些修改的:class Question {
String id;
String content;
String answer;
public Question(String id, String content, String answer) {
this.id = id;
this.content = content;
this.answer = answer;
}
}
class TestPaper {
String id;
Map<String, Integer> questionsAndScores = new HashMap<>();
public TestPaper(String id) {
this.id = id;
}
public void addQuestion(String questionId, int score) {
questionsAndScores.put(questionId, score);
}
}
class AnswerSheet {
String testPaperId;
List
public AnswerSheet(String testPaperId) {
this.testPaperId = testPaperId;
}
public void addAnswer(String answer) {
answers.add(answer);
}
}
这次是换了一种风格,将主要内容写在Main类的main方法里,想以此当作C语言写,但是老师说不能再以面向过程的方式写了,所以我只能收手。
第三次大作业:
前面两题略过,看到最后一题,发现又是前两次大作业的升级版。
题目相比之前的大作业增加了:学生信息、删除题目信息。
这一次我改进了代码:`import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
class Question {
private int id;
private String content;
private String answer;
public Question(int id, String content, String answer) {
this.id = id;
this.content = content;
this.answer = answer;
}
public int getId() {
return id;
}
public String getContent() {
return content;
}
public String getAnswer() {
return answer;
}
public String toString() {
return "Question{" +
"id=" + id +
", content='" + content + '\'' +
", answer='" + answer + '\'' +
'}';
}
}
class TestPaper {
private int id;
private List
public TestPaper(int id) {
this.id = id;
this.questionScores = new ArrayList<>();
}
public int getId() {
return id;
}
public List<QuestionScore> getQuestionScores() {
return questionScores;
}
public void addQuestionScore(QuestionScore questionScore) {
questionScores.add(questionScore);
}
public String toString() {
return "TestPaper{" +
"id=" + id +
", questionScores=" + questionScores +
'}';
}
}
class QuestionScore {
private int questionId;
private int score;
public QuestionScore(int questionId, int score) {
this.questionId = questionId;
this.score = score;
}
public int getQuestionId() {
return questionId;
}
public int getScore() {
return score;
}
public String toString() {
return "QuestionScore{" +
"questionId=" + questionId +
", score=" + score +
'}';
}
}
class Student {
private String id;
private String name;
public Student(String id, String name) {
this.id = id;
this.name = name;
}
public String getId() {
return id;
}
public String getName() {
return name;
}
public String toString() {
return "Student{" +
"id='" + id + '\'' +
", name='" + name + '\'' +
'}';
}
}
class AnswerSheet {
private int testPaperId;
private String studentId;
private List
public AnswerSheet(int testPaperId, String studentId) {
this.testPaperId = testPaperId;
this.studentId = studentId;
this.answers = new ArrayList<>();
}
public int getTestPaperId() {
return testPaperId;
}
public String getStudentId() {
return studentId;
}
public List<Answer> getAnswers() {
return answers;
}
public void addAnswer(Answer answer) {
answers.add(answer);
}
public String toString() {
return "AnswerSheet{" +
"testPaperId=" + testPaperId +
", studentId='" + studentId + '\'' +
", answers=" + answers +
'}';
}
}
class Answer {
private int questionOrder;
private String answer;
public Answer(int questionOrder, String answer) {
this.questionOrder = questionOrder;
this.answer = answer;
}
public int getQuestionOrder() {
return questionOrder;
}
public String getAnswer() {
return answer;
}
public String toString() {
return "Answer{" +
"questionOrder=" + questionOrder +
", answer='" + answer + '\'' +
'}';
}
}
public class Main{
private List
private List
private List
private List
private Map<Integer, Question> questionMap;
private Map<Integer, TestPaper> testPaperMap;
private Map<String, Student> studentMap;
public Main() {
questions = new ArrayList<>();
testPapers = new ArrayList<>();
students = new ArrayList<>();
answerSheets = new ArrayList<>();
questionMap = new HashMap<>();
testPaperMap = new HashMap<>();
studentMap = new HashMap<>();
}
public void start() {
Scanner scanner = new Scanner(System.in);
while (true) {
String input = scanner.nextLine();
if (input.equalsIgnoreCase("end")) {
break;
}
handleInput(input);
}
scanner.close();
outputResult();
}
private void handleInput(String input) {
String[] parts = input.split("\\s+");
String command = parts[0];
switch (command) {
case "#N:":
handleQuestion(input);
break;
case "#T:":
handleTestPaper(input);
break;
case "#X:":
handleStudent(input);
break;
case "#S:":
handleAnswerSheet(input);
break;
case "#D:":
handleDeleteQuestion(input);
break;
default:
System.out.println("wrong format: " + input);
}
}
private void handleQuestion(String input) {
String[] parts = input.split("\\s+");
int id = Integer.parseInt(parts[1].substring(2));
String content = parts[3].substring(1, parts[3].length() - 1);
String answer = parts[5].substring(1, parts[5].length() - 1);
Question question = new Question(id, content, answer);
questions.add(question);
questionMap.put(id, question);
}
private void handleTestPaper(String input) {
String[] parts = input.split("\\s+");
int id = Integer.parseInt(parts[1].substring(2));
TestPaper testPaper = new TestPaper(id);
for (int i = 3; i < parts.length; i += 2) {
int questionId = Integer.parseInt(parts[i].substring(0, parts[i].length() - 1));
int score = Integer.parseInt(parts[i + 1]);
QuestionScore questionScore = new QuestionScore(questionId, score);
testPaper.addQuestionScore(questionScore);
}
testPapers.add(testPaper);
testPaperMap.put(id, testPaper);
}
private void handleStudent(String input) {
String[] parts = input.split("\\s+");
String id = parts[1];
String name = parts[3];
Student student = new Student(id, name);
students.add(student);
studentMap.put(id, student);
}
private void handleAnswerSheet(String input) {
String[] parts = input.split("\\s+");
int testPaperId = Integer.parseInt(parts[1].substring(2));
String studentId = parts[3];
AnswerSheet answerSheet = new AnswerSheet(testPaperId, studentId);
for (int i = 5; i < parts.length; i += 2) {
int questionOrder = Integer.parseInt(parts[i].substring(0, parts[i].length() - 1));
String answer = parts[i + 1].substring(1, parts[i + 1].length() - 1);
Answer answerObj = new Answer(questionOrder, answer);
answerSheet.addAnswer(answerObj);
}
answerSheets.add(answerSheet);
}
private void handleDeleteQuestion(String input) {
String[] parts = input.split("\\s+");
int id = Integer.parseInt(parts[1].substring(2));
questions.remove(questionMap.get(id));
questionMap.remove(id);
}
}`
但是不知道为何报错:Main.java:208: error: cannot find symbol
outputResult();
^
symbol: method outputResult()
location: class Main
1 error
就这样,三次大作业最后一题都没能写出来,但是最后一题的分数又异常的高,导致我虽然写出了不少题目,但就是因为没能写出最后一题(最后一题爆错没分),导致分数异常的低,还是比较可惜的。
从前面三次大作业来看,我深刻认识到了大作业的难度,也明白了不能一上学期那种懒散的态度对待JAVA课程了。对于之后的大作业,我必须打起十二分的精神,抽出足够的时间认真研究最后一题。
对大作业机制的改进建议:(1)每一题的难度平均一些,现在的大作业前面的题目太简单但是最后一题又太难。(2)分数设置均匀一些,现在的大作业前面题目就算写出来了也就小几十分,最后一题没写出来就是直接七八十分没了。
标签:学习,JAVA,String,int,private,public,Blog,answer,id From: https://www.cnblogs.com/Butcher666/p/18148882