java第一次大作业blog
pta第一次博客
目录
• pta第一次博客
o 1.前言
o 2.设计与分析
o 3.踩坑心得:
o 4.改进建议
o 5.总结
1.前言
在这三次pta作业中,我经历了从基础到进阶的学习过程,对Java编程语言有了更深刻的理解。
第一次作业的难度较为简单,基本上只要会基础的格式,对java有一定了解就可以解决
通过完成作业,我巩固了Java的一些知识点,并且学会了如何编写简单的Java程序。
这次作业让我对Java编程有了初步的认识,为后续的学习打下了坚实的基础。
第二次作业的难度较为困难,需要一些逻辑能力和一定的了解才可以解决,涉及到了更复杂的逻辑思考
通过完成作业,我不仅运用了之前学过的知识,还学习了一些新的Java特性和编程技巧。
通过不断地调试和修改代码,我逐渐提高了自己的编程能力和解决问题的能力。
第三次作业的作业难度就相对提升了很大一个阶段,需要熟练运用正则表达式以及链表的相关知识
正则表达式在文本处理中发挥着重要作用,而链表则是数据结构中的基础之一。
完成作业的过程中,我不仅复习了之前学过的知识,还深入学习了正则表达式的匹配规则和链表的操作方法。
2.设计与分析
第一次作业第五题
题目内容
设计实现答题程序,模拟一个小型的测试,要求输入题目信息和答题信息,根据输入题目信息中的标准答案判断答题的结果。
输入格式:
程序输入信息分三部分:
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. 读取题目数量
2. 读取并存储题目信息和标准答案
3. 读取答题信息
4. 逐题比较答题信息与标准答案
5. 输出答题信息和判题结果
查看代码
class Question{
private int id;
private String content;
private String standardAnswer;
public int getId(){
return id;
}
public void setId(int id){
this.id=id;
}
public String getContent(){
return content;
}
public void setContent(String content){
this.content=content;
}
public String getStandardAnswer(){
return standardAnswer;
}
public void setStandardAnswer(String standardAnswer){
this.standardAnswer=standardAnswer;
}
public Question(int id,String content,String standardAnswer){
this.id= id;
this.content=content;
this.standardAnswer=standardAnswer;
}
public boolean judge(String answer){
return standardAnswer.equals(answer);
}
}
class Paper{
private Question []questions;
private int num;
public Paper(int num){
this.num=num;
questions=new Question[num];
}
public int getNum(){
return num;
}
public void addQuestion(int index,Question question){
if(index>=0&&index<num){
questions[index]=question;
}
}
public boolean judgeQuestion(int numt,String answer){
return questions[numt-1].judge(answer);
}
public Question getQuestion(int numt){
return questions[numt];
}
}
class Answer{
private Paper paper;
private String []answers;
private boolean[] judgingResults;
public Answer(Paper paper){
this.paper=paper;
answers=new String[paper.getNum()];
judgingResults=new boolean[paper.getNum()];
}
public void judgeQuestion(int num){
if(num<1||num>paper.getNum()){
return;
}
judgingResults[num-1]=paper.judgeQuestion(num,answers[num-1]);
}
public void saveAnswer(int num,String answer){
if(num<0||num>paper.getNum()){
return;
}
answers[num]=answer;
}
public void printResult(){
int i=0;
while(i<paper.getNum())
{
if(answers[i]!=null)
{
Question question=paper.getQuestion(i);
String content=question.getContent();
System.out.println(content+"~"+answers[i]);
}
i++;
}
i=0;
while(i<paper.getNum())
{
if(answers[i]!=null)
System.out.print(judgingResults[i]);
i++;
if(i!=paper.getNum())
System.out.print(" ");
}
}
}
代码分析总结:
本题的难度中等偏高,因为刚开始接触java,还是按照当初C语言的方式就行编码,导致代码复用性较低,之后还是要多加改进。
完成它不仅要求掌握Java语言的基础知识,还需要灵活运用一些编程技巧来提高代码的质量和效率。
在解题过程中,我逐渐意识到Java与C语言虽然有许多相似之处,但在语法、特性以及编程风格上还是有很大的差异。
Java更加注重面向对象编程的思想,强调代码的模块化和复用性。
而我起初并没有很好地利用这些特性,导致代码结构较为松散,逻辑不够清晰。
并且由于在这题我使用数组解题,导致了之后无法迅速改为链表完成之后的练习。
PowerDesigner的相应类图

