前三次作业总结
关于对Java的印象
Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程。
面向对象三大基本特征:封装、继承、多态。而面向对象的过程就是找对象、建立对象、使用对象、维护对象的关系的过程。
面向对象方法是把相关的数据和方法组织为一个整体来看待,从更高的层次来进行系统建模,更贴近事物的自然运行模式。
大一下开始学习Java,从大一上的C语言的面向过程到大一下Java的面向对象,对我个人来说还是挺困难的,以至于很长一段时间我都是在用面向过程的思维在做面向对象的题,的确非常让人头疼,题目常常做不出,这还是让我很难受的...慢慢的,我改变过来了,慢慢的使用,慢慢的进步...
以下为正文:
一:前言
第一次:
共8道题,题量相对较大,但是毕竟是刚开始学习Java,所以难度不是很大。
对于有一些C语言基础的我们还是比较好理解的。
知识点涉及了一些简单的输入输出和转换。
第二次:
共5题,题量中等,难度适中,让我们进一步理解Java。
知识点涉及了Java中二进制和十进制的转换,数组的运用,对方法的使用。
第三次:
共5题,题量相对较少,难度较大。
知识点涉及创建类,创建方法,定义类,定义私有属性,对正则表达式的运用。
难度在我看来是比较大的,这是我唯一一道没有满分的作业,对很多同学来说也是,毕竟只有两位同学拿到了满分。
二:设计与分析
题目集1-7-8:
输入三角形三条边,判断该三角形为什么类型的三角形。
这道题在我看来是一道相对来说较简单的判断输入的题目,一开始的话,没有好好审题,导致没有顾及小数输入,还有一些三角形的判断不够全面,导致这道题目还是花了一段时间的。
下面是这题的源码:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
double a1=in.nextDouble();
double a2=in.nextDouble();
double a3=in.nextDouble();
if(a1==a2&&a2==a3)
{
System.out.print("Equilateral triangle");
}
else if((a1<1)||(a1>200)||(a2<1)||(a2>200)||(a3<1)||(a3>200))
{
System.out.print("Wrong Format");
}
else if(a1+a2<=a3||a1+a3<=a2||a3+a2<=a1)
{
System.out.print("Not a triangle");
}
else if((a1*a1+a2*a2==a3*a3||a1*a1+a3*a3==a2*a2||a2*a2+a3*a3==a1*a1)&&a1!=a2&&a1!=a3&&a2!=a3)
{
System.out.print("Right-angled triangle");
}
else if((a1==a2&&a1!=a3||a1==a3&&a1!=a2||a2==a3&&a2!=a1)&&(a1*a1+a2*a2-a3*a3<=0.000000001||a1*a1+a3*a3-a2*a2<=0.00000000001||a2*a2+a3*a3-a1*a1<=0.00000000001))
{
System.out.print("Isosceles right-angled triangle");
}
else if((a1==a2&&a1!=a3||a1==a3&&a1!=a2||a2==a3&&a2!=a1)&&(a1*a1+a2*a2!=a3*a3||a1*a1+a3*a3!=a2*a2||a2*a2+a3*a3!=a1*a1))
{
System.out.print("Isosceles triangle");
}
else
System.out.print("General triangle");
}
}
我用的是最笨的方法,简单的判断然后输出。
有很多判断的条件,比较容易出错,但是小心一点也就没事,相对于后面的题目来说,这题是最简单的了。
做完后能够完美的运行了。

