面向对象程序设计第二次大作业心得

  第二次大作业还是比较简单的,主要考察对字符串的各种处理,例如切割,字符串转化为double型等等,由于代码量较小不用类封装也比较简单明了
 
题目集二 7-1
7-1 字母-数字转换
作者 蔡轲
单位 南昌航空大学

输入一个由英文字母组成的字符串(大小写均可),将所有英文字母转换成它们在字母表中的序号,例如:“AbbcD”转换为“12234”。

输入格式:

由英文字母组成的字符串(大小写均可)。例如:“AbbcD”
若包含非英文字母,视为非法输入。

输出格式:

所有英文字母转换成它们在字母表中的序号,例如:“12234”。
非法输入输出"Wrong Format".

输入样例:

在这里给出一组输入。例如:

AbbcD

输出样例:

在这里给出相应的输出。例如:

12234

输入样例1:

在这里给出一组输入。例如:

AFOPI

输出样例1:

在这里给出相应的输出。例如:

1615169

输入样例2:

在这里给出一组输入。例如:

c3u

输出样例2:

在这里给出相应的输出。例如:

Wrong Format

 

思路:
  设置一个boole变量用于记录是否出现非法输入,第一次遍历检索非法字符,如果出现非a-z且非A-Z的字符则输出"Wrong Format"
,如果字符串中并未出现非法字符则进行
第二次遍历,对每个字符进行转化为数字

  核心代码如下:
 
for(int a=0;a<str.length()&&!n;a++)
        {
            if((str.charAt(a)>='a'&&str.charAt(a)<='z')||(str.charAt(a)>='A'&&str.charAt(a)<='Z')) ;
            else n=true;
        }//for
        if(n) System.out.println("Wrong Format");
        else {
            for(int a=0;a<str.length();a++)
            if(str.charAt(a)>='a'&&str.charAt(a)<='z') System.out.print(str.charAt(a)-'a'+1);//小写字母转化为数字
            else System.out.print(str.charAt(a)-'A'+1);//大写字母转化为数字
        }//else

  7-1是较为简单的,没有逻辑错误并不会导致错误

题目集二 7-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

  
思路:
  通过观察数据流性质,不难看出当数据第一次检索到0时代表后续8位为有效数据,8位有效数据接收完毕后还有一位奇偶校验位和一位结束位"1",所以在我们通过变量a遍历数据流时,可以设置一个int型i变量去标记发现的"0"起始位,同时通过取反boole变量m设置为接收模式(接收模式下检索到"0"不会认为是新起始位,而是会当成数据暂存入数组中),当m处于接收模式且当前遍历字符的下标a减去起始位i的值小于8(接收数据小于八位)时,将所收到数据存入字符数组,当接收完八位数据后,通过取反m取消接收模式,第九位时检测奇偶校验位是否合法,第十位时检测结束位是否合法.
   核心遍历代码如下:
 1 for(int a=0;a<str.length();a++)
 2             {
 3                 if(!m&&str.charAt(a)=='0'){//开始接收数据
 4                     m=!m;//数据接收模式
 5                     n++;//有效数据+1
 6                     i=a;//标记起始位置
 7                 }//if检测到起始位0
 8                 else if(m&&a-i<9){//有效数据未满八位,继续接收
 9                     num[a-i-1]=str.charAt(a);
10                     if(str.charAt(a)=='1') j=!j;
11                 }//数据接收
12                 else if(n!=0&&a-i==9){
13                     if(str.charAt(a)=='1'&&j==true) j=true;
14                     else if(str.charAt(a)=='0'&&j==false) j=true;
15                     else j=false;
16                 }//奇偶校验
17                 else if(n!=0&&a-i==10){
18                     if(str.charAt(a)=='0') k=false;
19                     System.out.printf("%d:",n);
20                     if(k&&!j) System.out.println("parity check error");
21                     else if(!k) System.out.println("validate error");
22                     else{
23                             for(int p=0;p<7;p++)
24                             System.out.print(num[p]);
25                             System.out.println(num[7]);
26                         }//else
27                     m=false;
28                     k=true;
29                     j=true;
30                 }//结束标志符校验 和输出
31       }
 
   7-2是比较简单的,代码运行一般不会遇到问题
 

 

 
  题目集二 7-3
7-3 String的格式判断与内容提取
作者 蔡轲
单位 南昌航空大学

学校学生学号格式定义如下:
2位年级号+2位学院号+2位班级号+2位序号,如19041103,
编写程序处理用全院学生学号连接起来的长字符串,学院编号为20,包括17、18、19、20四个年级,请从字符串中提取特定两个班级202017班、202061班同学的学号后四位输出,输出编号之间用空格分隔,不换行。
注意:需要排除非法输入。

输入格式:

全院学生学号组成的长字符串(学号之间无分隔)
学号格式定义如下:
2位年级号+2位学院号+2位班级号+2位序号,如19041103,

输出格式:

特定两个班级202017班、202061班同学的学号后四位
如:1701 6103 1704

输入样例1:

在这里给出一组输入。例如:

2020610120201702202051132020110320201706

输出样例1:

在这里给出相应的输出。例如:

6101 1702 1706

输入样例2(第一个学号多输入一位):

在这里给出一组输入。例如:

20206100120201702202051132020110320201706

输出样例2:

在这里给出相应的输出。例如:

Wrong Format

输入样例3(第一个学号少输入一位数字):

在这里给出一组输入。例如:

202061120201702202051132020110320201706

输出样例3:

在这里给出相应的输出。例如:

Wrong Format

输入样例3(学号之间有空格):

在这里给出一组输入。例如:

2020610120201702 202051132020110320201706

输出样例3:

在这里给出相应的输出。例如:

Wrong

思路:
  建一个一维字符数组s用于存所需的四位有效数据,声明一个int变量num记录所需班级的合法数据的数量,声明两个boolea类n和m用于记录当前数据是否合法,当前数据是否是
程序所需要的数据,第一次循环遍历依次检测年纪号,学院编号,班级号是否合法以及是否为所需数据,然后存在数组num中,如果n和m都记录为不合法则num不会变,数据会一直覆盖
s[4*num]到s[4*num+3],直到合法且所需数据出现然后num++,继续往数组s后面存.
  核心遍历以及输出代码如下:

 1 // 遍历处理操作代码
 2        if(str.length()%8!=0) System.out.print("Wrong Format");//长度不对报错
 3         else {
 4             for(int a=0;a<str.length()&&n;a=a+2)
 5             {
 6                 if(a%8==0&&str.charAt(a)=='1') {
 7                     if(str.charAt(a+1)!='7'&&str.charAt(a+1)!='8'&&str.charAt(a+1)!='9') n=false;
 8                     else m=false;
 9                 }//if年级号为17 18 19
10                 else if(a%8==0&&str.charAt(a)=='2') {
11                     if(str.charAt(a+1)!='0') n=false;
12                 }//if年纪号为20
13                 else if(a%8==0) n=false;
14                 
15                 if(a%8==2&&str.charAt(a)=='2') {
16                     if(str.charAt(a+1)!='0') n=false;
17                 }//检测学院编号是否合法
18                 else if(a%8==2&&str.charAt(a)!='2') n=false;
19                 
20                 
21                 if(a%8==4&&str.charAt(a)>='0'&&str.charAt(a)<='9'){
22                     if(str.charAt(a+1)>='0'&&str.charAt(a+1)<='9'){
23                         if(str.charAt(a)=='1'&&str.charAt(a+1)=='7'){
24                             s[num*4+0]='1';
25                             s[num*4+1]='7';
26                         }//17班
27                         else if(str.charAt(a)=='6'&&str.charAt(a+1)=='1'){
28                             s[num*4+0]='6';
29                             s[num*4+1]='1';
30                         }//61班
31                         else m=false;
32                     }//if 第五位是数字
33                     else n=false;
34                 }//检测班级号是否合法
35                 else if(a%8==4) n=false;
36 
37                 
38                 if(a%8==6&&str.charAt(a)>='0'&&str.charAt(a)<='9'){
39                     s[num*4+2]=str.charAt(a);
40                     if(str.charAt(a+1)>='0'&&str.charAt(a+1)<='9')
41                     s[num*4+3]=str.charAt(a+1);
42                     else n=false;
43                     if(m) num++;
44                     else m=true;
45                 }//学号位检测
46                 else if(a%8==6) n=false;
47             }//for遍历
 1 //输出操作代码
 2             if(n==false) System.out.print("Wrong Format");
 3             else {
 4                 if(num>=1)
 5                 {
 6                 for(int z=0;z<num-1;z++)
 7                 {
 8                     System.out.print(s[z*4+0]);
 9                     System.out.print(s[z*4+1]);
10                     System.out.print(s[z*4+2]);
11                     System.out.print(s[z*4+3]);
12                     System.out.print(" ");
13                 }
14                 System.out.print(s[(num-1)*4+0]);
15                 System.out.print(s[(num-1)*4+1]);
16                 System.out.print(s[(num-1)*4+2]);
17                 System.out.print(s[(num-1)*4+3]);
18                 }//if
19             }//输出
20             
21         }//else

  注意审题,因为一位学生有8位信息,注意看所需信息和对应的位置,看清楚要求在继续往后编程,本体代码量也算比较少的,滤清思路在继续往后写会很快,不会遇到什么问题.

心得总结

  通过这次实验完善了对字符串的各种处理,不过因为代码量较少的原因使得没有封装好各个函数和类,使得main函数内部比较臃肿,这钟习惯使得我在后续几次大作业吃了很多苦头,所以希望看到这盘博客的学弟学妹同学们一定要养成封装好各个功能函数和类的好习惯,不然工程量大代码量大就会很难编

 

posted @ 2022-10-01 12:26  北顾Jeffrey  阅读(138)  评论(0)    收藏  举报