题目集4~6的总结性Blog


(1)前言

在这三次作业中,主要考察了正则表达式以及类间的关系。在这三次作业中,相比之下,第四次以及第五次作业的难度明显高于第六次作业,题量与难度相较于以往的作业也有明显提升,前两次作业奋斗到截止时间也仍然没有得到满分(呜呜我是废物),这让我意识到自己在程序设计时考虑的不充分以及自己代码编写能力的不足,希望自己在后续的学习中能再接再厉吧


(2)设计与分析

  ①题目集4(7-2)、题目集5(7-4)两种日期类聚合设计的优劣比较

首先先放代码和类图吧

题目集4(7-2)

  1 import java.util.Scanner;
2
3 public class Main {
4 public static void main(String[] args) {
5 Scanner input = new Scanner(System.in);
6 int choice = input.nextInt();
7 int d,m,y;
8 int n;
9 switch (choice){
10 case 1: //测试输入日期的下n天
11 y = input.nextInt();
12 m = input.nextInt();
13 d = input.nextInt();
14 n = input.nextInt();
15 DateUtil date1 = new DateUtil(d,m,y);
16
17 if(date1.checkInputValidity()&& n>0) {
18 date1 = date1.getNextNDays(n);
19 System.out.println(date1.showDate());
20 }
21 else
22 System.out.print("Wrong Format");
23
24 break;
25 case 2://测试输入日期的前n天
26 y = input.nextInt();
27 m = input.nextInt();
28 d = input.nextInt();
29 n = input.nextInt();
30 DateUtil date2 = new DateUtil(d,m,y);
31
32 if(date2.checkInputValidity()&& n>0) {
33 date2 = date2.getPreviousDays(n);
34 System.out.println(date2.showDate());
35 }
36 else
37 System.out.print("Wrong Format");
38 break;
39
40 case 3://测试两个日期之间相差的天数
41 y = input.nextInt();
42 m = input.nextInt();
43 d = input.nextInt();
44 DateUtil date3 = new DateUtil(d,m,y);
45
46 y = input.nextInt();
47 m = input.nextInt();
48 d = input.nextInt();
49 DateUtil date4 = new DateUtil(d,m,y);
50
51 int c;
52 if(date3.checkInputValidity() && date4.checkInputValidity()){
53 c= date3.getDaysofDates(date4);
54 System.out.println(c);
55 }
56 else
57 System.out.print("Wrong Format");
58 break;
59
60 default:
61 System.out.print("Wrong Format");
62
63 }//选择功能主题
64 }
65 }
66
67
68 class DateUtil{
69 private Day day;
70
71 public DateUtil(){
72
73 }
74
75 public DateUtil(int d,int m,int y) {
76 this.day = new Day(y,m,d);
77 }
78
79 public boolean checkInputValidity(){
80 return this.getDay().validate() && this.getDay().getMonth().validate() && this.getDay().getMonth().getYear().validate();
81 }//校验数据合法性
82
83 public boolean compareDates(DateUtil date){
84 if(this.getDay().getMonth().getYear().getValue() >date.getDay().getMonth().getYear().getValue()) {
85 return true;
86 } else if(this.getDay().getMonth().getYear().getValue() == date.getDay().getMonth().getYear().getValue()&&this.getDay().getMonth().getValue() > date.getDay().getMonth().getValue()) {
87 return true;
88 } else return this.getDay().getMonth().getYear().getValue() == date.getDay().getMonth().getYear().getValue() && this.getDay().getMonth().getValue() == date.getDay().getMonth().getValue() && this.getDay().getValue() > date.getDay().getValue();
89
90 }//比较两个日期的大小,大则返回true,小为false
91
92 public boolean equalTwoDates(DateUtil date){
93 return this.getDay().getValue() == date.getDay().getValue() && this.getDay().getMonth().getValue() == date.getDay().getMonth().getValue() && this.getDay().getMonth().getYear().getValue() == date.getDay().getMonth().getYear().getValue();
94 }//两个日期是否相等
95
96 public String showDate(){
97 return this.getDay().getMonth().getYear().getValue()+"-"+this.getDay().getMonth().getValue()+"-"+this.getDay().getValue();
98 }//日期值格式化
99
100 public DateUtil getNextNDays(int n){//求下n天
101 for(int i =0; i<n;i++){
102 this.getDay().dayIncrement();
103 }
104 return this;
105 }
106
107 public DateUtil getPreviousDays(long n){//求前n天
108 for(int i =0; i<n;i++){
109 this.getDay().dayReduction();
110 }
111 return this;
112 }
113
114 public int getDaysofDates(DateUtil date){//求两个日期之间的天数
115 int count=0;
116 if(!this.compareDates(date)){
117 while(!this.equalTwoDates(date)){
118 this.getDay().dayIncrement();
119 count += 1;
120 }
121 }
122 else{
123 while(!this.equalTwoDates(date)){
124 this.getDay().dayReduction();
125 count += 1;
126 }
127 }
128
129 return count;
130 }
131
132 public Day getDay() {
133 return day;
134 }
135
136 }
137
138 class Day{
139 private int value;
140 private Month month;
141 int[] mon_minnum={0,31,28,31,30,31,30,31,31,30,31,30,31};//非闰年
142 int[] mon_maxnum={0,31,29,31,30,31,30,31,31,30,31,30,31};//闰年
143
144 public Day(){
145
146 }
147
148 public Day(int yearValue,int monthValue,int dayValue) {
149 setValue(dayValue);
150 this.month = new Month(yearValue,monthValue);
151 }
152
153 public void resetMin(){
154 this.value = 1;
155 this.getMonth().monthIncrement();
156 }//日期复位(1)
157
158 public void resetMax(){
159 this.getMonth().monthReduction();
160 if(this.getMonth().getYear().isLeapYear())
161 this.value = mon_maxnum[this.getMonth().getValue()];
162 else
163 this.value = mon_minnum[this.getMonth().getValue()];
164 }//日期复位最大值
165
166 public boolean validate(){
167 if(this.getMonth().validate()) {
168 if (this.getMonth().getYear().isLeapYear()) {
169 return this.value > 0 && getValue() <= mon_maxnum[this.getMonth().getValue()];
170 } else {
171 return this.value > 0 && getValue() <= mon_minnum[this.getMonth().getValue()];
172 }
173 }
174 return false;
175 }//校验数据合法性
176
177 public void dayIncrement(){
178 this.value += 1;
179 if(this.getMonth().getYear().isLeapYear()){
180 if(this.value > mon_maxnum[this.getMonth().getValue()]){
181 this.resetMin();
182 }
183 }
184 else{
185 if(this.value > mon_minnum[this.getMonth().getValue()]){
186 this.resetMin();
187 }
188 }
189
190 }//日期+1
191
192 public void dayReduction(){
193 this.value -= 1;
194 if(value <1){
195 this.resetMax();
196 }
197
198 }//日期-1
199
200 public int getValue() {
201 return value;
202 }
203
204 public void setValue(int value) {
205 this.value = value;
206 }
207
208 public Month getMonth() {
209 return month;
210 }
211
212
213 }//日类
214
215 class Month{
216 private int value;
217 private Year year;
218
219 public Month(){
220
221 }
222
223 public Month(int yearValue,int monthValue) {
224 setValue(monthValue);
225 this.year = new Year(yearValue);
226 }
227 public void resetMin(){//月份复位(1)
228 this.value = 1;
229 this.getYear().yearIncrement();
230 }
231
232 public void resetMax(){//月份复位最大值
233 this.value = 12;
234 this.getYear().yearReduction();
235 }
236
237 public boolean validate(){
238 return this.getValue()>=1 && this.getValue() <=12;
239 }//校验数据合法性
240
241 public int getValue() {
242 return value;
243 }
244
245 public void setValue(int value) {
246 this.value = value;
247 }
248
249 public Year getYear() {
250 return year;
251 }
252
253 public void monthIncrement(){
254 this.value += 1;
255 if(value > 12){
256 this.resetMin();
257 }
258 }//月份+1
259 public void monthReduction(){
260 this.value -= 1;
261 if(value <1){
262 this.resetMax();
263 }
264 }//月份-1
265
266 }//月类
267
268 class Year{
269 private int value;
270
271 public Year(){
272
273 }
274 public Year(int value) {
275 setValue(value);
276 }
277
278 public boolean isLeapYear(){
279 return (getValue() % 4 == 0 && getValue() % 100 != 0) || getValue() % 400 == 0;
280 }//判断是否为闰年
281
282
283 public boolean validate(){//校验数据合法性
284 return this.getValue() >= 1900 && this.getValue() <= 2050;
285 }
286
287 public void yearIncrement(){
288 this.value++;
289 }//年份+1
290
291 public void yearReduction(){
292 this.value--;
293 }//年份-1
294
295 public int getValue() {
296 return value;
297 }
298
299 public void setValue(int value) {
300 this.value = value;
301 }
302 }//年类

点击这里查看代码

题目集5(7-4)

import java.util.Scanner;

public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in); int choice = input.nextInt();
int d,m,y;
int n;
switch (choice){
case 1: //测试输入日期的后n天
y = input.nextInt();
m = input.nextInt();
d = input.nextInt();
n = input.nextInt();
DateUtil date1 = new DateUtil(d,m,y); if(date1.checkInputValidity()) {
System.out.print(date1.showDate()+" next " +n +" days is:");
date1 = date1.getNextNDays(n);
System.out.println(date1.showDate());
}
else
System.out.print("Wrong Format"); break;
case 2://测试输入日期的前n天
y = input.nextInt();
m = input.nextInt();
d = input.nextInt();
n = input.nextInt();
DateUtil date2 = new DateUtil(d,m,y); if(date2.checkInputValidity()) {
System.out.print(date2.showDate()+" previous "+n+" days is:");
date2 = date2.getPreviousDays(n);
System.out.println(date2.showDate());
}
else
System.out.print("Wrong Format");
break; case 3://测试两个日期之间相差的天数
y = input.nextInt();
m = input.nextInt();
d = input.nextInt();
DateUtil date3 = new DateUtil(d,m,y); y = input.nextInt();
m = input.nextInt();
d = input.nextInt();
DateUtil date4 = new DateUtil(d,m,y); int c;
if(date3.checkInputValidity() && date4.checkInputValidity()){
System.out.print("The days between "+date3.showDate());
c= date3.getDaysofDates(date4);
System.out.println(" and "+date4.showDate()+" are:"+c);
}
else
System.out.print("Wrong Format");
break; default:
System.out.print("Wrong Format"); }//选择功能主题
}
} class DateUtil{
private Day day;
private Month month;
private Year year;
int[] mon_minnum={0,31,28,31,30,31,30,31,31,30,31,30,31};//非闰年
int[] mon_maxnum={0,31,29,31,30,31,30,31,31,30,31,30,31};//闰年 public DateUtil(){ } public DateUtil(int d,int m,int y) {
this.day = new Day(d);
this.month = new Month(m);
this.year = new Year(y);
} public boolean checkInputValidity(){
return valiDay() && getMonth().validate() && getYear().validate(); }//校验数据合法性 public boolean compareDates(DateUtil date){
if(this.getYear().getValue() >date.getYear().getValue()) {
return true;
} else if(this.getYear().getValue() == date.getYear().getValue()&&this.getMonth().getValue() > date.getMonth().getValue()) {
return true;
} else return this.getYear().getValue() == date.getYear().getValue() && this.getMonth().getValue() == date.getMonth().getValue() && this.getDay().getValue() > date.getDay().getValue(); }//比较两个日期的大小,大则返回true,小为false public boolean equalTwoDates(DateUtil date){
return this.getDay().getValue() == date.getDay().getValue() && this.getMonth().getValue() == date.getMonth().getValue() && this.getYear().getValue() == date.getYear().getValue();
}//两个日期是否相等 public String showDate(){
return this.getYear().getValue()+"-"+this.getMonth().getValue()+"-"+this.getDay().getValue();
}//日期值格式化 public DateUtil getNextNDays(long n){//求下n天
for(int i =0; i<n;i++){
this.getDay().dayIncrement();
if(getYear().isLeapYear()){
if(getDay().getValue()>mon_maxnum[getMonth().getValue()]){
this.setDayMin();
if(getMonth().getValue()>12){
getMonth().resetMin();
getYear().yearIncrement();
}
}
}
else{
if(getDay().getValue()>mon_minnum[getMonth().getValue()]){
this.setDayMin();
if(getMonth().getValue()>12){
getMonth().resetMin();
getYear().yearIncrement();
}
}
}
}
return this;
} public DateUtil getPreviousDays(long n){//求前n天
for(int i =0; i<n;i++){
this.getDay().dayReduction();
if(getDay().getValue()<1){
setDayMax();
} }
return this;
} public int getDaysofDates(DateUtil date){//求两个日期之间的天数
int count=0;
if(!this.compareDates(date)){
while(!this.equalTwoDates(date)){
this.getDay().dayIncrement();
if(getYear().isLeapYear()){
if(getDay().getValue()>mon_maxnum[getMonth().getValue()]){
this.setDayMin();
if(getMonth().getValue()>12){
getMonth().resetMin();
getYear().yearIncrement();
}
}
}
else{
if(getDay().getValue()>mon_minnum[getMonth().getValue()]){
this.setDayMin();
if(getMonth().getValue()>12){
getMonth().resetMin();
getYear().yearIncrement();
}
}
}
count += 1; }
}
else{
while(!this.equalTwoDates(date)){
this.getDay().dayReduction();
if(getDay().getValue()<1){
setDayMax();
}
count += 1;
}
} return count;
} public void setDayMin(){
getDay().setValue(1);
this.getMonth().monthIncrement();
}//日复位 public void setDayMax(){
this.getMonth().monthReduction();
if(getMonth().getValue()<1){
getYear().yearReduction();
getMonth().resetMax();
}
if(this.getYear().isLeapYear())
getDay().setValue(mon_maxnum[this.getMonth().getValue()]);
else
getDay().setValue(mon_minnum[this.getMonth().getValue()]); }//日复位 public boolean valiDay(){
if(this.getMonth().validate()) {
if (this.getYear().isLeapYear()) {
return getDay().getValue() > 0 && getDay().getValue() <= mon_maxnum[this.getMonth().getValue()];
} else {
return getDay().getValue() > 0 && getDay().getValue() <= mon_minnum[this.getMonth().getValue()];
}
}
return false; } public Day getDay() {
return day;
} public void setDay(Day day) {
this.day = day;
} public Month getMonth() {
return month;
} public void setMonth(Month month) {
this.month = month;
} public Year getYear() {
return year;
} public void setYear(Year year) {
this.year = year;
}
} class Day{
private int value; public Day(){ } public Day(int value) {
setValue(value);
} public void dayIncrement(){
this.value += 1;
}//日期+1 public void dayReduction(){
this.value -= 1; }//日期-1 public int getValue() {
return value;
} public void setValue(int value) {
this.value = value;
} }//日类 class Month{
private int value; public Month(){ } public Month(int value) {
setValue(value);
}
public void resetMin(){//月份复位(1)
this.value = 1;
} public void resetMax(){//月份复位最大值
this.value = 12;
} public boolean validate(){
return this.getValue()>=1 && this.getValue() <=12;
}//校验数据合法性 public int getValue() {
return value;
} public void setValue(int value) {
this.value = value;
} public void monthIncrement(){
this.value += 1;
}//月份+1
public void monthReduction(){
this.value -= 1; }//月份-1 }//月类 class Year{
private int value; public Year(){ }
public Year(int value) {
setValue(value);
} public boolean isLeapYear(){
return (getValue() % 4 == 0 && getValue() % 100 != 0) || getValue() % 400 == 0;
}//判断是否为闰年 public boolean validate(){//校验数据合法性
return this.getValue() >= 1820 && this.getValue() <= 2020;
} public void yearIncrement(){
this.value++;
}//年份+1 public void yearReduction(){
this.value--;
}//年份-1 public int getValue() {
return value;
} public void setValue(int value) {
this.value = value;
}
}//年类

点击这里查看代码

  可以从代码和类图里看出,除了7-4中增加了一个计算天数的方法外,我的程序设计完全参考了题目要求中的类图设计(但我好像把聚合理解错了,但结果是好的)。在我查阅资料时,我曾看见过相关题目的解决思路,也曾一度让我想过要在计算两年之间天数时用一系列公式去计算该年的剩余天数。但在重新研究类图后我认为,类图中所提供的各种方法完全足够完成题目所要求的功能,所以我选择了放弃了手动计算,利用设计好的方法进行自动计算两年之间的天数,如下所示

 public int getDaysofDates(DateUtil date){//求两个日期之间的天数
int count=0;
if(!this.compareDates(date)){
while(!this.equalTwoDates(date)){
this.getDay().dayIncrement();
count += 1;
}
}
else{
while(!this.equalTwoDates(date)){
this.getDay().dayReduction();
count += 1;
}
}

求两个日期之间的天数

  


如果让我评价一下这两种类图设计思路的话,我认为各有各的好处

  7-2的方式可以在代码编写中快速且清晰的直接调用对应类的用法,基于是年月日逐个传递参数,所以可以将年月日进位的方法直接写入各自的类中,在DateUtil类中可以直接利用简单的循环对比日期去快速的获得两天之间的天数,年月日进位也交给了各自对应的类去处理。

  7-4的方式我还是保持了直接利用简单的循环对比日期去快速的获得两天之间的天数的思路,相比之下由于聚合设计的影响难以直接实现,举个例子,无法在Day类中直接调用Year类中对应的数值,所以只能将各种对应的进位方法写入DateUtil类中,导致该类中的代码看起来相对比较冗杂难懂,但相对的,Day类,Month类以及Year类的设计就可以最大的简化,仅仅只负责单纯的数值+1,而不用负责考虑该月的天数,该年是否为闰年,将所有的职责交给了DateUtil类


  复杂度分析:

7-2


7-4

可以从性能分析图中看到,这两个代码的圈复杂度不出意外的十分感人。

但如果结合代码不考虑主函数中三种不同操作导致的过高复杂度,程序整体的复杂度还是很客观的低于7,在程序设计时尽可能的做到一个方法完成一项职责,避免一个方法多个用法导致圈复杂度起飞


②题目集4(7-3)、题目集6(7-5、7-6)三种渐进式图形继承设计的思路与技术运用(封装、继承、多态、接口等)

老规矩先放代码和类图

7-3

  1 import java.util.Scanner;
2 import static java.lang.Math.*;
3
4
5 public class Main {
6 public static void main(String[] args) {
7 Scanner input = new Scanner(System.in);
8 int shapeType = input.nextInt();
9 switch (shapeType){
10 case 1:
11 double R1 = input.nextDouble();
12 if(R1<0)
13 System.out.println("Wrong Format");
14 else {
15 Circle c = new Circle();
16 c.setRadius(R1);
17 System.out.printf("Circle's area:%.2f%n", c.getArea());
18 }
19 break;
20 case 2:
21 double W1,L1;
22 W1 = input.nextDouble();
23 L1 = input.nextDouble();
24
25 if(W1<0||L1<0)
26 System.out.println("Wrong Format");
27 else {
28 Rectangle r = new Rectangle();
29 r.setWidth(W1);
30 r.setLength(L1);
31 System.out.printf("Rectangle's area:%.2f%n", r.getArea());
32 }
33
34 case 3:
35 double R2;
36 R2 = input.nextDouble();
37
38 if(R2<0)
39 System.out.println("Wrong Format");
40 else{
41 Ball b = new Ball();
42 b.setRadius(R2);
43 System.out.printf("Ball's surface area:%.2f%n",b.getArea());
44 System.out.printf("Ball's volume:%.2f%n",b.getVolume());
45 }
46 break;
47 case 4:
48 double W2,L2,H;
49 W2 = input.nextDouble();
50 L2 = input.nextDouble();
51 H = input.nextDouble();
52 if(W2 < 0||L2 < 0||H < 0)
53 System.out.println("Wrong Format");
54 else{
55 Box bx = new Box();
56 bx.setHeight(H);
57 bx.setLength(L2);
58 bx.setWidth(W2);
59
60 System.out.printf("Box's surface area:%.2f%n",bx.getArea());
61 System.out.printf("Box's volume:%.2f%n",bx.getVolume());
62 }
63
64 break;
65 default:
66 System.out.println("Wrong Format");
67
68 }
69 }
70 }
71
72
73 class Shape{
74 public Shape() {
75 System.out.println("Constructing Shape");
76 }
77
78 public double getArea(){
79 return 0.0;
80 }
81
82
83
84
85 }
86
87 class Circle extends Shape{
88 public Circle(){
89 System.out.println("Constructing Circle");
90 }
91
92 private double radius;
93
94 public double getRadius() {
95 return radius;
96 }
97
98 public void setRadius(double radius) {
99 this.radius = radius;
100 }
101
102 public double getArea(){
103 return PI * this.getRadius() * this.getRadius();
104 }
105 }
106
107 class Rectangle extends Shape{
108 public Rectangle(){
109 System.out.println("Constructing Rectangle");
110 }
111
112 private double width;
113 private double length;
114
115 public double getWidth() {
116 return width;
117 }
118
119 public void setWidth(double width) {
120 this.width = width;
121 }
122
123 public double getLength() {
124 return length;
125 }
126
127 public void setLength(double length) {
128 this.length = length;
129 }
130
131 public double getArea(){
132 return this.getWidth() * this.getLength();
133 }
134
135 }
136
137 class Ball extends Circle{
138 public Ball(){
139 System.out.println("Constructing Ball");
140 }
141
142 public double getArea(){
143 return 4.0 * super.getArea();
144 }
145
146 public double getVolume(){
147 return PI * pow(super.getRadius(),3)* 4.0/ 3.0;
148 }
149 }
150
151 class Box extends Rectangle{
152 public Box(){
153 System.out.println("Constructing Box");
154 }
155
156 private double height;
157
158 public double getHeight() {
159 return height;
160 }
161
162 public void setHeight(double height) {
163 this.height = height;
164 }
165
166 public double getArea(){
167 double w = super.getWidth();
168 double l = super.getLength();
169 double h = this.getHeight();
170
171 return 2 * (w * l + w * h + l * h);
172 }
173
174 public double getVolume(){
175 return this.getHeight() * super.getWidth() * super.getLength();
176 }
177 }

7-5

  1 import java.util.*;
2 public class Main {
3 public static void main(String[] args) {
4 Scanner input = new Scanner(System.in);
5 int a = input.nextInt();
6 int b = input.nextInt();
7 int c = input.nextInt();
8 ArrayList<Shape> shape = new ArrayList<>();
9 double totalArea = 0;
10
11 if(a < 0|| b < 0|| c < 0){
12 System.out.println("Wrong Format");
13 System.exit(0);
14 }
15
16
17
18
19 for(int i = 0; i<a;i++){
20 double r = input.nextDouble();
21 shape.add(new Circle(r));
22 }
23
24 for(int i = 0; i<b ; i++){
25 double w = input.nextDouble();
26 double l = input.nextDouble();
27 shape.add(new Rectangle(w,l));
28 }
29
30 for(int i = 0;i<c;i++){
31 double s1 = input.nextDouble();
32 double s2 = input.nextDouble();
33 double s3 = input.nextDouble();
34 shape.add(new Triangle(s1,s2,s3));
35 }
36
37
38 for (Shape value : shape) {
39 if (!value.validate()) {
40 System.out.println("Wrong Format");
41 System.exit(0);
42 } else
43 totalArea += value.getArea();
44 }
45
46 System.out.println("Original area:");
47 for(int i = 0 ; i<a+b+c;i++){
48 System.out.printf("%.2f ",shape.get(i).getArea());
49 }
50
51 System.out.printf("\nSum of area:%.2f\n",totalArea);
52
53 System.out.println("Sorted area:");
54
55 Shape temp;
56
57 for(int i = 0; i < shape.size()-1;i++){
58 for(int j = shape.size()-1; j>i;j--){
59 if(shape.get(j).getArea()<shape.get(j-1).getArea()) {
60 temp = shape.get(j);
61 shape.set(j, shape.get(j - 1));
62 shape.set(j - 1, temp);
63 }
64 }
65 }
66
67 for(int i = 0 ; i<a+b+c;i++){
68 System.out.printf("%.2f ",shape.get(i).getArea());
69 }
70
71 System.out.printf("\nSum of area:%.2f\n",totalArea);
72
73
74
75
76
77 }
78 }
79
80
81 abstract class Shape{
82 public abstract double getArea();
83
84 public abstract boolean validate();
85
86
87 }
88
89
90 class Circle extends Shape{
91 private double radius;
92
93 Circle(double radius){
94 setRadius(radius);
95 }
96
97 public double getArea(){
98 return Math.PI * radius * radius;
99 }
100
101 public boolean validate(){
102 return getRadius() >0;
103 }
104
105
106
107
108
109 public double getRadius() {
110 return radius;
111 }
112
113 public void setRadius(double radius) {
114 this.radius = radius;
115 }
116 }
117
118 class Rectangle extends Shape{
119 private double width;
120 private double length;
121
122 Rectangle(double width,double length){
123 setWidth(width);
124 setLength(length);
125 }
126
127 public double getArea(){
128 return getLength() * getWidth();
129 }
130
131 public boolean validate(){
132 return (getWidth() >0 && getLength()>0);
133 }
134
135
136
137 public double getWidth() {
138 return width;
139 }
140
141 public void setWidth(double width) {
142 this.width = width;
143 }
144
145 public double getLength() {
146 return length;
147 }
148
149 public void setLength(double length) {
150 this.length = length;
151 }
152 }
153
154 class Triangle extends Shape{
155 private double side1;
156 private double side2;
157 private double side3;
158
159
160 Triangle(double side1,double side2,double side3){
161 setSide1(side1);
162 setSide2(side2);
163 setSide3(side3);
164 }
165
166
167 public double getArea(){
168 double p=(side1+side2+side3)/2;
169 return Math.sqrt(p*(p-side1)*(p-side2)*(p-side3));
170 }
171
172 public boolean validate(){
173 if(side1+side2<=side3||side1+side3<=side2||side2+side3<=side1)
174 {
175 return false;
176 }
177 return !(side1 - side2 >= side3) && !(side1 - side3 >= side2) && !(side2 - side3 >= side1);
178 }
179
180
181
182 public void setSide1(double side1) {
183 this.side1 = side1;
184 }
185
186
187 public void setSide2(double side2) {
188 this.side2 = side2;
189 }
190
191
192
193 public void setSide3(double side3) {
194 this.side3 = side3;
195 }
196 }

7-6

 1 import java.util.*;
2
3 public class Main {
4 public static void main(String[] args) {
5 Scanner input = new Scanner(System.in);
6 double radius,width,length;
7 radius = input.nextDouble();
8 width = input.nextDouble();
9 length = input.nextDouble();
10 Rectangle rec = new Rectangle(width,length);
11 Circle cir = new Circle(radius);
12 if(rec.getLength() <= 0||rec.getWidth() <= 0 || cir.getRadius() <=0){
13 System.out.println("Wrong Format");
14 System.exit(0);
15 }
16 else{
17 System.out.printf("%.2f\n",cir.getArea());
18 System.out.printf("%.2f",rec.getArea());
19 }
20
21
22 }
23 }
24
25 class Rectangle implements GetArea{
26 private double width;
27 private double length;
28
29 Rectangle(){}
30
31 Rectangle(double width,double length){
32 setWidth(width);
33 setLength(length);
34 }
35
36 public double getArea(){
37 return width * length;
38 }
39
40 public double getWidth() {
41 return width;
42 }
43
44 public void setWidth(double width) {
45 this.width = width;
46 }
47
48 public double getLength() {
49 return length;
50 }
51
52 public void setLength(double length) {
53 this.length = length;
54 }
55 }
56
57 class Circle implements GetArea{
58 private double radius;
59 Circle(){}
60
61 Circle(double radius){
62 setRadius(radius);
63 }
64
65 public double getArea(){
66 return Math.PI * radius * radius;
67 }
68
69 public double getRadius() {
70 return radius;
71 }
72
73 public void setRadius(double radius) {
74 this.radius = radius;
75 }
76 }
77
78 interface GetArea{
79 double getArea();
80 }


  在7-3中,主要考察了继承的使用以及简单多态的应用,通过对父类方法的继承,并在子类中定义同名的方法,对父类的方法进行重写,并将对应的方法继承给子类的子类,以达成多态的使用效果

  在7-5中,我尝试使用了抽象类的方式完成需求,通过父类的抽象,并在子类中对对应的抽象方法进行定义,以此更加便捷的实现多态

  在7-6中,我第一次尝试使用了接口,在查阅资料后得知,接口默认为一个抽象类,其中所有的方法会被默认为一个抽象方法,并且该接口无法实例化,仅用于类似抽象类的重写以完成各种不同的需求


复杂度分析

7-3

7-5

7-6


  如上图,我在构思该题目的解决方案时,主要目的是完成java的封装、继承、多态、接口等,并未刻意对代码的圈复杂度进行过多的思考与优化,故代码的圈复杂度达到了10+


③对三次题目集中用到的正则表达式技术的分析总结

  在这三次题目集中有使用到正则表达式的题目有

第4次作业 7-1 水文数据校验及处理  第5次作业7-4 统计Java程序中关键词的出现次数  第6次作业7-1至7-4

在这些题目中可以很明显的感觉到前二者的难度远超第六次作业的四题,第6次作业的题目相较于前者,更偏向于基础运用,而前者则属于实际需求应用,这一点也可以很清楚的从相应的正则表达式中得以体现

4-7-1

String regex1="(((([1-9])|([1-9][0-9])|([1-9][0-9]{2})|([1-9][0-9]{3})/((([13578]|1[02])/([1-9]|[12][0-9]|3[01]))|(([469]|11)/([1-9]|[12][0-9]|30))|(2/([1-9]|[1][0-9]|2[0-8])))))|(((([1-9][0-9])(0[48]|[2468][048]|[13579][26]))|(([48]|[2468][048]|[3579][26])00))/2/29)) ((([02468])|(1[02468])|(2[02])):00)";//时间合法
String regex2="([1-9][0-9]{0,2}(\\.[0-9]{1,3})?)";//水位、流量合法
String regex3="[1-9]\\.\\d{2}";//开度合法

4-7-1

5-7-4

sb.append(s.replaceAll("//.*", "").replaceAll("\".*\"", "").replaceAll("\\[.*]","").replaceAll("=null","")).append(" ");//不接受注释内容,不接受引号内内容,并用空格分割代码
s = input.nextLine(); }
code = sb.toString().replaceAll("/\\*\\s*.*\\s*\\*/", " "); if (code.isEmpty()) {//未输入源码
System.out.println("Wrong Format");
}
else {
for (String value : key) {//比较关键词,并存入map中
int n = 0;
Pattern pattern = Pattern.compile("\\b" + value + "\\b");//编译关键词样板

5-7-4

6-7-4

Pattern pattern = Pattern.compile("2020(1[1-7]|61|7[1-3]|8[1-2])(0[1-9]|[1-3][0-9]|40)");
Matcher matcher = pattern.matcher(s);

6-7-4

  通过这三次作业对正则表达式的相关使用,以及上一次BLOG中所遇见的正则表达式题目,使我能够相对熟练的使用正则表达式去匹配特定的字符串/数字,并通过matcher等相关方法去对输入数据进行查找匹配,以此完成各类复杂的需求


④题目集5(7-4)中Java集合框架应用的分析总结

首先是安排上代码

 1 import java.util.*;
2 import java.util.regex.Matcher;
3 import java.util.regex.Pattern;
4
5 public class Main {
6 public static void main(String[] args) {
7 Scanner input = new Scanner(System.in);
8 StringBuilder sb = new StringBuilder();
9 String code;
10 Map<String, Integer> map = new TreeMap<>();
11 String[] key = {"abstract", "assert", "boolean", "break", "byte", "case", "catch",
12 "char", "class", "const", "continue", "default", "do", "double", "else",
13 "enum", "extends", "false", "final", "finally", "float",
14 "for", "goto", "if", "implements", "import", "instanceof",
15 "int", "interface", "long", "native", "new", "null", "package",
16 "private", "protected", "public", "return", "short", "static",
17 "strictfp", "super", "switch", "synchronized", "this", "throw",
18 "throws", "transient", "true", "try", "void", "volatile", "while"};
19
20 String s = input.nextLine();
21 while (!s.equals("exit")) {
22 if (s.length() == 0) {//不接受空行
23 s = input.nextLine();
24 continue;
25 }
26
27 sb.append(s.replaceAll("//.*", "").replaceAll("\".*\"", "").replaceAll("\\[.*]","").replaceAll("=null","")).append(" ");//不接受注释内容,不接受引号内内容,并用空格分割代码
28 s = input.nextLine();
29
30 }
31 code = sb.toString().replaceAll("/\\*\\s*.*\\s*\\*/", " ");
32
33 if (code.isEmpty()) {//未输入源码
34 System.out.println("Wrong Format");
35 }
36 else {
37 for (String value : key) {//比较关键词,并存入map中
38 int n = 0;
39 Pattern pattern = Pattern.compile("\\b" + value + "\\b");//编译关键词样板
40 Matcher matcher = pattern.matcher(code);
41 while (matcher.find()) {
42 n++;
43 }
44 if (n != 0) {
45 map.put(value, n);
46 }
47 }
48 }
49
50 for (String s2 : map.keySet()) {//按格式输出
51 System.out.println(map.get(s2) + "\t" + s2);
52 }
53 }
54
55
56 }

  

集合可以看作是一种容器,用来存储对象信息。所有集合类都位于java.util包下,但支持多线程的集合类位于java.util.concurrent包下。

  数组与集合的区别如下:

  1)数组长度不可变化而且无法保存具有映射关系的数据;集合类用于保存数量不确定的数据,以及保存具有映射关系的数据。

  2)数组元素既可以是基本类型的值,也可以是对象;集合只能保存对象。

  Java集合类主要由两个根接口Collection和Map派生出来的,Collection派生出了三个子接口:List、Set、Queue(Java5新增的队列),因此Java集合大致也可分成List、Set、Queue、Map四种接口体系,(注意:Map不是Collection的子接口)。

  其中List代表了有序可重复集合,可直接根据元素的索引来访问;Set代表无序不可重复集合,只能根据元素本身来访问;Queue是队列集合;Map代表的是存储key-value对的集合,可根据元素的key来访问value。

  在本题中,参考解题报告中的要求,我选择了使用Map接口用于记录Matcher所匹配到的java关键字,但在本次作业前我并未对此进行过相关学习,在查阅资料后得知Map接口采用键值对Map<K,V>的存储方式,保存具有映射关系的数据,因此,Map集合里保存两组值,一组值用于保存Map里的key,另外一组值用于保存Map里的value,key和value可以是任意引用类型的数据。key值不允许重复,可以为null。如果添加key-value对时Map中已经有重复的key,则新添加的value会覆盖该key原来对应的value。常用实现类有HashMap、LinkedHashMap、TreeMap等。

  在实际操作中,我选择了使用TreeMap来记录数据,由于TreeMap是SortedMap的实现类,是一个红黑树的数据结构,每个key-value对作为红黑树的一个节点。TreeMap存储key-value对时,需要根据key对节点进行排序,所以可以保证记录关键字的顺序。并通过.put()及.get()等相关方法对集合进行存取。


  (3)踩坑心得

  怎么说呢,在这几次作业里不仅仅是用到了上课时老师教过的各类知识,还在题目中要求了我们使用各种从未听说过的接口、方法(如Map),这让我意识到了上课所教授的内容远远不足以支持我后续的学习与工作,这也更意味着自己查阅资料的重要性,知识是一片汪洋,永远也没有枯竭的那一天,只能说学无止境吧。


  (4)总结

  通过这三次作业的“洗礼”,我深刻意识到自己是个菜鸡,好几道题目不了了之,由于过于依赖搜索引擎去寻找思路,陷入他人想法的思维定势中,最后的查重结果也让我不是很能接受,在OOP学习花费的时间越多,越能意识到这一种编程思想不是那么容易掌握的。各种编程的基本准则也难以在我的代码体现出来,希望自己在后续的学习中能够精进自己的技术,学会各种全新的知识,查重率也有能不要再飘黄了

