Java前三次作业总结

前言:题目集总结
第一次作业:题目量一般,感觉题目都是拿来练手的(第一次作业让我们轻松一下吧),可以直接采用一个MAIN主函数全部解决,自己并没有使用结构化的处理方法;知识点涉及基本数据类型和运算符的使用,也可以考虑直接使用Java中的库函数处理某些题目。对于Java基础语法的使用都可以从之前学习的C语言和数据结构中找到共通点,具有相同的编程思维。
第二次作业:根据题目要求,这一次的题目稍微进行了结构化处理,使用了方法来进行数据的使用和处理,题目还是有一定的难度,Java中的一些细节和C语言有差别(差点翻车)。
知识点同样涉及基本数据类型和运算符的使用,数组的应用。
第三次作业:题目变少了,花的时间变长了…… 题目均采用了面向对象的方法,还涉及自身知识点盲区—正则表达式(菜鸡就是我自己)其他相关知识点和前两次作业相同。题目有困难,还是可以解决的。
题目设计与分析:

  1. 判断三角形类型(第一次作业)
    题目分析:需要的条件1.判断是否为合理的三角形 2.判断是否为等腰三角形3.判断是否为直角三角形4.判断是否为等边三角形5.判断是否为等腰直角三角形
import java.util.Scanner;
public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int []number = new int[5];
		double a,b,c;
		Double average=(double) 0,mount=(double) 0;
		
		Scanner in = new Scanner(System.in);
		a = in.nextDouble();
		b = in.nextDouble();
		c = in.nextDouble();
		if(a>=1&&a<=200 && b>=1&&b<=200 && c>=1&&c<=200) {
			if(a+b > c && a+c > b && b+c > a) {
				if(a == b && a == c && b==c) {
					System.out.print("Equilateral triangle");
				}else if(a == b && (a*a)+(b*b)-(c*c) < 0.000001  || a==c &&  (a*a) +( c*c) -(b*b) < 0.000001  || b==c && (b*b) +( c*c)-(a*a) < 0.000001) {
					System.out.print("Isosceles right-angled triangle");
				}else if(a==b||a==c||b==c) {
					System.out.print("Isosceles triangle");
				}else if((a*a)+(b*b) == (c*c) ||  (a*a) +( c*c) == (b*b) || (b*b) +( c*c) ==(a*a)) {
					System.out.print("Right-angled triangle");
				}else {
					System.out.print("General triangle");
				}
			}else {
				System.out.print("Not a triangle");
			}
		}else {
			System.out.print("Wrong Format");
		}
		
	}

}

这道题直接是面向过程解决的,直接在主MAIN中进行计算和判断。
Bug修改:
第一次测试:

由于三角形三边比较边界值设定错误,导致测试点中无效边界值测试出现错误,重新修改三角形三边边界值的判断即可
第二次测试:

开始考虑等腰直角三角形是两直角边平方和等于斜边平方和,发现java中double类型计算时无法获得正确答案,将比较相同改为差值小于某个极小的小数后得到答案。
第三次测试:

优化方案:1.
可以将代码中判断是否为等腰三角形写一个方法,判断是否为直角三角形为一个方法,需要判断时直接调用,提高代码可读性和降低圈复杂度。

圈复杂度分析:通过SourceMonitor软件对编写的代码进行圈复杂度分析,具体分析结果如下图所示

2.求下一天(第二次作业)
题目分析:需要的条件1.输入的日期,年份是否合理2.判断下一天的日期是否合理

import java.util.Scanner;



public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int year,month,day;
        year = in.nextInt();
        month = in.nextInt();
        day = in.nextInt();
        if(!checkInputValidity(year,month,day)) {
        	System.out.print("Wrong Format");
        }else {
        	System.out.print("Next date is:");
        	nextDate( year, month, day);
        }
    }


    public static boolean isLeapYear(int year) {
    	boolean leapyear;
    	if(year%4 == 0 && year%100 !=0 || year%400 == 0) {
    		leapyear = true;
    	}else {
    		leapyear = false;
    	}
    	return leapyear;
    }
    public static boolean checkInputValidity(int year,int month ,int day) {
    	boolean date;
    	int []a = new int[]{0,31,29,31,30,31,30,31,31,30,31,30,31};
    	if(!isLeapYear(year)) {
    		a[2] = 28;
    	}
    	if(year>=1820 && year<=2020 && month>=1 && month <=12 && day>0 && day<=a[month]) {
    		date = true;
    	}else {
    		date = false;
    	}
    	return date;
    }
    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};
    	if(!isLeapYear(year)) {
    		a[2] = 28;
    	}
    	if(month == 12 && day == 31) {
    		year++;
            month = 1;
            day = 1;
    	}else if(a[month]<day+1) {
    		month++;
    		day = 1;
    	}else {
    		day++;
    	}
    	System.out.print(year+"-"+month +"-"+day);
    }
}

Bug修改:
第一次测试:

代码中日期为月末时,日期改变但月份为发生改变,加入月份修改的条件
第二次测试:

当闰年为最后一天时,未对年份进行修改,加入修改年份的判断。
第三次测试:

优化方案:调用JAVA中自带函数库进行操作。
圈复杂度分析:通过SourceMonitor软件对编写的代码进行圈复杂度分析,具体分析结果如下图所示

