首页 > 其他分享 >OO题目集4-6总结

OO题目集4-6总结

时间:2023-04-30 18:11:23浏览次数:39  
标签:OO 总结 题目 temp int value nextInt num

一、前言

题目集四

从本次题目集开始,正式开始了菜单类设计,并熟悉了字符串各常用语法的运用,及运用封装性进行面向对象编程。七道题目,菜单3难度稍高,其他中等。

题目集五

本次题目集集中训练了正则表达式,以及日期问题的面向对象聚合设计。总体难度不大,题量也只有六道,不多,主要是熟悉正则的用法以及如何实现聚合。

题目集六

在这次题目集中仅一道菜单类题目,是题目集四菜单类的再次迭代,虽然题目量少,但相较于其他题目集花费时间却更多,题目代码量更多,类与类之间的设计也更加复杂难以下手。

 

 

二、设计与分析

---题目集4-1,题目集6-1

1、题目

(1) 题目集4-1

(2) 题目集6-1

2、分析:

 题目集4-1是菜单类题目的第三次迭代,刚开始的时候,由于没有写过菜单1和菜单2,看到这么长的题目还是挺手足无措的,不知道从哪里开始下手,总是会有一点逃避心理的,再加上在题目集3中并不是只有这一道题目,一开始就先打算完成其他题目再来慢慢写,没想到在其他题目上也被卡了很久,导致最后在设计分析这道题的时候,时间也不多了,类间关系混乱,很多地方都没有考虑到,最后也没有写完。

在编写本次blog时,是已经经历过题目集6-1的菜单4了,现在一对比菜单4,菜单3的条件等等都相对非常简化版本的了,现在反思当时的小小逃避心理真的是非常后悔的(欠下的债总是要还的),而由于当时的我对于菜单3并没有好好的分析,使我在菜单4的更复杂的题目中花费了大量时间来抽离主干、分析设计。

由上面的图片可以看到,菜单类设计主要是分为两个板块,一个是输入菜谱,一个是输入订单,而菜单4则比菜单3增加了十几条异常情况判断和一种功能增加。在菜单类的设计中,我也在和同学讨论如何改进菜单各个情况的处理的过程中收获了许多。

(1) 比如说菜单4的输入格式等方面判断,一开始我使用的是字符串输入,split分割成字符串数组再来一一判断,但是这样就会漏掉比如多个空格等错误情况,后来在交流中,发现可以用正则表达来判断会更加全面;

原来的:

改进后:

 

(2) 还有格式错误这些小细节,在写代码中,输出基本是自己按照题目去写格式,由于各个地方的判断输出都比较多,输入时不可能所有的内容直接复制格式在一起输入,那么一些小细节的地方就会完全发现不了,比如:

在这里的冒号后面其实是有一个空格的,但是如果是自己对照着一个个写格式,这里是绝对不会发现不了还有一个空格,这个点也是我在同学的提醒下才发现的。

(3)在菜单类4中,由于异常判断较多,时常会出现各种问题。比如在这里判断后,是直接输出吗,还是要延迟输出;是先判断这个,还是先判断哪个等等,由于我的各个方法是在对应的类中实现,并不能说是非常直观的在代码中看到功能以及效果,导致了许多混乱,后来在与同学的复盘中也提到了,说我的代码看起来就像在不停的打补丁一样,这里缺了一点就补一下,那里缺了一点再补一下,程序结构非常混乱,PTA的提交分数也是飘忽不定,这是需要改正的。

 

关于菜单的类与类的设计,现在最后的版本相比较于最初的想法基本上可以说是毫不相干了,在逐渐完成代码的时候,一步步加上各种功能,发现现在的类不能满足需求,又重新设计,添加上新的类,不断修改修改,在这次题目集中,确实是感觉到自己成长了许多。

对于本次题目集中的菜单类问题,后期发现确实是在算法上没有什么难点,在我看来它更多地是在考验逻辑思维,细心程度,分析解决问题能力以及和同学伙伴间的交流能力,而不是要自己闭门造车。

最后的类图如下:

设计了Dish菜品类,Menu菜谱类,TableNumberIdentification桌号类,Record单条点菜记录类,Order单条订单类,BlanketOrder总订单类。Menu -> Dish,BlanketOrder -> Order -> Record和 TableNumberIdentification。

