目录
1.前言
2.设计与分析
3.踩坑心得
4.改进建议
5.总结
一.前言
题目集01:
知识点:编写一个基础java程序的结构代码、数据的输入和输出、数字的数学运算(加减乘除等等)、选择和循环结构的使用、数组的使用(new)、数组的排序方法。
题量:较多
难度:由于之前有一定的c语言基础,整体来说难度低
题目集02:
知识点:编写一个基础java程序的结构代码、编写功能实现方法、数据的输入和输出、数字的数学运算(加减乘除等等)、选择和循环结构的使用、数组的使用(new)、数组的排序方法、java类方法。
题量:适中
难度:难度较低,但比较题目集01偏复杂
题目集03:
知识点:编写一个基础java程序的结构代码、编写功能实现方法和类、数据的输入和输出、数字的数学运算(加减乘除等等)、选择和循环结构的使用、数组的使用(new)、数组的排序方法、this的使用、正则表达式。
题量:较少
难度:难度中等,7-3需要掌握正则表达式的使用
二.设计与分析
题目集01
7-7 对多个整数进行排序
先从键盘输入一个整数n,n代表需要排序的整数数量,然后再从键盘输入n个整数,对这些数从小到大排序并输出。
输入格式:
先从键盘输入一个整数n,之后回车 再从键盘输入n个整数,整数之间用一个或多个空格分隔
输出格式:
按如下示例输出排序后的数据:The sorted numbers are:排序后的n个数,每个输出的整数之后有一个空格作为分隔符
输入样例:
在这里给出一组输入。例如:
10
3 5 2 4 76 89 56 4 3 8
输出样例:
在这里给出相应的输出。例如:
The sorted numbers are:2 3 3 4 4 5 8 56 76 89
心得体会:题目并没有难度,解题可以有多种方法:
1. 使用for循环来实现冒泡排序、选择排序等等
以下以冒泡排序法实现
1 for(i=0;i<n;i++) 2 a[i]=scanner.nextInt(); 3 for(i=0;i<n-1;i++) 4 for(j=0;j<n-i-1;j++) 5 if(a[j]>a[j+1]) 6 { 7 temp=a[j]; 8 a[j]=a[j+1]; 9 a[j+1]=temp; 10 }
2.或者直接使用Arrays.sort()对数组进行排序
1 import java.util.Arrays; 2 for(i=0;i<n;i++) 3 a[i]=scanner.nextInt(); 4 Arrays.sort(a);
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”。
输入样例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
心得体会:通过对输入数据的判断输入相应的结果即可,注意处理该如何判断实数相等(a*a+b*b==c*c应写为a*a+b*b-c*c<0.000001),以及优先判断是否为等腰直角三角形。
题目集02
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
心得体会:通过对c语言的认知来变迁编写java程序的“函数”,新接触到boolean数据类型的使用,由于是静态方法,而不能使用对象去使用该方法,需要明确定义出年、月、日,最后注意对日期的正确性,跨月、跨年的情况处理就行。
7-5 求前N天
输入年月日的值(均为整型数),输出该日期的下一天。 其中:年份的合法取值范围为[1820,2020] ,月份合法取值范围为[1,12] ,日期合法取值范围为[1,31] 。 注意:不允许使用Java中和日期相关的类和方法。
要求:Main类中必须含有如下方法,签名如下:
1 public static void main(String[] args);//主方法 2 public static boolean isLeapYear(int year) ;//判断year是否为闰年,返回boolean类型 3 public static boolean checkInputValidity(int year,int month,int day);//判断输入日期是否合法,返回布尔值 4 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
心得体会:在7-4的基础上进行了延伸,求前n天的日期,只不过7-4中等于1,而7-5为n,同样需要注意处理跨月、跨年的情况。
题目集03
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
心得体会:图中已详细给出类中的属性和方法,直接编写即可,注意如何通过创建对象去调用自己所定义的方法。
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
心得体会:该题为前三题目集中难度最高的题,需要掌握如何正确使用正则表达表达式去判断输入是否正确以及对目标字符串的分割处理,先分割出单个式子,再判断是否为常数式另外处理,分割出系数和次数然后求导处理即可。注意得去判断一些特殊的情况。
三.踩坑心得
总体来说题目中没什么坑(除了题目集03的7-3),其他题目需要多思考一下其他的遗漏没考虑的地方,基本就没啥问题。下面想谈一谈题目集03的7-3
这一道题从着手到结束至少花了我7个小时,前面在未知道老师提供的Java中的Pattern和Matcher等等,自己花了3个小时最后过了25分,后参考老师给出的代码以45分收尾(尽管我现在都不知道最后一个测试点错在哪555~)。
本题需要考虑多种情况——常数项、系数和指数为负数,系数和指数为+-1时、输入格式错误等等,在写代码前应该把整个实现过程构思好,而不是想到什么写什么,这样可以避免走很多弯路!
四.改进建议
1.思维走在行动前
2.写代码需要加上必要的注释并保证代码编写的规范性
3.既然使用java语言,那就需要充分利用java的封装性,隐藏对象的属性和实现细节
4.编写方法时要从对象的身上多去考虑,提高程序的简洁性、建立各个对象之间的松耦合关系
五.总结
通过这三次题目集的训练,使我对面向对象编程有了一定的理解,掌握了编写java程序的基本结构和语法,也让我明白了java与c语言之间的差别(比如基本数据类型、数据储存空间的形式等等),相比与c语言来说,java的功能更加强大,比如对字符串的处理更加方便、能通过正则表达式去验证输入内容格式是否正确等等,一次次的过题,逐步增强了自己能学好java这门编程语言的信心。