栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

(Python)程序结构抽取

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

(Python)程序结构抽取

【问题描述】
有一种比较两程序是否相似的方法:将程序中控制结构信息按出现次序抽取出来形成一个控制流串,然后依据两个程序的控制流串来计算两个程序的相似度。编写一程序,抽取一个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 scanf("%d",&a);
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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/349684.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号