数据分析如下:

 

---题目集5-5,题目集5-6

这两道题是在上次总结中也有写过的日期问题的两种不同的聚合关系的写法,虽然大体上算法大差不差,但是在类的结构,内容上随着类间关系的变化也是导致代码产生了许多变化。

类图如下:

(1) 题目集5-5

(2) 题目集5-6

 

在5-5中,是按照中介 -> 年 -> 月 -> 日的聚合方式,是一级比一级要大的,而在5-6中,则是中介 -> 年,月,日的聚合方式,在中介的下面,年月日是同样的地位,这是两种聚合的主要不同。那么随着变化,类内的方法和属性肯定也是不同的。

这两道题难度都不大,我认为主要是想让我们熟悉并运用聚合关系。

最后代码如下:

(1) 题目集5-5

import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int choice = in.nextInt();
        if(choice == 1){//求下n天
            int y = in.nextInt();
            int m = in.nextInt();
            int d = in.nextInt();
            DateUtil dateUtil = new DateUtil(y,m,d);
            int n = in.nextInt();

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

            dateUtil.getNextDays(n);
            System.out.println(dateUtil.showDate());
        }

        else if(choice == 2){//求前n天
            int y = in.nextInt();
            int m = in.nextInt();
            int d = in.nextInt();
            DateUtil dateUtil = new DateUtil(y,m,d);
            int n = in.nextInt();

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

            dateUtil.getPreviousDays(n);
            System.out.println(dateUtil.showDate());
        }

        else if(choice == 3){//求相差天数
            int y = in.nextInt();
            int m = in.nextInt();
            int d = in.nextInt();
            DateUtil dateUtil1 = new DateUtil(y,m,d);

            int yy = in.nextInt();
            int mm = in.nextInt();
            int dd = in.nextInt();
            DateUtil dateUtil2 = new DateUtil(yy,mm,dd);

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

            System.out.println(dateUtil1.getDaysofDates(dateUtil2));
        }

        else {
            System.out.println("Wrong Format");
            System.exit(0);
        }

    }
}
class Year{//年
    private int value;

    public Year(){

    }

    public Year(int value){
        this.value = value;
    }

    public void setValue(int value) {
        this.value = value;
    }

    public int getValue() {
        return value;
    }

    public boolean isLeapYear(){//判断闰年
        if(value % 400 == 0 || (value % 100 != 0 && value % 4 == 0))
            return true;
        return false;
    }

    public boolean validate(){//判断输入是否合法
        if(value >= 1900 && value <= 2050)
            return true;
        return false;
    }

    public void yearIncrement(){
        value ++;
    }

    public void yearReduction(){
        value --;
    }
}

class Month{
    private int value;
    private Year year;

    public Month(){

    }

    public Month(int yearValue,int monthValue){
        this.value = monthValue;
        year = new Year(yearValue);
    }

    public void setValue(int value) {
        this.value = value;
    }

    public int getValue() {
        return value;
    }

    public void setYear(Year year) {
        this.year = year;
    }

    public Year getYear() {
        return year;
    }

    public void resetMin() {
        value = 1;
    }

    public void resetMax() {
        value = 12;
    }

    public boolean validate(){//判断输入是否合法
        if(value >= 1 && value <= 12)
            return true;
        return false;
    }

    public void monthIncrement(){
        value ++;
    }

    public void monthReduction(){
        value --;
    }
}

class Day{
    private int value;
    private Month month;
    private int[] mon_maxnum = {31,28,31,30,31,30,31,31,30,31,30,31};

    public Day(){

    }

    public Day(int yearValue,int monthValue,int dayValue){
        this.value = dayValue;
        month = new Month(yearValue,monthValue);
    }

    public void setValue(int value) {
        this.value = value;
    }

    public int getValue() {
        return value;
    }

    public void setMonth(Month month) {
        this.month = month;
    }

    public Month getMonth() {
        return month;
    }

    public void resetMin() {
        value = 1;
    }

    public void resetMax() {
        value = mon_maxnum[month.getValue()];
    }

    public boolean validate(){//判断输入是否合法
        if(month.getYear().isLeapYear() && month.getValue() == 2){
            if(value >= 1 && value <= 29)
                return true;
        }
        if(value >= 1 && value <= mon_maxnum[month.getValue() - 1])
            return true;
        return false;
    }

