程序设计大作业---程序相似性比较方法(变量新)

【问题描述】

程序相似性比较方法之一就是将源程序中无关信息(如变量名、空白符等)删除后的代码进行比较。编写程序将当前目录下C源文件input.c中的变量名、空白字符删除后写到另一个文件output.c中。

【输入形式】

要处理的C源文件名为input.c,在当前目录下,并假设该文件符合以下条件:
1、程序中只有一个main函数;
2、最多只可能出现一个int类型变量列表(也可能没有),无其它类型变量说明或定义,并且在程序其它地方不会再出现int关键字;
3、定义的int类型变量的个数不超过10个,变量名的长度不超过20个字符;
4、源文件中不含注释;
5、程序没有语法错误;
6、字符串常量中不会出现与变量名相同的串;
7、程序中所有标识符均与其它部分有空格分隔(即可用格式串%s读取),所有标识符的长度不超过20个字符;并且int类型变量定义中的分隔符’,’和结束符’;’与其它部分也有空格分隔;
8、程序中可以有int类型数组定义,在数组定义和使用时,数组名与其它部分也有空格隔开。

【输出形式】

将源程序文件input.c处理后的结果写入到当前目录下的文件output.c中,输出要求:
1、所有空白字符(包括空格、制表符和回车符)都要删除;
2、定义的int类型变量(包括定义的数组名)都要删除,但不删除定义时用到的分隔符’,’;
3、语句中所有int类型变量名(包括数组名)都要删除。

【样例输入】

假如input.c文件内容如下:

#include 
main ()
{
     int  a , b , sum , arr [10] ;
     scanf ( "%d%d", & a , & b );
     arr [0] = a ;
     arr [1] = b ;
     sum = arr [0] + arr [1] ;
     printf ( "%d", sum );
}

【样例输出】

output.c内容应为:

includemain(){int,,,[10];scanf("%d%d",&,&);[0]=;[1]=;=[0]+[1];printf("%d",);}

【样例说明】

在源文件input.c中,定义了三个int类型变量:a,b,sum,以及一个int类型数组arr,将程序中所有空白符(空格、制表符、回车符)、变量名a、b、sum和数组名arr删除后,就只剩一行字符串(见output.c中内容)。

提示:
1、可以用fscanf(fp,”%s”,str)函数将fp文件中的内容以单词的形式读出,到达文件结尾时该函数返回EOF;

2、可以用strcmp函数比较两个字符串,用strcpy函数拷贝字符串,这两个函数定义在

3、int单词后(分号之前)的所有单词(逗号和数组定义的中括号部分除外)都是要删除的变量名。

#include 
#include 
#include 
int main() {
    FILE *f, *g;
    int i, j, k=0, t = 0,flag=0;
    char words[200][20],ch[20][20];

    f = fopen("input.c", "r");
    g = fopen("output.c", "w");

    while (!feof(f)) {
        fscanf(f, "%s", words[k++]);
    }
    rewind(f);

    for (i = 0; i < k; i++) {
        if (strcmp(words[i], "int")==0) {
            i+=1;
            while (strcmp(words[i], ";") != 0) {
                char c = words[i][0];
                if ((strcmp(words[i], ",") != 0)&&(c!='[')) {
                    strcpy(ch[t++], words[i]);
                }
                i++;
            }
            break;
        }
    }
    for (i = 0; i < k ; i++) {
        for (j = 0; j < t; j++) {
            if (strcmp(words[i], ch[j]) == 0) {
                flag = 1;
            }
        }
        if (!flag) {
            fprintf(g, "%s", words[i]);
        }
        flag = 0;
    }
    fclose(f);
    fclose(g);

}

你可能感兴趣的:(C)