java面向对象程序设计题目集1~3的总结

一、前言

       在java 程序设计这门课程进行了三次题目集的测试后,我对java也有了初步的了解与认知,本文则对前三次题目集粗略做出以下总结。首先第一次题目集考虑到我们大多数人是第一次接触java这门语言,选用了题目较为简单的练习让我们熟悉该语言的基本语法,且题量较为充裕可以让我们有更多的机会去进行实际操作与调试,知识点主要集中在输入输出操作上来考核,故就难度而言应该是最容易的。第二次题目集则侧重于树立面向对象的思想,循序渐进从编写日期分析的测试程序到了解类的基本概念,题量少而精,难度适中;而第三次题目集则要求我们使用面向对象的思想去以类封装的方法实现题目的要求,虽然只有三题但有一定的难度存在,考察方向为类的使用与定义和正则表达式的使用,其中正则表达式的使用尤其重要,我刚开始做题目集的7-3时没有考虑正则表达式的使用,导致浪费了许多宝贵的时间,测试时间结束才系统地学习了一下正则表达式的原理和底层逻辑,发现这真是一个方便的字符处理工具。总而言之,从题目集的角度来看顺序的设置是合理的,有较为明显的难度梯度与循序渐进的过程体现。

 

二、设计与分析

  1. SourceMonitor简介

  引用百科:SourceMonitor,国外软件,利用它可以为C++、C、C#、Java、Delphi、Visual Basic和HTML的源代码文件测试代码数量和性能。最终结果可以描绘成图、输出打印。像其他代码度量工具一样,SourceMonitor只关注代码,并为编码人员提供及时的反馈,它不是一款项目管理工具,不关注项目实施中从功能分析到设计编码,再到测试这整个过程。下文多数使用SourceMonitor进行分析代码。

  2. 分析过程

  本文对题目要求的代码进行分析检验,首先是题目集1的各个作业部分代码各项性能测试。

  

  本地保存的代码只有四次的,但也不影响用来测试他们各项性能。

  分析结果如下:

  

   针对2-7-8实验的代码分析,可以得到如下结果:

  

 

 

   本文主要分析如下指标:

  分支语句比例(Percent Branch Statements):该值表示分支语句占语句数目的比例,这里的“分支语句”指的是使程序不顺序执行的语句,包括if、else、for、  while和switch;

  函数数目(Functions):指示函数的数量;

  平均每个函数包含的语句数目(Average Statements per Function):总的函数语句数目除以函数数目得到该值;

  函数圈复杂度(Function Complexity):圈复杂度指示一个函数可执行路径的数目,以下语句为圈复杂度的值贡献1:if/else/for/while语句,三元运算符语句,    if/for/while判断条件中的"&&"或“||”,switch语句,后接break/goto/ return/throw/continue语句的case语句,catch/except语句;

  函数深度(Block Depth):函数深度指示函数中分支嵌套的层数。

