前三次作业总结

一、前言:

对三次作业进行一个总结

首先第一次作业主要考察学生Java的基础知识,一些简单的判断和循环,总体来说难度不大。

第二次作业涉及到的知识点有:IP地址转换,字符串读取,数组的合并以及数组的排序,类的方法的使用以及闰年的判断,总体来看难度适中。

第三次作业主要考察学生Java中类的知识,包括私有属性,构造方法,以及通过类图对代码进行一个详细的了解,难度稍大。

二、设计与分析:

作业一7-8

输入三角形三条边,判断该三角形为什么类型的三角形。(1)如果输入数据非法,则输出“Wrong Format”; (2)如果输入数据合法,但三条边不能构成三角形,则输出“Not a triangle”; (3)如果输入数据合法且能够成等边三角形,则输出“Equilateral triangle”; (3)如果输入数据合法且能够成等腰直角三角形,则输出“Isosceles right-angled triangle”; (5)如果输入数据合法且能够成等腰三角形,则输出“Isosceles triangle”; (6)如果输入数据合法且能够成直角三角形,则输出“Right-angled triangle”; (7)如果输入数据合法且能够成一般三角形,则输出“General triangle”。

7-8源码:

import java.util.Scanner;

public class Main {
public static void main(String[] args) {
Double a,b,c;
Scanner input = new Scanner(System.in);
a = input.nextDouble();
b = input.nextDouble();
c = input.nextDouble();
if (a < 1 || b < 1 || c < 1 || a > 200 || b > 200 || c > 200)
System.out.println("Wrong Format");
else {
if ((a + b) <= c || (a + c) <= b || (b + c) <= a)
System.out.println("Not a triangle");
else if(a == b && b == c && a == c)
System.out.println("Equilateral triangle");
else if(a == b || b == c || a == c) {
if(a*a+b*b==c*c || a*a+c*c==b*b || b*b+c*c==a*a)
System.out.println("Isosceles right-angled triangle");
else
System.out.println("Isosceles triangle");
}
else if(a*a+b*b==c*c || a*a+c*c==b*b || b*b+c*c==a*a)
System.out.println("Right-angled triangle");
else
System.out.println("General triangle");
}
}
}

心得:这道题主要需要熟悉相应的三角形知识,知道三角形三边满足什么条件可以构成什么样的三角形,以此来构成相应的判断条件,才可以使程序输入三边的值输出三角形类型。

遇到的问题:写好源码以后在PTA上进行提交只能部分正确,原因是没有按照Pta的输出规则进行输出和判断条件没有完善。

 

作业二7-4:

输入年月日的值(均为整型数),输出该日期的下一天。 其中:年份的合法取值范围为[1820,2020] ,月份合法取值范围为[1,12] ,日期合法取值范围为[1,31] 。 

 这道题主要用到了4个方法:

1.public static void main(String[] args);//主方法

主方法主要实现的功能为日期的输入以及调用各个方法对输入的日期进行计算求出下一天并输出。

2.isLeapYear方法:

该方法主要用于判断闰年,并返回boolean类型。

public static boolean isLeapYear(int year) {
if((year%400==0)||(year%100!=0&&year%4==0)) {
return true;
}
else {
return false;
}

3.checkInputValidity方法:

该方法主要判断输入的日期是否合法,并返回boolean类型。

public static boolean checkInputValidity(int year,int month,int day) {
if(month<1||month>12||day<1||day>31||year>2020||year<1820) {
return false;
}

else if((month==4||month==6||month==9||month==11)&&day>30) {
return false;
}
else if(((year%400==0)||(year%100!=0&&year%4==0))&&(month==2&&day>29)) {
return false;
}
else if(month==2&&day>28) {
return false;
}

else {
if(day>31) {
return true;
}
}
return true;
}

4.nextDate方法:

该方法主要用于计算输入日期的下一天并返回给Main方法,该方法需要调用isLeapYear方法以及checkInputValidity方法才能准确的计算出输入日期的下一天。

public static void nextDate(int year,int month,int day) {
int tommonth;
int tomday;
int tomyear;
if(month==12&&day==31) {
tommonth=1;
tomday=1;
tomyear=year+1;
}
else if(((year%400==0)||(year%100!=0&&year%4==0))&&(month==2&&day==29)){
tomyear=year;
tommonth=month+1;
tomday=1;·
}
else if(month==2&&day==28){
tomyear=year;
tommonth=month+1;
tomday=1;
}
else if((month==4||month==6||month==9||month==11)&&day==30){
tomyear=year;
tommonth=month+1;
tomday=1;
}
else if((month==1||month==3||month==5||month==7||month==8||month==11)&&day==31){
tomyear=year;
tommonth=month+1;
tomday=1;
}
else{
tomyear = year;
tommonth = month;
tomday = day+1;
}
System.out.println("Next date is:"+tomyear+"-"+tommonth+"-"+tomday);
}
}

