一、前言
题目集九
*知识点:TreeMap有序的Key-Value集合的使用,HashMap中的元素是没有顺序的,而TreeMap中所有的元素都是有某一固定顺序的,输出关键字出现次数时需要得到一个有序的结果,因此使用TreeMap。用来存储字符串的容器StringBuilder以及添加元素的append方法。字符串处理中的replaceAll()方法用来删除注释以及替换一些符号。
*题量:共一题题量较少。
*难度:难度适中,在对输入的源码用replaceAll()方法进行处理删除和替换时正则表达式时困难比较多,例如:删除多行注释里的内容
String allString=sbr.toString().replaceAll("/\\*\\s*.*\\s*\\*/"," ");具体完成情况如下:
具体源码如下:
package keyWord; import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; public class Main { public static void main(String[] args) { String[] keyWord={"abstract","assert","boolean","break","byte","case","catch","char","class","const","continue" ,"default","do","double","else","enum","extends","false","final","finally","float","for","if","goto","implements","import","int","interface","instanceof","long","native","new","null","package" ,"private","protected","public","return","short","static","strictfp","super","switch","synchronized","this","throw","throws","transient","try","true","void","volatile","while"}; Scanner sc=new Scanner(System.in); boolean haveElement=false; int count; Map<String,Integer> m=new TreeMap<>(); StringBuilder sbr=new StringBuilder(); while(true){ String inputLine=sc.nextLine(); if(inputLine.equals("exit")) break; //删除单行注释以及双引号里的字符、{}、多个空格换成一个、【】,;.都替换成空格 sbr.append(inputLine.replaceAll("//.*"," ").replaceAll("\".*\""," "). replaceAll(","," ").replaceAll(" +"," "));//去掉//后的内容及双引号里的内容 haveElement=true; } //删除多行注释里的内容 String allString=sbr.toString().replaceAll("/\\*\\s*.*\\s*\\*/"," "); if(!haveElement){//如果没有输入代码 System.out.println("Wrong Format"); return; } //寻找每个关键词出现的次数 for(int i=0;i< keyWord.length;i++){ Pattern pattern=Pattern.compile("\\b"+keyWord[i]+"\\b"); Matcher matcher= pattern.matcher(allString); count=0; while(matcher.find()){ count++; } if(count!=0){//存入 m.put(keyWord[i],count); } } String s1=String.valueOf(m); String s2=s1.replaceAll("[{]*","").replaceAll("}",""); String[] s3=s2.split(", "); //循环输出 for(int i=0;i<s3.length;i++){ String[] s4=s3[i].split("="); System.out.println(s4[1]+"\t"+s4[0]); } } }
题目集十
*知识点:HashMap检索,用HashMap存储学生信息,并实现根据学号的检索功能、排序功能。Collections.sort(list,Collections.reverseOrder())的使用。抽象类的定义,及子类方法的重写;静态方法、多态。使用多态当不同对象去完成时会产生出不同的状态(不同的结果)。多态必须在继承的体系下;子类要对父类方法进行重写;通过父类的引用调用不同的重写的方法。
*题量:共四题,题量适中。
*难度:难度不大,具体完成情况如下:
题目集八7-1、题目集十7-3、题目集十一7-2
*知识点:课程成绩统计程序的迭代,正则表达式的使用,类结构的设计,ArrayList、HashSet等容器的使用。Comparator比较器及Compable接口的在排序时使用。第一次设计代码大小超限,迭代后的第二次设计完成较好,但依旧没有通过所有的测试点,第三次设计根据测试点自测运行的结果都能达到预期的结果,但是不清楚为什么过不去测试点,找不到错误不知道该怎么改便只通过了部分测试点。第二次的完成情况如下:
具体主程序中代码码如下:
package pta2; import java.util.*; public class Main { public static void main(String[] args) { HashSet<Course> allCourse = new HashSet<>();//存放课程信息 要排序便于按字符输出课程平均分 ArrayList<Class> classes = new ArrayList<>();//放班级 可求班级学生平均分要排序 也可求班级平均分要排序 ArrayList<CourseSelection> cs = new ArrayList<>();//与1结合求课程平均分 Scanner sc = new Scanner(System.in); String str; String[] array; while (true) { str = sc.nextLine(); if (str.equals("end")) break; array = str.split(" "); if (array.length == 2) {//如果是必修课 考核方式可以没有 if (array[0].length() > 10) {//课程长度不合格 System.out.println("wrong format"); } else { if (array[1].equals("必修")) { Course c = new Course(); c.courseName = array[0]; c.curriculum = array[1]; c.textMethod = "考试"; allCourse.add(c); } else {//不是必修的话是不能输两个字符的 System.out.println(array[0] + " : " + "course type & access mode mismatch"); } } } else if (array.length == 3) { if (array[0].length() > 10) {//课程长度不合格 System.out.println("wrong format"); }else{ Course c = new Course(); c.courseName = array[0]; c.curriculum = array[1]; c.textMethod = array[2]; if(array[1].equals("必修") && array[2].equals("考试")|| array[1].equals("选修")||array[1].equals("实验")&&array[2].equals("实验")){ allCourse.add(c); }else{ System.out.println(array[0] + " : " + "course type & access mode mismatch"); } } }else if(array.length==4){//四个的话只能是 选修的考察 boolean check1=false; boolean check2=false; int score=Integer.parseInt(array[3]); Course course1; boolean ifIn=false; String g,t,r; int num=Integer.parseInt(array[0].substring(0,6)); if(array[0].matches("[0-9]{8}")&&array[1].length()<=10&&score>=0&&score<=100){ Student s=new Student(); s.id=Integer.parseInt(array[0]); s.name=array[1]; if(classes.size()==0){//无班级 Class cls=new Class(); cls.classNum=num; cls.classStudent.add(s); classes.add(cls); }else{ for(int i=0;i< classes.size();i++){//有班级 if(classes.get(i).classNum==num&&!classes.get(i).classStudent.contains(s)){//没有这个学生才添加 classes.get(i).classStudent.add(s);//把学生加进班级 ifIn=true; break; } } if(!ifIn){ Class cls=new Class(); cls.classNum=num; cls.classStudent.add(s); classes.add(cls); } } Iterator<Course> it1= allCourse.iterator(); while(it1.hasNext()){ course1=it1.next(); g= course1.courseName; t= course1.curriculum; r= course1.textMethod; if(g.equals(array[2])){//有这个课 check1=true; if(t.equals("选修")&&r.equals("考察")){//有这个课才去核对它 check2=true;// break; } } } if(check1==false&&check2==false){//没有这个课 System.out.println(array[0]+" "+array[1]+" : "+"does not exist"); } if(check1==true&&check2==false){//有课不匹配 System.out.println(array[0]+" "+array[1]+" : "+"access mode mismatch"); }else{ for(int i=0;i< classes.size();i++){ for(int j=0;j<classes.get(i).classStudent.size();j++){ if(classes.get(i).classStudent.get(j).id==Integer.parseInt(array[0])){ classes.get(i).classStudent.get(j).total.add(Integer.parseInt(array[3]));//加分数 CourseSelection courseSelection=new CourseSelection(); Course l=new Course(); InvestScore investScore=new InvestScore(Integer.parseInt(array[3])); l.courseName=array[2]; courseSelection.setCourse(l); courseSelection.setInvestScore(investScore); courseSelection.setScore(investScore.Score());//设置分数 cs.add(courseSelection); } } } } }else{//学号、姓名、分数、不合格 System.out.println("wrong format"); } }else if(array.length==5){ boolean check1=false; boolean check2=false; int score1=Integer.parseInt(array[3]); int score2=Integer.parseInt(array[4]); Course course1; boolean ifIn=false; String g,t=null,r; int num=Integer.parseInt(array[0].substring(0,6)); if(array[0].matches("[0-9]{8}")&&array[1].length()<=10&&score1>=0&&score1<=100&&score2>=0&&score2<=100){ Student s=new Student(); s.id=Integer.parseInt(array[0]); s.name=array[1]; if(classes.size()==0){//无班级 Class cls=new Class(); cls.classNum=num; cls.classStudent.add(s); classes.add(cls); }else{ for(int i=0;i< classes.size();i++){//有班级 if(classes.get(i).classNum==num&&!classes.get(i).classStudent.contains(s)){//没有这个学生才添加 classes.get(i).classStudent.add(s);//把学生加进班级 ifIn=true; break; } } if(!ifIn){ Class cls=new Class(); cls.classNum=num; cls.classStudent.add(s); classes.add(cls); } } Iterator<Course> it1= allCourse.iterator(); while(it1.hasNext()){ course1=it1.next(); g= course1.courseName; t= course1.curriculum; r= course1.textMethod; if(g.equals(array[2])){//有这个课 check1=true; if(t.equals("选修")&&r.equals("考试")||t.equals("必修")&&r.equals("考试")){//有这个课才去核对它 check2=true;// break; } } } if(check1==false&&check2==false){//没有这个课 System.out.println(array[0]+" "+array[1]+" : "+"does not exist"); } if(check1==true&&check2==false){//有课不匹配 System.out.println(array[0]+" "+array[1]+" : "+"access mode mismatch"); }else{ for(int i=0;i< classes.size();i++){ for(int j=0;j<classes.get(i).classStudent.size();j++){ if(classes.get(i).classStudent.get(j).id==Integer.parseInt(array[0])){ TextScore o=new TextScore(Integer.parseInt(array[3]),Integer.parseInt(array[4])); classes.get(i).classStudent.get(j).total.add(o.Score());//加分数 CourseSelection courseSelection=new CourseSelection(); Course l=new Course(); l.courseName=array[2]; courseSelection.setCourse(l); courseSelection.setTextScore(o); courseSelection.setScore(o.Score());//设置分数 cs.add(courseSelection); } } } } }else{//学号、姓名、分数、不合格 System.out.println("wrong format"); } }else if(array.length>5){//实验 boolean check1=false; boolean check2=false; int count1=Integer.parseInt(array[3]); ExperimentScore es=new ExperimentScore(); for(int i=4;i< array.length;i++){ es.allExperiment.add(Integer.parseInt(array[i])); } Course course1; String g,t=null,r; boolean ifIn=false; boolean out=false; int num=Integer.parseInt(array[0].substring(0,6)); if(array[0].matches("[0-9]{8}")&&array[1].length()<=10&&count1>=4&&count1<=9&& es.CheckScore()){ Student s=new Student(); s.id=Integer.parseInt(array[0]); s.name=array[1]; if(classes.size()==0){//无班级 Class cls=new Class(); cls.classNum=num; cls.classStudent.add(s); classes.add(cls); }else{ for(int i=0;i< classes.size();i++){//有班级要考虑是否有他的班级 if(classes.get(i).classNum==num){//有这个班级 out=true; if(classes.get(i).classStudent.contains(s)){ ifIn=true; break; } } if(classes.get(i).classNum==num&&!classes.get(i).classStudent.contains(s)){//没有这个学生才添加 classes.get(i).classStudent.add(s);//把学生加进班级 ifIn=true;//有归宿 break; } } if(!ifIn&&!out){//没有这个班级也没有这个学生 Class cls=new Class(); cls.classNum=num; cls.classStudent.add(s); classes.add(cls); } } Iterator<Course> it1= allCourse.iterator(); while(it1.hasNext()){ course1=it1.next(); g= course1.courseName; t= course1.curriculum; r= course1.textMethod; if(g.equals(array[2])){//有这个课 check1=true; if(t.equals("实验")&&r.equals("实验")&&count1== array.length-4){//有这个课才去核对它 check2=true;// break; } } } if(check1==false&&check2==false){//没有这个课 System.out.println(array[0]+" "+array[1]+" : "+"does not exist"); } if(check1==true&&check2==false){//有课不匹配 System.out.println(array[0]+" "+array[1]+" : "+"access mode mismatch"); }else{ for(int i=0;i< classes.size();i++){ for(int j=0;j<classes.get(i).classStudent.size();j++){ if(classes.get(i).classStudent.get(j).id==Integer.parseInt(array[0])){ TextScore o=new TextScore(Integer.parseInt(array[3]),Integer.parseInt(array[4])); classes.get(i).classStudent.get(j).total.add(es.Score());//加分数 CourseSelection courseSelection=new CourseSelection(); Course l=new Course(); l.courseName=array[2]; courseSelection.setCourse(l); courseSelection.setExperimentScore(es); courseSelection.setScore(es.Score());//设置分数 cs.add(courseSelection); } } } } }else{//学号、姓名、分数、不合格 System.out.println("wrong format"); } } }//while(true) Student r; Collections.sort(classes,new ClassNumComparator());//对班级排序 for(int i=0;i<classes.size();i++){//按照学生学号排 Collections.sort(classes.get(i).classStudent,new IdComparator()); } for(int i=0;i< classes.size();i++){//输出学生平均分 for(int j=0;j<classes.get(i).classStudent.size();j++){ r=classes.get(i).classStudent.get(j); if(r.getStudentAverage()>=0){//有分数 System.out.println(r.id+" "+r.name+" "+(int)r.getStudentAverage()); }else{ System.out.println(r.id+" "+r.name+" "+"did not take any exams"); } } } List<Course> list=new ArrayList<>(allCourse); Course m; Collections.sort(list); for(int i=0;i<list.size();i++){ double sum=0,sum3=0,sum4=0; int count2=0,count4=0,count5=0; boolean check1=false,check2=false,check3=false; m=list.get(i); for(int j=0;j<cs.size();j++){ if(cs.get(j).getCourse().courseName.equals(list.get(i).courseName)){//是这个课 if(m.textMethod.equals("考试")&&cs.get(j).getTextScore()!=null){//如果是考试 check1=true; sum3=sum3+cs.get(j).getTextScore().dailyScore; sum4=sum4+cs.get(j).getTextScore().examScore; sum=sum+cs.get(j).getScore(); count2++; }else if(m.textMethod.equals("考察")&&cs.get(j).getInvestScore()!=null){//考察 check2=true; sum=sum+cs.get(j).getScore(); count4++; }else if(m.textMethod.equals("实验")&&cs.get(j).getExperimentScore()!=null){//实验 check3=true; sum=sum+cs.get(j).getScore(); count5++; } } } if(sum>0){//是考试 if(check1) System.out.println(m.courseName+" "+(int)Math.floor(sum3/count2)+" "+(int)Math.floor(sum4/count2)+" "+(int)Math.floor(sum/count2)); if(check2){ System.out.println(m.courseName+" "+(int)Math.floor(sum/count4)+" "+(int)Math.floor(sum/count4)); } if(check3){ System.out.println(m.courseName+" "+(int)Math.floor(sum/count5)); } } if(sum<=0){ System.out.println(m.courseName+" "+"has no grades yet"); } } for(int i=0;i< classes.size();i++){ double sum2=0; int count3=0; for(int j=0;j<classes.get(i).classStudent.size();j++){//合格了才会在那个集合里 sum2=sum2+classes.get(i).classStudent.get(j).getAllScore(); count3=count3+classes.get(i).classStudent.get(j).total.size(); } if(sum2<0){ System.out.println(classes.get(i).classNum+" "+"has no grades yet"); }else{ System.out.println(classes.get(i).classNum+" "+(int)Math.floor(sum2/count3)); } } } }
其中自定义Comparator比较器的类代码如下:
package pta2; import java.util.Comparator; public class ClassNumComparator implements Comparator<Class> { @Override public int compare(Class o1, Class o2) { return o1.classNum-o2.classNum; }}
实现Comparable接口的代码如下:
package pta2; public class Course implements Comparable<Course>{ String courseName;//课程名称 String curriculum;//课程性质 必修、选修 String textMethod;//考核方式 考试、考察 public Course() { } public Course(String courseName, String curriculum, String textMethod) { this.courseName = courseName; this.curriculum = curriculum; this.textMethod = textMethod; } @Override public int compareTo(Course o) { return this.courseName.compareTo(o.courseName); } }
题目集十一
此次题目集难度不大,题量适中。有点难度的可以说是7-4:自定义接口和实现类,可以说是解释了栈储存数据的原理。具体要求如下:
定义IntegerStack
接口,用于声明一个存放Integer元素的栈的常见方法:
定义IntegerStack的实现类ArrayIntegerStack
,内部使用数组实现。创建时,可指定内部数组大小。
- 输入n,建立可包含n个元素的ArrayIntegerStack对象
- 输入m个值,均入栈。每次入栈均打印入栈返回结果。
- 输出栈顶元素,输出是否为空,输出size
- 使用Arrays.toString()输出内部数组中的值。
- 输入x,然后出栈x次,每次出栈均打印。
- 输出栈顶元素,输出是否为空,输出size
- 使用Arrays.toString()输出内部数组中的值。具体代码如下:
import java.util.Arrays; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String n1 = sc.nextLine(); int n = Integer.parseInt(n1);//建立n个元素的ArrayIntegerStack对象 ArrayIntegerStack stack = new ArrayIntegerStack(n); String m1 = sc.nextLine(); int m = Integer.parseInt(m1);//输入m个值 for (int i = 0; i < m; i++) {//均入栈。每次入栈均打印入栈返回结果 int element = sc.nextInt(); Integer o = stack.push(element); System.out.println(o); } System.out.println(stack.peek() + "," + stack.empty() + "," + stack.size());//输出栈顶元素,输出是否为空,输出size String arr = stack.toString(); System.out.println(arr); int x = sc.nextInt(); for (int i = 0; i < x; i++) {//出栈x次,每次出栈均打印 Integer element = stack.pop(); System.out.println(element); } System.out.println(stack.peek() + "," + stack.empty() + "," + stack.size());//输出栈顶元素,输出是否为空,输出size String arr1 = stack.toString(); System.out.println(arr); } } interface IntegerStack { public Integer push(Integer item); //如果item为null,则不入栈直接返回null。如果栈满,也返回null。如果插入成功,返回item。 public Integer pop(); //出栈,如果为空,则返回null。出栈时只移动栈顶指针,相应位置不置为null public Integer peek(); //获得栈顶元素,如果为空,则返回null. public boolean empty(); //如果为空返回true public int size(); //返回栈中元素个数 } class ArrayIntegerStack implements IntegerStack { int[] stack; int top=0; public ArrayIntegerStack(int capacity) { stack=new int[capacity]; } @Override public Integer push(Integer item) { if(top==stack.length||item==null){ return null; } stack[top++]=item; //top++; return item; } @Override public Integer pop() { if(top==0){ return null; } top--; return stack[top]; } @Override public Integer peek() { if(top==0){ return null; } return stack[top-1]; } @Override public boolean empty() { if(top==0){ return true; } else{ return false; } } @Override public int size() { return top; } @Override public String toString() { String s=""; int i=0; while(i<top-1){ s=s+stack[i]+", "; i++; } if(top==0){ while(i<stack.length-1){ s=s+"null, "; i++; } s+="null"; }else{ if (top<stack.length){ s+=stack[i]+", "; for (int p=0;p<stack.length-top-1;p++){ s+="null, "; } s+=null; }else { s+=stack[i]; } } return "["+s+"]"; } }
二、设计分析
题目集八7-1:
类图:
圈复杂度:
题目集十7-3
类图:
圈复杂度:
题目集十一7-2
类图:
圈复杂度:
解题心得:
1、本题整体来说是有难度的,但是难度也不会特别大。适当思考还是能写得出来,较比菜单是好了很多了。第一次设计的时候在看类图上花了一定的功夫,刚开始没想懂怎么按所给的类图把各个类联系起来补齐整体的类图并且实现要求的功能。有了一些眉目后开始写代码,写着就开始清晰起来。由于第一次设计没有想到用HashSet,不再存入已经录入的课程,让我犯了不少难。再一个就是在编写输出各个学生的平均成绩时,由于是把每次录入的课程成绩信息一起放进了集合,没有分班级,当同一个学生有多次成绩时就会有多个信息。在输出这个学生的平均成绩时还要先判断是否输出过以及后面有关他的成绩信息,搞得思路比较混乱。写完后代码长度超限,于是又修改了许多冗余的代码,导致后期没有多少时间去调试错误的部分,最后只拿了一点点分,结果不是很理想。
2、在输出时需要按给定的要求顺序输出,既要考虑排序的先后也要考虑用什么方法。为了让自己熟练,我是Comparator接口、Comparable接口以及集合的自带的排序方法都结合了用,确实加深了对排序这个问题的实践,学会了怎么按自定义的排序方式去排序。
3、在吸取了第一次存储学生成绩不好计算输出平均分的教训后,在改进代码时给学生类添加一个集合变量,就能将一个学生的所有成绩存储到一个集合内,便于计算平均分。在添加时只需要重写equals方法,按学号判定是否相等。如果有这个学生就只添加成绩,这样在输出时计算平均分就方便多了。有些测试点没通过,不过在调试过程中已经发现了问题出在哪里,碍于时间不太够了,就后期自己修改了代码。
4、第三次程序是在第二次错误改正后的迭代,但是不断调试,运行的答案与预期的输出是没有问题的,但是不明白错在哪里。最后就只拿了所有给出的测试样例的测试点的分。
三、踩坑心得
1、在重写equals方法时没有太大的把握尽量用编译工具里面自动生成的equals方法并且学习它的写法,不然容易写错,在判断是否相等时就不是预期的结果。修改后正确代码如下:
@Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Student student = (Student) o; return id == student.id; }
2、在自定义IntegerStack
接口并定义IntegerStack的实现类ArrayIntegerStack实现栈的基本功能时考要到数据类型的影响,例如一下代码:
for (int i = 0; i < m; i++) {//均入栈。每次入栈均打印入栈返回结果 int element = sc.nextInt(); Integer o = stack.push(element); System.out.println(o); }
在一开始o变量采用int数据类型是行不通的。
3、在写按格式输出语句时,最好是复制平台上的格式再进行修改,在写代码过程中,经常在简单的程序里因为一个单词或者是一个空格长时间找不到错误的地方,改一个单词或空格答案就完全正确。这种浪费时间的错误是可以避免的。
4、一定要搞清楚ArrayList、HashSet、LinkedHashSet、TreeSet、TreeMap之间的使用方式,Set是不能存储相同的元素的,Map是存储键值对,Key值是不可重复的而Value值是可以相同的。如果要保持输出时的顺序最好选择LinkedHashSet,HashSet输出顺序与输入顺序不一定一样。如果要自定义排序,最好选择TreeSet,HashSet是不能自定义排序的。
四、改进建议
1、统计Java程序中关键词的出现次数中如果想在输出正确的运行结果后再输出完整的输入时的程序可以先用一个StringBuilder存储所有的程序,再在另外一个StringBuilder里删除替换。也可以试着写老师课堂给出的思考:现在的题目是假设输入的这段程序是正确的程序,如果改进怎么实现可以判断输入的代码的正确性以及错误发生在哪里,做到一个题目持续改进,发散思维。
2、在定义IntegerStack的实现类ArrayIntegerStack
,内部使用数组实现。可以尝试写老师给出的持续改进:如果IntegerStack接口的实现类内部使用ArrayList来存储元素,怎么实现,测试代码需要进行什么修改。
3、老师在设计题目时可以分阶段地提升难度,例如 课程成绩统计程序之后再写点菜记价系统。
4、个人方面感觉知识点不扎实,不经常用的方法经常容易忘记,以至于下次要重新学习相应的知识点去写代码。自己总结是因为训练较少,私下还是要自行进行训练,经常写就不容易忘记。
五、总结
1、知识点上
(1)、对ArrayList、HashSet、LinkedHashSet、TreeSet、TreeMap这 一系列容器有了更清楚的了解和对应的使用情况的选择,以及对应的方法,其中只有ArrayList是有索引的,其他的都是不能通过索引去遍历的。
(2)、了解到正则表达式不只是用于判断字符串的格式,还可以用于字符串中字符的替换,符合条件的进行相应的替换,学习到了java中的replaceAll()方法。
(3)、学习到栈储存数据的原理以及各个对栈内元素的操作方法是如何实现的,学会了写一个小小的栈接口以及它的实现类,对栈内元素的操作方法也有了更深的印象。
(4)、在输入时如果nextLine()与nextInt()混用可能会出现错误,在写输入时尽量避免这样使用。
(5)、学习到可以重写equals方法来改变对引用数据是否相同,如果不重写,引用类型数据在比较相等时比较的就是地址而不是内容。也学习到可以重写toString方法改变集合的输出格式。
(6)、对Comparator比较器、Comparable接口、集合内的排序方法有了进一步的实践,记忆更深刻了。
2、学习方法上
(1)、可以适当学习编译工具自己生成的一些代码的写代码的格式与逻辑,让自己的代码更合理更规范。
(2)、要求按给定格式输出结果时可以复制给定的格式,可以避免多空格少空格这样的错误,避免不必要浪费时间。
(3)、对容易忘记的方法可以经常练习多实践加深印象,而不是每次都要去查。
3、进一步改进
(1)、在完成老师给出的题目之后可以多花时间思考是否有改进的空间以及怎么去实现自己的思考。
(2)、可以在课后学习一些知识点,学习不仅仅局限于课堂知识,这样也能拓宽写代码的质量,也能使自己写起题来更加得心应手。
(3)、试着规范自己的代码。
4、对课程、作业、实验的建议
(1)、希望老师可以在布置题目时可以开放测试点,这样同学们可以知道自己的问题错在哪里,我们有些同学就是一直找不出来问题直到题目集截止了也不知道自己错在哪里,题目结束后这题错了就没有机会再测试修改后的代码的正确性。就是错了的题一直错也不知道错在哪里。
(2)、希望老师对于难度较高的题目可以适当讲解一下,会有不少帮助,课堂肯定大家都很认真听这部分,大家也能学习到老师思考问题的方向。