具体题目分析:

   贴上源码:

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        // TODO 自动生成的方法存根
        Scanner in = new Scanner (System.in);
        double a=in.nextDouble();
        double b=in.nextDouble();
        double c=in.nextDouble();
        double temp;
        if(a>b) {
            temp=a;
            a=b;
            b=temp;
        }
        if(b>c) {
            temp=b;
            b=c;
            c=temp;
        }
        if(a>=1&&a<=200&&b>=1&&b<=200&c>=1&&c<=200) {//数据合法
            if(a+b<=c||a+c<=b||b+c<=a) {
                System.out.println("Not a triangle");//三条边不能构成三角形
            }
            else {
                if(a==b&&b==c) {
                    System.out.println("Equilateral triangle");//等边
                    
                }
                else {
                    if(a==b||b==c&&Math.abs(a*a+b*b-c*c)<0.000001) {
                    System.out.println("Isosceles right-angled triangle");//等腰直角
                }
                    else {
                        if(a==b||b==c||a==c) {
                    System.out.println("Isosceles triangle");//等腰
                }
                        else {
                            if(Math.abs(a*a+b*b-c*c)<0.000001) {
                    System.out.println("Right-angled triangle");//直角
                }
                else {
                    System.out.println("General triangle");//一般
                }
                        }
                
                    }
                
                }
                
            }
        }
        else {
            System.out.println("Wrong Format");//数据非法
        }
    }

}

  综合分析本段代码圈复杂度略大,判断条件主要靠分支语句判断实现,仍有降低的空间。

 

 

  接下来是第二次测试的7-4和7-5的复杂度分析:

  (7-4)

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {//主方法;
        // TODO 自动生成的方法存根
        Scanner in =new Scanner (System.in);
        int year=in.nextInt();
        int month=in.nextInt();
        int day=in.nextInt();
        if(checkInputValidity(year,month,day)==false) {
            System.out.println("Wrong Format");
            return ;
        }
        nextDate(year,month,day);
        
    }
    public static boolean isLeapYear(int year) {
        //判断year是否为闰年,返回boolean类型;
        if(((year%4==0) && (year%100 != 0)) || (year%400==0))    
            return true;
        else
            return false;
    }
    public static boolean checkInputValidity(int year,int month,int day){
        //判断输入日期是否合法,返回布尔值
        if(year<1820||year>2020||month<1||month>12||day<1||day>31 ){//数据错误
            return false;
        }
        if(month==1&&day>31||isLeapYear(year)==false&&month==2&&day>28||isLeapYear(year)==true&&month==2&&day>29||month==3&&day>31||month==4&&day>30||month==5&&day>31||month==6&&day>30||month==7&&day>31||month==8&&day>31||month==9&&day>30||month==10&&day>31||month==11&&day>30||month==12&&day>31) {
            return false;
        }
        return true;
    }
    public static void nextDate(int year,int month,int day) {
        //求输入日期的下一天
        if(month==1&&day==31||isLeapYear(year)==false&&month==2&&day==28||isLeapYear(year)==true&&month==2&&day==29||month==3&&day==31||month==4&&day==30||month==5&&day==31||month==6&&day==30||month==7&&day==31||month==8&&day==31||month==9&&day==30||month==10&&day==31||month==11&&day==30||month==12&&day==31) {
            //如果要跳月份加
            month++;
            if(month==13) {
                year++;
                month=1;
            }
            day=1;
        }
        else {
            day++;
        }
        System.out.println("Next date is:"+year+"-"+month+"-"+day);
    }
}

  本题运用的方法也是大量的条件分析,经过不同分类下的筛选最终得出正确的结果,因此本代码的圈复杂度也略大,虽然实现了功能但是代码显得有些冗杂。

  (7-5)

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {//主方法;
        // TODO 自动生成的方法存根
        Scanner in =new Scanner (System.in);
        int year=in.nextInt();
        int month=in.nextInt();
        int day=in.nextInt();
        int n=in.nextInt();
        if(n>10||n<-10||checkInputValidity(year,month,day)==false) {
            System.out.println("Wrong Format");
            return ;
        }
        conversion(year,month,day,n);
        
    
    }
    public static boolean isLeapYear(int year) {
        //判断year是否为闰年,返回boolean类型;
        if(((year%4==0) && (year%100 != 0)) || (year%400==0))    
            return true;
        else
            return false;
    }
    public static boolean checkInputValidity(int year,int month,int day){
        //判断输入日期是否合法,返回布尔值
        if(year<1820||year>2020||month<1||month>12||day<1||day>31 ){//数据错误
            return false;
        }
        if(month==1&&day>31||isLeapYear(year)==false&&month==2&&day>28||isLeapYear(year)==true&&month==2&&day>29||month==3&&day>31||month==4&&day>30||month==5&&day>31||month==6&&day>30||month==7&&day>31||month==8&&day>31||month==9&&day>30||month==10&&day>31||month==11&&day>30||month==12&&day>31) {
            return false;
        }
        return true;
    }
    public static void conversion(int year,int month,int day,int n) {
        int N=n;
        if(n>0) {//向前找
            while(n!=0) {
                n--;
                day--;
                if(day==0) {
                    switch(month) {
                    case 1:
                    case 2:
                    case 4:
                    case 6:
                    case 8:
                    case 9:
                    case 11:day=31;break;
                    case 3:{
                        if(isLeapYear(year)==true) {
                            day=29;
                        }
                        else {
                            day=28;
                        }
                        break;
                    }
                    case 5:
                    case 7:
                    case 10:
                    case 12:day=30;break;    
                    }
                    month--;
                    if(month==0) {
                        year--;
                        month=12;
                    }
                }
            }
        }
        else {//向后找
            while(n!=0) {
                n++;
                day++;
                if(month==1&&day==31||isLeapYear(year)==false&&month==2&&day==29||isLeapYear(year)==true&&month==2&&day==30||month==3&&day==31||month==4&&day==30||month==5&&day==31||month==6&&day==30||month==7&&day==31||month==8&&day==31||month==9&&day==30||month==10&&day==31||month==11&&day==30||month==12&&day==32) {
                    month++;
                    day=1;
                    if(month==13) {
                        month=1;
                        year++;
                    }
                }
                }
            }
        System.out.println(N+" days ago is:"+year+"-"+month+"-"+day);    
        }
    }

  本代码在7-3、7-4的基础上沿用了大量条件语句进行判断,故圈复杂度也较为高,有较大的优化空间。

  接下来是题目集3,本文仅分析要求的7-2与7-3内容,首先我们可以很容易地发现,3-7-2其实就是2-7-3、2-7-4、2-7-5的衍生情况,将代码内部逻辑稍微修改就可以较为轻松的解决本题。下面是代码及其分析结果:

  