遇到的问题:1.没有按照Pta格式进行输出。2.在判断输入日期是否合法的方法上没有考虑全面,导致题目部分正确。3.定义的变量没有初始化导致程序不能正常运行。

作业二7-5:

输入年月日的值(均为整型数),同时输入一个取值范围在[-10,10] 之间的整型数n,输出该日期的前n天(当n > 0时)、该日期的后n天(当n<0时)。
其中年份取值范围为 [1820,2020] ,月份取值范围为[1,12] ,日期取值范围为[1,31] 。

此程序共有三个方法:

1.主方法:

主方法主要实现的功能为日期的输入以及输入计算第n天,调用判断闰年方法以及判断日期是否合法方法。

public class Main{
public static void main(String[] args){
int year,month,day;
Scanner input = new Scanner(System.in);
year = input.nextInt();
month = input.nextInt();
day = input.nextInt();
int n;
n = input.nextInt();
if(n>10||n<-10) {
System.out.println("Wrong Format");
return;
}
if(istrue(year,month,day)==0) {
System.out.println("Wrong Format");
return;
}
int Month[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
if(isLeapYear(year)) {
Month[2]= 29;
}
if(day-n>=1&&day-n<=Month[month]){
day=day-n;
System.out.println(n+" days ago is:"+year+"-"+month+"-"+day);
}else if(month==12&&day-n>31) {
day=day-n-31;
month=1;
year=year+1;
System.out.println(n+" days ago is:"+year+"-"+month+"-"+day);
}else if(month==1&&day-n<1) {
day=31+day-n;
month=12;
year=year-1;
System.out.println(n+" days ago is:"+year+"-"+month+"-"+day);
}else if(day-n<1){
day=Month[month-1]+day-n;
month=month-1;
System.out.println(n+" days ago is:"+year+"-"+month+"-"+day);
}else if(day-n>Month[month]) {
day=day-n-Month[month];
month=month+1;
System.out.println(n+" days ago is:"+year+"-"+month+"-"+day);
}
}

2.isLeapYear方法:

该方法主要用于判断闰年,并返回boolean类型。

public static boolean isLeapYear(int year) {
if((year%400==0)||(year%100!=0&&year%4==0)) {
return true;
}
else {
return false;
}

}

3.istrue方法:

该方法主要判断输入的日期是否合法,并返回boolean类型。

public static int istrue(int year,int month,int day) {
if(month<1||month>12||day<1||day>31||year>2020||year<1820) return 0;
else if((month==4||month==6||month==9||month==11)&&day>30) {
return 0;
}
else if(((year%400==0)||(year%100!=0&&year%4==0))&&(month==2&&day>29)) {
return 0;
}
else if(month==2&&day>28) {
return 0;
}

else {
if(day>31) {
return 0;
}
}
return 1;
}
}

心得:在遇到输入日期求第n天的问题时需要先判断输入年份是否为闰年,再判断输入月份的天数,可以将每个月份的天数存入数组中:int Month[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}

并判断输入的日期+n是否大于当月最大天数,如果大于最大天数则月份+1。

作业三7-2:

定义一个类Date,包含三个私有属性年(year)、月(month)、日(day),均为整型数,其中:年份的合法取值范围为[1900,2000] ,月份合法取值范围为[1,12] ,日期合法取值范围为[1,31] 。

这个程序共有两个类

 

 

 

 

 

public class Main {

 

public static void main(String[] args) {
int year;
int month;
int day;
int mon_maxnum[] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
Scanner input = new Scanner(System.in);
year = input.nextInt();
month = input.nextInt();
day = input.nextInt();
Date date = new Date(year, month, day);
if (date.checkInputValidity(year, month, day) == false) {
System.out.println("Date Format is Wrong");
return;
} else {
System.out.print("Next day is:");
date.NextDate(year, month, day);
}
}

 

 

 

 

Date类中主要包含判断闰年方法,变量Year,Month,Day的get与set,判断输入日期是否合法的方法,计算下一天的方法、

 

 

 

public static class Date {
private int year;
private int month;
private int day;
int mon_maxnum[] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };

public Date(int year, int month, int day) {
this.day = day;
this.month = month;
this.year = year;
}

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) {
if ((year % 400 == 0) || (year % 100 != 0 && year % 4 == 0)) {
return true;
} else {
return false;
}

}

public static boolean checkInputValidity(int year, int month, int day) {
if (month < 1 || month > 12 || day < 1 || day > 31 || year > 2000 || year < 1900)
return false;
else if ((month == 4 || month == 6 || month == 9 || month == 11) && day > 30) {
return false;
} else if (isLeapYear(year)==true && (month == 2 && day > 29)) {
return false;
} else if (isLeapYear(year)==false&& (month == 2 && day > 28)) {
return false;
}

else {
if (day > 31) {
return false;
}
}
return true;
}

public static void NextDate(int year, int month, int day) {
int tommonth;
int tomday;
int tomyear;
if (month == 12 && day == 31) {
tommonth = 1;
tomday = 1;
tomyear = year + 1;
} else if (((year % 400 == 0) || (year % 100 != 0 && year % 4 == 0)) && (month == 2 && day == 29)) {
tomyear = year;
tommonth = month + 1;
tomday = 1;
} else if (month == 2 && day == 28) {
tomyear = year;
tommonth = month + 1;
tomday = 1;
} else if ((month == 4 || month == 6 || month == 9 || month == 11) && day == 30) {
tomyear = year;
tommonth = month + 1;
tomday = 1;
} else if ((month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 11)
&& day == 31) {
tomyear = year;
tommonth = month + 1;
tomday = 1;
} else {
tomyear = year;
tommonth = month;
tomday = day + 1;
}
System.out.print(tomyear+"-"+tommonth+"-"+tomday);
}

}
}

 

 写题心得:相较于作业二的7-4,两题需要完成的功能虽然相似,但是在代码实现上却有很大的差别。

