ZBWzhao

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

前言
本次blog是对Java作业pta前三次作业的总结,主要总结最后一题,包括对前三次作业的难度,知识点进行概括,对作业的源码进行分析,并且分享自己的心得与改进建议。

第一次作业
第一次作业中其他四题都很基础,主要考察了输入输出处理,字符串处理,正则表达式,类型转换,类与数组的基本使用,类与对象,关联类等知识点,相当于带领新人对Java进行入门,涉及的知识很浅薄但能让人对Java有自己的初步理解,与其他题目相比,最后一题难度陡然上升(把人都整蒙了)
第二次作业
第二次作业主要的是考察的类与对象,对类的使用方法考察很多,还带了一些正则表达式(也可以不用)
但最后一题很多地方看不懂,本来上一次作业就是写了半天才憋出来的,这次更是写了两三天一半分都没拿到
第三次作业
题量很少,主要考察了面向对象的封装性,java中日期类的使用,正则表达式,但是最做不出来的一集,前两题做着还行,结果最后一题该了两三天还发现是错的,最后导致大改但仍旧出错。

设计与分析
7-1 答题判题程序-1
分数 50
作者 蔡轲
单位 南昌航空大学
设计实现答题程序,模拟一个小型的测试,要求输入题目信息和答题信息,根据输入题目信息中的标准答案判断答题的结果。

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

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.ArrayList;
import java.util.List;
import java.util.Scanner;

// 题目类
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 checkAnswer(String answer) {
        return answer.equals(standardAnswer);
    }
}

// 试卷类
class ExamPaper {
    private ArrayList<Question> questionsList;

    public ExamPaper() {
        questionsList = new ArrayList<>();
    }


    public void saveQuestion(int number, String content, String standardAnswer) {
        Question question = new Question(number, content, standardAnswer);
        questionsList.add(question);
    }

    public boolean[] checkAnswers(ArrayList<String> answers) {
        boolean[] results = new boolean[questionsList.size()];
        for (int i = 0; i < questionsList.size(); i++) {
            Question question = questionsList.get(i);
            String answer = answers.get(i);
            results[i] = question.checkAnswer(answer);
        }
        return results;
    }
}

// 答卷类
class AnswerSheet {
    private ExamPaper examPaper;
    private ArrayList<String> answersList;

    public AnswerSheet(ExamPaper examPaper) {
        this.examPaper = examPaper;
        answersList = new ArrayList<>();
    }

    public void saveAnswer(String answer) {
        answersList.add(answer);
    }

    public boolean[] checkAnswers() {
        return examPaper.checkAnswers(answersList);
    }

    public void outputAnswer() {
        for (int i = 0; i < answersList.size(); i++) {
            Question question = examPaper.questionsList.get(i);
            String content = question.getContent();
            String answer = answersList.get(i);
            System.out.println(content + " ~" + answer);
        }
    }
}

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

        // 读取题目数量
        int numQuestions = scanner.nextInt();
        scanner.nextLine(); // 消耗换行符

        // 创建试卷对象
        ExamPaper examPaper = new ExamPaper();

        // 读取题目信息并保存到试卷对象中
        for (int i = 0; i < numQuestions; i++) {
            String line = scanner.nextLine();
            String[] parts = line.split(" ");
            int number = Integer.parseInt(parts[1]);
            String content = parts[3];
            String standardAnswer = parts[5];
            examPaper.saveQuestion(number, content, standardAnswer);
        }

        // 创建答卷对象
        AnswerSheet answerSheet = new AnswerSheet(examPaper);

        // 读取答题信息并保存到答卷对象中
        ArrayList<String> answers = new ArrayList<>();
        while (scanner.hasNextLine()) {
            String line = scanner.nextLine();
            if (line.equals("end")) {
                break;
            }
            String[] parts = line.split(" ");
            for (int i = 1; i < parts.length; i++) {
                answers.add(parts[i]);
            }
        }

        for (String answer : answers) {
            answerSheet.saveAnswer(answer);
        }

        // 判题并输出结果
        boolean[] results = answerSheet.checkAnswers();
        for (boolean result : results) {
            System.out.print(result + " ");
        }
    }
}

