OO题目集4~6作业总结
OO题目集4~6作业总结
1、前言
针对PTA题目集4~6作业,有如下分析:
题目集4知识点、难度、题量:
7-1:水文数据校验及处理:熟悉Java的正则表达式,使用正则表达式对测量日期进行校验;需要弄懂CheckData类、DealData类的结构等。
7-2:日期问题面向对象设计(聚合一):使用聚合对日期问题进行设计,实现求下n天、求前n天、求两个日期相差的天数三个功能要求,需要对聚合有足够的了解,才可以调用属性和对象。
7-3:图形继承:考察继承的知识点,需要熟悉父类与子类之间的关系,懂得如何调用父类的属性以及方法,知晓this、super等关键字的用法。
题目集4的难度:对于水文数据校验及处理,我感觉比较难,对于正则表达式掌握的还不够全面,题目集4主要是考察正则表达式以及对数据的处理。正则表达式的难度还是比较大的,特别是对于数据繁琐的时候,使用正则表达式有时还需要先将数据分割,再进行正则表达式的匹配。对于日期问题面向对象设计(聚合一),难度而言感觉主要是在聚合方面,对于聚合理解的还不够透彻,导致编码过程困难重重。对于图形继承,相比于7-1、7-2比较简单,了解继承的特点,使用extends进行继承属性,并重写方法。
题目集5知识点、难度、题量:
7-1:找出最长的单词-hebust:考察的知识点为分割字符串,形成字符串数组,再通过判断字符串数组中的字符串长度对最长单词进行输出。
7-2:合并两个有序数组为新的有序数组:将两个整型数组合并并升序输出。
7-3:对整型数据排序:对数据进行排序,考察三种排序方法,分别是插入排序、选择排序、冒泡排序。
7-4:统计Java程序中关键字的出现次数:接口的使用,关键字的判定,HashMap等结构的使用。
7-5:日期问题面向对象设计(聚合二):使用聚合对日期问题进行设计,实现求下n天、求前n天、求两个日期相差的天数三个功能要求,需要对聚合有足够的了解,才可以调用属性和对象。
题目集5的难度:对于7-1的题目,考察一个分割方法spilt的使用,之后进行长度检测,比较简单;对于7-2,合并有序数组,在之前的题目集1~3也写过,其实这题有很多解法,所以我也就偷懒直接用Arrays.sort的方法进行排序,相对简单;对于7-3,三种排序方法,也相对简单;对于7-4,感觉难度一下子就上来了,需要使用HashMap等结构,并且需要判定代码种的关键字,且注释不进行判别,难度很大;对于7-5,有了题目集4的聚合学习,对于聚合也有了一定的了解,这道题难度适中。
题目集6知识点、难度、题量:
7-1:正则表达式训练-QQ号校验:考察正则表达式
7-2:字符串训练-字符排序:考察ASCII值、字符排序
7-3:正则表达式训练-验证码校验:考察正则表达式
7-4:正则表达式训练-学号校验:考察正则表达式
7-5:图形继承与多态:考察ArrayList、继承和多态
7-6:实现图形接口及多态性:考察接口和多态性
题目集6的难度:题目整体比较简单,需要掌握正则表达式和ASCII值,7-5的题目考察ArrayList,有一定的难度,其他题目的难度都还好,简单或者适中。
2、设计与分析
由于篇幅限制,因此使用比较有代表性的题目代码进行分析。
①题目集4(7-2)、题目集5(7-4)两种日期类聚合设计的优劣比较
题目集4(7-2)代码如下:
1 import java.util.Scanner;
2
3 public class Main {
4
5 public static void main(String[] args) {
6 // TODO Auto-generated method stub
7 Scanner input = new Scanner(System.in);
8 int number = input.nextInt();
9 if(number == 1) {
10 int year = input.nextInt();
11 int month = input.nextInt();
12 int day = input.nextInt();
13 int n = input.nextInt();
14 DateUtil date = new DateUtil(year, month, day);
15 if (!date.checkInputValidity()||n < 0) {
16 System.out.println("Wrong Format");
17 return;
18 }
19 System.out.println(date.getNextNDays(n).showDate());
20
21 }else if(number == 2) {
22 int year = input.nextInt();
23 int month = input.nextInt();
24 int day = input.nextInt();
25 int n = input.nextInt();
26 DateUtil date = new DateUtil(year, month, day);
27 if (!date.checkInputValidity()||n < 0) {
28 System.out.println("Wrong Format");
29 return;
30 }
31 System.out.println(date.getPreviousNDays(n).showDate());
32 }else if(number == 3) {
33 int year = input.nextInt();
34 int month = input.nextInt();
35 int day = input.nextInt();
36
37 int anotherYear = input.nextInt();
38 int anotherMonth = input.nextInt();
39 int anotherDay = input.nextInt();
40
41 DateUtil fromDate = new DateUtil(year, month, day);
42 DateUtil toDate = new DateUtil(anotherYear, anotherMonth, anotherDay);
43
44 if (fromDate.checkInputValidity() && toDate.checkInputValidity()) {
45 System.out.println(fromDate.getDaysofDates(toDate));
46 } else {
47 System.out.println("Wrong Format");
48 return;
49 }
50 }else {
51 System.out.println("Wrong Format");
52 }
53 }
54
55 }
56
57 class DateUtil {
58 private Day day=new Day();
59 DateUtil(){
60
61 }
62 DateUtil(int d,int m,int y){
63 this.getDay().getMonth().getYear().setValue(d);
64 this.getDay().getMonth().setValue(m);
65 this.getDay().setValue(y);
66 }
67 public Day getDay() {
68 return day;
69 }
70 public void setDay(Day d) {
71 this.day = d;
72 }
73 public boolean checkInputValidity() {
74 int y=day.getMonth().getYear().getValue(),m=day.getMonth().getValue(),d=day.getValue();
75 if(y>2020 || y <1820 ||m<1||m>12||d>31||d<1||((isLeapYear(y)==true)&&m==2&&d>29)||((isLeapYear(y)==false)&&m==2&&d>28)||((m==4||m==6||m==9||m==11)&&d>30))
76 return false;
77 else
78 return true;
79 }
80 public boolean compareDates(DateUtil date) {
81 if(getDay().getMonth().getYear().getValue() > date.getDay().getMonth().getYear().getValue()) {
82 return true;
83 }else if(getDay().getMonth().getYear().getValue()==date.getDay().getMonth().getYear().getValue()) {
84 if(getDay().getMonth().getValue()>date.getDay().getMonth().getValue()) {
85 return true;
86 }else if(getDay().getMonth().getValue()==date.getDay().getMonth().getValue()) {
87 if(getDay().getValue()>date.getDay().getValue()) {
88 return true;
89 }else if(getDay().getValue()==date.getDay().getValue()) {
90 return true;
91 }else {
92 return false;
93 }
94 }else {
95 return false;
96 }
97 }else {
98 return false;
99 }
100 }
101 public boolean equalTwoDates(DateUtil date) {
102 if(getDay().getMonth().getYear().getValue() == date.getDay().getMonth().getYear().getValue()&&getDay().getMonth().getValue() == date.getDay().getMonth().getValue()&&getDay().getValue() == date.getDay().getValue()) {
103 return true;
104 }else {
105 return false;
106 }
107 }
108 public String showDate() {
109 return getDay().getMonth().getYear().getValue() + "-" + getDay().getMonth().getValue() + "-" + getDay().getValue();
110
111 }
112 public DateUtil getNextNDays(int n) {
113 int a=day.getMonth().getYear().getValue(),b=day.getMonth().getValue(),c=day.getValue();
114 while(n>=366){
115 if(isLeapYear(a)){
116 a++;n=n-366;
117 }
118 else{
119 a++;n=n-365;
120 }
121 }
122 for(int i=1;i<=n;i++){
123 if(b==2){
124 if(isLeapYear(a)){
125 if(c==29){
126 b++;c=1;
127 }
128 else
129 c++;
130 }
131 else{
132 if(c==28){
133 b++;c=1;
134 }
135 else
136 c++;
137 }
138 }
139 else if(b==1||b==3||b==5||b==7||b==8||b==10||b==12){
140 if(c==31){
141 if(b==12){
142 c=1;a++;b=1;
143 }
144 else{
145 b++;c=1;
146 }
147 }
148 else{
149 c++;
150 }
151 }
152 else{
153 if(c==30){
154 b++;c=1;
155 }
156 else
157 c++;
158 }
159 }
160 DateUtil D = new DateUtil(a,b,c);
161 return D;
162 }
163 public DateUtil getPreviousNDays(int n){
164 int[][] days={
165 {0,31,28,31,30,31,30,31,31,30,31,30,31},
166 {0,31,29,31,30,31,30,31,31,30,31,30,31}};
167
168 int y=day.getMonth().getYear().getValue(),m=day.getMonth().getValue(),d=day.getValue();
169
170 while(d-n<=0)
171 {
172 if(m>1)
173 {
174 m--;
175 if(isLeapYear(y))
176 d=d+days[1][m];
177 else
178 d=d+days[0][m];
179 }
180 else
181 {
182 y--;
183 m=12;
184 if(isLeapYear(y))
185 d=d+days[1][m];
186 else
187 d=d+days[0][m];
188 }
189 }
190 d=d-n;
191 DateUtil D = new DateUtil(y,m,d);
192
193 return D;
194 }
195 public int getDaysofDates(DateUtil date) {
196 int yearOne,yearTwo,monthOne,monthTwo,dayOne,dayTwo;
197 if(equalTwoDates(date) == false) {
198 if(compareDates(date) == true) {
199 yearOne = date.getDay().getMonth().getYear().getValue();
200 monthOne = date.getDay().getMonth().getValue();
201 dayOne = date.getDay().getValue();
202 yearTwo = getDay().getMonth().getYear().getValue();
203 monthTwo = getDay().getMonth().getValue();
204 dayTwo = getDay().getValue();
205 }else {
206 yearOne = getDay().getMonth().getYear().getValue();
207 monthOne = getDay().getMonth().getValue();
208 dayOne = getDay().getValue();
209 yearTwo = date.getDay().getMonth().getYear().getValue();
210 monthTwo = date.getDay().getMonth().getValue();
211 dayTwo = date.getDay().getValue();
212 }
213 int[] m={0,31,28,31,30,31,30,31,31,30,31,30,31};
214 int sumOne=0;
215 for(int i = yearOne + 1;i < yearTwo;i++) {
216 getDay().getMonth().getYear().setValue(i);
217 if(getDay().getMonth().getYear().isLeapYear()) {
218 sumOne = sumOne + 366;
219 }else {
220 sumOne = sumOne + 365;
221 }
222 }
223 getDay().getMonth().getYear().setValue(yearOne);
224 if(getDay().getMonth().getYear().isLeapYear()) {
225 m[2] = 29;
226 }
227 if(yearOne != yearTwo) {
228 sumOne = sumOne + m[monthOne] - dayOne;
229 monthOne++;
230 while(monthOne != 13) {
231 sumOne = sumOne + m[monthOne];
232 monthOne++;
233 }
234 getDay().getMonth().getYear().setValue(yearTwo);
235 if(getDay().getMonth().getYear().isLeapYear()) {
236 m[2]=29;
237 }
238 int j = 1;
239 sumOne = sumOne + dayTwo;
240 while(j != monthTwo) {
241 sumOne = sumOne + m[j];
242 j++;
243 }
244 }else {
245 getDay().getMonth().getYear().setValue(yearOne);
246 if(getDay().getMonth().getYear().isLeapYear()) {
247 m[2] = 29;
248 }else {
249 m[2] = 28;
250 }
251 if(monthOne != monthTwo) {
252 sumOne = sumOne + dayTwo + m[monthOne] - dayOne;
253 monthOne++;
254 while(monthOne != monthTwo) {
255 sumOne = sumOne + m[monthOne];
256 monthOne++;
257 }
258 }else {
259 sumOne = sumOne + dayTwo - dayOne;
260 }
261 }
262 return sumOne;
263 }else {
264 return 0;
265 }
266