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

思想:先将其转化为小写字母,然后再转成数字。

代码实现:


import java.util.*;

public class Main{

     public static void main(String[] args) {
      Scanner input = new Scanner(System.in);
      String str;
      str = input.next();
      int length = str.length();

      //check
      for(int i=0;i<length;i++){
        if(str.charAt(i)<'A' || str.charAt(i)>'z'){
            System.out.println("Wrong Format");
            return;
         }
      }

      //转化为小写
      str = str.toLowerCase();

      //转数字
      for(int i=0;i<length;i++){
          System.out.printf("%d",str.charAt(i)-'a'+1);
      }
  }

}

 

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

由于对题目的考虑不深,22个测试点有9个没过。所以本题欢迎各位大佬指教,我将我的烂代码贴在下面。

import java.util.Scanner;
public class Main {
public static void main(String[] args) {
String str,shuchu="";
int coun = 0,num=0,count=1,xuhao = 0,jishu = 0;
Scanner input = new Scanner(System.in);
str = input.nextLine();
if(str.length() < 11) {
System.out.println("null data");
return;
}
for(int i=0;i<str.length();i++) {
if(str.charAt(i)=='1') {
count++;
}
if(count == str.length()) {
System.out.println("null data");
return;
}
}
while(num < str.length()) {
if(str.charAt(num)=='1') {
num++;
continue;
}
System.out.println(num);
if(str.charAt(num)=='0') {
if(num+11>str.length()) {
return;
}
else{
xuhao++;
coun = num+1;
for(int j=coun;j<coun+8;j++) {
shuchu+=str.charAt(j);
if(str.charAt(j) == '1') {
jishu++;
}
//System.out.println(jishu);//
}

if(str.charAt(num+10)!='1'||(jishu%2==0&&str.charAt(coun+8)=='0')||(jishu%2 == 1&&str.charAt(coun+8)=='1')) {
System.out.println(xuhao+":validate error");
System.out.println(num);
jishu = 0;
shuchu = "";
return;
//if(){
//System.out.println("parity check error");
//continue;
//}
}
if(str.charAt(num+10)=='1') {
//System.out.println("validate error");

if((jishu%2==0&&str.charAt(coun+8)=='0')||(jishu%2 == 1&&str.charAt(coun+8)=='1')){
System.out.println(xuhao+":parity check error");
jishu = 0;
shuchu = "";
return;
}
}
else {
System.out.println(xuhao+"validate error");
jishu = 0;
shuchu = "";
return;
}
System.out.println(xuhao+":"+shuchu);
num =num+11;
jishu = 0;
shuchu = "";
//System.out.println(num);//
}
}
}
}

}

 

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

首先使用for循环判断str.charAt(i)是否合法然后使用str.length()%8!=0判断其输入长度是否正确,在进行后续判断。

代码实现:


import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
      String str;
      Scanner input = new Scanner(System.in);
      str = input.next();
      for(int i=0;i<str.length();i++){
          if(str.charAt(i) < '0'||str.charAt(i) > '9'||str.charAt(i) == ' '){
                System.out.println("Wrong Format");
                return;
          }
      }
      if(str.length()%8!=0) {
          System.out.println("Wrong Format");
          return;
      }      

      else {
          int start;
          boolean falg = false;
          for(start = 0;start<str.length();start+=8) {
              if(str.substring(start,start+6).equals("202017")||str.substring(start,start+6).equals("202061")) {
                  if(falg == true){
                  System.out.print(" ");
              }
              System.out.print(str.substring(start+4,start+8));
              falg = true;
              }

          }
      }

  }
}

posted @ 2022-10-02 20:00  CHXLAITY  阅读(101)  评论(0)    收藏  举报