面向对象程序设计题目集1-3总结

面向对象程序设计第一次博客作业

题目集1-3的总结

//该blog的前言,设计与分析,采坑心得,改进建议为一个一个题目集进行分析

//总结是整体总结

  1.第一次题目集:

  前言:

  第一次题目集是基于刚学完C语言后开始写的题目。

  第一次题目集有八道题目,但都是比较基础的题目,利用C语言的基础知识,加以配合初学Java的知识就能写出来。

  该题目集需要学会Java语言的赋值、输出、一维数组的定义方法、if-elseswitch-casefor循环的结构与C语言一致。

  (一)第一次题目集设计与分析:

  • 1-7:

  

  在该题中,题目较为简单,例:

  先从键盘输入一个整数n,n代表需要排序的整数数量,然后再从键盘输入n个整数,对这些数从小到大排序并输出。

  所以观察题可知,并没有用到函数,而是直接利用数组的存入循环和冒泡排序直接输出结果。(用的是c语言的知识,且不需要函数)

  结构分析:

 

  • 1-8:

  题目为:

  输入三角形三条边,判断该三角形为什么类型的三角形。

  同样,这是在主程序里完成的三角形判断,结构同1-7。

  想法:

  在主程序中:先进行了对三角形的判断,再判断是否为直角三角形,否则判断是否是等腰三角形、等边三角形,否则为普通三角形;

        若为直角三角形,判断是否为等腰直角三角形。

        以上都不满足则直接输出“Wrong Format”;

  结构分析:

Metrics Details For File 'Blog.java'
--------------------------------------------------------------------------------------------

 

Parameter Value
========= =====
Project Directory D:\Sum\src\com\company\
Project Name 分析
Checkpoint Name Baseline
File Name Blog.java
Lines 52
Statements 26
Percent Branch Statements 38.5
Method Call Statements 10
Percent Lines with Comments 17.3
Classes and Interfaces 1
Methods per Class 1.00
Average Statements per Method 22.00
Line Number of Most Complex Method {undefined}
Name of Most Complex Method {no methods}
Maximum Complexity 0*
Line Number of Deepest Block 19
Maximum Block Depth 5
Average Block Depth 2.19
Average Complexity 0.00*

--------------------------------------------------------------------------------------------
No Methods Found: Complexity

--------------------------------------------------------------------------------------------
Block Depth Statements

0                                                 4
1                                                 4
2                                                 8
3                                                 5
4                                                 3
5                                                 2
6                                                 0
7                                                 0
8                                                 0
9+                                                0
--------------------------------------------------------------------------------------------

 

  (二)第一次题目集采坑心得

  第一次题目集总体来说比较基础,不会特定卡死在某一方面无法通过,基本都能够直接通过。

  踩的坑是:

  1-8最后判断是否为直角三角形的时候,需要:

  a*a+b*b-c*c<0.001||a*a+c*c-b*b<0.001||c*c+b*b-a*a<0.001

  直角三角形应该用直角边的根2倍与斜边的差值绝对值是否足够小,不能直接用平方和

  (三)第一次题目集改进建议

  题目基础,适合刚学完C语言或c++的初学者,但题目的思路比较固定,只能用一种方法和一种结构做出来。

 

  2.第二次题目集

  第二次题目集则基于已经学了Java一段时间后所布置的题目集,难度较第一次来说难度提升了许多。

  第二次题目集只有五道题目,但难度适中,需要熟练地运用if-else和for循环的结构,出现了函数设定和引用,运用了新的Java知识。

  同理,利用C语言的知识可迅速掌握函数的设定及引用。

  (一)第二次题目集设计与分析:

  • 2-4

  Blog结构:

  

 

  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) ; //求输入日期的下一天

  以上是规定好的函数,在Blog结构里引用,并未格外设计类结构再引用。

  想法在函数里,实现下一天的思路是:

  以月份来判断,若month==1||month==3||month==5||month==7||month==8||month==10||month==12,先看天数是否为最后一天.

  若是,则进入下个月,否则直接在天数是加1.若为12月的最后一天,则进入下一年。再判断是否为30天的月份,逻辑同上。

  若为二月则判断是否为闰年,逻辑也同上。

  结构分析:

 

  • 2-5

  Blog结构:

  

  题目2-5则是在对2-4的进一步改进。

  求前n天只需在题目2-4的nextday前加一个循环次数为n的循环结构就能解决该问题。

  以下为循环结构: 

