oop第一次博客作业

发布时间 2023-03-26 16:13:03作者: xujingyi01

一.前言

第一、二次作业

涉及知识点

考察:1.如何使用Scanner类从键盘读取数据;声明变量和赋值;使用八种基本类型
2.选择语句,if-else/else if、switch的使用;循环语句,for、while语句的使用
3.输出的几种方式:println,print,printf;
4.强制类型转换
5.String类的使用
创建对象:(String str = new String(“hello”)、String str = input.next())
比较两个字符串是否相等:str1.equals(str2)、str1.equals(“hello”)
Char类型与String的转换:String s1=input.next();
char[] a=s1.toCharArray();
String类的一些常用方法:str.length()、str1.equals(str2)、s1.substring(0,1)、s1.substring(3)、s1.toCharArray()、s1.indexOf(s2)、String[] arr = gps.split(",")
输入字符串:String s1 = input.next()、String s1 = input.nextLine()
输入字符串的几种方法:直接定义String str = “abcd”; 键盘输入String str = input.next(); String str = input.nextLine(); String str = new String(“hello”);
6.使用数组:int[] a = new int[n];
7.使用Math类,如Math.pow、Math.abs()<=0.001来判断一个浮点数的精确度(浮点误差)
8.在类中使用方法,pubilc static + 类型 + 方法名 + (类型 + 参数),类型包括引用类型和基本类型
9.四舍五入保留整数:使用(int)(x + 0.5)

题量和难度

第一、二次作业题量都比较多,除了第一次作业数据处理的那题花了很长的时间,其他题目难度都相对比较小。

第三次作业

涉及知识点

考察:1.使用类:创建对象(new Circle()),调用方法(circle.getRadius())
2.使用包:import语句,import.java.util.Scanner
3.类:类名、属性、方法
4.构造方法:可重载,但参数需不同;对属性进行初始化;为对象申请空间
5.属性:私有 方法:公有
6.类与类之间的关系:组合,聚合,依赖,关联
7.修饰符:public、private、static
8.实例方法和静态方法(用static修饰)
静态方法/变量可以通过类名访问
9.set 和get的使用,private封装性

题量和难度

第三次作业的题量较少,但题目会稍微更难一些,尤其是最后一道题。

二.设计与分析

7-3

题目分析

这个题目是需要求当前日期的下一天,主要分析年月日的问题。年包括闰年和平年,平年和闰年在于二月的天数不同;对于月来说,每个月对应的最大天数不同,最大月份为12月;对于日来说,若当前日对应当前月的最大天数,则要进入下一个月。由这些分析可以把问题细化并得到以下方法:1.判断平年和闰年 2.判断月份与日的对应关系 3.判断年月日的合法输入

源码分析



getPreviousDays()和getDaysofDates()的复杂度都很高,而getPreviusDays()的功能和getNextDays()的功能大同小异,复杂却高了那么多,说明自己还是没有弄清楚原理,把问题复杂化了。

类图

源码

