【问题描述】
有一种比较两程序是否相似的方法:将程序中控制结构信息按出现次序抽取出来形成一个控制流串,然后依据两个程序的控制流串来计算两个程序的相似度。编写一程序,抽取一个C程序的控制流串。要求只考虑if, else, for, while, switch, case等控制流关键字,其它控制流不被考虑。被处理的C程序满足:
1.能够通过C编译;
2. 一行可能有多条语句;
3. 注释、字符串常量及其它标识符中不含控制流关键字串;
【输入形式】
要处理的C程序保存在当前目录下,文件名为:in.c。
【输出形式】
按出现的先后顺序将控制流关键字串输出到当前目录下的out.txt文件中,各关键字串之间没有任何分隔符。若没有控制流关键字,则将No answer输出到文件中。
【样例输入1】
假设当前目录下in.c的内容为:
#include
int main(){
int n,a,c1,c2,i;
scanf("%d",&n);
c1=c2=0;
for ( i=0; i
if ( a>=0 )
c1++;
else
c2++;
}
printf("%d %d",&c1,&c2);
}
【样例输出1】
在当前目录下将创建out.txt文件,其内容应为:
forifelse
【样例输入2】
假如当前目录下in.c源程序风格不太好,内容如下:
#include
main(){
int a,b,max,min;
scanf("%d%d",&a,&b);
if(a>b){max=a;min=b;}else if(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



