Java第一次博客作业

1.前言


总结三次题目集的知识点、题量、难度等情况

作业一

Java pta 作业一的题目还是相对比较简单,作业一共有8个题,考察我们对于Java输入输出,排序及基本Java语法知识的掌握能力,作业一让我们从C语言到Java语言的过度,有些只是表达方式的不同,但语法基本相通,通过这次的习题集让我们对Java 有了一个入门的概念,题目集一让我对Java语法的基本知识有了基本的认识,基本的输入输出,基本的变量赋值,算是对Java的一个入门题集,作业一的第二题用了switch 语法,,还有作业一的第五题计算钱币,更好的考察了我的思维,总结,习题集一是我们对从c语言语法向Java语法的一个转变,考察的相对简单,题目也相对简单,更多的是让我们了解Java的一些基本的语法,作业一的答题情况,是为100分。

作业二

作业二的难度相对于作业一难度有所增加,引入了字符串处理String.用for循环对字符串的遍历处理,习题集二的第一题,IP地址的转换,考察了我们对二进制的处理怎样应用到字符串上,以及Java中的数学函数,Math.pow的使用,相对于作业一的难度有所提升,习题集二的第二题考察了Java数组的知识,也考察了我们在C语言中学习到的排序算法,选择排序,将两个排序后的数组合并成一个新的数组,习题集二的第三题第一次引入Java类的概念,Java类的单一职责,要对类实现的功能进行封装,作业二的第四题也是对Java面向对象的类的集体运用的一个题,这两个题都是对于类的考察,让我们对于类有了一个很好的理解,习题集二的第五题是这次题目最难和测试点最多的题,在通过第五题的测试点时花了比较多的时间。作业二的答题情况,是为100分。

作业三

作业三只有三道编程题,习题集三的题目难度有较大提升,是老师发布的较难的一个题目。主要考察了我们对于类的设计以及对于字符串的处理,在作业三中,第一题的定义账户类,和第二题的日期类,让我们对类的概念有了很好的认识,类的封装性以及单一职责性,在这两道题目中得到了很好的体现,这两道题由于前面做过有一些基础,做起来也不难,但第三题题目较难。作业三的答题情况,是为65分。

2.设计与分析


作业一:7—8
`import java.util.Scanner;

public class Main {
public static void main(String[] args) {
Scanner x=new Scanner(System.in);
double a,b,c,temp;
a=x.nextFloat();b=x.nextFloat();c=x.nextFloat();
if(a>b){
temp=a;a=b;b=temp;
}
if(a>c){
temp=a;a=c;c=temp;
}
if(b>c){
temp=b;b=c;c=temp;
}
if(a<1||a>200||b<1||b>200||c<1||c>200)
{
System.out.println("Wrong Format");
}
else{
if(a+b>c){
if(ab&&bc)
System.out.println("Equilateral triangle");
else if(aa+bb-cc<0.000001&&ab)
System.out.println("Isosceles right-angled triangle");
else if((a
b&&a!=c)||(ac&&a!=b)||(bc&&b!=a))
System.out.println("Isosceles triangle");
else if(a
a+bb-cc<0.000001)
System.out.println("Right-angled triangle");
else
System.out.println("General triangle");
}
else
System.out.println("Not a triangle");
}
}
}`
最后一题在做的时候,有一些测试点没有过去,原因有如下;

所有三角形是否考虑进去
有一些三角形是包含一些三角形,else if 的先后顺序,可以大大减少判断的次数
在判断直角三角型的精度问题,怎样准确的判断一个三角形是不是直角三角形也涉及到了一个测试点能否过去

作业二:7-4

题目分析:

输入年月日的值(均为整型数),输出该日期的下一天。 其中:年份的合法取值范围为[1820,2020] ,月份合法取值范围为[1,12] ,日期合法取值范围为[1,31] 。 注意:不允许使用Java中和日期相关的类和方法。

