美文网首页
代码对比sim使用说明

代码对比sim使用说明

作者: Colleen_oh | 来源:发表于2020-11-24 17:35 被阅读0次

    sim是一个代码查重,查询代码克隆程度的一个工具。
    sim的下载地址:https://dickgrune.com/Programs/similarity_tester/
    目前sim支持8种编程语言( C, C++, Java, Pascal, Modula-2, Miranda, Lisp, and 8086 assembler )以及文本查重。

    一、安装sim

    环境:ubuntu18,需要安装gcc和flex。请自行apt-get安装.
    由于我的环境是linux,所以需要更改makefile里面的环境配置。

    1.把"For MSDOS + MinGW"那一段给注释掉。

    如下图:


    2. 修改BINDIR和MAN1DIR路径

    如下图:


    3. 将sim.1文件放到MAN1DIR路径路径里面

    sudo cp sim.1 /usr/share/man/man1/
    

    4.安装执行

    make install
    

    如果安装完成后,你会看到以下文件:


    二、简单测试

    放入两段代码,第一段代码命名为a.cpp

    //a.cpp
    #include<stdio.h>
    typedef struct //定义一个新的数据类型
    {
        int yue;//月份
        int tian;//天
    }Date;
    void f(Date x, Date y);//函数声明
    int main()
    {
        Date date1, date2;
        //类型赋值
        printf("输入一个日期(mm/dd):\n");
        scanf_s("%d/%d", &amp;date1.yue, &amp;date1.tian);
        printf("再输入一个日期(在上一个日期之后)(mm/dd):\n");
        scanf_s("%d/%d", &amp;date2.yue, &amp;date2.tian);
        //调用函数
        f(date1, date2);
        return 0;
    }
    void f(Date x, Date y)
    {
        int m, n;
        int t;
        //计算两个日期的天数
        switch (x.yue)
        {
        case 1:m = x.tian; break;
        case 2:m = x.tian + 31; break;
        case 3:m = x.tian + 59; break;
        case 4:m = x.tian + 90; break;
        case 5:m = x.tian + 120; break;
        case 6:m = x.tian + 151; break;
        case 7:m = x.tian + 181; break;
        case 8:m = x.tian + 212; break;
        case 9:m = x.tian + 243; break;
        case 10:m = x.tian + 273; break;
        case 11:m = x.tian + 304; break;
        case 12:m = x.tian + 334; break;
        }
        switch (y.yue)
        {
        case 1:n = y.tian; break;
        case 2:n = y.tian + 31; break;
        case 3:n = y.tian + 59; break;
        case 4:n = y.tian + 90; break;
        case 5:n = y.tian + 120; break;
        case 6:n = y.tian + 151; break;
        case 7:n = y.tian + 181; break;
        case 8:n = y.tian + 212; break;
        case 9:n = y.tian + 243; break;
        case 10:n = y.tian + 273; break;
        case 11:n = y.tian + 304; break;
        case 12:n = y.tian + 334; break;
        }
        //求相差天数
        t = n - m;
        printf("相差的天数:%d\n", t);
    }
    

    下面是第二段代码b.cpp

    //b.cpp
    #include<stdio.h>
    typedef struct //使用结构体
    {
        int month;
        int day;
    }date;
    int f(date d1, date d2);//函数声明
    int main(void)
    {
        date d1, d2;
        printf("输入第一个日期:\n");
        scanf_s("%d,%d", &amp;d1.month, &amp;d1.day);//输入第一个日期
        printf("输入第一个日期:\n");
        scanf_s("%d,%d", &amp;d2.month, &amp;d2.day);//输入第二个日期
        printf("相差%d天", f(d1, d2));//调用函数并输出相差天数
        return 0;
    }
    int f(date d1, date d2)//函数定义
    {
        int x, m, n;
        switch (d1.month)//计算第一个日期是一年的第几天
        {
        case 1:
            m = d1.day;break;
        case 2:
            m = d1.day + 31;break;
        case 3:
            m = d1.day + 59;break;
        case 4:
            m = d1.day + 90;break;
        case 5:
            m = d1.day + 120;break;
        case 6:
            m = d1.day + 151;break;
        case 7:
            m = d1.day + 181;break;
        case 8:
            m = d1.day + 212;break;
        case 9:
            m = d1.day + 243;break;
        case 10:
            m = d1.day + 273;break;
        case 11:
            m = d1.day + 304;break;
        case 12:
            m = d1.day + 334;break;
        }
        switch (d2.month)//计算第二个日期是一年的第几天
        {
        case 1:
            n = d2.day;break;
        case 2:
            n = d2.day + 31;break;
        case 3:
            n = d2.day + 59;break;
        case 4:
            n = d2.day + 90;break;
        case 5:
            n = d2.day + 120;break;
        case 6:
            n = d2.day + 151;break;
        case 7:
            n = d2.day + 181;break;
        case 8:
            n = d2.day + 212;break;
        case 9:
            n = d2.day + 243;break;
        case 10:
            n = d2.day + 273;break;
        case 11:
            n = d2.day + 304;break;
        case 12:
            n = d2.day + 334;break;
        }
        x = m - n;//计算日期差
        if (x &gt;= 0)//返回非负值
            return x;
        else
            return -x;
    }
    

    我把上面两个文件都放在submission文件夹下
    在终端输入:

    sim_c -p submission/a.cpp submission/b.cpp
    

    会有以下结果:

    $ sim_c -p submission/a.cpp submission/b.cpp 
    File submission/a.cpp: 378 tokens, 59 lines
    File submission/b.cpp: 393 tokens, 81 lines
    Total input: 2 files (2 new, 0 old), 771 tokens
    
    submission/a.cpp consists for 90 % of submission/b.cpp material
    

    可以看到相似度。

    三、使用说明

    这里的使用说明只要是根据sim官方给的sim.pdf文件写的,这个文件在官网可以下载。

    相似性测试人员以 ASCII 或 UTF-8 文本作为输入,并生成文本形式(默认或与 -d 或 -n 选项)或百分比形式(使用 -p 选项)。其他格式的输入,例如.pdf或.doc需要通过预处理转换为 ASCII 或 UTF-8-ing 。

    ps:如果任何参数都不加的话 第二个文件会自己和自己对比。
    常用参数如下:

    • -a 将所有新文件与所有文件进行比较。没有显示百分比。
    • -p 输出以相似度百分比给出;请参阅下面的"计算百分比";意味 着-s.
    • -P 报告百分比时,仅显示每个文件的主要参与者。
    • -s 文件的内容不与自身进行比较(s 表示"不是自我")。
    • -S 新文件的内容仅与旧文件进行比较,而不是它们之间。

    参考:https://blog.mythsman.com/post/5d2b46e325601931a5f8d788/

    相关文章

      网友评论

          本文标题:代码对比sim使用说明

          本文链接:https://www.haomeiwen.com/subject/elpiiktx.html