大皮

去见、去学、去写。

南昌航空大学 软件学院 pta Java 第二次作业 蔡珂 opp

又来了hhhh
最后一题因为自作聪明多加了一个Wrong Format,wa到我怀疑人生
反正不算罚时,使劲wa
第二次还是很简单的
但我对于java语法不熟悉,做完以后看了别人的代码,决定把别人精炼的代码也贴进去

题目列表

7-1 字母-数字转换

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

输入格式:

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

输出格式:

所有英文字母转换成它们在字母表中的序号,例如:“12234”。
非法输入输出"Wrong Format".
import java.util.Scanner; // 需要导入 util 包
public class Main {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        String ch;
        ch = input.next();
        for(int i=0;i<ch.length();i++)
        {
            if((ch.charAt(i)>'Z'&&ch.charAt(i)<'a')||ch.charAt(i)<'A'||ch.charAt(i)>'z')
            {
                System.out.printf("Wrong Format\n");
                return;
            }
        }
        for(int i=0;i<ch.length();i++)
        {
            int a=0;
            if(ch.charAt(i)>'Z')
                System.out.printf("%d",(int)(ch.charAt(i)-'a'+1));
            else
                System.out.printf("%d",(int)(ch.charAt(i)-'A'+1));


        }
    }
}

逐位判断,很简单的题目

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
import java.util.Scanner; // 需要导入 util 包
public class Main {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        String ch;
        int flag=1;
        ch = input.next();
        if(ch.length()<11)
        {
            System.out.printf("null data");
            return;
        }
        A:for(int i=0;i<ch.length();i++)
        {
            if(ch.charAt(i)=='0'&&ch.length()-i>10)
            {
                System.out.printf("%d:",flag++);
                if(ch.charAt(i+10)!='1')
                {
                    System.out.printf("validate error\n");
                    i+=10;
                    continue ;
                }
                int f=0;
                for(int j=i+1;j<i+9;j++)
                    if(ch.charAt(j)=='1')
                        f++;
                if(((f&1)==0&&ch.charAt(i+9)!='1')||((f&1)==1&&ch.charAt(i+9)!='0'))
                {
                    System.out.printf("parity check error\n");
                    i+=10;
                    continue ;
                }
                for(int j=i+1;j<i+9;j++)
                    System.out.printf("%c",ch.charAt(j));
                i+=10;
                System.out.printf("\n");
            }
        }
        if(flag==1)
        {
            System.out.printf("null data");
            return;
        }
    }

}

有点绕,题意就是一串字符串,让你读取是否为合法数据,合法输出。判断合法条件为,最后一位为1,八位数据1的数量为奇数校验位,为0反之为1。
多几个if就行

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
import java.util.Scanner; // 需要导入 util 包
public class Main {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        String ch;
        int flag=0;
        ch = input.nextLine();
        if(ch.length()%8!=0)
        {
            System.out.printf("Wrong Format\n");
            return;
        }
        for(int i=0;i<ch.length();i++)
        {
            if(i%8==0&& (ch.startsWith("202017", i)|| ch.startsWith("202061", i)))
                flag++;
            if(ch.charAt(i)>'9'||ch.charAt(i)<'0')
            {
                System.out.printf("Wrong Format\n");
                return;
            }
        }
       // System.out.printf("%d\n",flag);
//        if(flag==0)
//        {
//            System.out.printf("Wrong Format\n");
//            return;
//        }
        for(int i=0;i<ch.length();i+=8)
        {
            if(i%8==0&& (ch.startsWith("202017", i)|| ch.startsWith("202061", i)))
            {
                for(int j=i+4;j<=i+7;j++)
                    System.out.printf("%c",ch.charAt(j));
                if(--flag>0)
                    System.out.printf(" ");
            }
        }
    }

}

hhh
我没把自己自作聪明的地方删掉,给大家引以为戒。
我还特判了学院和年份,结果发现没卡
题目没什么绕弯的地方
判断位数
判断是否为202017和202061的
java的字符串确实用着比c++的简单很多,但是有些人只会蠢蠢的逐位判断hhh
下面是我看到比较精炼的代码,里面用字符串的函数用的比较标准的
网址贴在最下面

import java.util.Scanner;
 
public class Main {
 
	public static void main(String[] args) {
		
		Scanner in = new Scanner(System.in);
	
		String a = in.nextLine();
	
		//正则表达式判断输入合法性
		if(!a.matches("^[0-9]*$")) {
			System.out.print("Wrong Format");
			return;
		}
		
		if(a.length()%8!=0) {
			System.out.print("Wrong Format");
			return;
		}
		
		int start,out = 0;
		for(start = 0;start<a.length();start+=8) {
			if(a.substring(start,start+6).equals("202017")||
				a.substring(start,start+6).equals("202061")) {
                if(out == 1){
                    System.out.print(" ");
                }
				System.out.print(a.substring(start+4,start+8));
                out = 1;
			}
		}
	}
 
}

贴上网址:https://blog.csdn.net/qq_62792553/article/details/123742347

posted on 2022-09-19 19:18  大皮QAQ  阅读(151)  评论(0编辑  收藏  举报

导航

回到顶部叭QAQ