点击查看代码
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        int yy = input.nextInt();
        int mm = input.nextInt();
        int dd = input.nextInt();
        Date date = new Date(yy, mm, dd);
        if(date.checkInputValidity())
            date.getNextDate();
        else
            System.out.println("Date Format is Wrong");
    }

}
class Date{
    private int year;
    private int month;
    private int day;
    int[] a= new int[]{0,31,28,31,30,31,30,31,31,30,31,30,31};
    Date(){

    }
    Date(int yy, int mm, int dd){
        this.year = yy;
        this.month = mm;
        this.day = dd;
    }
    public int getYear(){
        return year;
    }
    public void setYear(int yy){
        this.year = yy;
    }
    public int getMonth(){
        return month;
    }
    public void setMonth(int mm){
        this.month = mm;
    }
    public int getDay(){
        return day;
    }
    public void setDay(int dd){
        this.day = dd;
    }
    public boolean isLeapYear(int yy){
        if(yy % 400 == 0 || (yy % 4 == 0 && yy %100 != 0))
            return true;
        return false;
    }
    public boolean checkInputValidity(){
        if(year >= 1900 && year <= 2000 && month >=1 && month <= 12 && day >=1 && day <= 31){
            if(month == 2){
                if(isLeapYear(year) == true && day <= a[2] + 1)
                    return true;
                else if(isLeapYear(year) == false && day <= a[2])
                    return true;
            }
            else if(day <= a[month])
                return true;
        }
        return false;
    }
    public void getNextDate(){
        if(month == 2){
            if(isLeapYear(year) == true && day == a[2] + 1){
                day = 1;
                month+= 1;
            }
            else if(isLeapYear(year) == false && day == a[2]){
                day = 1;
                month+= 1;
            }
        }
        else if(month == 12 && day == 31)
        {
            day = 1;
            month = 1;
            year+= 1;
        }
        else if(day == a[month])
        {
            day = 1;
            month+= 1;
        }
        else{
            day+= 1;
        }
        System.out.println("Next day is:" + year + "-" + month + "-" + day);
    }
}

小结

这个题目已经给出了基本的要求和需要的方法,是对题目集2的7-9的进一步改进和功能增加,也是对7-9的一个优化。重点在于如何写好getNextDate这个方法,解决一个问题,写出来的代码要高效、简洁易懂,时间和空间复杂度都要很低。在不同的思维环境下,一个代码可以写得很简单,也可以很复杂。

7-4

题目分析

此题是在求下一天的基础上求下n天和前n天的日期以及两个日期相差的天数。在上一题的基础上让天数一天天增加(减少),加(减)n天求出日期,以及从小的那个日期开始一直增加天数,直到和大的那个日期相等。

源码分析


类图

源码

点击查看代码
 

import java.util.Scanner;
import java.time.LocalDate;
public class Main {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        int year = 0;
        int month = 0;
        int day = 0;

        int choice = input.nextInt();

        if (choice == 1) { // test getNextNDays method
            int m = 0;
            year = Integer.parseInt(input.next());
            month = Integer.parseInt(input.next());
            day = Integer.parseInt(input.next());

            DateUtil date = new DateUtil(year, month, day);

            if (!date.checkInputValidity()) {
                System.out.println("Wrong Format");
                System.exit(0);
            }

            m = input.nextInt();

            if (m < 0) {
                System.out.println("Wrong Format");
                System.exit(0);
            }

            System.out.print(date.getYear() + "-" + date.getMonth() + "-" + date.getDay() + " next " + m + " days is:");
            System.out.println(date.getNextNDays(m).showDate());
        } else if (choice == 2) { // test getPreviousNDays method
            int n = 0;
            year = Integer.parseInt(input.next());
            month = Integer.parseInt(input.next());
            day = Integer.parseInt(input.next());

            DateUtil date = new DateUtil(year, month, day);

            if (!date.checkInputValidity()) {
                System.out.println("Wrong Format");
                System.exit(0);
            }

            n = input.nextInt();

            if (n < 0) {
                System.out.println("Wrong Format");
                System.exit(0);
            }

            System.out.print(
                    date.getYear() + "-" + date.getMonth() + "-" + date.getDay() + " previous " + n + " days is:");
            System.out.println(date.getPreviousNDays(n).showDate());
        } else if (choice == 3) {    //test getDaysofDates method
            year = Integer.parseInt(input.next());
            month = Integer.parseInt(input.next());
            day = Integer.parseInt(input.next());

            int anotherYear = Integer.parseInt(input.next());
            int anotherMonth = Integer.parseInt(input.next());
            int anotherDay = Integer.parseInt(input.next());

            DateUtil fromDate = new DateUtil(year, month, day);
            DateUtil toDate = new DateUtil(anotherYear, anotherMonth, anotherDay);

            if (fromDate.checkInputValidity() && toDate.checkInputValidity()) {
                System.out.println("The days between " + fromDate.showDate() +
                        " and " + toDate.showDate() + " are:"
                        + fromDate.getDaysofDates(toDate));
            } else {
                System.out.println("Wrong Format");
                System.exit(0);
            }
        }
        else{
            System.out.println("Wrong Format");
            System.exit(0);
        }
    }
}
class DateUtil{
    private int year;
    private int month;
    private int day;
    int []a = new int[]{0,31,28,31,30,31,30,31,31,30,31,30,31};
    DateUtil(){

    }
    DateUtil(int yy, int mm, int dd){
        year = yy;
        month = mm;
        day = dd;
    }
    public void setYear(int yy){
        year = yy;
    }
    public void setMonth(int mm){
        month = mm;
    }
    public void setDay(int dd){
        day = dd;
    }
    public int getYear(){
        return year;
    }
    public int getMonth(){
        return month;
    }
    public int getDay(){
        return day;
    }
    public boolean checkInputValidity(){//检测输入的年、月、日是否合法
        if(year >= 1820 && year <= 2020 && month >=1 && month <= 12 && day >=1 && day <= 31){
            if(month == 2){
                if(isLeapYear(year) && day <= a[2] + 1)
                    return true;
                else if(!isLeapYear(year) && day <= a[2])
                    return true;
            }
            else if(day <= a[month])
                return true;
        }
        return false;
    }

