c语言编程!求大神帮忙,采纳后会加追加20分~~小妹在此谢过了
背景有一个软件公司常常用一种不为人知的语言来开发程序,这个语言的特点如下:有两种形式的字符串,一种为加单引号,另一种加双引号。单引号的字符串可以包含双引号,双引号的字符串...
背景
有一个软件公司常常用一种不为人知的语言来开发程序,这个语言的特点如下:
有两种形式的字符串,一种为加单引号,另一种加双引号。单引号的字符串可以包含双引号,双引号的字符串也可以包含单引号。字符串不能分行,其中也不能包含同样的引号字符。
有两种注释方式:@字符为行注释,而双括号(())内的文本为块注释。
块注释不能嵌套,所有在块中的文本均被忽略。一个块可以包含几行文本。
注释不能出现在字符串内。
在块注释中的行注释字符和引号都是没有意义的。
注释行中的双括号和引号都是没有意义的。
程序的任何部分都不能出现“#”字符;即使在字符串或注释内。
分号用来终止语句和生命。每个不在注释或字符串中的分号都被作为程序逻辑行的结束。
可以用逻辑行数来粗略地评估程序的大小,即计算不在注释或字符串内的分号的个数。写一个程序读进去几组程序代码,对每组代码都输出逻辑行数和物理行数,并对未终止的注释块和字符串发出警告消息。
输入
输入包含一个或多个程序,以#表示每个程序终止,以##表示输入终止。
输出
对于包括未终止字符串的行,输出:“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.
1、#、##不一定单独成行(这就是交了10+的原因了)#或者##可能出现在每行的最后。而且#、##不管是单独成行还是和其他字符处在同一行,它们所在行都不算是物理行。(感觉很无助,最后一次就是WA。单独成行不算就忍了,所在行有其他字符还不算,实在不能忍)
2、即使
;;;
((#
最后这一行也不算是注释。输出也是3行逻辑行,1行物理行
3、一个程序可能是由多行输入组成的。最开始是把全部放在一个一维字符数组中。结果一直RE。数组开大一点又MLE。(这道题还好没有TLE)需要注意的是,最后两个例子的内存是1024K,而例子中会出现一行就有1000000个字符的情况,char
a[1000000]已经接近1024K。所以,想全部存下来再扫是不现实的。唯有一行一行地处理。
还要说一下,没有#、##在输入行中间的情况,如adad#ass;没有双括号被拆分的情况 展开
有一个软件公司常常用一种不为人知的语言来开发程序,这个语言的特点如下:
有两种形式的字符串,一种为加单引号,另一种加双引号。单引号的字符串可以包含双引号,双引号的字符串也可以包含单引号。字符串不能分行,其中也不能包含同样的引号字符。
有两种注释方式:@字符为行注释,而双括号(())内的文本为块注释。
块注释不能嵌套,所有在块中的文本均被忽略。一个块可以包含几行文本。
注释不能出现在字符串内。
在块注释中的行注释字符和引号都是没有意义的。
注释行中的双括号和引号都是没有意义的。
程序的任何部分都不能出现“#”字符;即使在字符串或注释内。
分号用来终止语句和生命。每个不在注释或字符串中的分号都被作为程序逻辑行的结束。
可以用逻辑行数来粗略地评估程序的大小,即计算不在注释或字符串内的分号的个数。写一个程序读进去几组程序代码,对每组代码都输出逻辑行数和物理行数,并对未终止的注释块和字符串发出警告消息。
输入
输入包含一个或多个程序,以#表示每个程序终止,以##表示输入终止。
输出
对于包括未终止字符串的行,输出:“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.
1、#、##不一定单独成行(这就是交了10+的原因了)#或者##可能出现在每行的最后。而且#、##不管是单独成行还是和其他字符处在同一行,它们所在行都不算是物理行。(感觉很无助,最后一次就是WA。单独成行不算就忍了,所在行有其他字符还不算,实在不能忍)
2、即使
;;;
((#
最后这一行也不算是注释。输出也是3行逻辑行,1行物理行
3、一个程序可能是由多行输入组成的。最开始是把全部放在一个一维字符数组中。结果一直RE。数组开大一点又MLE。(这道题还好没有TLE)需要注意的是,最后两个例子的内存是1024K,而例子中会出现一行就有1000000个字符的情况,char
a[1000000]已经接近1024K。所以,想全部存下来再扫是不现实的。唯有一行一行地处理。
还要说一下,没有#、##在输入行中间的情况,如adad#ass;没有双括号被拆分的情况 展开
2个回答
展开全部
(())注释
"",''字符串
()改变优先级
;语句结束
@注释
# 、##
。。。。
主要就是配对判断,也不算很难。以()为例,找到一个'('就入栈,找到一个')'就出栈,如果在‘;’前刚好出栈完毕,说明正确,如果遇到;后还有'('说明缺失‘)’,如果遇到;还有')'说明少了'('。栈用链表进行存储(新增加的节点放在前面,节点中记录行号,列号也可以记录。。)。
如果遇到‘((’那么下面的所有字符都当成注释处理,直接找‘))’。
如果遇到"",'',其他所有字符除'',"",# 外都当成一般字符处理
如果在没有遇到@、((、“、‘ 前遇到字母、数字等,当成普通字符处理
。。。。。
在读取文件时,只要一次读一定数量就可以了,不需要一次读一整行(不管是物理行还是逻辑行),一行的长度是不定的。行(物理行)只是对用户有些有效,处理程序会忽略掉。假如读入100个字符,第99个刚好是 ';',最后一个个为'(',这时候还不能判断'('是括号还是注释'((',可以将'('挪到开头,再读入99个字符做判断。
大概就这样吧
追问
看私信。。。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询