20201709-黄世洋 前三次Java作业总结
一、前言
1、第一次作业分析
题量:八
知识点:通过简单的计算,两数之和来考察输入和输出,电话键盘字母数字之间的转换来考察ASCII表和条件判断语句的应用,其他的题目还涉及到有循环的嵌套排序问题。
难度:适中。当时对于初学Java的我来说有点难度,虽然有C语言的基础,但对于过了一个寒假的我来说还是有点难度的。
2、第二次作业分析
题量:五
知识点:第一题IP地址转换考察了我们进制之间的转换,第二题考察了我们数组的合并和数组里边的排序问题,第三题判断闰年问题来考察我们对于多种情况的分类讨论,第四题和第五题的求下一天和求前N天相类似,更深程度上的考察了我们对于多种情况的讨论。
难度:适中。这次的技术作业难度不是很大但是更注重考查一个人的细心和耐心程度。
3、第三次作业分析
题量:三
知识点:第一题是创建Account类考察对类的理解和掌握,第二题是定义一个日期类同样是考察对类的理解和掌握,第三题是求简单函数的导数,这题考查了类和正则表达式。
难度:难。这次的作业前两题可以做,比较简单,没什么难度,最后一题就不一样了,最后一题用到了正则表达式,在学C的时候没学过正则表达式,相关知识没了解过做起来比较吃力。
二、设计与分析
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”。
源代码:
public class Main {
public static void main(String[] args)
{
Scanner input = new Scanner(System.in);
double a,b,c;
a = input.nextDouble();
b = input.nextDouble();
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<=c||a+c<=b||b+c<=a)
System.out.println("Not a triangle");
else
if(a==b&&b==c)//等边三角形
{
System.out.println("Equilateral triangle");
}
else
if(((a==b)&&(a*a+b*b-c*c<0.00001))||((a==c)&&(a*a+c*c-b*b<0.00001))||((b==c)&&(c*c+b*b-a*a<0.00001)))//等腰直角三角形
{
System.out.println("Isosceles right-angled triangle");
}
else
if((a==b)||(a==c)||(b==c))//等腰三角形
{
System.out.println("Isosceles triangle");
}
else
if((a*a+b*b-c*c<0.00001)||(a*a+c*c-b*b<0.00001)||(b*b+c*c-a*a<0.00001))//直角三角形
{
System.out.println("Right-angled triangle");
}
else
if(a+b>c&&a+c>b&&b+c>a)//普通三角形
{
System.out.print("General triangle");
}
}
}
分析:这一题主要是对几种三角形的判断问题,起初是对输入数据的合法性进行判断,数据合法的话就先判断等边三角形,之后依次判断等腰直角三角形,等腰三角形,直角三角形,如果师以上情形之外的那么就是普通的三角形
不合法:

等边:

等腰:

直角:

2、题目集二
7.4:
题目:求下一天。
输入年月日的值(均为整型数),输出该日期的下一天。 其中:年份的合法取值范围为[1820,2020] ,月份合法取值范围为[1,12] ,日期合法取值范围为[1,31] 。 注意:不允许使用Java中和日期相关的类和方法
输入格式:在一行内输入年月日的值,均为整型数,可以用一到多个空格或回车分隔。
输出格式:
- 当输入数据非法及输入日期不存在时,输出“Wrong Format”;
- 当输入日期合法,输出下一天,格式如下:Next date is:年-月-日
源代码:
import java.util.*; 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(); if(!checkInputValidity(x,y,z)) { System.out.print("Wrong Format"); System.exit(0); } else { nextDate(x,y,z); } }//主方法 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){ 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)||(y==4&&z==31)||(y==6&&z==31)||(y==9&&z==31)||(y==11)&&z==31) { return false; } else return true; }//判断输入日期是否合法,返回布尔值 public static void nextDate(int x,int y,int z) { int a=x; int b=y; int c=z; if(y==2||y==4||y==6||y==9||y==11) { if(y==2) { if(isLeapYear(x)) { if(z==29) { c=1; b=y+1; } } else { if(z==28) { c=1; b=y+1; } } } else{ if(z==30) { b=y+1; c=1; } else { c=z+1; } } } else { if(y==12) { if(z==31) { a++; b=1; c=1; } } else { if(z==31) { b=y+1; c=1; } else { c=z+1; } } } System.out.print("Next date is:"+a+"-"+b+"-"+c); }//求输入日期的下一天 }
分析:求下一天主要是几个点多注意一下,首先是输入数据的合法性判断,跨年测试,跨月测试,闰年的判断,二月最后一天。这几个点注意一下。
输入数据测试:
输入样例1:

输入样例2:

闰年2月29日:

平年2月29日:

平年2月28日:

跨年测试:

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){ int a=x; int b=y; int c=z; if(t>=0)//输入t大于0表示求前t天 { 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); } } else//t<0,求后t天 { 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); } } } }
分析:首先是对输入数据的合法性测试,输入的n分正负如果t>0,则求前t天,如果t<0,则求后t天。其他要注意的地方和上一题基本类似,闰年、平年二月,还有跨年测试。
在输入数据合法的前提下,先判断t的正负,之后判断是否为闰年,在对2月,12月两种情况判断,在之后是1、3、5、8、10月进行判断,最后剩余的情况就是4、6、9、11月。
输入数据测试:
输入样例1:

输入样例2:

闰年2月29:


平年2月29:


跨年测试:


错误数据测试:

3、题目集三:
7-2:
题目:定义日期类
题目详情:
定义一个类Date,包含三个私有属性年(year)、月(month)、日(day),均为整型数,其中:年份的合法取值范围为[1900,2000] ,月份合法取值范围为[1,12] ,日期合法取值范围为[1,31] 。 注意:不允许使用Java中和日期相关的类和方法,否则按0分处理。
要求:Date类结构如下图所示:

输入格式:在一行内输入年月日的值,均为整型数,可以用一到多个空格或回车分隔。
输出格式:
- 当输入数据非法及输入日期不存在时,输出“Date Format is Wrong”;
- 当输入日期合法,输出下一天,格式如下: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(); date.setYear(year); date.setMonth(month); date.setDay(day); date.getYear(); date.getMonth(); date.getDay(); if(!date.checklnputvalidity(year,month,day)) { System.out.println("Date Format is Wrong"); System.exit(0); } date.getnextDate(year,month,day); } } class Date{ private int year; private int month; private int day; int [] mon_maxnum= new int[]{0,31,28,31,30,31,30,31,30,31,31,30,31,30,31}; 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 year; } public int getMonth() { return month; } public int getDay() { return day; } public boolean isLeapYear(int year) { boolean k=false; if((year%4==0&&year%100!=0)||year%400==0) k=true; return k; } public boolean checklnputvalidity(int x,int y,int z){ if(x<1900||x>2000||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)||(y==4&&z==31)||(y==6&&z==31)||(y==9&&z==31)||(y==11)&&z==31) { return false; } else return true; } public void getnextDate(int x,int y,int z) { int a=x; int b=y; int c=z; if(y==2||y==4||y==6||y==9||y==11) { if(y==2) { if(isLeapYear(x)) { if(z==29) { c=1; b=y+1; } else { c=z+1; } } else { if(z==28) { c=1; b=y+1; } else { c=z+1; } } } else{ if(z==30) { b=y+1; c=1; } else { c=z+1; } } } else { if(y==12) { if(z==31) { a++; b=1; c=1; } else { c=z+1; } } else { if(z==31) { b=y+1; c=1; } else { c=z+1; } } } System.out.println("Next day is:"+a+"-"+b+"-"+c); }//求输入日期的下一天 }
分析:
本题和上一次作业中的第四次作业相似,不相同的地方是把日期定义成了一个类。其他的地方方法之类的都是相似的。这样使整个代码的可读性得到了提高。
数据测试请参考上一题。
7-3:
这一题有点难,没写出来。
但是学了一下正则表达式了解了Java中的相关函数。
三、采坑心得
具体的错误代码在做题过程中没有记录,我总结了一下我在这几次代码中的常见错误:
1、从键盘读取的方法next()和nextline()的区别
next()是单个读取可以以空格为隔断符,而nextLine()是整行读取。
2、print()和printf()和println()的区别
printf主要是继承了C语言的printf的一些特性,可以进行格式化输出
print就是一般的标准输出,但是不换行
println和print基本没什么差别,就是最后会换行
3、关于java中正则表达式的相关类和方法
Pattern 类:
pattern 对象是一个正则表达式的编译表示。Pattern 类没有公共构造方法。要创建一个 Pattern 对象,你必须首先调用其公共静态编译方法,它返回一个 Pattern 对象。该方法接受一个正则表达式作为它的第一个参数。
Matcher 类:
Matcher 对象是对输入字符串进行解释和匹配操作的引擎。与Pattern 类一样,Matcher 也没有公共构造方法。你需要调用 Pattern 对象的 matcher 方法来获得一个 Matcher 对象。
PatternSyntaxException:
PatternSyntaxException 是一个非强制异常类,它表示一个正则表达式模式中的语法错误。
4、关于对象和类
我的理解是类是对象存在的前提,先创造一个类,然后再用类创造对象。类中的属性就像是一个人的名字和年龄差不多,方法和一个人的行为差不多,比如说唱歌,跳舞。
四、改进建议
感觉每一题老师可以提示学生用一些特定的方法来让学生做,或者让学生可以用更多种方法来做,考察学生某一方面或者多方面的能力。
五、总结
这几次的作业一共有8+5+3=16题,在这16题中只有一题是只提交了一次就全部正确直接过关的,有一题不会没有写出来,还有一题有一个测试点没过少了一分,其他的全部都是自己经过多次失败并从中寻找错误并改正到最终得出来的结果。总之呢,做题时,没有感觉到很烦,遇到困难也没有放弃,不会的话就翻书上网查资料。这个过程虽然花费时间多,但是自己是真正的学到了知识,自己的能力得到了提高。
说一下这几次作业中我经常出现的问题,一些问题已经在上边提到,前两次作业因为之前有C语言的基础,做起来没什么难度起码自己有思路。从第三次开始,“类”的介入给我搞得措手不及。刚开始是真的不了解“类”和“对象”的含义。不过通过这次的作业和老师的讲解,开始对它有了解,知道了“类”和“对象”的含义,了解了“属性”“方法”和“类”的关系,做起题来更加简单而且更有逻辑性。在编程时更有感觉有思路。在之后是正则表达式,学了正则表达式之后使我对字符串类型数据处理更加得心应手。
再来说一下对老师的建议,其实没有太多,就是希望老师可以把每次的练习题出现的一些问题涉及到的知识点可以给我们讲一下,没了。

浙公网安备 33010602011771号