java题目集1-3总结

前言:

第一次作业题量比较多,但是知识点基础,难度低,我运用之前学的面向过程的编程语言的思想和java语法轻松写完了前七题,唯独第八题总是有个“等腰直角三角形”的测试点过不去。

第二次作业题量适中,知识点考查增多,难度也增加不少。我感觉这次作业重点考查的是编写程序的健壮性,每一题要考虑的点比较多,如果不能运用面向对象的编程思想会让思路十分混乱,而且首次要求在一个类中写多个方法,这对刚学java的我也是一个不小的挑战。所以这次作业我查阅了不少网上的java代码,通过对他们代码的阅读,我也是掌握了一定的写java代码的手法。于是,我顺理成章地写完了这次作业的所有习题。

第三次作业题量很少,我一看就知道不对劲,果然,这次的题目触及到了我的知识盲区,不仅如此,第三题还特别难。首先,这次作业第一题就和之前的题目都不一样,需要定义一个账户类,并需要我在主类里引用这个类,我一时间完全没有头绪,只能上csdn看一些定义两个类的写法,通过仿写csdn中的代码,我编译成功了,并且正确运行,我突然发觉这种面向对象的写法和思想多么好用,便三下五除二把与第二次作业神似的第二题写完。第三题我是真无从下手,就只写了“合法性判断”和“常数的求导”两个测试点。

设计与分析:

题目集1:

7-8:

输入三角形三条边,判断该三角形为什么类型的三角形。

 

输入格式:

 

在一行中输入三角形的三条边的值(实型数),可以用一个或多个空格或回车分隔,其中三条边的取值范围均为[1,200]。

 

输出格式:

 

(1)如果输入数据非法,则输出“Wrong Format”; (2)如果输入数据合法,但三条边不能构成三角形,则输出“Not a triangle”; (3)如果输入数据合法且能够成等边三角形,则输出“Equilateral triangle”; (3)如果输入数据合法且能够成等腰直角三角形,则输出“Isosceles right-angled triangle”; (5)如果输入数据合法且能够成等腰三角形,则输出“Isosceles triangle”; (6)如果输入数据合法且能够成直角三角形,则输出“Right-angled triangle”; (7)如果输入数据合法且能够成一般三角形,则输出“General triangle”。

 

import java.util.Scanner;
import java.math.BigDecimal;
public class Main {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
      Scanner input = new Scanner(System.in);
      double a = input.nextDouble();
      double b = input.nextDouble();
      double c = input.nextDouble();
      BigDecimal a1 = new BigDecimal(a);
      BigDecimal b1 = new BigDecimal(b);
      BigDecimal c1 = new BigDecimal(c);
      BigDecimal a2 = a1.multiply(a1);
      BigDecimal b2 = b1.multiply(b1);
      BigDecimal c2 = c1.multiply(c1);
      if((a < 1 || a > 200) || (b < 1 || b > 200) || (c < 1 || c > 200))
          System.out.print("Wrong Format");
      else {
          if((a + b <= c) || (a + c <= b) || (b + c <= a))
              System.out.print("Not a triangle");
          else if(a == b && b == c)
              System.out.print("Equilateral triangle");
          else if((a * a + b * b - c * c < 0.000001) || (a * a + c * c - b * b < 0.000001) || b * b + c * c - a * a < 0.000001) {
              if(a == b || b == c || c == a)
                 System.out.print("Isosceles right-angled triangle");
              else
                 System.out.print("Right-angled triangle");
      }
          else if(a == b || b == c || c == a)
              System.out.print("Isosceles triangle");
          else
              System.out.print("General triangle");
              
    }

}
}

主要代码思路:

1.先判断合法性,边的长度不符合的直接不合法,考虑三角形两边之和大于第三边,不符合的输出不是一个三角形,合法即继续向下执行代码。

2.再判断三角形的类型,三边相等即输出等边三角形,除此之外,判断两边的平方和是否等于第三边的平方,是或不是都判断有两边是相等的,是且相等输出等腰直角三角形,不相等输出直角三角形,不是且相等输出等腰三角形,不相等输出普通三角形。

题目集2:

7-4:

输入年月日的值(均为整型数),输出该日期的下一天。 其中:年份的合法取值范围为[1820,2020] ,月份合法取值范围为[1,12] ,日期合法取值范围为[1,31] 。 注意:不允许使用Java中和日期相关的类和方法。

要求:Main类中必须含有如下方法,签名如下:

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) ; //求输入日期的下一天
 

输入格式:

在一行内输入年月日的值,均为整型数,可以用一到多个空格或回车分隔。

输出格式:

  1. 当输入数据非法及输入日期不存在时,输出“Wrong Format”;
  2. 当输入日期合法,输出下一天,格式如下:Next date is:年-月-日
import java.util.Scanner;
public class Main {
    public static void main(String[] args){//主方法 
           Scanner input = new Scanner(System.in);
           int year = input.nextInt();
           int month = input.nextInt();
           int day = input.nextInt();
           if(checkInputValidity(year,month,day)) {
               nextDate(year,month,day);
           }
           else
               System.out.print("Wrong Format");    
    }
 
    public static boolean isLeapYear(int year){//判断year是否为闰年,返回boolean类型;
            if(year % 400 == 0)
                    return true;
                else {
                    if(year % 100 != 0 && year % 4 == 0)
                       return true;
                    else
                        return false;
                }        
    }
    
    public static boolean checkInputValidity(int year,int month,int day){//判断输入日期是否合法,返回布尔值
        int d = 0,f = 0;
        if(year < 1820 || year > 2020)    
            f = 0;    
        else if(month < 1 || month > 12) 
            f = 0;                    
        else {
            if(month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12){
                if(day < 1 || day > 31)    
                    d = 0;
                else 
                    f = d = 1;                    
            }
            if(month == 4 || month == 6 || month == 9 || month == 11) {
                if(day < 1 || day > 30)    
                    d = 0;
                else 
                    f = d = 1;
            }
            if(month == 2) {
                if(isLeapYear(year)) {
                     if(day < 1 || day > 29)
                         d = 0;
                     else 
                         f = d = 1;
                 }
                else {
                     if(day < 1 || day > 28)
                         d = 0;
                     else 
                         f = d = 1;
                }
            }
                
        }
        if(f == 0 || d == 0)
            return false;
        else
            return true;
    }
    public static void nextDate(int year,int month,int day) { //求输入日期的下一天
        int a = 0;
        if(month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 ){
              if(day == 31) {
                  month+= 1;
                  day = 1;
                  a = 1;
              }
              else {
                  if(a == 1) {
                  
                    }
                  else
                  day+= 1;
              }
        }
        if(month == 4 || month == 6 || month == 9 || month == 11) {
              if(day == 30) {
                  month+= 1;
                  day = 1;
                  a = 1;
              }
              else{
                  if(a == 1) {
                      
                  }
                  else
                  day+= 1;
              }
        }
        if(month == 2) {
            if(isLeapYear(year)) {
                  if(day == 29) {                     
                      month+= 1;
                      day = 1;
                      a = 1;
                  }
                  else {
                      if(a == 1) {
                          
                      }
                      else 
                        day+= 1;
              }
            }
            else {
                  if(day == 28) {
                      month+= 1;
                      day = 1;
                      a = 1;
                  }
                  else{
                      if(a == 1) {
                          
                        }
                      else
                      day+= 1;
            }
         }
        }
        if(month == 12) {
            
              if(day == 31) {
                  month = 1;
                  day = 1;
                  year+= 1;
              }
              else
                  day+= 1;
        }
        System.out.print("Next date is:" + year + "-" + month + "-" + day);
    }
}

主要代码思路:

1.先在类里定义

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) ; //求输入日期的下一天

2.在判断闰年的方法里,闰年是100的倍数时要是400的倍数才为闰年,不是100的倍数时是4的倍数即为闰年。是闰年返回布尔值true,不是返回false

在判断输入日期是否合法的日期里,年份的合法范围是1820-2020,不符合就返回false,符合判断月份是否在1-12范围里,不符合就返回false,符合判断日期,1-12月日期分别对应31,28或29,31,30,31,30,31,31,30,31,30,31,符合返回true,不符合返回false

在输出日期的下一天的方法里,先判断月份,如果月份是1,3,5,7,8,10,再判断日期是否是31,是就把月份改成下个月,日期变为一号,不是就日期加1;如果月份是4,6,9,11,再判断日期是否是30,是就把月份改成下个月,日期变为一号,不是就日期加1,如果是2月就判断是否为闰年,是就判断日期是否为29,不是就判断28,其他如上;如果月份是12月就判断日期是否为31,是就年份加一,月份和日期变为1,不是就如上。

主方法里先判断输入的日期是否合法,是就进入输出日期的下一天,不是就输出不合法。

7-5

输入年月日的值(均为整型数),同时输入一个取值范围在[-10,10] 之间的整型数n,输出该日期的前n天(当n > 0时)、该日期的后n天(当n<0时)。
其中年份取值范围为 [1820,2020] ,月份取值范围为[1,12] ,日期取值范围为[1,31] 。
注意:不允许使用Java中任何与日期有关的类或方法。

输入格式:

在一行中输入年月日的值以及n的值,可以用一个或多个空格或回车分隔。

输出格式:

  1. 当输入的年、月、日以及n的值非法时,输出“Wrong Format”;
  2. 当输入数据合法时,输出“n days ago is:年-月-日”
import java.util.Scanner;
public class Main {
    public static void main(String[] args){//主方法 
           Scanner input = new Scanner(System.in);
           int year = input.nextInt();
           int month = input.nextInt();
           int day = input.nextInt();
           int n =  input.nextInt();
           if(checkInputValidity(year,month,day,n)) {
               agoDate(year,month,day,n);
           }
           else
               System.out.print("Wrong Format");    
    }
 
    public static boolean isLeapYear(int year){//判断year是否为闰年,返回boolean类型;
            if(year % 400 == 0)
                    return true;
                else {
                    if(year % 100 != 0 && year % 4 == 0)
                       return true;
                    else
                        return false;
                }        
    }
    
    public static boolean checkInputValidity(int year,int month,int day,int n){//判断输入日期是否合法,返回布尔值
        int d = 0,f = 0;
        if(year < 1820 || year > 2020)    
            f = 0;    
        else if(month < 1 || month > 12) 
            f = 0;                    
        else {
            if(month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12){
                if(day < 1 || day > 31)    
                    d = 0;
                else 
                    f = d = 1;                    
            }
            if(month == 4 || month == 6 || month == 9 || month == 11) {
                if(day < 1 || day > 30)    
                    d = 0;
                else 
                    f = d = 1;
            }
            if(month == 2) {
                if(isLeapYear(year)) {
                     if(day < 1 || day > 29)
                         d = 0;
                     else 
                         f = d = 1;
                 }
                else {
                     if(day < 1 || day > 28)
                         d = 0;
                     else 
                         f = d = 1;
                }
            }
                
        }
        if(n > 10 || n < -10)
            f = 0;
        if(f == 0 || d == 0)
            return false;
        else
            return true;
    }
    public static void agoDate(int year,int month,int day,int n) { //求输入日期的前n天
        int a = 0;
        if(n < 0) {
           if(month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 ){
              if(day - n > 31) {
                  month+= 1;
                  a = 1;
                  day = day - n - 31;
              }
              else {
                  if(a == 1) {
                  
                    }
                  else
                  day-= n;
              }
           }
          if(month == 4 || month == 6 || month == 9 || month == 11) {
              if(day - n > 30) {
                  month+= 1;
                  a = 1;
                  day = day - n - 30;
              }
              else{
                  if(a == 1) {
                      
                  }
                  else
                  day-= n;
              }
        }
        if(month == 2) {
            if(isLeapYear(year)) {
                  if(day - n > 29) {                     
                      month+= 1;
                      a = 1;
                      day = day - n - 29;
                  }
                  else {
                      if(a == 1) {
                          
                      }
                      else 
                        day-= n;
              }
            }
            else {
                  if(day - n > 28) {
                      month+= 1;
                      a = 1;
                      day = day - n - 28;
                  }
                  else{
                      if(a == 1) {
                          
                        }
                      else
                      day-= n;
            }
         }
        }
        if(month == 12) {
            
              if(day - n > 31) {
                  month = 1;
                  day = day - n - 31;
                  year+= 1;
              }
              else
                  day-= n;
        }
        System.out.print(n + " days ago is:" + year + "-" + month + "-" + day);
    }
        if(n >= 0) {
               if(month - 1 == 1 || month - 1 == 3 || month - 1 == 5 || month - 1 == 7 || month - 1 == 8 || month - 1 == 10 ){
                  if(day - n <= 0) {
                      month-= 1;
                      a = 1;
                      day = day - n + 31;
                  }
                  else {
                      if(a == 1) {
                      
                        }
                      else
                      day-= n;
                  }
               }
              if(month - 1 == 4 || month - 1 == 6 || month - 1 == 9 || month - 1 == 11) {
                  if(day - n <= 0) {
                      month-= 1;
                      a = 1;
                      day = day - n + 30;
                  }
                  else{
                      if(a == 1) {
                          
                      }
                      else
                      day-= n;
                  }
            }
            if(month - 1 == 2) {
                if(isLeapYear(year)) {
                      if(day - n <= 0) {                     
                          month-= 1;
                          a = 1;
                          day = day - n + 29;
                      }
                      else {
                          if(a == 1) {
                              
                          }
                          else 
                            day-= n;
                  }
                }
                else {
                      if(day - n <= 0) {
                          month-= 1;
                          a = 1;
                          day = day - n + 28;
                      }
                      else{
                          if(a == 1) {
                              
                            }
                          else
                          day-= n;
                }
             }
            }
            if(month == 1) {
                
                  if(day - n <= 0) {
                      month = 12;
                      day = day - n + 31;
                      year-= 1;
                  }
                  else
                      day-= n;
            }
            System.out.print(n + " days ago is:" + year + "-" + month + "-" + day);
        }
    }
}

主要代码思路:

1.除了public static void agoDate(int year,int month,int day,int n) { //求输入日期的前n天 

其他的方法都与7-4一个思路。

2.求输入日期的前n天的方法先判断求的是前几天还是后几天,如果求前几天,如果月份减一是1,3,5,7,8,10,再判断日期-n是否是小于等于0,是就把月份改成上个月,日期变为day-n+31,不是就日期减n;如果月份减一是4,6,9,11,再判断日期-n是否小于等于0,是就把月份改成上个月,日期变为day-n+31,不是就日期减n,如果是3月就判断是否为闰年,是就判断日期是否为29,不是就判断28,其他如上;如果月份是1月就判断日期是-n否为小于等于0,是就年份减一,月份变为12月,日期变为day-n+31,不是就如上;如果求后几天,思路如上。

题目集3:

7-2:

定义一个类Date,包含三个私有属性年(year)、月(month)、日(day),均为整型数,其中:年份的合法取值范围为[1900,2000] ,月份合法取值范围为[1,12] ,日期合法取值范围为[1,31] 。 注意:不允许使用Java中和日期相关的类和方法,否则按0分处理。

要求:Date类结构如下图所示:

类图.jpg

输入格式:

在一行内输入年月日的值,均为整型数,可以用一到多个空格或回车分隔。

输出格式:

  • 当输入数据非法及输入日期不存在时,输出“Date Format is Wrong”;
  • 当输入日期合法,输出下一天,格式如下:Next day is:年-月-日
import java.util.Scanner;
class Date{
    private int year;
    private int month;
    private int day;
    int[] mon_maxnum = 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.day = day;
        this.month = month;
        this.year = year;
    }
    public int getYear() {
        return year;
    }
    public void setYear(int year) {
        this.year = year;
    }
    public int getMonth() {
        return month;
    }
    public void setMonth(int month) {
        this.month = month;
    }
    public int getDay() {
        return day;
    }
    public void setDay(int day) {
        this.day = day;
    }
    public boolean isLeapYear(){//判断year是否为闰年,返回boolean类型;
        if(this.year % 400 == 0)
                return true;
            else {
                if(this.year % 100 != 0 && this.year % 4 == 0)
                   return true;
                else
                    return false;
            }        
    }
    public boolean checkInputValidity(){//判断输入日期是否合法,返回布尔值
        int d = 0,f = 0;
        if(this.year < 1900 || this.year > 2000)    
            f = 0;    
        else if(this.month < 1 || this.month > 12) 
            f = 0;                    
        else {
            if(this.month != 2){
                if(this.day < 1 || this.day > mon_maxnum[this.month]) {
                    d = 0;
                }
                else {
                    d = f = 1;
                }
            }
        
            if(this.month == 2) {
                if(isLeapYear()) {
                    if(this.day < 1 || this.day > mon_maxnum[this.month] + 1) {
                        d = 0;
                    }
                    else {
                        d = f = 1;
                    }
                }
                else {
                    if(this.day < 1 || this.day > mon_maxnum[this.month]) {
                        d = 0;
                    }
                    else {
                        d = f = 1;
                    }
                }
            }
        }
          if(f == 0 || d == 0)
                return false;
            else
                return true;
     }
    public void getNextDate() { //求输入日期的下一天
        int a = 0;
        if(this.month == 1 || this.month == 3 || this.month == 5 || this.month == 7 || this.month == 8 || this.month == 10 ){
              if(day == 31) {
                  this.month+= 1;
                  this.day = 1;
                  a = 1;
              }
              else {
                  if(a == 1) {
                  
                    }
                  else
                  this.day+= 1;
              }
        }
        if(this.month == 4 || this.month == 6 || this.month == 9 || this.month == 11) {
              if(this.day == 30) {
                  this.month+= 1;
                  this.day = 1;
                  a = 1;
              }
              else{
                  if(a == 1) {
                      
                  }
                  else
                  this.day+= 1;
              }
        }
        if(this.month == 2) {
            if(isLeapYear()) {
                  if(this.day == 29) {                     
                      this.month+= 1;
                      this.day = 1;
                      a = 1;
                  }
                  else {
                      if(a == 1) {
                          
                      }
                      else 
                        this.day+= 1;
              }
            }
            else {
                  if(this.day == 28) {
                      this.month+= 1;
                      this.day = 1;
                      a = 1;
                  }
                  else{
                      if(a == 1) {
                          
                        }
                      else
                      this.day+= 1;
            }
         }
        }
        if(this.month == 12) {
            
              if(this.day == 31) {
                  this.month = 1;
                  this.day = 1;
                  this.year+= 1;
              }
              else
                  this.day+= 1;
        }
        System.out.print("Next day is:" + year + "-" + month + "-" + day);
    }
}


public class Main {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner input = new Scanner(System.in);
        Date Day = new Date();
        Day.setYear(input.nextInt());
        Day.setMonth(input.nextInt());
        Day.setDay(input.nextInt());
        if(Day.checkInputValidity()) {
               Day.getNextDate();
           }
           else
               System.out.print("Date Format is Wrong");
    }

}

主要代码思路:

1.此题要先定义一个Date类,此类中除了setter和getter方法其他和题目集2中思路一样,先设置私有属性year,month,day,只能通过get方法得到他们的值,并且在此类外无法修改他们的值,只能通过set方法修改。

2.在主类里引用Date类,并通过set方法输入year,month,day,如果合法就getNextDate();不合法就输出日期错误。

7-3

 

编写程序性,实现对简单多项式的导函数进行求解。详见作业指导书。 OO作业3-3题目说明.pdf

输入格式:

在一行内输入一个待计算导函数的表达式,以回车符结束。

输出格式:

  1. 如果输入表达式不符合上述表达式基本规则,则输出“Wrong Format”。
  2. 如果输入合法,则在一行内正常输出该表达式的导函数,注意以下几点: 结果不需要排序,也不需要化简;
  • 当某一项为“0”时,则该项不需要显示,但如果整个导函数结果为“0”时,则显示为“0”;
  • 当输出结果第一项系数符号为“+”时,不输出“+”;
  • 当指数符号为“+”时,不输出“+”;
  • 当指数值为“0”时,则不需要输出“x^0”,只需要输出其系数即可。

输出格式见输入输出示例。

主要代码思路:

1.先判断合法性,不合法就输出返回false,合法就求导。

2.求常数的导。

我就写到这里了,其他我实在不会了。

采坑心得:

题目集1:7-8:此题出的有一点问题,题目描述里并没有确定两边的平方和与第三边的平方之差精确到小数点后第几位能判定此为直角三角形,导致我在等腰直角三角形这个测试点上一直出错,因为当等腰直角三角形的斜边为有理数时,等腰直角三角形的两直角边长度一定是无理数,所以输入一个有理数作为直角边和一个有理数作为斜边一定不能恰好满足勾股定理。题目集2和题目集三并未遇到坑。

改进建议:

现在我学了圈复杂度的计算方法,发现我这几次的代码感觉的有点复杂了,下次作业我尽量少写if-else,多写switch,case减少复杂度,而且每一题尽量使用面向对象的思路,多分类和把每个方法都写的简洁明了。
 

 总结

通过这三次的练习,我掌握了java的书写习惯和面向对象的思考方法,在优化代码和减少复杂度的方面有所欠缺,需要在这方面改进。

我认为老师教的方式挺好,可以边学边写,这门课程也没有想象中的困难,希望我以后可以学的很好,实验很好的加强了我的打代码能力,还有一定的趣味性,课上大家积极写题目,氛围很好,上课布置的课下小作业也有趣,比较贴近生活,不会让我感觉这门课枯燥无味,让我更有动力学习java。

 

posted @ 2021-10-15 23:39  还就那个肉蛋冲击  阅读(65)  评论(0)    收藏  举报