前言:
本次学习分了三次题目集,第一次题目集有八个题目,难度偏易,不过当然对于我们初学者来说还是具有思考性的。第二次题目集有五个题目,难度中等偏下。第三次题目集有三个题目,三个题目难度等级分别为低、中、高,其中第二个题目与第二次题目集的第七小题(求下一天类似),算法思想是一样的,不同在于第三次给的题目限制更多(私有属性等等等);最难的是为第三题的一元多项式的求导(类求导),至今我也还没有完全做出来。
关于三次题目集的知识点都包括输入、变量与计算、计算优先级、类型的转换、判断、循环、循环控制、数组、使用对象、数组的复制、this的使用、构造方法、private数据的封装、set与get的使用等知识,其实这些知识大多数我们已经在上学期的C语言学习中都已学习过。其中题目集一主要让我们学会了java语言的最基本的代码格式、输入及输出。题目集二主要包含了十进制转二进制、数组的复制、判断闰年、boolean的用法等知识点。题目集三主要包含了类的创建、数据的封装(私有属性)、无参构造方法、get和set的使用、方法的构造等知识点。
设计与分析:
(1) 题目集一:
7-8(判断三角形的类型):该题要我们判断三角形的类型,要求输入三角形三边来判断该三角形为什么类型的三角形。首先拿到该题我们最先要确定三角形三边的范围([1,200]),若不符合则输出“Wrong Format”,符合才正式进行下一步的判断。我们知道判断三角形的最先决条件是“三角形任意两边之和大于第三边”以及“三角形任意两边之差小于第三边”,若不符合该条件则直接出“Not a triangle”,符合则进行下一步条件的判断。下一步则为正式判断三角形的类型了,首先进行第一步判断,若在输入的三条边中任意两条边相等的条件下每条边都相等,则该三角形为等边三角形,输出“Equilateral triangle”,若在输入三条边中任意两条边相等的情况下输入的每条边的平方相加起来结果小于0.001(约为根号二),则该三角形为等腰直角三角形,输出“Isosceles right-angled triangle”,其他情况同理,具体代码如图一:
图一

输入如图二、三、四:
图二

图三

图四

输出如图五、六、七:
图五

图六

图七