一个小小的测试...
题目集2-7-4
输入年月日的值(均为整型数),输出该日期的下一天。 其中:年份的合法取值范围为[1820,2020] ,月份合法取值范围为[1,12] ,日期合法取值范围为[1,31] 。
要求:Main类中必须含有如下方法,签名如下:
public static void main(String[] args);//主方法
public static boolean isLeapYear(int year) ;//判断year是否为闰年,返回boolean类型
public static boolean checkInputValidity(int year,int month,int day);//判断输入日期是否合法,返回布尔值
public static void nextDate(int year,int month,int day) ; //求输入日期的下一天
刚开始看到的时候真的感觉很难...
源码如下:
import java.util.Scanner;
public class Main {
static Scanner in=new Scanner(System.in );
public static void main(String[] args){
int year=in.nextInt();
int month=in.nextInt();
int day=in.nextInt();
if(year<=2020&&year>=1820&&month>=1&&month<=12&&day<=31&&day>=1)
nextDate(year,month,day);
else
System.out.println("Wrong Format");
}//主方法
public static boolean isLeapYear(int year) {
if(year%4==0&&year%100!=0||year%400==0)
return true;
else
return false;
}//判断year是否为闰年,返回boolean类型
public static boolean checkInputValidity(int year,int month,int day) {
if(month==1||month==3||month==5||month==7||month==8||month==10||month==12)
{
if(day<=31)
{
if(year<=2020&&year>=1820)
{
return true;
}
else
return false;
}
else
return false;
}
else if(month==4||month==6||month==9||month==11)
{
if(day<=30)
{
if(year<=2020&&year>=1820)
{
return true;
}
else
return false;
}
else
return false;
}
else if(month==2&&isLeapYear(year)==true)
{
if(day<=29)
{
if(year<=2020&&year>=1820)
{
return true;
}
else
return false;
}
else
return false;
}
else if(month==2&&isLeapYear(year)==false)
{
if(day<=28)
{
if(year<=2020&&year>=1820)
{
return true;
}
else
return false;
}
else
return false;
}
else
return false;
}//判断输入日期是否合法,返回布尔值
public static void nextDate(int year,int month,int day) {
int[] m=new int[]{0,31,28,31,30,31,30,31,31,30,31,30,31};
if(isLeapYear(year))
m[2] = 29;
int a = 0,b = 0,c = 0;
if(checkInputValidity(year,month,day)) {
if(month==12) {
if(day==m[month]) {
a = year+1;
b = 1;
c = 1;}
if(day>0&&day<m[month])
{a = year;
b = month;
c =day +1;
}
}
if(month<12) {
if(day==m[month]) {
a = year;
b = month + 1;
c = 1;}
if(day>0&&day<m[month])
{a = year;
b = month;
c = day+1;
}
}
System.out.println("Next date is:"+a+"-"+b+"-"+c);
}
else System.out.println("Wrong Format");
} //求输入日期的下一天
}

一个小测试
当时并没有想得很复杂,结果又有很多东西没有考虑上,导致测试点又只是过了几个。
还是有比较多小细节的:
1.注意输入数据的边界




2.注意2月份情况



3.注意12月份情况

4.注意每月有30天和31天的情况


题目集2-7-5
输入年月日的值(均为整型数),同时输入一个取值范围在[-10,10] 之间的整型数n,输出该日期的前n天(当n > 0时)、该日期的后n天(当n<0时)。
其中年份取值范围为 [1820,2020] ,月份取值范围为[1,12] ,日期取值范围为[1,31] 。
严格意义上来说和上一题的差别不是很大,但是想要求前n天还是一个比较难的点的。
源码如下:
import java.util.Scanner;
public class Main {
static Scanner in=new Scanner(System.in );
public static void main(String[] args){
int year=in.nextInt();
int month=in.nextInt();
int day=in.nextInt();
int n=in.nextInt();
if(n>=-10&&n<=10&&year<=2020&&year>=1820&&month>=1&&month<=12&&day<=31&&day>=1)
nextDate(n,year,month,day);
else
System.out.println("Wrong Format");
}//主方法
public static boolean isLeapYear(int year) {
if(year%4==0&&year%100!=0||year%400==0)
return true;
else
return false;
}//判断year是否为闰年,返回boolean类型
public static boolean checkInputValidity(int year,int month,int day) {
if(month==1||month==3||month==5||month==7||month==8||month==10||month==12)
{
if(day<=31)
{
if(year<=2020&&year>=1820)
{
return true;
}
else
return false;
}
else
return false;
}
else if(month==4||month==6||month==9||month==11)
{
if(day<=30)
{
if(year<=2020&&year>=1820)
{
return true;
}
else
return false;
}
else
return false;
}
else if(month==2&&isLeapYear(year)==true)
{
if(day<=29)
{
if(year<=2020&&year>=1820)
{
return true;
}
else
return false;
}
else
return false;
}
else if(month==2&&isLeapYear(year)==false)
{
if(day<=28)
{
if(year<=2020&&year>=1820)
{
return true;
}
else
return false;
}
else
return false;
}
else
return false;
}//判断输入日期是否合法,返回布尔值
public static void nextDate(int n,int year,int month,int day) {
int[] mm={0,31,28,31,30,31,30,31,31,30,31,30,31};
if (isLeapYear(year)==true)
mm[2]=29;
if(isLeapYear(year)==false&&day==29)
{
System.out.println("Wrong Format");
}
else {
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);
}
}
}
一个小测试