    public void dayIncrement(){
        value ++;
    }

    public void dayReduction(){
        value --;
    }
}

class DateUtil{
    private Day day;

    public DateUtil(){

    }

    public DateUtil(int y,int m,int d) {
        day = new Day(y,m,d);
    }

    public Day getDay() {
        return day;
    }

    public void setDay(Day d) {
        this.day = day;
    }

    public boolean checkInputValidity(){
        if(day.getMonth().getYear().validate())
            if(day.getMonth().validate())
                if(day.validate())
                    return true;
        return false;
    }

    public boolean compareDates(DateUtil date){//比较大小
        if(day.getMonth().getYear().getValue() < date.getDay().getMonth().getYear().getValue())
            return true;//年小
        if(day.getMonth().getYear().getValue() == date.getDay().getMonth().getYear().getValue())
            if(day.getMonth().getValue() < date.getDay().getMonth().getValue())
                return true;//年等,月小
        if(day.getMonth().getYear().getValue() == date.getDay().getMonth().getYear().getValue())
            if(day.getMonth().getValue() == date.getDay().getMonth().getValue())
                if(day.getValue() <= date.getDay().getValue())
                    return true;//年等月等,日小
        return false;
    }

    public boolean equalTwoDates(DateUtil date){//比较是否相等
        if(day.getMonth().getYear().getValue() == date.getDay().getMonth().getYear().getValue())
            if(day.getMonth().getValue() == date.getDay().getMonth().getValue())
                if(day.getValue() == date.getDay().getValue())
                    return true;//年等月等日等
        return false;
    }

    public String showDate(){//格式化日期
        return day.getMonth().getYear().getValue() + "-" + day.getMonth().getValue() + "-" + day.getValue();
    }

    public DateUtil getNextDays(int n){//求下n天
        Day temp;
        long num = 0;
        int YearNum = 365;
        if(day.getMonth().getYear().isLeapYear())
            YearNum = 366;
        for(int i = 0;i < day.getMonth().getValue() - 1;i ++){
            temp = new Day(0,0,0);//设立一个新的Day类,用来累加
            temp.getMonth().setValue(i);//把当前要加上的月份赋给他
            temp.resetMax();//把本月的最大天数赋值
            if(day.getMonth().getYear().isLeapYear() && i == 1)
                num = num + temp.getValue() + 1;
            else
                num += temp.getValue();
        }
        num += day.getValue();
        num += n;

        //跨年了,有可能跨了不止一年
        while(num > YearNum){
            day.getMonth().getYear().yearIncrement();//年份加一
            num -= YearNum;
            if(day.getMonth().getYear().isLeapYear())
                YearNum = 366;
            else
                YearNum = 365;
        }

        day.setValue(0);
        day.getMonth().setValue(1);
        int i = 0;
        temp = new Day(0,0,31);
        while(num > temp.getValue()){
            if(day.getMonth().getYear().isLeapYear() && i == 1)//闰年的二月
                num = num - temp.getValue() - 1;
            else
                num-= temp.getValue();
            temp.getMonth().monthIncrement();
            day.getMonth().monthIncrement();
            i ++;
            temp.getMonth().setValue(i);
            temp.resetMax();
        }
        day.setValue((int)num);

        return this;
    }

    public DateUtil getPreviousDays(int n){//求前n天
        Day temp;
        long num = 0;
        int YearNum = 365;
        if(day.getMonth().getYear().isLeapYear())
            YearNum = 366;
        for(int i = 0;i < day.getMonth().getValue() - 1;i ++){
            temp = new Day(0,0,0);//设立一个新的Day类,用来累加
            temp.getMonth().setValue(i);//把当前要加上的月份赋给他
            temp.resetMax();//把本月的最大天数赋值
            if(day.getMonth().getYear().isLeapYear() && i == 1)
                num = num + temp.getValue() + 1;
            else
                num += temp.getValue();
        }
        num += day.getValue();
        num -= n;

        //跨年了,有可能跨了不止一年
        while(num <= 0){
            day.getMonth().getYear().yearReduction();//年份减一
            if(day.getMonth().getYear().isLeapYear())
                YearNum = 366;
            else
                YearNum = 365;
            num += YearNum;
        }

        day.setValue(0);
        day.getMonth().setValue(1);
        int i = 0;
        temp = new Day(0,0,31);
        while(num > temp.getValue()){
            num -= temp.getValue();
            temp.getMonth().monthIncrement();
            day.getMonth().monthIncrement();
            i ++;
            temp.getMonth().setValue(i);
            temp.resetMax();
            if(day.getMonth().getYear().isLeapYear() && i == 1)//闰年的二月
                temp.setValue(29);
        }
        day.setValue((int)num);

        return this;
    }

