OOP第一次博客作业
一、关于Java&&面向对象
本学期刚开始进行Java的学习,也是刚开始了解面向对象,目前也就学习了三四周的样子,期间进行了三次作业,我感觉到Java的语法和c语言中的有许多相似之处,又不是完全相同,它有它自己的特色。
二、三次PTA作业
1.第一次pta作业
第一次作业总共八道题,由于刚开始,老师可能不太像打击我们,题目比较简单,参考教材上相应知识点通过自学就可以完成所有题目,我们需要自学数值数据类型和操作、if else语句,while循环,字符串以及一维数组,此自学内容由于之前学习过c语言,所以自学起来还是很容易理解和掌握的,要说有难度的就是最后一题,判断三角形的类型。此题考察选择语句与你的思维逻辑能力。(题目看下图)
出现过的BUG:
1.判断等腰直角三角形,浮点型的判断未用估计精度值来做判断
2.进入其中一种情况后,输出后没有退出程序,进行了其他判断
3.多层嵌套也出现了问题
不足:
if的嵌套过于多了,。。。就是if到底,圈复杂度太高了(垃圾代码),之后可以做优化。(看下图)
疯狂使用if语句,使得圈复杂度过于高,这都是纯体力劳动来的代码。
2.第二次PTA
第二次题目集作业总共包括五道题,包括ip地址转化,合并两个有序数组,判断闰年及星期几,求下一天及求前N天。题目集主要考察类与对象,同时让我们熟悉使用String类型,数组,以及选择语句,和循环语句。难度较上一次有小小的提升。
7-3 判断闰年及星期几
该题与第一次题目集最后一题相比,没有大量使用if语句,而是改换成了switch语句,switch语句在这题中大量使用,if语句也有少量的使用,复杂度依旧高的惊人。
在Main类中我也使用了较多的方法去实现不同的功能
public static void main(String[] args);//主方法;
public static boolean isLeapYear(int year) ;//判断year是否为闰年,返回boolean类型;
public static int numOfDays(int year,int month ,int day) ;//求出year-month-day到0001-1-1的距离天数,返回整型数;
public static String getWhatDay(int days) ; //根据天数返回星期几,其中参数days为天数,整型数,返回星期几的英文单词。
遇到的bug:
1.没有考虑到非法输入的情况。
2.没有将闰年的2月加上一天。
3.返回boolean型时是空
7-4求下一天
由于上一题复杂度较高,我将switch语句改写,降低了它的复杂度。
本题创建了一个类,
用如下代码改写:
public static boolean isLeapYear(int year){
boolean flag1=(year%4==0);
boolean flag2=(year%100!=0);
boolean flag3=(year%400==0);
boolean isLeapYear=((flag1&&flag2)||(flag3));
return isLeapYear;
}
public static boolean checkInputValidity(int year,int month,int day) {
int tianshu[]=new int[] { 31,28,31,30,31,30,31,31,30,31,30,31};
if(isLeapYear(year)) {
tianshu[1]=29;
}
先用public static boolean isLeapYear(int year) ;//判断year是否为闰年,返回boolean类型;采用数组的方式将每个月的总天数存起来,判断该年如果为闰年,则将二月份的天数改为29天,这远远降低了复杂度,就不需要用大量的选择语句去判断。
同样的,这道题我也使用了一些方法
public static void main(String[] args);//主方法 public static boolean isLeapYear(int year) ;//判断year是否为闰年,返回boolean类型 public static boolean checkInputValidity(int year,int month,int day);//判断输入日期是否合法,返回布尔值 public static void nextDate(int year,int month,int day) ; //求输入日期的下一天
7-5 求下N天
求下N天就只需要考虑其他的特殊月份,比如跨年的测试,闰年3月初,平年3月初,8月初,9月初,求下n天平年2月,求下n天闰年2月,求下n天闰年12月等。其他和上一题求下一天类似。
3.第三次PTA
本次题目集总共有三道题,题目数量较少,但是对我来说题目还是比较难的。第一题为创建一个账户类,第二题为创建一个日期类,第三题为一元多项式求导。
7-1 创建账户类Account
本题创建了一个类:
具体包括:
id:账号,私有属性,整型,默认值为0;balance:余额,私有属性,实型,默认值为0;annualInterestRate:当前利率,私有属性,实型,默认值为0,假设所有帐户均有相同的利率;dateCreated:账户开户时间,私有属性,LocalDate类型,默认为2020年7月31日;一个能创建默认账户的无参构造方法;一个能创建带特定id和初始余额的账户的构造方法;id、balance、annualInterstRate的getter及setter方法;dateCreated的getter方法;一个名为getMonthlyInterestRate()的方法返回月利率(月利率计算公式:余额*(年利率/1200));一个名为withDraw的方法从账户提取特定数额,当提取数额大于余额或为负数系统返回WithDraw Amount Wrong
提示;一个名为deposit的方法向账户存储特定数额,当存储数额大于20000元或为负数系统返回Deposit Amount Wrong
提示。
public class Main {
private int id;
private static double balance;
private static double annualInterestRate;
private Date dateCreated;
public Main() {
super();
dateCreated=new Date();
id=0;
balance=0;
annualInterestRate=0;
}
public Main(int id, double balance,double annualInterestRate) {
super();
dateCreated=new Date();
this.id = id;
this.balance = balance;
this.annualInterestRate=annualInterestRate;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public double getBalance() {
return balance;
}
public void setBalance(double balance) {
this.balance = balance;
}
public double getAnnualInterestRate() {
return annualInterestRate;
}
public void setAnnualInterestRate(double annualInterestRate) {
this.annualInterestRate = annualInterestRate;
}
public Date getDateCreated() {
return dateCreated;
}
public boolean withDraw(double money){
if(balance>=money&&money>=0){
balance -= money;
return true;
}
else
return false;
}
public boolean deposit(double money){
if(money>= 0&&money<=20000){
balance += money;
return true;
}
else
return false;
}
public static double getMonthlyInterestRate() {
return balance*(annualInterestRate/1200);
}
本题需要对类有充分的理解,明白且正确使用类的封装
7-3一元多项式求导
本题很难,在这道题上花费的时间比较长,这也是我们第一次接触正则表达式相关的知识,题目中涉及到表达式正确性的校验需要用正则表达式来进行,如果用if语句来判断的话,工作量太大,不一定写的完,所以在写这道题之前,我先自学了正则表达式的相关内容。到最后,我也没有全部通过测试点,在题目集结束后,我去问我完成的同学,很多同学都是强拆的,写了一百多行,也有更多的。题目在输入格式和输出格式上的要求也比较多。
我连前面的系数以及后面的指数都没有提取出来。
代码复杂度也比较高。
总结与心得
类与对向的理解:
对象:对象是类的一个实例,有状态和行为。例如,一条狗是一个对象,它的状态有:颜色、名字、品种;行为有:摇尾巴、叫、吃等。
类:类是一个模板,它描述一类对象的行为和状态。
类的封装的优点:1. 良好的封装能够减少耦合。
2. 类内部的结构可以自由修改。
3. 可以对成员变量进行更精确的控制。
4. 隐藏信息,实现细节。(私有属性)
正则表达式:
正则表达式有各种匹配规则。
对课堂模式的看法与建议:课堂采取的是线上线下相结合的模式。线上需自学相关Java内容,老师根据题目的完成情况讲解同学们所产生的各种问题, 这种课堂模式还是比较好的,大大增强了课堂效率。
收获:代码的编写过程一定要严谨,数据的处理也是十分重要的 ,一定要去测试代码,测试代码输入的合理性,这也是题目涉及到的非法输入的测试点。通过SourceMonitor我也知道了代码需要不断的优化,解决代码在提交时产生的运行超时的问题,所以优化代码也是十分重要的。三次作业 难度是逐步上升的 ,很多东西需要自学,这样也养成了自学的习惯和学会翻阅资料等。做题只靠老师讲的知识 远远不够,需要我们自己去查找资料。