不知不觉已经开始学习面向对象程序设计两个月了,先发一个小吐槽:每次作业刚发没多久,其他平台的作业也会接踵而至,老是忙的写不过来,一大堆作业压得我喘不过气(bushi),可能也是我自身问题吧,还没有适应好现在的学习进度,相对于其他班来说,我们老师给的作业还是算间隔时间较长的了,这么看来
老师还是挺好的,不是吗?
学了这么久面向对象程序设计,也做了有那么几道题目,感受到:面向对象和面向过程确实有很大的区别。就拿最近的一次实验上的作业来说:做一个学生学号成绩管理的模拟程序,如果说是让我面向过程程序设计的话,百八十行的代码就能把题目干玩,但使用面向对象的程序设计,我需要分析一个实验对象的各种属性和特征,还有它背后的学生相关信息的各种属性和特征。
就好像是面向过程程序设计是把难的问题逐步分解,拆成小问题,然后解决。
面向对象程序设计就像是把难的问题分析的很透彻,每一个类都思考清晰,然后在进行程序的编码。
分析问题感觉是所有学生的要害,总感觉我有哪里没想到,然后程序写得稀巴烂。
PTA大作业一
PTA大作业各题目分析
由于部分题过于简单,代码行数过于之少,在这就不一一列举出来了,挑几个具有代表性的题目。
7-1:
这道题紧紧围绕着当代青年人最在意的问题之一——身体质量指数(BMI),对于我们这些未来要当程序员的人来说,一直坐在电脑前疯狂敲击代码,反复测试自己写的代码写的是否有问题,功能是否完善,因此我们大多数时间都在进行指上运动(手指的一些运动),没有多少的时间去进行其他运动,我们相对于其他人来说更应该在意自身的BMI并更好的调节自身情况(不好意思,扯远了扯远了)。
由于是在pta平台上面完成本次作业,没有详细的类图(多半是题目过于简单,完全不需要那样设置),所以该题就拿文字的形式来叙述吧,以下是这道题的大致描述:
体重是反映和衡量一个人健康状况的重要标志之一,过胖和过瘦都不利于健康,BMI(身体质量指数)计算方法:体重(以千克为单位)除以身高(以米为单位)的平方。中国成人正常的BMI应在18.5-24之间,如果小于18.5为体重不足,如果大于等于24为超重,大于等于28为肥胖。请编写程序,测算身体状态。按照以上运算数据进行参考,看来我们确实得好好调节自身情况了不是吗(bushi,又扯远了....)
回归主题,根据以上题目大致信息以及题目要求(1.体重的世界纪录是727公斤,身高的世界纪录是2.72米。输入数据上限不得超过纪录,下限不得小于等于0
2.输入数值超出范围 :输出“input out of range”。例如:-2 3或者125 5。
3.BMI小于18.5 :输出“thin”。
4.BMI大于等于18.5小于24 :输出“fit”。
5.BMI大于等于24小于28 :输出“overweight”。
6.BMII大于等于28 :输出“fat”。)
根据以上题目要求,我们可以设定大致框架
定义出题目中需要的数据,再根据题目要求,进行详细代码的编写:
代码编写:
根据题目中的6项要求,可以编写以下代码进行判断:
通过相关数值的输入以及计算公式对最终结果BMI的运算,我们可以得到以下结果:
输入格式1:
-2,8
输出格式1:
input out of range
输入格式2:
70,1.75
输出格式2:
fit
相关功能都得到了相应解决,因此本道题算是圆满结束了(在此也多插一句话,能多运动还是要多运动的,身体的是自己,好好对待)。
7-5:
当代年轻人都喜欢玩游戏,游戏,通过程序员日以继夜打出来的上万甚至更多的代码进行大致框架的设定,并通过一次又一次的查找bug与解决以及完善相关功能最终呈现在世人的眼前,作为java软件的初学者,距离制作游戏这一步目前来说还是有些遥远,但是我们依然可以通过一些简单的代码编辑实现部分功能的运作。
编写游戏角色选择程序:
题目要求:1.四个种族(1.人类、2.精灵、3.兽人、4.暗精灵)
2.三种职业(1.战士,2.法师,3.射手)
3.两个整数:游戏种族、角色的选项,以空格分隔。例如:1 2。
4.若输入数值超出选项范围,输出“Wrong Format”
根据题目要求的描述,在此可以运用switch语句进行相关功能的实现:
代码编写:
以上是本题代码的主要部分,其余部分多于基本框架。
PTA大作业2
相对于大作业一来说,大作业二的难度简直在一的基础上上升了好几个程度,以至于刚接手的时候一脸茫然无从下手,不过通过查找相关资料以及老师的讲解,对于题目的结构分析以及框架设定有了更全面的了解。
pta大作业2题目分析
7-2:
说实话刚看到这题的时候,人有点懵,咋通过代码的形式调出字符串中某一区段的信息,比如题目中说某一个字符串哔哩吧啦的好几十个,如何通过代码的形式将第xx个信息提取并输出出来,然后再对后八位的数字进行判断并输出,在此先提一下新出现的知识点(substring(m,n):调用字符串中的第m-1到第n-1个的字符并提取出来)
这道题属实是给我整不会了(放过我吧,我还只是一个刚接触java的孩子),先看一下SourceMonitor的图
检查该行字符串中是否又出现0,每出现一个零后,再提取出0后面的八位数字,根据题目规定测定属于哪种类型,测定完成后输出相对应的结果
圈复杂度为17!!!!!
这个看起来很高级,但是对于现在的我来说有些许看不太懂,但是我觉得看起来牛逼就完事了。
public static void main(String[] args);//主方法
核心代码分析
Scanner sc = new Scanner(System.in);
String s = sc.nextLine();
int i=0;
int m=0;
boolean bool = true;
if(s.length()<11){
System.out.print("null data");
}
else{
for(i=0;i<s.length();i++){
if(s.substring(i,i+1).equals("0")) {
bool=true;
break;
}
else
bool=false;
}
}
if(bool==true){
int a=1;
for(i=0;i<s.length();i++){
if(s.substring(i,i+1).equals("0")) {
for(int j=i+1;j<i+9;j++){
if(s.substring(j,j+1).equals("1"))
{
m++;
}
}
if(s.substring(i+10,i+11).equals("1")){
if((s.substring(i+9,i+10).equals("1")&&m%2==1)||(s.substring(i+9,i+10).equals("0")&&m%2==0)){
System.out.println(a+":parity check error");
a++;
i+=10;
}
else{
System.out.println(a+":"+s.substring(i+1,i+9));
a++;
i+=10;
}
}
else {
System.out.println(a+":validate error");
a++;
i+=10;
}
}
}
}
else
System.out.println("null data");
标红的地方都是核心代码了(对我来说这整篇可能都是核心代码,没见过这样的题,真的难,我真的会谢)。
由于pta上没有详细指出每个测试点的需求是什么,导致在很多次的改写代码以及运行代码的过程中,仍未找到相应错误,这也使得我未能取得到本题的最后五分,可惜可惜,下次这五分必拿!
优点:
怎么说呢,相对于原来的判断真假值(1 or 0)中,运用boolean值使得整个代码更贴近java的正常运行中去。
缺点:
每一个测试点需要多次重复相同的语句,导致写出程序之后程序行数过多,看起来很复杂,很累,无法一下子找到关键语句,对日后反复优化造成不必要的影响。
PTA大作业3
pta大作业2题目分析
7-1
对于这道题来说,我感觉有手就行(bushi,莫名自信ing)
圈复杂度22!!!!(又创新高,但是我不知道这有啥用)
public static void main(String[] args);//主方法
核心代码展示:
boolean bool = true;
Scanner sc = new Scanner(System.in);
String b = sc.nextLine();
String s[] = b.split(" ");
若输入格式非法,输出"Wrong Format"。
若输入格式合法但坐标点的数量超过两个,输出“wrong number of points”。
正常条件下以double形式输出结果。
优点:
本题代码与前一题大致相同,都用的boolean语句,可以更好的分开真与假,更好的分隔之后进行的语句。
缺点:
还是一样的问题,反复使用 if - else 语句,导致代码执行度不高,执行时间长。
7-2
题目要求:
1:输入两点坐标,计算斜率,若线条垂直于X轴,输出"Slope does not exist"。
2:输入三个点坐标,输出第一个点与另外两点连线的垂直距离。
3:输入三个点坐标,判断三个点是否在一条线上,输出true或者false。
4:输入四个点坐标,判断前两个点所构成的直线与后两点构成的直线是否平行,输出true或者false.
5:输入四个点坐标,计算输出前两个点所构成的直线与后两点构成的直线的交点坐标,x、y坐标之间以英文分隔",",并输出交叉点是否在两条线段之内(不含四个端点)的判断结果(true/false),判断结果与坐标之间以一个英文空格分隔。若两条线平行,没有交叉点,则输出"is parallel lines,have no intersection point"。
初见此题心得:
初看题目,看到此题感觉与7-1的题目差不了多少,如果说上一题是有手就行,那么这一题算上具体内容的话,我只感觉,我靠,我手呢,我怎么没有手,一连串的任务点以及一大串的if-else语句把我的头都整懵了,直到最后都还是以混分来结束这段”罪恶“的经历。
度量分析
圈复杂度为6
public static void main(String[] args);//主方法
说实话到现在我还不太清楚如何进行相关算法的设定以及整体框架的建设,以至于到最后只能进行混分式处理,能拿多少分算多少分,对于这个题目我也对我自身对于java的学习有了新的认知,学习深度还不够,还需要在此多多钻研,希望自身能在之后的学习过程中达到更高的水准。
优点:
进行最最最初始化的设定,以达到最基本的任务点要求。
缺点:
无法详细的将题目的全部过程完整的展现出来,而且同以上题目一样,大量使用if-else语句,导致执行时间过长,代码执行度不高。
7-3:
题目要求:
1:输入三个点坐标,判断是否是等腰三角形、等边三角形,判断结果输出true/false,两个结果之间以一个英文空格符分隔。
2:输入三个点坐标,输出周长、面积、重心坐标,三个参数之间以一个英文空格分隔,坐标之间以英文","分隔。
3:输入三个点坐标,输出是钝角、直角还是锐角三角形,依次输出三个判断结果(true/false),以一个英文空格分隔,
4:输入五个点坐标,输出前两个点所在的直线与三个点所构成的三角形相交的交点数量,如果交点有两个,则按面积大小依次输出三角形被直线分割成两部分的面积。若直线与三角形一条线重合,输出"The point is on the edge of the triangle"
5:输入四个点坐标,输出第一个是否在后三个点所构成的三角形的内部(输出in the triangle/outof triangle)。
必须使用射线法,原理:由第一个点往任一方向做一射线,射线与三角形的边的交点(不含点本身)数量如果为1,则在三角形内部。如果交点有两个或0个,则在三角形之外。若点在三角形的某条边上,输出"on the triangle"。
度量分析:
圈复杂度6
public static void main(String[] args);//主方法
对于这个题目,以目前我java的学习进度来说还是有着很大困难的,如同上题一样只能采用混分的方式进行相应任务点的得分,在之后的学习中我也会更多的投入到java的学习当中,学习更多的专业知识。
优点:
进行最最最初始化的设定,以达到最基本的任务点要求。
缺点:
无法详细的将题目的全部过程完整的展现出来,而且同以上题目一样,大量使用if-else语句,导致执行时间过长,代码执行度不高。
学习总结:
说实话,自己写出了不少的错误,主要的原因是没有进行足够严格的测试,PTA上的测试点我又不知道它测了什么,所有的测试点都是通过自己一下一下慢慢摸索出来的。通过近长达两个月的java课程学习,我对java的初始运用有
了一个基础的了解,相对于c语言来说,java给了我们更多的选择空间进行代码的编写,并且也让我们更加体会到了未来当程序员的时候,面对客户的需求,面对客户所提出的一些问题,我们该如何通过代码的方式进行解决,并依次实现相
应功能是有多么难,希望自己之后能花更多的时间在java的学习上,老师上课讲的东西很少,但是很精;java的大多数东西都是靠自学学的,我认为这也是培养能力的一种方式,这才叫主动学习。
走了些弯路,花了不少时间,希望以后可以更加面向对象。