OO第一次博客作业
目录
1.前言
2.设计与分析
3.采坑心得
4.改进建议
5.总结
1.前言
正则表达式是java语言中一种非常重要的语言,他的重要性主要体现在以下方面:
1.高效的文本处理:正则表达式提供了一种高效的方式来处理文本数据。它可以快速地进行字符串的搜索、匹配、替换和分割等操作,这在处理大量数据时尤为有用。
2.强大的模式匹配能力:正则表达式能够根据定义的模式匹配几乎任何类型的字符串。这种灵活性使得它非常适合于验证输入数据格式,如邮箱地址、电话号码、日期等。
3.简化代码逻辑:使用正则表达式可以简化复杂的字符串处理逻辑,使代码更加简洁、可读性强,同时也更容易维护。
4.提高开发效率:通过正则表达式,开发者可以快速实现复杂的字符串操作,而不需要编写大量的条件判断和循环逻辑,从而大大提高开发效率。
5.灵活性和可扩展性:正则表达式具有很强的灵活性和可扩展性,可以根据需求轻松调整匹配模式,适应不同的应用场景。
6.跨平台和语言兼容性:虽然具体的语法可能略有差异,但正则表达式的核心概念在大多数编程语言中都是通用的。这意味着掌握了Java中的正则表达式,在其他语言中也能够快速上手和应用。
这三次pta作业,无一不体现出正则表达式对解决问题的便利。当然,要想做好这三次作业,需求与设计也是必不可少的。
2.设计与分析
1.第一次pta作业:
设计思路:设计试卷,答卷和题目三个类,并加一个测试类用来判断true和false。
代码:
class Paper{
private int num;private String numbering;private String question;private String answer;public Paper(){}public Paper(int num,String numbering,String question,String answer){**this.num = num;this.numbering = numbering;this.question = question;this.answer = answer;}public int getNum() {return num;}public void setNum(int num) {this.num = num;}public String getNumbering() {return numbering;}public void setNumbering(String numbering) {this.numbering = numbering;}public String getQuestion() {return question;}public void setQuestion(String question) {this.question = question;}public void setAnswer(String answer) {this.answer = answer;}public String getAnswer() {return answer;}public String toString(String question,String answer){return question+"~"+answer;}
class Standard{
private String standard;public Standard(){}public Standard(String standard){this.standard = standard;}public String getStandard() {return standard;}public void setStandard(String standard) {this.standard = standard;}
class Test{
private String answer;private String standard;public Test(){}public Test(String answer,String standard){this.answer = answer;this.standard = standard;}public String getAnswer() {return answer;}public void setAnswer(String answer) {this.answer = answer;}public void setStandard(String standard) {this.standard = standard;}public String getStandard() {return standard;}public String test(String answer,String standard){if (answer.equals(standard)) {return "true";} else {return "false";}}
public class Main {
public static void main(String[] args) {Scanner scan = new Scanner(System.in);int num = scan.nextInt();scan.nextLine();String[] numbering = new String[num];String[] question = new String[num];String[] answer = new String[num];String[] standard = new String[num];Paper[] paper = new Paper[num];for (int i = 0; i < paper.length; i++) {paper[i] = new Paper();}Standard[] standards = new Standard[num];Test[] tests = new Test[num];for (int i = 0; i < tests.length; i++) {tests[i] = new Test();}String[] str1 = new String[num];String[] str2 = new String[num];String[] str3 = new String[num];String[] str4 = new String[num];for (int i = 0; i < num; i++) {str1[i] = scan.nextLine();Pattern pattern1 = Pattern.compile("#N:(\\s+)?(\\S+)(\\s+)?#Q:(\\s+)?(.+)(\\s+)?#A:(\\s+)?(\\S+)(\\s+)?");Matcher matcher1 = pattern1.matcher(str1[i]);while (matcher1.find()){numbering[i] = matcher1.group(2);int sum = Integer.parseInt(numbering[i]);question[sum-1] = matcher1.group(5).trim();standard[sum-1] = matcher1.group(8);}}for (int i = 0; i < num; i++) {answer[i] = "";str2[i] = scan.next();Pattern pattern2 = Pattern.compile("#A:(\\s+)?(\\S+)(\\s+)?");Matcher matcher2 = pattern2.matcher(str2[i]);while (matcher2.find()) {answer[i] = matcher2.group(2);}}String end = scan.nextLine();for(int i = 0; i < num ; i++){paper[i] = new Paper(num,numbering[i],question[i],answer[i]);System.out.println(question[i]+"~"+answer[i]);}for(int i = 0; i < num; i++){tests[i] = new Test(answer[i],standard[i]);str4[i] = tests[i].test(answer[i], standard[i]);if(i < num - 1){System.out.print(str4[i]+" ");}else{System.out.print(str4[i]);}}}
分析:第一次作业中,正则表达式还运用的不熟练,类设计也不到位,但由于本题较简单,还是靠堆时间写完了并拿到了100.
2.第二次pta作业:
设计思路:在设计试卷、答卷和题目的基础上,添加多个试卷、答卷的方法以及对应题目的分数和所得分数。
代码:
class Question{
private int numbering;
private String question;
private String standard;public Question(){}
public Question(int numbering,String question,String standard){this.numbering = numbering;this.question = question;this.standard = standard;
}public String getStandard() {return standard;
}public void setStandard(String standard) {this.standard = standard;
}public void setQuestion(String question) {this.question = question;
}public String getQuestion() {return question;
}public void setNumbering(int numbering) {this.numbering = numbering;
}public int getNumbering() {return numbering;
}
class PaperNum{
private int papernum;public PaperNum(){}
public PaperNum(int papernum){this.papernum = papernum;
}public void setPapernum(int papernum) {this.papernum = papernum;
}public int getPapernum() {return papernum;
}
class testPaper{
private int[] numbering;
private int[] grade;public testPaper(){}
public testPaper(int[] numbering,int[] grade){this.numbering = numbering;this.grade = grade;
}public void setGrade(int[] grade) {this.grade = grade;
}public void setNumbering(int[] numbering) {this.numbering = numbering;
}public int[] getGrade() {return grade;
}
public int getGrade1(int i) {return grade[i];
}public int[] getNumbering() {return numbering;
}
public int getNumbering1(int i) {return numbering[i];
}
public int getTotal(int size,int[] grade){int total = 0;for(int i = 0; i <= size;i++){total+=grade[i];}return total;
}
class answerPaper{
private int answernum;
private String[] answer;public answerPaper(){}
public answerPaper(int answernum,String[] answer){this.answernum = answernum;this.answer = answer;
}public void setAnswer(String[] answer) {this.answer = answer;
}public String[] getAnswer(int size) {return answer;
}
public String getAnswer1(int i) {return answer[i];
}public int getAnswernum() {return answernum;
}public void setAnswernum(int answernum) {this.answernum = answernum;
}
public class Main {
public static void main(String[] args) {Scanner scan = new Scanner(System.in);List<testPaper> papers = new ArrayList<>();List<answerPaper> answers = new ArrayList<>();List<PaperNum> papernums = new ArrayList<>();List<String> leftNumbers = new ArrayList<>();List<String> rightNumbers = new ArrayList<>();Question[] questions = new Question[100];PaperNum[] paperNums = new PaperNum[100];testPaper[] testPapers = new testPaper[100];answerPaper[] answerPapers = new answerPaper[100];int num1 = 0;int num2 = 0;int num3 = 0;int num4 = 0;int numbering = 0;int total = 0;String[] question = new String[100];String[] standard = new String[100];int answernum = 0;String[] answer = new String[100];int papernum = 0;int[] grade = new int[100];int[] gets = new int[100];int[] numberings = new int[100];int z = 0;int get = 0;for (int t = 0; ; t++) {String line = scan.nextLine();if (line.equals("end")) {break;}Pattern pattern1 = Pattern.compile("#N:(\\s+)?(\\d+)(\\s+)?#Q:(\\s+)?(.+)(\\s+)?#A:(\\s+)?(\\S+)(\\s+)?");Matcher matcher1 = pattern1.matcher(line);Pattern pattern2 = Pattern.compile("#S:(\\d+)((\\s+)#A:(\\S+))*");Matcher matcher2 = pattern2.matcher(line);Pattern pattern3 = Pattern.compile("#T: *(\\d+)");Matcher matcher3 = pattern3.matcher(line);Pattern pattern4 = Pattern.compile("((\\d+)-(\\d+))");Matcher matcher4 = pattern4.matcher(line);while (matcher1.find()) {numbering = Integer.parseInt(matcher1.group(2));question[numbering] = matcher1.group(5).trim();standard[numbering] = matcher1.group(8);num1++;}while (matcher2.find()) {line = line.replaceAll("#S:|#A:", "");answer = line.split("\\s+");answernum = Integer.parseInt(answer[0]);for (int j = 1; j < answer.length; j++) {answer[j - 1] = answer[j];if(j == answer.length-1){answer[j] = "";}}z = answer.length - 1;answerPapers[num2] = new answerPaper(answernum, answer);num2++;}while (matcher3.find()) {papernum = Integer.parseInt(matcher3.group(1));paperNums[num3] = new PaperNum(papernum);num3++;}while (matcher4.find()) {numbering = Integer.parseInt(matcher4.group(2));numberings[num4] = numbering;grade[num4] = Integer.parseInt(matcher4.group(3));testPapers[num4] = new testPaper(numberings, grade);num4++;}}for (int i = 0; i < num3; i++) {total += testPapers[i].getTotal(num4, testPapers[i].getGrade());if (total != 100) {System.out.println("alert: full score of test paper" + paperNums[i].getPapernum() + " is not 100 points");}}for (int i = 0; i < num2; i++) {for (int j = 0; j < z; j++) {if (answerPapers[i].getAnswer1(j).equals(standard[numberings[j]])) {System.out.println(question[numberings[j]] + "~" + answerPapers[i].getAnswer1(j) + "~true");gets[j] = testPapers[i].getGrade1(j);} else {System.out.println(question[numberings[j]] + "~" + answerPapers[i].getAnswer1(j) + "~false");gets[j] = 0;}get += gets[j];}for (int l = 0; l < z; l++) {if (l < z - 1) {System.out.print(gets[l] + " ");}if (l == z - 1) {System.out.print(gets[l]);}}System.out.println("~" + get);get = 0;}int x = 0;for(int i = 0; i < num3; i++){for(int j = 0;j < num2;j++){if(paperNums[j].getPapernum() == answerPapers[i].getAnswernum()){x = 1;break;}if(x == 1){break;}}}if(x == 0){System.out.println("The test paper number does not exist");}
}
分析:在第二次作业中,没有搞清楚需求,也没有弄好设计,导致写出的代码思路混乱,很难改动,再重新写了一遍才达到了及格分数
3.第三次pta作业:
设计思路:在第二次作业的基础上,增加学生信息和删除题目的信息,然后设计讨论是否有此学生已经是否删除题目的情况。
代码:
class Question{
private int numbering;
private String question;
private String standard;public Question(){}
public Question(int numbering,String question,String standard){this.numbering = numbering;this.question = question;this.standard = standard;
}public String getStandard() {return standard;
}public void setStandard(String standard) {this.standard = standard;
}public void setQuestion(String question) {this.question = question;
}public String getQuestion() {return question;
}public void setNumbering(int numbering) {this.numbering = numbering;
}public int getNumbering() {return numbering;
}
class TestPaper{
private int papernum;
private int[] numberings;
private int[] grade;
private int T;
public TestPaper(){}
public TestPaper(int papernum,int[] numberings,int[] grade,int T){this.papernum = papernum;this.grade = grade;this.numberings = numberings;this.T = T;
}public void setNumbering(int[] numberings) {this.numberings = numberings;
}public int[] getNumberings() {return numberings;
}
public int getNumbering1(int i){return this.numberings[i];
}public int getPapernum() {return papernum;
}public void setPapernum(int papernum) {this.papernum = papernum;
}public void setGrade(int[] grade) {this.grade = grade;
}
public void setGrade1(int i,int grade1) {grade[i] = grade1;
}public int[] getGrade() {return grade;
}
public int getGrade1(int i){return grade[i];
}public int getT() {return T;
}public void setT(int T) {this.T =T;
}
class Student{
private String[] studentnum;
private String[] name;public Student(){}
public Student(String[] studentnum,String[] name){this.studentnum = studentnum;this.name = name;
}public void setStudentnum(String[] studentnum) {this.studentnum = studentnum;
}public void setName(String[] name) {this.name = name;
}public String[] getStudentnum() {return studentnum;
}public String[] getName() {return name;
}
public String getStudentnum1(int i) {return studentnum[i];
}public String getName1(int i) {return name[i];
}
class AnswerPaper{
private int answernum;
private String studentnum;
private int[] numbering;
private String[] answer;
private int A;public AnswerPaper(){}
public AnswerPaper(int answernum,String studentnum,int[] numbering,String[] answer,int A){this.answer = answer;this.numbering = numbering;this.answernum = answernum;this.studentnum = studentnum;this.A = A;
}public void setStudentnum(String studentnum) {this.studentnum = studentnum;
}public int[] getNumbering() {return numbering;
}public void setNumbering(int[] numbering) {this.numbering = numbering;
}public void setAnswer(String[] answer) {this.answer = answer;
}public String[] getAnswer() {return answer;
}public String getStudentnum() {return studentnum;
}public int getAnswernum() {return answernum;
}public void setAnswernum(int answernum) {this.answernum = answernum;
}
public String getAnswer1(int i){return answer[i];
}
public int getNumbering1(int i){return numbering[i];
}public int getA() {return A;
}public void setA(int A) {this.A = A;
}
class Delete{
private int numbering;public Delete(){}
public Delete(int numbering){this.numbering = numbering;
}public void setNumbering(int numbering) {this.numbering = numbering;
}public int getNumbering() {return numbering;
}
public class Main {
public static int test(String standard,String answer){if(standard.equals(answer)){return 1;}else {return 0;}
}
public static int delete(int i,int j){if(i == j){return 1;}else {return 0;}
}
public static void main(String[] args){Scanner scan = new Scanner(System.in);Question[] questions = new Question[100];TestPaper[] testPapers = new TestPaper[100];Student[] students = new Student[100];AnswerPaper[] answerPapers = new AnswerPaper[100];Delete[] deletes = new Delete[100];int num1 = 0;int num2 = 0;int num3 = 0;int num4 = 0;int num5 = 0;int numbering = 0;String question = "";String standard = "";int papernum = 0;int[] numberings = new int[100];int[] numberings1 = new int[100];int[] grade = new int[100];String[] studentnum = new String[100];String[] name = new String[100];int answernum = 0;String studentnums = "";String[] answer = new String[100];int total = 0;int get = 0;int gets[] = new int[100];int z = 0;int s = 0;int o = 0;int[] x = new int[100];//用于判断输入String[] wrong = new String[100];//用于导入错误字符串for(int t = 0;;t++){String line = scan.nextLine();Pattern pattern1 = Pattern.compile("#N:(\\s+)?(\\d+)(\\s+)?#Q:(\\s+)?(.+)(\\s+)?#A:(\\s+)?(\\S+)(\\s+)?");Matcher matcher1 = pattern1.matcher(line);Pattern pattern2 = Pattern.compile("#S:(\\d+)((\\s+)#A:(\\S+))*");Matcher matcher2 = pattern2.matcher(line);Pattern pattern3 = Pattern.compile("#T: *(\\d+)((\\s+)(\\d+)-(\\d+))*");Matcher matcher3 = pattern3.matcher(line);Pattern pattern4 = Pattern.compile("#X:((\\s+)?(\\S+)(\\s+)(\\S+))+");Matcher matcher4 = pattern4.matcher(line);Pattern pattern5 = Pattern.compile("#D:N-(\\d+)");Matcher matcher5 = pattern5.matcher(line);if(line.equals("end")){break;}if(matcher1.find()||matcher2.find()||matcher3.find()||matcher4.find()||matcher5.find()) {boolean containsN = line.contains("#N");boolean containsQ = line.contains("#Q");boolean containsA = line.contains("#A");if (containsN && containsQ && containsA) {line = line.replaceAll("#N:|#Q:|#A:", "");String[] str = line.split(" ");numbering = Integer.parseInt(str[0]);question = str[1];standard = str[2];questions[numbering - 1] = new Question(numbering, question, standard);//按题目序号存储x[num1] = 1;num1++;//题目数}if (line.contains("#T")) {line = line.replaceAll("#T:", "");String[] str = line.split(" ");papernum = Integer.parseInt(str[0]);z = str.length - 1;//试卷题目总数for (int i = 1; i < str.length; i++) {String[] str1 = str[i].split("-");numberings[i - 1] = Integer.parseInt(str1[0]);grade[numberings[i - 1]-1] = Integer.parseInt(str1[1]);//试卷题号按顺序存,分数按题号存}testPapers[papernum - 1] = new TestPaper(papernum, numberings, grade,z);//试卷按照试卷号存储,题目和分数按照所给顺序存储(numbering[0]是要输出的第一个题号)num2++;//试卷数}if (line.contains("#X:")) {line = line.replaceAll("#X:", "");String[] str = line.split("-");o = str.length;for (int i = 0; i < str.length; i++) {String[] str1 = str[i].split(" ");studentnum[i] = str1[0];name[i] = str1[1];//顺序赋学生信息}students[num3] = new Student(studentnum, name);//存学生信息num3++;}if (line.contains("#D:")) {line = line.replaceAll("#D:", "");line = line.replaceAll("N-", "");numbering = Integer.parseInt(line);deletes[num4] = new Delete(numbering);num4++;}if (line.contains("#S:")) {line = line.replaceAll("#S:|#A:", "");String[] str = line.split(" ");answernum = Integer.parseInt(str[0]);studentnums = str[1];s = str.length-2;//一套答卷的答题数for (int i = 2; i < str.length; i++) {String[] str1 = str[i].split("-");numberings1[i - 2] = Integer.parseInt(str1[0]);answer[numberings1[i - 2]-1] = str1[1];//答卷题号按顺序存,答案按序号存}answerPapers[num5] = new AnswerPaper(answernum, studentnums, numberings1, answer,s);num5++;//答卷数}}else {System.out.println("wrong format:"+line);}}if(num4 > 0){for(int i = 0; i < num2;i++){for (int j = 0;j < num4;j++){testPapers[i].setGrade1(deletes[j].getNumbering()-1,0);//将删除的题目的分数设置为0}}}for(int i = 0; i < num2;i++){for(int j = 0; j < z;j++){total += testPapers[i].getGrade1(j);}if(total != 100){System.out.println("alert: full score of test paper"+testPapers[i].getPapernum()+" is not 100 points");}}int p = 0;for(int i = 0; i < num5;i++) {for (int j = 0; j < num2; j++) {if (answerPapers[i].getAnswernum() == testPapers[j].getPapernum()){p = 1;}}}for(int i = 0; i < num5;i++){for (int j = 0; j < num2;j++){if(p == 0){System.out.println("The test paper number does not exist");}else {//答卷对应试卷for (int k = 0; k < testPapers[i].getT(); k++) {int q = 0;for (int k2 = 0; k2 < num1; k2++) {if (questions[k2].getNumbering() == testPapers[j].getNumbering1(k)) {q = 1;}if(q == 1){break;}}if (q == 0) {System.out.println("non-existent question~0");gets[k] = 0;}if (q == 1) {if(num4 > 0){for (int j1 = 0; j1 < num4; j1++) {if (testPapers[j].getNumbering1(k) == deletes[j1].getNumbering()) {System.out.println("the question " + testPapers[i].getNumbering1(k) + " invalid~0");gets[k] = 0;} else {if (answerPapers[i].getA() >= testPapers[j].getT()) {if (test(questions[testPapers[j].getNumbering1(k) - 1].getStandard(), answerPapers[i].getAnswer1(answerPapers[i].getNumbering1(k) - 1)) == 1) {//standard按照answer的编号输System.out.println(questions[testPapers[j].getNumbering1(k) - 1].getQuestion() + "~" + answerPapers[i].getAnswer1(k) + "~true");gets[k] = testPapers[j].getGrade1(testPapers[j].getNumbering1(k) - 1);} else {System.out.println(questions[testPapers[j].getNumbering1(k) - 1].getQuestion() + "~" + answerPapers[i].getAnswer1(k) + "~false");gets[k] = 0;}} else {for (int n = 0; n < answerPapers[i].getA(); n++) {if (test(questions[testPapers[j].getNumbering1(k) - 1].getStandard(), answerPapers[i].getAnswer1(answerPapers[i].getNumbering1(k) - 1)) == 1) {//standard按照answer的编号输System.out.println(questions[testPapers[j].getNumbering1(k) - 1].getQuestion() + "~" + answerPapers[i].getAnswer1(k) + "~true");gets[k] = testPapers[j].getGrade1(testPapers[j].getNumbering1(k) - 1);} else {System.out.println(questions[testPapers[j].getNumbering1(k) - 1].getQuestion() + "~" + answerPapers[i].getAnswer1(k) + "~false");gets[k] = 0;}}for (int m = answerPapers[i].getA(); m < testPapers[j].getT(); m++) {System.out.println("answer is null");gets[m] = 0;}}}get += gets[k];}}else {if (answerPapers[i].getA() >= testPapers[j].getT()) {if (test(questions[testPapers[j].getNumbering1(k) - 1].getStandard(), answerPapers[i].getAnswer1(answerPapers[i].getNumbering1(k) - 1)) == 1) {//standard按照answer的编号输System.out.println(questions[testPapers[j].getNumbering1(k) - 1].getQuestion() + "~" + answerPapers[i].getAnswer1(k) + "~true");gets[k] = testPapers[j].getGrade1(testPapers[j].getNumbering1(k) - 1);} else {System.out.println(questions[testPapers[j].getNumbering1(k) - 1].getQuestion() + "~" + answerPapers[i].getAnswer1(k) + "~false");gets[k] = 0;}} else {for (int n = 0; n < answerPapers[i].getA(); n++) {if (test(questions[testPapers[j].getNumbering1(k) - 1].getStandard(), answerPapers[i].getAnswer1(answerPapers[i].getNumbering1(k) - 1)) == 1) {//standard按照answer的编号输System.out.println(questions[testPapers[j].getNumbering1(k) - 1].getQuestion() + "~" + answerPapers[i].getAnswer1(k) + "~true");gets[k] = testPapers[j].getGrade1(testPapers[j].getNumbering1(k) - 1);} else {System.out.println(questions[testPapers[j].getNumbering1(k) - 1].getQuestion() + "~" + answerPapers[i].getAnswer1(k) + "~false");gets[k] = 0;}}for (int m = answerPapers[i].getA(); m < testPapers[j].getT(); m++) {System.out.println("answer is null");gets[m] = 0;}}}get += gets[k];}}int st = 1;for(int l1 = 0; l1 < num3; l1++){for (int l2 = 0;l2 < o;l2++) {if (answerPapers[i].getStudentnum().equals(students[l1].getStudentnum1(l2))){st = 0;System.out.print(students[l1].getStudentnum1(l2)+" "+students[l1].getName1(l2)+": ");for (int l3 = 0; l3 < z; l3++) {if (l3 < z - 1) {System.out.print(gets[l3] + " ");}if (l3 == z - 1) {System.out.print(gets[l3]);}}System.out.println("~" + get);get = 0;}}}if(st == 1){System.out.println(answerPapers[i].getStudentnum()+" not found");}}}}
}
分析:这次相较于上次的作业,明显有了更清晰的思路和解决问题的方法,但由于设计方面依然没到位,再加上题目难度的提升,导致分数没有太大的变化。
3.采坑心得
1.第一次pta作业:刚提交时,没用正则表达式,以至于没拿到很好的成绩
后续在ideal中不断修改并用上正则表达式后,终于写到了满分。
2.第二次pta作业:吸取了第一次作业的教训,第二次作业中运用了正则表达式,但由于用了第一次本就不完善的设计,导致第二次作业难以下手
最后也是时间原因,没有把这题刷到满分
3.第三次pta作业:在第二次作业的基础上增添了学生信息和删除信息,在研究完题目之后,没有处理好乱序输入、信息的删除和错误信息,所以还有很多测试点没过,但到最后,还是勉强达到了及格分
4.改进建议
1.类与类之言要遵循单一职责原则
2.设计一个代理类来处理需要的数据
3.在写之前千万要先设计,不要提笔就写,只有设计写好了,思路才会清晰,代码才会完整。
5.总结
在这三次作业中,最主要的问题还是设计问题,没有好的设计就很难写出完整的代码,就会有很多报错,因而拿不到分,在接下来的作业里,我要做到如下方面:
1.写之前先看题,思考如何设计。
2.勤能补拙,在pta作业中投入更多时间。
3.对每次的失误和不足进行补充分析,应对下一次的难题。