【ACM】CCF-201403-3 命令行选项 模拟

首先请允许我吐个槽。。。CCF的槽点简直太多了。。。以下就是我的分数。。。我对不起学了三年的所有编程老师。。。。

第一题不知道是因为看错题还是判错,签到题只对了10分。一般误判比较少,估计只能是我哪里理解错题意,因为第一题是送分的,所以真的真的很可惜。我姑且认为造成这个的而直接原因就是这个不像OJ一样可以实时查看提交结果,等到成绩下来已经晚了,这点就是CCF最不人性的地方。

后面第二题是一个简单的日历题目,刷刷刷10分钟解决战斗。

第三题是一个字符串替换题。题目看似不难,CCF所有的模拟类题目做起来都挺不简单,容易错还耗时,这道题我就做了2小时(渣,唉),考试时要有心理准备。字符串替换题我是错在了字符串不能递归替换这里,最后才发现这一点,但是时间已经来不及了,更何况牵一发而动全身,给80分还是很良心的。

第四题是考察图论,考的是有向图的强连通分量。这个还是看在前面有一点ACM基础,否则只按照学的准备应该覆盖不到这个范围。我当时写的时候是照着60%的用例写的程序,当然也出乎意料只对了30%的测试用例,具体原因就不知道了,因为后40%的用例确实比较大,得用优化但是看起来比较麻烦。

第五题因为时间就没仔细看了。。

周五还有最后的一次机会,但是还是需要准备的更充分一点。话说CCF的盲提交确实很烦,需要一再注意细节才可以,需要一再注意细节才可以,需要一再注意细节才可以!

问题描述

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

输入格式

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

输出格式

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

样例输入

albw:x
4
ls -a -l -a documents -b
ls
ls -w 10 -x -w 15
ls -a -b -c -d -e -l

样例输出

Case 1: -a -l
Case 2:
Case 3: -w 15 -x
Case 4: -a -b

  1 #include <stdio.h>
  2 #include <string.h>
  3 #define LOCAL
  4 struct mark {
  5     char name;
  6     int argu;
  7     int taken;
  8     char argustr[256];
  9     void print() {
 10         if(taken==1) {
 11             printf("-%c ",name);
 12             if(argu==1) {
 13                 printf("%s ",argustr);
 14             }
 15         }
 16     }
 17 };//输入之后按照name排序
 18 int hash[30];
 19 char markstr[54];
 20 mark markarr[30];
 21 int n;
 22 char *delim = " ";
 23 char rb;
 24 int main() {
 25 #ifdef LOCAL
 26     freopen("data.in","r",stdin);
 27 #endif
 28     scanf("%s",markstr);
 29     for(int i=0; i<30; i++) {
 30         markarr[i].name=‘\0‘;
 31         markarr[i].argu=0;
 32         markarr[i].taken=0;
 33         memset(markarr[i].argustr,‘\0‘,sizeof(markarr[i].argustr));
 34     }
 35     int id=0;
 36     for(int i=0; i<strlen(markstr); i++) {
 37         markarr[id].name=markstr[i];
 38         if(i!=strlen(markstr)-1) {
 39             if(markstr[i+1]==‘:‘) {
 40                 markarr[id].argu=1;
 41                 i++;
 42             }
 43         }
 44         id++;
 45     }
 46     scanf("%d",&n);
 47     char input[260];
 48     char *p;
 49     for(int i=0; i<n; i++) {
 50
 51         for(int i=0; i<30; i++) {
 52             markarr[i].name=‘\0‘;
 53             markarr[i].argu=0;
 54             markarr[i].taken=0;
 55             memset(markarr[i].argustr,‘\0‘,sizeof(markarr[i].argustr));
 56         }
 57         int id=0;
 58         for(int i=0; i<strlen(markstr); i++) {
 59             markarr[id].name=markstr[i];
 60             if(i!=strlen(markstr)-1) {
 61                 if(markstr[i+1]==‘:‘) {
 62                     markarr[id].argu=1;
 63                     i++;
 64                 }
 65             }
 66             id++;
 67         }
 68         printf("Case %d: ",i+1);
 69         memset(hash,-1,sizeof(hash));
 70         scanf("%c",&rb);
 71         scanf("%[^\n]",&input);
 72         p=strtok(input, delim);
 73         int bomb=0;
 74         while((p = strtok(NULL, delim))) {
 75             if(bomb==1) break;
 76             //这里对其进行解析,遍历所有的看是否有匹配,如果有多进行一轮strtok
 77             if(p[0]==‘-‘&&strlen(p)==2) {
 78                 int bomb2=0;
 79                 for(int j=0; j<id; j++) {
 80                     if(p[1]==markarr[j].name) {
 81                         //taken别忘了
 82                         if(markarr[j].argu==1) {
 83                             p = strtok(NULL, delim);
 84                             if(p==NULL) { //jmup to 下一行 ,异常处理就是设bomb,
 85                                 bomb=1;
 86                                 break;
 87                             } else {
 88                                 strcpy(markarr[j].argustr,p);
 89                                 markarr[j].taken=1;
 90                                 hash[markarr[j].name-‘a‘]=j;
 91                                 break;
 92                             }
 93                         } else {
 94                             markarr[j].taken=1;
 95                             hash[markarr[j].name-‘a‘]=j;
 96                             break;
 97                         }
 98                     } else {
 99                         bomb2++;
100                         continue;
101                     }
102                 }
103                 if(bomb2==id) {
104                     bomb=1;
105                     break;
106                 }
107             } else {
108                 //其他的选项的话(第一个出现bomb,第二个出现的情况也不可能,也是bomb)
109                 bomb=1;
110                 break;
111             }
112
113         }
114         //output,首先排序?hash
115         for(int k=0; k<26; k++) {
116             if(hash[k]!=-1) {
117                 markarr[hash[k]].print();
118             }
119         }
120         printf("\n");
121     }
122
123     return 0;
124 }
时间: 2024-11-03 01:21:42

