南昌航空大学前三次pta作业总结

一.前言

本学期新增JAVA的面向程序设计课程,为增加学生编写能力和对学习内容的掌握程度进行一个检测,开始了本学期的PTA作业,以及接下来我将对此三次作业进行一个总结,讲诉自己的学习心得和学习到的知识。

二.题目以及代码

(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
设计建议:
以下是针对以上题目要求的设计建议,其中的属性、方法为最小集,实现代码中可根据情况添加所需的内容:
题目类(用于封装单个题目的信息):
属性:题目编号、题目内容、标准答案-standardAnswer
方法:数据读写set\get方法、
判题方法(答案-answer):判断答案-answer是否符合标准答案-standardAnswer
试卷类(用于封装整套题目的信息)
属性:题目列表(题目类的对象集合)、题目数量
方法:判题方法(题号-num、答案-answer):判断答案-answer是否符合对应题号的题目标准答案-standardAnswer
保存题目(题号-num、题目-question):将题目保存到题目列表中,保存位置与num要能对应
答卷类(用于封装答题信息)
属性:试卷(试卷类的对象)、答案列表(保存每一题的答案)、判题列表(保存每一题的判题结果true/false)
方法:判题方法(题号-num):判断答案列表中第num题的结果是否符合试卷中对应题号的题目标准答案
输出方法(题号-num):按照题目的格式要求,输出题号为num的题目的内容和答题结果。
保存一个答案(题号-num,答案-answer):保存题号为num的题目的答题结果answer。

设计与分析:

由设计建议设计类图

代码如下

点击查看代码
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 boolean judgeAnswer(String answer) {
        return answer.equals(standardAnswer);
    }
    public String getQuestionInfo() {
        return content + "~" + standardAnswer;
    }
}
class TestPaper {
    private List<Question> questionList;
    public TestPaper() {
        this.questionList = new ArrayList<>();
    }
    public void saveQuestion(int number, String content, String standardAnswer) {
        Question question = new Question(number, content, standardAnswer);
        questionList.add(question);
    }
    public boolean judgeAnswer(int number, String answer) {
        Question question = questionList.get(number - 1);
        return question.judgeAnswer(answer);
    }
    public String getQuestionInfo(int number) {
        Question question = questionList.get(number - 1);
        return question.getQuestionInfo();
    }
}
class AnswerSheet {
    private TestPaper testPaper;
    private List<String> answerList;
    public AnswerSheet(TestPaper testPaper) {
        this.testPaper = testPaper;
        this.answerList = new ArrayList<>();
    }
    public void saveAnswer(String answer) {
        answerList.add(answer);
    }
    public boolean judgeAnswer(int number) {
        String answer = answerList.get(number - 1);
        return testPaper.judgeAnswer(number, answer);
    }
    public String getAnswerInfo(int number) {
        return answerList.get(number - 1);
    }
}
public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int questionCount = Integer.parseInt(scanner.nextLine());
        TestPaper testPaper = new TestPaper();
        AnswerSheet answerSheet = new AnswerSheet(testPaper);
        int[] number = new int[100];
        String[] content =new String[100];
        String[] standardAnswer =new String[100];
        for (int i = 0; i < questionCount; i++) {
            String[] questionInfo = scanner.nextLine().split("N:|#Q:|#A:");
             number[i] = Integer.parseInt(questionInfo[1].trim());
            content[i] = questionInfo[2].trim();
            standardAnswer[i] = questionInfo[3].trim();
        }
        for (int i = 0; i < questionCount-1; i++) {
            for(int j = 0;j < questionCount-1;j++){
                if(number[j]>number[j+1]){
int a=number[j];number[j]=number[j+1];number[j+1]=a;
String b=content[j];content[j]=content[j+1];content[j+1]=b;
String c=standardAnswer[j];standardAnswer[j]=standardAnswer[j+1];standardAnswer[j+1]=c;
                }
            }
        }
        String answerInfo;
        while (!(answerInfo = scanner.nextLine()).equals("end")) {
            String[] answers = answerInfo.split("#A:");
            for (int i = 2,j=0; i <= answers.length; i=i+1,j++) {
            testPaper.saveQuestion(number[j], content[j], answers[i-1].trim());
                answerSheet.saveAnswer(standardAnswer[j]);
            }
        }
        for (int i = 1; i <= questionCount; i++) {
            System.out.println(testPaper.getQuestionInfo(i));
        }
       for (int i = 1; i < questionCount; i++) {
            if(answerSheet.judgeAnswer(i))
                System.out.print(true+" ");
            else
                System.out.print(false+" ");
        }
        int m= questionCount;
        if(answerSheet.judgeAnswer(m))
                System.out.print(true);
            else
                System.out.print(false);
    }
}

