关闭

2014年首届CCF软件能力认证试题第三题 .

445人阅读 评论(0) 收藏 举报
分类:

题目3 命令行选项
时间限制: 1 秒
空间限制: 256 MB
问题描述
请你写一个命令行分析程序,用以分析给定的命令行里包含哪些选项。
每个命令行由若干个字符串组成,它们之间恰好由一个空格分隔。这些字
符串中的第一个为该命令行工具的名字,由小写字母组成,你的程序不用
对它进行处理。在工具名字之后可能会包含若干选项,然后可能会包含一
些不是选项的参数。
选项有两类:带参数的选项和不带参数的选项。一个合法的无参数
选项的形式是一个减号后面跟单个小写字母,如”-a” 或”-b”。而带参数
选项则由两个由空格分隔的字符串构成,前者的格式要求与无参数选项相
同,后者则是该选项的参数,是由小写字母,数字和减号组成的非空字符串。
该命令行工具的作者提供给你一个格式字符串以指定他的命令行工具需要接受哪些选项。这个字符串由若干小写字母和冒号组成,其中的每个小写字母表示一个该程序接受的选项。如果该小写字母后面紧跟了一个冒号,它就表示一个带参数的选项,否则则为不带参数的选项。例如,”ab:m:” 表示该程序接受三种选项,即”-a”(不带参数),”-b”(带参数),
以及”-m”(带参数)。
命令行工具的作者准备了若干条命令行用以测试你的程序。对于每个命令行,你的工具应当一直向后分析。当你的工具遇到某个字符串既不是合法的选项,又不是某个合法选项的参数时,分析就停止。命令行剩余的未分析部分不构成该命令的选项,因此你的程序应当忽略它们。

输入格式
输入的第一行是一个格式字符串,它至少包含一个字符,且长度不超
过52。格式字符串只包含小写字母和冒号,保证每个小写字母至多出现一
次,不会有两个相邻的冒号,也不会以冒号开头。输入的第二行是一个正整数N(1  N  20),表示你需要处理的命令行的个数。
接下来有N 行,每行是一个待处理的命令行,它包括不超过256 个字符。该命令行一定是若干个由单个空格分隔的字符串构成,每个字符串里只包含小写字母,数字和减号。

输出格式:
输出有N 行。其中第i 行以”Case i:” 开始,然后应当有恰好一个空格,然后应当按照字母升序输出该命令行中用到的所有选项的名称,对于带参数的选项,在输出它的名称之后还要输出它的参数。如果一个选项在命令行中出现了多次,只输出一次。如果一个带参数的选项在命令行中出现了多次,只输出最后一次出现时所带的参数。

思路:
字符串处理的题目,要很小心=.=
一开始是解析规则字符串rule,因为命令只可能是小写字母,所以用哈希表记录每一个命令的使用规则(0 没有这个码;1 有这个码不能接参数;2 接参数 )
接下来是处理输入的字符串,根据上面的规则来处理。相同命令只输出一次,要检查前面是否已经输出该命令,输出参数是注意修改前面命令的参数(因为只输出最后一个参数)。遇到不符合的情况就退出,结束解析。


#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <map>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
int main(){
    int i,j,cnt;
    char cc;
    std::vector< std::vector<string> > res;
    string clause[20][256];
    //memset(clause,"",sizeof(string)*20*256);
    for(i=0;i<20;i++){
    for(j=0;j<256;j++){
    clause[i][j] = "";
    }
    }
    map<char,int> map;//0 没有这个码;1 有这个码不能接参数;2 可以接参数 
    for(char ch='a';ch <= 'z';ch++){
       map.insert(pair<char,int>(ch,0));
    }
    string rule;
    //处理规则 
    cin>>rule;
    for(i=0;i<rule.length()-1;i++){
      if(rule[i]>='a'&&rule[i]<='z'&&rule[i+1]==':'){
          map[rule[i]]=2;
          continue;
      }
      else {
          map[rule[i]]=1;
      }
    }
    if(rule[rule.length()-2]==':') map[rule[rule.length()-1]]=1;
    else if(rule[rule.length()-1]==':') map[rule[rule.length()-2]]=2;
    else map[rule[rule.length()-1]]=1;
    //读入命令 
    cin>>cnt;
    scanf("%c", &cc);
    int cn = 0,num=0;
    while(cnt){
    char buffer;
    string s;
    i=0;
    //输入命令 
    while(scanf("%c", &buffer)){
    if(buffer=='\n') break;
    else if(buffer==' ') i++;
    else clause[cn][i] += buffer;    
    }
    // 处理命令 
    vector<string> ans;
    num=i;
    i=1;
    for(i=1;clause[cn][i]!="";i++){
    if(clause[cn][i][0]=='-'&&map[clause[cn][i][1]]==0) break;
    else if(clause[cn][i][0]=='-'&&map[clause[cn][i][1]]==1) {

         if(find( ans.begin( ), ans.end( ), clause[cn][i] )==ans.end()) ans.push_back(clause[cn][i]);
         }  
    else if(clause[cn][i][0]=='-'&&map[clause[cn][i][1]]==2) {

         if(find( ans.begin( ), ans.end( ), clause[cn][i] )==ans.end()) ans.push_back(clause[cn][i]);
         if(clause[cn][i+1]!=""&&clause[cn][i+1][0]!='-') {
         if(ans[ans.size()-1]==clause[cn][i]) ans.push_back(clause[cn][i+1]);
         else *(find( ans.begin( ), ans.end( ), clause[cn][i] )+1) = clause[cn][i+1];
         i++;
         continue;
         }
         else break;
         }
    else break; 
    }
    res.push_back(ans);

    cn++;
    cnt--;
    }

    for(i=0;i<res.size();i++){
     cout<<"Case "<<i+1<<": ";
    for(j=0;j<res[i].size();j++){
     cout<<res[i][j]<<" ";
    }
    cout<<endl;
    }


    system("pause");
    return 0;
    }