要求: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 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int year=input.nextInt();
int month=input.nextInt();
int day=input.nextInt();

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

}
`
image
image

这个题我一共设计了三个方法
这个题进一步强化了我对于java的方法的理解,不同的方法做不同的事,主函数的代码能很好的简化。这个题和上一个题基本相似,唯一不同的是求下一天,先进行输入的天份和年份是不是合法,然后进行日期加一,若加满了这个月的天数,则月数加一,天数减去这个月的天数,若月数加满12,则年数加一,月数再减12,作为下一年的月数。

作业二:7-5

7-5 求前N天 (30 分)
输入年月日的值(均为整型数),同时输入一个取值范围在[-10,10] 之间的整型数n,输出该日期的前n天(当n > 0时)、该日期的后n天(当n<0时)。
其中年份取值范围为 [1820,2020] ,月份取值范围为[1,12] ,日期取值范围为[1,31] 。
注意:不允许使用Java中任何与日期有关的类或方法。

输入格式:
在一行中输入年月日的值以及n的值,可以用一个或多个空格或回车分隔。

输出格式:
当输入的年、月、日以及n的值非法时,输出“Wrong Format”;
当输入数据合法时,输出“n days ago is:年-月-日”

提交代码

`import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int year=input.nextInt();
int month=input.nextInt();
int day=input.nextInt();
int n=input.nextInt();
if(!checkInputValidity(year,month,day))
System.out.println("Wrong Format");
else{
nextDate(year,month,day,n);
}
}
public static boolean checkInputValidity(int year,int month,int day) {
boolean checkInputValidity;
int[] a=new int[]{0,31,29,31,30,31,30,31,31,30,31,30,31};
if(!isLeapYear(year))
a[2] = 28;
checkInputValidity = ((year>=1820&&year<=2020)&&(month>0&&month<=12)&&(day<=a[month]&&day>0));
return checkInputValidity;
}
public static boolean isLeapYear(int year) {
boolean isLeapYear;
isLeapYear = (year % 4 == 0 && year % 100 !=0 )||year % 400 == 0;
return isLeapYear;
}
public static void nextDate(int year,int month,int day,int n)
{
int[] a=new int[]{0,31,29,31,30,31,30,31,31,30,31,30,31};
int d=n;
if(!isLeapYear(year))
a[2] = 28;
if(n>=0)
{
while(n>0)
{
if(day>0&&month>0&&year>0)
{
day--;
n--;
}
else if(month>0&&year>0)
{
month--;
day=a[month];
}
else
{
year--;
month=12;
day=31;
}
}
System.out.println(d+" days ago is:"+year+"-"+month+"-"+day);
}
else
{
while(n<0)
{
if(day!=a[month])
{
day++;
n++;
}
else if(day==a[month]&&month!=12)
{
month++;
day=1;
n++;
}
else
{
year++;
month=1;
day=1;
n++;
}
}
System.out.println(d+" days ago is:"+year+"-"+month+"-"+day);
}

}

}
`
image
这次设计了三个方法,和上一题相同。
求下一次天数的时候,需要导入四个参数,年份,月份,天数,需要加减的天数,在加入的天数超过这个月所在的天数时,月份需要加一,当月份加入超过12时,需要进行年份加一,这个题需要注意的是年份的操作,闰年的二月月份和平年的月份是不同的,下面展示这个圈复杂度:
image
这个题的圈复杂度较高,所用的if else 判断也较多,应该用较少的圈复杂度,我们要做的是减少圈复杂度,这样代码才能更加的简洁和高效.这也是这个题之后要进行精进的地方。

作业三:7-2

7-2 定义日期类 (28 分)
定义一个类Date,包含三个私有属性年(year)、月(month)、日(day),均为整型数,其中:年份的合法取值范围为[1900,2000] ,月份合法取值范围为[1,12] ,日期合法取值范围为[1,31] 。 注意:不允许使用Java中和日期相关的类和方法,否则按0分处理。

要求:Date类结构如下图所示:
image

`import java.util.*;
import java.text.DecimalFormat;
public class Main {

public static void main(String[] args) {
    Scanner input = new Scanner(System.in);
    int year = input.nextInt();
    int month =input.nextInt();
    int day =input.nextInt();
    Account account = new Account(year,month,day);

    if(account.checkinoutValidity())
     {
        DecimalFormat df = new DecimalFormat("0");

         account.getNextDate();
        System.out.println("Next day is:"+account.getYear()+"-"+account.getMonth()+"-"+df.format(account.getDay()));

    }
}

}
class Account {

