用python实现【问题描述】 有一种比较两程序是否相似的方法:将程序中控制结构信息按出现次序抽取出来形成一个控制流串,然后依据两个程序的控制流串来计算两个程序的相似度。 编写一程序,抽取一个C程序的控制流串。要求只考虑if, else, for, while, switch, case等控制流关键字,其它控制流不被考虑。被处理的C程序满足: 1. 能够通过C编译; 2. 一行可能有多条语句; 3. 注释、字符串常量及其它标识符中不含控制流关键字串; 【输入形式】 要处理的C程序保存在当前目录下,文件名为:in.c。 【输出形式】 按出现的先后顺序将控制流关键字串输出到当前目录下的out.txt文件中,各关键字串之间没有任何分隔符。若没有控制流关键字,则将No answer输出到文件中。 【样例输入1】 假设当前目录下in.c的内容为: #include <stdio.h> int main() { int n,a,c1,c2,i; scanf("%d",&n); c1=c2=0; for ( i=0; i<n; i++ ) { scanf("%d",&a); if ( a>=0 ) c1++; else c2++; } printf("%d %d",&c1,&c2); } 【样例输出1】 在当前目录下将创建out.txt文件,其内容应为: forifelse 【样例输入2】 假如当前目录下in.c源程序风格不太好,内容如下: #include <stdio.h> main() { int a,b,max,min; scanf("%d%d",&a,&b); if(a>b){max=a;min=b;}else if(a<b){max=b;min=a;}else{max=min=a;} printf("%d %d",max,min); } 【样例输出2】 在当前目录下将创建out.txt文件,其内容应为: ifelseifelse 【样例说明】 样例1中源程序只包含for、if、else三个控制流关键字,因此按照出现顺序将这三个关键字输出到文件out.txt中;样例2中控制流关键字出现顺序为:if、else、if、else,故将这四个关键字输出到out.txt中。 算法提示:从in.c中读取标识符时,可将除字母、数字、下划线之外的其它字符作为标识符的分隔符。
时间: 2024-01-23 14:04:17 浏览: 86
以下是Python实现代码:
```python
# 读取输入文件
with open('in.c', 'r') as f:
content = f.read()
# 定义控制流关键字
keywords = ['if', 'while', 'for', 'switch', 'case', 'else']
# 从源码中提取控制流关键字
flow = []
i = 0
while i < len(content):
# 跳过注释
if content[i:i+2] == '/*':
i += content[i:].find('*/') + 2
elif content[i] == '#': # 跳过预处理指令
i += content[i:].find('\n') + 1
elif content[i] == '"': # 跳过字符串常量
i += content[i+1:].find('"') + 2
elif content[i] == "'": # 跳过字符常量
i += content[i+1:].find("'") + 2
elif content[i].isalpha(): # 读取标识符
j = i + 1
while j < len(content) and (content[j].isalnum() or content[j] == '_'):
j += 1
token = content[i:j]
if token in keywords:
flow.append(token)
i = j
else:
i += 1
# 将控制流关键字输出到输出文件
if flow:
with open('out.txt', 'w') as f:
f.write(''.join(flow))
else:
with open('out.txt', 'w') as f:
f.write('No answer')
```
这段代码首先读取输入文件中的C程序源码,然后从源码中提取控制流关键字,最后将关键字按出现的先后顺序输出到输出文件中。具体步骤如下:
1. 定义控制流关键字。
2. 从源码中循环读取每一个字符,根据不同情况执行不同的操作:
1. 如果是注释,则跳过注释内容。
2. 如果是预处理指令,则跳过整行。
3. 如果是字符串常量,则跳过整个字符串。
4. 如果是字符常量,则跳过整个字符。
5. 如果是字母,则读取标识符并判断是否是控制流关键字,是则加入到控制流列表中。
6. 否则跳过当前字符。
3. 将控制流关键字列表输出到输出文件中,如果列表为空则输出"No answer"。
注意,这里需要了解Python字符串的一些方法,如`find()`、`isalpha()`、`isalnum()`等,以及列表的一些方法,如`append()`、`join()`等。此外,还需要了解C语言的基本语法和控制流关键字的用法。
阅读全文