pta测试点案例
image

心得与学习:
在完成Java的第一次作业后,我对Java编程语言有了更深入的了解。也更了解了类的单一职责和对类的使用,通过解决作业中的问题,我巩固了对基本语法和逻辑的掌握,并且学会了如何将理论知识应用到实际的编程任务中。在作业的过程中,我遇到了一些挑战,特别是在调试和理解问题要求方面。但通过查阅资料、向同学请教,以及多次尝试,我最终克服了困难,完成了作业。
此外,作业完成后,我也意识到自己在编程能力、逻辑思维方面还有许多需要提升的地方。因此,我计划在接下来的学习中加强对Java编程的实践,多做编程练习并自主探索一些实际的项目,以提升自己的编程水平。我相信,通过不断的努力和实践,我一定能够在Java编程领域取得更大的进步。
这次作业让我意识到了学习编程的乐趣和挑战,并激发了我对Java编程的更大兴趣。我期待接下来学习更多有关Java编程的知识,探索更多有趣的编程问题。
(2)第二题如下:
7-4 答题判题程序-2
分数 73
困难
作者 蔡轲
单位 南昌航空大学
设计实现答题程序,模拟一个小型的测试,以下粗体字显示的是在答题判题程序-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 point
样例: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、判题信息的顺序与输入答题信息中的顺序相同
样例:5 8 0~13
根据输入的答卷的数量以上2、3项答卷信息与判分信息将重复输出。
4、提示错误的试卷号
如果答案信息中试卷的编号找不到,则输出”the test paper number does not exist”,参见样例9。
设计建议:
参考答题判题程序-1,建议增加答题类,类的内容以及类之间的关联自行设计。

设计与分析

本题相较于第一题而言增加了分数和对题目的判断
类图如下
image

代码如下