//修改后
import java.util.Scanner;
class Date{
    int year;
    int month;
    int day;
    public Date(int year,int month,int day) {
        this.year=year;
        this.month=month;
        this.day=day;
    }
    public Date() {
        // TODO 自动生成的构造函数存根
        int year,month,day;
    }
    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) {
        //判断year是否为闰年,返回boolean类型;
        return year%4==0 && year%100 != 0 || year%400==0;
    }
    public static boolean checkInputValidity(int year,int month,int day){
        //判断输入日期是否合法,返回布尔值
        if(year<1900||year>2000||month<1||month>12||day<1||day>31 ){//数据错误
            return false;
        }
        if(month==1&&day>31||isLeapYear(year)==false&&month==2&&day>28||isLeapYear(year)==true&&month==2&&day>29||month==3&&day>31||month==4&&day>30||month==5&&day>31||month==6&&day>30||month==7&&day>31||month==8&&day>31||month==9&&day>30||month==10&&day>31||month==11&&day>30||month==12&&day>31) {
            return false;
        }
        return true;
    }
    public static void nextDate(int year,int month,int day) {
        //求输入日期的下一天
        if(month==1&&day==31||isLeapYear(year)==false&&month==2&&day==28||isLeapYear(year)==true&&month==2&&day==29||month==3&&day==31||month==4&&day==30||month==5&&day==31||month==6&&day==30||month==7&&day==31||month==8&&day==31||month==9&&day==30||month==10&&day==31||month==11&&day==30||month==12&&day==31) {
            //如果要跳月份加
            month++;
            if(month==13) {
                year++;
                month=1;
            }
            day=1;
        }
        else {
            day++;
        }
        System.out.println("Next day is:"+year+"-"+month+"-"+day);
    }
}

public class Main {

    public static void main(String[] args) {//主方法;
        // TODO 自动生成的方法存根
        Scanner in =new Scanner (System.in);
        Date ymd = new Date();
        int year=in.nextInt();
        int month=in.nextInt();
        int day=in.nextInt();
        ymd.nextDate(year,month,day);        
    }
}

 

  由于是在前文基础上修改的,其圈复杂度没有得到较好地修正。

  下面是7-3的代码及其分析:

  

package week3;

import java.math.BigInteger;
import java.util.Scanner;