0
0
查看评论

2014年首届CCF软件能力认证试题第三题

题目3 命令行选项 时间限制: 1 秒 空间限制: 256 MB 问题描述 请你写一个命令行分析程序,用以分析给定的命令行里包含哪些选项。 每个命令行由若干个字符串组成,它们之间恰好由一个空格分隔。这些字 符串中的第一个为该命令行工具的名字,由小写字母组成,你的程序不用 对它进行处理。...
  • iboxty
  • iboxty
  • 2015-03-28 14:10
  • 1403

2014年首届CCF软件能力认证试题第二题

题目 2 窗口 时间限制: 1 秒 空间限制: 256 MB 问题描述 在某图形操作系统中,有 N 个窗口,每个窗口都是一个两边与坐标轴 分别平行的矩形区域。窗口的边界上的点也属于该窗口。窗口之间有层次 的区别,在多于一个窗口重叠的区域里,只会显示位于顶层的窗口里的内 容。 当你点击...
  • iboxty
  • iboxty
  • 2015-03-28 00:58
  • 594

2014年首届CCF软件能力认证试题第二题 .

题目 2 窗口 时间限制: 1 秒 空间限制: 256 MB 问题描述 在某图形操作系统中,有 N 个窗口,每个窗口都是一个两边与坐标轴 分别平行的矩形区域。窗口的边界上的点也属于该窗口。窗口之间有层次 的区别,在多于一个窗口重叠的区域里,只会显示位于顶层的窗口里的内 容...
  • u012768474
  • u012768474
  • 2016-08-30 16:22
  • 443

CCF计算机软件能力认证模拟试题(c/c++)

CCF计算机软件能力认证模拟试题(c/c++)
  • nameofcsdn
  • nameofcsdn
  • 2016-12-05 22:21
  • 2285

CCF认证历年试题解【网上跟帖,请不要使用称呼】

程序改变现实,软件统治世界。 程序员需要有精益求精的工匠精神,追求逻辑的极简、时间的最少和存储的最省,并且懂得其中的平衡。 数据表示需要优先考虑,对于许多问题,找到表示该问题的数据结构,问题自然就解决了。 CCF计算机职业资格认证的每一道试题都十分经典,覆盖现实世界中方方面面的问题。这个历年试题解全...
  • tigerisland45
  • tigerisland45
  • 2017-01-28 00:49
  • 32191

CCF认证201703-3 Markdown

今天状态很烂。。。记录的都是半成品代码,以后有时间再说吧,心累。 这道题30分。 问题描述 试题编号: 201703-3 试题名称: Markdown 时间限制: 1.0s 内存限制: 256.0MB...
  • qq_35539645
  • qq_35539645
  • 2017-09-14 21:13
  • 469

2016年4月CCF计算机软件能力认证模拟试题代码参考

问题描述 给定n个正整数,找出它们中出现次数最多的数。如果这样的数有多个,请输出其中最小的一个。 输入格式 输入的第一行只有一个正整数n(1 ≤ n ≤ 1000),表示数字的个数。 输入的第二行有n个整数s1, s2, …, sn (1 ≤ si ≤ 10000, 1 ≤ i ≤ n)。相邻的数用...
  • qwb492859377
  • qwb492859377
  • 2016-03-21 21:46
  • 5428

2014年首届CCF软件能力认证试题第一题 .

题目 1 相反数 时间限制: 1 秒 空间限制: 256 MB 问题描述 有 N 个非零且各不相同的整数。请你编一个程序求出它们中有多少对 相反数(a 和 −a 为一对相反数)。 输入格式 第一行包含一个正整数 N。(1 ≤ N ≤ 500)。 第二行为 N 个用单个...
  • u012768474
  • u012768474
  • 2016-08-30 15:19
  • 461

2014年首届CCF软件能力认证试题第一题

题目 1 相反数 时间限制: 1 秒 空间限制: 256 MB 问题描述 有 N 个非零且各不相同的整数。请你编一个程序求出它们中有多少对 相反数(a 和 −a 为一对相反数)。 输入格式 第一行包含一个正整数 N。(1 ≤ N ≤ 500)。 第二行为 N 个用单个空格隔开的非零整...
  • iboxty
  • iboxty
  • 2015-03-28 01:04
  • 495

2014年首届CCF软件能力认证试题 题目二

题目2    窗口 时间限制:1秒 空间限制:256MB 问题描述 在某图形操作系统中,有N个窗口,每个窗口都是一个两边与坐标轴分别平行的矩形区域。窗口的边界上的点也属于该窗口。窗口之间有层次的区别,在多于一个窗口重叠的区域里,只会显示位于顶层的窗口里的内...
  • sheila_2013
  • sheila_2013
  • 2015-03-22 20:43
  • 337
    个人资料
    • 访问:52323次
    • 积分:1566
    • 等级:
    • 排名:千里之外
    • 原创:102篇
    • 转载:36篇
    • 译文:0篇
    • 评论:0条
    文章分类