zoj1623 Deal with C++ Comments

http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=623

唉,这题WA了半天,巨大的悲剧。逻辑上不够严密啊。题目的意思是对于一段输入,你需要找出其中的注释部分(/* */和//两种),统计注释个数,并且将其中的注释转为大写。题目有点不是很清楚,比如这句:“you may assume that comments will not appear in constant strings.”没看懂,不知道什么意思。还有capitalize 应该是大写的意思,我一开始也完全没有反应过来。

这道题在算法上面没什么意思,就是需要严密的考虑各种情况。我首先是判断/* */注释,这种注释需要首先有/*符号,同时在这个符号以后有*/符号,并且在/*之前没有//符号。在这种情况不成立的时候,那么只要有//符号,那么就是//注释,也就是一直到/n都是注释。如果都不是那么久没有注释了,直接返回。开始写代码的时候,查询*/符号的时候,我没有从/*之后开始找,而是从start开始找,结果WA了n次。今天再看代码的时候,终于发现了。唉,主要是没有做测试,就是用样例测了一下,否则早就看到了。说了半天上代码吧:

//if-else上面出现了比较大的逻辑错误 #include<stdio.h> #include<string.h> #include<stdlib.h> int findstr(int start, char* s, char* t) { int len = strlen(s); char* p = strstr(s+start,t); if(p == NULL) return -1; else return p-s; } inline void up(char& c) { if(c>='a' && c<='z') { c = c+'A'-'a'; } } void compile(char* s) { int len = strlen(s); int count = 0; int start = 0; while(true) { int p1 = findstr(start,s,"/*"); int p2 = findstr(start,s,"//"); int p3 = findstr(p1+2,s,"*/");//一开始是int p3 = findstr(start,s,"//");导致大量的WA,悲剧啊。。 if((p1 != -1 && p3 != -1) && (p2 == -1 || p2 > p1))//首先在p1处出现/*注释。请先判断这个if,可以使下一个if判断简单点 { count++; for(int i=p1;i<=p3;i++) { up(s[i]); } start = p3+2; } else if(p2 != -1) //从start开始首先在p2处出现//注释,所以直到换行符处一直是注释 { int last = findstr(p2+1,s,"/n"); count++; for(int i = p2;i<last;i++) { up(s[i]); } start = last+1; } else { break; } } printf("%d/n%s/n",count,s); } int main() { int N; int lines; int len; char s[100000]; char tmp[1000]; long alllines=0; scanf("%d",&N); while(N--) { strcpy(s, ""); scanf("%d",&lines); alllines+=lines; gets(tmp); for(int i=0;i<lines;i++) { gets(tmp); len = strlen(tmp); tmp[len]='/n'; tmp[len+1] = '/0'; strcat(s,tmp); } compile(s); } }

你可能感兴趣的:(C++,c,算法,null,UP,Comments)