CCF认证201403第三题(提交未通过)

本文介绍了一个命令行解析器的设计与实现过程,该解析器能够处理格式化的命令行输入,并根据预定义的格式字符串验证每个命令的有效性。文章详细解释了如何通过Java实现这一功能,包括读取输入、解析命令行并进行合法性检查等步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

已实测好几组数据通过,但是不知道为什么提交后显示错误,0分
思路:
1、将格式字符串存放于format,输入的命令行存放于字符串数组orderLine
2、从orderLine取出一条命令行,分割选项/参数,放入ArrayList容器order,从中随后利用函数findOrder,逐个选项判断该选项是否合法(存在),是否带参数
——2.1、选项合法,不带参数-》判断是否在ArrayList容器print已有,做出相应操作
——2.2、选项合法,带参数-》同上,同时往后跳一个参数
——2.3、选项不合法(不存在),长度大于2也不合法,终止
3、输出print的内容,清空print和order,重复2

package exam201403;

import java.util.ArrayList;
import java.util.Scanner;

public class Task3 {

    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);
        String format;
        int n; //n条命令
        format = sc.next();
        n = sc.nextInt();
        ArrayList<String> print = new ArrayList<String>();
        ArrayList<String> order = new ArrayList<String>();
        String[] orderLine = new String[n];

        String t = sc.next();
        for(int i=0; i<n; i++){
            orderLine[i] = sc.nextLine();
        }

        for(int i=0; i<n; i++){
            String[] items = orderLine[i].split(" ");
            for(int j=1; j<items.length; j++){ //去掉工具项,加入数组列表
                order.add(items[j]);
            }

            for(int j=0; j<order.size(); j++){ //逐词分析命令行
                String orderItem = order.get(j);
                if(orderItem.length() != 2){ //不是选项、参数,退出
                    break;
                }
                if(orderItem.charAt(0) == '-'){ //是选项
                    int flag = findOrder(format, order.get(j).charAt(1));

                    if(flag == 1){ //如果是不带参数的,且不包含
                        if(!print.contains(orderItem)){
                            print.add(orderItem);
                        }
                    }
                    else if(flag == 2 && j != order.size()-1){ //如果是带参数的,跳过后面的参数
                        j++;
                        if(print.contains(orderItem)){ //如果已经存在,替换参数
                            int index = print.indexOf(orderItem);
                            print.set(index+1, order.get(j));
                        }
                        else{
                            print.add(orderItem);
                            print.add(order.get(j));
                        }
                    }
                    else{ //非法输入,退出
                        break;
                    }
                }
            }
            System.out.print("Case "+(i+1)+": ");
            for(int j=0; j<print.size(); j++){
                System.out.print(print.get(j)+" ");
            }
            print.clear();
            order.clear();
            System.out.println();
        }       
    }
    public static int findOrder(String str, char c){ //在格式字符串中查找
                                    //不带参返回1,带参数返回2,不存在返回-1
        for(int i=0; i<str.length(); i++){
            if(c == str.charAt(i) && c>='a' && c<='z'){
                if(i != str.length()-1 && str.charAt(i+1) == ':'){
                    return 2;
                }
                else{
                    return 1;
                }
            }
        }
        return -1;
    }

}
### 关于CCF CSP认证第一的相关解答 对于 CCF CSP 认证考试中的第一,通常涉及基础算法或者简单的逻辑判断问。这类目旨在考察考生的基础编程能力以及对基本数据结构的理解。 #### 基础概述 根据已有资料[^2],CSP 认证考试的第一通常是较为简单的问,主要测试选手对输入输出、条件分支语句和循环控制的基本掌握情况。这些目往往不需要复杂的算法设计,而是注重实现细节上的准确性。 以下是基于历史真的一些常见特点总结: 1. **输入处理**: 大多数情况下,第一会提供一组或多组输入数据,要求程序能够正确读取并按照指定方式处理。 2. **逻辑运算**: 可能涉及到一些简单的算术计算或布尔表达式的求值操作。 3. **边界条件考虑**: 即使是最基础的目也需要特别注意极端情况下的行为表现,比如零值输入或是超出范围的数据。 下面给出一个典型的例子及其解决方案作为示范: 假设某年的第一如下描述: > 给定两个整数a,b (0 ≤ a, b ≤ 1e9),请输出它们的最大公约数GCD(a,b)。 可以采用辗转相除法解决此问: ```cpp #include <iostream> using namespace std; // 定义函数用于计算最大公因数 long long gcd(long long a, long long b){ while(b != 0){ long long temp = a % b; a = b; b = temp; } return a; } int main(){ long long a, b; cin >> a >> b; // 输入两个数字 cout << gcd(a,b); // 输出结果 } ``` 上述代码片段展示了如何利用欧几里得算法高效地找到任意两个非负整数之间的最大公约数[^1]。 另外值得注意的是,在实际参加考试过程中,务必仔细阅读每一道试的具体说明部分,并严格按照样例格式提交最终答案文件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值