    public boolean isLeapYear(int year){//判断year是否为闰年
        if(year % 4 == 0 && year % 100 != 0)
            return true;
        else if(year % 400 == 0)
            return true;
        return false;
    }
    public DateUtil getNextNDays(int n){//取得year-month-day的下n天日期
        int i = 0;
        int temp = 0;
        int restDay = 0;
        for(i = 1; i < month; i++){
            if(isLeapYear(year) && i == 2)
                temp += 1;
            temp += a[i];
        }
        n = n + temp +day;
        while(true) {
            if (isLeapYear(year)){
                n -= 366;
            }
            else {
                n -= 365;
            }
            if(n < 0)
                break;
            year += 1;
            restDay = n;//少了导致错误
        }
        n = restDay;
        month = 1;
        for(i = 1; i <= 12; i++){
            if(isLeapYear(year) && i == 2)
                temp += 1;
            n = n - a[i];
            if(n < 0)
                break;
            month += 1;
            day = n;//少了导致错误
        }
        return this;
    }
    public DateUtil getPreviousNDays(int n) {//取得year-month-day的前n天日期
        int i = 0;
        int temp = 0;
        int t = 0;
        int restDay = 0;
        for (i = 1; i < month; i++) {
            if (isLeapYear(year) && i == 2)
                temp += 1;//不要写成a[i] += 1,会改变a[2]的值,让a[2]=29,进而影响后面的计算
            temp += a[i];
        }
        temp += day;
        if (temp > n) {
            month = 1;
            restDay = temp - n;
            for (i = 1; i <= 12; i++) {
                t = restDay;
                if (isLeapYear(year) && i == 2)
                    restDay -= 1;
                restDay -= a[i];
                if (restDay < 0)
                    break;
            }
        }
        else {
            month = 1;
            restDay = n - temp;
            year -= 1;
            if (restDay >= 366) {
                while (true) {
                    t = restDay;
                    if (isLeapYear(year))
                        restDay -= 366;
                    else
                        restDay -= 365;
                    if (restDay < 0)
                        break;
                    year -= 1;
                }
                restDay = t;
                if(isLeapYear(year))
                    restDay = 366 - restDay;
                else
                    restDay = 365 - restDay;
                for (i = 1; i < 12; i++) {
                    t = restDay;
                    if (isLeapYear(year) && i == 2)
                        restDay -= 1;
                    restDay -= a[i];
                    if (restDay < 0)
                        break;
                }
            }
            else {
                if (isLeapYear(year))
                    restDay = 366 - restDay;
                else
                    restDay = 365 - restDay;
                for (i = 1; i <= 12; i++) {
                    t = restDay;
                    if (isLeapYear(year) && i == 2)
                        restDay -= 1;
                    restDay -= a[i];
                    if (restDay < 0)
                        break;
                }
            }
        }
        month = i;
        if(i == 13)//若不判断,当日期为2003-1-1,测试前1天时有误(会出现 2002-13-31)
            month -= 1;
        day = t;
        if(t == 0){//若不判断,当日期为2003-12-31,测试前31天时有误(会出现 2003-12-0)
            month -= 1;
            day = a[month];
        }
        return this;
    }
    public boolean compareDates(DateUtil date){//比较当前日期与date的大小(先后)
        if(year > date.year)
            return true;
        if(year == date.year && month > date.month)
            return true;
        if(year == date.year && month == date.month && day > date.day)
            return true;
        return false;
    }
    public boolean equalTwoDates(DateUtil date){//判断两个日期是否相等
        if(year == date.year && month == date.month && day == date.day)
            return true;
        return false;
    }
    public int getDaysofDates(DateUtil date) {//求当前日期与date之间相差的天数
        int interval = 0;
        int temp = 0;
        int i = 0;
        int t = 0;
        if(equalTwoDates(date))
            interval = 0;
        else if(year == date.year){
            if(month > date.month) {
                for (i = date.month; i < month; i++) {
                    if (isLeapYear(year) && i == 2)
                        temp += 1;
                    temp += a[i];
                }
                interval = temp + day - date.day;
            }
            else{
                for (i = month; i < date.month; i++){
                    if(isLeapYear(year) && i == 2)
                        temp += 1;
                    temp += a[i];
                }
                interval = temp + date.day -day;
            }
        }
        else if(year > date.year){
            for (i = 1; i < date.month; i++) {
                if (isLeapYear(date.year) && i == 2)
                    interval += 1;
                interval += a[i];
            }
            interval += date.day;
            if (isLeapYear(date.year))
                interval = 366 - interval;
            else
                interval = 365 - interval;
            for (i = date.year + 1; i < year; i++) {
                if (isLeapYear(i))
                    interval += 366;
                else
                    interval += 365;
            }
            for (i = 1; i < month; i++) {
                if (isLeapYear(year) && i == 2)
                    temp += 1;
                temp += a[i];
            }
            temp += day;
            interval += temp;
        }
        else if(date.year > year){
            for (i = 1; i < month; i++) {
                if (isLeapYear(year) && i == 2)
                    interval += 1;
                interval += a[i];
            }
            interval += day;
            if (isLeapYear(year))
                interval = 366 - interval;
            else
                interval = 365 - interval;
            for (i = year + 1; i < date.year; i++) {
                if (isLeapYear(i))
                    interval += 366;
                else
                    interval += 365;
            }
            for (i = 1; i < date.month; i++) {
                if (isLeapYear(date.year) && i == 2)
                    temp += 1;
                temp += a[i];
            }
            temp += date.day;
            interval = temp + interval;
        }
        return interval;
    }
    public String showDate(){//以“year-month-day”格式返回日期值
        return (year + "-" + month + "-" + day);
    }

}