idea测试结果如下




本题代码我设立了四个类,分别为Question,Exampaper,AnswerSheet和Main,按照题目所给标准;

1.Question类:
题目类(用于封装单个题目的信息):

属性:题目编号(number)、题目内容(cotent)、标准答案(standardAnswer)
方法:
1.checkAnswer():判断答案是否正确,输出true或false

2.Exampaper类:
试卷类(用于封装整套题目的信息)

属性:题目列表(题目类的对象集合)questionlist、题目数量(num)
方法:
1.saveQuestion():保存题目,向链表中添加新的题目;
2.checkAnswers():判断答案-answer是否符合对应题号的题目标准答案-standardAnswer

3.AnswerSheet类
答卷类(用于封装答题信息)

属性:试卷(试卷类的对象)exampaper、答案列表(保存每一题的答案)answerList、判题列表(保存每一题的判题结果true/false)chickAnswer;

7-2 答题判题程序-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”,参见样例9。

设计建议:

参考答题判题程序-1,建议增加答题类,类的内容以及类之间的关联自行设计。

点击查看代码
import java.util.ArrayList;
import java.util.Scanner;

// 题目类
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 checkAnswer(String answer) {
        return answer.equals(standardAnswer);
    }
}

// 试卷类
class ExamPaper {
    int num=-1;//试卷编号
    int tN;//试卷题目数量
    int fen;
    Question[] tt=new Question[100];//题目
    Sore[] ss=new Sore[100];//题目对应分数
    public ExamPaper(int n){
        num=n;
    }
    public void tNo(int n)
    {
        tN=n;
    }
    public void F(int f)
    {
        fen=f;
    }
    public boolean answer(int n,String a)//判题
    {
        return tt[n].checkAnswer(a);
    }
    public void get(int n,String q,String a)//创建题目
    {
        tt[n]=new Question(n,q,a);
        tN=n;
    }
    public void getS(int n,int f)//创建分
    {
        ss[n]=new Sore(n,f);
    }
    public int getN()
    {
        return num;
    }
    // public int gets(int n)
    // {
    //     return ss[n].getF();
    // }
}

// 答卷类
class AnswerSheet {
    private ExamPaper examPaper;
    private ArrayList<String> answersList;

    public AnswerSheet(ExamPaper examPaper) {
        this.examPaper = examPaper;
        answersList = new ArrayList<>();
    }

    public void saveAnswer(String answer) {
        answersList.add(answer);
    }

    public boolean[] checkAnswers() {
        return examPaper.checkAnswers(answersList);
    }

    public void outputAnswer() {
        for (int i = 0; i < answersList.size(); i++) {
            Question question = examPaper.questionsList.get(i);
            String content = question.getContent();
            String answer = answersList.get(i);
            System.out.println(content + " ~" + answer);
        }
    }
}

class Sore {//分值
    private int num;
    private int fen;
    public Sore(){}
    public Sore(int n, int f)
    {
        num=n;
        fen=f;
    }
    public int getF()//获得分信息
    {
        return fen;
    }
    public int getN()//获得编号信息
    {
        return num;
    }

}

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

        // 读取题目数量
        int numQuestions = scanner.nextInt();
        scanner.nextLine(); // 消耗换行符

        // 创建试卷对象
        ExamPaper examPaper = new ExamPaper();

        // 读取题目信息并保存到试卷对象中
        for (int i = 0; i < numQuestions; i++) {
            String line = scanner.nextLine();
            String[] parts = line.split(" ");
            int number = Integer.parseInt(parts[1]);
            String content = parts[3];
            String standardAnswer = parts[5];
            examPaper.saveQuestion(number, content, standardAnswer);
        }

        // 创建答卷对象
        AnswerSheet answerSheet = new AnswerSheet(examPaper);

        // 读取答题信息并保存到答卷对象中
        ArrayList<String> answers = new ArrayList<>();
        while (scanner.hasNextLine()) {
            String line = scanner.nextLine();
            if (line.equals("end")) {
                break;
            }
            String[] parts = line.split(" ");
            for (int i = 1; i < parts.length; i++) {
                answers.add(parts[i]);
            }
        }

        for (String answer : answers) {
            answerSheet.saveAnswer(answer);
        }

        // 判题并输出结果
        boolean[] results = answerSheet.checkAnswers();
        for (boolean result : results) {
            System.out.print(result + " ");
        }
    }
}

