题目集1~3的总结性Blog

发布时间 2023-03-26 20:29:09作者: 风与峰

目录

1.前言

2.设计与分析

3.踩坑心得

4.改进建议

5.总结

 

1.前言

题目集1:(主要初次了解Java的一些用法)

1、计算年利率

2、身体质量指数测算

3、九九乘法表(双循环)

4、快递运费

5、去掉重复字符

6、统计一个子串在整串中出现的次数

7、有重复数据

8、从一个字符串中移除包含在另一个字符串中的字符

9、Prime Numbers

10、GPS数据处理

11、求定积分

12、列出最简真分数序列*

题目集2    (过渡阶段)

1、长度质量计算单位换算

2、奇数求和

3、房产税计算2022

4、游戏角色选择

5、学号识别

6、巴比伦法求平方根近似值

7、二进制数值提取

8、判断三角形类型

9、求下一天

题目集3 (使用类的主要题目集)

1、创建圆类型

2、创建账户类Account

3、定义日期类

4、日期类设计

写第一次题目集时,第一次使用java,经过看书与看慕课,只懂就是这样写的格式,不懂为什么这样。后来慢慢懂了java中输入与输出是一个类,直接用即可。第一次题目较简单,了解一些Java知识加上C语言的用法,第一次的作业很容易完成,只是时间问题。主要是第10题,写GPS数据处理这道题跟大家讨论了一段时间后,才慢慢摸索出解决方案。

 

第二次题目集,主要是了解Java中选择结构与循环结构的用法,穿插了字符用法。总体是不算太难,主要一个问题就是第8题,判断两个三角形类型问题,一开是用勾股定理判断,没有解决,这问题我下面会讲。第9题为第3次题目集做了铺垫,相当于一次题目迭代吧。

 

第三次题目集,全部使用类,难度直线飙升,毕竟对类这个含义不太懂。1.2题相对3.4题算比较简单的了。但第4题我没有完成,只玩成了部分功能。最后跟同学讨论了这道题的逻辑,发现自己算法是非常复杂的。这也大大证明了我们需要大大的互相交流,得出有效方案。

 

2.设计与分析

 

 

判断三角形类型

 

这道题大多数人以为是简单题,就不断用if即可,但是最后直角或等腰直角这些测试点过不去,我也碰到这个问题,当天晚上不断搜资料,第二天老师说变量存储是有误差的吧,不是一样的。最后算差值小于0.000001即可。

当时是真的没有人问出这个问题,我就是直接蛮干,最后也没得出结果。有时真的一些别人的见解真的比自己努力更有效。

 

import java.util.*;
public class Main {
    public static void main(String[] args)
    {
        Scanner in = new Scanner(System.in);
        double a,b,c,d;
        a= in.nextDouble();
        b= in.nextDouble();
        c= in.nextDouble();
        if(a > b){
            d = a;
            a = b;
            b = d;
        }
        if(a > c){
            d = a;
            a = c;
            c = d;
        }
        if(b > c){
            d = b;
            b = c;
            c = d;
        }
        if(a<1||c>200)
        {
            System.out.printf("Wrong Format");
        }
        else
        {
            if(a+b<=c)
                System.out.printf("Not a triangle");
            else if(a==b&&b==c)
                System.out.printf("Equilateral triangle");
            else if(a==b||b==c)
            {

                if(a*a+b*b-c*c<0.000001)
                    System.out.printf("Isosceles right-angled triangle");
                else
                    System.out.printf("Isosceles triangle");
                
            }
            else if(a*a+b*b-c*c<0.000001)
            {
                System.out.printf("Right-angled triangle");
            }
            else
                System.out.printf("General triangle");
        }

        
    }
}

 

说说第9题,我也是有几个测试点没过。

代码如下

import java.util.Scanner;
public class Main {
    public static void main(String[] args)
    {
        Scanner in = new Scanner(System.in);
        int year,month,day;
        year= in.nextInt();month= in.nextInt();day= in.nextInt();
        nextDate( year, month, day);
    }
    public static boolean isLeapYear(int year) 
    {
        boolean isLeapYear=((year%4==0)&&(year%100!=0)||year%400==0);
        return isLeapYear;
    }
    public static boolean checkInputValidity(int year,int month,int day)
    {
        int []a=new int []{0,31,28,31,30,31,30,31,31,30,31,30,31};
        if(isLeapYear( year))
        {
            a[2]=29;
        }
        boolean checkInputValidity=(year>=1820&&year<=2020&&month>=1&&month<=12&&day>0&&day<=a[month]);
        {
            return checkInputValidity;
        }
    }
    public static void nextDate(int year,int month,int day) 
    {
        int d[]=new int[]{0,31,28,31,30,31,30,31,31,30,31,30,31};
        if((isLeapYear( year)))
        {
            int a,b,c;
            a=0;b=0;c=0;
            d[2]=29;
            if(checkInputValidity( year, month, day))
            {
                if(month==12)
                {
                    if(day==31)
                    {
                        a=year+1;
                        b=1;
                        c=1;
                    }
                    if(day>0&&day<d[month])
                    {
                        a=year;
                        b=month;
                        c=day+1;
                    }
                }
                if(month<12)
                {
                    if(day==d[month])
                    {
                        a=year;
                        b=month+1;
                        c=1;
                    }
                    if(day>0&&day<d[month])
                    {
                        a=year;
                        b=month;
                        c=day+1;
                    }
                }
                System.out.println("Next date is:"+a +"-" +b + "-"+ c);
            }
            else
                System.out.println("Wrong Format");
       }
        if(year<1820||year>2020)
        {
            System.out.println("Wrong Format");
        }
    }
}

到现在我也不知道这些测试点全部是哪些,我只知道我除去闰年的输入,我是输出null的,因为我的逻辑是有问题的,最后我想加上去,就是一个else结构即可,但是最后报代码太长了,出错。这次我第一次了解会有代码过长问题。所以一开始就要规划自己思路与有效方案,我们班上有一人只用50行就玩成了这题,看完她的代码,也许这就是差距。

第3次题库集的第一题看看视频,照着模板写就行,主要了解了私有属性。第二题主要是传参的使用,及巩固私有属性的方法输入与输出。不过多解释。主要解释剩下2道题。

 

 定义日期类

import java.util.Scanner;
public class Main{
    public static void main(String[] args)
    {
        Scanner in = new Scanner(System.in);
        Date date =new Date();
        int year;
        int month;
        int day;
        year= in.nextInt();
        month= in.nextInt();
        day= in.nextInt();
        date.setYear(year);
        date.setMonth(month);
        date.setDay(day);
        if(date.checkInputValidity()){
            date.getNextDate() ;
            System.out.println("Next day is:"+date.getYear() +"-" +date.getMonth() + "-"+ date.getDay());
        }
        else
            System.out.println("Date Format is Wrong");
    }
}
class Date{
    private  int year;
    private int month;
    private int day;
    int d[]=new int[]{0,31,28,31,30,31,30,31,31,30,31,30,31};
    public Date(){

    }
    public Date(int year,int month,int day){
        this.year=year;
        this.month=month;
        this.day=day;
    }
    public void setYear(int year){
        this .year=year;
    }
    public void setMonth(int month){
        this .month=month;
    }
    public void setDay(int day){
        this .day=day;
    }
    public int  getYear(){
        return this.year;
    }
    public int  getMonth(){
        return this.month;
    }
    public int  getDay(){
        return this.day;
    }
    public   boolean isLeapYear(int year){
        if((year%4==0)&&(year%100!=0)||year%400==0)
            return true;
        else
            return false;
    }
    public  boolean checkInputValidity(){
        if(this.year<1900||this.year>2000)
            return false;
        if(this.month<1||this.month>12)
            return false;
        if(this.month==1||this.month==3||this.month==5||this.month==7||this.month==8||this.month==10||this.month==12)
        {
            if(this.day>=1&&this.day<=31)
                return true;
            else
                return false;
        }
        else if(this.month==4||this.month==6||this.month==9||this.month==11)
        {
            if(this.day>=1&&this.day<=30)
                return true;
            else
                return false;
        }
        else
        {
            if(isLeapYear(this.year) )
            {
                if(this.day>=1&&this.day<=29)
                    return true;
                else
                    return false;
            }
            else
            {
                if(this.day>=1&&this.day<=28)
                    return true;
                else
                    return false;
            }
        }
    }
    public void getNextDate()
    {
        if(this.month==12)
        {
            if(this.day==d[this.month])
            {
                this.year=this.year+1;this.month=1;this.day=1;
            }
            else
                this.day=this.day+1;
            return;
        }
        if(this.month==2)
        {
            if(isLeapYear(this .year))
            {
                d[2]=29;
                if(this.day==d[this.month])
                {
                    this.day=1;
                    this.month=this.month+1;
                }
                else
                    this.day=this.day+1;
            }
            else
            {
                if(this.day==d[this.month])
                {
                    this.day=1;
                    this.month=this.month+1;
                }
                else
                    this.day=this.day+1;
            }
            return;
        }
        if(this.month==1||this.month==3||this.month==5||this.month==7||this.month==8||this.month==10)
        {
            if(this.day==d[this.month])
            {
                this.year=this.year;this.month=this.month+1;this.day=1;
            }
            else
                this.day=this.day+1;
            return;
        }
        if(this.month==4||this.month==6||this.month==9||this.month==11)
        {
            if(this.day==d[this.month])
            {
                this.year=this.year;this.month=this.month+1;this.day=1;
            }
            else
                this.day=this.day+1;
            return;
        }
    }
}

这道题我感觉我判断月份时,用的方法太死板了,一开始我用的是用一个数组来保存月份数字,但是报错了,然后改成这种死板代码。个人觉得不是很好。

这道题算简单的了,只要注意闰年与2月,月底。一个一个攻破即可

 

第4题:日期类设计(这到题没写全,只能这样写了)

 

这里我就是多了算前n天与后n天方法,具体一些算法我也加以改进了,代码如下

 

import java.util.Scanner;

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{
            System.out.println("Wrong Format");
            System.exit(0);
        } 
    }
}
class DateUtil{
    private  int year;
    private int month;
    private int day;
    public DateUtil(int year,int month,int day){
        this.year=year;
        this.month=month;
        this.day=day;
    }
     public void setYear(int year){
        this .year=year;
    }
    public void setMonth(int month){
        this .month=month;
    }
    public void setDay(int day){
        this .day=day;
    }
    public int  getYear(){
        return year;
    }
    public int  getMonth(){
        return month;
    }
    public int  getDay(){
        return day;
    }
    public   boolean isLeapYear(int year){
        if((year%4==0)&&(year%100!=0)||year%400==0)
            return true;
        else
            return false;
    }
    public  boolean checkInputValidity()
    {
        int []a=new int []{0,31,28,31,30,31,30,31,31,30,31,30,31};
        if(isLeapYear( year))
        {
            a[2]=29;
        }
        if(year>=1820&&year<=2020&&month>=1&&month<=12&&day>0&&day<=a[month])
        {
            return true;
        }
        else
            return false;
    }
    public DateUtil getNextNDays(int n){
        int year1=year;
        int month1=month;
        int  day1=day;
        int []d=new int []{0,31,28,31,30,31,30,31,31,30,31,30,31};
        if(isLeapYear(year1))
        {
            d[2]=29;
            day1=day1+n;
            while(day1>d[month1])
            {
                if(isLeapYear(year1))
                {
                    d[2]=29;
                }
                else
                    d[2]=28;
                day1=day1-d[month1];
                month1++;
                if(month1==13)
                {
                    year1++;
                    month1=1;
                }
            }
        }
        else{
            d[2]=28;
            day1=day1+n;
            while(day1>d[month1])
            {
                if(isLeapYear(year1))
                {
                    d[2]=29;
                }
                else
                    d[2]=28;
                day1=day1-d[month1];
                month1++;
                if(month1==13)
                {
                    year1++;
                    month1=1;
                }
            }
        }
        DateUtil newData = new DateUtil(year1,month1,day1);
        return newData;
    }
    public DateUtil getPreviousNDays(int n){
        int year1=year;
        int month1=month;
        int day1=day;
        int []d=new int []{0,31,28,31,30,31,30,31,31,30,31,30,31};
        if(isLeapYear( year1))
        {
            d[2]=29;
            day1=day1-n;
            while(day1<0)
            {
                if(isLeapYear(year1))
                {
                    d[2]=29;
                }
                else
                    d[2]=28;
                month1--;
                if(month1==0)
                {
                    year1--;
                    month1=12;
                }
                day1=day1+d[month1];
            }
        }
        else{
            d[2]=28;
            day1=day1-n;
            while(day1<0)
            {
                if(isLeapYear(year1))
                {
                    d[2]=29;
                }
                else
                    d[2]=28;
                month1--;
                if(month1==0)
                {
                    year1--;
                    month1=12;
                }
                day1=day1+d[month1];
            }
        }
        DateUtil newData = new DateUtil(year1,month1,day1);
        return newData;
    }
    public String showDate(){
        String a=year+"-"+month+"-"+day;
        return a;
    }
}

  

但算后n天有一个测试点没过

 

这个问题我向一个同学请教了一下,具体原因应该是在getNextNDays方法里最好不要用到累加,用了会导致最终结果大于int的范围,这也算一个重未思考过的问题(问题代码参考如下)

 

public DateUtil getNextNDays (int n){
         DateUtil Date = new DateUtil(this.year, this.month, this.day);
         for (; n > 0; ) {
             if (isLeapYear(Date.getYear())) {
                 mon_maxnum[2] = 29;
             } else {
                 mon_maxnum[2] = 28;
             }
             if (Date.getDay() < mon_maxnum[Date.getMonth()]) {
                 Date.setDay(Date.getDay() + 1);
                 n--;
             } else {
                 if (Date.getMonth() < 12) {
                     Date.setMonth(Date.getMonth() + 1);
                     Date.setDay(1);
                     n--;
                 } else {
                     Date.setMonth(1);
                     Date.setDay(1);
                     Date.setYear(Date.getYear() + 1);
                     n--;
                 }
             }
         }
         return Date;
     }

  

接下来是这道题正确解法

这里多了3个方法,compareDates,equalTwoDates,getDaysofDates。前两个方法用于判断输入的数据两者大小或是否相等,然后发送信息给getDaysofDates,这个方法用于算差值。结果最后返回即可(代码就不太好放上去了,大家按这个思路敲,慢慢试)

 

 

3.踩坑心得

这三次题库集主要文题就是三角形类型(变量之间比较问题),算天的问题(方法的传参,类的构造,思路问题(代码过长)),有时候可上网查查一些方法(直接调用,绝对比自己写代码快,例如Array,String,这些非常好用)

 

这里用了Array.sorb方法,直接排序,这不比c语言中冒泡排序简单。

 

这里我使用to.CharArray,直接把字符串转化数组问题,对数组进行操作,简单快速。

这些手段都需要慢慢积累,使用起来才能得心应手。

对于第2次题目集,第9题我根本就没考虑代码过长这个问题,这也提醒我写代码要简洁。

对于题目集第4题就暴露了好多问题,我就更本没有看懂那给出的三个方法,后问了同学,才勉强懂了它们各自作用,但是当时没懂各自传参以及this到底是啥用途,然后直接放弃了这道题,后面去恶补了这个知识空缺。

 

4.改进建议

  1.不断与同学讨论,能得出比自己更有效方案。

  2.需要不断压出自己的时间来了解一些有用的方法(这个应该慢慢积累)

  3.完善自己的代码,不要过了测试点就以为可以了,必须注意自己写代码格式,简洁程度(未来会越来越难,一开始就是复杂代码,可能后面不好操作

5.总结

这是我第一次写博客,这次写博客,给了我一个提醒,我之前写的代码真的没眼看。有许多提升手段,这是我最大收获,学习Java要看一些课,查资料(csdn),也必须看书(了解类,方法,属性,对象,这是最直接方式,快速了解Java中的一些构成)。我学习Java才刚刚开始,且必须学好。对于实验,上课,现在没有太大建议,但是希望老师能提供一些类(特别好用的那种),只要肯花时间学习Java,应该会有收获。