前三次作业总结 20201721-王开程

Posted on 2021-04-04 16:55  妖怪写代码  阅读(89)  评论(0)    收藏  举报

第一次Blog作业

一、前言:总结三次题目知识点、题量、难度

第一次作业知识点:简单的输入,简单的数值运算,比大小等等。如计算两个数的和,电话键盘字母数字转换,成绩分级管理,计算税率,计算钱币,使用一维数组求平均值,对多个整数进行排序,判断三角形类型

第二次作业知识点:从控制台读取输入、赋值语句和赋值表达式、数值数据类型和操作。如IP地址转换,合并两个有序数组为新的有序数组,判断闰年及星期几,求下一天,求前n天。

第三次作业知识点:类的创建和方法的创建,对数据进行封装处理,正则表达式。如创建账户类Account,定义日期类,一元多项式求导

第一次作业题目虽多,但是题比较简单,题量正常。

第二次作业题目也多,但题目大多是之前是语言学习过的题目,基本思想有题量正常。

第三次作业题目少,但每道题题目难度都很大,尤其是第三题,题量有点多

二、设计与分析

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;

public class Main {

    public static void main(String[] args){

       try (Scanner in = new Scanner(System.in)) {

                double a=0,b=0,c=0;

              a = in.nextDouble();

              b =in.nextDouble();

              c=in.nextDouble();

     if(a>0 && b>0 && c>0) {

                       if(a>b) {

                                double num = a;

                                a=b;

                                b= num;

                       }

                       if(a>c) {

                                double num = a;

                                a=c;

                                c= num;

                       }

                       if(b>c) {

                                double num = b;

                                b=c;

                                c= num;

                       }

                       if(a+b>c) {

                                if(a*a+b*b<c*c) {

                                        if(a==b) {

                                                 System.out.println("Isosceles triangle");

                                        }else {

                                                 System.out.println("General triangle");

                                        }

                                }else if(a*a+b*b==c*c) {

                                        if(a==b) {

                                                 System.out.println("Isosceles right-angled triangle");

                                        }else {

                                                  System.out.println("Right-angled triangle");

                                        }

                                }else {

                                        if(a==b) {

                                                 if(b==c) {

                                                          System.out.println("Equilateral triangle");

                                                 }else {

                                                          System.out.println("Isosceles triangle");

                                                 }

                                        }else {

                                                 System.out.println("General triangle");

                                        }

                                }

                       }else {

                                System.out.println("Not a triangle");

                       }

              }else {

                       System.out.println("Wrong Format");

              }

     }

   }

}

 

 

本题解题思路:首先判断输入的类型是否为正整数,对输入的数据是否合法进行判断,根据三角形的定义,对每一条边进行计算,如果有两条边相等,则为等腰三角形,如果符合勾股定理,则为直角三角形,如果三条边相等,则为等边三角形,同时符合等腰和直角的为等腰直角三角。再根据不同的三角形输出相应的值。

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

 

输入格式:

 

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

输出格式:

 

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

    当输入日期合法,输出下一天,格式如下:Next date is:年-月-日

源码:

import java.util.Scanner;

public class Main {

         public static boolean isLeapYear(int year)

         {

                  if((year%4==0)&&(year%100!=0)||year%400==0)

                  return true;

                  return false;

         }

         public static boolean checkInputValidity(int year,int month,int day)

         {

                 

                  if(year<1820||year>2020)

                          return false;

                  else if(month<1||month>12)

                          return false;

                  else if(day<1||day>31)

                          return false;

                  else

                  {

                          if(isLeapYear(year))

                          {

                if((month==2&&day>29)||(month==4&&day>30)||(month==6&&day>30)||(month==9&&day>30)||(month==11&&day>30))

                         return false;

               

                          }

                          else

                          {

                if((month==2&&day>28)||(month==4&&day>30)||(month==6&&day>30)||(month==9&&day>30)||(month==11&&day>30))

                         return false;

                          }

                  }

                  return true;

         }

        

              public static void nextDate(int year,int month,int day)