本题新增一个Sore函数来存放分数,对以前存在的四个类都进行了修改
新增Sore类
包含题目编号(num)和题目满分(fen)
提供了方法用于获取分信息;
提供了方法用于获取题目编号信息。

第三次作业
设计实现答题程序,模拟一个小型的测试,以下粗体字显示的是在答题判题程序-2基础上增补或者修改的内容,要求输入题目信息、试卷信息、答题信息、学生信息、删除题目信息,根据输入题目信息中的标准答案判断答题的结果。

输入格式:

程序输入信息分五种,信息可能会打乱顺序混合输入。

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、学生信息

学生信息只输入一行,一行中包括所有学生的信息,每个学生的信息包括学号和姓名,格式如下。

格式:"#X:"+学号+" "+姓名+"-"+学号+" "+姓名....+"-"+学号+" "+姓名

格式约束:
答案数量可以不等于试卷信息中题目的数量,没有答案的题目计0分,多余的答案直接忽略,答案之间以英文空格分隔。
样例:
#S:1 #A:5 #A:22
1是试卷号
5是1号试卷的顺序第1题的题目答案
4、答卷信息

答卷信息按行输入,每一行为一张答卷的答案,每组答案包含某个试卷信息中的题目的解题答案,答案的顺序号与试 卷信息中的题目顺序相对应。答卷中:

格式:"#S:"+试卷号+" "+学号+" "+"#A:"+试卷题目的顺序号+"-"+答案内容+...

格式约束:
答案数量可以不等于试卷信息中题目的数量,没有答案的题目计0分,多余的答案直接忽略,答案之间以英文空格分隔。
答案内容可以为空,即””。
答案内容中如果首尾有多余的空格,应去除后再进行判断。
样例:
#T:1 1-5 3-2 2-5 6-9 4-10 7-3
#S:1 20201103 #A:2-5 #A:6-4
1是试卷号
20201103是学号
2-5中的2是试卷中顺序号,5是试卷第2题的答案,即T中3-2的答案
6-4中的6是试卷中顺序号,4是试卷第6题的答案,即T中7-3的答案
注意:不要混淆顺序号与题号

5、删除题目信息

删除题目信息为独行输入,每一行为一条删除信息,多条删除信息可分多行输入。该信息用于删除一道题目信息,题目被删除之后,引用该题目的试卷依然有效,但被删除的题目将以0分计,同时在输出答案时,题目内容与答案改为一条失效提示,例如:”the question 2 invalid~0”

格式:"#D:N-"+题目号

格式约束:

   题目号与第一项”题目信息”中的题号相对应,不是试卷中的题目顺序号。

   本题暂不考虑删除的题号不存在的情况。      

样例:
#N:1 #Q:1+1= #A:2
#N:2 #Q:2+2= #A:4
#T:1 1-5 2-8
#X:20201103 Tom-20201104 Jack
#S:1 20201103 #A:1-5 #A:2-4
#D:N-2
end

输出
alert: full score of test paper1 is not 100 points
1+1=5false
the question 2 invalid~0
20201103 Tom: 0 0~0
答题信息以一行"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=22false.
answer is null

3、判分信息

判分信息为一行数据,是一条答题记录所对应试卷的每道小题的计分以及总分,计分输出的先后顺序与题目题号相对应。

格式:**学号+" "+姓名+": "**+题目得分+" "+....+题目得分+"~"+总分

格式约束:

 1、没有输入答案的题目、被删除的题目、答案错误的题目计0分
 2、判题信息的顺序与输入答题信息中的顺序相同
样例:20201103 Tom: 0 0~0

   根据输入的答卷的数量以上2、3项答卷信息与判分信息将重复输出。