小结

这道题的给出了很多方法,在写代码时,每一个我都有写,但不是每一个我都用上了(比如说compareDates()),我根本就没使用到,说明代码在写的过程中有些地方被我写复杂了,导致这个方法用不上。

三.采坑心得

第一次作业

7-4(快递运费)

错误点

一开始我没有注意题目已经给出了四舍五入的方法,用Math.abs(a - (int)a) >= 0.5的方式来进行四舍五入,更麻烦且过不了测试点。

7-5(去掉重复的字符串)

错误点

忽略了在去除重复字符的过程中,字符串的总长度在不断变短。

错误代码

点击查看代码
import java.util.Scanner;
public class Main {
    public static void main(String[] args)  {
        Scanner input = new Scanner(System.in);
        String s1=input.next();
        String s2=s1.substring(0,1);
        int index=0,i;
        for(i=0;i<s1.length()-1;i++){
            s2=s1.substring(i,i+1);
            while((index=s1.indexOf(s2))!=-1) {
                s1=s1.substring(0,index)+s1.substring(index+1,s1.length()-index);
            }
        }
            System.out.println(s1);
    }
}

正确代码

点击查看代码
import java.util.Scanner;
public class Main 
{
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        String s1=input.next();
        char[] a=s1.toCharArray();
        int i,j;
        for(i=0;i<s1.length();i++) {
            for(j=i+1;j<s1.length();j++) {
                if(a[i]==a[j]) {
                    s1=s1.substring(0,j)+s1.substring(j+1);
                    j--;
                    a=s1.toCharArray();
                }
            }
        }
        System.out.println(s1);
    }
}