                  {

                                   if(month==1||month==3||month==5||month==7||month==8||month==10)

                                   {

                                            if(day!=31)

                                            {

                                                     System.out.print(year+"-"+month+"-"+(day+1));

                                            }

                                            else

                                            {

                                                     System.out.print(year+"-"+(month+1)+"-1");

                                            }

                                   }

                                  

                                   if(month==2)

                                   {

                                            month2(year,month,day);

                                   }

                                  

                                   if(month==4||month==6||month==9||month==11)

                                   {

                                            month46911(year,month,day);

                                   }

 

                                   if(month==12)

                                   {

                                            if(day!=31)

                                            {

                                                     System.out.print(year+"-"+month+"-"+(day+1));

                                            }

                                            else

                                            {

                                                     System.out.print((year+1)+"-"+"1-1");

                                            }

                                   }

                  }

                 

              public static void month2(int year,int month,int day) {

                       if(isLeapYear(year))

                                   {

                                   if(day!=29)

                                   {

                                            System.out.print(year+"-"+month+"-"+(day+1));

                                   }

                                   else

                                   {

                                            System.out.print(year+"-"+(month+1)+"-1");

                                   }

                                   }

                                   else

                                   {

                                            if(day!=28)

                                            {

                                                     System.out.print(year+"-"+month+"-"+(day+1));

                                            }

                                            else

                                            {

                                                     System.out.print(year+"-"+(month+1)+"-1");

                                            }

                                   }

              }

              public static void month46911(int year,int month,int day) {

                       if(day!=30)

                                   {

                                            System.out.print(year+"-"+month+"-"+(day+1));

                                   }

                                   else

                                   {

                                            System.out.print(year+"-"+(month+1)+"-1");

                                   }

              }

                  public static void main(String[] args) {

                          try (Scanner in = new Scanner(System.in)) {

 

                                   int year,month,day;

                                   year=in.nextInt();

                                   month=in.nextInt();

                                   day=in.nextInt();

                                   if(checkInputValidity(year,month,day))

                                   {

                                            System.out.print("Next date is:");

                                            nextDate(year,month,day);

                                   }

                                   else

                                   {

                                            System.out.println("Wrong Format");

                                   }

                          }

}

}

本题解题思路:首先对输入的数据进行判断,是否在范围内。是否合法。下一步再对您进行判断,是否是闰年。接着对月份年日期分别进行判断,是否符合题目所给出的要求。如果是闰年,则进行特殊判断。然后创建一个计算下一天的方法,在一月三月五月七月八月十月,如果输入的这一天不是31号,则直接在日期上加一天,如果输出的日期是31号,则在月份上加一天日期归为一。如果是二月,咋判断是否日期为29号?如果为29号,则月数加一日期归一,如果不是,则日期加一天。剩下的四月六月九月十一月,如果日期为30号,则月数加一日期归一,如果日期不是30号,则日期加一。在十二月,如果为31号,则年份加一月数归一日期归一。如果不为31号,则日期加一。最后再根据说输出的日期进行输出。

7-5求前N天

输入年月日的值(均为整型数),同时输入一个取值范围在[-10,10] 之间的整型数n,输出该日期的前n天(当n > 0时)、该日期的后n天(当n<0时)。

其中年份取值范围为 [1820,2020] ,月份取值范围为[1,12] ,日期取值范围为[1,31] 。

注意:不允许使用Java中任何与日期有关的类或方法。

输入格式:

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

输出格式:

当输入的年、月、日以及n的值非法时,输出“Wrong Format”;

当输入数据合法时,输出“n days ago is:年-月-日”

源码:

import java.util.Scanner;
public class Main{
public static void main(String[] args){
	        Scanner input = new Scanner(System.in);
	        int x = input.nextInt();
	        int y = input.nextInt();
	        int z = input.nextInt();
	        int t = input.nextInt();
	        if(!checkInputValidity(x,y,z,t))
	        {
	            System.out.print("Wrong Format");
	            System.exit(0);
	        }
	        else
	        {
	            qianntian(x,y,z,t);
	        }
	    }//主方法
public static boolean isLeapYear(int x) {
    boolean k;
    if((x%4==0&&x%100!=0)||x%400==0)
        k=true;
    else
        k=false;
    return k;
}//判断year是否为闰年,返回boolean类型
public static boolean checkInputValidity(int x,int y,int z,int t){
    if(t>=-10&&t<=10) {
        if (x < 1820 || x > 2020 || y < 1 || y > 12 || z < 1 || z > 31) {
            return false;
        }
        if (!isLeapYear(x)) {
            if (y == 2 && z == 29) {
                return false;
            }
        }
        if ((y == 2 && z == 31||z==30) || (y == 4 && z == 31) || (y == 6 && z == 31) || (y == 9 && z == 31) || (y == 11) && z == 31) {
            return false;
        } else
            return true;
    }
    else
        return false;
}//判断输入日期是否合法,返回布尔值
public static void qianntian(int x,int y,int z,int t){
    if(t>=0)
    {
        t1(x,y,z,t);
    }
    else
    {
        t2(x,y,z,t);
}
}
    public static void t1(int x,int y,int z,int t) {
    	int a=x;
        int b=y;
        int c=z;
        if(isLeapYear(x))
        {
            if(y==3&&z<=t)
            {
                b=y-1;
                c=29-(t-z);
            }
            if(y==1&&z<=t)
            {
                a=x-1;
                b=12;
                c=31-(t-z);
            }
            if((y==2||y==4||y==6||y==8||y==9||y==11)&&z<=t)
            {
                b=y-1;
                c=31-(t-z);
            }
            if((y==5||y==7||y==10||y==12)&&z<=t)
            {
                b=y-1;
                c=30-(t-z);
            }
            if(z>t)
            {
                c=z-t;
            }
            System.out.print(t+" days ago is:"+a+"-"+b+"-"+c);
        }
        else
        {
            if(y==3&&z<=t)
            {
                b=y-1;
                c=28-(t-z);
            }
            if(y==1&&z<=t)
            {
                a=x-1;
                b=12;
                c=31-(t-z);
            }
            if((y==2||y==4||y==6||y==8||y==9||y==11)&&z<=t)
            {
                b=y-1;
                c=31-(t-z);
            }
            if((y==5||y==7||y==10||y==12)&&z<=t)
            {
                b=y-1;
                c=30-(t-z);
            }
            if(z>t)
            {
                c=z-t;
            }
            System.out.print(t+" days ago is:"+a+"-"+b+"-"+c);
        }
    }
        public static void t2(int x,int y,int z,int t) {
        	int a=x;
            int b=y;
            int c=z;
        	t=-t;
            if(isLeapYear(x))
            {
                if(y==2&&t>(29-z))
                {
                    b=y+1;
                    c=t-(29-z);
                }
                if(y==12&&t>(31-z))
                {
                    a=x+1;
                    b=1;
                    c=t-(31-z);
                }
                if((y==1||y==3||y==5||y==7||y==8||y==10)&&t>(31-z))
                {
                    b=y+1;
                    c=t-(31-z);
                }
                if((y==4||y==6||y==9||y==11)&&t>(30-z))
                {
                    b=y+1;
                    c=t-(30-z);
                }
                if(y!=2&&y!=4&&y!=6&&y!=9&&y!=11&&t<=(31-z))
                {
                    c=z+t;
                }
                if(y!=2&&y!=1&&y!=3&&y!=5&&y!=7&&y!=8&&y!=10&&y!=12&&t<=(30-z))
                {
                    c=z+t;
                }
                if(y==2&&t<=(29-z))
                {
                    c=z+t;
                }
                System.out.print(-t+" days ago is:"+a+"-"+b+"-"+c);
            }
            else
            {
                if(y==2&&t>(28-z))
                {
                    b=y+1;
                    c=t-(28-z);
                }
                if(y==12&&t>(31-z))
                {
                    a=x+1;
                    b=1;
                    c=t-(31-z);
                }
                if((y==1||y==3||y==5||y==7||y==8||y==10)&&t>(31-z))
                {
                    b=y+1;
                    c=t-(31-z);
                }
                if((y==4||y==6||y==9||y==11)&&t>(30-z))
                {
                    b=y+1;
                    c=t-(30-z);
                }
                if(y!=2&&y!=4&&y!=6&&y!=9&&y!=11&&t<=(31-z))
                {
                    c=z+t;
                }
                if(y!=2&&y!=1&&y!=3&&y!=5&&y!=7&&y!=8&&y!=10&&y!=12&&t<=(30-z))
                {
                    c=z+t;
                }
                if(y==2&&t<=(28-z))
                {
                    c=z+t;
                }
                System.out.print(-t+" days ago is:"+a+"-"+b+"-"+c);
            }
        }
        
    }

 

本题解题思路:首先判断输入的日期是否符合要求,判断年份是否为闰年,判断数字日期是否合法,返回布尔值,在判断月份是否符合要求返回布尔值。根据是否为闰年进行两种不同的计算方式,根据月份不同,对日期进行不同的累加,如果为一月三月五月七月八月十月十二月则加31天,如果为四月六月九月十一月则加30天。如果含二月则进行特殊判断,根据年份不同加的天数也不同。最后进行总的累加,输出。

7-2定义日期类

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

输入格式:

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

输出格式:

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

当输入日期合法,输出下一天,格式如下:Next day is:年-月-日

源码:

import java.util.Scanner;
public class Main {
	public static void main(String[] args) {
    Scanner sc= new Scanner(System.in);
    Year yr= new Year();
    yr.setyear(sc.nextInt());
    yr.setmonth(sc.nextInt());
    yr.setday(sc.nextInt());
    sc.close();
    if(yr.cheakinput(yr.getyear(), yr.getmonth(), yr.getday())) {
    	yr.NextDate();
    }
    else {
    	System.out.println("Date Format is Wrong");
    }
    }
}
class Year{
	private int year;
	public boolean cheakinput(int year,int month, int day) {
		boolean flag = true;
		if(year > 2000 || year < 1900) {
			flag = false;
		}
		if(month > 12 || month <1) {
			flag = false;
		}
		if(month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12) {
			if(day < 1||day>31) flag = false;
		}
		else if(month == 4 || month == 6 || month ==9 || month == 11) {
			if(day<1||day>30) flag = false;
		}
		else if(month == 2){
			if((year%4==0&&year%400!=0)||year%400==0) {
				if(day<1||day>29) flag = false;
			}else {
				if(day<1||day>28) flag = false;
			}
		}
		return flag;
	}
	public int getyear() {
		return year;
	}
	public void setyear(int year) {
		this.year = year;
	}
	private int month;
	public int getmonth() {
		return month;
	}
	public void setmonth(int month) {
		this.month = month;
	}
	private int day;
	public int getday() {
		return day;
	}
	public void setday(int day) {
		this.day = day;
	}
	public void NextDate()
	{
		int year1,mouth1,day1;
		int run=0;
			while(true)
			{
				if((this.year%4==0&&this.year%400!=0)||this.year%400==0)
					run=1;
				else
					run=0;
				break;
			}

			if (this.day==31||(this.day==30&&(this.month==4||this.month==6||this.month==9||this.month==11)))
			{
				if(this.month==12){
					mouth1=1;
					year1=this.year+1;
					day1=1;
				}
				else{
					mouth1=this.month+1;
					year1=this.year;
					day1=1;
				}
			}
			else if((this.day==29&&this.month==2)||(this.day==28&&this.month==2&&run==0))
			{
				mouth1=3;
				year1=this.year;
				day1=1;
			}
			else
			{
				mouth1=this.month;
				day1=this.day+1;
				year1=this.year;
			}
			System.out.println("Next day is:"+year1+"-"+mouth1+"-"+day1);
		}
}

 本题解题思路:定义一个年类,包括年月日期,对三个数据进行封装,再根据题目要求,分别对年月日进行判断是否符合要求,否则直接输出数据错误,命名一个方法为计算下一天,首先对年份进行判断是否为闰年,然后再对不同月份进行不同的计算,对于一月,三月,五月,七月,八月,十月,十二月,如果日期小于31天,则在日期加一,如果日期等于31天,这月份加一,日期等于一,对于四月,六月,九月,11月则为30天,如果日期小于30天,则在日期加一,如果日期,等于30则月份加1日期等于一,12月单独判断,如果12月的日期为31,这年份加一月份和日期都等于一。最后根据方法所得到的日期进行输出。

三、踩坑心得

1、不同的类调用要加上其它类的前缀,同一个类调用某个数据,需要加上this. 。

2、不同判断条件下,且或的熟练应用&&||

3、数据封装后用getter和setter,进行修改和调用。

四、改进建议

1、代码逻辑性不强,很多没有必要的可以删掉

2、在循环中不断套循环进行计算,运算起来很麻烦。

3、输入数据始终不喜欢最后关闭

五、总结

在这为期一个月的学习中,我切实体会到了,从C语言java的转变,但是有了上学期学习的计算机思维和解题思路,这一个月来更多的是如何实现功能,以及对java有了更深的理解,有了一定面对对象设计的思维。学会了类方法等等知识。