Blog1
一:前言
1.题目集一:知识点考察是对java程序的输入和输出,从控制台读取输入,字符串和数组的简单处理,命名常量,声明变量以及赋值语句以及赋值表达式和地判断语句的应用(也就是考察逻辑推理能力);题目量适中,只有8道题目,并且考察的都是一些基础的知识,所以难度并不是很难因为主要还是考察逻辑推理。前几题都是简单的判断输出语句,还有一题简单的数组处理题,再加上最后一道逻辑推断题目。
2.题目集二:知识点考察是 类和对象,Java程序的输入和输出,字符串以及数组基本处理;题目量适中,只有5道题目;难度一般偏简单,第一题的IP地址转换以及第二题对数组处理是对后面关于日期题目的的热身,后面三道题目其实差不多是一种类型,判断闰年,求下一天的日期,判断今天距离某年某月某日多少天等(类型差不多,所以并不难);
3.题目集三:知识点考察是类的功能处理,和逻辑推理能力,题目较前两次变得少了,但是难度却变难了许多,尤其是第三题,第一题是关于创建ACCOUNT的账户,第二题其实与题目集二类型一模一样(都是求输入今天求下一天的日期)但是第三题却不一样,涉及新的内容,需要我们自己学习,正则表达式这是需要我们自己学习,所以这也就是导致第三题的难度直线飙升的原因。总体来说,难度前两题一般,但第三题还是有点难度的。
二:设计与分析
1.题目集一7-8:判断三角形类型
输入三角形三条边,判断该三角形为什么类型的三角形。
输入格式:
在一行中输入三角形的三条边的值(实型数),可以用一个或多个空格或回车分隔,其中三条边的取值范围均为[1,200]。
输出格式:
(1)如果输入数据非法,则输出“Wrong Format”; (2)如果输入数据合法,但三条边不能构成三角形,则输出“Not a triangle”; (3)如果输入数据合法且能够成等边三角形,则输出“Equilateral triangle”; (4)如果输入数据合法且能够成等腰直角三角形,则输出“Isosceles right-angled triangle”; (5)如果输入数据合法且能够成等腰三角形,则输出“Isosceles triangle”; (6)如果输入数据合法且能够成直角三角形,则输出“Right-angled triangle”; (7)如果输入数据合法且能够成一般三角形,则输出“General triangle”。
输入样例1:
在这里给出一组输入。例如:
50 50 50.0
输出样例1:
在这里给出相应的输出。例如:
Equilateral triangle
输入样例2:
在这里给出一组输入。例如:
60.2 60.2 80.56
输出样例2:
在这里给出相应的输出。例如:
Isosceles triangle
输入样例3:
在这里给出一组输入。例如:
0.5 20.5 80
输出样例3:
在这里给出相应的输出。例如:
Wrong Format
运行代码:
1 import java.util.Scanner; 2 public class Main{ 3 public static void main(String[] args){ 4 Scanner sc = new Scanner(System.in); 5 double a; 6 double b; 7 double c; 8 a = sc.nextDouble(); 9 b = sc.nextDouble(); 10 c = sc.nextDouble(); 11 if(a<1||a>200||b>200||b<1||c<1||c>200){ 12 System.out.print("Wrong Format"); 13 } 14 else if(a+b<=c||a+c<=b||b+c<=a){ 15 System.out.print("Not a triangle"); 16 } 17 else if(a==b&&a==c){ 18 System.out.print("Equilateral triangle"); 19 } 20 else if(a==b&&a*a+b*b-c*c<0.01||a==c&&a*a+b*b-c*c<0.01||b==c&&b*b+c*c-a*a<0.01) 21 System.out.print("Isosceles right-angled triangle"); 22 else if(a==b&&a!=c||a==c&&a!=b||b==c&&b!=a) 23 System.out.print("Isosceles triangle"); 24 else if(a*a+b*b-c*c<0.01||a*a+c*c-b*b<0.01||b*b+c*c-a*a<0.01) 25 System.out.print("Right-angled triangle"); 26 else System.out.print("General triangle"); 27 } 28 }
设计与分析:这道题主要分析三角形的类型,注意千万别考虑少了情况, 直角的分析就是分析一边的平方加上零一条边长的平方是否等于零一条边长的平方, 判断三角形成立的条件是两边之和大于第三边(需要判断任意两条边之和大于第三边),其他的三角形也是按照各自的特点进行判断。我就是先判断是否符合题目要求,然后判断是否属于三角形,若属于则继续判断是属于等边三角形还是等腰直角三角形还是等腰三角形还是直角三角形还是普通三角形,看是属于哪个就输出相应的输出结果。代码上使用的都是if-else语句。
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) ; //求输入日期的下一天
输入格式:
在一行内输入年月日的值,均为整型数,可以用一到多个空格或回车分隔。
输出格式:
- 当输入数据非法及输入日期不存在时,输出“Wrong Format”;
- 当输入日期合法,输出下一天,格式如下:Next date is:年-月-日;
-
输入样例1:
在这里给出一组输入。例如:
2020 3 10输出样例1:
在这里给出相应的输出。例如:
Next date is:2020-3-11输入样例2:
在这里给出一组输入。例如:
2025 2 10输出样例2:
在这里给出相应的输出。例如:
Wrong Format
代码:
1 import java.util.Scanner;
2 public class Main {
3 public static void main(String[] args) {
4 Scanner sc = new Scanner(System.in);
5 int year = sc.nextInt();
6 int month = sc.nextInt();
7 int day = sc.nextInt();
8 if(checkInputValidity(year,month,day)) {
9 nextDate( year, month, day);
10 }
11 else System.out.print("Wrong Format");
12 }
13 public static boolean isLeapYear(int year) {
14 if(year % 4 == 0&&year % 100 != 0||year % 400 == 0)
15 return true;
16 else return false;
17 }
18 public static boolean checkInputValidity(int year,int month,int day) {
19 if(year<1820||year>2020||month<1||month>12) {
20 return false;
21 }
22 else if(year>=1820&&year<=2020&&month>=1&&month<=12) {
23 if(month == 1||month == 3||month == 5||month == 7||month == 8||month == 10||month == 12) {
24 if(day < 1||day > 31) {
25 return false;
26 }
27 else return true;
28 }
29 else if(month == 4||month == 6||month == 9||month == 11){
30 if(day < 1||day > 30) {
31 return false;
32 }
33 else return true;
34 }
35 else if(month == 2){
36 if(isLeapYear(year)){
37 if(day < 1||day > 29) {
38 return false;
39 }
40 else return true;
41 }
42 else{
43 if(day < 1||day > 28) {
44 return false;
45 }
46 else return true;
47 }
48 }
49 }
50 return true;
51 }
52 public static void nextDate(int year,int month,int day){
53 if(month == 1&&day == 31) {
54 month = month + 1;
55 day = 1;
56 }
57 else if(month == 2) {
58 if(isLeapYear(year)&&day == 29) {
59 month = month + 1;
60 day = 1;
61 }
62 else if(day == 28) {
63 month = month + 1;
64 day = 1;
65 }
66 }
67 else if(month == 3&&day == 31) {
68 month = month + 1;
69 day = 1;
70 }
71 else if(month == 4&&day == 30) {
72 month = month + 1;
73 day = 1;
74 }
75 else if(month == 5&&day == 31) {
76 month = month + 1;
77 day = 1;
78 }
79 else if(month == 6&&day == 30) {
80 month = month + 1;
81 day = 1;
82 }
83 else if(month == 7&&day == 31) {
84 month = month + 1;
85 day = 1;
86 }
87 else if(month == 8&&day == 31) {
88 month = month + 1;
89 day = 1;
90 }
91 else if(month == 9&&day == 30) {
92 month = month + 1;
93 day = 1;
94 }
95 else if(month == 10&&day == 31) {
96 month = month + 1;
97 day = 1;
98 }
99 else if(month == 11&&day == 30) {
100 month = month + 1;
101 day = 1;
102 }
103 else if(month == 12&&day == 31) {
104 month = 1;
105 year = year + 1;
106 day = 1;
107 }
108 else day += 1;
109 System.out.print("Next date is:" + year + "-" + month + "-" + day);
110 }
111 }
设计与分析:这道题目用了多个方法,并且主要也是用了if-else语句;首先我用了一个方法是判断闰年的,然后还有一个方法是判断下一天的,当然这些条件成立的前提是必须符合另一个方法,也就是判断该天是不是符合日期中的日期,若不符合则输出Wrong Forma,若符合则继续判断,判断下一天有许多注意的地方,注意二月,也就是注意闰年的问题,还要注意每个月的最后一天,因为它要输出的时下一个月的日期(二月在这里是一个特殊的月份,既要判断闰年,又要判断最后一天),还要判断的是12月份,因为它的最后一天的下一天是下一年的第一天,所以这些是特殊情况;当然这样代码机会比较复杂,但不过也清晰明了了。
题目集二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:年-月-日”
输入样例1:
在这里给出一组输入。例如:
2018 6 19 8
输出样例1:
在这里给出相应的输出。例如:
8 days ago is:2018-6-11
输入样例2:
在这里给出一组输入。例如:
2018 6 19 -8
输出样例2:
在这里给出相应的输出。例如:
-8 days ago is:2018-6-27
代码:
1 import java.util.Scanner;
2 public class Main {
3 public static void main(String[] args) {
4 Scanner sc = new Scanner(System.in);
5 int year,month,day;
6 year = sc.nextInt();
7 month = sc.nextInt();
8 day = sc.nextInt();
9 if(year<1820||year>2020||month<1||month>12) {
10 System.out.print("Wrong Format");
11 System.exit(0);
12 }
13 else if(year>=1820&&year<=2020&&month>=1&&month<=12){
14 if(month == 1||month == 3||month == 5||month == 7||month == 8||month == 10||month == 12) {
15 if(day < 1||day > 31){
16 System.out.print("Wrong Format");
17 System.exit(0);
18 }
19 }
20 else if(month == 4||month == 6||month == 9||month ==11){
21 if(day < 1||day >30){
22 System.out.print("Wrong Format");
23 System.exit(0);
24 }
25 }
26 else if(month == 2){
27 if(isLeapYear(year)) {
28 if(day < 1||day >29){
29 System.out.print("Wrong Format");
30 System.exit(0);
31 }
32 }
33 else if(day < 1||day >28){
34 System.out.print("Wrong Format");
35 System.exit(0);
36 }
37 }
38 }
39 int n = sc.nextInt();
40 if(n < (-10)||n > 10){
41 System.out.print("Wrong Format");
42 System.exit(0);
43 }
44 if(n <= 0) {
45 if(month == 1||month == 3||month == 5||month == 7||month == 8||month == 10) {
46 if((-n) + day > 31) {
47 day = (-n) + day - 31;
48 month++;
49 }
50 else day = day + (-n);
51 }
52 else if(month == 4||month == 6||month == 9||month ==11) {
53 if((-n) + day > 30) {
54 day = (-n) + day - 30;
55 month++;
56 }
57 else day = day + (-n);
58 }
59 else if(month == 12) {
60 if((-n) + day > 31) {
61 day = (-n) + day - 31;
62 month = 1;
63 year++;
64 }
65 else day = day + (-n);
66 }
67 else if(month == 2) {
68 if(isLeapYear(year)) {
69 if((-n) + day >29) {
70 day = (-n) + day -29;
71 month++;
72 }
73 else day ++;
74 }
75 else if((-n) + day >28) {
76 day = (-n) + day -28;
77 month++;
78 }
79 else day ++;
80 }
81 }
82 else if(n > 0) {
83 if(month == 2||month == 4||month == 6||month == 8||month == 9||month == 11) {
84 if(day - n < 0) {
85 day = 31 - (n - day);
86 month --;
87 }
88 else day = day - n;
89 }
90 else if(month == 5||month == 7||month == 12||month == 10) {
91 if(day - n < 0) {
92 day = 30 - (n - day);
93 month --;
94 }
95 else day = day - n;
96 }
97 else if(month == 3) {
98 if(isLeapYear(year)) {
99 if((day - n < 0)){
100 day = 29 - (n - day);
101 month--;
102 }
103 else day = day - n;
104 }
105 else if(day - n < 0) {
106 day = 28 - (n - day);
107 month --;
108 }
109 else day = day - n;
110 }
111 else if(month == 1) {
112 if(day - n < 0) {
113 day = 31 - (n - day);
114 year --;
115 month = 12;
116 }
117 else day = day - n;
118 }
119 }
120 System.out.println(n + " days ago is:" + year + "-" + month + "-" + day);
121 }
122 public static boolean isLeapYear(int year) {
123 if(year % 4 == 0&&year % 100 != 0||year % 400 == 0)
124 return true;
125 else return false;
126 }
127 }
设计与分析:这一题是求他的前N天,因为N可以是整数也可以是负数,所以这里要特别注意,因为当N为正数时,它是前几天,而当N为负数时,它是后几天;当然这道题也要用多种方法,首先第一个方法当然是主方法,但是因为我把判断日期合不合法放在主方法里面了,所以就少了一种方法,并且我也把判断N天前也放在主方法里面了,所以也少了一种方法, 其次呢,方法是判断闰年。在这道题中,我先开始是判断N的正负值,若为正,则须考虑一月,三月这两个月,因为三月的前N天若为2月需判断闰年,一月的前N天可能为前一年,所以这两个是最特殊的;若为负,则需考虑二月和12月这两个月,因为二月需要判断闰年,它是可能有28天或者29天,所以判断几天后二月是一个特殊的月份,十二月的几天后可能是下一年的日期,所以十二月也是一个不可或缺的特殊的日期。我使用的主要语句还是if-else。
3.题目集三7-2:定义日期类
定义一个类Date,包含三个私有属性年(year)、月(month)、日(day),均为整型数,其中:年份的合法取值范围为[1900,2000] ,月份合法取值范围为[1,12] ,日期合法取值范围为[1,31] 。 注意:不允许使用Java中和日期相关的类和方法,否则按0分处理。
要求:Date类结构如下图所示:

输入格式:
在一行内输入年月日的值,均为整型数,可以用一到多个空格或回车分隔。
输出格式:
- 当输入数据非法及输入日期不存在时,输出“Date Format is Wrong”;
- 当输入日期合法,输出下一天,格式如下:Next day is:年-月-日
输入样例1:
在这里给出一组输入。例如:
1912 12 25
输出样例1:
在这里给出相应的输出。例如:
Next day is:1912-12-26
输入样例2:
在这里给出一组输入。例如:
2001 2 30
输出样例2:
在这里给出相应的输出。例如:
Date Format is Wrong
代码:
1 import java.util.Scanner;
2 public class Main {
3
4 public static void main(String[] args) {
5 // TODO 自动生成的方法存根
6 Scanner input = new Scanner(System.in);
7 int year = input.nextInt();
8 int month = input.nextInt();
9 int day = input.nextInt();
10 Date date = new Date(year,month,day);
11 if(date.checkInputValidity())
12 date.nextDate();
13 else
14 System.out.println("Date Format is Wrong");
15 }
16
17 }
18 class Date {
19 private int year;
20 private int month;
21 private int day;
22 int[] mom_maxnum = {0,31,28,31,30,31,30,31,31,30,31,30,31};
23 public Date() {
24 super();
25 }
26 public Date(int year, int month, int day) {
27 super();
28 this.year = year;
29 this.month = month;
30 this.day = day;
31 }
32 public int getYear() {
33 return year;
34 }
35 public void setYear(int year) {
36 this.year = year;
37 }
38 public int getMonth() {
39 return month;
40 }
41 public void setMonth(int month) {
42 this.month = month;
43 }
44 public int getDay() {
45 return day;
46 }
47 public void setDay(int day) {
48 this.day = day;
49 }
50 public boolean isLeapYear() {
51 if(year % 4 == 0&&year % 100 != 0||year % 400 == 0)
52 return true;
53 else return false;
54 }
55 public boolean checkInputValidity() {
56 if(year < 1900||year > 2000||month < 1||month > 12) {
57 return false;
58 }
59 else if(year >= 1900&&year <= 2000&&month>= 1&&month<= 12) {
60 if(month == 1||month == 3||month == 5||month == 7||month == 8||month == 10||month == 12) {
61 if(day < 1||day > 31) {
62 return false;
63 }
64 else return true;
65 }
66 else if(month == 4||month == 6||month == 9||month == 11){
67 if(day < 1||day > 30) {
68 return false;
69 }
70 else return true;
71 }
72 else if(month == 2){
73 if(isLeapYear()){
74 if(day < 1||day > 29) {
75 return false;
76 }
77 else return true;
78 }
79 else{
80 if(day < 1||day > 28) {
81 return false;
82 }
83 else return true;
84 }
85 }
86 }
87 return true;
88 }
89 public void nextDate(){
90 if(month == 1&&day == 31) {
91 month = month + 1;
92 day = 1;
93 }
94 else if(month == 2) {
95 if(isLeapYear()&&day == 29) {
96 month = month + 1;
97 day = 1;
98 }
99 else if(day == 28) {
100 month = month + 1;
101 day = 1;
102 }
103 }
104 else if(month == 3&&day == 31) {
105 month = month + 1;
106 day = 1;
107 }
108 else if(month == 4&&day == 30) {
109 month = month + 1;
110 day = 1;
111 }
112 else if(month == 5&&day == 31) {
113 month = month + 1;
114 day = 1;
115 }
116 else if(month == 6&&day == 30) {
117 month = month + 1;
118 day = 1;
119 }
120 else if(month == 7&&day == 31) {
121 month = month + 1;
122 day = 1;
123 }
124 else if(month == 8&&day == 31) {
125 month = month + 1;
126 day = 1;
127 }
128 else if(month == 9&&day == 30) {
129 month = month + 1;
130 day = 1;
131 }
132 else if(month == 10&&day == 31) {
133 month = month + 1;
134 day = 1;
135 }
136 else if(month == 11&&day == 30) {
137 month = month + 1;
138 day = 1;
139 }
140 else if(month == 12&&day == 31) {
141 month = 1;
142 year = year + 1;
143 day = 1;
144 }
145 else day += 1;
146 System.out.print("Next day is:" + year + "-" + month + "-" + day);
147 }
148
149 }
设计与分析:这道题目用了类方法,建立了一个日期类,并且主要也是用了if-else语句;在类里面首先我用了一个方法是判断闰年的,然后还有一个方法是判断下一天的,当然这些条件成立的前提是必须符合另一个方法,也就是判断该天是不是符合日期中的日期,若不符合则输出Wrong Format,若符合则继续判断,判断下一天有许多注意的地方,注意二月,也就是注意闰年的问题,还要注意每个月的最后一天,因为它要输出的时下一个月的日期(二月在这里是一个特殊的月份,既要判断闰年,又要判断最后一天),还要判断的是12月份,因为它的最后一天的下一天是下一年的第一天,所以这些是特殊情况;当然这样代码机会比较复杂,但不过也清晰明了了。
题目集三7-3:
编写程序性,实现对简单多项式的导函数进行求解。详见作业指导书。
输入格式:
在一行内输入一个待计算导函数的表达式,以回车符结束。
输出格式:
- 如果输入表达式不符合上述表达式基本规则,则输出“Wrong Format”。
- 如果输入合法,则在一行内正常输出该表达式的导函数,注意以下几点: 结果不需要排序,也不需要化简;
- 当某一项为“0”时,则该项不需要显示,但如果整个导函数结果为“0”时,则显示为“0”;
- 当输出结果第一项系数符号为“+”时,不输出“+”;
- 当指数符号为“+”时,不输出“+”;
- 当指数值为“0”时,则不需要输出“x^0”,只需要输出其系数即可。
输出格式见输入输出示例。
输入样例1:
在这里给出一组输入。例如:
-2* x^-2+ 5*x^12-4*x+ 12
输出样例1:
在这里给出相应的输出。例如:
4*x^-3+60*x^11-4
输入样例2:
在这里给出一组输入。例如:
2*x^6-0*x^7+5
输出样例2:
在这里给出相应的输出。例如:
Wrong Format
代码:正则没怎么看懂但是理解了部分所以只得了一点的分数,
1 import java.util.regex.Matcher;
2 import java.util.regex.Pattern;
3 import java.util.*;
4 public class Main {
5 public static void main(String[] args) {
6 // TODO Auto-generated method stub
7 int i,x,d=1,t;
8 boolean flag=false;
9 int [] a=new int[1005];
10 Scanner in =new Scanner(System.in);
11 String s = in.nextLine();
12 for(i=0;i<s.length();i++){
13 if(s.charAt(i)=='x')
14 flag=true;
15 }
16 if(!flag){
17 System.out.println("0");
18 System.exit(0);
19 }
20 Pattern p = Pattern.compile("\\d{1,}|-\\d{1,}");
21 Matcher m = p.matcher(s);
22 while(m.find()) {
23 x=Integer.parseInt(m.group());
24 a[d++]=x;
25 if(x==0)
26 System.out.println("Wrong Format");
27 }
28 }
设计与分析:
先输入一个一元多项式,然后判断,之后的正则用的并不是那么好,思维也出错了所以这道题没怎么写出来。
三:踩坑心得1.因为代码都是在eclipse中写的,所以每次报错都能看到,也就能及时的修改,但提交源码是有时候还有些测试点是不会过的,所以要学会根据测试点来优化自己的代码。2.有时候并不是代码的问题,本来觉得自己能过这个测试点,发现少写了一个空格,所以在输出的时候要小心仔细。3.中英文格式时要注意一下。四:改进建议
对于题目集一和题目集二我认为可以加强代码的优化,让代码的复杂度降低,同样题目集三除了第三题,其他的也可以加强代码的优化,降低复杂度;但第三题我应该通过
更多的时间来学习有关正则的知识,用来更顺畅的写代码,然后以便做出更难的题目,也可以更好方便地优化代码。、
五:总结前三次题目集难度整体不大,主要难度在题目集二7-5和题目集三7-3。学习到了数组及for循环,类的使用和JAVA的封装性。
前两次题目集让我们了解到了Java的基本,Java程序的输入和输出,从控制台读取输入,字符串和数组的处理,命名常量,声明变量以及赋值语句以及赋值表达式和地判断语句的应用。
但对于难题的处理(正则表达式的使用)存在缺失,
最后的题目让我了解到Java的学习之路并不是一帆风顺,也是磕磕绊绊的,但这并不是放弃的理由,所以需要我更加的努力学习,
希望在下次作业中继续进步努力学习。教师、课程、作业、实验、课上及课下组织方式都很好。
浙公网安备 33010602011771号