//alf=year,art=month,fra=day,d为前/后n天
//先判断是前d天还是后d天
//进行d的循环
    public static void theday(int alf,int art,int fra,int d)
    {
        int a=d;
        if(d<0)
        {
            for(;d!=0;d++)
            {
                if(art==1||art==3||art==5||art==8||art==10)
                {
                    if(fra==31)
                    {
                        art++;
                        fra=1;
                    }
                    else
                    {
                        fra++;
                    }
                }
                else
                if(art==12)
                {
                    if(fra==31)
                    {
                        alf++;
                        art=1;
                        fra=1;
                    }
                    else
                    {
                        fra++;
                    }
                }
                else
                if(art==2)
                {
                    if(leap(alf))
                    {
                        if(fra==29)
                        {
                            art++;
                            fra=1;
                        }
                        else
                        {
                            fra++;
                        }
                    }
                    else
                    if(!leap(alf))
                    {
                        if(fra==28)
                        {
                            art++;
                            fra=1;
                        }
                        else
                        {
                            fra++;
                        }
                    }
                }
                else
                if(art==7)
                {
                    if(fra==31)
                    {
                        art++;
                        fra=1;
                    }
                    else
                    {
                        fra++;
                    }
                }
                else
                {
                    if(fra==30)
                    {
                        art++;
                        fra=1;
                    }
                    else
                    {
                        fra++;
                    }
                }
            }
        }
        else
        {
            for(;d!=0;d--)
            {
                if(art==5||art==7||art==10)
                {
                    if(fra==1)
                    {
                        art--;
                        fra=30;
                    }
                    else
                    {
                        fra--;
                    }
                }
                else
                    if(art==8)
                    {
                        if(fra==1)
                        {
                            art--;
                            fra=31;
                        }
                        else
                        {
                            fra--;
                        }
                    }
                    else
                    if(art==1)
                    {
                        if(fra==1)
                        {
                            alf--;
                            art=12;
                            fra=31;
                        }
                        else
                        {
                            fra--;
                        }
                    }
                    else
                        if(art==3)
                        {
                            if(fra==1)
                            {
                                if(leap(alf))
                                {
                                    art--;
                                    fra=29;
                                }
                                else
                                    if((!leap(alf)))
                                    {
                                        art--;
                                        fra=28;
                                    }
                            }
                            else
                            {
                                fra--;
                            }
                        }
                        else
                        {
                            if(fra==1)
                            {
                                art--;
                                fra=31;
                            }
                            else
                            {
                                fra--;
                            }
                        }
            }
        }
        System.out.print(a+" days ago is:" + alf + "-" + art + "-" + fra);
    }

  

  结构分析: 

 

  (二)第二次题目集采坑心得

  第二次题目对于年月日合法输入判断的问题有些难以思考周全,需要不断去完善。

  对于判断下一天、前n天思考的时间较长,题目布置合理,难度适中,是一次很好的锻炼机会。

  在编程的时候也考虑了相关性:

        例:加一个循环次数为n的循环结构:

  2-4:

输入年月日的值(均为整型数),输出该日期的下一天。 其中:年份的合法取值范围为[1820,2020] ,月份合法取值范围为[1,12] ,日期合法取值范围为[1,31] 。

  2-5:

  输入年月日的值(均为整型数),同时输入一个取值范围在[-10,10] 之间的整型数n,输出该日期的前n天(当n > 0时)、该日期的后n天(当n<0时)。

   (三)第二次题目集改进建议

  能发现两个明显是有相关性的,因此可以直接在2-4的基础上考虑2-5的思路。

  在写程序的时候,思路比较混乱,需要先想好结构和方法,再进行编码。

  要多处进行对年末,月末的处理,考虑天数的限制,所以结构会显得比较冗长复杂。

  可以思考简化结构,尽量用简洁的代码写出程序。

  

  3.第三次题目集

  我觉得第三次题目集突然增加了很大的难度。

  这次题目较少,只有三道题,但题目难度提升太快...

  从这次作业开始,进行了类方法的构造,方法的调用、参数传递、对象的构造与使用。

  对循环结构、控制结构有了更高的要求,需要结构清晰、逻辑正确、功能完善的java代码。

  最关键的是,出现了正则表达式的题目,而毫无疑问的是,正则表达式很令人头疼...需要查阅大量相关的知识和资料。

  (一)第三次题目集设计与分析:

  • 3-2

 题目要求:

   定义一个类Date,包含三个私有属性年(year)、月(month)、日(day),均为整型数,其中:年份的合法取值范围为[1900,2000] ,月份合法取值范围为[1,12] ,日期合法取值范围为[1,31] 。

  这是在题目集二的基础上加以修改而来,只是要求是必须保证类的封装性:

  (1)year、month、day等属性必须是私有成员  

  (2)类中的方法,必须针对类的year、month和day进行操作,而不是简单的题目集2中的写法,且nextdate(int ,int,int)的设计不是类的设计,无法体现类的封装性,必须是nextdate()

  因此,Main结构为:

  

 

  main函数中调用了Data类中的函数,

  定义私有属性,即:

 private int year;

  private int month;

 private int day;

