第一阶段小结

前五周小结:

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”格式返回日期值

  

应用程序共测试三个功能:

  1. 求下n天
  2. 求前n天
  3. 求两个日期相差的天数

注意:严禁使用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以及随机数的生成。

 

  第二次实验写的是羊过河的问题。

 

 

 

 

 

 

 

 

 

 

     

     

 

 

 

 

 

 

    

 

posted @ 2022-04-03 22:00  全宇宙最大的混子  阅读(32)  评论(0)    收藏  举报