7-7(有重复的数据)

错误点

超出了所给的时间限制

改进

错误1

一开始我想的只是用排序可能会减少一些时间,但我用的是冒泡排序,并不能达到缩短时间的效果,反而花了更多时间和空间。

错误2

String.valueOf(),把数组转换成字符串,但是当数组元素为两位数或大于两位数时,存储的字符串会把一个整形数,拆成若干个字符。

错误代码
点击查看代码
import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        int n = input.nextInt();
        int i,index;
        int[] a1 = new int[n];
        for(i=0;i<n;i++)
            a1[i]=input.nextInt();
        String str = String.valueOf(a1);
        char[] a2 = str.toCharArray();
        for(i = 0; i < str.length(); i++){
            if((index = str.indexOf(a2[i]))! = -1)
                break;
        }
        if(i >= str.length())
            System.out.println("NO");
        else
            System.out.println("YES");
    }
}
(最终)使用快速排序解决问题

7-8(从一个字符串中移除包含在另一个字符串中的字符)

错误点

这个错误我暂时还没有明白是哪里错了,如果有知道的可以帮忙解答疑惑。最后使用暴力遍历的方法解决了问题。

错误代码

点击查看代码
import java.util.Scanner;
public class Main{
    public static void main(String[] args){
        Scanner input = new Scanner(System.in);
        String s1 = input.next();
        String s2 = input.next();
        char[] a1 = s1.toCharArray();
        char[] a2 = s2.toCharArray();
        int i=0,j,flag=0;
        while(i<s1.length()){
            flag=0;
            for(j=0;j<s2.length();j++){
                if(a1[i]==a2[j]){
                    s1=s1.substring(0,i)+s1.substring(i+1);
                    flag=1;
                }
                a1 = s1.toCharArray();
            }
            i++;
            if(flag==1)
                i--;
        }
        System.out.println(s1);
    }
}

7-10(GPS数据处理)

错误点

循环跳出的时间有误。
题目的意思是把所有的GPS语句读完,并找出满足要求的那一条语句。而上面这段代码是在找到这条满足要求的GPS语句后直接跳出循环,不再读入后面的其他语句。

错误代码

点击查看代码
import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        int i = 0, j = 0, k = 0, check = 0;
        String gps = new String();
        gps = input.nextLine();
        while (!(gps.equals("END")))
        {
            i = 0;
            String[] arr = gps.split(",");
            if (arr[0].equals("$GPRMC") && arr[2].equals("A"))
            {
                i = 0;
                char[] aa1 = gps.toCharArray();
                int s = (int)aa1[1] ;
                check = Integer.parseInt(arr[12].substring(2),16);
                for (i = 2; i < gps.length()-3; i++){
                    s = s ^ aa1[i];
                }
                if (s == check){
                    int hh, mm, ss;
                    hh = (aa1[7] - '0') * 10 + aa1[8] - '0' + 8;
                    if (hh > 24)
                    hh = hh - 24;
                    mm = (aa1[9] - '0') * 10 + aa1[10] - '0';
                    ss = (aa1[11] - '0') * 10 + aa1[12] - '0';
                    System.out.printf("%02d:%02d:%02d", hh, mm, ss);
                }
            }
            gps = input.nextLine();
        }
    }
}

正确代码

