南昌第二深情学习java 题目集1~3的总结
作者:互联网
前言:总结三次题目集的知识点、题量、难度等情况
知识点:
题目集01:
7-1:身体质量指数测算
1.动态输入一个double类型变量 “double weight = input.nextDouble();”
- 方法调用(自己创建的方法来计算BMI)
方法:
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:奇数求和
- 声明长度为10的数组
int[] b = new int[10];
7-5:游戏角色选择
- int race = input.nextInt();(int型输入)
7-6:学号识别
- String str = input.nextLine();(字符串输入)
- str.charAt(2) ,读取字符串数组中第2位置的字符
- str.charAt(2)=='0' ,0虽然是数字但在字符串中是字符在判断时需要用‘ ’
题目集02:
7-1:字母数字转换
- byte words[] = new byte[cs.length];
7-2:串口字符解析
- String zo = input.nextLine();
题目集03:
7-1:用类解一元二次方程
- 构造方法
- this :访问成员变量
- 主意返回类型一致
7-3:聚合一
- 类图中菱形加实线箭头代表聚合关系
- 在一个类中调用其他类中函数,要顺着聚合关系一层一层调用
day.getMonth().getYear().isLeapYear();
- if(!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);
有时候经常忘记什么地方是空格什么地方用“. ”连接:Scanner input = new Scanner(System.in);
- double BMI = countBMI();
有时候调用方法会忘记声明其中的参数double BMI = countBMI(tall,weight);
- Math.pow(tall,2);
记得当时还不会用乘方的方法,现在记住了
7-2:长度质量计量单位换算
- double weight = input next.Double();
做的时候还是没记住空格在哪”.”在哪(Ps。现在肯定知道了)double weight = input.nextDouble();
- System.out.println(countChange2(weight)+countChange1(loong));
输出要求中2数据要以空格隔开,输出时文字要用“ ”而方法却不用
System.out.println(countChange2(weight)+" "+countChange1(loong));
- double pound = 0;
声明变量是double类型,但是方法要求返回flout类型,所以在return之前将double型转为flout型
float b = (float)pound; return b;
7-3:奇数求和
- int[] b = new int[ ];
后面[ ]中写的是数组的长度int[] b = new int[10];
7-4:房产税费计算
- if(time=1)
有事粗心大意if语句中判断时少一个“=”
- System.out.println((float)q+" "+(float)y+" "+(float)j+" "+(float)c);
输出时数据精度不符合标准时要用flout转换
7-5:游戏角色选择
- int player = nextInt();
有时候调用这个方法会忘记写input,I也可能会忘记大写 int player = input.nextInt();
7-6:学号识别
- str.length()
用于判断字符串长度
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二进制数值提取
- while(str.charAt(i)!='-' )
判断字符串某位字符是不是“-”或者其他时候要加单引号
7-7:判断三角形类型
- double x = input.nextDouble(), y = input.nextDouble(), z = input.nextDouble();
可以这样一起输入double型变量
题目集02
7-1字母数字转换
- char cs[] = str.toCharArray();
toCharArray()将字符串转换为字符数组
- byte words[] = new byte[cs.length];
字节数组用ASCLL码来判定字母的大小
- println与print
println 在输出之后会有一个换行而print却没有
题目集03
7-1用类解决一元二次方程
- 在创建Main class以外的class时要注意 { }的位置自己创建的class是在Main class外面的
public class Main {
public static void main(String[] args){
.......
}
}
class QuadraticEquation{
}
- 在类中创建方法时要注意返回的类型double、int.....或者是void不返回值
除void外如果没有return 值 都会报错
3.public QuadraticEquation(double a,double b,double c){
this.a = a;
this.b = b;
this.c = c;
}
变量名重复时在方法中要用this定义,来区分当前对象。
7-2:日期类设计
- 在日期类中创建的方法getPreviousNDays()中的内存超时
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聚合一
- 怎么看类图,菱形连接实线的箭头指向的是聚合关系,聚合关系是两个类:类A、类B,然而类B包含于类A,类A是整体然而类B是部分,换言之就是类A类B不是平级关系,因此在调用类B中方法时就要先调用类A:A.B.方法()。
- 在本题中,题目要求创建四个类分别是DateUtil、Day、Month、Year,而他们之间的关系是Year包含于Month,Month包含于Day,Day又包含于DateUtil。因此当我想要在类DateUtil中调用类Year中判断平润年的方法isLeapYear()时:day.getMonth().getYear().isLeapYear();当然这是我们在DateUtil类中调用方法isLeapYear()不用加上date(调用DateUtil类创建的对象)当然当我们在主方法中调用时就需要加上“date.”
- 当我们如上调用某个方法或是变量时就会很复杂,但是在eclipse中当我们输入类加“.”时就会提示我们这个类中我们所创建过的方法。虽然如此,但是还是免不了一番麻烦,所以在聚合二中进行了改进。
7-4聚合二
- 在聚合二中依然是那四个类,但是这次不同的是类Day类Month类Year都包含于类DateUtil中,不同之处也是显而易见的
如图,(上图是聚合二,下图是聚合一)
我们可以发现原本在类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)总结:
- 初步熟悉掌握运用java语言来编写一些简单的程序,还有java中不同于c语言中的书写规范如{ }的位置规范
- 学会了类的创建、调用类创建新的对象、调用其他类中的方法、对象、变量等
- 熟悉并掌握了一些java中常见且常用的方法
- 一些基础知识还并未完全掌握如String的一些常用方法输入等,继承中子类与父类关系,子类调用父类,等继承与多态方面要加强,看网课抄录所讲例题代码然后自己解读代码的含义,多看一些关于继承多态的文章论文,参与一些网络论坛等讨论活动。
- 网课上课的状态需要一直保持,使用电脑手写笔记相结合的方式进行记录,并在课后稍加整理
- 在课余时间去csdn以及一些开源的网站上看一些前辈大佬写的一些适合我们新阶段对于java学习有帮助的代码进行自行解读、标注理解、整理然后是实践在eclipse打出来然后纠错调试
- 尽快完成pta及实验等任务,空出更多的时间可用来总结pta上的一些问题,以便于下次总结时有充足的材料。
标签:语句,java,int,double,month,深情,year,题目,day 来源: https://www.cnblogs.com/No-2Shenqing/p/16124614.html