4、被删除的题目提示信息

当某题目被试卷引用,同时被删除时,答案中输出提示信息。样例见第5种输入信息“删除题目信息”。

5、题目引用错误提示信息

试卷错误地引用了一道不存在题号的试题,在输出学生答案时,提示”non-existent question~”加答案。例如:

输入:

       #N:1 #Q:1+1= #A:2
       #T:1 3-8
       #X:20201103 Tom-20201104 Jack-20201105 Www
       #S:1 20201103 #A:1-4
       end

输出:
alert: full score of test paper1 is not 100 points
non-existent question~0
20201103 Tom: 0~0
如果答案输出时,一道题目同时出现答案不存在、引用错误题号、题目被删除,只提示一种信息,答案不存在的优先级最高,例如:
输入:
#N:1 #Q:1+1= #A:2
#T:1 3-8
#X:20201103 Tom-20201104 Jack-20201105 Www
#S:1 20201103
end

输出:
alert: full score of test paper1 is not 100 points
answer is null
20201103 Tom: 0~0

6、格式错误提示信息

输入信息只要不符合格式要求,均输出”wrong format:”+信息内容。

  例如:wrong format:2 #Q:2+2= #4

7、试卷号引用错误提示输出

如果答卷信息中试卷的编号找不到,则输出”the test paper number does not exist”,答卷中的答案不用输出,参见样例8。

8、学号引用错误提示信息

如果答卷中的学号信息不在学生列表中,答案照常输出,判分时提示错误。参见样例9。

本题暂不考虑出现多张答卷的信息的情况。

输入样例1:
简单输入,不含删除题目信息。例如:

       #N:1 #Q:1+1= #A:2
       #T:1 1-5
       #X:20201103 Tom
       #S:1 20201103 #A:1-5
       end

输出样例1:
在这里给出相应的输出。例如:

alert: full score of test paper1 is not 100 points
1+1=5false
20201103 Tom: 0~0
输入样例2:
简单输入,答卷中含多余题目信息(忽略不计)。例如:

       #N:1 #Q:1+1= #A:2
       #T:1 1-5
       #X:20201103 Tom
       #S:1 20201103 #A:1-2 #A:2-3
       end

输出样例3
简单测试,含删除题目信息。例如:

alert: full score of test paper1 is not 100 points
1+1=2true
20201103 Tom: 5~5
输入样例3:
简单测试,含删除题目信息。例如:

       #N:1 #Q:1+1= #A:2
       #N:2 #Q:2+2= #A:4
       #T:1 1-5 2-8
       #X:20201103 Tom-20201104 Jack-20201105 Www
       #S:1 20201103 #A:1-5 #A:2-4
       #D:N-2
       end

输出样例3:
在这里给出相应的输出,第二题由于被删除,输出题目失效提示。例如:

alert: full score of test paper1 is not 100 points
1+1=5false
the question 2 invalid~0
20201103 Tom: 0 0~0
输入样例4:
简单测试,含试卷无效题目的引用信息以及删除题目信息(由于题目本身无效,忽略)。例如:

       #N:1 #Q:1+1= #A:2
       #N:2 #Q:2+2= #A:4
       #T:1 1-5 3-8
       #X:20201103 Tom-20201104 Jack-20201105 Www
       #S:1 20201103 #A:1-5 #A:2-4
       #D:N-2
       end

输出样例4:
输出不存在的题目提示信息。例如:

alert: full score of test paper1 is not 100 points
1+1=5false
non-existent question~0
20201103 Tom: 0 0~0
输入样例5:
综合测试,含错误格式输入、有效删除以及无效题目引用信息。例如:

       #N:1 +1= #A:2
       #N:2 #Q:2+2= #A:4
       #T:1 1-5 2-8
       #X:20201103 Tom-20201104 Jack-20201105 Www
       #S:1 20201103 #A:1-5 #A:2-4
       #D:N-2
       end

输出样例5:
在这里给出相应的输出。例如:

wrong format:#N:1 +1= #A:2
alert: full score of test paper1 is not 100 points
non-existent question~0
the question 2 invalid~0
20201103 Tom: 0 0~0
输入样例6:
综合测试,含错误格式输入、有效删除、无效题目引用信息以及答案没有输入的情况。例如:

       #N:1 +1= #A:2
       #N:2 #Q:2+2= #A:4
       #T:1 1-5 2-8
       #X:20201103 Tom-20201104 Jack-20201105 Www
       #S:1 20201103 #A:1-5
       #D:N-2
       end

输出样例6:
答案没有输入的优先级最高。例如:

wrong format:#N:1 +1= #A:2
alert: full score of test paper1 is not 100 points
non-existent question~0
answer is null
20201103 Tom: 0 0~0
输入样例7:
综合测试,正常输入,含删除信息。例如:

       #N:2 #Q:2+2= #A:4
       #N:1 #Q:1+1= #A:2
       #T:1 1-5 2-8
       #X:20201103 Tom-20201104 Jack-20201105 Www
       #S:1 20201103 #A:2-4 #A:1-5
       #D:N-2
       end

输出样例7:
例如:

alert: full score of test paper1 is not 100 points
1+1=5false
the question 2 invalid~0
20201103 Tom: 0 0~0
输入样例8:
综合测试,无效的试卷引用。例如:

       #N:1 #Q:1+1= #A:2
       #T:1 1-5
       #X:20201103 Tom
       #S:2 202011:

例如:

03 #A:1-5 #A:2-4
end
输出样例8alert: full score of test paper1 is not 100 points
The test paper number does not exist
输入样例9:
无效的学号引用。例如:

       #N:1 #Q:1+1= #A:2
       #T:1 1-5
       #X:20201106 Tom
       #S:1 20201103 #A:1-5 #A:2-4

end
输出样例9:
答案照常输出,判分时提示错误。例如:

alert: full score of test paper1 is not 100 points
1+1=5false
20201103 not found

输入样例10:
信息可打乱顺序输入:序号不是按大小排列,各类信息交错输入。但本题不考虑引用的题目在被引用的信息之后出现的情况(如试卷引用的所有题目应该在试卷信息之前输入),所有引用的数据应该在被引用的信息之前给出。例如:

       #N:3 #Q:中国第一颗原子弹的爆炸时间 #A:1964.10.16
        #N:1 #Q:1+1= #A:2
        #X:20201103 Tom-20201104 Jack-20201105 Www
       #T:1 1-5 3-8
       #N:2 #Q:2+2= #A:4
       #S:1 20201103 #A:1-5 #A:2-4
       输出样例10:
       答案按试卷中的题目顺序输出。例如:

       alert: full score of test paper1 is not 100 points
       1+1=~5~false
       中国第一颗原子弹的爆炸时间~4~false
       20201103 Tom: 0 0~0
点击查看代码
import java.util.ArrayList;
import java.util.Scanner;

// 题目类
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 checkAnswer(String answer) {
        return answer.equals(standardAnswer);
    }
}

// 试卷类
class ExamPaper {
    int num=-1;//试卷编号
    int tN;//试卷题目数量
    int fen;
    Question[] tt=new Question[100];//题目
    Sore[] ss=new Sore[100];//题目对应分数
    public ExamPaper(int n){
        num=n;
    }
    public void tNo(int n)
    {
        tN=n;
    }
    public void F(int f)
    {
        fen=f;
    }
    public boolean answer(int n,String a)//判题
    {
        return tt[n].checkAnswer(a);
    }
    public void get(int n,String q,String a)//创建题目
    {
        tt[n]=new Question(n,q,a);
        tN=n;
    }
    public void getS(int n,int f)//创建分
    {
        ss[n]=new Sore(n,f);
    }
    public int getN()
    {
        return num;
    }
    // public int gets(int n)
    // {
    //     return ss[n].getF();
    // }
}

// 答卷类
class AnswerSheet {
    private ExamPaper examPaper;
    private ArrayList<String> answersList;

    public AnswerSheet(ExamPaper examPaper) {
        this.examPaper = examPaper;
        answersList = new ArrayList<>();
    }

    public void saveAnswer(String answer) {
        answersList.add(answer);
    }

    public boolean[] checkAnswers() {
        return examPaper.checkAnswers(answersList);
    }

    public void outputAnswer() {
        for (int i = 0; i < answersList.size(); i++) {
            Question question = examPaper.questionsList.get(i);
            String content = question.getContent();
            String answer = answersList.get(i);
            System.out.println(content + " ~" + answer);
        }
    }
}

class Sore {//分值
    private int num;
    private int fen;
    public Sore(){}
    public Sore(int n, int f)
    {
        num=n;
        fen=f;
    }
    public int getF()//获得分信息
    {
        return fen;
    }
    public int getN()//获得编号信息
    {
        return num;
    }

}

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

        // 读取题目数量
        int numQuestions = scanner.nextInt();
        scanner.nextLine(); // 消耗换行符

        // 创建试卷对象
        ExamPaper examPaper = new ExamPaper();

        // 读取题目信息并保存到试卷对象中
        for (int i = 0; i < numQuestions; i++) {
            String line = scanner.nextLine();
            String[] parts = line.split(" ");
            int number = Integer.parseInt(parts[1]);
            String content = parts[3];
            String standardAnswer = parts[5];
            examPaper.saveQuestion(number, content, standardAnswer);
        }

        // 创建答卷对象
        AnswerSheet answerSheet = new AnswerSheet(examPaper);

        // 读取答题信息并保存到答卷对象中
        ArrayList<String> answers = new ArrayList<>();
        while (scanner.hasNextLine()) {
            String line = scanner.nextLine();
            if (line.equals("end")) {
                break;
            }
            String[] parts = line.split(" ");
            for (int i = 1; i < parts.length; i++) {
                answers.add(parts[i]);
            }
        }

        for (String answer : answers) {
            answerSheet.saveAnswer(answer);
        }

        // 判题并输出结果
        boolean[] results = answerSheet.checkAnswers();
        for (boolean result : results) {
            System.out.print(result + " ");
        }
    }
}
不会写摆了

踩坑心得

第一次作业:
1.第一次作业中题目里可能出现特殊字符不规范格式导致字符串输入错误;
2.题目中说一行为一道题,可以输入多行数据。

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

格式约束:题目的输入顺序与题号不相关,不一定按题号顺序从小到大输入。
没看题导致下意识以为题目是按顺序输入的,最后代码非零返回;
3.答案顺序如果与题目输入顺序不一致也会导致非零返回。

第二次作业:
1.答案有缺失没有计算总分和判断是否满分;
2.少判断判答卷中未输入答案的情况;
3.忽略了试卷信息可能出现题号题目缺失的情况。

第三次作业:
1.正则表达式判断不规范,缺少不符合要求时的输出;
2.没有正确区别空白卷和空字符:
空白卷是没有答案,空字符则是会被认为是正常试卷;
3.依旧是乱序输入的问题,这次答题顺序可以打断导致判题也需要对答案进行判断

改动建议
第一次作业:
主要注意要对输入格式进行严格判断,对输入格式的要求更加严谨避免出错,更要考虑多种情况;

第二次作业:
设定数组长度较长,可能会导致溢出并出错,后续最好改为动态数组(ArrayList)。

第三次作业:
正则表达式会在字符串中寻找匹配与表达式的子字符串,但在匹配表达式的前后加上非法字符也会被匹配,所以要加入字符保证匹配正确

总结:
Java带给我的感觉是与c语言完全不同的,在信息处理的过程中越来越复杂,很容易就会陷入瓶颈,但我也获益匪浅(虽然只有第一次做出来了),大部分还是一头雾水,给人的感觉是方法无穷无尽但学起来有无比艰难,题目变化无常。
希望老师在课堂讲述中能多讲些题目中会用到的知识点,为做题提供更多灵感(上课时感觉除了几个知识点外大多数与题目相关不大,大部分还是需要自学,有种割裂感)

posted on 2024-04-21 20:53  ZBWzhao  阅读(42)  评论(0)    收藏  举报