一·前言
习题集一的前言部分:
Java pta 习题集第一的题目相对简单,习题集一共有8个编程题,考察我们对于Java输入输出,排序及基本Java语法知识的掌握能力,关于java定义变量与C语言有很多相通的东西,pta的题目集一就很好的实现了,让我们从C语言到Java语言的过度,有些只是表达方式的不同,但语法基本相通,通过这次的习题集让我们对Java 有了一个入门的概念,习题集中的 if 以及else if的嵌套,与C语言的语法基本上相通的,总结,习题集一是我们对从c语言语法向Java语法的一个转变,考察的相对简单,题目也相对简单,更多的是让我们了解Java的一些基本的语法。
习题集二的前言部分:
习题集二的难度相对于习题集一有了较大的改变,引入了字符串处理String.用for循环对字符串的遍历处理,习题集二的第一题,IP地址的转换,考察了我们对二进制的处理怎样应用到字符串上,以及Java中的数学函数,Math.pow的使用,相对于习题集一的难度有所提升,习题集二的第二题考察了Java数组的知识,也考察了我们在C语言中学习到的排序算法,选择排序,将两个排序后的数组合并成一个新的数组,习题集二的第三题第一次引入Java类的概念,Java类的单一职责,要对类实现的功能进行封装,从而进而判断第几年第几天是星期几,这里比较难过的一个知识点是闰年的情况需要另行判断,习题集二的第四题也是对Java面向对象的类的集体运用的一个题,这两个题都是对于类的考察,让我们对于类有了一个很好的理解,习题集二的第五题是这次题目最难和测试点最多的题,在通过第五题的测试点时花了很多时间。
习题集三的前言部分:
Java习题集三,总共有三道编程题,相对于第一第二题目集来说,习题集三的题目难度有所提升,习题集三的得分并没有前两次的得分高,是老师发布的较难的一个题目。主要考察了我们对于类的设计以及对于字符串的处理,本次作业题目较难,我也只得到了分,第三题用到的正则表达式,我也没有完全的理解,在这个题目三中,第一题的定义账户类,和第二题的日期类,让我们对类的概念有了很好的认识,类的封装性以及单一职责性,在这两道题目中得到了很好的体现,这两道题由于前面做过有一些基础,做起来也不难,但第三题用到的正则表达式则是本次题目集中最难的一个,第三题的得分情况并没有达到预期的效果,只勉强得到了65分,题目集三的题目较难。
二·设计与分析
7-8
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner x=new Scanner(System.in); double a,b,c,temp; a=x.nextFloat();b=x.nextFloat();c=x.nextFloat(); if(a>b){ temp=a;a=b;b=temp; } if(a>c){ temp=a;a=c;c=temp; } if(b>c){ temp=b;b=c;c=temp; } if(a>=1&&a<=200&&b>=1&&b<=200&&c>=1&&c<=200){ if(a+b>c){ if(a==b&&b==c) System.out.println("Equilateral triangle"); else if(a*a+b*b-c*c<0.000001&&a==b) System.out.println("Isosceles right-angled triangle"); else if((a==b&&a!=c)||(a==c&&a!=b)||(b==c&&b!=a)) System.out.println("Isosceles triangle"); else if(a*a+b*b-c*c<0.000001) System.out.println("Right-angled triangle"); else System.out.println("General triangle"); } else System.out.println("Not a triangle"); } else System.out.println("Wrong Format"); } }
这一题在做的时候,出现了一些问题:
原因有如下:
- 所有三角形是否考虑全面
- 有一些三角形是包含一些三角形,else if 的先后顺序,可以+
- 减少判断的次数
- 在判断直角三角型的精度问题,怎样准确的判断一个三角形是不是直角三角形也涉及到了一个测试点能否过去,这点当时并没有注意到。
7-4 求下一天
输入年月日的值(均为整型数),输出该日期的下一天。 其中:年份的合法取值范围为[1820,2020] ,月份合法取值范围为[1,12] ,日期合法取值范围为[1,31] 。
import java.util.Scanner; class Main { //主函数 public static void main(String[] args) { Scanner x = new Scanner(System.in); int year = x.nextInt(); int month = x.nextInt(); int day = x.nextInt(); nextDate(year,month,day); } //判断year是否为闰年,返回boolean类型 public static boolean isLeapYear(int year) { boolean isLeapYear; isLeapYear = (year % 4 == 0 && year % 100 !=0 )||year % 400 == 0; return isLeapYear; } //判断输入日期是否合法,返回布尔值 public static boolean checkInputValidity(int year,int month,int day) { boolean checkInputValidity; int[] a=new int[]{0,31,29,31,30,31,30,31,31,30,31,30,31}; if(!isLeapYear(year)) a[2] = 28; 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,29,31,30,31,30,31,31,30,31,30,31}; int d=0,m=0; if(!isLeapYear(year))//如果不是闰年 a[2] = 28; if(checkInputValidity(year,month,day)) {//如果输入的数字合法 if(month==12) {//如果是12月 if(day==a[month]) {//如果是12月的最后一天 year = year+1; m = 1; d=1; } else{//如果不是12月的最后一天 m=month; d =day +1; } } else {//如果不是12月 if(day==a[month]) {//如果是该月的最后一天 m = month + 1; d = 1; } else{//如果不是该月的最后一天 m=month; d = day+1; } } System.out.println("Next date is:"+year+"-"+m+"-"+d); } else//如果输入的数字非法 System.out.println("Wrong Format"); } }
这一题在做的时候,出现了一些问题:
原因有如下:
- 闰年的判断
- 大月与小月的区别
- 日期是否合法
- 数字是否合法
7-5 求前N天
输入年月日的值(均为整型数),同时输入一个取值范围在[-10,10] 之间的整型数n,输出该日期的前n天(当n > 0时)、该日期的后n天(当n<0时)。
其中年份取值范围为 [1820,2020] ,月份取值范围为[1,12] ,日期取值范围为[1,31] 。
import java.util.Scanner; class Main { public static void main(String[] args) { Scanner input = new Scanner(System.in); int y, m, d, n; y = input.nextInt(); m = input.nextInt(); d = input.nextInt(); n = input.nextInt(); if(checkInputValidity(y,m,d)){ nextDate(y,m,d,n); }else System.out.println("Wrong Format"); } public static boolean isLeapYear ( int year){ boolean ret = false; if ((year % 100 != 0 && year % 4 == 0) || (year % 400 == 0)) { ret = true; } return ret; } public static boolean checkInputValidity(int year,int month,int day){ boolean ret=false; int[] mm={31,28,31,30,31,30,31,31,30,31,30,31}; if (isLeapYear(year))mm[1]=29; if ((year>=1820&&year<=2020)&&(month>=1&&month<=12)&&(day>=1&&day<=mm[month-1])){//此处的month-1用来判断不同年份的不同月份的数据是否合法 ret=true; } return ret; } public static void nextDate ( int year, int month, int day, int n){ int[] mm = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; if (isLeapYear(year)) mm[2] = 29; day -= n; if (n > 0) { while (day <= 0) { month--; if (month == 0) { month += 12; year--; } day += mm[month]; } } else if (n < 0) { while (day > mm[month]) { day -= mm[month]; month++; if (month == 13) { month -= 12; year++; } } } System.out.printf("%d days ago is:%d-%d-%d\n", n, year, month, day); } }
这个题设计了两个类,一个类用来判断输入的年份,天数是不是合法,求下一次天数的时候,需要导入四个参数,年份,月份,天数,需要加减的天数,在加入的天数超过这个月所在的天数时,月份需要加一,当月份加入超过12时,需要进行年份加一,这个题需要注意的是年份的操作,闰年的二月月份和平年的月份是不同的。
7-2 定义日期类定义一个类Date,包含三个私有属性年(year)、月(month)、日(day),均为整型数,其中:年份的合法取值范围为[1900,2000] ,月份合法取值范围为[1,12] ,日期合法取值范围为[1,31] 。
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
Date date = new Date();
date.setYear(in.nextInt());
date.setMonth(in.nextInt());
date.setDay(in.nextInt());
date.nextDate(date.getYear(), date.getMonth(), date.getDay());
}
}
class Date{
private int year;
private int month;
private int day;
Date(){
}
Date(int year,int month,int day){
}
public int getYear() {
return year;
}
public void setYear(int year) {
this.year=year;
}
public int getMonth() {
return month;
}
public void setMonth(int month) {
this.month=month;
}
public int getDay() {
return day;
}
public void setDay(int day) {
this.day=day;
}
public static boolean isLeapYear(int year) {
boolean isLeapYear;
isLeapYear = (year % 4 == 0 && year % 100 !=0 )||year % 400 == 0;
return isLeapYear;
}
public static boolean checkInputValidity(int year,int month,int day) {
boolean checkInputValidity;
int[] a=new int[]{0,31,29,31,30,31,30,31,31,30,31,30,31};
if(!isLeapYear(year))
a[2] = 28;
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,29,31,30,31,30,31,31,30,31,30,31};
int d=0,m=0;
if(!isLeapYear(year))//如果不是闰年
a[2] = 28;
if(checkInputValidity(year,month,day)) {//如果输入的数字合法
if(month==12) {//如果是12月
if(day==a[month]) {//如果是12月的最后一天
year = year+1;
m = 1;
d=1;
}
else{//如果不是12月的最后一天
m=month;
d =day +1;
}
}
else {//如果不是12月
if(day==a[month]) {//如果是该月的最后一天
m = month + 1;
d = 1;
}
else{//如果不是该月的最后一天
m=month;
d = day+1;
}
}
System.out.println("Next day is:"+year+"-"+m+"-"+d);
}
else//如果输入的数字非法
System.out.println("Date Format is Wrong");
}
}
这一题在做的时候,出现了一些问题:
原因有如下:
- 闰年的判断
- 大月与小月的区别
- 日期是否合法
- 数字是否合法
三.踩坑心得
在写代码的过程中,不能害怕困难,要把写c语言的习惯改一改,要有面向对象的思维。
四.改进建议
暂无。
五.总结
学习是一个积累的过程,要想学好Java,需要在每一次的练习里总结,认真对待每一条语句,每一行代码。