public class week3_7_3 {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String function=in.nextLine();
        operation a = new operation(function);
        a.extract(function);
        
    }
    
}
class operation{//字符串识别
    String str;
    public operation(String function) {
        str=function;
    }
    public void extract(String str) {
        str = str.replaceAll(" ", ""); //删除空格
        //System.out.println(str);
        String Intermediate_quantity = "";
        String[] strNumber = new String [str.length()];
        char[] strSymbol = new char [str.length()];
        int flagNumber = 0;
        int flagSymbol = 0;
        if(str !=null && !"".equals(str)) {//a不为空且无空字符
            for(int i=0;i<str.length();i++) {
                if(str.charAt(i)==' ') {//为空格跳过
                    continue;
                }
                if(str.charAt(i)>='0' && str.charAt(i)<='9' ||str.charAt(i)=='.'||str.charAt(i)=='+'||str.charAt(i)=='-') {
                    //为0~9和小数点和加减
                    if(str.charAt(i)=='+'&& i>0 && str.charAt(i-1)>='0' && str.charAt(i-1)<='9'||str.charAt(i)=='-'&& i>0 && str.charAt(i-1)>='0' && str.charAt(i-1)<='9') {
                        //符号位前面还是数字
                        strNumber[flagNumber++] = Intermediate_quantity;
                        Intermediate_quantity = "";
                        if(str.charAt(i+1)>='0' && str.charAt(i+1)<='9') {//符号位后还是数字
                            if(str.charAt(i+1)=='0') {
                                System.out.println("Wrong Format");
                                return ;
                            }
                            else
                                Intermediate_quantity += str.charAt(i);
                        }
                        if(str.charAt(i)=='+' && str.charAt(i+1)=='x' || str.charAt(i)=='-' && str.charAt(i+1)=='x' ||str.charAt(i)=='x'&&i==0) {
                            if(str.charAt(i)=='+') {
                                Intermediate_quantity="1";
                            }
                            if(str.charAt(i)=='-') {
                                Intermediate_quantity="-1";
                            }
                        }
                        else
                        strSymbol[flagSymbol++] = str.charAt(i);
                    }
                    else {
                        Intermediate_quantity += str.charAt(i);//存入中间字符串
                        strNumber[flagNumber] = Intermediate_quantity;
                    }
                }
                else {//为符号存入相应数组
                    strNumber[flagNumber++] = Intermediate_quantity;
                    Intermediate_quantity = "";
                    strSymbol[flagSymbol++] = str.charAt(i);
                }
            }
        }
        else {
            System.out.println("Wrong Format");
            return ;
        }
        int num1 = 0;
        long[] number = new long [strNumber.length];
        for(int i=0;i<strNumber.length;i++) {
            if(strNumber[i]!="" && strNumber[i]!= null) {
                number[num1++] = Long.parseLong(strNumber[i]);
                //System.out.println(strNumber[i]);//此处用来检验了转化是否成功
            }
        }
        for(int i=0;i<num1;i++) {
            if(number[i]==0) {
                System.out.println("Wrong Format");
                return ;
            }
        }
        //System.out.print("\n");
        int num2 = 0;
        char[] symbol = new char [strSymbol.length];
        for(int i=0;i<strSymbol.length;i++) {
            if(strSymbol[i] != ' ' && strSymbol[i] != '\0') {
                symbol[num2++] = strSymbol[i];
                //System.out.println(strNumber[i]);//此处用来检验了转化是否成功
            }
        }
        for(int i=0;i<num2;i++) {
            //System.out.print(symbol[i]+" ");
        }
        //System.out.print("\n");
        
        
        
        //计算
        int flag = 0;
        long coefficient ;
        long index ;
        int Xnum = 0;
        int strnum = 0;
        //(去除常数项)如果前面是数字或者加减而且后面还是数字或者加减
//        if(/*strNumber[1] != null && strSymbol[1] != '\0'*/strSymbol.length>0) {
//            for(int i=0;i<strNumber.length;i++) {
//                if(strNumber[strnum] != null) {
//                    if( /*前面是数字后面是数字或加减*/Head(str,strNumber[strnum])>0 && End(str,strNumber[strnum])+1<=str.length() && str.charAt(Head(str,strNumber[strnum])-1) >='0' && str.charAt(Head(str,strNumber[strnum])-1) <='9'&& str.charAt(End(str,strNumber[strnum])+1) >= '0' && str.charAt(End(str,strNumber[strnum])+1)<='9' || Head(str,strNumber[strnum])>0 && End(str,strNumber[strnum])+1<=str.length() && str.charAt(Head(str,strNumber[strnum])-1) >= '0' && str.charAt(Head(str,strNumber[strnum])-1) <= '9'&& str.charAt(End(str,strNumber[strnum])+1) == '+'|| Head(str,strNumber[strnum])>0 && End(str,strNumber[strnum])+1<=str.length() && str.charAt(Head(str,strNumber[strnum])-1) >= '0' && str.charAt(Head(str,strNumber[strnum])-1) <= '9'&& str.charAt(End(str,strNumber[strnum])+1)=='-'
//                            ||/*前面是加后面是数字或加减  */Head(str,strNumber[strnum])>0 && End(str,strNumber[strnum])+1<=str.length()&& str.charAt(Head(str,strNumber[strnum])-1)=='+' && str.charAt(End(str,strNumber[strnum])+1) >='0' && str.charAt(End(str,strNumber[strnum])+1) <='9' || Head(str,strNumber[strnum])>0 && End(str,strNumber[strnum])+1<=str.length()&& str.charAt(Head(str,strNumber[strnum])-1) == '+' && str.charAt(End(str,strNumber[strnum])+1)=='+' || Head(str,strNumber[strnum])>0 && End(str,strNumber[strnum])+1<=str.length()&& str.charAt(Head(str,strNumber[strnum])-1) == '+' && str.charAt(End(str,strNumber[strnum])+1)=='-'
//                            ||/*前面是减后面是数字或加减  */Head(str,strNumber[strnum])>0 && End(str,strNumber[strnum])+1<=str.length()&& str.charAt(Head(str,strNumber[strnum])-1)=='-' && str.charAt(End(str,strNumber[strnum])+1) >='0' && str.charAt(End(str,strNumber[strnum])+1) <='9' || Head(str,strNumber[strnum])>0 && End(str,strNumber[strnum])+1<=str.length()&& str.charAt(Head(str,strNumber[strnum])-1) == '-' && str.charAt(End(str,strNumber[strnum])+1)=='+' || Head(str,strNumber[strnum])>0 && End(str,strNumber[strnum])+1<=str.length()&& str.charAt(Head(str,strNumber[strnum])-1) == '-' && str.charAt(End(str,strNumber[strnum])+1)=='-'
//                            ||/*数字首位后面是数字或加减  */Head(str,strNumber[strnum])==0 && End(str,strNumber[strnum])+1<=str.length()&& str.charAt(End(str,strNumber[strnum])+1)>='0' && str.charAt(End(str,strNumber[strnum])+1)<='9' || Head(str,strNumber[strnum])==0 && End(str,strNumber[strnum])+1<=str.length()&& str.charAt(End(str,strNumber[strnum])+1) == '+'|| Head(str,strNumber[strnum])==0 && End(str,strNumber[strnum])+1<=str.length()&& str.charAt(End(str,strNumber[strnum])+1)=='-'
//                            )     {
//                                for(int i1 = strnum; i1<number.length-1;i1++) {
//                                    number[i1]=number[i1+1];
//                                }
//                                str = str.substring(End(str,strNumber[strnum])+1);
//                                }
//                    else {
//                        strnum++;
//                    }
//                }
//                
//            }
//        }
        
        for(int i=0;i<symbol.length;i++) {//寻找字符数组里的X并且与数值数组匹配
            if(symbol[i]!='\0') {
                if(symbol[i] == 'x') {
                    Xnum++;
                    if(i>0 && symbol[i-1] == '*' && symbol[i+1] == '^') {//情况为*x^
                        coefficient = number[flag]*number[flag+1];//系数
                        index = number[flag+1]-1;//指数
                        if(index !=1 ) {
                            if(index != 0) {
                                if(coefficient==1)
                                    System.out.print("x^"+index);
                                if(coefficient==-1)
                                    System.out.print("-x^"+index);
                                else
                                    System.out.print(coefficient+"*x^"+index);
                            }
                            else {
                                if(coefficient==1)
                                    System.out.print("+1");
                                if(coefficient==-1)
                                    System.out.print("-1");
                                else
                                    System.out.print(coefficient);
                            }
                            
                        }
                        else {//index=1
                            if(coefficient==1)
                                System.out.print("x");
                            if(coefficient==-1)
                                System.out.print("-x");
                            else
                                System.out.print(coefficient+"*x");
                        }                            
                        flag+=2;
                    }
                    if(i>0 && symbol[i-1] == '*' && symbol[i+1] != '^') {//情况为*x
                            System.out.print(number[flag]);
                        flag++;
                    }
                    if(i>0 && symbol[i-1] != '*' && symbol[i+1] == '^'||i==0 && symbol[i+1] == '^') {//情况为x^
                        index = number[flag]-1;
                        if(index !=1 ) {
                            if(index != 0) {
                                    System.out.print(index+1+"*x^"+index);
                            }
                            else {
                                    System.out.print("1");
                            }
                            
                        }
                        else {//index=1
                                System.out.print(index+1+"*x");
                        }
                        flag++;
                    }
                    
                    if(/*number[flag]>0 &&*/ symbol[i+1] != '\0' && number[flag]*number[flag+1]>0) {
                        System.out.print("+");
                    }
                    if(number[flag]<0) {
                        //不用给负号
                    }
                }//if是x
            }
        }
        if(Xnum==0) {
            System.out.println("0");
        }
    }
    public int Head(String sentence, String word) {//查找匹配的数组,返回首部位置
        int startingPosition = sentence.indexOf(word);
        return startingPosition;
    }
    public int End(String sentence, String word) {//查找匹配的数组,返回尾部位置
        int startingPosition = sentence.indexOf(word);
        int endingPosition = startingPosition + word.length();
        return endingPosition;
    }
    public static String Right(String sSource, int iLength)//删除前面的数组,返回字符串
    {
        if (iLength > sSource.length())
        {
            return sSource;
        }
        return sSource.substring(sSource.length() - iLength,iLength);
    }
}

  

  这是一开始我的写法,只是一昧地去想着实现其所需要的功能没有考虑正则表达式的使用,导致代码效率及其低下。

  

  后面选用了正则表达式的方法去对源代码进行修改,整体复杂度都有了较为显著的改善。

 

 

