题目集1~3的总结
一、前言
1、第一次题目集:
①计算两个数的和:计算两个数的和。 通过键盘为变量a和b赋值,然后计算变量a与b的和,并将和赋值给变量sum,最终输出变量sum的值;
知识点:Java程序的运行、变量定义、变量赋值、变量加法运算、键盘输入、基本类型 int、及输出。
②电话键盘字母数字转换:按照国际标准中电话键盘上字母和数字之间的对应关系,编写一个程序,从键盘读入一个输入的字母,将其转换成所对应的数字。
知识点:基本类型char、if判断语句语法、关系运算符的应用、及联合嵌套的判断语句的应用。
③成绩分级管理:学校进行成绩分级管理,取消分数制,改为成绩分级评定。具体办法是:小于60分为E类;60分至70分(不含70分)为D类;70分至80分(不含)为C类;80分至90分(不含)为B类;90分以上为A类。设计一个程序,对输入的成绩进行等价划分。
知识点:if判断语句语法、关系运算符的应用、及联合嵌套的判断语句的应用。
④计算税率:美国联邦个人所得税是根据申报情况和应纳税所得额计算的。有四种申报情况:单身申报、已婚联合申报、已婚单独申报、户主申报。税率每年都不一样。你要写一个计算个人所得税的程序。程序应该首先输入申报状态和应纳税所得额并计算税款。其中,输入申报状态用整型数表示,0表示单身申报,1表示已婚联合申报,2表示已婚单独申报,3表示户主申报。应纳税所得金额用实型数表示。
知识点:switch-case流程控制语法、基本类型double、及联合嵌套的判断语句的应用。
⑤计算钱币:编写程序,读取用户输入的代表总金额的double值,打印表示该金额所需的最少纸币张数和硬币个数,打印从最大金额开始。纸币的种类有十元、五元、一元,硬币的种类有五角、一角、贰分、壹分。
知识点:基本类型float等。
⑥使用一维数组求平均值:本题目要求使用一维数组,存储5个整数,输出5个整数的平均值。
知识点:一维数组的使用方法、for循环流程控制语法。
⑦对多个整数进行排序:先从键盘输入一个整数n,n代表需要排序的整数数量,然后再从键盘输入n个整数,对这些数从小到大排序并输出。
知识点:基本排序算法、for循环的嵌套用法。
⑧判断三角形类型 :输入三角形三条边,判断该三角形为什么类型的三角形。
知识点:浮点数运算时有误差。
总体难度:易,题量略大但考察知识点基础。
2、第二次题目集:
①IP地址转换:一个IP地址是用四个字节(每个字节8位)的二进制码组成。请将32位二进制码表示的IP地址转换为十进制格式表示的IP地址输出。
知识点:十进制与二进制的转换运算方法、键入字符的分割等。
②合并两个有序数组为新的有序数组 :合并两个升序排序的整型数组为一个新的升序整型数组并输出。
知识点:数组的合并、基本排序方法。
③判断闰年及星期几
④求下一天
⑤求前n天
知识点:函数的定义及调用方法,日期的计算方法。
总体难度:较易,题量适中考察点较基础。
3、第三次题目集:
①创建账户类Account
②定义日期类
③一元多项式求导(类设计):编写程序性,实现对简单多项式的导函数进行求解。
知识点:对象和实例的概念、对象及类的创建使用方法、面向对象和正则表达式。
总体难度:较难,尤其第三题。
二、设计与分析
1、题目集一
输入格式:
在一行中输入三角形的三条边的值(实型数),可以用一个或多个空格或回车分隔,其中三条边的取值范围均为[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”。
分析与心得:先给输入的三条边,然后进行排好序(可以减少很多判断)。使用勾股定理x2+y2=z2判断直角三角形时,若为浮点数会出现浮点误差无法相等,则差在精度范围内即可认为相等。我把误差精度设为了0.1(主要还是参考网上)
核心代码:
Arrays.sort(v);
if (v[0] + v[1] <= v[2]) {
System.out.print("Not a triangle");
} else if (v[0] == v[1] && v[1] == v[2]) {
System.out.print("Equilateral triangle");
} else if (v[0] == v[1] && v[0] * v[0] + v[1] * v[1]-v[2] * v[2]<0.1) {
System.out.print("Isosceles right-angled triangle");
} else if (v[1] == v[2] || v[0] == v[1]) {
System.out.print("Isosceles triangle");
} else if (v[0] * v[0] + v[1] * v[1]-v[2] * v[2]<0.1) {
System.out.print("Right-angled triangle");
} else {
System.out.print("General triangle");
}
//判断直角三角形时不能用v[0] * v[0] + v[1] * v[1]==v[2] * v[2]
2、题目集二
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:年-月-日
分析与心得:这道题在前面做了闰年及星期几的题目后,相对不会很难。值得注意的是各月的天数需严格符合实际,求下一天时注意边界进制。
改进地方:我使用了两个数组来存储闰年和非闰年(有点浪费空间),可以改成使用一个,如果是闰年,把二月份的时间改一下就可以了。
核心代码:
public static void nextDate(int year,int month,int day) {//求输入日期的下一天
int[] monthDay1 = new int[]{0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int[] monthDay2 = new int[]{0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
if (checkInputValidity(year,month,day+1)){
System.out.print("Next date is:"+year+"-"+month+"-"+(day+1));
} else{
if (month==12&&day==31){
System.out.print("Next date is:"+(year+1)+"-"+"1"+"-"+"1");
} else if ((isLeapYear(year)&&day==monthDay1[month])||(!isLeapYear(year)&&day==monthDay2[month])){
System.out.print("Next date is:" + year + "-" + (month + 1) + "-" + "1");
}
}
}
7-5 求前N天 (30 分)
输入年月日的值(均为整型数),同时输入一个取值范围在[-10,10] 之间的整型数n,输出该日期的前n天(当n > 0时)、该日期的后n天(当n<0时)。 其中年份取值范围为 [1820,2020] ,月份取值范围为[1,12] ,日期取值范围为[1,31] 。 注意:不允许使用Java中任何与日期有关的类或方法。
输入格式:
在一行中输入年月日的值以及n的值,可以用一个或多个空格或回车分隔。
输出格式:
当输入的年、月、日以及n的值非法时,输出“Wrong Format”;
当输入数据合法时,输出“n days ago is:年-月-日”
分析与心得:求前n天的关键在于比较n与day的大小。
如果day - n >= 1 && day - n <= MonthDay[month],则前n天还在这个月内。
如果day - n < 1,(n>0)则前n天不在这个月内,如果day - n >= MonthDay[month](n<0),则前n天也不再这个月内。
其他地方和前面差不多,需要注意各月天数以及边界。
核心代码:
if ((year < 1820 || year > 2020 || month < 1 || month > 12 || day < 1 || day > MonthDay[month] || n < -10 || n > 10)){
System.out.print("Wrong Format");
}else if (day - n >= 1 && day - n <= MonthDay[month])//还在这个月内
System.out.printf("%d days ago is:%d-%d-%d\n", n, year, month, day - n);
else {
if (day - n < 1) { //不在这个月内,n>0
int temp = 0 - (day - n);
if (month ==1) {
year =year- 1;
month = 13;
}
System.out.printf("%d days ago is:%d-%d-%d\n", n, year, month - 1, MonthDay[month - 1] - temp);
} else { //不在这个月内,n<0
int temp = day - n - MonthDay[month];
if (month == 12) {
year =year+ 1;
month = 0;
}
System.out.printf("%d days ago is:%d-%d-%d\n", n, year, month + 1, temp);
}
}
}
3、 题目集三
定义一个类Date,包含三个私有属性年(year)、月(month)、日(day),均为整型数,其中:年份的合法取值范围为[1900,2000] ,月份合法取值范围为[1,12] ,日期合法取值范围为[1,31] 。 注意:不允许使用Java中和日期相关的类和方法,否则按0分处理。
要求:Date类结构如下图所示:

输入格式:
在一行内输入年月日的值,均为整型数,可以用一到多个空格或回车分隔。
输出格式:
-
当输入数据非法及输入日期不存在时,输出“Date Format is Wrong”;
-
当输入日期合法,输出下一天,格式如下:Next day is:年-月-日
分析与心得:这道题目前面做过,当时就是纯面向过程,而这里开始有一点面向对象了。其实我感觉我写的就是在前面的基础上增加了一些方法而已,还都不是我写的(是IDE可以自动插入的),同样这里也需要注意边界控制和进制处理。其实告诉类图了来写代码是相对来说不困难的,就是按部就班一个一个写下去就是,难的是怎么设计这个类。
核心代码:
View CodeSourceMonitor的生成报表内容:
三、踩坑心得
对于函数的定义以及函数中变量名的使用不熟悉,导致函数调用时频频出错;代码运行时间长、优化空间大;可以把计算完的数据都先打印出来,以便问题排查,快速定位问题点;应学习以掌握调试方法;同一题目有多种算法,应多加尝试,找出最优方案;重要算法前多加注释
四、改进意见
对于题目集三中的一元多项式求导,有一个测试点始终未通过,写的代码也有太多是面向对象的做法,看着复杂无层次,代码冗余过多,复用性低,不利于修改和维护。
优化:设计项类,将表达式分解成项,对项进行处理,使用 HashMap建立映射关系,利于运算,利于合并同类项(本题降低了难度并未涉及),降低程序耦合度。
五、总结
通过对本阶段的学习,学到了Java的基本语法,练习了Java的基本语法和Java类中常用方法,学习面向对象的思想,正则表达式的使用,函数的定义及调用方法、学会了通过使用正则表达式对大量字符串进行操作。课程及作业的进度和难度都安排合理,无改进意见。

浙公网安备 33010602011771号