所以也是可以用来求后n天的
一个测试

本题主要点在于当n为负数时的判断。
出题老师的原意是想让我们在基于上一题的基础上使本题的代码更加简洁明了。
希望我做到了。
本题的易错点在上一题都解决了,就不需要再考虑了。
题目集3-7-2
定义一个类Date,包含三个私有属性年(year)、月(month)、日(day),均为整型数,其中:年份的合法取值范围为[1900,2000] ,月份合法取值范围为[1,12] ,日期合法取值范围为[1,31] 。 注意:不允许使用Java中和日期相关的类和方法,否则按0分处理。
要求:Date类结构如下图所示:

本题在目的上和上上一题想要达成的是一致的。
甚至输入输出都只需要修改一下格式。
源码如下:
import java.util.Scanner;
public class Main {
static Scanner in=new Scanner(System.in );
public static void main(String[] args){
int year=in.nextInt();
int month=in.nextInt();
int day=in.nextInt();
if(year<=2000&&year>=1900&&month>=1&&month<=12&&day<=31&&day>=1)
nextDate(year,month,day);
else
System.out.println("Date Format is Wrong");
}//主方法
public static boolean isLeapYear(int year) {
if(year%4==0&&year%100!=0||year%400==0)
return true;
else
return false;
}//判断year是否为闰年,返回boolean类型
public static boolean checkInputValidity(int year,int month,int day) {
if(month==1||month==3||month==5||month==7||month==8||month==10||month==12)
{
if(day<=31)
{
if(year<=2000&&year>=1900)
{
return true;
}
else
return false;
}
else
return false;
}
else if(month==4||month==6||month==9||month==11)
{
if(day<=30)
{
if(year<=2000&&year>=1900)
{
return true;
}
else
return false;
}
else
return false;
}
else if(month==2&&isLeapYear(year)==true)
{
if(day<=29)
{
if(year<=2000&&year>=1900)
{
return true;
}
else
return false;
}
else
return false;
}
else if(month==2&&isLeapYear(year)==false)
{
if(day<=28)
{
if(year<=2000&&year>=1900)
{
return true;
}
else
return false;
}
else
return false;
}
else
return false;
}//判断输入日期是否合法,返回布尔值
public static void nextDate(int year,int month,int day) {
int[] m=new int[]{0,31,28,31,30,31,30,31,31,30,31,30,31};
if(isLeapYear(year))
m[2] = 29;
int a = 0,b = 0,c = 0;
if(checkInputValidity(year,month,day)) {
if(month==12) {
if(day==m[month]) {
a = year+1;
b = 1;
c = 1;}
if(day>0&&day<m[month])
{a = year;
b = month;
c =day +1;
}
}
if(month<12) {
if(day==m[month]) {
a = year;
b = month + 1;
c = 1;}
if(day>0&&day<m[month])
{a = year;
b = month;
c = day+1;
}
}
System.out.println("Next day is:"+a+"-"+b+"-"+c);
}
else System.out.println("Date Format is Wrong");
} //求输入日期的下一天
}
一个小测试

输入错误测试

