OOP第一次作业
前三次作业总结
(1)前言:因为本人表达能力偏弱,可能会写得有些冗长,但是我尽量把我要写的内容写全。
第一次实验:这次的题目最多,比较基础。依次考察了从控制台输入数字并相加,输入并识别字符、转化成对应数字输出,用选择语句对输入数据进行判断,计算税率,使用数组,进行排序,对实数进行计算、判断、然后输出。
第二次实验:难度飞跃,题量较大。第一题主要是对字符串的操作,第二题是更灵活的排序,第三题开始使用方法,三到五题都涉及到对日期的判断和操作。
第三次实验:只有三道,难度只能说懂得都懂。从第一题开始使用到类,需要创建构造方法、getter和setter等方法。
(2)设计与分析:
题目集1的7-8:用了非常多的if语句,圈复杂度很高,超出了绿色范围

题目集2的7-4、7-5:7-4的情况相对好一点,7-5的方法数目多,Avg depth等多项值超出范围。


题目集3的7-2、7-3:只有最大圈复杂度一项超出范围。

(3)采坑心得:
第一次实验只有一个问题,7-8的判断三角形有一种直角的情况,我直接用勾股定理把两边划了等号,但实际上实型数字计算需要留出一定的误差空间。我把‘’a*a+b*b==c*c‘’改成了“a*a+b*b-c*c<1”就能通过了。
(源码)import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner input=new Scanner(System.in);
double a=input.nextDouble();
double b=input.nextDouble();
double c=input.nextDouble();
double t;
if (a > b) {
t = a;
a = b;
b = t;
}
if (a > c){
t = a;
a = c;
c = t;
}
if (b > c){
t = b;
b = c;
c = t;
}
if(a<1||c>200){
System.out.println("Wrong Format");
}
else if(a+b<=c){
System.out.println("Not a triangle");
}
else if(a==c){
System.out.println("Equilateral triangle");
}
else if(a==b&&a*a+b*b-c*c<1){
System.out.println("Isosceles right-angled triangle");
}
else if(a==b||b==c){
System.out.println("Isosceles triangle");
}
else if(a*a+b*b==c*c){
System.out.println("Right-angled triangle");
}
else
System.out.println("General triangle");
}
}
实验二7-4:import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner input=new Scanner(System.in);
int a=input.nextInt();
int b=input.nextInt();
int c=input.nextInt();
if(checkInputValidity(a,b,c))
System.out.println("Wrong Format");
else
nextDate(a,b,c);
}
public static boolean isLeapYear(int year) {
return (year%4==0&&year%100!=0||year%400==0);
}
public static boolean checkInputValidity(int year,int month,int day) {
return (year<1820||year>2020||month<1||month>12||day<1||day>31||isLeapYear(year)==false&&month==2&&day==29);
}
public static void nextDate(int year,int month,int day) {
int n;
if(isLeapYear(year)){
n=29;
}
else{
n=28;
}
if(month==1&&day==31||month==3&&day==31||month==5&&day==31||month==7&&day==31||month==8&&day==31||month==10&&day==31){
month++;
System.out.println("Next date is:"+year+"-"+month+"-"+"1");
}
else if(month==4&&day==30||month==6&&day==30||month==9&&day==30||month==11&&day==30){
month++;
System.out.println("Next date is:"+year+"-"+month+"-"+"1");
}
else if(month==12&&day==31){
year++;
System.out.println("Next date is:"+year+"-"+1+"-"+"1");
}
else if(month==2&&day==n)
{
month++;
System.out.println("Next date is:"+year+"-"+month+"-"+"1");
}
else{
day++;
System.out.println("Next date is:"+year+"-"+month+"-"+day);
}
}
}
测试数据及结果:
输入:2025 2 10
输出:Wrong Format
输入:2020 3 10
输出:Next date is:2020-3-11
实验二7-5:import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner input=new Scanner(System.in);
int a=input.nextInt();
int b=input.nextInt();
int c=input.nextInt();
int sum=input.nextInt();
if(checkInputValidity(a,b,c))
System.out.println("Wrong Format");
else
nextDate(a,b,c,sum);
}
public static boolean isLeapa(int a) {
return (a%4==0&&a%100!=0||a%400==0);
}
public static boolean checkInputValidity(int a,int b,int c) {
return (a<1820||a>2020||b<1||b>12||c<1||c>31||isLeapa(a)==false&&b==2&&c==29);
}
public static void nextDate(int a,int b,int c,int sum) {
int n;
if(isLeapa(a)){
n=29;
}
else{
n=28;
}
switch(b) {
case 1:if(c<sum) {
a--;
b=12;
c=31-sum+c;
}else c=c-sum;
;break;
case 2:if(c<sum) {
b--;
c=31-sum+c;}
else if(c-sum<n){
c=c-sum;
}
else{
b++;
c=c-sum-n;
}
break;
case 3:
if(c<sum) {
b--;
c=n-sum+c;
}else c=c-sum; ; break;
case 4:if(c<sum) {
b--;
c=31-sum+c;
}else c=c-sum;
break;
case 5:if(c<sum) {
b--;
c=30-sum+c;
}
else c=c-sum;
break;
case 6:if(c<sum) {
b--;
c=31-sum+c;
}
else c=c-sum;
;break;
case 7:if(c<sum) {
b--;
c=30-sum+c;
}
else c=c-sum;
break;
case 8:if(c<sum) {
b--;
c=31-sum+c;
}else c=c-sum;
;break;
case 9:if(c<sum) {
b--;
c=31-sum+c;
}
else c=c-sum;
;break;
case 10:if(c<sum) {
b--;
c=30-sum+c;
}
else c=c-sum;
break;
case 11:if(c<sum) {
b--;
c=31-sum+c;
}
else c=c-sum;
;break;
case 12:if(c<sum) {
b--;
c=30-sum+c;
}
else if(c-sum<n){
c=c-sum;
}
else{
a++;
b=1;
c=c-sum-31;
}
break;
}
System.out.println(sum+" days ago is:"+a+"-"+b+"-"+c);
}
}
测试数据及结果:
输入:2018 6 19 8
输出:8 days ago is:2018-6-11
输入:2018 6 19 -8
输出:-8 days ago is:2018-6-27
实验三7-2:import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner input=new Scanner(System.in);
int a=input.nextInt();//year
int b=input.nextInt();//month
int c=input.nextInt();//day
Date date = new Date();
if(date.checkInputValidity(a,b,c)) {
System.out.println("Date Format is Wrong");
}
else {
date.getNextDay(a,b,c);
}
}
}
class Date {
Scanner input=new Scanner(System.in);
private int day=0;
private int month=0;
private int year=0;
private int[] tian={0,31,28,31,30,31,30,31,31,30,31,30,31};
public Date() {
super();
// TODO Auto-generated constructor stub
}
public Date(int day, int month, int year) {
super();
this.day = day;
this.month = month;
this.year = year;
}
public int getDay() {
return day;
}
public void setDay(int day) {
this.day = day;
}
public int getMonth() {
return month;
}
public void setMonth(int month) {
this.month = month;
}
public int getYear() {
return year;
}
public void setYear(int year) {
this.year = year;
}
public boolean isLeapYear(int year) {
return (year%4==0&&year%100!=0||year%400==0);
} //判断闰年
public boolean checkInputValidity(int year,int month,int day) {
return (year<1900||year>2000||month<1||month>12||day<1||day>31||isLeapYear(year)==false&&month==2&&day==29);
} //当输入无效时返回真值
public void getNextDay(int year,int month,int day) {
int n;
if(isLeapYear(year)){
n=29;
}
else{
n=28;
}
if(month==1&&day==31||month==3&&day==31||month==5&&day==31||month==7&&day==31||month==8&&day==31||month==10&&day==31){
month++;
System.out.println("Next day is:"+year+"-"+month+"-"+"1");
}
else if(month==4&&day==30||month==6&&day==30||month==9&&day==30||month==11&&day==30){
month++;
System.out.println("Next day is:"+year+"-"+month+"-"+"1");
}
else if(month==12&&day==31){
year++;
System.out.println("Next day is:"+year+"-"+1+"-"+"1");
}
else if(month==2&&day==n)
{
month++;
System.out.println("Next day is:"+year+"-"+month+"-"+"1");
}
else{
day++;
System.out.println("Next day is:"+year+"-"+month+"-"+day);
}
}
}
测试样例及结果:
输入:1912 12 25
输出:Next day is:1912-12-26
输入:2001 2 30
输出:Date Format is Wrong
(4)改进建议:1.一个if语句就可以让圈复杂度飚出绿色范围了,今后我会少用if,尽量用switch语句代替需要判断的部分。
(5)总结:对本阶段三次题目集的综合性总结,学到了什么,哪些地方需要进一步学习及研究,对教师、课程、作业、实验、课上及课下组织方式等方面的改进建议及意见。
第一次实验虽然简单,但是也花费了不少时间。那道计算税率的题的数据实在太多了,我有一个点一直过不去,检查了很久才发现是有一个数字输错了。
我想说,题量越多,时间越短反而让人越安心呢。一旦题目开始变少,难度简直直线上升,第三次的第三道题,就算时间再充裕,我也根本没有头绪,愁如何下手。在这道题之前,我遇到什么问题还可以看看书,逛逛博客,问问同学。做完之后哇好有成就感,觉得自己学到的真多呢,哪里哪里还可以改进哦。但是那最后一题,我拿命去写都写不出来啊,就完全没接触过、甚至见都没见过正则表达式,脑子里一点概念也没有。去百度上找了很多材料很多代码看,每次觉得学会了,一写一测试就是编译错误,或是运行结果错误。而且仅凭我那皮毛都算不上的学习,根本无法实现题目需要的判断。其实这个求导算法本身不复杂,多种要求混合增加了它的难度,我卡到天荒地老,根本写不出来。我的自学能力确实很欠缺,不得其法,要是老师有空可以预先讲解一下这样陌生的知识点,引导我们上手。
浙公网安备 33010602011771号