OOP前三次作业总结
前言:前三次题目集知识点
第一次作业
主要考察了对多个整数进行排序,多重if语句的嵌套(判断三角形类型) 。
第二次作业
主要考察了( 求下一天)
第三次作业
主要考察了类的定义(定义日期类),正则表达式(一元多项式求导(类设计) )
三次作业中题目集1的7-8,题目集2的7-4、7-5以及题目集3的7-2、7-3相对于其他的题目的难度稍微提升。
其中第三次作业的第三题运用了正则表达式,因为对其没有了解好多,所以写起这题来相对的困难。
设计与分析
第一次作业第七题
7-7 对多个整数进行排序 (16 分)
先从键盘输入一个整数n,n代表需要排序的整数数量,然后再从键盘输入n个整数,对这些数从小到大排序并输出。
源码分析
import java.util.Arrays;
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int x = in.nextInt();
int arr[] = new int[x];
int i;
for( i = 0;i<x;i++) {
arr[i]=in.nextInt();
}
Arrays.sort(arr,0,x-1);
System.out.printf("The sorted numbers are:");
for(i = 0;i<x;i++) {
System.out.printf("%d ",arr[i]);
}
}
}
第一次作业第八题:
7-8 判断三角形类型 (20 分)
输入三角形三条边,判断该三角形为什么类型的三角形。
输入格式:
在一行中输入三角形的三条边的值(实型数),可以用一个或多个空格或回车分隔,其中三条边的取值范围均为[1,200]。
输出格式:
(1)如果输入数据非法,则输出“Wrong Format”; (2)如果输入数据合法,但三条边不能构成三角形,则输出“Not a triangle”; (3)如果输入数据合法且能够成等边三角形,则输出“Equilateral triangle”; (3)如果输入数据合法且能够成等腰直角三角形,则输出“Isosceles right-angled triangle”; (5)如果输入数据合法且能够成等腰三角形,则输出“Isosceles triangle”; (6)如果输入数据合法且能够成直角三角形,则输出“Right-angled triangle”; (7)如果输入数据合法且能够成一般三角形,则输出“General triangle”
第二次作业第四题
7-4 求下一天 (30 分)
输入年月日的值(均为整型数),输出该日期的下一天。 其中:年份的合法取值范围为[1820,2020] ,月份合法取值范围为[1,12] ,日期合法取值范围为[1,31] 。 注意:不允许使用Java中和日期相关的类和方法。
import java.util.Scanner;
public class Main
{
public static boolean isLeapYear(int year) {
boolean isLeapYear = (year % 4 == 0 && year % 100 !=0 )||year % 400 ==
0;
return isLeapYear;
}
public static boolean checkInputValidity(int year,int month,int day) {
int[] aa=new int[]{0,31,28,31,30,31,30,31,31,30,31,30,31};
if(isLeapYear(year))
aa[2] = 29;
boolean checkInputValidity = (year>=1820&&year<=2020&&month>0&&month<=12&&day<=aa[month]&&day>0);
return checkInputValidity;
}
public static void nextDate(int year,int month,int day) {
int[] aa=new int[]{0,31,28,31,30,31,30,31,31,30,31,30,31};
if(isLeapYear(year))
aa[2] = 29;
int a = 0,b = 0,c = 0;
if(checkInputValidity(year,month,day)) {
if(month==12) {
if(day==aa[month]) {
a = year+1;
b = 1;
c = 1;}
if(day>0&&day<aa[month])
{a = year;
b = month;
c =day +1;
}
}
if(month<12) {
if(day==aa[month]) {
a = year;
b = month + 1;
c = 1;}
if(day>0&&day<aa[month])
{a = year;
b = month;
c = day+1;
}
}
System.out.println("Next date
is:"+a+"-"+b+"-"+c);
}
else System.out.println("Wrong Format");
}
public static void
main(String[] args) {
Scanner LJY = new Scanner(System.in);
Main ljy = new Main();
int year = LJY.nextInt();
int month = LJY.nextInt();
int day = LJY.nextInt();
ljy.nextDate(year,month,day);
}
}
分析:此题比第一次作业的第七题多了一个类的定义与使用的知识点。难度有所提升。
第二次作业第五题:
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:年-月-日”
第三次作业第二题
7-2 定义日期类 (28 分)
定义一个类Date,包含三个私有属性年(year)、月(month)、日(day),均为整型数,其中:年份的合法取值范围为[1900,2000] ,月份合法取值范围为[1,12] ,日期合法取值范围为[1,31] 。 注意:不允许使用Java中和日期相关的类和方法,
否则按0分处理。
分析:类的定义与使用。
第三次作业第三题
7-3 一元多项式求导(类设计) (50 分)
编写程序性,实现对简单多项式的导函数进行求解。
输入格式:
在一行内输入一个待计算导函数的表达式,以回车符结束。
输出格式:
- 如果输入表达式不符合上述表达式基本规则,则输出“Wrong Format”。
- 如果输入合法,则在一行内正常输出该表达式的导函数,注意以下几点: 结果不需要排序,也不需要化简;
- 当某一项为“0”时,则该项不需要显示,但如果整个导函数结果为“0”时,则显示为“0”;
- 当输出结果第一项系数符号为“+”时,不输出“+”;
- 当指数符号为“+”时,不输出“+”;
- 当指数值为“0”时,则不需要输出“x^0”,只需要输出其系数即可。
输出格式见输入输出示例。
分析:需使用正则表达式。进行设计。
1.作业目标 使用类与对象编写程序对简单多项式的导函数进行求解。 2.作业要求 2.1 业务背景 (1)相关概念说明 ⚫ 带符号整数:前导不为 0 的带符号整数,如果是正号,可以省略,例如 -2,、+23、34442409 等。 ⚫ 幂函数:由自变量 x(只支持小写)和指数组成,指数为一个带符号整 数,如 x^-2、x^+25。当指数为 1 时,可以省略指数,如 x。 ⚫ 项:具体包括变量项和常数项。 ➢ 变量项是指带有系数的幂函数,如 2*x^2、-1*x^12; ✓ 系数为 1 时的时候,可以省略系数或表示为正号开头的形式,如 x^-2; ✓ 系数为-1 时的时候,可以表示为符号开头的形式,如-x^3。 ➢ 常数项包含一个带符号整数,例如:233。 ⚫ 表达式:由加法和减法运算符连接若干项组成,如:-1+x^20-x^-6。注 意,表达式中空串不属于合法的表达式,另外,系数与指数均不能为 0。 ⚫ 空白字符:在本次作业中,空白字符仅限于空格。 ⚫ 此外,带符号整数内不允许出现空白字符,其他位置均可以存在空白字 符。 (2)求导算法 求导是数学计算中的一个计算方法,它的定义是:当自变量的增量趋于零时, 因变量的增量与自变量之商的极限。 在本次作业中,我们要对输入的多项式进行求导计算,并输出它的导函数。 本次作业可能用到的导函数公式为: 当 f(x)=a(a 为常数)时,𝑓′(𝑥)=0 当 f(x)=𝑎𝑥𝑏时,𝑓′(𝑥)=𝑎b𝑥𝑏-1 例如: 当 f(x)=2𝑥6+6𝑥4+200 时,𝑓′(𝑥)=12𝑥5+24𝑥3 输入 2*x^6+6*x^4+200,输出为:12*x^5+24*x^3。 2.2 程序功能需求 (1)实现功能 ⚫ 判定输入表达式是否为正确的表达式; ⚫ 若输入为正确表达式,则计算其导函数并按要求输出。 (2)输入输出规则 ①输入规则 在一行内输入一个待计算导函数的表达式,以回车符结束。②输出规则 ⚫ 如果输入表达式不符合上述表达式基本规则,则输出“WrongFormat”。 ⚫ 如果输入合法,则在一行内正常输出该表达式的导函数,注意以下几点: ➢ 结果不需要排序,也不需要化简; ➢ 当某一项为“0”时,则该项不需要显示,但如果整个导函数结果为“0”时,则 显示为“0”; ➢ 当输出结果第一项系数符号为“+”时,不输出“+”; ➢ 当指数符号为“+”时,不输出“+”; ➢ 当指数值为“0”时,则不需要输出“x^0”,只需要输出其系数即可。 输出格式见输入输出示例。 3.作业内容和成果物 3.1 作业内容 程序源码。 3.2 提交内容 在 PTA 系统中提交程序源码进行测试。 4.作业要求和限制 4.1 输入输出示例 输入示例 1: -2*x^-2+5*x^12-4*x+12 输出示例 1: 4*x^-3+60*x^11-4 输入示例 2: 2*x^6-0*x^7+5 输出示例 2: Wrong Format 输入示例 3: x^-5+6*x^7-1200*x^-1000+54468799958488*x^-925546 输出示例 3: -5*x^-6+42*x^6+1200000*x^-1001-50413379926378734448*x^-925547 输入、输出字符编码采用 utf-8 格式,例如,逗号为英文半角字符“,”,而非 中文全角字符“,”。 4.2 设计要求 (1)参考类结构如下图所示(仅供参考)。 (2)题目中涉及到表达式正确性的校验建议均采用正则表达式来完成。 (3)编程时务必考虑面向对象中的封装性本题目中的应用。 4.4 测试准则 PTA5.其他规定 (1)文档中粗体字体部分为强制要求。 (2)无效作业,以下三种情况视为无效作业。 1)程序不能编译和运行; 2)无法通过任何一个可以输出正常结果的公共测试案例; 3)测试程序无法识别。
(3)踩坑心得
题目必须自己写,不可以在网上借鉴他人的代码。要独立思考,自己写出代码,这样自己的编程水平才会有所提高。而不是一直原地踏步!
(4)改进建议
以后编程代码得掌握良好的注释习惯。
就是能掌握正确的程序设计技巧,使程序具有良好的可读性,可修改性,可维护性。结构性程序设计方法是目前程序设计的主流之一。
程序设计采用自顶向下,逐步细化,功能模块化的方法,就是将实际问题一步步的分解成有层次又相互独立的子任务,直至变成一个个功能简单,明确,又相互独立的模块。
使程序结构清晰,层次分明,个基本结构互相独立,方便阅读和修改以后程序得有好的注释习惯
1.缩进良好,结构清晰,没有过多嵌套
2.变量名,空间名,类名简单易懂,见名知意。
3.有一些必要注释
4.符合思维习惯,不为追求字符的简洁而过多使用奇怪的,复杂的运算符。
5.模块化。
(5)总结
通过对三次题目集的训练和综合性总结,我学到了类的定义,了解了正则表达式。并了解了其的作用。
在计算机科学中,是指一个用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串。在很多文本编辑器或其他工具里,正则表达式通常被用来检索和/或替换那些符合某个模式的文本内容。许多程序设计语言都支持利用正则表达式进行字符串操作。例如,在Perl中就内建了一个功能强大的正则表达式引擎。正则表达式这个概念最初是由Unix中的工具软件(例如sed和grep)普及开的。正则表达式通常缩写成“regex”,单数有regexp、regex,复数有regexps、regexes、regexen。
正则表达式的特点是:
1. 灵活性、逻辑性和功能性非常强;
2. 可以迅速地用极简单的方式达到字符串的复杂控制。
3. 对于刚接触的人来说,比较晦涩难懂。
由于正则表达式主要应用对象是文本,因此它在各种文本编辑器场合都有应用,小到著名编辑器EditPlus,大到Microsoft Word、Visual Studio等大型编辑器,都可以使用正则表达式来处理文本内容。
因此掌握正则表达式十分的关键!以后程序的开发都大多数离不开进行相应的校验。
但是没有掌握好这个知识点。回去得好好用功。
浙公网安备 33010602011771号