(1)前言与总结分析:第一次题目集主要考察的是java语言的一些基本语法,因为和C语言的语法比较相似,所以理解起来比较简单,当然因为写法改变了很容易出错。比如漏了import这个语句,还有对输入语句比较别扭,不太了解为什么要多那么多东西。个人认为这次题目集数量偏多,不过题目比较基础所以,还行。7-1到7-5题目比较简单可以得到绝大部分分数,7-6、7-7适中,7-8、7-9比较难,很难得满分。刚接触Java所以几乎没有面向对象的思想,接触都是按照面向过程的方法自上而下的思路,但发现这些题目这样做有的比较麻烦。
主要还是从上而下的思路,对Java的思想还不是很理解,还是在使用C的思想。
第二次题目集主要考察Java字符串的相关知识和字符串的处理,这次三个题目感觉都挺麻烦的, 题目复杂度比较高,题目的测试点太多了,没做过这么多测试点的题目。
7-2这个题目刚开始连题目都有点看不懂,而且涉及的一些知识例如奇偶校验位校验是通过网上查找相关知识点才知道是怎么回事的。
import java.util.Scanner;
public class Main
{
public static void main(String[] args)
{
Scanner ljg=new Scanner(System.in);
String arr=ljg.nextLine();
char ch1,ch2,ch3;
int i=0,num=0,num1=0,num2=0,j,k=0,m;
for(i=0;i<arr.length();i++)
{
ch1=arr.charAt(i);
num++;
if(ch1=='0')
{
num1++;
}
}
if(num<11||num1==0)
{
System.out.printf("null data");
}
for(i=0;i<arr.length();)
{
ch1=arr.charAt(i);
if(ch1=='0')
{
num2=0;
m=i+10;
if(m>=arr.length())
{
break;
}
for(j=i+1;j<=i+8&&j<arr.length();j++)
{
ch2=arr.charAt(j);
if(ch2=='1')
{
num2++;
}
}
if(arr.charAt(i+10)!='1'&&(num2%2!=0&&arr.charAt(i+9)!='0'))
{
k++;
System.out.printf("%d:validate error\n",k);
}
else if(arr.charAt(i+10)!='1'&&(num2%2==0&&arr.charAt(i+9)!='1'))
{
k++;
System.out.printf("%d:validate error\n",k);
}
else if(arr.charAt(i+10)!='1')
{
k++;
System.out.printf("%d:validate error\n",k);
}
else if(num2%2!=0||(num2%2==0&&arr.charAt(i+9)!='1'))
{
k++;
System.out.printf("%d:parity check error\n",k);
}
else
{
k++;
System.out.printf("%d:",k);
for(k=i+1;k<=i+8&&k<arr.length();k++)
{
ch3=arr.charAt(k);
System.out.printf("%c",ch3);
}
System.out.printf("\n");
i=i+8;
}
}
i++;
}
}
}
这份代码还有好几个点没过,当时花了很多时间都没有通过就暂时放下了,现在看起来应该做一个格式判断的类,这样能更好的体现面向对象的思想,从该怎么去做到安排谁去做转变,看起来都是在完成一件事情但其实本质已经发生了改变。我所使用判断格式的方法是通过单个字符的方式去判断,非常麻烦而且效率低。暂时还没有掌握更好的办法,我发现C语言的一些处理方法用在这些题目上好多功能要做到特别困难,写到崩溃,Java的字符串类就好用多了,可以快速解决很麻烦的格式判断,省事很多。
7-3 String的格式判断与内容提取 ,题目已经表达的很清楚了,还是对格式的判断虽然这次测试点都通过了,但是代码量太大了,看了同学的一些方法,他们用了一些Java的方法,代码量减少了很多 ,几乎是我的一半,他们对Java这些类方法运用比较熟练,使得一些复杂的问题简单化了。
我分析了一下,我之所以会多这么多代码,就是一个测试点,判断每一个学号后空格是否输出,但我要先判断符合的学号有多少个,相当于一件事我重复做了两遍。就是使我的代码量直接翻倍,诸如一些subString之类的方法非常好用,于是我有把书上字符串这节再看了一遍,了解了一些基本的方法。 这次题目集7-1和7-2难度适中, 7-3难度比较大,对于我来说是一个挑战。
第三次题目集自己做的非常不好,7-1、7-2、7-3这三个题目卡我的点是格式的判断,正则表达式在CSDN上找了好久各说各的,真的不知道该怎么弄,导致这些题目后面没法做下去,后面一些测试点有些是比较常规的,解决了格式的问题我还是能通过更多的测试点,总的看7-1、7-2、7-3这三个题目都很复杂,难度已经比较大了,也给我造成了很大的压力。
这是7-1没办法之后用的C语言的办法,格式判断的测试点不能全部通过,所以后面的内容也无法进行。通过老师的讲解我知道了格式的判断不是我们认为的应该放在点类里的, 因为格式的判断时刻在发生变化,而类里面应该放入稳定的属性,用类来解决问题可以大大提高代码的重复性利用,7-1的点类可以用在7-2,7-2的线类可以用在7-3,有种安排别人做事就是很轻松的感觉! 还是得再去学学正则表达式,没想到Java的格式判断这么麻烦,确实有点难过了。
(2)改进建议:我认为自己的代码最大的改进的地方就是通过类来解决问题,而不是现在的过程化的代码,还有一些语句可以继续简化使代码更加的模块化。在格式判断与处理这个点上应该做一个类来做这件事 ,这样效率更高。
这是第二次作业的7-3代码分析,就用了一个主类, 就比较规规矩矩的解决了一些要求,也没用很复杂的结构,但思路还是比较清晰的,还算基本解决了问题吧。
这是一个错误的正则表达式的应用不能正确检测格式的正确,还没解决好怎样修改。
public class Main
{
public static void main(String[] args)
{
Scanner ljg=new Scanner(System.in);
String arr=ljg.nextLine();
char ch1,ch2,ch3;
int i=0,num=0,num1=0,num2=0,j,k=0,m;
for(i=0;i<arr.length();i++)
{
ch1=arr.charAt(i);
num++;
if(ch1=='0')
{
num1++;
}
}
if(num<11||num1==0)
{
System.out.printf("null data");
}
for(i=0;i<arr.length();)
{
ch1=arr.charAt(i);
if(ch1=='0')
{
num2=0;
m=i+10;
if(m>=arr.length())
{
break;
}
for(j=i+1;j<=i+8&&j<arr.length();j++)
{
ch2=arr.charAt(j);
if(ch2=='1')
{
num2++;
}
}
if(arr.charAt(i+10)!='1'&&(num2%2!=0&&arr.charAt(i+9)!='0'))
{
k++;
System.out.printf("%d:validate error\n",k);
}
else if(arr.charAt(i+10)!='1'&&(num2%2==0&&arr.charAt(i+9)!='1'))
{
k++;
System.out.printf("%d:validate error\n",k);
}
else if(arr.charAt(i+10)!='1')
{
k++;
System.out.printf("%d:validate error\n",k);
}
else if(num2%2!=0||(num2%2==0&&arr.charAt(i+9)!='1'))
{
k++;
System.out.printf("%d:parity check error\n",k);
}
else
{
k++;
System.out.printf("%d:",k);
for(k=i+1;k<=i+8&&k<arr.length();k++)
{
ch3=arr.charAt(k);
System.out.printf("%c",ch3);
}
System.out.printf("\n");
i=i+8;
}
}
i++;
}
}
}
第二次作业的7-2的代码对多个有效数据的使用没用通过,循环这里有些问题需循环变量表达式放的位置不一样结果就不一样,不理解,我认为效果应该一样结果却不一样。
(3)总结:通过本阶段三次题目集的练习,学到了Java的一些基本语法,理解了Java与C语言的本质的区别是思想的不同, 深刻体会到了面向对象在解决问题当中的优势与方便。 Java尤其对一些复杂度特别高,相互之间的关系特别复杂的问题有着天然的优势,这大大的简化了我们的编程, 这也是Java能够流行起来的重要原因。对一些题目解决的不顺利暴露出自己对Java类的不熟悉,在一些题目上发了很多时间效果并不好,走了很多弯路。接下来要积极转变面向过程的这种思想,否则连Java的入门都做不到,下一步继续了解更多类,明白它们各有什么功能和它们中的方法是实例方法还是静态方法,这也是我们能正确应用这些方法的关键。在这阶段的学习中,还是有很多收获的,起码知道了Java在解决问题中的优势,理解了将万物分类的重要性。这是我对面向对象思想的初步了解,相信在接下来的学习中我能更加体会到这种思想在解决问题中的重要地位。
大作业:我认为大作业截止时间过后应该最少提供一种正确思路的代码方案供同学们参考,否则我们有问题没法解决那这样的大作业又起到多大的作用呢,作业本来就是来帮助我们发现自己的不足和来提高自己的。 学习编程本来就是一个先模仿后自主的过程,一开始没有丰富的模板怎样更好的入门呢,如果一开始同学们就能自主的解决所有问题那这门课程还有开设的必要吗?直接布置任务让同学们自学就好了吧?
课程:还是像前面提到的那样,编程是用来解决实际问题的,希望在课堂上能有更多的实际问题的演示过程,这样的话课堂上的效果会更好,理论和实际相结合的方式应该是一种 很优秀的教学方式。