点击查看代码
import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        int i = 0, j = 0, k = 0, check = 0;
        int hh=0, mm=0, ss=0;
        String gps = new String();
        while(true)
        {
            gps = input.nextLine();
            if(!gps.equals("END"))
            {
                String[] arr = gps.split(",");
                if (!arr[0].equals("$GPRMC") && !arr[2].equals("A"))
                    continue;
                i = 0;
                char[] aa1 = gps.toCharArray();
                int s = 0 ;
                check = Integer.parseInt(arr[12].substring(2),16);
                i=1;
                while(aa1[i]!='*')
                {
                    s = s ^ aa1[i];
                    i++;
                }
                if (s == check)
                {
                    
                    hh = (aa1[7] - '0') * 10 + aa1[8] - '0' + 8;
                    if (hh > 24)
                    hh = hh - 24;
                    mm = (aa1[9] - '0') * 10 + aa1[10] - '0';
                    ss = (aa1[11] - '0') * 10 + aa1[12] - '0';
                    
                }
            }
            if(gps.equals("END"))
            {
                System.out.printf("%02d:%02d:%02d",hh,mm,ss);
                break;
            }
        }
    }
}

7-12(列出最简真分数序列)

错误点

把题目想复杂了,实际上就是去掉有分子分母有公因子的分数就可以了,所以以后还是得先理明白里面的关系,再构思方法。

错误代码

点击查看代码
import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        int i, j, N = input.nextInt(), flag = 0;
        if (N % 2 == 0)//N为偶数{
            System.out.print(1 + "/" + N + ",");
            for (i = 3; i < N; i += 2) {
                for (j = 3; j <= i; j += 2) {
                    if (N % j == 0 && i % j == 0) {
                        flag = 1;
                        break;
                    }
                }
                if (flag == 0)
                    System.out.print(i + "/" + N + ",");
            }
        } 
        else//N为奇数{
            System.out.print(1 + "/" + N + ",");
            for (i = 2; i < N; i += 2) {
                for (j = 2; j <= i; j += 2) {
                    if (N % j != 0 && i % j != 0 && N % i != 0) {
                        System.out.print(i + "/" + N + ",");
                        break;
                    }
                }
            }
        }
    }
}

正确代码

点击查看代码
import java.util.Scanner;
public class Main 
{
    public static void main(String[] args) 
    {
        Scanner input= new Scanner(System.in);
        int i,j,N=input.nextInt();
        for(i=1;i<N;i++){
            for(j=2;j<=i;j++) {
                if(i%j==0&&N%j==0)
                    break;
            }
            if(j>i)
                System.out.print(i+"/"+N+",");
        }
    }
}

第二次作业

7-1、7-3

错误点

没有用float而是用了double(但我觉得是题目的问题,它并没有要求说一定要用float)

7-2(奇数求和)

错误点

判断奇数时没有考虑负数,考虑不全面。

7-6(巴比伦法求平方根近似值)

错误点

输出的是多进行了一次精确计算的值,与精度是double和float没有太大关系,我当时以为是这里出了问题,还把Math.abs() < 0.00001换成了< 0.01,最后用2 1测试出来的答案是没错了,但是如果是其他的一些数值测试,可能输出的结果就是错的。因此确定循环什么时候结束真的挺需要注意的。

错误代码

点击查看代码
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        float n = input.nextFloat();
        float lastGuess = input.nextFloat();
        float nextGuess = (lastGuess + n / lastGuess) / 2;
        if(n < 0 || lastGuess <=0)
            System.out.println("Wrong Format");
        else{
            while((nextGuess - lastGuess) >= 0.01 ||(nextGuess - lastGuess) <= -0.01){
                lastGuess = nextGuess;
                nextGuess = (lastGuess + n / lastGuess) / 2;
            }
            System.out.println(nextGuess);
       }
    }
    
}

正确代码