点击查看代码
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
class Question {
    private int number;
    private String content;
    private String standardAnswer;
    private int score;
    public Question(int number, String content, String standardAnswer, int score) {
        this.number = number;
        this.content = content;
        this.standardAnswer = standardAnswer;
        this.score = score;
    }
    public boolean judgeAnswer(String answer) {
        return answer.equals(standardAnswer);
    }
    public String getQuestionInfo() {
        return content + "~" + standardAnswer+"~";
    }
    public void setscore(int score){
    this.score = score;
    }
}
class TestPaper {
    private List<Question> questionList;
    public TestPaper() {
        this.questionList = new ArrayList<>();
    }
    public void saveQuestion(int number, String content, String standardAnswer,int score) {
        Question question = new Question(number, content, standardAnswer,score);
        questionList.add(question);
    }
    public boolean judgeAnswer(int number, String answer) {
        Question question = questionList.get(number - 1);
        return question.judgeAnswer(answer);
    }
    public String getQuestionInfo(int number) {
        Question question = questionList.get(number - 1);
        return question.getQuestionInfo();
    }
}
class AnswerSheet {
    private TestPaper testPaper;
    private List<String> answerList;
    public AnswerSheet(TestPaper testPaper) {
        this.testPaper = testPaper;
        this.answerList = new ArrayList<>();
    }
    public void saveAnswer(String answer) {
        answerList.add(answer);
    }
    public boolean judgeAnswer(int number) {
        String answer = answerList.get(number - 1);
        return testPaper.judgeAnswer(number, answer);
    }
    public String getAnswerInfo(int number) {
        return answerList.get(number - 1);
        
    }
}
/*class Answerpaper{
    private Answerpaper answerpaper;
    private List<AnswerSheet> amswerSheetList;
    public Answerpaper(){
        this.answerSheetList = new Arraylist<>();
    }
    public void saveAnswer(TestPaper testPaper){
        AnswerSheet answerSheet = new AnswerSheet(testPaper)
        answerSheetList.add(answerSheet);
    }
    
}*/
public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        TestPaper testPaper = new TestPaper();
        AnswerSheet answerSheet = new AnswerSheet(testPaper);
        int getscore=0;
        int allscore=0;
        int questionCount = 0;
        int[] number = new int[100];
        String[] content =new String[100];
        String[] standardAnswer =new String[100];
        int[] score = new int[100];
        int[] qnumber = new int[100];
        for (int i = 0;; i++) {
        String input = scanner.nextLine();
        if(input.startsWith("#N")) {
        String[] questionInfo = input.split("N:|#Q:|#A:");
             number[i] = Integer.parseInt(questionInfo[1].trim());
            content[i] = questionInfo[2].trim();
            standardAnswer[i] = questionInfo[3].trim();
            questionCount++;
            }
        else if(input.startsWith("#T")) {
        String[] testInfo = input.split("T:| |-");
        for(int x = 4,y=0;x<=testInfo.length;x=x+2,y++){
            qnumber[y] = Integer.parseInt(testInfo[x-2]);
            score[y]=Integer.parseInt(testInfo[x-1]);
            }
        break;
            }
        }
        for (int i = 0; i < questionCount; i++) {
            int a;
            String b;
        for (int j = 0; i < questionCount; j++){
            if(qnumber[i]==number[j]){
                a = number[j];number[j] = number[i];number[i] = a;
                b = content[j];content[j] = content[i];content[i] = b;
            }
            else
            break;
        }
        }
        
        for (int i = 0;; i++) {
        String input = scanner.nextLine();
        if(input.startsWith("#S")) {
        String[] answerInfo = input.split("S:|#A:");
        for (int x = 3,y=0; x <= answerInfo.length; x=x+1,y++) {
            testPaper.saveQuestion(number[y], content[y], answerInfo[x-1].trim(),score[y]);
                answerSheet.saveAnswer(standardAnswer[y]);
            }
        }
        else if(input.equals("end")) 
            break;
        else
            continue;
        }
        for (int i = 1; i <= questionCount; i++) {
        allscore = score[i-1]+allscore;
        }
        if(allscore!=100)
        System.out.println("alert: full score of test paper1 is not 100 points");
        for (int i = 1; i <= questionCount; i++) {
            System.out.print(testPaper.getQuestionInfo(i));
            if(answerSheet.judgeAnswer(i))
                System.out.println(true);
            else
                System.out.println(false);
        }
        for (int i = 1; i < questionCount; i++) {
            if(answerSheet.judgeAnswer(i)){
            getscore = score[i-1]+getscore;
                System.out.print(score[i-1]+" ");}
            else
                System.out.print("0 ");
        }
            if(answerSheet.judgeAnswer(questionCount)){
            getscore = score[questionCount-1]+getscore;
                System.out.print(score[questionCount-1]+"~");}
            else
                System.out.print("0~");
        System.out.print(getscore);
    }
}

PTA测试点
image
心得与体会
完成Java的第二次作业后,我深刻体会到了编程能力的持续提升。虽然这次作业完成度不是很高,但在这次作业中,我不仅巩固了Java语言的基础知识,还学会了如何对数据进行更加灵活和高效的处理。通过解决作业中的问题,我发现自己在编程逻辑和算法思维方面有了一定的成长,能够更加熟练地运用循环、条件语句等结构来解决问题。
在作业过程中,我遇到了一些挑战,特别是在设计和优化算法的过程中。通过查阅资料、向同学请教,我逐渐找到了解决问题的思路,并最终完成了作业。这一过程不仅提升了我的编程技能,还培养了我的耐心和解决问题的能力。同时,我也意识到在算法设计和优化方面还有许多需要提升的地方,因此我计划在接下来的学习中多加练习,深入理解数据结构和算法,并思考如何将它们应用到实际问题中。
这次作业让我更加深入地感受到了编程的乐趣和挑战,同时也激发了我对编程的更大热情。我期待在接下来的学习中,继续挑战更多的编程问题,不断提升自己的编程技能,迎接更高级的编程挑战。通过这次作业,我对编程有了更加清晰的认识,也明确了自己未来在编程学习上的方向和目标。
(3)第三次作业如下:
7-3 答题判题程序-3
分数 84
困难
作者 蔡轲
单位 南昌航空大学
设计实现答题程序,模拟一个小型的测试,以下粗体字显示的是在答题判题程序-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。
本题暂不考虑出现多张答卷的信息的情况。