(2) 题目集二:
7-4(求下一天):题目要求我们求下一天,但是不能用Java中和日期相关的类和方法。且题目已经给我们规定了类和方法,如下:
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”,日期合法则要判断所输入年份是否为闰年,若为闰年二月则有二十九天,否则二月只有二十八天。接下来
判断输入的日期是否为一年中的最后一天(即是否为十二月的最后一天),若为最后一天则直接年份往后加一年月日则都改为“一”,代码如下:
if(month == 12) {//月份为12的情况 if(day == a[month]) {//判断天数是否为每月的最后一天,天数为最后一天 b = year + 1; c = 1; d = 1; } if(day > 1 && day < a[month]) {//天数不是一个月的最后一天 b = year; c = month; d = day + 1; } System.out.println("Next date is:"+b+"-"+c+"-"+d); }
若输入日期不是为一年中的最后一天,再判断该日期是否为每月的最后一天,若为每月的最后一天则月份往后推一个月,代码如图十:
图十

完整代码如图下:
import java.util.Scanner; public class Main { public static void main(String[] args) { // TODO Auto-generated method stub Scanner input = new Scanner(System.in); Main ss = new Main(); int year = input.nextInt(); int month = input.nextInt(); int day = input.nextInt(); ss.nextDate(year,month,day); } public static boolean isLeapYear(int year) { //判断year是否为闰年,返回boolean类型 return (year % 400 == 0) || ((year % 4 == 0) && (year % 100 != 0)); } public static boolean checkInputValidity(int year,int month,int day){ //判断输入日期是否合法,返回布尔值 int a[] = new int [] {0,31,28,31,30,31,30,31,31,30,31,30,31}; if(isLeapYear(year)) a[2] = 29; boolean checkInputValidity = (year >= 1820 && year <= 2020 && month > 0 && month <= 12 && day <= a[month] && day>0); return checkInputValidity; } public static void nextDate(int year,int month,int day) { //求输入日期的下一天 int a[] = new int [] {0,31,28,31,30,31,30,31,31,30,31,30,31}; if(isLeapYear(year)) a[2] = 29; int b = 0,c = 0,d = 0;//分别表示年月日 if(checkInputValidity(year,month,day)) {//日期合法的情况下 if(month == 12) {//月份为12的情况 if(day == a[month]) {//判断天数是否为每月的最后一天,天数为最后一天 b = year + 1; c = 1; d = 1; } if(day > 1 && day < a[month]) {//天数不是一个月的最后一天 b = year; c = month; d = day + 1; } System.out.println("Next date is:"+b+"-"+c+"-"+d); } if(month < 12) {//月份不为12的情况 if(day == a[month]) {//判断天数是否为每月的最后一天 b = year; c = month + 1; d = 1; } if(day > 1 && day < a[month]) { b = year; c = month; d = day + 1; } System.out.println("Next date is:"+b+"-"+c+"-"+d); } } else System.out.println("Wrong Format"); } }
7-5(求前N天):该题目要求我们求前N天的日期,其实这个题目与上一个题目求下一天类似,思想几乎相同,两个题目的不同之处就在于该题目要求我们同时输出所输入日期的前n天和后n天,但是改题目没有像上一个题目那样规定我们一定要用什么类和方法,但是同样要求我们不能使用与Java有关的任何日期有关的类和方法。虽然这个题目没有限定我们一定用什么类和方法,但在上一个题目过后我们的思想肯定已经受限于了上个题目,所以用的方法几乎是相同的,所以在这一题的分析上我们就不再做过多解释,所以直接上图啦。
完整代码如下:
import java.util.Scanner; public class Main { public static boolean isLeapYear(int year) { boolean isLeapYear = (year % 4 == 0 && year % 100 !=0 )||year % 400 == 0; return isLeapYear; } public static boolean checkInputValidity(int year,int month,int day,int n) { int[] a=new int[]{0,31,28,31,30,31,30,31,31,30,31,30,31}; if(isLeapYear(year)) a[2] = 29; boolean checkInputValidity = (year>=1820&&year<=2020&&month>0&&month<=12&&day<=a[month]&&day>0&&Math.abs(n)<=10&&Math.abs(n)>=0); return checkInputValidity; } public static void nextDate(int year,int month,int day,int n) { int[] a=new int[]{0,31,28,31,30,31,30,31,31,30,31,30,31}; if(isLeapYear(year)) a[2] = 29; int b = 0,c = 0,d = 0; if(checkInputValidity(year,month,day,n)) { if (n==0) { b = year; c = month; d = day; } if(month==12&&n>0) { if(day-n<=a[month]&&day-n>0) { b = year; c = month; d = day-n; } if(day-n<=a[month]&&day-n<0) { b = year; c = month-1; d = a[c]-n+day; } if(day-n<=a[month]&&day-n==0) { b = year; c = month-1; d = a[c]-n+day; } } if(month==12&&n<0) { if(day-n>a[month]) { b = year +1; c = 1; d =day - n -a[month]; } if(day-n<=a[month]) { b = year; c = month; d =day - n; } } if(month>1&&month<12&&n>0) { if(day-n<=a[month]&&day-n>0) { b = year; c = month; d = day-n; } if(day-n<=a[month]&&day-n<0) { b = year; c = month-1; d = a[c]-n+day; } if(day-n<=a[month]&&day-n==0) { b = year; c = month-1; d = a[c]-n+day; } } if(month<12&&month>1&&n<0) { if(day-n>a[month]) { b = year; c = month+1; d =day - n -a[month]; } if(day-n<=a[month]) { b = year; c = month; d =day - n; } } if(month == 1&&n>0) { if(day-n<=a[month]&&day-n>0) { b = year; c = month; d = day-n; } if(day-n<=a[month]&&day-n<0) { b = year-1; c = 12; d = a[c]-n+day; } if(day-n<=a[month]&&day-n==0) { b = year-1; c = 12; d = a[c]-n+day; } } if(month==1&&n<0) { if(day-n>a[month]) { b = year; c = month+1; d =day - n -a[month]; } if(day-n<=a[month]) { b = year; c = month; d =day - n; } } System.out.println(n+" days ago is:"+b+"-"+c+"-"+d); } else System.out.println("Wrong Format"); } public static void main(String[] args) { Scanner sc = new Scanner(System.in); Main ss = new Main(); int year = sc.nextInt(); int month = sc.nextInt(); int day = sc.nextInt(); int n = sc.nextInt(); ss.nextDate(year,month,day,n); } }
(3)题目集三:
7-2(定义日期类型):该题目要求我们定义一个Date类(如图二十)
图二十
并且年月日都为私有属性,其实该题还是和题目集二中的求下一天的思路类似,同样要求是不能使用与Java有关的任何与日期有关的类和方法,只不过要自己定义一个Date的方法。
相同的算法咱们也不再过分啰嗦啦,直接上图叭
输入如图二十、二十一:
图二十
图二十一
输出如图二十二、二十三:
图二十二
图二十三
完整代码如下:
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner input = new Scanner(System.in);
Date yl = new Date();
int year = input.nextInt();
int month = input.nextInt();
int day = input.nextInt();
yl.setYear(year);
yl.setgetDay(day);
yl.setgetMonth(month);
if(!yl.checkInputValidity(year,month,day)) {
System.out.println("Date Format is Wrong");
}
else {
yl.getNextDate(year,month,day);
//System.out.println("Next day is:" + yl.getYear() + "-" + yl.getMonth() + "-" + yl.getDay());
}
}
static class Date {//类
private int year;
private int month;
private int day;
Date(){
this.year = year;
this.month = month;
this.day = day;
}
public void getNextDate() {
// TODO Auto-generated method stub
}
public int getYear() {
return year;
}
public void setYear(int year) {
this.year = year;
}
public int getMonth() {
return month;
}
public void setgetMonth(int month) {
this.month = month;
}
public int getDay() {
return day;
}
public void setgetDay(int day) {
this.day = day;
}
private static boolean isLeapYear(int year){//判断是否为闰年
if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
return true;
else
return false;
}
public static boolean checkInputValidity(int year,int month,int day){
//判断输入日期是否合法,返回布尔值
int mon_maxnum[] = new int [] {0,31,28,31,30,31,30,31,31,30,31,30,31};
if(isLeapYear(year))
mon_maxnum[2] = 29;
boolean checkInputValidity =
(year >= 1900 && year <= 2000 && month > 0 && month <= 12 && day <= mon_maxnum[month] && day>0);
return checkInputValidity;
}
public static void getNextDate(int year,int month,int day) {
//求输入日期的下一天
int mon_maxnum[] = new int [] {0,31,28,31,30,31,30,31,31,30,31,30,31};
if(isLeapYear(year))
mon_maxnum[2] = 29;
if(checkInputValidity(year,month,day)) {//日期合法的情况下
if(month == 12) {//月份为12的情况
if(day == mon_maxnum[month]) {//判断天数是否为每月的最后一天,天数为最后一天
year = year + 1;
month = 1;
day = 1;
}
else if(day >= 1 && day < mon_maxnum[month]) {//天数不是一个月的最后一天
day = day + 1;
}
System.out.println("Next day is:"+year+"-"+month+"-"+day);
}
else if(month < 12) {//月份不为12的情况
if(day == mon_maxnum[month]) {//判断天数是否为每月的最后一天
month = month + 1;
day = 1;
}
else if(day >= 1 && day < mon_maxnum[month]) {
day = day + 1;
}
System.out.println("Next day is:"+year+"-"+month+"-"+day);
}
}
}
}
}
7-3(一元多项式求导):暂无
心得:距离开始学习Java已经有一个月的时间了,说实话,真的挺煎熬的,因为刚开始学是真的什么都不懂,学起来是真的及其困难,就像当初最先开始接触编程,一无所知,迷迷糊糊开始做题、上课、写实验,这些对于一个初学者来说是真的的非常非常煎熬,从而导致了我每次不想甚至还有些抗拒去学这些编程语言课,后来甚至让我开始怀疑自己的学习能力,同时也在想当初自己为什么要学这个专业,直至最近我听到老师的话,才开始慢慢静下心来,慢慢去接受这一切,静下心来去慢慢学习这些专业课,老师说学习编程本来就是一个日积月累的过程,任何一个编程能力强的小伙伴都不是一夜之间变得非常厉害 ,你看不到强者背后所付出的汗水和泪水你就去怀疑自己的能力,这是非常幼稚的想法。是啊,谁都不是一夜之间变得厉害,谁都是付出了自己的努力才有了今天优秀的自己,谁都不能在自己洒下汗水之前来否定自己的能力,既然自己选择了软件这条路,含着泪也必须走完。其实很多人在上了大学之后都会吐槽甚至后悔自己选择的专业,学习Java之后我算彻底的明白了自己想要的是什么,也不会再去吐槽自己的专业,我们唯一要做的就是一直努力,让自己成为优秀的人,无论自己未来会从事什么专业,都会在自己的领域熠熠生辉!
改进建议:建议的话,怎么说呢,因为每次题目集的作业都会有时间限制,自己时间安排不太合理以至于每次都在作业截至最后一两天才开始正式去思考所以写出来的代码肯定不是最完美,所以此处得来的教训就是要早点着手作业上面的题目,全面、认真得去思考每一个题目,力争把每一个题目都写好。
总结:对于本次的三次PTA上面的题目集的学习,我学到了很多,基本的Java编程、私有属性数据的封装、get和set的使用、this的使用、boolean值的使用、数组的复制、新定义一个类、基本数据的输入和输出等等。我感觉我自己最最最需要学习的地方还是编程的最基本思维,其实很多时候做题目的时候,拿到一个题目不知道怎么去下手,几乎每次都要去网上先看看别人的思维,再回来自己写,像老师所说,其实你看了别人的思路之后,自己的思维几乎就被困在了里面,很难从别人的思维上再走出来,所以真的要自己多花时间去慢慢思考,慢慢沉淀、慢慢消化这些知识。关于老师授课的话,其实我觉得老师课堂上可以多花些时间跟我们讲解一下写程序的思路,课堂上尽量不用给我们练习的时间,因为同样给了我们课堂时间做随堂练习课后还是要继续写,这样不仅没有学到老师本来要穿寿衣给我们的知识,反而我么题目也没写出来,我觉得课堂上老师讲解之后,课后再布置课堂作业效果会好很多吧。
浙公网安备 33010602011771号