涉及了挺多知识点的,难点在于定义类和必须实现类的封装,还是非常有难度的。
题目集3-7-3
编写程序性,实现对简单多项式的导函数进行求解。
(1)实现功能 . 判定输入表达式是否为正确的表达式; 若输入为正确表达式,则计算其导函数并按要求输出。 (2)输入输出规则 ①输入规则 在一行内输入一个待计算导函数的表达式,以回车符结束。②输出规则 .如果输入表达式不符合上述表达式基本规则,则输出“WrongFormat”。 如果输入合法,则在一行内正常输出该表达式的导函数,注意以下几点: 结果不需要排序,也不需要化简; 当某一项为“0”时,则该项不需要显示,但如果整个导函数结果为“0”时,则 显示为“0”; 当输出结果第一项系数符号为“+”时,不输出“+”; ➢当指数符号为“+”时,不输出“+”; 当指数值为“0”时,则不需要输出“x^0”,只需要输出其系数即可。
这道题我认为真的挺难的,50分的题我只拿到了15分,可以说是惨不忍睹了....
部分源码如下:
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Main {
public static void main(String[] args){
Scanner in=new Scanner(System.in);
String s=in.nextLine();
s=s.replaceAll(" +","");
if(isNumeric(s)) {
System.out.print("0");
}
else
System.out.print("Wrong Format");
}
private static boolean isNumeric(String s){
Pattern pattern = Pattern.compile("[0-9]*$");
Matcher isNum = pattern.matcher(s);
if( !isNum.matches() ){
return false;
}
return true;
}
}
这一小段源码只能让我过三个测试点了,非常难,时间对我来说也非常紧迫,所以导致没有将这道题完整的写完,没有拿到满分还是非常遗憾的。
输入常数的测试

错误形式输入的测试

这道题还是让我意识到我与其他同学的差距,有点难受,还是要继续好好学习,认真敲代码!!!
三:踩坑心得
做了这些个题目,错了很多次,也很多测试点没有考虑上,导致一遍又一遍的修改

明明写了很久却还是做错了的感觉的确不好受,但是学代码嘛,总不可能一次错都不出就能完美的通过每一个测试点吧。

跌跌撞撞才能成长不是嘛,你只能一遍又一遍的重新调试自己的代码来避免重新犯错。
在做这三个题目集时,我出现了许许多多的问题,不只是在代码上的错误,还有我自身思想出现的错误,我的懒惰等,但是还是要慢慢坚持的嘛,不会就要虚心请教身边的大佬!
很多时候没有仔细审题,导致的一些不必要的错误出现,往往这时又不会想到是在审题上出现了错误,就只是在代码上寻找错误,这显然是不明智的。
就像当时一道题,我已经完善了功能,但是错误输入的测试点适终过不了,搞了好久才发现只是错误输入后的输出语句中的单词拼错了而已.....
真挺傻的...
四:改进建议
还是有很多需要改进的地方的,一些地方过于繁琐了,可以修改的更加简便一些,有非常多地方需要优化,就比如在对if-else的运用,可以说是滥用了,动不动就是一连串的if-else,代码的复杂度明显增加不少,Java的任课老师说过,很多公司或用人单位都会限制代码的复杂度不能超过一个量,而一个if-else就增加一个复杂度,这明显是不行的,这些个if-else在后面对代码的检查也增加了许多的困难,要是一不小心删掉一个大括号,那就得一个一个对,太麻烦了啊。
关于题目集3的第三题,主要是对正则表达式的理解需要深刻一些,很显然我还不够,接下来要更加努力了
关于bug的话
写出来了的题目基本上都没有什么bug的,在写题时也会比较注意bug的产生,测试就完事了,疯狂测试!!!
五:总结
结束了本阶段的三次题目,收获了很多东西,从一个Java小白变成了....感觉只学了这么点还是小白,Java的路还很长,学无止境,希望自己可以认认真真,好好努力,学会学好它。
现在的话,不仅仅只学到了hello world,哈哈哈哈,不仅仅只学到了简单的输入输出,判断语句等,还是有很多实用的东西的!
教师,课程,作业,实验这些都没有问题,可能唯一的就是实验比较频繁且难,不过这也是应该的,学习嘛,吃点苦正常。
对Java的满意程度还是比较高的。
浙公网安备 33010602011771号