点击查看代码
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        float n = input.nextFloat();
        float lastGuess = input.nextFloat();
        float nextGuess = (lastGuess + n / lastGuess) / 2;
        if(n < 0 || lastGuess <=0)
            System.out.println("Wrong Format");
        else{
            while(Math.abs(nextGuess - lastGuess) >= 0.00001){
                lastGuess = nextGuess;
                nextGuess = (lastGuess + n / lastGuess) / 2;
            }
            System.out.println(lastGuess);
        }
    }
}

7-7(二进制数提取)

错误点

非法输入时没有输出警告语句(我觉得也是题目没讲造成的)

7-8(判断三角形类型)

错误点

错误1

等腰直角三角形也是等腰三角形的一种,如果先判断有两腰相等,直接会输出"等腰三角形",而不会进入下一个else if语句,判断它是否为直角三角形,所以要把等腰的判断分类,一类为等腰直角,一类为等腰,且先判断等腰直角。

错误2

判断两浮点数相等时,会出现浮点误差,因此判断相等的条件应该是二者的差值小于一个很小的数时,就判断二者相等。

第三次作业

7-2

错误点

计算月利率时,月利率=余额(年利率/1200),写成了月利率=余额年利率/1200,导致精度不准确而错。

7-3(定义日期类)

错误点

缺少判断当日期为12月31日,下一天的计算

错误代码

点击查看代码
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        int yy = input.nextInt();
        int mm = input.nextInt();
        int dd = input.nextInt();
        Date date = new Date(yy, mm, dd);
        if(date.checkInputValidity())
            date.getNextDate();
        else
            System.out.println("Date Format is Wrong");
    }

}
class Date{
    private int year;
    private int month;
    private int day;
    int[] a= new int[]{0,31,28,31,30,31,30,31,31,30,31,30,31};
    Date(){

    }
    Date(int yy, int mm, int dd){
        this.year = yy;
        this.month = mm;
        this.day = dd;
    }
    public int getYear(){
        return year;
    }
    public void setYear(int yy){
        this.year = yy;
    }
    public int getMonth(){
        return month;
    }
    public void setMonth(int mm){
        this.month = mm;
    }
    public int getDay(){
        return day;
    }
    public void setDay(int dd){
        this.day = dd;
    }
    public boolean isLeapYear(int yy){
        if(yy % 400 == 0 || (yy % 4 == 0 && yy %100 != 0))
            return true;
        return false;
    }
    public boolean checkInputValidity(){
        if(year >= 1900 && year <= 2000 && month >=1 && month <= 12 && day >=1 && day <= 31){
            if(month == 2){
                if(isLeapYear(year) == true && day <= a[2] + 1)
                    return true;
                else if(isLeapYear(year) == false && day <= a[2])
                    return true;
            }
            else if(day <= a[month])
                return true;
        }
        return false;
    }
    public void getNextDate(){
        if(month == 2){
            if(isLeapYear(year) == true && day == a[2] + 1){
                day = 1;
                month+= 1;
            }
            else if(isLeapYear(year) == false && day == a[2]){
                day = 1;
                month+= 1;
            }
        }
        else if(day == a[month])
        {
            day = 1;
            month+= 1;
        }
        else{
            day+= 1;
        }
        System.out.println("Next day is:" + year + "-" + month + "-" + day);
    }
}

7-4(日期类设计)

错误点

错误1

一开始我在判断是闰年的时候让a[2] += 1,但是a[2]会在很多方法中被用到,但是一旦因为闰年而改变后,每次闰年都会让a[2] + 1,这样就会导致天数出现错误。

错误2

细节问题,写错数字
吃了细节上的亏,在设计日期类里,有关年份的计算时,我把365天写成了356天,导致计算跨年天数时一直都和正确答案相差了不少天数,然后又闷头在测试数据,其实当时只要再检查一下代码其实就可以发现这个问题,所以以后写的时候要小心,写完了以后也要检查一下,或者干脆重新按照思路写一遍。

错误3

缺少对越界数据的判断,出现如下情况


其他

