(Python)程序结构抽取

113 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

【问题描述】 有一种比较两程序是否相似的方法:将程序中控制结构信息按出现次序抽取出来形成一个控制流串,然后依据两个程序的控制流串来计算两个程序的相似度。编写一程序,抽取一个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中读取标识符时,可将除字母、数字、下划线之外的其它字符作为标识符的分隔符。

实现代码:

 file1 = open("in.c", "r")
 file2 = open("out.txt", "w")
 str = file1.read()
 length = len(str)
 i = 0
 while i < length:
     if str[i:i + 2] == "if":
         file2.write("if")
     elif str[i:i + 4] == "else":
         file2.write("else")
     elif str[i:i + 3] == "for":
         file2.write("for")
     elif str[i:i + 5] == "while":
         file2.write("while")
     elif str[i:i + 6] == "switch":
         file2.write("switch")
     elif str[i:i + 4] == "case":
         file2.write("case")
     i += 1
 ​

运行结果:

样例1

在这里插入图片描述

样例2

在这里插入图片描述