三、踩坑“心得”

  主要就是在需要运用正则表达式的题目哪里需要熟练运用正则表达式解题,不然就会非常难处理这个问题,写完代码之后和同学讨论被戏称为手撕正则的做法确实不可取,需要更加灵活的去分析各种需求。一开始没有运用正则表达式去解决,自己暴力枚举完全不能将所有的解决方案实现,想了很久也没能搞明白,最后就是学正则表达式的使用,学完一部分之后之前的繁琐设计大幅度简化,还有就是本题中1的大数类,大数的使用我开始还以为就是long类型储存,然后在测试数据的时候一直有问题不知道怎么解决,然后查了一下发现有专门的大数类,换用后这个问题得以解决。

  其次就是一些小细节,定义域的约束,范围的设置等等都是需要注意的,在天数计算部分尤其要考虑周全。

四、改进建议

  1.    可以采用三元表达式的方式降低一部分分支语句的执行;
  2.         将条件表达式合并,用一个布尔型将判断语句里面的一大串条件化成一个Boolean型参数可以有效降低圈复杂度,尤其是在代码块中大量使用&& ||的时候,一次合并可以使得整体复杂度大幅降低,在题目集二的时间类型题目可以运用;
  3.         可以将重复部分提取出拆分为子函数执行;
  4.         switch case语句可以用map去实现,也是可以在题目集二中优化代码;
  5.         将无必要的else删去;

五、总结

   通过多次题目集的测试,我对java程序设计有了更深入的了解,对这个语言所需掌握的能力也有了初步的认知,相信经过更多地学习我能够逐渐掌握这门学科。并且最大的收获就是有了面向对象的概念,掌握了正则表达式的基本使用,编程能力进一步提高,思考问题更加全面。接下来的学习需要巩固自己面向对象编程思想的运用,不能变成学在脑子里却不能使用这种方法的人。

  有很多知识是需要自己自学的,有的题目需要的知识上课时老师不一定会先提而是让我们课后自主预习并在题目中实践,我个人是比较喜欢这种教学方式的,...(虽然自己因为这个原因在第三次题目集栽了个跟头,但是还是觉得这种教学方法很好)编程语言需要的是多次实际运用并化为自己的知识,我应该更多地去自主实践一些项目代码。课堂学习的氛围很好,但除了课堂我也更应该注重课余时间的学习。

  除此之外题目集也给了我很多启发,所以我也比较期待接下来的练习题能给我怎样的考验。

posted @ 2021-10-15 15:46  LoseYoung  阅读(262)  评论(0)    收藏  举报