目录:
1)前言
2)设计与分析
3)踩坑心得
4)改进建议
5)总结
1.前言:
Java作为本学期的新学语言,难度相较于上学期的c语言有很大提升,由易到难的过程也更加考验我们的学习和理解能力。
前三次题目集重点考核类设计及类间关系设计,以及正则表达式的应用等。并且在每次题目集的题目数量不多的情况下,将分值大幅的放于最后一道题目,可见最后一题的重要性。三次题目集题数不多,基本在3-5题,难度普遍为前几道题较为简单,考察基本功,最后一题难度很高,对能力要求很大,且三次题目集的最后一题为迭代型,意味着从一开始就要打好基础,层层递进,一旦某一环节出了差错,就会导致后面的题目编写困难甚至无从下手。
2.设计与分析:
日期类的基本使用
给定一个日期,判定是否为合法日期。如果合法,判断该年是否闰年,该日期是当年第几天、当月第几天、当周第几天、。
给定起始日期与结束日期,判定日期是否合法且结束日期是否早于起始日期。如果均合法,输出结束日期与起始日期之间的相差的天数、月数、念书。
设计思路:
设计两个类,一个判断日期是否合法,一个计算天数
判断类:判定是否为合法日期。
boolean d
public static boolean panduan(int a,int b,int c){ boolean d=false; if(b==1||b==3||b==5||b==7||b==8||b==10||b==12){ if(c<=31){ d=true; } else{ d=false; } } else if(b<1||a>12){ d=false; } else if(b==2){ if(a%400==0||(a%4==0&&a%100!=0)){ if(c>29){ d=false; } else{ d=true; } } else{ if(c>28){ d=false; } else{ d=true; } } } else{ if(c>30){ d=false; } else{ d=true; } } return d; }
计算类:
String regex
DateFormat formatter
public static boolean validdate(String dt,String format){ if(dt==null||dt.isEmpty()||format==null||format.isEmpty()){ return false; } if(format.replaceAll("'.+?'","").indexOf("Y")<0){ format+="/YYYY"; DateFormat formatter = new SimpleDateFormat("/YYYY"); dt+=formatter.format(new Date()); } String regex = "^\\d{4}\\-(0[1-9]|1[012])\\-(0[1-9]|[12][0-9]|3[01])$"; if(!dt.matches(regex)){ return false; } DateFormat formatter = new SimpleDateFormat(format); formatter.setLenient(false); ParsePosition pos = new ParsePosition(0); Date date = formatter.parse(dt,pos); if(dt==null||pos.getErrorIndex()>0){ return false; } if(pos.getIndex()!=dt.length()){ return false; } if(formatter.getCalendar().get(Calendar.YEAR)>9999){ return false; } return true; }
设计实现答题程序,模拟一个小型的测试,要求输入题目信息和答题信息,根据输入题目信息中的标准答案判断答题的结果。
设计思路:
设计三个类,分别为题目类,试卷类,答卷类。
题目类(Topic):用于保存一道题目的信息以及处理的方法。
private int number;// 题号
private String question, // 题目内容
private String answer;// 标准答案
static class Topic{ private int number; private String question; private String answer; int getNumber(){ return number; } void setNumber(){ this.number=number; } String getQuestion(){ return question; } void setQuestion(){ this.question=question; } String getAnswer(){ return answer; } void setAnswer(){ this.answer=answer; } Topic(){ this.number=number; this.question=question; this.answer=answer; } }
试卷类(Paper):保存和处理一张试卷的信息
Topic[] topic;//题目清单
static class Paper{ Topic[] topic = new Topic[3]; void timu(int a){ topic = new Topic[a]; } }
答卷类( Answer):保存和处理一张答卷的信息以及处理的方法
Paper paper;//试卷
String[] answers;//每一题的答案信息
boolean[] judgment;//每一题的判题结果
static class Answer{ Paper paper; String[] answer; boolean[] judgment; void shijuan(int a){ answer = new String[a+1]; for(int i=0;i<=a;i++){ this.answer[i]=new String(); judgment = new boolean[a]; } }
设计实现答题程序,模拟一个小型的测试,以下粗体字显示的是在答题判题程序-1基础上增补或者修改的内容.要求输入题目信息、试卷信息和答题信息,根据输入题目信息中的标准答案判断答题的结果。
程序输入信息分三种,三种信息可能会打乱顺序混合输入.
一行为一张试卷,可输入多行数据(多张卷)。
每组答案包含某个试卷信息中的题目的解题答案,答案的顺序与试卷信息中的题目顺序相对应。
答案数量可以不等于试卷信息中题目的数量,没有答案的题目计0分,多余的答案直接忽略
该部分仅当一张试卷的总分分值不等于100分时作提示之用,试卷依然属于正常试卷,可用于后面的答题。如果总分等于100分,该部分忽略,不输出。
如果输入的答案信息少于试卷的题目数量,答案的题目要输"answer is null"
是一条答题记录所对应试卷的每道小题的计分以及总分,计分输出的先后顺序与题目题号相对应。
根据输入的答卷的数量以上2、3项答卷信息与判分信息将重复输出。
设计思路:
设计五个类,在原来的基础上新增试卷题目类和答案类。
题目类:
static class Topic{ private int number; private String question; private String answer; Topic(){ this.number=number; this.question=question; this.answer=answer; } }
试卷类:
static class Paper{ Topic[] topic = new Topic[3]; void timu(int a){ topic = new Topic[a]; } }
答卷类( Answer):
static class Answer{ Paper paper; String[] answer; boolean[] judgment; void shijuan(int a){ answer = new String[a+1]; for(int i=0;i<=a;i++){ this.answer[i]=new String(); judgment = new boolean[a]; } }
试卷题目类(Topic_Paper)//用于保存试卷中的题目信息。因为试卷中的题目序号与题目本身的题号不一致,且题目在不同试卷中的分值可能不一样。
int TPnum;//试卷中题目的顺序号
Topic topic;//题目类的对象,保存题目信息
int topic_score;// 题目分值
public class Topic_Paper{ private int TPnum private int topic_score Topic[] topic=new topic[10]; String getTPnum(){ return TPnum; } void setTPnum(){ this.TPnum=TPnum; } int gettopic_score(){ return topic_score; } void settopic_score(){ this.topic_score=topic_score; } }
答案类(Rasult):用于保存答卷中一道答案的信息。
Topic_Paper question;
String result;
设计实现答题程序,模拟一个小型的测试,以下粗体字显示的是在答题判题程序-2基础上增补或者修改的内容。要求输入题目信息、试卷信息、答题信息、学生信息、删除题目信息,根据输入题目信息中的标准答案判断答题的结果。
学生信息只输入一行,一行中包括所有学生的信息,每个学生的信息包括学号和姓名.
删除题目信息为独行输入,每一行为一条删除信息,多条删除信息可分多行输入。该信息用于删除一道题目信息,题目被删除之后,引用该题目的试卷依然有效,但被删除的题目将以0分计,同时在输出答案时,题目内容与答案改为一条失效提示。
设计思路:
设计六个类,在原来基础上新增学生类。
题目类:
static class Topic{ private int number; private String question; private String answer; Topic(){ this.number=number; this.question=question; this.answer=answer; } }
试卷类:
static class Paper{ Topic[] topic = new Topic[3]; void timu(int a){ topic = new Topic[a]; } }
答卷类( Answer)
static class Answer{ Paper paper; String[] answer; boolean[] judgment; void shijuan(int a){ answer = new String[a+1]; for(int i=0;i<=a;i++){ this.answer[i]=new String(); judgment = new boolean[a]; } }
试卷题目类(Topic_Paper)//用于保存试卷中的题目信息。因为试卷中的题目序号与题目本身的题号不一致,且题目在不同试卷中的分值可能不一样。
public class Topic_Paper{ private int TPnum private int topic_score Topic[] topic=new topic[10]; String getTPnum(){ return TPnum; } void setTPnum(){ this.TPnum=TPnum; } int gettopic_score(){ return topic_score; } void settopic_score(){ this.topic_score=topic_score; } }
答案类(Rasult):用于保存答卷中一道答案的信息。
学生类(Student):保存学生的信息
String studentID;
String name;
public class student{ private String studentID; private String name; String getStudentID(){ return studentID; } void setStudentID(){ this.studentID=studentID; }String getName(){ return name; } void setName(){ this.name=name; } }
踩坑心得:
.
.
在设计时没考虑将判断类与计算类结合起来,导致在计算时会误判输入日期的合法性,导致输出结果与案例不符合,且开始时没考虑将合法判断与闰年判断合并起来,导致代码繁杂,以至于后期修改时费力,需要大改动。
.
.
在做输入判断时没用从一开始就使用正则表达式,而是使用网上教程中的一些表达,导致读取输入数据时出现报错的情况,程序无法运行。且对于乱序输入概念不理解,导致程序出错。
.
改进意见:
不应该单纯的只建几个类来完成题目给定的功能,而是应该考虑题目所给的信息来设计,保证单一职责的同时便于修改和迭代。不应该投机取巧,直接使用println进行直接输出进行测试,应该脚踏实地认真修改和编写代码,提高自己的编程能力。
.
总结:
初次接触 Java ,有点感到语法和概念有些复杂,需要花费时间来理解和适应。深刻理解变量、数据类型、控制流等基础知识是后续学习的关键。在编程过程中难免会遇到错误,学会调试和解决问题是很重要的技能。理解类、对象、继承等面向对象的概念,对提高代码的可维护性和扩展性有很大帮助。
通过这三次的PTA作业,基本理解了正则表达式的使用,对于类与类之间的关系,java里的单一职责原则,开闭原则等有了初步了解。也感受到了Java语言的内涵和难度,很多问题需要花费大量的时间去解决,甚至解决不了,所以需要花费更多的时间去投入到Java的学习当中,努力提高自己的编程能力。