面向对象程序设计第二次大作业心得
输入一个由英文字母组成的字符串(大小写均可),将所有英文字母转换成它们在字母表中的序号,例如:“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是较为简单的,没有逻辑错误并不会导致错误
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
思路:
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 }

学校学生学号格式定义如下:
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函数内部比较臃肿,这钟习惯使得我在后续几次大作业吃了很多苦头,所以希望看到这盘博客的学弟学妹同学们一定要养成封装好各个功能函数和类的好习惯,不然工程量大代码量大就会很难编

浙公网安备 33010602011771号