问题描述
有一个软件公司常常用一种不为人知的语言来开发程序,这个语言的特点如下:
可以用逻辑行数来粗略地评估程序的大小,即计算不在注释或字符串内的分号的个数。写一个程序读进去几组程序代码,对每组代码都输出逻辑行数和物理行数,并对未终止的注释块和字符串发出警告消息。
输入包含一个或多个程序,以#表示每个程序终止,以##表示输入终止。
对于包括未终止字符串的行,输出:“Unterminated string in line n.”,其中n换成行号。
如果该程序包括一个未终止的块注释,以如下格式输出一行:”Unterminated block comment at end of program.“
在错误信息之后,以如下格式输出一行:”Program x contains y logical lines and z physical lines.“。其中x、y和z用相应的数字代替。
|
|
测试输入 |
期待的输出 |
时间限制 |
内存限制 |
额外进程 |
|---|---|---|---|---|---|
| 测试用例 1 |
以文本方式显示
|
以文本方式显示
|
1秒 | 64M | 0 |
大致思路:
字符用getchar()一个一个读入,然后再对每一个字符进行判断,根据判断的结果再进行相关的处理。
具体实现:
分情况讨论
(1)如果读到‘,则会出现以下的几种情况,‘’||‘\n||‘#||‘##这几种情况,当首次遇到#时程序 的计数变量++,输出字符串不完整,输出程序中包含多少个逻辑行和物理行,输出之后要把物理行和逻辑行的计数变量清0 ;遇到\n的时候物理行的计数变量++;
(2)如果读到“,则判断情况和上面的(1)情况是一样的。
(3)如果读到@,则会出现下面几种情况,@\n||@#||@##这几种情况,当首次遇到#时程序的计数变量++,输出程序中包含多少个逻辑行和物理行,输出之后要把物理行和逻辑行的计数变量清0 ;遇到\n的时候物理行的计数变量++;
(4)如果读到(,则会出现以下情况(。。。(||((。。。。))||((#||((##||((。。。。)。。)||((\n这几种情况。当首次遇到#时程序的计数变量++,输出块注释不完整,输出程序中包含多少个逻辑行和物理行,输出之后要把物理行和逻辑行的计数变量清0 ;遇到\n的时候物理行的计数变量++;
(5)如果读到;,逻辑行计数变量++。
(6)如果读到#;程序的计数变量++,输出程序中包括多少个逻辑行和物理行,输出之后要把物理行和逻辑行的计数变量清0.
(7)如果读到\n,物理行计数变量++。
在读入的时候先用一个while(1)循环进行大输入,然后对于每种情况再用一个while(1)进行循环输入。要注意符合条件的时候要跳出循环。
实现代码
<span style="font-family:Microsoft YaHei;font-size:14px;">#include<stdio.h>
#include<string.h>
int main()
{
char t=NULL,t1=NULL,t2=NULL,t3=NULL,t4=NULL,t5=NULL,t6=NULL,t7=NULL,t8=NULL,t9=NULL,t10=NULL,t11=NULL,t12=NULL;
int m;
int countcx=0,countwl=0,countlj=0;
while(1)
{
m=0;
t=getchar();
k: if(t=='\'')
{
while(1)
{
t1=getchar();
if(t1=='\'')
{
break;
}
else if(t1=='\n')
{
countwl++;
printf("Unterminated string in line %d.\n",countwl);
break;
}
else if(t1=='#')
{
countcx++;
printf("Unterminated string in line %d.\n",countwl);
printf("Program %d contains %d logical lines and %d physical lines.\n",countcx,countlj,countwl);
countwl=0;
countlj=0;
t2=getchar();
if(t2=='#')
{
m=1;
break;
}
else if(t2=='\n')
{
t2=getchar();
t=t2;
goto k;
}
else
{
t=t2;
goto k;
}
}
}
}
else if(t=='\"')
{
while(1)
{
t1=getchar();
if(t1=='\"')
{
break;
}
else if(t1=='\n')
{
countwl++;
printf("Unterminated string in line %d.\n",countwl);
break;
}
else if(t1=='#')
{
countcx++;
printf("Unterminated string in line %d.\n",countwl);
printf("Program %d contains %d logical lines and %d physical lines.\n",countcx,countlj,countwl);
countwl=0;
countlj=0;
t12=getchar();
if(t12=='#')
{
m=1;
break;
}
else if(t12=='\n')
{
t12=getchar();
t=t12;
goto k;
}
else
{
t=t12;
goto k;
}
}
else
;
}
}
else if(t=='@')
{
while(1)
{
t3=getchar();
if(t3=='\n')
{
countwl++;
break;
}
else if(t3=='#')
{
countcx++;
printf("Program %d contains %d logical lines and %d physical lines.\n",countcx,countlj,countwl);
countlj=0;
countwl=0;
t4=getchar();
{
if(t4=='#')
{
m=1;
break;
}
else if(t4=='\n')
{
t4=getchar();
t=t4;
goto k;
}
else
{
t=t4;
goto k;
}
}
}
else
;
}
}
else if(t=='(')
{
t5=getchar();
if(t5=='(')
{
while(1)
{
t6=getchar();
if(t6=='\n')
{
countwl++;
}
else if(t6=='#')
{
countcx++;
printf("Unterminated block comment at end of program.\n");
printf("Program %d contains %d logical lines and %d physical lines.\n",countcx,countlj,countwl);
countlj=0;
countwl=0;
t7=getchar();
if(t7=='#')
{
m=1;
break;
}
else if(t7=='\n')
{
t8=getchar();
t=t8;
goto k;
}
else
{
t=t7;
goto k;
}
}
else if(t6==')')
{
t9=getchar();
if(t9==')')
{
break;
}
else
{
t=t9;
goto k;
}
}
}
}
else
{
t=t5;
goto k;
}
}
else if(t=='\n')
{
countwl++;
}
else if(t==';')
{
countlj++;
}
else if(t=='#')
{
countcx++;
printf("Program %d contains %d logical lines and %d physical lines.\n",countcx,countlj,countwl);
countlj=0;
countwl=0;
t10=getchar();
if(t10=='#')
{
m=1;
break;
}
else if(t10=='\n')
{
t11=getchar();
t=t11;
goto k;
}
else
{
t=t10;
goto k;
}
}
else
;
if(m==1)
{
break;
}
}
return 0;
}</span>原文:http://blog.csdn.net/kaiyang_shao/article/details/51315611