第一次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有了更深的理解,有了一定面对对象设计的思维。学会了类方法等等知识。
浙公网安备 33010602011771号