前言:总结三次题目集的知识点、题量、难度等情况
知识点:
题目集01:
7-1:身体质量指数测算
1.动态输入一个double类型变量 “double weight = input.nextDouble();”
方法:
public static double countBMI(double tall,double weight){
double BMI = 0;
BMI = weight / Math.pow(tall,2);
return BMI;
}
调用此方法:
double BMI = countBMI(tall,weight);
7-2:长度质量计量单位换算
System.out.println(countChange2(weight)+" "+countChange1(loong));
float a = (float)inch;
7-3:奇数求和
int[] b = new int[10];
7-5:游戏角色选择
7-6:学号识别
题目集02:
7-1:字母数字转换
7-2:串口字符解析
题目集03:
7-1:用类解一元二次方程
7-3:聚合一
day.getMonth().getYear().isLeapYear();
7-4:聚合二
类之间调用的关系优于聚合一,是聚合一的优化版本。
题目集01题目较多,考核方向偏向于基本的java的一些代码、方法的用法
题目集02题目较少,考核重点为输入字符串,并对字符串做变换或判断,考察对字符串创建,及判断其中某个或多个字符
题目集03题目最少难度也最高,考察的知识是类之间的关系及相互调用,是面向对象程序设计的基础,创建的类繁多且复杂
(2)设计与分析:重点对题目的提交源码进行分析
SourceMonitor有关度量值知识信息摘抄
度量值
1. 总行数(Lines)
包括空行在内的代码行数。
2. 语句数(Statements)
语句是以分号结尾的。分支语句if,循环语句for、while,跳转语句goto都被计算在内。
3. 分支语句比例(Percent Branch Statements)
该值表示分支语句占语句数目的比例,这里的“分支语句”指的是使程序不顺序执行的语句,包括if、else、for、while、break、continue、goto、switch、case、default和return。需要注意的是,do不被计算在内,因为其对应的while已经计算了。另外,异常处理的catch也被作为一个分支计算。
4. 注释比例(Percent Lines with Comments)
该值指示注释行(包括/*……*/和//……形式的注释)占总行数的比例。一般公司会对每个文档的header或者footer部分进行特殊的声明注释,可以再工程属性中设置过滤,不计算在内。
5. 类个数(Classes)
包括class的个数。
6. 平均每个类方法数(Methods per Class)
平均每个类的方法数,即包括内联和非内联的,template函数在内的类方法数除以所有类的个数。
7. 函数个数(Functions)
所有函数的个数。
8. 平均每个函数包含的语句数目(Average Statements per Method)
总的函数语句数目除以函数数目得到该值。
9. 函数圈复杂度(Function Complexity)
圈复杂度指示一个函数可执行路径的数目,以下语句为圈复杂度的值贡献1:if/else/for/while语句,三元运算符语句,if/for/while判断条件中的"&&"或“||”,switch语句,后接break/goto/ return/throw/continue语句的case语句,catch/except语句等。对应有最大圈复杂度(Max Complexity)和平均圈复杂度(Avg Complexity)。
10. 函数深度(Block Depth)
函数深度指示函数中分支嵌套的层数。对应有最大深度(Max Depth)和平均深度(Avg Depth)。
题目集02
7-2
根据Kiviat图分析有四个维度的实际测量值超出了期望值范围,应该更加注重一些边界测试和其他细节上如“数据第几位的校验”。
题目集03
7-1
有其中四个实际测试值低于期望值,第一次接触根据主方法来补充类的题型难免有些无措,但是这道题比较简单只需要掌握返回值得方法的写法即可
7-2
本题代码中有两个维度实际测试值超出期望值,在AVG depth、max complexity平均复杂程度 和最大复杂程度上超过了期望值,应该减少for、if等循环、判断语句的嵌套层数以减少代码的复杂程度。
7-3
最大复杂程度实际测试值超出期望值依然是存在的问题,本题一些方法的创建与第二题大体相似,在类图设计上这种聚合的关系我认为相对复杂,在类DateUtil中调用类Year中的方法时书写起来十分麻烦。
而聚合二的这种聚合关系我认为更好。
(3)采坑心得:对源码的提交过程中出现的问题及心得进行总结
题目集01:
7-1:身体质量指数测算
有时候经常忘记什么地方是空格什么地方用“. ”连接:Scanner input = new Scanner(System.in);
有时候调用方法会忘记声明其中的参数double BMI = countBMI(tall,weight);
记得当时还不会用乘方的方法,现在记住了
7-2:长度质量计量单位换算
做的时候还是没记住空格在哪”.”在哪(Ps。现在肯定知道了)double weight = input.nextDouble();
输出要求中2数据要以空格隔开,输出时文字要用“ ”而方法却不用
System.out.println(countChange2(weight)+" "+countChange1(loong));
声明变量是double类型,但是方法要求返回flout类型,所以在return之前将double型转为flout型
float b = (float)pound; return b;
7-3:奇数求和
后面[ ]中写的是数组的长度int[] b = new int[10];
7-4:房产税费计算
有事粗心大意if语句中判断时少一个“=”
输出时数据精度不符合标准时要用flout转换
7-5:游戏角色选择
有时候调用这个方法会忘记写input,I也可能会忘记大写 int player = input.nextInt();
7-6:学号识别
用于判断字符串长度
2.str.charAt(2)==2
判断字符串中第2位是不是2,因为是在字符串中所以str.charAt(2)=='2'要加单引号
7-7:巴比伦法求平方近似值
1. while(Math.abs(nextGuess-lastGuess)>=0.00001)
Math.abs()计算变量平方的方法
7-8二进制数值提取
判断字符串某位字符是不是“-”或者其他时候要加单引号
7-7:判断三角形类型
可以这样一起输入double型变量
题目集02
7-1字母数字转换
toCharArray()将字符串转换为字符数组
字节数组用ASCLL码来判定字母的大小
println 在输出之后会有一个换行而print却没有
题目集03
7-1用类解决一元二次方程
public class Main {
public static void main(String[] args){
.......
}
}
class QuadraticEquation{
}
除void外如果没有return 值 都会报错
3.public QuadraticEquation(double a,double b,double c){
this.a = a;
this.b = b;
this.c = c;
}
变量名重复时在方法中要用this定义,来区分当前对象。
7-2:日期类设计
int[] m1 = new int[]{0,31,29,31,30,31,30,31,31,30,31,30,31};
int[] m2 = new int[]{0,31,28,31,30,31,30,31,31,30,31,30,31};
while((isLeapYear(year) && n>366) || (!isLeapYear(year) && n>=365)){
if(isLeapYear(year)){
n-=366;
year--;
}
else{
n-=365;
year--;
}
}
for(int k=month;k<=12;k--){
if(isLeapYear(year) && n>=m1[k]){
n=n-m1[k];
month--;
n--;
if(month<1){
year--;
month=12;
k=13;
}
}
else if(!isLeapYear(year) && n>=m2[k]){
n = n-m2[k];
month--;
if(month<1){
year--;
month=12;
k=13;
}
}
else{
day=day-n;
if(isLeapYear(year) && day<0){
month--;
day=m1[k]+day;
}
else if(!isLeapYear(year) && day<0){
month--;
day=m2[k]+day;
}
break;
}
}
不仅篇幅过长、繁杂还会有超时的问题,还容易造成计算结果错误,算法经过改进后,改变了原有的思路和逻辑从新的出发点去看待这个问题
for (int i = 0; i < n; i++) {
day--;
while (day < 1) {
month--;
if (month < 1) {
month = 12;
year--;
}
if(isLeapYear(year)){
day=m1[month];
}
else{
day=m2[month];
}
}
}
这样大大缩短了篇幅,还避免了复杂的计算过程带来的不必要麻烦
2. public String showDate(){
return String.format("%d-%d-%d",year,month,day);
}
在做这个方法之前不知道如何按照要求的格式去返回题目所需要的值,String.format()可以对字符串进行加工,最终得出我们想要的格式
3. public boolean equalTwoDates(DateUtil date){
if(year == date.year || month == date.month || day == date.day) {
return true;
}
else {
return false;
}
} 调用类创造一个新的对象,新对象中的变量,需要这样来使用如:date.year
7-3聚合一
7-4聚合二
如图,(上图是聚合二,下图是聚合一)
我们可以发现原本在类Day类Month类Year中的方法到聚合二中有明显变少,而类DateUtil中的方法却明显变多,类Day类Month类Year中有许多功能相似的方法,因此在聚合二中减少了像聚合一中的套娃行为,只需getYear().isLeapYear()如此就可以调用类Year中的方法。
(4)改进建议:对相应题目的编码改进给出自己的见解,做到可持续改进
题目01
这次的题目集,思路较为清晰,难度较低,相较于在main方法中计算,我选择在main方法外自己创建了一个方法来计算题目所需的数据,这样一来逻辑变得更加简单,我认为增加了可读性,并且对于初学java如何创建方法、调用方法起到了一定的帮助。如7-1:
public static double countBMI(double tall,double weight){
double BMI = 0;
BMI = weight / Math.pow(tall,2);
return BMI;
}
题目02
7-2:串口字符解析
if(zo.charAt(i+10)=='1'){
System.out.print(k);
System.out.print(":");
System.out.print(zo.charAt(i+1));
System.out.print(zo.charAt(i+2));
System.out.print(zo.charAt(i+3));
System.out.print(zo.charAt(i+4));
System.out.print(zo.charAt(i+5));
System.out.print(zo.charAt(i+6));
System.out.print(zo.charAt(i+7));
System.out.print(zo.charAt(i+8));
System.out.println();
k++; }
可以用for循环来代替中间连续多次的输出语句,如
for(int b=i+1;b<=1+8;b++){
System.out.print(zo.charAt(b));
}
题目03
7-2
在判断前n、后n天时由于year的取值范围n的取值范围很大,我一开始选择从年入手以年换算成天计算,在以月换成天计算,再算剩下的天数,因此在这段代码中用到了多个循环及若干if语句,这种计算方法经过多次修改才得以返回正确的数据而且还险些超时,而且并不适用于7-3题,经过修改我改为以天计算通不断累加的方式来计算结果。
for (int i = 0; i < n; i++) {
day--;
while (day < 1) {
month--;
if (month < 1) {
month = 12;
year--;
}
if(isLeapYear(year)){
day=m1[month];
}
else{
day=m2[month];
}
}
}代码的篇幅不仅大幅缩短而且逻辑也更加清晰简单。
(5)总结: