第一阶段小结
前五周小结:
PTA作业:
1.题目集一7-2 日期类设计 (30 分)
参考题目集二中和日期相关的程序,设计一个类DateUtil,该类有三个私有属性year、month、day(均为整型数),其中,year∈[1820,2020] ,month∈[1,12] ,day∈[1,31] , 除了创建该类的构造方法、属性的getter及setter方法外,需要编写如下方法:
public boolean checkInputValidity();//检测输入的年、月、日是否合法 public boolean isLeapYear(int year);//判断year是否为闰年 public DateUtil getNextNDays(int n);//取得year-month-day的下n天日期 public DateUtil getPreviousNDays(int n);//取得year-month-day的前n天日期 public boolean compareDates(DateUtil date);//比较当前日期与date的大小(先后) public boolean equalTwoDates(DateUtil date);//判断两个日期是否相等 public int getDaysofDates(DateUtil date);//求当前日期与date之间相差的天数 public String showDate();//以“year-month-day”格式返回日期值
应用程序共测试三个功能:
- 求下n天
- 求前n天
- 求两个日期相差的天数
注意:严禁使用Java中提供的任何与日期相关的类与方法,并提交完整源码,包括主类及方法(已提供,不需修改)
程序主方法如下:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int year = 0;
int month = 0;
int day = 0;
int choice = input.nextInt();
if (choice == 1) { // test getNextNDays method
int m = 0;
year = Integer.parseInt(input.next());
month = Integer.parseInt(input.next());
day = Integer.parseInt(input.next());
DateUtil date = new DateUtil(year, month, day);
if (!date.checkInputValidity()) {
System.out.println("Wrong Format");
System.exit(0);
}
m = input.nextInt();
if (m < 0) {
System.out.println("Wrong Format");
System.exit(0);
}
System.out.print(date.getYear() + "-" + date.getMonth() + "-" + date.getDay() + " next " + m + " days is:");
System.out.println(date.getNextNDays(m).showDate());
} else if (choice == 2) { // test getPreviousNDays method
int n = 0;
year = Integer.parseInt(input.next());
month = Integer.parseInt(input.next());
day = Integer.parseInt(input.next());
DateUtil date = new DateUtil(year, month, day);
if (!date.checkInputValidity()) {
System.out.println("Wrong Format");
System.exit(0);
}
n = input.nextInt();
if (n < 0) {
System.out.println("Wrong Format");
System.exit(0);
}
System.out.print(
date.getYear() + "-" + date.getMonth() + "-" + date.getDay() + " previous " + n + " days is:");
System.out.println(date.getPreviousNDays(n).showDate());
} else if (choice == 3) { //test getDaysofDates method
year = Integer.parseInt(input.next());
month = Integer.parseInt(input.next());
day = Integer.parseInt(input.next());
int anotherYear = Integer.parseInt(input.next());
int anotherMonth = Integer.parseInt(input.next());
int anotherDay = Integer.parseInt(input.next());
DateUtil fromDate = new DateUtil(year, month, day);
DateUtil toDate = new DateUtil(anotherYear, anotherMonth, anotherDay);
if (fromDate.checkInputValidity() && toDate.checkInputValidity()) {
System.out.println("The days between " + fromDate.showDate() +
" and " + toDate.showDate() + " are:"
+ fromDate.getDaysofDates(toDate));
} else {
System.out.println("Wrong Format");
System.exit(0);
}
}
else{
System.out.println("Wrong Format");
System.exit(0);
}
}
}
输入格式:
有三种输入方式(以输入的第一个数字划分[1,3]):
- 1 year month day n //测试输入日期的下n天
- 2 year month day n //测试输入日期的前n天
- 3 year1 month1 day1 year2 month2 day2 //测试两个日期之间相差的天数
输出格式:
- 当输入有误时,输出格式如下:
Wrong Format - 当第一个数字为1且输入均有效,输出格式如下:
year1-month1-day1 next n days is:year2-month2-day2 - 当第一个数字为2且输入均有效,输出格式如下:
year1-month1-day1 previous n days is:year2-month2-day2 - 当第一个数字为3且输入均有效,输出格式如下:
The days between year1-month1-day1 and year2-month2-day2 are:值
输入样例1:
在这里给出一组输入。例如:
3 2014 2 14 2020 6 14
输出样例1:
在这里给出相应的输出。例如:
The days between 2014-2-14 and 2020-6-14 are:2312
输入样例2:
在这里给出一组输入。例如:
2 1834 2 17 7821
输出样例2:
在这里给出相应的输出。例如:
1834-2-17 previous 7821 days is:1812-9-19
输入样例3:
在这里给出一组输入。例如:
1 1999 3 28 6543
输出样例3:
在这里给出相应的输出。例如:
1999-3-28 next 6543 days is:2017-2-24
输入样例4:
在这里给出一组输入。例如:
0 2000 5 12 30
输出样例4:
在这里给出相应的输出。例如:
Wrong Format
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int year = 0;
int month = 0;
int day = 0;
int choice = input.nextInt();
if (choice == 1) { // test getNextNDays method
int m = 0;
year = Integer.parseInt(input.next());
month = Integer.parseInt(input.next());
day = Integer.parseInt(input.next());
DateUtil date = new DateUtil(year, month, day);
if (!date.checkInputValidity()) {
System.out.println("Wrong Format");
System.exit(0);
}
m = input.nextInt();
if (m < 0) {
System.out.println("Wrong Format");
System.exit(0);
}
System.out.print(date.getYear() + "-" + date.getMonth() + "-" + date.getday() + " next " + m + " days is:");
System.out.println(date.getNextNDays(m).showDate());
} else if (choice == 2) { // test getPreviousNDays method
int n = 0;
year = Integer.parseInt(input.next());
month = Integer.parseInt(input.next());
day = Integer.parseInt(input.next());
DateUtil date = new DateUtil(year, month, day);
if (!date.checkInputValidity()) {
System.out.println("Wrong Format");
System.exit(0);
}
n = input.nextInt();
if (n < 0) {
System.out.println("Wrong Format");
System.exit(0);
}
System.out.print(
date.getYear() + "-" + date.getMonth() + "-" + date.getday() + " previous " + n + " days is:");
System.out.println(date.getPreviousNDays(n).showDate());
} else if (choice == 3) { //test getDaysofDates method
year = Integer.parseInt(input.next());
month = Integer.parseInt(input.next());
day = Integer.parseInt(input.next());
int anotherYear = Integer.parseInt(input.next());
int anotherMonth = Integer.parseInt(input.next());
int anotherDay = Integer.parseInt(input.next());
DateUtil fromDate = new DateUtil(year, month, day);
DateUtil toDate = new DateUtil(anotherYear, anotherMonth, anotherDay);
if (fromDate.checkInputValidity() && toDate.checkInputValidity()) {
System.out.println("The days between " + fromDate.showDate() +
" and " + toDate.showDate() + " are:"
+ fromDate.getDaysofDates(toDate));
} else {
System.out.println("Wrong Format");
System.exit(0);
}
}
else{
System.out.println("Wrong Format");
System.exit(0);
}
}
}
class DateUtil {
private static final DateUtil DateUtil = null;
int yes[]= {31,29,31,30,31,30,31,31,30,31,30,31};
int not[]= {31,28,31,30,31,30,31,31,30,31,30,31};
int yes1[]= {31,31,29,31,30,31,30,31,31,30,31,30};
int not1[]= {31,31,28,31,30,31,30,31,31,30,31,30};
private int year;
private int month;
private int day;
public DateUtil(int year2, int month2, int day2) {
year=year2;
day=day2;
month=month2;
}
public int getYear() {
return year;
}
public void setYear(int year) {
this.year = year;
}
public int getMonth() {
return month;
}
public void setMonth(int month) {
this.month = month;
}
public void setDay(int day) {
this.day = day;
}
public int getday(){
return day;
}
public boolean isLeapYear(int year){
if(year % 4==0 && year % 100!=0)
return true;
else if(year % 400 == 0)
return true;
else
return false;
}
public boolean checkInputValidity(){
if(year<=2020&&year>=1820&&month<=12&&month>=1) {
if(isLeapYear(year)) {
if(day>0&&day<=yes[month-1])
return true;
}
else {
if(day>0&&day<=not[month-1])
return true;
}
}
return false;
}
public DateUtil getNextNDays(int n) {
DateUtil date = new DateUtil(year, month, day);
while(n>0) {
date.day++;
n--;
if(isLeapYear(date.year)){
if(date.day>yes[date.month-1]){
date.day=1;
date.month++;
}
if(date.month==13){
date.year++;
date.month=1;
}
}
else{
if(date.day>not[date.month-1]){
date.day=1;
date.month++;
}
if(date.month==13){
date.year++;
date.month=1;
}
}
}
return date;
}
public DateUtil getPreviousNDays(int n) {
DateUtil date = new DateUtil(year, month, day);
while(n!=0){
n--;date.day--;
if(isLeapYear(date.year)){
if(date.day<1){
date.day=yes1[date.month-1];
date.month--;
}
if(date.month==0){
date.year--;
date.month=12;
date.day=31;
}
}
else{
if(date.day<1){
date.day=not1[date.month-1];
date.month--;
}
if(date.month==0){
date.year--;
date.month=12;
date.day=31;
}
}
}
return date;
}
public boolean compareDates(DateUtil date) {
if(year>date.year||year==date.year&&month>date.month||year==date.year&&month==date.month&&date.day>day) {
return true;
}
else {
return false;
}
}
public boolean equalTwoDates(DateUtil date) {
if(year==date.year&&month==date.month&&date.day==day) {
return true;
}
else {
return false;
}
}
public int getDaysofDates(DateUtil date) {
int sum = 0,days1=0;
if(!equalTwoDates(date)) {
if(!compareDates(date)) {
while(date.year>year) {
if(isLeapYear(year))
sum=sum+366;
else
sum=sum+365;
year++;
}
while(date.month>month) {
if(isLeapYear(year))
sum=sum+yes[month-1];
else
sum=sum+not[month-1];
month++;
}
sum=sum-day+date.day;
}
else {
while(year>date.year) {
if(isLeapYear(date.year))
sum=sum+366;
else
sum=sum+365;
date.year++;
}
while(date.month<month) {
if(isLeapYear(date.year))
sum=sum+yes[date.month-1];
else
sum=sum+not[date.month-1];
date.month++;
}
sum=sum-date.day+day;
}
}
return sum;
}
public String showDate() {
return year+"-"+month+"-"+day;
}
}
此次题目集后面的题目附带了类图,在这题的难度上面增加了一些类之间的联系。
2.题目集三 7-2 串口字符解析
RS232是串口常用的通信协议,在异步通信模式下,串口可以一次发送5~8位数据,收发双方之间没有数据发送时线路维持高电平,相当于接收方持续收到数据“1”(称为空闲位),发送方有数据发送时,会在有效数据(5~8位,具体位数由通信双方提前设置)前加上1位起始位“0”,在有效数据之后加上1位可选的奇偶校验位和1位结束位“1”。请编写程序,模拟串口接收处理程序,注:假定有效数据是8位,奇偶校验位采用奇校验。
输入格式:
由0、1组成的二进制数据流。例如:11110111010111111001001101111111011111111101111
输出格式:
过滤掉空闲、起始、结束以及奇偶校验位之后的数据,数据之前加上序号和英文冒号。
如有多个数据,每个数据单独一行显示。
若数据不足11位或者输入数据全1没有起始位,则输出"null data",
若某个数据的结束符不为1,则输出“validate error”。
若某个数据奇偶校验错误,则输出“parity check error”。
若数据结束符和奇偶校验均不合格,输出“validate error”。
如:11011或11111111111111111。
例如:
1:11101011
2:01001101
3:validate error
输入样例:
在这里给出一组输入。例如:
1111011101011111111111
输出样例:
在这里给出相应的输出。例如:
1:11101011
输入样例1:
在这里给出一组输入。例如:
11110111010111111001001101111111011111111101111
输出样例1:
在这里给出相应的输出。例如:
1:11101011
2:01001101
3:validate error
输入样例2:
输入数据不足11位。例如:
111101
输出样例2:
在这里给出相应的输出。例如:
null data
输入样例3:
输入数据全1没有起始位。例如:
1111111111111111
输出样例3:
在这里给出相应的输出。例如:
null data
输入样例4:
输入数据全1没有起始位。例如:
111101110101111111101111111101
输出样例4:
在这里给出相应的输出。例如:
1:11101011
2:parity check error
输入样例5:
两组数据结束符和奇偶校验均不合格。例如:
111000000000000011100000000000000
输出样例5:
在这里给出相应的输出。例如:
1:validate error
2:validate error
输入样例6:
两组数据,数据之间无空闲位。例如:
1110000000001100111000001
输出样例6:
在这里给出相应的输出。例如:
1:00000000
2:01110000
度量分析
圈复杂度分析使用 SourceMonitor 软件

主要代码:
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); String str = scanner.nextLine(); int flag = 0,i,j,x=1; if(str.length()<11) { System.out.println("null data"); return; } else { for(i=0;i<str.length();i++) { if(str.substring(i,i+1).equals("0")) { flag = 1; break; } } } if(flag==1) { for(i=0;i<str.length();i++) { if(str.substring(i, i+1).equals("0")) { int y=0; for(j=i+1;j<i+9;j++) { if(str.substring(j,j+1).equals("1")) y++; } if(str.substring(i+10,i+11).equals("1")) { if((str.substring(i+9,i+10).equals("1")&&y%2==1)||(str.substring(i+9,i+10).equals("0")&&y%2==0)) { System.out.println(x+":"+"parity check error"); x++; i+=10; } else{ System.out.println(x+":"+str.substring(i+1,i+9)); x++; i+=10; } } else{ System.out.println(x+":"+"validate error"); x++; i+=10; } } } } else System.out.println("null data"); } }
雨刷器作业:
第一次的是用三种语言(C语言 , JAVA , Python)写的,用的方法是最简单的循环,一个类就写完了。
第二次以后单纯的Java编写的,补充了封装性。

第三次作业加入了面向对象的七大法则之一的Demeter法则。
第四次作业加入了MVC模式,且尝试嵌入单例模式。

第五次作业采用面向对象技术,再次合理设计实体类、业务(控制)类、接口类、各个类的抽象父类以及相互的关系,务必符合SRP(Single Responsibility Principe,单一职责原则)、Demeter法则(Law of Demeter)、“开-闭”原则、里氏代换原则、依赖倒转原则以及合成复用原则(强制要求)

实验作业:
第一次实验学会了Eclips如何Dbug以及随机数的生成。
第二次实验写的是羊过河的问题。
浙公网安备 33010602011771号