逻辑行计数

问题描述

背景

有一个软件公司常常用一种不为人知的语言来开发程序,这个语言的特点如下:

  1. 有两种形式的字符串,一种为加单引号,另一种加双引号。单引号的字符串可以包含双引号,双引号的字符串也可以包含单引号。字符串不能分行,其中也不能包含同样的引号字符。
  2. 有两种注释方式:@字符为行注释,而双括号(())内的文本为块注释。
  3. 块注释不能嵌套,所有在块中的文本均被忽略。一个块可以包含几行文本。
  4. 注释不能出现在字符串内。
  5. 在块注释中的行注释字符和引号都是没有意义的。
  6. 注释行中的双括号和引号都是没有意义的。
  7. 程序的任何部分都不能出现“#”字符;即使在字符串或注释内。
  8. 分号用来终止语句和生命。每个不在注释或字符串中的分号都被作为程序逻辑行的结束。

可以用逻辑行数来粗略地评估程序的大小,即计算不在注释或字符串内的分号的个数。写一个程序读进去几组程序代码,对每组代码都输出逻辑行数和物理行数,并对未终止的注释块和字符串发出警告消息。

输入

输入包含一个或多个程序,以#表示每个程序终止,以##表示输入终止。

输出

对于包括未终止字符串的行,输出:“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. ((Block comment:))?
  2. "string";(‘another string;‘);@line comment?
  3. ##?

以文本方式显示

  1. Program 1 contains 2 logical lines and 2 physical lines.?

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>
时间: 2024-08-02 15:16:05

逻辑行计数的相关文章

Python中“物理行”和“逻辑行”的区别。

物理行:就是程序员所写代码的所在行. 逻辑行:是指源代码经过预编译后,代码所在的那一行. Python假定每个物理行都对应着一个逻辑行.例如:print( "Hello World" ) 就是一个物理行,Python希望每行只有一个语句,因为这样看起来更加易读. 如果你想要在一个物理行中使用多于一个逻辑行,那么你需要使用分号(; )来特别地标明这种用法.分号表示一个逻辑行/语句的结束. 例如: count = 5 print ( "count" ) 与下面的语句等同

TCPL 行计数

C programming language: P13 行计数 e.g. #include <stdio.h>int main(void){    int c, nb, nt, nl;    nb=0, nt=0, nl=0;    while((c=getchar())!='0'){    if(c==' ')        ++nb;    if(c=='\t')        ++nt;        if(c=='\n')        ++nl;    }        printf

Python 逻辑行/物理行

物理行是你在编写程序时所看见的. 逻辑行是Python看见的单个语句.Python假定每个物理行对应一个逻辑行 . 默认地,Python希望每行都只使用一个语句,这样使得代码更加易读. 如果你想要在一个物理行中使用多于一个逻辑行,那么你需要使用分号(;)来特别地标明这种用法.分号表示一个逻辑行/语句的结束. 例如: i = 5 print i 与下面这个相同: i = 5; print i; 同样也可以写成: i = 5; print i; 甚至可以写成: i = 5; print i 然而,我

T-SQL 查询分区详细信息和行计数

--paritioned table and index detailsSELECT OBJECT_NAME(p.object_id) AS ObjectName, i.name AS IndexName, p.index_id AS IndexID, ds.name AS PartitionScheme, p.partition_number AS PartitionNumber, fg.name AS FileGroupName, prv_left.value AS LowerBoundar

Percona TokuDB

Percona TokuDB Percona TokuDB. 1 1.     TokuDB说明... 1 2.     TokuDB安装... 1 3.     使用TokuDB. 1 3.1 快速插入和富索引... 1 3.2 聚集secondary索引... 1 3.3 在线索引创建... 1 3.4 在线添加,删除,扩展,重命名列... 1 3.5            压缩细节... 1 3.6 修改表的压缩... 1 3.7 无io读复制... 1 3.8 事务和ACID兼容恢复..

逻辑行和物理行

物理行是你在编写程序时所 看见 的.逻辑行是Python 看见 的单个语句.Python假定每个 物理行 对应一个 逻辑行 .逻辑行的例子如print 'Hello World'这样的语句——如果它本身就是一行(就像你在编辑器中看到的那样),那么它也是一个物理行.默认地,Python希望每行都只使用一个语句,这样使得代码更加易读.如果你想要在一个物理行中使用多于一个逻辑行,那么你需要使用分号(;)来特别地标明这种用法.分号 #例如: i = 5 print i #与下面这个相同: i = 5;

shell 脚本,在调试时,FOR循环那行代码,总是出现错误syntax error near unexpected token do(转)

这种情况发生的原因是因为你所处理的文件换行符是dos格式的"\r\n" 可以使用cat -v 文件名 来查看换行符是否是,如果是上述的,则行结尾会是^m 需要转换成linux/unix格式的"\n" 具体转换办法就是转换换行符 可以用sed命令处理一下文件,命令如下: sed 's/\r//' 原文件 >转换后文件 sed 命令的参数中 "代表决定引用参数,不允许参数中的值让shell解释,s代表替换 /后面跟的是被替换的内容,后面的//代表替换后的

算法总结——三大排序(快排,计数排序,归并)

快排: 适用条件:方便...只要数字不是很多 复杂度:O(nlogn)  每一层n复杂度,共logn层 原理:利用一个随机数与最后面一个数交换,那么这个随机数就到了最后一位,然后循环,如果前面的数大于最后一个数,那么把这个数放到前面去,经过一次排序之后,前面的数都是大于最后一个的,然后对1到k和k+1到n进行排序,一层一层地下去 模板: #include<cstdio> #include<algorithm> #include<time.h> using namespa

EmEdit选择多行内容

EmEdit是个非常好的软件,功能非常齐全,而且G级别文件轻易可打开. 作者经常使用文本需要选中几万行的数据,如果用鼠标下拉非常耗费时间下面说个我研究出来的方法. 举例,现在有个1000行当文本,我只需要里面500-800行内容. 操作方法一: 鼠标点击到500行开头. 按Ctrl+F8 滚动右侧滚条到调到第800行,鼠标点击第800行,即可选中这300行当区间. 如果你的行数比较大几十万或几百万行. 操作方法二: 鼠标点击到500行开头. 按Ctrl+F8 按Ctrl+G,后输入你要跳转到的行