一.前三次题集总结
前三次的题集总的来说可以总结为三点
- 第一次,以一定数量的题目考察学生的基本熟知能力达到一个热手逐渐熟悉的目的
- 第二次,则以较少且难度开始上升的题目作为练习,需要自己拥有一定解析题目的能力和一定的逻辑能力然后逐步完善代码
- 第三次,则是需要自己对类的构建,以达到一个封装性从而优于前两次直接在主函数中完成所有代码,并且最后一题的多项式求导需要较强的逻辑能力以及运用正则表达式进行一系列的判断从而得出所需要的解
1.判断三角形类型
题集1中的三角形类型判断,输入三角形三条边,判断类型,不符合则Wrong Format
输出,其实这类题目可以看作自己的一个if语句练习,一个从上到下的判断,只要开始设定好各个边的取值范围和满足构成三角形的条件,后续逐步完善判断条件就可以了较为简单的练习题。
2.求下一天
在输入的数据都是合法的前提下:
求下一天中,需要对所输入的年份进行一个优先判断,判断是闰年还是平年,从而确定该年的2月是28天还是29天,熟悉大概流程思路。
创建三个方法,可以避免在主函数中堆积过于冗杂。
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) ; //求输入日期的下一天
其中我们只要在求下一天的方法里注意年月日的边界问题,当月份为12,天为31时:
if(month==12&&day==31){
year=year+1;
//年份+1
month=1;
//月份=1
day=1;
//日期=1
}
3.求前N天
与求下一天相似,创建四个方法分别为闰年的判断,输入的数据是否有效,对输入的数据进行判断从而得到前N天的结果,输出结果。方法如下:
public static boolean isLeapYear(int year)
//
public static boolean checkInputValidity(int year, int month, int day, int n)
public static void TheNday(int year, int month, int day, int n)
public static void print(int year,int month,int day,int n)
在TheNday
方法中创建2个月份天数数组:
int leapyear[] = { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
int notleapyear[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
这题其实并不难,只要有较为清晰的逻辑就可以迎刃而解
可以先对输入的日期进行是否会出现跨年的测试判断,然后对其是闰年还是平年进行一个初判断,随后再进行相应的日,月数值上的判断加减。例如是闰年且非跨年测试的话:
if (isLeapYear(year)) {
if (day - n > leapyear[month - 1]) {
month = month + 1;day = day - n - leapyear[month - 2];
} else if (day - n <= 0) {
month = month - 1;day = leapyear[month - 1] + day - n;
} else {
day = day - n;
}
print(year,month,day,n);return;
}
非闰年同理,这题只要思路清晰,逻辑上没有互相冲突的地方的话,还是比较容易完成
4.定义日期类
该题主要是要体现出类的封装性,与题集2中的求日期是相似,只不过一个是简单的直接创建方法然后主函数中调用,而此题是对类中的方法,针对类的year、month和day进行操作,从而体现出封装性。
Date类结构如下图:
5.一元多项式求导
Poly是一个方法庞杂的类,先判断输入是否合法,再将多项式拆分成独立的项,接着求导,同时也包含了程序的入口main。这无疑是一个面向方法的写法。
写checkerpp方法判断合法性的时候,经历过一次波折。一开始的思路是用一个很长的大正则表示出整个多项式,写完发现超过了100个字符,很不美观。而且如果表达式的项数过多,递归层数太深会爆栈。然后我换了一种思路,正则每次只匹配一个项,而项又可以根据x有没有系数和指数分为5类,所以我一共写了5种很短的正则分别匹配5种项
采坑心得
像日期类的题目,刚开始写的话,想起来是很容易,但是写起来有时候会非常容易出现一些逻辑错误,比如上面已经判断过了本来应该是跳出,结果却也满足下面的if判断条件,从而导致代码结果的错误。
对于一元多项式求导,当某一项为“0”时,则该项不需要显示,但如果整个导函数结果为“0”时,则显示为“0”;类似这种条件,需要用许多正则表达式去注意判断,就很麻烦。
改进建议
感觉后续的代码都可以多用封装,继承这些来写,可以有效的降低平均复杂度,许多方法没必要在一个类中重复写。
学习总结
首先就是正则表达式,包括正则的效率问题。然后就是程序的鲁棒性,实际工程中程序对各种不同状况做出的反应都应该符合用户需求。最最重要的就是面向对象的思维。