面向对象程序设计题目集1-3总结
面向对象程序设计第一次博客作业
题目集1-3的总结
//该blog的前言,设计与分析,采坑心得,改进建议为一个一个题目集进行分析
//总结是整体总结
1.第一次题目集:
前言:
第一次题目集是基于刚学完C语言后开始写的题目。
第一次题目集有八道题目,但都是比较基础的题目,利用C语言的基础知识,加以配合初学Java的知识就能写出来。
该题目集需要学会Java语言的赋值、输出、一维数组的定义方法、if-else、switch-case及for循环的结构与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 Statements0 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
该题目是正则表达式的第一次应用,需要进行式子的匹配。
编写程序性,实现对简单多项式的导函数进行求解
正则表达式的灵活性、逻辑性和功能性非常强,比较晦涩难懂,里面有一个等价的概念,这个概念大大增加了理解难度,因此写起题目来是否困难...
由于并没有将这题写出来...于是先讲一下思路...
思路:
- 先匹配正确的多项表达式:
如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 - 如果匹配成功,则输入的表达式正确,否则直接输出“Wrong Format”。
- 在匹配成功后,需要有while(matcher.find())来进行循环,也需要matcher.group()来对该表达式进行分割成几部分。
- 若为常数,直接导数为0。
- 若不为常数,另设字符串数组,将每一项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会出现很多,但要耐心去调试。
正则表达式还有很多地方不会...还要继续学习。








浙公网安备 33010602011771号