作业三7-2的方法都在Date类中,方法调用更加方便,使代码更加简洁。

作业三7-3:

编写程序性,实现对简单多项式的导函数进行求解

 这道题需要使用正则表达式对导函数进行求解,首先要学会正则表达式对输入的多项式进行判断是否为合法输入,然后设计待指数求导并返回值------字符串的类,常数项类、幂函数类返回值都为常数项来继承Term类中的求导方法来求每个单项的导数,最后是对多项式中特殊情况的处理,单独设计了Special类来对特殊情况进行处理,特殊情况一般为系数或是指数为1,0之类的情况的处理。

 。

 

遇到的问题:对于题目中设置的测试节点,最后两个大数据测试无法通过,以及无法判断第一项系数为负数的多项式,不可以使用int型来存储数据。需要使用大数类型来存储数据。目前遇到的问题还待解决

 

三、踩坑心得:

1.自己写出来的代码需要进行反复的测试,否则会导致Pta上一些莫名其妙的测试点卡住,导致作业不能满分,在做题的过程中如果遇到没有思路的问题时需要积极查阅资料,勇于向他人提出问题,在写代码初期就需要对程序的各个类与方法有一个整体的规划。只有前期规划工作做好了才能使后期写代码的工作变得顺利,也可以使程序出现错误的几率大大降低。

2.这次作业中我明白了软件测试的重要性,尽可能发现并改正被测试软件中的错误,提高软件的可靠性,对于较短的代码,不需要多次测试代码,证明正确性。而对于很长的、含有多个文件的代码,必须经过反复的测试。

              

 

四、改进建议:

 对于我的代码来说,在逻辑上还有很多不足,而且在细节上也颇为繁琐,常常出现语法不规范的情况。

代码整体结构不够简洁,可阅读性不高,没有在代码中添加注释的习惯。

五、总结:

通过这几次作业强化了我在类的构造方法、方法的调用、参数传递、对象的构造与使用;练习循环结构、控制结构;练习数据的输入与输出,冒泡排序以及对软件进行测试的方法。掌握UML基本用法和画法,并能根据题目描述画出类、接口、类等方面的提高。希望在后期的讲解中找到待解决问题的解决方法。在学习Java语法的过程中是比较轻松的,但是要注意public,staitc,private的使用方法,明确他们在什么时候使用。在分析事物时,发现具体事物一出现,就具备了一些特征,那就将这些特征定义到构造函数内。

 同时还学到了成员变量和静态变量的区别,主要区别有:

 1,成员变量所属于对象。所以也称为实例变量。

    静态变量所属于类。所以也称为类变量。

 2,成员变量存在于堆内存中。

    静态变量存在于方法区中。

 3,成员变量随着对象创建而存在。随着对象被回收而消失。

    静态变量随着类的加载而存在。随着类的消失而消失。

 4,成员变量只能被对象所调用 。

    静态变量可以被对象调用,也可以被类名调用。

      5, Public:访问权限最大。

  6,static:不需要对象,直接类名即可。

  7,void:主函数没有返回值。

  8,Main:主函数特定的名称。

 

posted @ 2021-04-04 16:58  kkkrz  阅读(88)  评论(0)    收藏  举报