【ACM】CCF-201403-3 命令行选项 模拟的相关文章

optparse 模块—— 命令行选项的解析器

15.5 optparse 模块--  命令行选项的解析器 注意:从2.7版本后不再使用:optparse模块不推荐使用,python不再更新该模块,后续的发展将推荐使用argparse模块. 支持python2.3及以上版本 optparse模块比旧的getopt模块具有更方便.更灵活.功能更强大的解析命令行选项的库.optparse使用一种更加声明式的命令行解析风格:你创建一个OptionParser实例,填充选项,并解析命令行.optparse允许用户指定选项,使用传统的GNU/POSIX

python argparse模块解析命令行选项简单使用

argparse模块的解析命令行选项简单使用 util.py #!/usr/bin/env python # coding=utf-8 import argparse parser = argparse.ArgumentParser(prog="myprogram ",description="a test of argparse") parser.add_argument("-a",type=int,dest="start"

安装loadrunner时出现”命令行选项语法错误键入命令 \?获得帮助“的解决方法

安装LR11 时,安装Microsoft Visual c++2005 sp1运行时组件,就会提示命令行选项语法错误,键入"命令/?"可获取帮肋信息1.进入loadrunner-11\Additional Components\IDE Add-Ins\MS Visual Studio .NET 2.安装:LRVS2005IDEAddInSetup.exe 2.再安装loadrunner

Python getopt模块处理命令行选项实例教程

分享下Python getopt模块处理命令行选项的一些例子. 在python编程中,getopt模块与shell中的getopt参数模块一样灵活而实用. getopt模块用于抽出命令行选项和参数,也就是sys.argv 命令行选项使得程序的参数更加灵活.支持短选项模式和长选项模式例如 python scriptname.py -f 'hello' --directory-prefix=/home -t --format 'a' 'b' import getopt, sys shortargs

命令行选项解析函数(C语言):getopt()和getopt_long()

上午在看源码项目 webbench 时,刚开始就被一个似乎挺陌生函数 getopt_long() 给卡住了,说实话这函数没怎么见过,自然不知道这哥们是干什么的.于是乎百度了一番,原来是处理命令行选项参数的,的确,正规点的大型程序一般第一步就是处理命令行参数的,接着才是主干程序.在百度和 man 的帮助下,找到了具体使用方法和解释,二话不说赶紧学习一下,并总结出文档记录一下. 平时在写程序时常常需要对命令行参数进行处理,因为参数少,自己解析就可以搞定:如果命令行个数比较多时,如果按照顺序一个一个定

详解Top命令 输出命令行选项及代码

Linux中的top命令显示系统上正在运行的进程.它是系统管理员最重要的工具之一.被广泛用于监视服务器的负载.在本篇中,我们会探索top命令的细节.top命令是一个交互命令.在运行top的时候还可以运行很多命令.我们也会探索这些命令. (译注:不同发行版的top命令在各种细节有不同,如果发现不同时,请读你的帮助手册和命令内的帮助.) 1. Top 命令输出 首先,让我们了解一下输出.top命令会显示系统的很多信息.我们需要理解不同部分输出的意义:默认运行时,top命令会显示如下输出: 前几行水平

怎样编写支持命令行选项的程序

Linux下的程序,常常支持N多的命令行选项.那么,我们怎样编写支持命令行选项的程序呢. 以下给出两个演示样例. 演示样例1,简单的命令行选项. 以下的程序,支持4个选项, -i,-n,-s,-d 编译后,能够这样运行 (选项之间的顺序无所谓): ./a.out   -i  -n 100  -s hahaha  -d 好了,以下是代码. #include <stdio.h> #include <unistd.h> #include <stdlib.h> int enab

如何编写支持命令行选项的程序

Linux下的程序,经常支持N多的命令行选项.那么,我们如何编写支持命令行选项的程序呢. 下面给出两个示例. 示例1,简单的命令行选项. 下面的程序,支持4个选项, -i,-n,-s,-d 编译后,可以这样执行 (选项之间的顺序无所谓): ./a.out   -i  -n 100  -s hahaha  -d 好了,下面是代码. #include <stdio.h> #include <unistd.h> #include <stdlib.h> int enable_o

命令行选项解析相关知识点

最近读源码的时候碰到命令行解析相关的知识点,比较模糊.摘取出来做个记录 1.最基本的main函数头 main(int argc,char *argv[ ]) 如果只输入程序名xxx,则argc=1,argv[0]指向输入的程序路径及名称./xxx;如果输入xxx para_1(程序名加一个参数),则argc=2,argv[0] 指向输入的程序路径及名称,argv[0]指向参数para_1字符串.以此类推,也就是char  *argv[]:argv 是一个指针数组,其元素个数是argc,存放的是指