    public int getDaysofDates(DateUtil date){//求相差天数
        int yearMin,yearMax;
        int numMin = 0,numMax = 0;
        Day temp,dayMax,dayMin;
        int YearNum = 365;
        if(day.getMonth().getYear().isLeapYear())
            YearNum = 366;

        if(this.compareDates(date)) {//this <= date
            yearMax = date.getDay().getMonth().getYear().getValue();
            yearMin = this.getDay().getMonth().getYear().getValue();
            dayMax = new Day(date.getDay().getMonth().getYear().getValue(),date.getDay().getMonth().getValue(),date.getDay().getValue());
            dayMin = new Day(day.getMonth().getYear().getValue(),day.getMonth().getValue(),day.getValue());
        }
        else{
            yearMax = this.getDay().getMonth().getYear().getValue();
            yearMin = date.getDay().getMonth().getYear().getValue();
            dayMax = new Day(day.getMonth().getYear().getValue(),day.getMonth().getValue(),day.getValue());
            dayMin = new Day(date.getDay().getMonth().getYear().getValue(),date.getDay().getMonth().getValue(),date.getDay().getValue());
        }

        //以小的年份为基准,用大的来--

        //计算小的年份在本年的天数
        for(int i = 0;i < dayMin.getMonth().getValue() - 1;i ++){
            temp = new Day(0,0,0);//设立一个新的Day类,用来累加
            temp.getMonth().setValue(i);//把当前要加上的月份赋给他
            temp.resetMax();//把本月的最大天数赋值
            if(dayMin.getMonth().getYear().isLeapYear() && i == 1)
                numMin = numMin + temp.getValue() + 1;
            else
                numMin += temp.getValue();
        }
        numMin += dayMin.getValue();
        //计算大的年份在本年的天数
        for(int i = 0;i < dayMax.getMonth().getValue() - 1;i ++){
            temp = new Day(0,0,0);//设立一个新的Day类,用来累加
            temp.getMonth().setValue(i);//把当前要加上的月份赋给他
            temp.resetMax();//把本月的最大天数赋值
            if(dayMax.getMonth().getYear().isLeapYear() && i == 1)
                numMax = numMax + temp.getValue() + 1;
            else
                numMax += temp.getValue();
        }
        numMax += dayMax.getValue();
        //再加上差的每一年的天数
        while(yearMin != yearMax){
            yearMax --;
            if((yearMax % 400 == 0)||(yearMax % 100 != 0 && yearMax % 4 == 0))
                numMax += 366;
            else
                numMax += 365;
        }
        numMax -= numMin;

        return numMax;
    }
}

 

 

(2) 5-6

import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int choice = in.nextInt();
        if(choice == 1){//求下n天
            int y = in.nextInt();
            int m = in.nextInt();
            int d = in.nextInt();
            DateUtil dateUtil = new DateUtil(y,m,d);
            int n = in.nextInt();

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

            System.out.print(dateUtil.showDate() + " next " + n + " days is:");
            dateUtil.getNextDays(n);
            System.out.println(dateUtil.showDate());
        }

        else if(choice == 2){//求前n天
            int y = in.nextInt();
            int m = in.nextInt();
            int d = in.nextInt();
            DateUtil dateUtil = new DateUtil(y,m,d);
            int n = in.nextInt();

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

            System.out.print(dateUtil.showDate() + " previous " + n + " days is:");
            dateUtil.getPreviousDays(n);
            System.out.println(dateUtil.showDate());
        }

        else if(choice == 3){//求相差天数
            int y = in.nextInt();
            int m = in.nextInt();
            int d = in.nextInt();
            DateUtil dateUtil1 = new DateUtil(y,m,d);

            int yy = in.nextInt();
            int mm = in.nextInt();
            int dd = in.nextInt();
            DateUtil dateUtil2 = new DateUtil(yy,mm,dd);

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

            System.out.print("The days between " + dateUtil1.showDate() + " and " + dateUtil2.showDate() + " are:");
            System.out.println(dateUtil1.getDaysofDates(dateUtil2));
        }

        else {
            System.out.println("Wrong Format");
            System.exit(0);
        }

    }
}
class Year{//年
    private int value;

    public Year(){

    }

    public Year(int value){
        this.value = value;
    }

    public void setValue(int value) {
        this.value = value;
    }

    public int getValue() {
        return value;
    }

    public boolean isLeapYear(){//判断闰年
        if(value % 400 == 0 || (value % 100 != 0 && value % 4 == 0))
            return true;
        return false;
    }

    public boolean validate(){//判断输入是否合法
        if(value >= 1820 && value <= 2020)
            return true;
        return false;
    }

    public void yearIncrement(){
        value ++;
    }

    public void yearReduction(){
        value --;
    }
}

class Month{
    private int value;

    public Month(){

    }

    public Month(int value){
        this.value = value;
    }

    public void setValue(int value) {
        this.value = value;
    }

    public int getValue() {
        return value;
    }

    public void resetMin() {
        value = 1;
    }

    public void resetMax() {
        value = 12;
    }

    public boolean validate(){//判断输入是否合法
        if(value >= 1 && value <= 12)
            return true;
        return false;
    }

    public void monthIncrement(){
        value ++;
    }

    public void monthReduction(){
        value --;
    }
}

class Day{
    private int value;

    public Day(){

    }

    public Day(int value){
        this.value = value;
    }

    public void setValue(int value) {
        this.value = value;
    }

    public int getValue() {
        return value;
    }

    public void dayIncrement(){
        value ++;
    }

    public void dayReduction(){
        value --;
    }
}

class DateUtil{
    private Day day;
    private Month month;
    private Year year;

    private int[] mon_maxnum = {31,28,31,30,31,30,31,31,30,31,30,31};

    public DateUtil(){

    }

    public DateUtil(int y,int m,int d) {
        day = new Day(d);
        month = new Month(m);
        year = new Year(y);
    }

    public Day getDay() {
        return day;
    }

    public void setDay(Day d) {
        this.day = d;
    }

    public Month getMonth() {
        return month;
    }

    public void setMonth(Month month) {
        this.month = month;
    }

    public Year getYear() {
        return year;
    }

    public void setYear(Year year) {
        this.year = year;
    }

    public void setDayMax(){
        //if(month.getValue() >= 1)
            day.setValue(mon_maxnum[month.getValue()]);
    }

    public void setDayMin(){
        day.setValue(1);
    }

    public boolean checkInputValidity(){
        int d;
        if(year.validate())
            if(month.validate()){
                d = mon_maxnum[month.getValue() - 1];
                if(day.getValue() >= 1 && day.getValue() <= d)
                    return true;
            }
        return false;
    }

    public boolean compareDates(DateUtil date){//比较大小
        if(year.getValue() < date.getYear().getValue())
            return true;//年小
        if(year.getValue() == date.getYear().getValue())
            if(month.getValue() < date.getMonth().getValue())
                return true;//年等,月小
        if(year.getValue() == date.getYear().getValue())
            if(month.getValue() == date.getMonth().getValue())
                if(day.getValue() <= date.getDay().getValue())
                    return true;//年等月等,日小
        return false;
    }

    public boolean equalTwoDates(DateUtil date){//比较是否相等
        if(year.getValue() == date.getYear().getValue())
            if(month.getValue() == date.getMonth().getValue())
                if(day.getValue() == date.getDay().getValue())
                    return true;//年等月等日等
        return false;
    }

    public String showDate(){//格式化日期
        return year.getValue() + "-" + month.getValue() + "-" + day.getValue();
    }

    public DateUtil getNextDays(int n){//求下n天
        DateUtil temp = new DateUtil(0,0,0);//设立一个新的Day类,用来累加;
        long num = 0;
        int YearNum = 365;
        if(year.isLeapYear())
            YearNum = 366;
        for(int i = 0;i < month.getValue() - 1;i ++){
            temp.getMonth().setValue(i);//把当前要加上的月份赋给他
            temp.setDayMax();//把本月的最大天数赋值
            if(year.isLeapYear() && i == 1)
                num = num + temp.getDay().getValue() + 1;
            else
                num += temp.getDay().getValue();
        }
        num += day.getValue();
        num += n;

        //跨年了,有可能跨了不止一年
        while(num > YearNum){
            year.yearIncrement();//年份加一
            num -= YearNum;
            if(year.isLeapYear())
                YearNum = 366;
            else
                YearNum = 365;
        }

        day.setValue(0);
        month.setValue(1);
        int i = 0;
        temp = new DateUtil(0,0,31);
        while(num > temp.getDay().getValue()){
            if(year.isLeapYear() && i == 1)//闰年的二月
                num = num - temp.getDay().getValue() - 1;
            else
                num -= temp.getDay().getValue();
            temp.getMonth().monthIncrement();
            month.monthIncrement();
            i ++;
            temp.getMonth().setValue(i);
            temp.setDayMax();
        }
        day.setValue((int)num);

        return this;
    }

    public DateUtil getPreviousDays(int n){//求前n天
        DateUtil temp = new DateUtil(0,0,0);//设立一个新的Day类,用来累加;
        long num = 0;
        int YearNum = 365;
        if(year.isLeapYear())
            YearNum = 366;
        for(int i = 0;i < month.getValue() - 1;i ++){
            temp.getMonth().setValue(i);//把当前要加上的月份赋给他
            temp.setDayMax();//把本月的最大天数赋值
            if(year.isLeapYear() && i == 1)
                num = num + temp.getDay().getValue() + 1;
            else
                num += temp.getDay().getValue();
        }
        num += day.getValue();
        num -= n;

        //跨年了,有可能跨了不止一年
        while(num <= 0){
            year.yearReduction();//年份减一
            if(year.isLeapYear())
                YearNum = 366;
            else
                YearNum = 365;
            num += YearNum;
        }

        day.setValue(0);
        month.setValue(1);
        int i = 0;
        temp = new DateUtil(0,0,31);
        while(num > temp.getDay().getValue()){
            num -= temp.getDay().getValue();
            temp.getMonth().monthIncrement();
            month.monthIncrement();
            i ++;
            temp.getMonth().setValue(i);
            temp.setDayMax();
            if(year.isLeapYear() && i == 1)//闰年的二月
                temp.getDay().setValue(29);
        }
        day.setValue((int)num);

        return this;
    }

    public int getDaysofDates(DateUtil date){//求相差天数
        int yearMin,yearMax;
        long numMin = 0,numMax = 0;
        DateUtil temp,dayMax,dayMin;
        int YearNum = 365;
        if(year.isLeapYear())
            YearNum = 366;

        if(this.compareDates(date)) {//this <= date
            yearMax = date.getYear().getValue();
            yearMin = this.getYear().getValue();
            dayMax = new DateUtil(date.getYear().getValue(),date.getMonth().getValue(),date.getDay().getValue());
            dayMin = new DateUtil(year.getValue(),month.getValue(),day.getValue());
        }
        else {
            yearMax = this.getYear().getValue();
            yearMin = date.getYear().getValue();
            dayMax = new DateUtil(year.getValue(),month.getValue(),day.getValue());
            dayMin = new DateUtil(date.getYear().getValue(), date.getMonth().getValue(), date.getDay().getValue());
            }
            //以小的年份为基准,用大的来--

        //计算小的年份在本年的天数
        for(int i = 0;i < dayMin.getMonth().getValue() - 1;i ++){
            temp = new DateUtil(0,0,0);//设立一个新的Day类,用来累加
            temp.getMonth().setValue(i);//把当前要加上的月份赋给他
            temp.setDayMax();//把本月的最大天数赋值
            if(year.isLeapYear() && i == 1)
                numMin = numMin + temp.getDay().getValue() + 1;
            else
                numMin += temp.getDay().getValue();
        }
        numMin += dayMin.getDay().getValue();
        //计算大的年份在本年的天数
        for(int i = 0;i < dayMax.getMonth().getValue() - 1;i ++){
            temp = new DateUtil(0,0,0);//设立一个新的Day类,用来累加
            temp.getMonth().setValue(i);//把当前要加上的月份赋给他
            temp.setDayMax();//把本月的最大天数赋值
            if(year.isLeapYear() && i == 1)
                numMax = numMax + temp.getDay().getValue() + 1;
            else
                numMax += temp.getDay().getValue();
        }
        numMax += dayMax.getDay().getValue();
        //再加上差的每一年的天数
        while(yearMin != yearMax){
            yearMax --;
            if((yearMax % 400 == 0)||(yearMax % 100 != 0 && yearMax % 4 == 0))
                numMax += 366;
            else
                numMax += 365;
        }
        numMax -= numMin;

        return (int)numMax;
    }
}

 

 

三、踩坑心得

---题目集4-2

这道题几个错误都是运行超时导致的,在修改中发现将x的定义挪出循环外后有一个点的运行超时就通过了,仔细分析发现应该是一直定义不断增加占据空间的同时拖慢了运行速度,还是一些基础不牢固导致的,这种错误是不应该出现的,要多多注意。

 

 

---题目集4-3

本题在题目集三中出现过类似题目,在一开始写的时候我原本也是按照之前的思路进行设计,但在提交后发现总是会运行超时。

尝试改变算法(增加改变判断条件),改变元素的储存方式(ArrayList)之类的,都一直还是超时,后来在和同学的的讨论中不断尝试,最后用到了LinkedHashSet才终于通过。

 

---题目集4-4

在本题中主要踩的坑是由于对于 split() 这个语法点的学习不够全面,知识没有掌握到位,split的()内当多个条件出现时,是有顺序的判断,从前往后,判断符合了第一个,就会跳过已经判读的字符,开始下一轮判断。

由于知识学习的不全面,导致只能在不断地测试试错中发现正确的用法,我认为这是非常需要改进的。而在试错的同时,也没有仔细分析错误的可能和与同学讨论可能原因,只是盲目的测试,也浪费了许多不必要的时间。

最后代码如下:

import java.util.Arrays;
import java.util.ArrayList;
import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        String ch;
        Scanner in = new Scanner(System.in);
        String s = in.nextLine();
        String[] str = s.split("\\. |\\, |\\.|\\ ");
        int strLon = str.length;
        int i,j;
        Arrays.sort(str,String.CASE_INSENSITIVE_ORDER);//所有的元素按字母序排序
        for(i = strLon - 1;i >= 1;i --){//按字数排序
            for(j = i - 1;j >= 0;j --){
                if(str[i].length() <= str[j].length()){
                    ch = str[i];
                    str[i] = str[j];
                    str[j] = ch;
                }
            }
        }
        ArrayList<String> newStr = new ArrayList<>();
        for(i = strLon - 2;i >= 0;i --){
            if(!str[i + 1].equals(str[i]))
                newStr.add(str[i]);
        }
        int newStrLon = newStr.size();
        System.out.println(str[strLon - 1]);
        for(i = 0;i < newStrLon;i ++){
            System.out.println(newStr.get(i));
        }
    }
}

 

 

四、改进建议

(1)菜单类题目:在上面分析中我也曾提到过,写代码和打补丁一样,哪里缺了补哪里,当时是由于连题目都完成不了,就也没想那么多,把要修正的直接写上去了,发现时也来不及又修改又继续往下写了。这给了我很大的教训,这种代码编写想法是需要在以后改正的。

(2) 代码的各种小问题在这几次的题目集中我也是经常犯。比如在循环里每次重定义一个数,使题目大大增加运行时间;循环判断true/false写反了;题目阅读不仔细,出错了才反应过来等等。

 

 

五、总结

1、综合性总结

(1) 对于知识学习的不全面:如上面所说的 split 的用法由于了解不全面,导致一直出错。还有循环里的重定义,这也是对知识的掌握不全面导致的。

(2) 细节问题总是出错:像格式错误,读题不仔细这种,确实是不应该犯的错误。

(3) 对于题目条件间的逻辑:这个在菜单类题目中体现得非常明显,没有总体的意识,看一步走一步的,非常容易使自己逻辑混乱,一步错步步错的。以后要从类图开始着手,整理好类间逻辑再开始。

 

2、对于教师、课程、作业、实验及课上课下组织方式的改进建议以及意见

 如果可以的话,希望以后可以开放题目集的补集。就是和原题目集一样的题目,但是成绩不参与平时成绩的计算。我觉得开放补集,可以在学习到了更多知识,有了更好的对于题目的想法和想要改进之前的算法的时候对于各种想法正确与否进行验证,只是与以往程序对照可能会出现疏漏。