设计与分析

image
代码如下

点击查看代码

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.setNumber(number);
        this.setContent(content);
        this.setStandardAnswer(standardAnswer);
    }
	public String getStandardAnswer() {
		return standardAnswer;
	}
	public void setStandardAnswer(String standardAnswer2) {
		this.standardAnswer = standardAnswer2;
	}
	public int getNumber() {
		return number;
	}
	public void setNumber(int number) {
		this.number = number;
	}
	public String getContent() {
		return content;
	}
	public void setContent(String content) {
		this.content = content;
	}
	@Override
	public String toString() {
		if(this.content.startsWith("exi")) {
			return "non-existent question~0";
		}	
		else if(this.content.startsWith("the")) {
			return "the question "+this.number+" invalid~0";
		}
		else
		return content + "~";
	}
}
class Questionscore{
    private int questionnumber;
    private int score;
	public Questionscore(int questionnumber,int score) {
	this.setQuestionnumber(questionnumber);
	this.setScore(score);
	}
	public int getQuestionnumber() {
		return questionnumber;
	}
	public void setQuestionnumber(int questionnumber) {
		this.questionnumber = questionnumber;
	}
	public int getScore() {
		return score;
	}
	public void setScore(int score) {
		this.score = score;
	}
}
class TestPaper {
    private int number;
    private ArrayList<Questionscore> questionscorelist;
	public TestPaper(int number) {
		this.setNumber(number);
        this.questionscorelist = new ArrayList<>();
	}
    public void saveQuestionscore(int questionnumber,int score) {
        Questionscore questionscore = new Questionscore( questionnumber, score);
        questionscorelist.add(questionscore);
    }
	public int getNumber() {
		return number;
	}
	public void setNumber(int number) {
		this.number = number;
	}
	public void  print() {
		int a=0;
		for(int x=0;x<questionscorelist.size();x++) {
			a=a+questionscorelist.get(x).getScore();
		}
		if(a!=100&&this.number!=0)
	System.out.println("alert: full score of test paper"+this.number+" is not 100 points");
	}
	public int getquestionscorelistlength() {
		return questionscorelist.size();
	}
	public Questionscore getScore(int x) {
		return questionscorelist.get(x);
	}
}
class Studentanswer{
	private int number;
	private String answer;
	private int gainscore;
	public Studentanswer(int number,String answer) {
		this.setNumber(number);
		this.setAnswer(answer);
		this.setGainscore(0);
	}
	public int getNumber() {
		return number;
	}
	public void setNumber(int number) {
		this.number = number;
	}
	public String getAnswer() {
		return answer;
	}
	public void setAnswer(String answer) {
		this.answer = answer;
	}
	public int getGainscore() {
		return gainscore;
	}
	public void setGainscore(int gainscore) {
		this.gainscore = gainscore;
	}	
}
class AnswerSheet {
	private int number;
	private String studentId;
    private ArrayList<Studentanswer> studentanswerlist;
    private ArrayList<Question> questionlist = new ArrayList<>();
    private ArrayList<Student> studentlist = new ArrayList<>();
    private TestPaper testpaper=new TestPaper(0); 
    public AnswerSheet() {
    	
    }
	public AnswerSheet(int number,String studenttID,ArrayList<Question> questionlist,ArrayList<Student> studentlist,TestPaper testpaper) {
	this.setNumber(number);
	this.setStudentId(studenttID);
    this.studentanswerlist = new ArrayList<>();
    this.questionlist = questionlist;
    this.studentlist = studentlist;
    this.testpaper = testpaper;
	}
    public void saveStudentanswer(int number,String answer) {
    	Studentanswer studentanswer= new Studentanswer( number, answer);
    	studentanswerlist.add(studentanswer);
    }
	public int getNumber() {
		return number;
	}
	public void setNumber(int number) {
		this.number = number;
	}
	public String getStudentId() {
		return studentId;
	}
	public void setStudentId(String studentId) {
		this.studentId = studentId;
	}
	public int allscore() {
		int a=0;
		for(int x = 0;x<studentanswerlist.size();x++) {
			a = a+studentanswerlist.get(x).getGainscore();
		}
		return a;
	}
	public void printcontent() {	
		if(this.number == testpaper.getNumber()) {
		for(int i=0;i<testpaper.getquestionscorelistlength();i++) {
			int m = 0;
			int n=0;
            int p=0;
			for(int x=0;x<studentanswerlist.size();x++) {
				if(studentanswerlist.get(x).getNumber()==i+1) {
					for(int y = 0;y<questionlist.size();y++) {
						if(testpaper.getScore(i).getQuestionnumber()==questionlist.get(y).getNumber()) {
							if(questionlist.get(y).getContent().startsWith("the")||questionlist.get(y).getContent().startsWith("exi")) {
								System.out.println(questionlist.get(y).toString());
                                p=1;
								continue;
								}
							if(studentanswerlist.get(x).getAnswer().equals(questionlist.get(y).getStandardAnswer())) {
								studentanswerlist.get(x).setGainscore(testpaper.getScore(x).getScore());
								System.out.println(questionlist.get(y).toString()+studentanswerlist.get(x).getAnswer()+"~"+true);
								}
							else
								System.out.println(questionlist.get(y).toString()+studentanswerlist.get(x).getAnswer()+"~"+false);
                              p=1;
						}
					}
                    if(p==0)
                System.out.println("non-existent question~0");
					m=1;
				}			
			}
			if(m==0) {
//				for(int y = 0;y<questionlist.size();y++) {
//					if(testpaper.getScore(i).getQuestionnumber()==questionlist.get(y).getNumber()) {
//						System.out.println("answer is null");
//						n=1;
//					}
//				}	
//			if(n==0)
				System.out.println("answer is null");	
			}
		}
	}
	}
	public void printscore() {
		if(this.number == testpaper.getNumber()) {
			int a=0;
		for(int x = 0;x<studentlist.size();x++) {
			if(this.studentId.equals(studentlist.get(x).getStudentId())) {
				System.out.print(studentlist.get(x).toString());
				a=1;
			}
			}
		if(a==1) {
		for(int i=0;i<testpaper.getquestionscorelistlength();i++) {
			int m = 0;
			for(int x=0;x<studentanswerlist.size();x++) {
				if(studentanswerlist.get(x).getNumber()==i+1) {
			if(i==testpaper.getquestionscorelistlength()-1)
				System.out.print(studentanswerlist.get(x).getGainscore()+"~");
			else
				System.out.print(studentanswerlist.get(x).getGainscore()+" ");			
		    m=1;
        }
			}
            if(m==0){
            if(i==testpaper.getquestionscorelistlength()-1)
				System.out.print("0~");
			else
				System.out.print("0 ");
            }
		}
	System.out.print(this.allscore());
	}
		else if(this.studentId!=null)
			System.out.print(this.studentId+" not found");
		}
		else
			System.out.print("The test paper number does not exist");
			
	}
	public void deletequestion(int number,Question question) {
		for(int x=0;x<questionlist.size();x++) {
			if(number==questionlist.get(x).getNumber()) {
				 questionlist.remove(x);
				questionlist.add(question);
				}
		}
	}
	public void check() {
		for(int x = 0;x<questionlist.size();x++) {
			int a=0;
			int b=questionlist.get(x).getNumber();
			for(int y = 0;y<testpaper.getquestionscorelistlength();y++) {
				if(questionlist.get(x).getNumber()==testpaper.getScore(y).getQuestionnumber())
					a=1;
			}
			if(a==0) {
				
				Question question = new Question(b,"exi","0");
				this.deletequestion(b, question);
			}
		}
	}
}
class Student{
	private String studentId;
	private String name;
	public Student(String studentId,String name) {
		this.setStudentId(studentId);
		this.setName(name);

	}
	public String getStudentId() {
		return studentId;
	}
	public void setStudentId(String studentId) {
		this.studentId = studentId;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String toString() {
		return studentId+" "+name+": ";
	}
		
}
public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        ArrayList<Question> questionlist = new ArrayList<>();
        ArrayList<Student> studentlist = new ArrayList<>();
        TestPaper testpaper = new TestPaper(0) ;
        AnswerSheet answersheet = new AnswerSheet();
        String input;
        int question2 =0;
        int question1=1;
        for(int x=0;;x++) {
        	input = scanner.nextLine();
        	if(input.startsWith("#N:")) {
        	if(question2==0) {
       String[] questionInfo = input.split("N:|#Q:|#A:");
       if(questionInfo.length!=4) {
    	   Question question = new Question(question1,"exi","0");
           questionlist.add(question);   
    	   System.out.println("wrong format:"+input); 
    	   continue;
       }
       int number = Integer.parseInt(questionInfo[1].trim());
      String content = questionInfo[2].trim();
      String standardAnswer = questionInfo[3].trim();
      Question question = new Question(number,content,standardAnswer);
       questionlist.add(question);
       question1=question1+1;
        	}
        	}
        else if(input.startsWith("#T:")) {
   	   String[] testInfo = input.split(":| |-");
   	   testpaper = new TestPaper(Integer.parseInt(testInfo[1].trim()));
   	for(int y = 2;y<testInfo.length;y=y+2){
   	   testpaper.saveQuestionscore(Integer.parseInt(testInfo[y].trim()), Integer.parseInt(testInfo[y+1].trim()));
   	}
   	question2=1;
   	}
        else if(input.startsWith("#X:")) {
        String[] studentInfo = 	input.split(":| |-");
     for(int y = 1;y<studentInfo.length;y=y+2){
    	 Student student = new Student(studentInfo[y].trim(),studentInfo[y+1].trim());
        studentlist.add(student);
        	}       		
        	}
        else if(input.startsWith("#S:")) {
       	String[] answersheetInfo = 	input.split(":| |-");
       	answersheet = new AnswerSheet(Integer.parseInt(answersheetInfo[1].trim()),answersheetInfo[2].trim(),questionlist,studentlist,testpaper);
     for(int y = 4;y<answersheetInfo.length;y=y+3){
        answersheet.saveStudentanswer(Integer.parseInt(answersheetInfo[y].trim()),answersheetInfo[y+1].trim());
           	}
        	}
        else if(input.startsWith("#D:")) {
     	String[] deleteInfo = input.split("-");	
     	int number = Integer.parseInt(deleteInfo[1].trim());
     	Question question = new Question(number,"the","0");
     	answersheet.deletequestion(number, question);
        	}
        else if(input.startsWith("end"))
        		break;
            else
                System.out.println("wrong format:"+input);
        }
      answersheet.check();  
     testpaper.print();
     answersheet.printcontent();
     answersheet.printscore();
    }
}