还有就是对很多基本知识和语法掌握得不是很准确,导致总是出现指向空指针、越界等问题,但是书上其实都有标准的定义和写法,所以以后还是得先把书看完,把知识点先装进脑子里,防止一次又一次在一个坑里栽跟头,还不知道自己真正错的点,然后上网搜索自己的错误原因,发现把一个地方改对了,其他地方又会出现错误,那就说明自己其实并没有真正理解错误的原因,所以说还是得多看书,进行系统的学习,而不是写错了去找错误,要做到一开始写的基本就是对的。

四.改进建议

优化代码首先先从理解上优化,一看就能看懂写的是什么意思;意思表述简单后写出更短、消耗更少时间和空间的代码。

第一次作业

7-10

题目集1判断GPS的那道题,我没有理解题目的意思就开始写代码,导致后面怎么改都是有错误的。还有就是后面终于能运行过了以后发现只过了一个测试点。因此后面自己需要更整体地看待一个题,先对问题进行分析,把设计构思好了再开始写,防止又出现总是改代码的情况,还越改错的越多。

第二次作业

7-3(日期类设计)

在这道题没有给出数组来存储日期之前,我是用if语句来判断哪些月份对应哪些天数,就很不灵活。常量是确定不会改变的量,那么它就可以被存储起来,等到需要用的时候在拿出来用,数组储存的意义就在这。
就比如这一段

点击查看代码
public static void nextDate(int year,int month,int day){//求输入日期的下一天
        if((month == 1 || month == 3 || month == 5 ||month == 7 || month == 8 || month == 10) && day == 31){
            month = month + 1;
            day = 1;
        }
        else if((month == 4 || month == 6 || month == 9 ||month == 11) && day == 30){
            month = month + 1;
            day = 1;
        }
        else if(month == 2 && ((isLeapYear(year) == true && day ==29) || ((isLeapYear(year) == false && day == 28)))){
            month = month + 1;
            day = 1;
        }
        else if(month == 12 && day == 31){
            month = 1;
            day =1;
            year = year + 1;
        }
        else
            day = day + 1;
        System.out.println("Next date is:" + year + "-" + month + "-" + day);
    }
完全可以更改成
点击查看代码
public static void nextDate(int year,int month,int day){//求输入日期的下一天
        if(month == 2 && isLeapyear(year))
            a[2] ++;
        if (day == a[month]){
            day = 1;
            month ++;
            if(month == 13){
                month = 1;
                year ++;
            }
        }
        else
            day ++;
        System.out.println("Next date is:" + year + "-" + month + "-" + day);
    }

7-4(日期类设计)

一天天加减比较慢,每加减一天就要进行一次循环,再更快速一点,可以让天数跨度大的,以年或月为单位加减,年份跨度大的,以365(366)天为单位加减。

五.总结

学到的知识

这三次题集,让我学会了如何进行一些基本的代码编写,尽可能更少地出现编译错误。第三次的作业让我开始对类的整体有了一个概念,了解了(私有)属性和(公有)方法以及构造方法等。

需要改进的地方

还有就是格式上的问题,写题目集1的时候,格式不规范,后面两次都有在改进,还有就是缺少注释,写的代码没有功能上的注释,给别人的观看带来困扰。后面我会更加注意格式的书写和添加必要注释,还有就是向其他同学学习,多沟通交流,毕竟自己总会有没有想全面的地方。

建议

课堂上的话,我还是希望老师能整体地说一下这节课的内容,因为在讲的时候,我发现老师喜欢用一种循序渐进的方式来引导大家思考,还是比较好的一种方式,可以锻炼我们的思维能力,先从一个点切入,然后发现不足点,然后改进方法,得到不断地提升。
希望老师后面在每次大家做完pta后,看到大家的不足,能更多地在课堂上提出大家做得不好的地方,提出有一些好的方法和建议,感觉有些时候自己在写方法的时候,确实把方法复杂化了。
pta作业有的时候没有明确一些要求,有些时候还少了,就像有题目要求用float型,没有明确讲出来,就不知道自己错在什么地方。