一.前言
第一、二次作业
涉及知识点
考察:1.如何使用Scanner类从键盘读取数据;声明变量和赋值;使用八种基本类型
2.选择语句,if-else/else if、switch的使用;循环语句,for、while语句的使用
3.输出的几种方式:println,print,printf;
4.强制类型转换
5.String类的使用
创建对象:(String str = new String(“hello”)、String str = input.next())
比较两个字符串是否相等:str1.equals(str2)、str1.equals(“hello”)
Char类型与String的转换:String s1=input.next();
char[] a=s1.toCharArray();
String类的一些常用方法:str.length()、str1.equals(str2)、s1.substring(0,1)、s1.substring(3)、s1.toCharArray()、s1.indexOf(s2)、String[] arr = gps.split(",")
输入字符串:String s1 = input.next()、String s1 = input.nextLine()
输入字符串的几种方法:直接定义String str = “abcd”; 键盘输入String str = input.next(); String str = input.nextLine(); String str = new String(“hello”);
6.使用数组:int[] a = new int[n];
7.使用Math类,如Math.pow、Math.abs()<=0.001来判断一个浮点数的精确度(浮点误差)
8.在类中使用方法,pubilc static + 类型 + 方法名 + (类型 + 参数),类型包括引用类型和基本类型
9.四舍五入保留整数:使用(int)(x + 0.5)
题量和难度
第一、二次作业题量都比较多,除了第一次作业数据处理的那题花了很长的时间,其他题目难度都相对比较小。
第三次作业
涉及知识点
考察:1.使用类:创建对象(new Circle()),调用方法(circle.getRadius())
2.使用包:import语句,import.java.util.Scanner
3.类:类名、属性、方法
4.构造方法:可重载,但参数需不同;对属性进行初始化;为对象申请空间
5.属性:私有 方法:公有
6.类与类之间的关系:组合,聚合,依赖,关联
7.修饰符:public、private、static
8.实例方法和静态方法(用static修饰)
静态方法/变量可以通过类名访问
9.set 和get的使用,private封装性
题量和难度
第三次作业的题量较少,但题目会稍微更难一些,尤其是最后一道题。
二.设计与分析
7-3
题目分析
这个题目是需要求当前日期的下一天,主要分析年月日的问题。年包括闰年和平年,平年和闰年在于二月的天数不同;对于月来说,每个月对应的最大天数不同,最大月份为12月;对于日来说,若当前日对应当前月的最大天数,则要进入下一个月。由这些分析可以把问题细化并得到以下方法:1.判断平年和闰年 2.判断月份与日的对应关系 3.判断年月日的合法输入
源码分析
getPreviousDays()和getDaysofDates()的复杂度都很高,而getPreviusDays()的功能和getNextDays()的功能大同小异,复杂却高了那么多,说明自己还是没有弄清楚原理,把问题复杂化了。
类图
源码
点击查看代码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int yy = input.nextInt();
int mm = input.nextInt();
int dd = input.nextInt();
Date date = new Date(yy, mm, dd);
if(date.checkInputValidity())
date.getNextDate();
else
System.out.println("Date Format is Wrong");
}
}
class Date{
private int year;
private int month;
private int day;
int[] a= new int[]{0,31,28,31,30,31,30,31,31,30,31,30,31};
Date(){
}
Date(int yy, int mm, int dd){
this.year = yy;
this.month = mm;
this.day = dd;
}
public int getYear(){
return year;
}
public void setYear(int yy){
this.year = yy;
}
public int getMonth(){
return month;
}
public void setMonth(int mm){
this.month = mm;
}
public int getDay(){
return day;
}
public void setDay(int dd){
this.day = dd;
}
public boolean isLeapYear(int yy){
if(yy % 400 == 0 || (yy % 4 == 0 && yy %100 != 0))
return true;
return false;
}
public boolean checkInputValidity(){
if(year >= 1900 && year <= 2000 && month >=1 && month <= 12 && day >=1 && day <= 31){
if(month == 2){
if(isLeapYear(year) == true && day <= a[2] + 1)
return true;
else if(isLeapYear(year) == false && day <= a[2])
return true;
}
else if(day <= a[month])
return true;
}
return false;
}
public void getNextDate(){
if(month == 2){
if(isLeapYear(year) == true && day == a[2] + 1){
day = 1;
month+= 1;
}
else if(isLeapYear(year) == false && day == a[2]){
day = 1;
month+= 1;
}
}
else if(month == 12 && day == 31)
{
day = 1;
month = 1;
year+= 1;
}
else if(day == a[month])
{
day = 1;
month+= 1;
}
else{
day+= 1;
}
System.out.println("Next day is:" + year + "-" + month + "-" + day);
}
}
小结
这个题目已经给出了基本的要求和需要的方法,是对题目集2的7-9的进一步改进和功能增加,也是对7-9的一个优化。重点在于如何写好getNextDate这个方法,解决一个问题,写出来的代码要高效、简洁易懂,时间和空间复杂度都要很低。在不同的思维环境下,一个代码可以写得很简单,也可以很复杂。
7-4
题目分析
此题是在求下一天的基础上求下n天和前n天的日期以及两个日期相差的天数。在上一题的基础上让天数一天天增加(减少),加(减)n天求出日期,以及从小的那个日期开始一直增加天数,直到和大的那个日期相等。
源码分析
类图
源码
点击查看代码
import java.util.Scanner;
import java.time.LocalDate;
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int year = 0;
int month = 0;
int day = 0;
int choice = input.nextInt();
if (choice == 1) { // test getNextNDays method
int m = 0;
year = Integer.parseInt(input.next());
month = Integer.parseInt(input.next());
day = Integer.parseInt(input.next());
DateUtil date = new DateUtil(year, month, day);
if (!date.checkInputValidity()) {
System.out.println("Wrong Format");
System.exit(0);
}
m = input.nextInt();
if (m < 0) {
System.out.println("Wrong Format");
System.exit(0);
}
System.out.print(date.getYear() + "-" + date.getMonth() + "-" + date.getDay() + " next " + m + " days is:");
System.out.println(date.getNextNDays(m).showDate());
} else if (choice == 2) { // test getPreviousNDays method
int n = 0;
year = Integer.parseInt(input.next());
month = Integer.parseInt(input.next());
day = Integer.parseInt(input.next());
DateUtil date = new DateUtil(year, month, day);
if (!date.checkInputValidity()) {
System.out.println("Wrong Format");
System.exit(0);
}
n = input.nextInt();
if (n < 0) {
System.out.println("Wrong Format");
System.exit(0);
}
System.out.print(
date.getYear() + "-" + date.getMonth() + "-" + date.getDay() + " previous " + n + " days is:");
System.out.println(date.getPreviousNDays(n).showDate());
} else if (choice == 3) { //test getDaysofDates method
year = Integer.parseInt(input.next());
month = Integer.parseInt(input.next());
day = Integer.parseInt(input.next());
int anotherYear = Integer.parseInt(input.next());
int anotherMonth = Integer.parseInt(input.next());
int anotherDay = Integer.parseInt(input.next());
DateUtil fromDate = new DateUtil(year, month, day);
DateUtil toDate = new DateUtil(anotherYear, anotherMonth, anotherDay);
if (fromDate.checkInputValidity() && toDate.checkInputValidity()) {
System.out.println("The days between " + fromDate.showDate() +
" and " + toDate.showDate() + " are:"
+ fromDate.getDaysofDates(toDate));
} else {
System.out.println("Wrong Format");
System.exit(0);
}
}
else{
System.out.println("Wrong Format");
System.exit(0);
}
}
}
class DateUtil{
private int year;
private int month;
private int day;
int []a = new int[]{0,31,28,31,30,31,30,31,31,30,31,30,31};
DateUtil(){
}
DateUtil(int yy, int mm, int dd){
year = yy;
month = mm;
day = dd;
}
public void setYear(int yy){
year = yy;
}
public void setMonth(int mm){
month = mm;
}
public void setDay(int dd){
day = dd;
}
public int getYear(){
return year;
}
public int getMonth(){
return month;
}
public int getDay(){
return day;
}
public boolean checkInputValidity(){//检测输入的年、月、日是否合法
if(year >= 1820 && year <= 2020 && month >=1 && month <= 12 && day >=1 && day <= 31){
if(month == 2){
if(isLeapYear(year) && day <= a[2] + 1)
return true;
else if(!isLeapYear(year) && day <= a[2])
return true;
}
else if(day <= a[month])
return true;
}
return false;
}
public boolean isLeapYear(int year){//判断year是否为闰年
if(year % 4 == 0 && year % 100 != 0)
return true;
else if(year % 400 == 0)
return true;
return false;
}
public DateUtil getNextNDays(int n){//取得year-month-day的下n天日期
int i = 0;
int temp = 0;
int restDay = 0;
for(i = 1; i < month; i++){
if(isLeapYear(year) && i == 2)
temp += 1;
temp += a[i];
}
n = n + temp +day;
while(true) {
if (isLeapYear(year)){
n -= 366;
}
else {
n -= 365;
}
if(n < 0)
break;
year += 1;
restDay = n;//少了导致错误
}
n = restDay;
month = 1;
for(i = 1; i <= 12; i++){
if(isLeapYear(year) && i == 2)
temp += 1;
n = n - a[i];
if(n < 0)
break;
month += 1;
day = n;//少了导致错误
}
return this;
}
public DateUtil getPreviousNDays(int n) {//取得year-month-day的前n天日期
int i = 0;
int temp = 0;
int t = 0;
int restDay = 0;
for (i = 1; i < month; i++) {
if (isLeapYear(year) && i == 2)
temp += 1;//不要写成a[i] += 1,会改变a[2]的值,让a[2]=29,进而影响后面的计算
temp += a[i];
}
temp += day;
if (temp > n) {
month = 1;
restDay = temp - n;
for (i = 1; i <= 12; i++) {
t = restDay;
if (isLeapYear(year) && i == 2)
restDay -= 1;
restDay -= a[i];
if (restDay < 0)
break;
}
}
else {
month = 1;
restDay = n - temp;
year -= 1;
if (restDay >= 366) {
while (true) {
t = restDay;
if (isLeapYear(year))
restDay -= 366;
else
restDay -= 365;
if (restDay < 0)
break;
year -= 1;
}
restDay = t;
if(isLeapYear(year))
restDay = 366 - restDay;
else
restDay = 365 - restDay;
for (i = 1; i < 12; i++) {
t = restDay;
if (isLeapYear(year) && i == 2)
restDay -= 1;
restDay -= a[i];
if (restDay < 0)
break;
}
}
else {
if (isLeapYear(year))
restDay = 366 - restDay;
else
restDay = 365 - restDay;
for (i = 1; i <= 12; i++) {
t = restDay;
if (isLeapYear(year) && i == 2)
restDay -= 1;
restDay -= a[i];
if (restDay < 0)
break;
}
}
}
month = i;
if(i == 13)//若不判断,当日期为2003-1-1,测试前1天时有误(会出现 2002-13-31)
month -= 1;
day = t;
if(t == 0){//若不判断,当日期为2003-12-31,测试前31天时有误(会出现 2003-12-0)
month -= 1;
day = a[month];
}
return this;
}
public boolean compareDates(DateUtil date){//比较当前日期与date的大小(先后)
if(year > date.year)
return true;
if(year == date.year && month > date.month)
return true;
if(year == date.year && month == date.month && day > date.day)
return true;
return false;
}
public boolean equalTwoDates(DateUtil date){//判断两个日期是否相等
if(year == date.year && month == date.month && day == date.day)
return true;
return false;
}
public int getDaysofDates(DateUtil date) {//求当前日期与date之间相差的天数
int interval = 0;
int temp = 0;
int i = 0;
int t = 0;
if(equalTwoDates(date))
interval = 0;
else if(year == date.year){
if(month > date.month) {
for (i = date.month; i < month; i++) {
if (isLeapYear(year) && i == 2)
temp += 1;
temp += a[i];
}
interval = temp + day - date.day;
}
else{
for (i = month; i < date.month; i++){
if(isLeapYear(year) && i == 2)
temp += 1;
temp += a[i];
}
interval = temp + date.day -day;
}
}
else if(year > date.year){
for (i = 1; i < date.month; i++) {
if (isLeapYear(date.year) && i == 2)
interval += 1;
interval += a[i];
}
interval += date.day;
if (isLeapYear(date.year))
interval = 366 - interval;
else
interval = 365 - interval;
for (i = date.year + 1; i < year; i++) {
if (isLeapYear(i))
interval += 366;
else
interval += 365;
}
for (i = 1; i < month; i++) {
if (isLeapYear(year) && i == 2)
temp += 1;
temp += a[i];
}
temp += day;
interval += temp;
}
else if(date.year > year){
for (i = 1; i < month; i++) {
if (isLeapYear(year) && i == 2)
interval += 1;
interval += a[i];
}
interval += day;
if (isLeapYear(year))
interval = 366 - interval;
else
interval = 365 - interval;
for (i = year + 1; i < date.year; i++) {
if (isLeapYear(i))
interval += 366;
else
interval += 365;
}
for (i = 1; i < date.month; i++) {
if (isLeapYear(date.year) && i == 2)
temp += 1;
temp += a[i];
}
temp += date.day;
interval = temp + interval;
}
return interval;
}
public String showDate(){//以“year-month-day”格式返回日期值
return (year + "-" + month + "-" + day);
}
}
小结
这道题的给出了很多方法,在写代码时,每一个我都有写,但不是每一个我都用上了(比如说compareDates()),我根本就没使用到,说明代码在写的过程中有些地方被我写复杂了,导致这个方法用不上。
三.采坑心得
第一次作业
7-4(快递运费)
错误点
一开始我没有注意题目已经给出了四舍五入的方法,用Math.abs(a - (int)a) >= 0.5的方式来进行四舍五入,更麻烦且过不了测试点。
7-5(去掉重复的字符串)
错误点
忽略了在去除重复字符的过程中,字符串的总长度在不断变短。
错误代码
点击查看代码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
String s1=input.next();
String s2=s1.substring(0,1);
int index=0,i;
for(i=0;i<s1.length()-1;i++){
s2=s1.substring(i,i+1);
while((index=s1.indexOf(s2))!=-1) {
s1=s1.substring(0,index)+s1.substring(index+1,s1.length()-index);
}
}
System.out.println(s1);
}
}
正确代码
点击查看代码
import java.util.Scanner;
public class Main
{
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
String s1=input.next();
char[] a=s1.toCharArray();
int i,j;
for(i=0;i<s1.length();i++) {
for(j=i+1;j<s1.length();j++) {
if(a[i]==a[j]) {
s1=s1.substring(0,j)+s1.substring(j+1);
j--;
a=s1.toCharArray();
}
}
}
System.out.println(s1);
}
}
7-7(有重复的数据)
错误点
超出了所给的时间限制
改进
错误1
一开始我想的只是用排序可能会减少一些时间,但我用的是冒泡排序,并不能达到缩短时间的效果,反而花了更多时间和空间。
错误2
String.valueOf(),把数组转换成字符串,但是当数组元素为两位数或大于两位数时,存储的字符串会把一个整形数,拆成若干个字符。
错误代码
点击查看代码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int n = input.nextInt();
int i,index;
int[] a1 = new int[n];
for(i=0;i<n;i++)
a1[i]=input.nextInt();
String str = String.valueOf(a1);
char[] a2 = str.toCharArray();
for(i = 0; i < str.length(); i++){
if((index = str.indexOf(a2[i]))! = -1)
break;
}
if(i >= str.length())
System.out.println("NO");
else
System.out.println("YES");
}
}
(最终)使用快速排序解决问题
7-8(从一个字符串中移除包含在另一个字符串中的字符)
错误点
这个错误我暂时还没有明白是哪里错了,如果有知道的可以帮忙解答疑惑。最后使用暴力遍历的方法解决了问题。
错误代码
点击查看代码
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner input = new Scanner(System.in);
String s1 = input.next();
String s2 = input.next();
char[] a1 = s1.toCharArray();
char[] a2 = s2.toCharArray();
int i=0,j,flag=0;
while(i<s1.length()){
flag=0;
for(j=0;j<s2.length();j++){
if(a1[i]==a2[j]){
s1=s1.substring(0,i)+s1.substring(i+1);
flag=1;
}
a1 = s1.toCharArray();
}
i++;
if(flag==1)
i--;
}
System.out.println(s1);
}
}
7-10(GPS数据处理)
错误点
循环跳出的时间有误。
题目的意思是把所有的GPS语句读完,并找出满足要求的那一条语句。而上面这段代码是在找到这条满足要求的GPS语句后直接跳出循环,不再读入后面的其他语句。
错误代码
点击查看代码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int i = 0, j = 0, k = 0, check = 0;
String gps = new String();
gps = input.nextLine();
while (!(gps.equals("END")))
{
i = 0;
String[] arr = gps.split(",");
if (arr[0].equals("$GPRMC") && arr[2].equals("A"))
{
i = 0;
char[] aa1 = gps.toCharArray();
int s = (int)aa1[1] ;
check = Integer.parseInt(arr[12].substring(2),16);
for (i = 2; i < gps.length()-3; i++){
s = s ^ aa1[i];
}
if (s == check){
int hh, mm, ss;
hh = (aa1[7] - '0') * 10 + aa1[8] - '0' + 8;
if (hh > 24)
hh = hh - 24;
mm = (aa1[9] - '0') * 10 + aa1[10] - '0';
ss = (aa1[11] - '0') * 10 + aa1[12] - '0';
System.out.printf("%02d:%02d:%02d", hh, mm, ss);
}
}
gps = input.nextLine();
}
}
}
正确代码
点击查看代码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int i = 0, j = 0, k = 0, check = 0;
int hh=0, mm=0, ss=0;
String gps = new String();
while(true)
{
gps = input.nextLine();
if(!gps.equals("END"))
{
String[] arr = gps.split(",");
if (!arr[0].equals("$GPRMC") && !arr[2].equals("A"))
continue;
i = 0;
char[] aa1 = gps.toCharArray();
int s = 0 ;
check = Integer.parseInt(arr[12].substring(2),16);
i=1;
while(aa1[i]!='*')
{
s = s ^ aa1[i];
i++;
}
if (s == check)
{
hh = (aa1[7] - '0') * 10 + aa1[8] - '0' + 8;
if (hh > 24)
hh = hh - 24;
mm = (aa1[9] - '0') * 10 + aa1[10] - '0';
ss = (aa1[11] - '0') * 10 + aa1[12] - '0';
}
}
if(gps.equals("END"))
{
System.out.printf("%02d:%02d:%02d",hh,mm,ss);
break;
}
}
}
}
7-12(列出最简真分数序列)
错误点
把题目想复杂了,实际上就是去掉有分子分母有公因子的分数就可以了,所以以后还是得先理明白里面的关系,再构思方法。
错误代码
点击查看代码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int i, j, N = input.nextInt(), flag = 0;
if (N % 2 == 0)//N为偶数{
System.out.print(1 + "/" + N + ",");
for (i = 3; i < N; i += 2) {
for (j = 3; j <= i; j += 2) {
if (N % j == 0 && i % j == 0) {
flag = 1;
break;
}
}
if (flag == 0)
System.out.print(i + "/" + N + ",");
}
}
else//N为奇数{
System.out.print(1 + "/" + N + ",");
for (i = 2; i < N; i += 2) {
for (j = 2; j <= i; j += 2) {
if (N % j != 0 && i % j != 0 && N % i != 0) {
System.out.print(i + "/" + N + ",");
break;
}
}
}
}
}
}
正确代码
点击查看代码
import java.util.Scanner;
public class Main
{
public static void main(String[] args)
{
Scanner input= new Scanner(System.in);
int i,j,N=input.nextInt();
for(i=1;i<N;i++){
for(j=2;j<=i;j++) {
if(i%j==0&&N%j==0)
break;
}
if(j>i)
System.out.print(i+"/"+N+",");
}
}
}
第二次作业
7-1、7-3
错误点
没有用float而是用了double(但我觉得是题目的问题,它并没有要求说一定要用float)
7-2(奇数求和)
错误点
判断奇数时没有考虑负数,考虑不全面。
7-6(巴比伦法求平方根近似值)
错误点
输出的是多进行了一次精确计算的值,与精度是double和float没有太大关系,我当时以为是这里出了问题,还把Math.abs() < 0.00001换成了< 0.01,最后用2 1测试出来的答案是没错了,但是如果是其他的一些数值测试,可能输出的结果就是错的。因此确定循环什么时候结束真的挺需要注意的。
错误代码
点击查看代码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
float n = input.nextFloat();
float lastGuess = input.nextFloat();
float nextGuess = (lastGuess + n / lastGuess) / 2;
if(n < 0 || lastGuess <=0)
System.out.println("Wrong Format");
else{
while((nextGuess - lastGuess) >= 0.01 ||(nextGuess - lastGuess) <= -0.01){
lastGuess = nextGuess;
nextGuess = (lastGuess + n / lastGuess) / 2;
}
System.out.println(nextGuess);
}
}
}
正确代码
点击查看代码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
float n = input.nextFloat();
float lastGuess = input.nextFloat();
float nextGuess = (lastGuess + n / lastGuess) / 2;
if(n < 0 || lastGuess <=0)
System.out.println("Wrong Format");
else{
while(Math.abs(nextGuess - lastGuess) >= 0.00001){
lastGuess = nextGuess;
nextGuess = (lastGuess + n / lastGuess) / 2;
}
System.out.println(lastGuess);
}
}
}
7-7(二进制数提取)
错误点
非法输入时没有输出警告语句(我觉得也是题目没讲造成的)
7-8(判断三角形类型)
错误点
错误1
等腰直角三角形也是等腰三角形的一种,如果先判断有两腰相等,直接会输出"等腰三角形",而不会进入下一个else if语句,判断它是否为直角三角形,所以要把等腰的判断分类,一类为等腰直角,一类为等腰,且先判断等腰直角。
错误2
判断两浮点数相等时,会出现浮点误差,因此判断相等的条件应该是二者的差值小于一个很小的数时,就判断二者相等。
第三次作业
7-2
错误点
计算月利率时,月利率=余额(年利率/1200),写成了月利率=余额年利率/1200,导致精度不准确而错。
7-3(定义日期类)
错误点
缺少判断当日期为12月31日,下一天的计算
错误代码
点击查看代码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int yy = input.nextInt();
int mm = input.nextInt();
int dd = input.nextInt();
Date date = new Date(yy, mm, dd);
if(date.checkInputValidity())
date.getNextDate();
else
System.out.println("Date Format is Wrong");
}
}
class Date{
private int year;
private int month;
private int day;
int[] a= new int[]{0,31,28,31,30,31,30,31,31,30,31,30,31};
Date(){
}
Date(int yy, int mm, int dd){
this.year = yy;
this.month = mm;
this.day = dd;
}
public int getYear(){
return year;
}
public void setYear(int yy){
this.year = yy;
}
public int getMonth(){
return month;
}
public void setMonth(int mm){
this.month = mm;
}
public int getDay(){
return day;
}
public void setDay(int dd){
this.day = dd;
}
public boolean isLeapYear(int yy){
if(yy % 400 == 0 || (yy % 4 == 0 && yy %100 != 0))
return true;
return false;
}
public boolean checkInputValidity(){
if(year >= 1900 && year <= 2000 && month >=1 && month <= 12 && day >=1 && day <= 31){
if(month == 2){
if(isLeapYear(year) == true && day <= a[2] + 1)
return true;
else if(isLeapYear(year) == false && day <= a[2])
return true;
}
else if(day <= a[month])
return true;
}
return false;
}
public void getNextDate(){
if(month == 2){
if(isLeapYear(year) == true && day == a[2] + 1){
day = 1;
month+= 1;
}
else if(isLeapYear(year) == false && day == a[2]){
day = 1;
month+= 1;
}
}
else if(day == a[month])
{
day = 1;
month+= 1;
}
else{
day+= 1;
}
System.out.println("Next day is:" + year + "-" + month + "-" + day);
}
}
7-4(日期类设计)
错误点
错误1
一开始我在判断是闰年的时候让a[2] += 1,但是a[2]会在很多方法中被用到,但是一旦因为闰年而改变后,每次闰年都会让a[2] + 1,这样就会导致天数出现错误。
错误2
细节问题,写错数字
吃了细节上的亏,在设计日期类里,有关年份的计算时,我把365天写成了356天,导致计算跨年天数时一直都和正确答案相差了不少天数,然后又闷头在测试数据,其实当时只要再检查一下代码其实就可以发现这个问题,所以以后写的时候要小心,写完了以后也要检查一下,或者干脆重新按照思路写一遍。
错误3
缺少对越界数据的判断,出现如下情况
其他
还有就是对很多基本知识和语法掌握得不是很准确,导致总是出现指向空指针、越界等问题,但是书上其实都有标准的定义和写法,所以以后还是得先把书看完,把知识点先装进脑子里,防止一次又一次在一个坑里栽跟头,还不知道自己真正错的点,然后上网搜索自己的错误原因,发现把一个地方改对了,其他地方又会出现错误,那就说明自己其实并没有真正理解错误的原因,所以说还是得多看书,进行系统的学习,而不是写错了去找错误,要做到一开始写的基本就是对的。
四.改进建议
优化代码首先先从理解上优化,一看就能看懂写的是什么意思;意思表述简单后写出更短、消耗更少时间和空间的代码。
第一次作业
7-10
题目集1判断GPS的那道题,我没有理解题目的意思就开始写代码,导致后面怎么改都是有错误的。还有就是后面终于能运行过了以后发现只过了一个测试点。因此后面自己需要更整体地看待一个题,先对问题进行分析,把设计构思好了再开始写,防止又出现总是改代码的情况,还越改错的越多。
第二次作业
7-3(日期类设计)
在这道题没有给出数组来存储日期之前,我是用if语句来判断哪些月份对应哪些天数,就很不灵活。常量是确定不会改变的量,那么它就可以被存储起来,等到需要用的时候在拿出来用,数组储存的意义就在这。
就比如这一段
点击查看代码
public static void nextDate(int year,int month,int day){//求输入日期的下一天
if((month == 1 || month == 3 || month == 5 ||month == 7 || month == 8 || month == 10) && day == 31){
month = month + 1;
day = 1;
}
else if((month == 4 || month == 6 || month == 9 ||month == 11) && day == 30){
month = month + 1;
day = 1;
}
else if(month == 2 && ((isLeapYear(year) == true && day ==29) || ((isLeapYear(year) == false && day == 28)))){
month = month + 1;
day = 1;
}
else if(month == 12 && day == 31){
month = 1;
day =1;
year = year + 1;
}
else
day = day + 1;
System.out.println("Next date is:" + year + "-" + month + "-" + day);
}
点击查看代码
public static void nextDate(int year,int month,int day){//求输入日期的下一天
if(month == 2 && isLeapyear(year))
a[2] ++;
if (day == a[month]){
day = 1;
month ++;
if(month == 13){
month = 1;
year ++;
}
}
else
day ++;
System.out.println("Next date is:" + year + "-" + month + "-" + day);
}
7-4(日期类设计)
一天天加减比较慢,每加减一天就要进行一次循环,再更快速一点,可以让天数跨度大的,以年或月为单位加减,年份跨度大的,以365(366)天为单位加减。
五.总结
学到的知识
这三次题集,让我学会了如何进行一些基本的代码编写,尽可能更少地出现编译错误。第三次的作业让我开始对类的整体有了一个概念,了解了(私有)属性和(公有)方法以及构造方法等。
需要改进的地方
还有就是格式上的问题,写题目集1的时候,格式不规范,后面两次都有在改进,还有就是缺少注释,写的代码没有功能上的注释,给别人的观看带来困扰。后面我会更加注意格式的书写和添加必要注释,还有就是向其他同学学习,多沟通交流,毕竟自己总会有没有想全面的地方。
建议
课堂上的话,我还是希望老师能整体地说一下这节课的内容,因为在讲的时候,我发现老师喜欢用一种循序渐进的方式来引导大家思考,还是比较好的一种方式,可以锻炼我们的思维能力,先从一个点切入,然后发现不足点,然后改进方法,得到不断地提升。
希望老师后面在每次大家做完pta后,看到大家的不足,能更多地在课堂上提出大家做得不好的地方,提出有一些好的方法和建议,感觉有些时候自己在写方法的时候,确实把方法复杂化了。
pta作业有的时候没有明确一些要求,有些时候还少了,就像有题目要求用float型,没有明确讲出来,就不知道自己错在什么地方。