3.求前N天(第二次作业)
题目分析:需要的条件1.输入的日期,年份是否合理2.判断前n天的日期是否合理

import java.util.Scanner;



public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int year,month,day;
        year = in.nextInt();
        month = in.nextInt();
        day = in.nextInt();
        int date = in.nextInt();
        if(!checkInputValidity(year,month,day) || date >10 || date< -10) {
        	System.out.print("Wrong Format");
        }else {
        	System.out.print(date+" days ago is:");
        	nextDate( year, month, day,date);
        }
    }


    public static boolean isLeapYear(int year) {
    	boolean leapyear;
    	if(year%4 == 0 && year%100 !=0 || year%400 == 0) {
    		leapyear = true;
    	}else {
    		leapyear = false;
    	}
    	return leapyear;
    }
    public static boolean checkInputValidity(int year,int month ,int day) {
    	boolean is;
    	int []a = new int[]{0,31,29,31,30,31,30,31,31,30,31,30,31};
    	if(!isLeapYear(year)) {
    		a[2] = 28;
    	}
    	if(year>=1820 && year<=2020 && month>=1 && month <=12 && day>0 && day<=a[month]) {
    		is = true;
    	}else {
    		is = false;
    	}
    	return is;
    }
    public static void nextDate(int year,int month,int day,int date) {
    	int []a = new int[]{0,31,29,31,30,31,30,31,31,30,31,30,31};
    	if(!isLeapYear(year)) {
    		a[2] = 28;
    	}
    	if(day - date > a[month]) {
    		if(month == 12) {
    			day = day - date -a[month];
    			year++;
    			month = 1;
    		}else {
    			day = day - date -a[month];
    			month ++;
    		}
    		
    	}else if(day - date <=0) {
    		if(month == 1) {
    			
    			year--;
    			month = 12;
    			day = day - date +a[month];
    		}else {
    			
    			month--;
    			day = day - date +a[month];
    		}
    		
    	}else {
    		day = day-date;
    	}
    	System.out.print(year+"-"+month +"-"+day);
    }
}

第一次测试:

结尾出现空行,导致格式错误,修改输出格式可以得出正确答案。
第二次测试:

月初时判断出现错误,出现0日现象,重新修改判断月初条件
第三次测试:

圈复杂度分析:通过SourceMonitor软件对编写的代码进行圈复杂度分析,具体分析结果如下图所示

优化方案:调用Java函数库进行操作

4.一元多项式求导(第三次作业)
题目分析:需要的条件1.输入合法性判断2.输出合法性判断
圈复杂度分析:通过SourceMonitor软件对编写的代码进行圈复杂度分析,具体分析结果如下图所示

优化方案:将正则表达式从主函数中提出来,作为一个方法使用。

心得体会
Java其实和C语言大同小异,java语言基础有自己的特点,但是基本规律都是相通的,类似的曾经学过高级程序语言(C,C++等)来说,如:算法基础、常用数据结构、企业编程规范,编码思路和风格。
在java语言提供了八种基本类型:
byte:数据类型是8位、有符号的,以二进制补码表示的整数取值范围-128-127
short:数据类型是 16 位、有符号的以二进制补码表示的整数,取值范围-32768-32767
int: 数据类型是32位、有符号的以二进制补码表示的整数,取值范围(-2^31 )—(2^311)
long:数据类型是 64 位、有符号的以二进制补码表示的整数,取值范围(-2^63)- (2^631)
浮点型:Float:数据类型是单精度、32位、符合IEEE 754标准的浮点数
double:数据类型是双精度、64 位、符合IEEE 754标准的浮点数
布尔型boolean数据类型表示一位的信息,只有两个取值:true 和 false;
字符型:char类型是一个单一的 16 位 Unicode 字符,最小值是 \u0000(即为0)
最大值是 \uffff(即为65,535),char 数据类型可以储存任何字符;
在处理IP地址转换题目时,忽视了数据类型字长的问题,为此去了解了BigInteger类型相应的使用方法直接将32位的数据直接处理,完成后又发现可以采用数组的方法将32位划分为4组数据去处理,就可以直接使用int类型处理,果然方法总比困难多。

面向对象的编程过程中修饰符的使用相当重要,在类的声明与实例化和函数的声明与使用中,决定了使用对象的范围,用来保护对类、变量、方法和构造方法的访问。在使用面向对象的过程中,因为函数是一段可以完成某个独立功能的代码,只需要写一次,就可以被多次调用,提高了代码的复用性,合理的结构化设计可以大大提高代码的可读性和实用性;
类必须先定义才能使用。类是创建对象的模板,创建对象也叫类的实例化。使用类合理可以降低代码的圈复杂度,降低维护成本和提高可读性。因此,掌握常见的数据结构和实用算法;培养良好的企业级编程习惯,是提高自己编程水平和技术的重要部分。
对于正则表达式,只能说自己只会一些皮毛,勉强解决了一元多项式的求导,在之后的学习中要更多的了解掌握它,运用合理可以极大的帮助解决问题,也可以使代码更加简洁易懂,只能说多学多看多用。

posted @ 2021-10-15 20:04  辰新  阅读(54)  评论(0)    收藏  举报