Skip to content

About

高级语言程序设计 期末大作业

Resources

Stars

0 stars

Watchers

0 watching

Forks

Latest commit

 

History

28 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

代码相似度检测系统 使用指南

功能说明

本程序可以比较任意两个C语言源代码文件的结构相似度,用于:

  • 作业查重
  • 代码抄袭检测
  • 代码重复度分析

编译方法

方法:使用CMake(推荐)

cd CourseDesignTasks
mkdir build
cd build
cmake ..
make

使用方法

基本语法

./final_app <文件1路径> <文件2路径>

使用示例

示例1:比较示例文件

./final_app codes/code1.c codes/code2.c

示例2:比较任意文件

./final_app /path/to/student1.c /path/to/student2.c

示例3:比较当前目录文件

./final_app main.c backup.c

示例4:Windows路径

./final_app C:\Users\张三\作业1.c C:\Users\李四\作业1.c

输出结果说明

程序会输出详细的处理过程:

╔════════════════════════════════════════════════╗
║      代码相似度检测系统 v1.0                 ║
╚════════════════════════════════════════════════╝

[阶段1] 读取源文件...
✓ 文件读取成功
  - codes/code1.c: 2856 字节
  - codes/code2.c: 856 字节

[阶段2] 代码结构分析...

=== 处理文件: codes/code1.c ===
  [步骤1] 词法分析中...
  ✓ 共识别 450 个Token
  [步骤2] 语法分析中...
  ✓ AST构建成功
  [步骤3] AST序列化中...
  ✓ 序列化完成,生成 1200 个标记

=== 处理文件: codes/code2.c ===
  [步骤1] 词法分析中...
  ✓ 共识别 120 个Token
  [步骤2] 语法分析中...
  ✓ AST构建成功
  [步骤3] AST序列化中...
  ✓ 序列化完成,生成 350 个标记

[阶段3] 计算相似度...
  [步骤4] 计算编辑距离...
  ✓ 编辑距离: 850
  ✓ 序列长度: A=1200, B=350

╔════════════════════════════════════════════════╗
║               相似度分析结果                   ║
╠════════════════════════════════════════════════╣
║  文件1: codes/code1.c                         ║
║  文件2: codes/code2.c                         ║
╠════════════════════════════════════════════════╣
║  结构相似度: 29.17%                           ║
╠════════════════════════════════════════════════╣
║  判定: 【不相似】代码结构差异大              ║
╚════════════════════════════════════════════════╝

相似度判定标准

相似度范围 判定结果 说明
≥ 90% 【高度相似】可能存在抄袭 代码结构几乎完全相同
60% - 90% 【中度相似】需人工审查 有较多相似的结构
30% - 60% 【低度相似】部分结构相同 可能使用了相似算法
< 30% 【不相似】代码结构差异大 基本是不同的代码

常见问题

Q1: 可以比较任意文件吗?

A: 可以!文件路径完全由命令行参数指定,不限于codes目录。

Q2: 支持哪些文件?

A: 支持任何C语言源代码文件(.c, .h等文本文件)。

Q3: 文件路径可以用中文吗?

A: 可以,但建议使用英文路径以避免编码问题。

Q4: 可以比较不同目录的文件吗?

A: 可以!只要提供正确的路径即可。

Q5: 没有参数会怎样?

A: 程序会显示用法说明并退出。

$ ./final_app
用法: ./final_app <文件1.c> <文件2.c>

示例:
  ./final_app codes/code1.c codes/code2.c

技术原理

程序采用以下步骤检测相似度:

  1. 词法分析:将代码转换为Token序列,同时归一化变量名
  2. 语法分析:构建抽象语法树(AST),捕捉代码结构
  3. 序列化:将AST转换为标准化的字符串序列
  4. 相似度计算:使用Levenshtein编辑距离算法计算序列差异

这种方法可以:

  • ✅ 忽略变量名差异
  • ✅ 忽略格式和空格
  • ✅ 忽略注释
  • ✅ 关注代码结构和逻辑

因此即使学生改了变量名、调整了格式,只要逻辑相同,仍能检测出高相似度。

示例测试

测试1:完全不同的代码

./final_app codes/code1.c codes/code2.c

预期结果:相似度很低(< 30%)

测试2:相同代码改变量名

创建两个文件:

// test1.c
int main() {
    int sum = 0;
    for (int i = 0; i < 10; i++) {
        sum += i;
    }
    return sum;
}

// test2.c
int main() {
    int total = 0;
    for (int j = 0; j < 10; j++) {
        total += j;
    }
    return total;
}
./final_app test1.c test2.c

预期结果:相似度很高(> 90%),因为结构完全相同

开发者信息

  • 版本:v2.0
  • 语言:C11
  • 依赖:标准C库

About

高级语言程序设计 期末大作业

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages