blog第一次作业

(1)前言

  1.第一次的作业偏向于基础性的东西,没有太大的难度,主要是让我们熟悉一下java的编程模式,虽然题量较多,但是总体难度不太,主要是让我们适应一下开学后的学习以及新的课程。

  2.第二次的作业整体存在一定的难度,考察我们字符串和一维数组的创建和使用,有一些新的知识点我们都还没有学到,需要自己去进行课外的学习,进而完成pta上老师发布的作业,不然仅凭老师上课所讲到的知识,是很难独立地将老师发布的作业完成。

  3.而第三次的作业难度更高了点,因为老师上课只讲了一些类的系统的概念,没有细说类的创建和使用,因此需要我们去自学,再完成老师发布的作业。但是我们对类的学习还很不熟练,不能够很好地去定义并使用,还有正则表达式老师也没有讲到,因此第三次作业还是存在一定的困难的,不过值得庆幸的是,题量并不是很多。

(2)设计与分析

 1.第一次作业

 

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

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

输入格式:

在一行中输入三角形的三条边的值(实型数),可以用一个或多个空格或回车分隔,其中三条边的取值范围均为[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;
public class Main{
    public static void main(String[] args){
    Scanner input = new Scanner(System.in);
    double a=input.nextDouble();
   double b=input.nextDouble();
    double c=input.nextDouble();
    if(a<1||a>200||b<1||b>200||c<1||c>200)
    System.out.println("Wrong Format");
        else if(a==b&&b==c&&a==c)
             System.out.println("Equilateral triangle");
         else if(a==b&&a*a+b*b==c*c&&a+b>c&&b+c>a&&a+c>b||b==c&&b*b+c*c==a*a&&a+b>c&&b+c>a&&a+c>b||a==c&&a*a+c*c==b*b&&a+b>c&&b+c>a&&a+c>b)
             System.out.println("Isosceles right-angled triangle");
        else if(a==b&&a+b>c&&b+c>a&&a+c>b||b==c&&a+b>c&&b+c>a&&a+c>b||a==c&&a+b>c&&b+c>a&&a+c>b)
             System.out.println("Isosceles triangle");
         else if(a*a+b*b==c*c&&a+b>c&&b+c>a&&a+c>b||b*b+c*c==a*a&&a+b>c&&b+c>a&&a+c>b||a*a+c*c==b*b&&a+b>c&&b+c>a&&a+c>b)
             System.out.println("Right-angled triangle");
        else if(a+b>c&&b+c>a&&a+c>b)
             System.out.println("General triangle");
        else
            System.out.println("Not a triangle");
}
  }

  设计思路:  

   使用if选择语句,首先判断输入的三角形三条边的值是否合法,再通过不同的条件筛选出是否为等边三角形、直角三角形、直角等腰三角形等情况,然后输出正确答案。

  以下为部分测试结果:

  

 

  

  

 

2.第二次作业

 

7-4 求下一天 (30 分)
 

输入年月日的值(均为整型数),输出该日期的下一天。 其中:年份的合法取值范围为[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 days;
        String a;
        int x   =input.nextInt();
        int y   =input.nextInt();
        int z   =input.nextInt();
        if(checkInputValidity(x,y,z)==false)
            System.out.println("Wrong Format");
        else 
            nextDate(x,y,z);     
    }
    public static boolean isLeapYear(int year)//判断year是否为闰年,返回boolean类型;
    {
        if(year%4==0&&year%100!=0||year%400==0)
            return true;
        else
            return false;
    }
    
   public static boolean checkInputValidity(int year,int month,int day)//判断输入日期是否合法,返回布尔值
   {
       int[] months={31,28,31,30,31,30,31,31,30,31,30,31};
       if(isLeapYear(year)==true)
           months[1]=29;
         if(year<1820||year>2020||month<1||month>12||day<1||day>31||day>months[month-1])
             return false;
       else 
           return true;
   }
 public static void nextDate(int year,int month,int day) //求输入日期的下一天
    {
        int[] months={31,28,31,30,31,30,31,31,30,31,30,31};   
         if(isLeapYear(year)==true)
           months[1]=29;
        if(day==months[month-1])
        {
            if(month==12)
            {
                year=year+1;
                month=1;
                day=1;
            }
            else
            {
                month=month+1;
            day=1;
            }
        }
     else
         day=day+1;
     System.out.println("Next date is:"+year+"-"+month+"-"+day);
    }
}

  设计思路:

   通过创建的方法,完成判断输入年份是否为闰年,判断输入日期是否合法,并输出输入日期的下一天的功能。其中要注意闰年的二月末,闰年的最后一天等特殊时期,输出正确的答案。

  以下为部分测试结果:

  

  

 

 

7-5 求前N天 (30 分)
 

输入年月日的值(均为整型数),同时输入一个取值范围在[-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 days;
        String a;
        int x   =input.nextInt();
        int y   =input.nextInt();
        int z   =input.nextInt();
        int n   =input.nextInt();
        if(checkInputValidity(x,y,z,n)==false)
            System.out.println("Wrong Format");
        else 
            nextDate(x,y,z,n);     
    }
    public static boolean isLeapYear(int year)//判断year是否为闰年,返回boolean类型;
    {
        if(year%4==0&&year%100!=0||year%400==0)
            return true;
        else
            return false;
    }
    
   public static boolean checkInputValidity(int year,int month,int day,int n)//判断输入日期是否合法,返回布尔值
   {
       int[] months={31,28,31,30,31,30,31,31,30,31,30,31};
       if(isLeapYear(year)==true)
           months[1]=29;
         if(year<1820||year>2020||month<1||month>12||day<1||day>31||day>months[month-1]||n<(-10)||n>10)
             return false;
       else 
           return true;
   }
 public static void nextDate(int year,int month,int day,int n) //求输入日期的下一天
    {
        int[] months={31,28,31,30,31,30,31,31,30,31,30,31};   
         if(isLeapYear(year)==true)
           months[1]=29;
            day=day-n;
        if(day<0)
        {
                if(month==1)
                {
                year=year-1;
                month=12;
                day=31+day;
            }
            else
            {
                month=month-1;
            day=months[month-1]+day;
            }
        }
     else if(day>months[month-1])
        {
         if(month==12)
                {
                year=year+1;
                month=1;
                day=day-31;
            }
         else
         {
         month=month+1;
         day=day-months[month-2];
             }
     }
     System.out.println(n+" days ago is:"+year+"-"+month+"-"+day);
    }
}

  设计思路:同第四题思路相似,只不过把输出下一天换成了输出前N天。

  以下为部分测试结果:

  

 

   

 

   

 

 3.第三次作业

 

7-2 定义日期类 (28 分)
 

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

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

类图.jpg

输入格式:

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

输出格式:

 

1.当输入数据非法及输入日期不存在时,输出“Date Format is Wrong”;

2.当输入日期合法,输出下一天,格式如下:Next day 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();
         Date date =new Date(year,month,day);
         if(date.checkInputValidity(year,month,day)==false)
          System.out.println("Date Format is Wrong");
     else
            date.getNextDate(); 
     }
    public static class Date{
    private int year;
        private int month;
        private int day;
    Date(){
    }
    Date(int year,int month,int day){
        this.year=year;
        this.month=month;
        this.day=day;
    }
    boolean isLeapYear(int year)
    {
        if(year%4==0&&year%100!=0||year%400==0)
            return true;
        else
            return false;
    }
    
    boolean checkInputValidity(int year,int month,int day)
   {
        
       int[] months={31,28,31,30,31,30,31,31,30,31,30,31};
       if(isLeapYear(year)==true)
           months[1]=29;
         if(year<1900||year>2000||month<1||month>12||day<1||day>31||day>months[month-1])
             return false;
       else 
           return true;
   }
void getNextDate()
    {
     int x=year;
    int y=month;
    int z=day;
        int[] months={31,28,31,30,31,30,31,31,30,31,30,31};   
         if(isLeapYear(x)==true)
           months[1]=29;
        if(day==months[y-1])
        {
            if(y==12)
            {
                x=x+1;
                y=1;
                z=1;
            }
            else
            {
                y=y+1;
            z=1;
            }
        }
     else
         z=z+1;
     System.out.println("Next day is:"+x+"-"+y+"-"+z);}
    }
}

  设计思路:与第二次作业的7-4类似,只不过是创建了一个类用来存放的属性和方法,使程序已经初步有了面向对象的样子。

  以下为部分测试结果:

  

   

   

 

 7-3 一元多项式求导(类设计) (50 分)

  程序未完成。

(3)采坑心得

1.没有注意编程时符号的错误,导致很多次的编译错误,不够细心,总是忘记输入“,”或者将其输成中文符号,导致编译错误;

2.static是创建静态方法,没有注意到静态方法中不能够调用非静态方法,导致编译出错;

3.没有搞清楚类的含义,不能够熟练地使用类,单纯的以为类只是另一种方法,结果最开始编写程序的时候出现了大量的错误;

4.java中并没有NextChar()的这种方法,因此最开始不知道如何输入一个字符;

5.没有搞清楚String类型下next()和nextline()的区别,导致程序的输出存在不足之处;

(4)改进建议
第一次作业中的7-8中,没有注意到输入的三条边是double实数类型,因此还需要存在一定的误差,因此判断三角形类型的代码中应该更加精确。
(5)总结
通过这三次的pta作业,我认识到了一些问题,我对java这门课程的学习还存在很多的问题,没有花费足够的到java的学习当中去,因为如果仅靠老师上课所传授的知识,是不可能能够独立完成老师所发布的pta作业的,一定要在课外进行学习,否则只会离老师的进度越来越远,差距越来越大。我明白了,在今后的学习中,不能只靠老师所传授的知识,一定要在课外进行自我学习,才能越走越远。
posted @ 2021-04-04 23:22  南久  阅读(108)  评论(0)    收藏  举报