nchu-software-oop-2022-2

7-1 字母-数字转换
分数 11  作者 蔡轲  单位 南昌航空大学

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

输入格式:

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

输出格式:

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

输入样例:

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

AbbcD
 

输出样例:

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

12234
 

输入样例1:

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

AFOPI
 

输出样例1:

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

1615169
 

输入样例2:

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

c3u
 

输出样例2:

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

Wrong Format

在Java的字符串类中有两个特别的函数,可以将字符串里面的字符全部变成大写或者小写字母,分别是String.toUpperCase()和Srting.toLowerCase()。将输入字符串全部统一大小写后即可逐一字符判定。但是和C语言不同的是在Java中是不能直接访问字符串中的元素的,如果需要访问Java中的每一个位置的字符需要使用String.charAt(i)来访问。此题只需要判断各个字符是否合法,输出可以按照String.charAt(i)-'A'+1或者String.charAt(i)-'a'+1输出即可。

for(int i=0;i<s.length();i++)
        {
            if((s.charAt(i)<'A'||s.charAt(i)>'Z')){
                System.out.print("Wrong Format");
                return;
            }
        }
完整代码如下
import java.util.Scanner;
public class Main{
    
    public static void main(String[] args){
        Scanner input = new Scanner(System.in);
        String str = input.nextLine();
//         非法输入检测
        for(int i=0;i<str.length();i++){
            if(str.charAt(i)<65||str.charAt(i)>122||(str.charAt(i)>90&&str.charAt(i)<97)){
                System.out.print("Wrong Format");
                return;
            }
        }
//         转化为数字并输出
        for(int i=0;i<str.length();i++){
            if(str.charAt(i)>=65&&str.charAt(i)<=90){
                System.out.print(str.charAt(i)-64);
            }else{
                System.out.print(str.charAt(i)-96);
            }
            
        }
        
    }
}

 

 
7-2 串口字符解析
分数 40  作者 蔡轲  单位 南昌航空大学

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

这题大致思路是先判断输入的数据是否大于11位,如果小于11位直接输出"null data"即可。接下来就是分组,11位数据为一组,但是并不是每隔11位就是一组,在发送完一组数据后需要去判断下一个起始位'0'的位置,从该位置继续向后走的11位满足条件的才是下一组。如何去定位下一个起始位,我的想法是使用一个while循环去寻找,即while(s.charAt(i++)=='1'&&i<s.length()); 跳出循环的条件是找到起始位'0'或者已经超出字符串长度。所以跳出循环后我们需要再判定一次,如果此时跳出循环的情况是已经走完字符串的长度,并且还没有输出过一个数据我们就必须输出"null data"。因为这种情况就和输入样例3的情况是一样的。因为跳出循环的条件只有两个,现在只剩下找到起始位'0'的情况,找到了起始位'0'后只需要对后面8位数据逐字符判断,记录1的个数。最后我们先判定结束符是否为'1',如果不为'1'直接输出“validate error”。只有当结束符为'0'时我们才需要考虑奇偶校验位的情况,奇偶校验的效果就是判断前面8位有效数据中'1'的个数,如果'1'的个数为奇数个则奇偶校验位置0,同理如果'1'的个数为偶数个则奇偶校验位置1。所以如果1的个数对2取余和奇偶校验位一定不相等的。

完整代码如下

import java.util.Scanner;

public class Main{
    public static void main (String[] args){
        Scanner input = new Scanner(System.in);
        String str = input.nextLine();
        //没有达到最低有效位数
        if(str.length()<11){
            System.out.print("null data");
            return;
        }
        //假如全是1,正则表达式判断
        if(str.matches("^[1]*$")){
            System.out.print("null data");
            return;
        }
        int n=1,m=0;
        for(int i=0;i<str.length();){
//             剩余位数不足11位
            if(i+10>str.length()){
                return;
            }
            if(str.charAt(i)=='0'){
//                 检测到0作为起始位
                int count=0;//1的奇偶计数
                int j=i+1;
                for(;j<i+10;j++){
                    if(str.charAt(j)=='1'){
                        count++;
                    }
                }
                if(str.charAt(j)=='0'){
//                         结束位为0
                    if(m==0){
                            System.out.print(n+":"+"validate error");
                            m++;
                        }else{
                            System.out.print("\n"+n+":"+"validate error");
                        }
                        n++;
                }else   if(str.charAt(j)=='1'){
//                     结束位为1
                    if(count%2==1){
//                         奇偶校验为1
                        if(m==0){
                            System.out.print(n+":"+str.substring(i+1,i+9));
                            m++;
                        }else{
                            System.out.print("\n"+n+":"+str.substring(i+1,i+9));
                        }
                        n++;
                    }else   if(count%2==0){
//                         奇偶校验为0
                        if(m==0){
                        System.out.print(n+":"+"parity check error");
                        m++;
                    }else{
                        System.out.print("\n"+n+":"+"parity check error");
                    }
                    n++;
                    }
                }
                i+=11;
            }else{
                i++;
            }
    }
}
}

 

7-3 String的格式判断与内容提取
分数 10  作者 蔡轲  单位 南昌航空大学

学校学生学号格式定义如下:
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 Format

这题我最开始想了一个简单粗暴的方法,将数组长度对8取余是否等于0,判断输入是否合法。因为如果学号多输入和少输入一个数字以及多打了空格都会使得数组长度对8取余不等于0。实际上事后我反应过来,我这种判定条件还是不太完善,如果用户输入学号少了一位数据,但是他在中间多打了一个空格就可以通过合法判定。因为测试点中并没有这种情况,我才侥幸通过。其余按照格式判定即可,先判定学院后,再判定班级。分组循环即可。

完整代码如下:
import java.util.Scanner;

public class Main{
    
    public static void main(String[] args){
        Scanner input = new Scanner(System.in);
//         学院编号为20,包括17、18、19、20四个年级
        String str;
        str = input.nextLine();
//         非0-9数字判断
        if(!str.matches("^[0-9]*$")){
            System.out.print("Wrong Format");
            return;
        }
//         学号位数不对
        if(str.length()%8!=0){
            System.out.print("Wrong Format");
            return;
        }
        int n=0;
        for(int i=0;i<str.length();i+=8){
            if(str.substring(i,i+6).equals("202017")||
               str.substring(i,i+6).equals("202061")){
                if(n==0){
                    System.out.print(str.substring(i+4,i+8));
                }else{
                    System.out.print(" "+str.substring(i+4,i+8));
                    
                }
                n++;
            }
        }
    }
}

 

 
posted @ 2022-10-02 16:20  给你根树枝打BOSS  阅读(67)  评论(0)    收藏  举报