抄袭检测程序 功能要求: 给定两个字符长度为1000的字符串,对A字符串的内容进行抄袭检测。如果发现A字符与B字符中连续6个字符相同,则统计抄袭字数为6,当全部检测完毕后,统计出抄袭字数占A字符的比率; 显示所有抄袭部分文字; 要求使用两种不同的方法进行处理;用C语言数据结构,并将两个代码合并成一个代码
时间: 2023-12-14 15:36:21 浏览: 105
以下是使用两种不同方法进行抄袭检测的C语言代码合并版:
```c
#include <stdio.h>
#include <string.h>
#define MAX_LENGTH 1000 // 定义字符串最大长度
// 方法一:暴力匹配
float check_plagiarism_1(char* A, char* B) {
int plag_count = 0; // 抄袭字数统计
float plag_ratio; // 抄袭比率
char plag_text[MAX_LENGTH] = ""; // 抄袭部分文字
int i, j, k;
int A_length = strlen(A);
int B_length = strlen(B);
for (i = 0; i < A_length; i++) { // 遍历A字符串
for (j = 0; j < B_length; j++) { // 遍历B字符串
if (A[i] == B[j]) { // 如果字符相同
for (k = 1; k < 6; k++) { // 向后匹配5个字符
if (A[i+k] != B[j+k]) {
break; // 如果不相同,跳出循环
}
}
if (k == 6) { // 如果匹配成功
plag_count += 6; // 抄袭字数加6
strncat(plag_text, &A[i], 6); // 抄袭部分文字添加到plag_text中
}
}
}
}
plag_ratio = (float)plag_count / A_length; // 计算抄袭比率
printf("方法一:\n");
printf("抄袭字数:%d\n", plag_count);
printf("抄袭比率:%f\n", plag_ratio);
printf("抄袭部分文字:%s\n", plag_text);
return plag_ratio;
}
// 方法二:哈希匹配
float check_plagiarism_2(char* A, char* B) {
int plag_count = 0; // 抄袭字数统计
float plag_ratio; // 抄袭比率
char plag_text[MAX_LENGTH] = ""; // 抄袭部分文字
int i, j;
int A_length = strlen(A);
int B_length = strlen(B);
const int base = 131; // 哈希算法的进制数
long long A_hash[MAX_LENGTH] = {0}; // 存储A字符串前缀的哈希值
long long B_hash; // 存储B字符串子串的哈希值
long long power[MAX_LENGTH] = {0}; // 存储进制的幂次方
power[0] = 1; // 第一个幂次方为1
for (i = 1; i < A_length; i++) {
power[i] = power[i-1] * base; // 计算进制的幂次方
}
A_hash[0] = A[0]; // 第一个字符的哈希值为本身
for (i = 1; i < A_length; i++) {
A_hash[i] = A_hash[i-1] * base + A[i]; // 计算前缀的哈希值
}
for (i = 0; i < B_length-5; i++) { // 遍历B字符串子串
B_hash = 0; // 子串的哈希值初始化为0
for (j = 0; j < 6; j++) {
B_hash = B_hash * base + B[i+j]; // 计算子串的哈希值
}
for (j = 0; j < A_length-5; j++) { // 遍历A字符串前缀
if (B_hash * power[j] == A_hash[j+5] - A_hash[j] * power[5]) { // 如果哈希值相同
plag_count += 6; // 抄袭字数加6
strncat(plag_text, &A[j], 6); // 抄袭部分文字添加到plag_text中
}
}
}
plag_ratio = (float)plag_count / A_length; // 计算抄袭比率
printf("方法二:\n");
printf("抄袭字数:%d\n", plag_count);
printf("抄袭比率:%f\n", plag_ratio);
printf("抄袭部分文字:%s\n", plag_text);
return plag_ratio;
}
int main() {
char A[MAX_LENGTH], B[MAX_LENGTH]; // 定义两个字符串
float plag_ratio_1, plag_ratio_2; // 抄袭比率
printf("请输入A字符串:");
fgets(A, MAX_LENGTH, stdin);
printf("请输入B字符串:");
fgets(B, MAX_LENGTH, stdin);
A[strlen(A)-1] = '\0'; // 去掉fgets函数自动添加的换行符
B[strlen(B)-1] = '\0';
plag_ratio_1 = check_plagiarism_1(A, B);
plag_ratio_2 = check_plagiarism_2(A, B);
if (plag_ratio_1 > plag_ratio_2) {
printf("\n方法一检测到的抄袭比率更高!\n");
} else if (plag_ratio_1 < plag_ratio_2) {
printf("\n方法二检测到的抄袭比率更高!\n");
} else {
printf("\n两种方法检测到的抄袭比率相同!\n");
}
return 0;
}
```
阅读全文