2014年首届CCF软件能力认证试题第三题_(8分)我省某校园内放着一个校园雕塑,如下图所示,老师想测试一下小明解决问题的能力,他这样告诉小明,-程序员宅基地

技术标签: 算法  命令行  CCF认证  

题目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;
    }
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/iboxty/article/details/44701147

智能推荐

黑马程序员-高新技术-交通灯管理-程序员宅基地

文章浏览阅读297次。学习了张孝祥老师的交通灯项目后,就深深的喜欢上了张孝祥老师的讲课风格,他的每句话话中都显露出了他的清晰、完整、丰富、深入的思维,可以推断出他已经把这个题目理解的非常到位了。他的讲课方式很像我的高中老师,就是把一个题目从头到尾的思路一一的都讲出来,不跳跃任何一个思维点,不遗漏任何一个思维点,这才是一个智者的思路。希望黑马程序员的老师们都能像张孝祥老师一样事无巨细的把一个知识点讲透彻,讲的不遗漏。

图像线段检测几种方法_lines1, _, _, _ = lsd1.detect(gray_image1, 2, 2)-程序员宅基地

文章浏览阅读1.1k次。OpenCV-contrib有一个名为FastLineDetector的东西,如果它被用作LSD的替代品似乎很好。如果你有点感动,你会得到与LSD几乎相同的结果。当我将OpenCV提升到4.1.0时,LineSegmentDetector(LSD)消失了。_lines1, _, _, _ = lsd1.detect(gray_image1, 2, 2)

为什么人工智能用Python?-程序员宅基地

文章浏览阅读923次,点赞24次,收藏27次。Python 作为脚本语言,虽然上手简单、入门快,但是运行速度没有Java、C++快,应用也不够广泛,那Python到底有什么优势?来听听王道Python的主讲老师龙哥怎么说?Python被认为是一门相对容易学习和上手的编程语言,对初学者友好。其简洁的语法和清晰的代码结构使得开发人员能够更专注于解决问题而不是处理语法复杂性。这使得开发人员能够轻松地利用这些工具进行人工智能项目的开发。例如最流行的机器学习框架Scikit-learn只支持Python。

Python实例29:利用python自动创建多个Excel表格_python在excel表格内添加多张表-程序员宅基地

文章浏览阅读3k次,点赞4次,收藏19次。实例代码import xlwings as xwapp = xw.App(visible = True, add_book = False)for i in range(1, 21): workbook = app.books.add() workbook.save(f'e:\\example\\{i}班信息表.xlsx') workbook.close()app.quit()_python在excel表格内添加多张表

uni-app实现上拉加载,下拉刷新(下拉带动画)_uniapp 加载动画-程序员宅基地

文章浏览阅读5.7w次,点赞14次,收藏81次。直接代码展示了uni-app的上拉加载动画感觉还行,废话不多说了。。。1在pages.json添加允许下拉刷新{ "path":"pages/lookuser/lookuser", "style":{ "navigationBarTitleText":"用户日志", "enablePullDownRefresh": true//就是这个 }_uniapp 加载动画

常见服务器对jdk版本的支持_jdk 不支持国产服务器-程序员宅基地

文章浏览阅读2.6k次。WebSphere5.1:JDK1.4,Servelet2.3、JSP1.2WebSphere6.0:JDK1.4,Servelet2.4、JSP2.0WebSphere6.1:JDK5.0,Servelet2.4、JSP2.0Tomcat4.1:JDK1.4,Servelet2.3、JSP1.2Tomcat5.5:JDK5.0,Servelet2.4、JSP2.0_jdk 不支持国产服务器

随便推点

为什么招聘高级前端开发这么难?_为什么招聘高级前端开发这么难?-程序员宅基地

文章浏览阅读270次。曹操当年下求贤令,主要解决的就是一个多重标准的问题。「唯才是举,吾得而用之」很多人都觉得找工作怎么那么难,一个简历投了几百份,回的也没几个。你可知其实公司对于人才的需求,急躁心情丝毫不比你们的差。可能你会说,公司招不到人,钱给的不够多吧?那你往下看从这个帖子,可以看得出题主的要求是:1.2-3年以上工作经验2.基础牢固3.对某项技术有很深的研究4.学历背景好比如说满足条件1的市场上占70%;满足基础牢固的程序员占30%;满足对某个方向技术有较深研究的占30%;满足学历背景好的占10%。所以题主_为什么招聘高级前端开发这么难?

Python - max()中key的作用_max(dict1.keys())-程序员宅基地

文章浏览阅读1.3k次。Python - max()中key的作用_max(dict1.keys())

RobotFramework中setUp的小技巧_robotframework arguments[0].setattribute-程序员宅基地

文章浏览阅读4.6k次。背景使用RobotFramework进行测试的时候,经常会需要写一些准备数据的脚本,比如我现在的的脚本框架下,把所有的变量和项目配置都放在服务器上,那么我在执行用例的时候,就必须要去读取这些配置,但是在每个用例都要写一遍这个读取配置的代码,显得很繁琐,偶然的尝试,发现了这个小技巧。往常的做法正常来说,我们如果要拿到这些配置,必须要执行获取配置的关键字,然后拿到这个关键字的返回值,然后才能执行后续的步_robotframework arguments[0].setattribute

dbfs和dbm的换算_「清晰易懂」dBFS、dBm、dBV、dBW、0dB、-3dB概念解析-程序员宅基地

文章浏览阅读5.9k次。简单地说,分贝就是放大器增益的单位。放大器输出与输入的比值为放大倍数,单位是“倍”,如10倍放大器,100倍放大器。当改用“分贝”做单位时,放大倍数就称之为增益,这是一个概念的两种称呼。电学中分贝与放大倍数的转换关系为:AV (dB) = 20 lg ( Vo / Vi )AI (dB) = 20 lg ( Io / Ii )Ap (dB) = 10 lg ( Po / Pi )分贝定义时电压(电..._dbfs和dbm的换算

【QT6】QT6实现UI窗口无边框,设置背景颜色,设置透明度_qt中设置无边框透明背景窗口-程序员宅基地

文章浏览阅读544次,点赞9次,收藏7次。UI窗口无边框,背景颜色这是,透明度设置_qt中设置无边框透明背景窗口

大模型部署手记(15)LLaMa2+Ubuntu18.04+privateGPT_privategpt llama2-程序员宅基地

文章浏览阅读1k次。组织机构:Meta(Facebook)模型:llama-2-7b下载:使用download.sh下载或Huggingface.co或aliendao.cn下载硬件环境:暗影精灵7PlusUbuntu版本:18.04内存 32GGPU显卡:Nvidia GTX 3080 Laptop (16G)_privategpt llama2