 private int year = 0;
private    int month = 0 ;
private int day = 0;
private int panduan = 0;
public  boolean checkinoutValidity() {
     if(month>0&&month<=12){

          if(isLeapYear(year))
          {
            if(day<=month1[month]&&day>0)
            panduan=1;
          }
          else
          {
            if(day<=month2[month]&&day>0)
            panduan=1;

          }
     }


        if(year<1900||year>2000||month<1||month>12||day<1||day>31||panduan==0) {
            System.out.println("Date Format is Wrong");
            return false;
        }
        return true;

}
public static boolean isLeapYear(int year){
    if((year%4==0&&(year%100!=0))||year%400==0) {
        return true;
    }
    else
        return false;
}
 int[] month2=new int[]{0,31,28,31,30,31,30,31,31,30,31,30,31};
 int[] month1=new int[]{0,31,29,31,30,31,30,31,31,30,31,30,31};

public Account(int a ,int b,int c) {
    this.year = a;
    this.month = b;
    this.day = c;
}
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 double getDay() {
    return day;
}
public void setDay(int day) {
    this.day = day;
}
public void getNextDate() {
    if(isLeapYear(this.year)==true ) {
        this.day=this.day+1;
        if(day>month1[month]) {
            this.day=this.day-month1[month];
            this.month++;
            if(this.month>12) {
                this.month -=12;
                this.year++;
            }
        }
    }
    else {
        this.day++;
        if(day>month2[month]) {
            this.day=this.day-month2[month];
            this.month++;
            if(this.month>12) {
                this.month -=12;
                this.year++;
            }
        }

    }
}

}`
这道题圈复杂度不是很高
image
这个题在习题集二中已经出现过了一次,唯一不同的是添加了一个类的使用方法,这个题的全部测试点都通过了,将求下一天的功能封装在一个类中,然后在类里面实现对下一天的求解
我的代码的类图:
image

作业三:7-3

7-3 一元多项式求导(类设计) (50 分)
编写程序性,实现对简单多项式的导函数进行求解。详见作业指导书。 OO作业3-3题目说明.pdf

输入格式:
在一行内输入一个待计算导函数的表达式,以回车符结束。

输出格式:
如果输入表达式不符合上述表达式基本规则,则输出“Wrong Format”。
如果输入合法,则在一行内正常输出该表达式的导函数,注意以下几点: 结果不需要排序,也不需要化简;
当某一项为“0”时,则该项不需要显示,但如果整个导函数结果为“0”时,则显示为“0”;
当输出结果第一项系数符号为“+”时,不输出“+”;
当指数符号为“+”时,不输出“+”;
当指数值为“0”时,则不需要输出“x^0”,只需要输出其系数即可。
输出格式见输入输出示例。

我提交的源码:

`import java.util.*;
public class Main {

public static void main(String[] args) {

    Scanner input = new Scanner(System.in);
    char zm[]= new char[30];
    String string=input.nextLine();
    String th = string.replaceAll("[ ]", "");
    Account account = new Account(th);
    int zm1[] = new int[30];
    String PowerFunction = "((([-+]?([1-9][0-9]*)?(\\*x(\\^[+-]?([1-9][0-9]*))?)))*"; //幂函数正则
    String C = "(([1-9][0-9]*|[-+]([1-9][0-9]*)))*"; //常数正则
    String Term = ""; //
if(account.trueorFalse(th)) {
    if(th.matches(C)) {
        System.out.println("0");
    }
}
else {
        System.out.println("Wrong Format");
}
}

}
class Account {

private String s;

public Account(String zf) {
    this.s = zf;
}
  public boolean trueorFalse(String s) {//判断是否为合法多项式
        if (s.matches("^(([-+]([1-9][0-9]*)(\\*x(\\^[+-]?([1-9][0-9]*))?))|(([1-9][0-9]*)\\*(x(\\^[+-]?([1-9][0-9]*))?))|([-+](x(\\^[+-]?([1-9][0-9]*))?))|([-+]([1-9][0-9]*))|(([1-9][0-9]*))|((x(\\^[+-]?([1-9][0-9]*))?)))+$"))
            return true;
        else
            return false;
    }

}`
这道题比较难,我参考了网上正则表达式的算法,但还是没有做出来,对正则表达式还是不能够熟练运用。我的耐心恒心也不够,没有坚持下来,一开始我就觉得特别难,然后就放弃了。
image
image

3.踩坑心得

从一开始的自信到最后的不自信,这是前三次Java习题集作业带给我的最大感受,当习题集一的作业刚发布的时候,我觉得Java和C语言一样好学,殊不知这只是我目光短浅的一种看法,,习题集三的正则表达式,我是一窍不通,在我看来,代码只要能实现功能就是好的代码,所以我的一切都是为了实现功能去的,我才不管if多不多,圈复杂度高不高,我写的代码仅仅只能实现功能,但代码的长度都过于复杂,圈复杂度过高,这根本解决不了复杂的软件工程问题,我也觉得老师讲的Java课非常好,结合了一些身边的例子。要遇到困难迎难而上,不做出这道题不睡觉的劲头,才可以,所以,这次最大的踩坑心得就是改变了我对Java的学习态度,得过且过是根本行不通的,我以后要一钻研Java为乐,努力击破所有的困难,在老师布置的题目中一次次的成长,不会再抱着得过且过的心态对待Java课。

4.总结

1.这次的题目较难但是带给我的收获还有很多,改变了我对Java的学习态度。

2.从这三次题目集中收获了很多,对于Java基本语法,类的概念,类的特有属性,都有了一些掌握和加深,

3.面向对象程序设计的概念基本形成,以前我根本不知道什么是面向对象程序设计,直觉的和C语言应该是一样的,但是现在我发现Java语言很灵活,有C语言没有的东西,这些东西用起来都非常的方便

posted @ 2021-10-15 13:46  Tiam_wzh  阅读(82)  评论(0)    收藏  举报