PTA测试点
image
心得与学习体会
对与本题,我发现了前面两题的代码的重大错误,方法的缺乏导致了main函数的过于冗长,同时也发现了第二题之所以没有拿下大多测试点的原因在于对题目的理解不到位,所以在本题当中我减少了main函数的长度
增加了多个类,从而达到了简化的效果,但我仍明白对于大多数的部分我仍没有处理到位,在往后的学习中我会不断再修改代码,从而增强代码的可读性。
这次完成作业的同时,也激励了我对编程的热趣,希望在日后的学习中能不断学习与进步

三.学习大总结

在学习Java编程的过程中,我获益良多。Java作为一门广泛使用的编程语言,其灵活性和强大的功能使得它成为了我进入编程世界的理想选择。通过学习Java,我掌握了面向对象编程(OOP)的基本概念和实践技能,这使得我能够更好地组织和管理代码,提高了代码的可重用性和可维护性。

在学习的过程中,我深入了解并掌握了Java语言的基本语法、数据结构、异常处理、多线程编程和网络编程等方面的知识。通过编写各种不同类型的项目,我对Java语言的应用有了更加深入的了解,同时也提高了我的问题解决能力和算法设计能力。

在学习过程中也遇到了一些困难,特别是在理解和运用一些高级特性和设计模式时。然而,通过坚持不懈地学习和不断实践,我成功地克服了这些障碍,并积累了宝贵的经验。此外,我也逐渐意识到编程不仅仅是编写代码,更重要的是如何设计出高效、可靠且易于维护的程序,这需要在实际项目中不断实践和总结经验。

总的来说,学习Java编程让我受益匪浅。我不仅掌握了一门流行的编程语言,也锻炼了自己的逻辑思维和问题解决能力。我对未来在软件开发领域的职业发展充满信心,期待能够运用所学知识,创造出更多有价值的程序和解决方案。同时,我也意识到编程是一个持续学习和不断进步的过程,我将继续努力学习,不断提升自己的编程技能,迎接未来的挑战。

posted @ 2024-04-21 15:13  西阁  阅读(95)  评论(1)    收藏  举报