逻辑行计数
来源:互联网 发布:uc矩阵子系统划分例题 编辑:程序博客网 时间:2024/05/15 06:43
问题描述
背景
有一个软件公司常常用一种不为人知的语言来开发程序,这个语言的特点如下:
- 有两种形式的字符串,一种为加单引号,另一种加双引号。单引号的字符串可以包含双引号,双引号的字符串也可以包含单引号。字符串不能分行,其中也不能包含同样的引号字符。
- 有两种注释方式:@字符为行注释,而双括号(())内的文本为块注释。
- 块注释不能嵌套,所有在块中的文本均被忽略。一个块可以包含几行文本。
- 注释不能出现在字符串内。
- 在块注释中的行注释字符和引号都是没有意义的。
- 注释行中的双括号和引号都是没有意义的。
- 程序的任何部分都不能出现“#”字符;即使在字符串或注释内。
- 分号用来终止语句和生命。每个不在注释或字符串中的分号都被作为程序逻辑行的结束。
可以用逻辑行数来粗略地评估程序的大小,即计算不在注释或字符串内的分号的个数。写一个程序读进去几组程序代码,对每组代码都输出逻辑行数和物理行数,并对未终止的注释块和字符串发出警告消息。
输入
输入包含一个或多个程序,以#表示每个程序终止,以##表示输入终止。
输出
对于包括未终止字符串的行,输出:“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用相应的数字代替。
- ((Block comment:))↵
- "string";('another string;');@line comment↵
- ##↵
- Program 1 contains 2 logical lines and 2 physical lines.↵
大致思路:
字符用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>
- 逻辑行计数
- 14. 逻辑行计数
- BIT 程序设计 [模拟] 逻辑行计数
- 2013-BIT程序设计 8.逻辑行计数 -- 模拟
- 行计数
- 计数
- 计数
- 计数
- 计数
- 计数
- 计数
- 计数
- 计数
- 如何将逻辑中后面算出的数据提前输出-- 计数的范围素数
- 键盘输入个数,行,单词计数
- 基于行的逻辑
- 逻辑
- 逻辑
- 增强Eclipse、MyEclipse的代码自动提示功能
- 对象转JSONArray,JSONObject[包括对象中日期格式化,属性过滤]
- 深入Spring
- javaweb学习总结(三十四)——使用JDBC处理MySQL大数据
- java实现顺序查找、二分查找、哈希表查找、二叉排序树查找
- 逻辑行计数
- android 5.0 zygote启动代码流程
- JavaScript 复选框全选和反选
- windows客户端性能测试之内存泄露检查工具umdh.exe
- boost仅运行一次的例程
- Android Json解析
- HDFS跨集群数据合并方案之ViewFileSystem
- 【算法】字符流中第一个不重复的字符
- HDU 1176 免费馅饼