码迷,mamicode.com
首页 > 其他好文 > 详细

逻辑行计数

时间:2016-05-06 16:10:01      阅读:243      评论:0      收藏:0      [点我收藏+]

标签:

问题描述

背景

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

  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>


逻辑行计数

标签:

原文地址:http://blog.csdn.net/kaiyang_shao/article/details/51315611

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!