Date() { //能创建date的无参构造方法
}

  主函数:

public static void main(String[] args) {
        // write your code here
        Scanner input = new Scanner(System.in);
        int year=input.nextInt();
        int month=input.nextInt();
        int day=input.nextInt();
        Date artie=new Date();
        artie.setYear(year);
        artie.setMonth(month);
        artie.setDay(day);
        if(artie.checkInputValidity())
        {
            artie.nextDate();
        }
        else
        {
            System.out.println("Date Format is Wrong");
        }
    }

 

  结构分析:

  •  3-5

  该题目是正则表达式的第一次应用,需要进行式子的匹配。

  编写程序性,实现对简单多项式的导函数进行求解

  正则表达式的灵活性、逻辑性和功能性非常强,比较晦涩难懂,里面有一个等价的概念,这个概念大大增加了理解难度,因此写起题目来是否困难...

  由于并没有将这题写出来...于是先讲一下思路...

  思路:

  1. 先匹配正确的多项表达式:
    如String totalRegex = "([-+]?([1-9]+[0-9]*(\\*)?)?x?(\\^[+-]?[1-9]+[0-9]*)?)+";
    String sbuRegex = "[-+]?([1-9]+[0-9]*(\\*)?)?x?(\\^[+-]?[1-9]+[0-9]*)?";//不允许出现x的0次幂,系数与指数均不能为0
  2. 如果匹配成功,则输入的表达式正确,否则直接输出“Wrong Format”。
  3. 在匹配成功后,需要有while(matcher.find())来进行循环,也需要matcher.group()来对该表达式进行分割成几部分。
  4. 若为常数,直接导数为0。
  5. 若不为常数,另设字符串数组,将每一项group放进字符串数组,将x前的数与它的指数相乘,将此时的系数存入另一个字符串数组,指数-1后也存入同一个数组,最后只需在两个数中间放入*x^输出即可得到求导后的式子。

  因为没有做出来...只有简单的结构系统:

  

 

  结构分析:

 

 

  (二)第三次题目集采坑心得

  3-2:类中的方法,必须针对类的year、month和day进行操作,而不是简单的题目集2中的写法,且nextdate(int ,int,int),checkInputValidity(int,int,int)的设计不是类的设计,无法体现类的封装性,必须是nextdate(),checkInputValidity(),差点写成了nextdate(int ,int,int)和checkInputValidity(int,int,int)。

  3-3:正则表达式处处是坑...系数为-1、1的多项式可以进行简写,系数与指数均不能为0,当输出结果第一项系数符号或指数符号为“+”时,不输出“+”以及当指数值为“0”时,则不需要输出“x^0”,只需要输出其系数。

  (三)第三次题目集改进建议

  下次写正则表达式的时候应该花很多时间去了解、查阅相关资料,因为正则表达式是一个全新的知识,在老师没讲的时候需要及时去预习。

  认真阅读关于类方法的构造,方法的调用、参数传递、对象的构造与使用,试着将主类合在一块,而不是分开写这种不太方便的写法,结构要清晰、逻辑要正确,合理进行调试,而不是写完后发现有一大堆问题再去调试,否则比较麻烦。

  -----------------------

总结

  经过这三次的题目集练习,我学会了很多,学会了如何利用C语言的基础知识,学会Java语言的赋值、输出、数组的定义方法、类的构造方法、方法的调用、参数传递、对象的构造与使用,在写程序的时候,需要先想好结构和方法,再进行编程,最重要的是学会了正则表达式的一些基本概念,知道元字符的组合表达什么,知道如何匹配表达式、合理输出表达式。

  以及明白了debug如何进行正确调试和如何让编程结构更加清晰简洁。

   编程时,如果将问题拆分成几部分,做起来会比较快,bug会出现很多,但要耐心去调试。

  正则表达式还有很多地方不会...还要继续学习。

posted @ 2021-04-04 19:25  scone  阅读(162)  评论(0)    收藏  举报