SourceMontor的生成报表内容





第二次作业第四题
题目内容
设计实现答题程序,模拟一个小型的测试,以下粗体字显示的是在答题判题程序-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=~5~true
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,建议增加答题类,类的内容以及类之间的关联自行设计。
试题分析
本题是对于上一次的练习的拓展,在们需要对总分不等于100分的试卷进行警示,并输出详细的答题信息和判分信息。
查看代码
本题未完成
第三次作业第三题
题目内容
设计实现答题程序,模拟一个小型的测试,以下粗体字显示的是在答题判题程序-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=~5~false
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=~5~true
4+6=~22~false.
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. 初始化
2. 读取并处理输入
3. 处理题目信息
4. 处理试卷信息
5. 处理学生信息
6. 处理答卷信息
7. 处理删除题目信息
8. 输出
查看代码
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class Main {
public static void main(String[] args){
class Question{
private int num;//题号
private String content;//题目
private String standardAnswer;//答案
private boolean deleteIf;
public boolean isDeleteIf() {
return deleteIf;
}
public void setDeleteIf(boolean deleteIf) {
this.deleteIf = deleteIf;
}
public int getNum(){
return num;
}
public void setNum(int num){
this.num=num;
}
public String getContent(){
return content;
}
public void setContent(String content){
this.content=content;
}
public String getStandardAnswer(){
return standardAnswer;
}
public void setStandardAnswer(String standardAnswer){
this.standardAnswer=standardAnswer;
}
public Question(int num,String content,String standardAnswer){
this.num= num;
this.deleteIf=true;
this.content=content;
this.standardAnswer=standardAnswer;
}
public boolean judge(String answer){
return standardAnswer.equals(answer);
}
}
class Paper{
private int num;//试卷号
private int score_sum;//分数总和
private int question_sum;//题目个数
private ArrayList<Question> list = new ArrayList<>();
private int score[];//题目分数
public Paper(int num,int questionnum[],int score[],ArrayList<Question> listQuestion)
{
this.num=num;
this.score=score;
this.question_sum=questionnum.length-1;
for(int i=1;i<score.length;i++)
{
this.score_sum=this.score_sum+this.score[i];
}
for(int i=1;i<questionnum.length;i++)
{
for(Question listq:listQuestion)
{
if(questionnum[i]==listq.getNum())
{
list.add(listq);
}
}
}
}
public int getSum()
{
return score_sum;
}
public int getNum(){
return num;
}
public int getScore(int i){
return score[i+1];
}
public ArrayList<Question> getList(){
return list;
}
}
class Answer{
private String answer;//答案
private int num;//顺序号
private int grade;//得分
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public void setAnswer(String answer) {
this.answer = answer;
}
public Answer(String answer,int num){
this.answer=answer;
this.num=num;
}
public String getAnswer(){
return answer;
}
public void setGrade(int i){
this.grade=i;
}
public int getGrade(){
return grade;
}
}
代码分析总结
本题是我迄今为止所遇到的最具挑战性的一道题目。在解题过程中,我深刻体会到了Java编程的复杂性和深度,尤其是在涉及到大量判断和链表操作的情况下。
首先,本题加入了大量的判断逻辑,这要求我不仅要对题目的要求有深入的理解,还需要具备扎实的编程基础,能够准确、高效地实现各种判断条件。
由于我对类的运用还不够熟练,这在一定程度上增加了编程的难度。
在编写代码时,我尝试通过设计合理的类结构和方法来提高代码的可读性和复用性,但由于经验不足,还是使用了较多的参数来传递数据,导致代码显得有些冗长和复杂。
其次,链表的使用对我来说是一个非常大的挑战。链表是一种动态数据结构,它的操作相对于数组来说更加复杂,需要考虑到节点的插入、删除和遍历等操作。
此外,本题还要求我熟练运用到正则表达式。正则表达式是一种强大的文本处理工具,它可以用来匹配和处理复杂的文本模式。在编写代码时,我需要利用正则表达式来解析和处理题目中的字符串数据,这要求我对正则表达式的语法和用法有深入的了解。
总的来说,本题对我来说是一次很好的学习和锻炼机会。通过解题,我不仅提高了自己的编程能力和问题解决能力,还加深了对Java编程和链表操作的理解。
PowerDesigner的相应类图

SourceMontor的生成报表内容






3. 踩坑心得:
在第一次练习中,我使用了数组来存储数据。
虽然数组是一种常用的数据结构,但它在处理某些特定问题时可能并不是最优的选择。
在我所面对的题目中,由于需要频繁地插入和删除元素,
数组的这些操作往往涉及到大量的数据移动,这导致了效率低下。
此外,数组在大小上也是固定的,如果数据量超出预定的大小,
就需要重新分配内存空间,这也会带来额外的开销。
因此,在第一次练习中,由于我选择了数组作为数据存储结构,
导致在处理数据时遇到了很大的困难,也在一定程度上影响了我的解题进度。

- 过多的不必要的对象和变量的创建以及一些类的引用
在编程实践中,避免不必要的对象和变量的创建,以及减少不必要的类引用,
是提升代码性能和优化资源利用的关键步骤。
这不仅可以减少内存消耗,还能提高程序的执行效率。
避免不必要的对象和变量的创建,以及减少不必要的类引用,是提升代码性能和资源利用的有效手段。

3.进行注释,在写程序的过程中经常忘记某一部分的作用
在编写程序的过程中,注释是一项至关重要的任务,
它不仅能够帮助我在后续回顾代码时理解各部分的作用,
还能让其他阅读代码的人更好地理解我们的思路和实现方式。
然而,我经常会因为各种原因忘记为某一部分代码添加注释,这可能导致在后续维护或扩展代码时遇到困扰。

4. 改进建议
- 避免不必要的对象和变量的创建
在编程过程中,创建对象和变量是不可避免的,但是过度或不必要地创建它们会导致资源浪费和性能下降。因此,需要谨慎地考虑何时创建对象和变量,以及如何有效地管理它们。
避免不必要的对象和变量的创建是提升代码性能和资源利用的关键。我需要仔细审查代码中的每个对象和变量,确保它们都是必要的。
- 合理运用链表和数组
链表和数组是两种常见的数据结构,它们在编程中各有优势,应根据具体需求合理运用。
数组是一种固定大小的数据结构,适用于存储具有相同类型且数量已知的元素。
链表则是一种动态的数据结构,它允许我们在运行时动态地添加和删除元素。
合理运用链表和数组是提升代码性能和效率的关键。需要根据具体的需求和场景来选择合适的数据结构,并充分发挥它们的优势。
- 进行注释,在写程序的过程中经常忘记某一部分的作用
进行注释是编写高质量代码的重要一环,应该在编写代码的过程中及时添加注释,并力求简洁明了地描述代码的意图和功能。通过合理的注释,可以提高代码的可读性和可维护性,减少后续开发和维护过程中的困扰和错误。
5.总结
经过这一次的Java大作业,我对Java编程语言有了更深入的理解和掌握。
这不仅仅是对语法和功能的熟悉,更多的是对编程思想和方法的领悟。
面向对象编程强调将现实世界的事物抽象为对象,并通过类和对象的关系来描述它们之间的关系和交互。
在这次大作业中,我不断尝试运用这种思想来设计和实现各种功能。
通过创建不同的类来表示不同的实体,定义它们之间的属性和方法,
我逐渐掌握了如何构建清晰、易于维护的代码结构。
尤其是在面向对象编程方面,我深刻体会到了其优势所在,并且也了解了如何更好地运用面向对象的思想来解决问题。
我不仅提高了自己的编程技能,也学会了如何更好地运用面向对象的思想来解决问题。
同时,我也认识到了自己在编程方面还存在一些不足和需要改进的地方。
其中,最为明显的是对于类和对象以及方法的关系不够熟练。
在编写代码时,我时常会陷入对类和方法设计的困惑,不清楚如何更好地组织它们之间的关系。
在未来的学习和实践中,我将继续努力提高自己的编程能力,不断探索和学习新的技术和方法。
总之,这次Java大作业让我受益匪浅,不仅提高了我的编程技能,也让我更加深入地理解了面向对象编程的思想和优势。
在未来的学习和实践中,我将继续努力提高自己的编程能力,不断探索和学习新的技术和方法。
总得来说存在的问题:对于类和对象以及方法的关系不熟练,对于链表以及数组的掌握不足,对于正则表达式的运用生疏。
建议
针对这些问题,我建议在未来的学习和实践中,延长补练的时间,以便能够更深入地理解和掌握这些关键知识点。

浙公网安备 33010602011771号