一.前言(总结三次题目集的知识点、题量、难度等情况)
题目集1题量较大,难度较低,主要考察基本数据类型的数学运算;
题目集2题量较小,但是7-2有一定难度,需仔细阅题和分析;主要考察输入输出,对输入数据的分析处理;
题目集3题量较小,难度提升。需要完成的时间并不比题目集1,2要小,同样应该严格按照题目要求来。主要考察对类的掌握,包括类的属性方法和类与类之间的关系。
二.设计与分析
题目集1:
7-1: 身体质量指数(BMI)测算;
7-2:长度质量计量单位换算;
7-3:奇数求和 ;
7-4:房产税费计算2022 ;
7-5:游戏角色选择 ;
7-6:学号识别;
7-7:巴比伦法求平方根近似值;
7-8: 二进制数值提取;
7-9:判断三角形类型 ;
题目集1偏向简单和基础(虽然我没有拿到满分)。考察类型有,if语句和for循环,简单的输入输出,和基本数据类型的运算,对接收的数据的分析处理,对合法和非法输入的理解掌握。基本可以用在C语言的经验解决,基本都和数学运算有关。
题目集2:
7-1:字母-数字转换
7-2:串口字符解析
7-3: String的格式判断与内容提取
题目集2对输入输出掌握有了更高的要求。注意java 里String类要用charAt(i)方法单个输出字符,或者定义一个char类型数组,char[] c= str.toCharArray();其实不算很难,但偏偏7-2跪了。这里分析一下。
我觉得很重要的原因是题目看了,但没有完全看懂,导致理解上出现偏差,错误点分散。
我的理解点如下:
每出现一次起始位,将当前位和后十位的部分复制到新的char 数组再来分析
1.数据小于十一位或者未起始位,输出"null date";
2.输出“parity check error”的情况:奇偶校验不合格,即八位有效数据全为"1"
(个人猜测可能是这一步错了)
3.输出“validate error”的情况:
a.该组数据结束位为0
b.该组数据结束符为0且奇偶校验不合格
4.正常的输出:改组数据足11位且结束为1,有效数据不全是“1”
题目集3:
7-1:用类解一元二次方程式
7-2:日期类设计
7-3:日期问题面向对象设计(聚合一)
7-4: 日期问题面向对象设计(聚合二)
题目集3的7-1是四个中比较简单的,定义一个名叫“QuadraticEquation”的类,计算实数根的数量和根的值并返回,该类需要写的方法在主方法中可以找到。
7-2设计一个日期的类“DateUtil”,需要写的方法在题目中有明确要求,照做就行了。
我的源码如下
class DateUtil {
int year;
int month;
int day;
// int n;
int sum;
int[] daymax= {31,28,31,30,31,30,31,31,30,31,30,31};//该月份天数
int getYear() {
return year;
}
int getMonth() {
return month;
}
int getDay() {
return day;
}
DateUtil(int year,int month, int day){
this.year=year;
this.month=month;
this.day=day;
}
public boolean checkInputValidity() {
boolean x=false;
if(year<=2020&&year>=1820) {
if(month>=1&&month<=12) {
if(day>=1&&day<=daymax[month-1]) {
x=true;
}
}
}
if(isLeapYear(year)&&month==2&&day==29)
x=true;
return x;
}
public boolean isLeapYear(int year) {
boolean x=false;
if((year%4==0&&year%100!=0)||year%400==0) {
x=true;
}
return x;
}
public DateUtil getNextNDays(int n) {//取得year-month-day的下n天日期
int newyear=this.year;
int newmonth=this.month;
int newday=this.day;
for(;n>0;n--) {
if(isLeapYear(newyear)&&newmonth==2&&newday==28)//闰年2月28号
newday++;
else if(isLeapYear(newyear)&&newmonth==2&&newday==29){//闰年2月29号
newday=1;newmonth++;
}
else if(newday<daymax[newmonth-1])
newday++;
else if(newmonth<12) {
newmonth++;
newday=1;
}
else if(newmonth==12) {
newyear++;
newmonth=1;
newday=1;
}
}
return new DateUtil(newyear,newmonth,newday);
}
public DateUtil getPreviousNDays(int n) {//取得year-month-day的前n天日期
int newday=this.day;
int newmonth=this.month;
int newyear=this.year;
for(;n>0;n--) {
if(newday>1)
newday--;
else if(newmonth>1) {
newmonth--;
if(isLeapYear(newyear)&&newmonth==2)
newday=29;
else
newday=daymax[newmonth-1];
}
else {
newyear--;
newmonth=12;
newday=daymax[newmonth-1];
}
}
return new DateUtil(newyear,newmonth,newday);
}
public boolean compareDates(DateUtil date) {//比较当前日期与date的大小(先后)//如果date的日期更大(后),返回true
boolean dt=false;
int dy=0;
if(date.year==this.year) {
if(date.month==this.month) {
dy=date.day-this.day;
}
else
dy=date.month-this.month;
}
else
dy=date.year-this.year;
if(dy>0)
dt=true;
return dt;
}
public boolean equalTwoDates(DateUtil date) {//判断两个日期是否相等
boolean dt=false;
if(date.year==this.year)
if(date.month==this.month)
if(date.day==this.day)
dt=true;
return dt;
}
public int getDaysofDates(DateUtil date) {//求当前日期与date之间相差的天数
int i=0;
if(equalTwoDates( date))
return i;
else if(compareDates( date)) {//date更晚
for(int n=1;;n++) {
if(equalTwoDates(date.getPreviousNDays(n)))//n天前两日期相等
return n;
}
}
else {//date更早
for(int n=1;;n++) {
if(equalTwoDates(getNextNDays(n)))//n天后两日期相等
return n;
}
}
}
public String showDate() {//以“year-month-day”格式返回日期值
String str = String.valueOf(this.year+"-"+this.month+"-"+this.day);
return str;
}
}
但是在“下n天的整型数最大值测试”里运行超时了。
7-3也是题目明确要求了类的的属性和方法
相比7-2,要求更详细,而且类也分成了好几个,优点是方法更为简短,职责明确。
三.踩坑心得
1.在使用eclipse时因为不熟练常常出现一些操作性问题,伤害不大,但是烦人又费时
2.不会设置测试用例,面对多且杂的测试点一筹莫展,只会把源码看一遍又一遍。好在老师前几天讲课讲了如何设置测试点,很有帮助
3.一定要仔细审题
4.不能太拖拉,不会的东西一定要搞懂。对于一些没有通过的地方,本来是准备躺平了,没想到一个blog作业把我踩起来了,而且对于拖拉的人真的有一定的震慑作用。
四.改进建议
降低耦合度,模块的功能设计得尽可能单一,属性和方法少用public,多用private,还有就是避免把一个类作为另一个类的属性。
五.总结
学到了java的一些基本操作,了解了Java输入输出,熟悉了一遍C语言中学过的if语句和for语句,明白了如何创建class,以及浅显地理解了类和C语言函数的不同之处。在设计测试用例和类间关系的掌握上有明显不足,都要下去慢慢研究。