前言:
这是我20多年以来第一次写博客了,还是在学校里那可(牛)爱(逼)的Java老师的安(逼)慰(迫)下,含泪写下第一篇博客,大家应该都明白这种含泪写下的佳(废)作(品)是多么的动人的。
就不开玩笑了,这里是墨语同学的处女作博客,主要是来分析总结一下本人之前写过的一些题目,总结经验和大多教训,来分享给大家。愿Java萌新们,和我这个小菜鸟一样,一起加油!大家共勉,希望少走弯路吧。PS:别走我的破路,走大神的康庄大道!
目录:(java)
1.PTA题目集2__7-4( 求下一天)
2.PTA题目集2__7-5(求前N天)
3.PTA题目集3__7-2(定义日期类)
4.PTA题目集3__7-3( 一元多项式求导(类设计))
1.求下一天
输入年月日的值(均为整型数),输出该日期的下一天。 其中:年份的合法取值范围为[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) ; //求输入日期的下一天
在一行内输入年月日的值,均为整型数,可以用一到多个空格或回车分隔。
在这里给出一组输入。例如:
2020 3 10
在这里给出相应的输出。例如:
Next date is:2020-3-11
在这里给出一组输入。例如:
2025 2 10
在这里给出相应的输出。例如:
Wrong Format
部分代码:
//判断输入数据是否有效 boolean checkInputValidity(int day,int month,int year){ if((year>=1820&&year<=2000)&&(month>=1&&month<=12)&&(day>=1&&day<=31)) return true; else return false; }
//判断闰年 boolean isLeapYear(int year){ if(year%400==0||(year%4==0&&year%100!=0)) return true; else return false; }
分析:
在看见这个题目的第一眼,我就觉得很简单呀,不就是加一天嘛,so easy呀!可事实却偏偏没那么简单啊,我也踩了好多坑,蓝瘦香菇!
第一坑:在输入数值前,不判断输入的年月日是否符合要求。看题目,年份的合法取值范围为[1820,2020] ,月份合法取值范围为[1,12] ,日期合法取值范围为[1,31]
第二坑:忘记了闰年和平年之分。要判断是否是闰年啊,兄弟们!
第三坑:知道了闰年平年之分,又忘记了2月的29号。
第四坑:不记得大小月,不注意7,8月两个大月连在一起,所以大小月之分是很重要的!一三五七八十腊,三十一天永不差!这还是小学时候学过的口诀,(*^▽^*),
所以编写代码的时候,就要注意了,1,3,5,7,8,10,这几个月要和4,6,9,11这几个月区别开来,别问为什么没有2月和12月,前面一个坑不是刚说了2月最多就29天嘛。而12月
31号过一天就第二年了,也要特别提出来。
于是考虑就如下:
1,3,5,7,8,10这6个月,先判断day>=1&&day<=30,直接在输入的结果上,year和month不变,day+1;如果day=31,则day=1,month+1;
4,6,9,11则4个月,先判断day>=1&&day<=29,直接在输入的结果上,year和month不变,day+1;如果day=30,则day=1,month+1;
2月,就要分清是否是闰年了,是闰年的话,判断day>=1&&day<=28,在输入的数据上,year和month不变,day+1;若day=29,则day=1,month+1;
平年的话,判断day>=1&&day<=27,在输入的数据上,year和month不变,day+1;若day=28,则day=1,month+1;
12月,先判断day>=1&&day<=30,在输入的数据上,year和month不变,day+1,;若day=31,则day=1,month=1,year+1。
上面的就是我踩过的一些坑和我对这个题目的总结。
2.求N天前
输入年月日的值(均为整型数),同时输入一个取值范围在[-10,10] 之间的整型数n,输出该日期的前n天(当n > 0时)、该日期的后n天(当n<0时)。
其中年份取值范围为 [1820,2020] ,月份取值范围为[1,12] ,日期取值范围为[1,31] 。
注意:不允许使用Java中任何与日期有关的类或方法。
在一行中输入年月日的值以及n的值,可以用一个或多个空格或回车分隔。
在这里给出一组输入。例如:
2018 6 19 8
在这里给出相应的输出。例如:
8 days ago is:2018-6-11
在这里给出一组输入。例如:
2018 6 19 -8
在这里给出相应的输出。例如:
-8 days ago is:2018-6-27
if ((month == 1) || (month == 3) || (month == 5) || (month == 7) || (month== 8) || (month == 10)) { //n<0 if (day + Math.abs(n) <= 31) { day = day - n; } else { month += 1; day = day - n - 31; }
if ((month == 4) || (month == 6) || (month == 9) || (month == 11)) { if (day - n <= 30) { day = day - n; } else { day = day - n - 30; month += 1; }
if ((month == 12) || (month == 3) || (month == 5) || (month == 7) || (month == 8) || (month == 10)) { //n>0 if (day - Math.abs(n) >= 1) { day = day - n; } else { month -= 1; day = day - n + 31; }
if ((month == 4) || (month == 6) || (month == 9) || (month == 11)) { if (day - n >= 1) { day = day - n; } else { day = day - n + 30; month -= 1; }
分析:
这四段代码呢,是为了告诉大家,分别在n<0和n>0这两种情况下,大月和小月的日期加减的情况,至于2月和12月,第一题的分析就说明了一下注意事项,也
就是2月的28天或29天,12月的跨年问题。大家可以自己分析一下,或者根据我第一题和下面这题的代码来自己总结一下,我就不重复分析了,这3题都是日期的加减问题,
用四个字成语来形容就是大同小异。我的语文还是不错的吧,(#^.^#)
我再补充几点。
第一,1月前10号(n给的范围是[-10,10]),加减要注意year要不要-1这个问题。
第二,每个月的后十号也是要注意month是否+1
3.定义日期类
定义一个类Date,包含三个私有属性年(year)、月(month)、日(day),均为整型数,其中:年份的合法取值范围为[1900,2000] ,月份合法取值范围为[1,12] ,日期合法取值范围为[1,31] 。 注意:不允许使用Java中和日期相关的类和方法,否则按0分处理。
要求:Date类结构如下图所示:
在一行内输入年月日的值,均为整型数,可以用一到多个空格或回车分隔。
在这里给出一组输入。例如:
1912 12 25
在这里给出相应的输出。例如:
Next day is:1912-12-26
在这里给出一组输入。例如:
2001 2 30
在这里给出相应的输出。例如:
Date Format is Wrong
package date; import java.util.Date; import java.util.Scanner; public class Main { int day; int month; int year; public Main(int day, int month, int year) { this.day = day; this.month = month; this.year = year; } public static void main(String[] args) { class Date { private int day; private int month; private int year; Date() { this.day = day; this.month = month; this.year = year; } //设置日期 void setDay(int day) { this.day = day; } void setMonth(int month) { this.month = month; } void setYear(int year) { this.year = year; } //判断日期是否正确 boolean checkInputValidity(int day, int month, int year) { if ((day > 0 && day < 32) && (month > 0 && month < 13) && (year > 1899 && year < 2001)) return true; else return false; } //日期变为第二天 void getNextDate() { if (month == 1 || month == 3 || month == 5 || month == 8 || month == 10) { //大月 if (++day <= 30) this.day = day++; else { this.month = ++month; this.day = 1; } } else if (month == 2) { //2月 if (day <= 27) this.day = day++; else { this.month = month++; this.day = 1; } } else if (month == 4 || month == 6 || month == 9 || month == 11) { //小月 if (day <= 29) { this.day = day++; } else { this.month = month++; this.day = 1; } } else if (month == 12) { //12月过年 if (day <= 30) this.day = day++; else { this.year = ++year; this.month = 1; this.day = 1; } }else if (month == 7) { //12月过年 if (++day <= 30) this.day = ++day; else { this.month = ++month; this.day = 1; } } } int getYear() { return year; } int getMonth() { return month; } int getDay() { return day; } } Date a= new Date(); Scanner input = new Scanner(System.in); int day = input.nextInt(); a.setDay(day); int month = input.nextInt(); a.setMonth(month); int year = input.nextInt(); a.setYear(year); //输出 if (a.checkInputValidity(day, month, year)) { a.getNextDate(); System.out.println("Next day is:" + a.getYear() + "-" + a.getMonth() + "-" + a.getDay()); } else System.out.println("Date Format is Wrong"); } }
分析:
(day > 0 && day < 32) && (month > 0 && month < 13) && (year > 1899 && year < 2001),这就是判断年月日的范围了(根据题意来的范围哟)。再输入正确后,当然是在输入的基础上,
这是我当时做题的一次写的源码,你如果认真看了源码的话,肯定会发现一个问题,如果没发现,说明你还有很大的提升空间,不是代码方面的,是常识方面的提升(狗头保命)。
可以很明显的发现,这段代码里面,少了一段代码,那段代码就是判断是否是闰年的代码。没错,在不考虑闰年的情况下,就是上面的代码那样。
首先,定义day(日),month(月),year(年)类,在定义了这些对象后,就要考虑输入的数值是否符合年月日的要求,因此这里直接使用if-else的判断语句进行了,
使日期推后一天喽,再输出第二天的日期,这样一说是不是很简单啊。但真的是这么简单吗?这里就详细的说一下啦。你要完成这个代码,必须先了解日期的变化啦。具体的我就不说了,别问为什么,问就是和第一题一样,
(#^.^#)为什么要多写这个题目呢?是不是多此一举?nonono,PS:老师要求必须写这几个题目的,o(╥﹏╥)o。另外呢,这个题目也比第一题要多一些东西,也就是在第一题的基础上多了一点点。
4.一元多项式求导
题目要求:
编写程序性,实现对简单多项式的导函数进行求解。详见作业指导书。
https://images.ptausercontent.com/a6146210-4a98-4a95-9e7b-a5df3ee89ee4.pdf
(1)相关概念说明
? 带符号整数:前导不为 0 的带符号整数,如果是正号,可以省略,例如 -2,、+23、34442409 等。
? 幂函数:由自变量 x(只支持小写)和指数组成,指数为一个带符号整 数,如 x^-2、x^+25。当指数为 1 时,可以省略指数,如 x。
? 项:具体包括变量项和常数项。 ? 变量项是指带有系数的幂函数,如 2*x^2、-1*x^12; ? 系数为 1 时的时候,可以省略系数或表示为正号开头的形式,如 x^-2; ? 系数为-1 时的时候,可以表示为符号开头的形式,如-x^3。 ? 常数项包含一个带符号整数,例如:233。
? 表达式:由加法和减法运算符连接若干项组成,如:-1+x^20-x^-6。注 意,表达式中空串不属于合法的表达式,另外,系数与指数均不能为 0。
? 空白字符:在本次作业中,空白字符仅限于空格。
? 此外,带符号整数内不允许出现空白字符,其他位置均可以存在空白字 符。
(2)求导算法 求导是数学计算中的一个计算方法,它的定义是:当自变量的增量趋于零时, 因变量的增量与自变量之商的极限。 在本次作业中,我们要对输入的多项式进行求导计算,并输出它的导函数。
本次作业可能用到的导函数公式为: 当 f(x)=a(a 为常数)时,??′(??)=0 当 f(x)=??????时,??′(??)=??b????-1 例如: 当 f(x)=2??6+6??4+200 时,??′(??)=12??5+24??3 输入 2*x^6+6*x^4+200,输出为:12*x^5+24*x^3。
2.2 程序功能需求
(1)实现功能
? 判定输入表达式是否为正确的表达式;
? 若输入为正确表达式,则计算其导函数并按要求输出。
(2)输入输出规则
①输入规则
在一行内输入一个待计算导函数的表达式,以回车符结束。
②输出规则
? 如果输入表达式不符合上述表达式基本规则,则输出“WrongFormat”。
? 如果输入合法,则在一行内正常输出该表达式的导函数,注意以下几点:
? 结果不需要排序,也不需要化简;
? 当某一项为“0”时,则该项不需要显示,但如果整个导函数结果为“0”时,则 显示为“0”;
? 当输出结果第一项系数符号为“+”时,不输出“+”;
? 当指数符号为“+”时,不输出“+”;
? 当指数值为“0”时,则不需要输出“x^0”,只需要输出其系数即可。
在一行内输入一个待计算导函数的表达式,以回车符结束。
输出格式见输入输出示例。
在这里给出一组输入。例如:
-2* x^-2+ 5*x^12-4*x+ 12
在这里给出相应的输出。例如:
4*x^-3+60*x^11-4
在这里给出一组输入。例如:
2*x^6-0*x^7+5
在这里给出相应的输出。例如:
Wrong Format
分析:
这题怎么说呢,我不会呀,毕竟我是初学者,一个小菜鸟,在班上也是属于菜鸟的行列,能够分析出上面3个题目,我也是用光了我的才华,古有巧妇难为无米之炊,今有菜鸡难写导数java。
不知不觉也写了这么多了,求导的数学问题还是很简单的,但是用java来完成,请放过我这只菜鸟吧,求大神有空闲时间能教教我。
结语:
虽然有点讨厌老师要求我们写博客这个作业,但是,讨厌写作业一直都是学生们的共同点(狗头保命)。
好啦,不开玩笑了,好好写个结语吧。
很感谢老师布置这个作业,我也能通过这个作业,通过这个blog,在博客园这个平台上能够结交各位大神级人物,也希望我以后能够成为在座的各位大神中个一位,成为一位资深码农。
可以说是刚刚接触java,接触这个专业也没多久,java也是刚刚入门,或者说门还只是跨入了半步,提升的空间还有很多很多,愿能够看到这篇博客的萌新们,大家一起加油!共勉吧!
饭一口一口吃,总有吃饱的时候;路一步一步走,只有无尽的路途!学海无涯,希望能够在java的海洋里面,能够慢慢欣赏java的魅力!
加油加油加油!!!
墨语同学祝大家学业有成,前途似锦!
原文:https://www.cnblogs.com/zhang1018/p/14616608.html