标签:OO,总结,题目,temp,int,value,nextInt,num
From: https://www.cnblogs.com/xyt18820189306/p/17365564.html

相关文章

  • mapbox监视zoom的事件
    在Mapbox中,您可以使用map.on('zoomend',callback)监听地图缩放结束事件,然后执行自定义的回调函数,以便在每次地图缩放结束时更新应用程序。例如,可以在回调函数中获取当前地图的缩放级别,并执行所需的操作。以下是一些示例代码://创建一个Mapbox地图实例varmap=newmapb......
  • PTA题目集4~6总结
    一前言 题目集四主要考察的是对LocalDate,ArrayList,HashSet等Java自带类的使用 题目集五主要考察的是对正则表达式的使用,以及对其题目集三的时间题目的进行类结构的改变 题目集六只有一道题,主要是对题目集四的第一题进行加大难度 总的来说这几次的题目量比前面几次都要......
  • Hadoop全分布配置
    1.实验一:hadoop全分布配置1.1.实验目的完成本实验,您应该能够:掌握hadoop全分布的配置掌握hadoop全分布的安装掌握hadoop配置文件的参数意义1.2.实验要求熟悉hadoop全分布的安装了解hadoop配置文件的意义1.3.实验环境本实验所需之主要资源环境如表1-1......
  • Hadoop集群运行
    1.实验一:hadoop集群运行实验任务一:配置Hadoop格式化步骤一:NameNode格式化[root@master~]#su-hadoop[hadoop@master~]$cd/usr/local/src/hadoop/结果:[hadoop@master~]$./bin/hdfsnamenode–format-bash:./bin/hdfs:Nosuchfileordirectory[hadoop@......
  • PTA总结报告2
     相较于前一轮的三次作业,这次难了不止一点。这次的作业有了封装,正则表达式,聚合模式的使用,以及一个复杂的点菜系统。第四次作业: 这次的作业真的是惨不忍睹,这次的pta也是将将及格了,这次作业的7-1是第一道较为复杂的题目,由于错误的估计题目难度和自身的惰性,我没有留够时间来写......
  • hadoop平台安装
    Hadoop平台安装1.实验一:Linux操作系统环境设置1.1.实验目的完成本实验,您应该能够:掌握linux操作系统环境设置掌握hadoop安装的环境要求1.2.实验要求熟悉常用Linux操作系统命令熟悉hadoop安装的环境了解linux修改系统变量命令及各参数1.3.实验环境本实验所......
  • oop题目集04-06总结性blog
    oop题目集04*菜单计价程序-3*有重复的数据*去掉重复的数据*单词统计与排序*面向对象编程(封装性)*GPS测绘中度分秒转换*判断两个日期的先后,计算间隔天数、周数 oop题目集05*正则表达式训练-QQ号校验 * 字符串训练-字符排序*正则表达式训练-验证码校验* 正则表达式......
  • macbook air 安装 MacOS 及 win10
    前期准备mac电脑、16G的U盘、可以访问的AppStore帐号。重要提示U盘和硬盘数据格式化后不可恢复,需提前做好数据备份。安装macos需要连网。创建可引导的macOS安装器1、U盘y要求至少有14GB可用储存空间,格式化为MacOS扩展格式。2、下载macos系统镜像3、使用“终端”......
  • OOP4-6习题心得体会
    面向程序对象设计前言:1.相比于之前的题目,题目集4主要是在一些基本的题目类型,除去第一道题目,其他题目难度均比之前要小,包括字符串的排序,重复数据问题,以及java中Date类的使用,当然重中之重的是第一题的菜单题,不过由于个人的轻视以及懒导致并没有去做这一道题,直接导致了零......
  • 安卓一键改串号免root技术原理
    在智能手机用户中,有一部分人因为种种原因需要改变手机串号,比如解锁手机、绕过应用程序检测等。然而,传统的修改串号方法需要root权限,对普通用户来说比较困难。近年来,出现了一些安卓一键改串号免root技术,让用户可以更方便地修改手机串号。那么,这种技术的原理是什么呢?首先,我们......