题目集4~6的总结性Blog的更多相关文章

  1. 转:Java面试题集(51-70) http://blog.csdn.net/jackfrued/article/details/17403101

    Java面试题集(51-70) Java程序员面试题集(51-70) http://blog.csdn.net/jackfrued/article/details/17403101 摘要:这一部分主要 ...

  2. Java高级程序员(5年左右)面试的题目集

    Java高级程序员(5年左右)面试的题目集 https://blog.csdn.net/fangqun663775/article/details/73614850?utm_source=blogxg ...

  3. KMP,Trie,AC自动机题目集

    字符串算法并不多,KMP,trie,AC自动机就是其中几个最经典的.字符串的题目灵活多变也有许多套路,需要多做题才能体会.这里收集了许多前辈的题目做个集合,方便自己回忆. KMP题目:https:// ...

  4. PTA7~9题目集总结与归纳

    前言: 总结三次题目集的知识点.题量.难度等情况. 目录: 题目集7(7-1).(7-2)两道题目的递进式设计分析总结 题目集8和题目集9两道ATM机仿真题目的设计思路分析总结 一. 题目集7(7-1 ...

  5. PTA4-6题目集总结与归纳

    前言: 继上篇blog所写的几种日期的求法,这次是把那几种聚合起来,即日期类的聚合设计.除下这类,一种是图形继承设计的3种变化,还有一种是3次对正则表达式的应用.当然,作为一个菜鸟,还是无法写成大佬的 ...

  6. 浙大版《C语言程序设计(第3版)》题目集 --总结

    浙大版<C语言程序设计(第3版)>题目集 此篇博客意义为总结pta上浙大版<C语言程序设计(第3版)>题目集所做题目的错误点,心得体会. 1.练习2-10 计算分段函数[1] ...

  7. PTA数据结构与算法题目集(中文) 7-43字符串关键字的散列映射 (25 分)

    PTA数据结构与算法题目集(中文)  7-43字符串关键字的散列映射 (25 分) 7-43 字符串关键字的散列映射 (25 分)   给定一系列由大写英文字母组成的字符串关键字和素数P,用移位法定义 ...

  8. PTA数据结构与算法题目集(中文) 7-42整型关键字的散列映射 (25 分)

    PTA数据结构与算法题目集(中文)  7-42整型关键字的散列映射 (25 分) 7-42 整型关键字的散列映射 (25 分)   给定一系列整型关键字和素数P,用除留余数法定义的散列函数将关键字映射 ...

  9. PTA数据结构与算法题目集(中文) 7-41PAT排名汇总 (25 分)

    PTA数据结构与算法题目集(中文)  7-41PAT排名汇总 (25 分) 7-41 PAT排名汇总 (25 分)   计算机程序设计能力考试(Programming Ability Test,简称P ...

  10. PTA数据结构与算法题目集(中文) 7-40奥运排行榜 (25 分)

    PTA数据结构与算法题目集(中文)  7-40奥运排行榜 (25 分) 7-40 奥运排行榜 (25 分)   每年奥运会各大媒体都会公布一个排行榜,但是细心的读者发现,不同国家的排行榜略有不同.比如 ...

随机推荐

  1. OpenSSL测试-SM3

    OpenSSL测试-SM3 1.使用OpenSSL的命令计算你的8位学号的摘要值(SM3),提交截图. 运行结果 2.使用OpenSSL编程对计算"你的8位学号"SM3摘要值,提交 ...

  2. unity简单物理系统

    目录 技术概述 技术详述 2D物理系统组件 刚体 碰撞器 物理材质 碰撞检测函数 在主角中的使用 移动 长跳跃与短跳跃 二段跳 攀爬(蹬墙跳) 技术使用中遇到的问题和解决过程 技术概述 物理系统,就是 ...

  3. C++和C中的输入输出总结、标准输入/标准输出/标准错误与重定向,>>、>、<、<<

    标准输入/标准输出/标准错误与重定向 0表示标准输入.1表示标准输出.2标准错误.1和2都是默认是输出到屏幕. linux中的>>.>.<.<<:这些符号是Linu ...

  4. 【vcpkg】使用vcpkg安装库

    https://blog.csdn.net/cjmqas/article/details/79282847 使用vcpkg 查看vcpkg支持的开源库列表 执行命令 .\vcpkg.exe searc ...

  5. 001. html篇之《基础内容》

    html基础内容 1. 什么是html Hypertext Markup Language 超文本标记语言 2. 基本结构 <!DOCTYPE html> <!-- 此为html5的 ...

  6. 杂:pthread_cond_timedwait导致死锁

    地球人都知道1:pthread_cond_timedwait使用时,需要对[条件]加锁.[条件]也是一种线程共享资源. 地球人都知道2:1个互斥锁不应该管理2类及以上的多线程共享资源 1+2=下面这样 ...

  7. 用有限差分估计(Finite Difference Estimate)解决地理坐标与平面像素坐标转换过程的误差造成风场粒子向量失真问题

    下载NCEP的气象场grib2数据,风场是二维的向量,包含u和v两个分量.这个用经纬度投影到像素坐标会产生误差,直接绘制效果不太对:(   通过插值计算得到风场粒子的预测数据wind = interp ...

  8. astrocut:切割fitsfile

    from astrocut import fits_cut from astropy.io import fits from astropy.coordinates import SkyCoord i ...

  9. 测试 SqlServer 数据库连接的简单办法

    1.创建一个文件, 命名为"dba.udl".  #保证后缀是.udl即可     2.双击它:     3.输入数据库地址"xxx.xxx.xxx.xxx,端口号&qu ...

  10. 解决ubuntu18环境matplotlib无法正常显示中文

    首先看看系统装了中文字体没?命令: fc-list :lang=zh 如果没安装,需要去下载或者从win复制一份到ubuntu, 在/usr/share/fonts文件夹下创建一个chinese文件夹 ...