题目描述
已知一群学生的考试试卷,要求对试卷内容进行对比,查找是否有抄袭。
每张试卷包含:学号(整数类型)、题目1答案(字符串类型)、题目2答案(字符串类型)、题目3答案(字符串类型)
要求:使用结构体来存储试卷的信息。定义一个函数,返回值为一个整数,参数是两个结构体指针,函数操作是比较两张试卷的每道题目的答案,如果相同题号的答案相似度超过90%,那么就认为有抄袭,函数返回抄袭题号,否则返回0。相似度是指在同一题目中,两个答案的逐个位置上的字符两两比较,相同的数量大于等于任一个答案的长度的90%,就认为抄袭。
struct Student{
int no;
char *ans[3];
};
//设置进位的精度为0.1?就是只要小数点后第一个数字为0,无论后面是什么都不进位,不为0则直接进位
int pos_ceil(double x){
if(x-int(x)<0.1)
return int(x);
else
return int(x+1);
}
int strcmp(char *x,char *y){
int lenX=getstrlen(x);
int lenY=getstrlen(y);
//用最短的答案比较
int len=lenX<lenY?lenX:lenY;
int counter=0;
for(int i=0;i<len;i++){
if(*(x+i)==*(y+i))
counter++;
}
//10*0.9!=9,浮点数并不是精确的,有误差,需要手动消除
if(counter>=pos_ceil(len*0.9))
return 1;
else
return 0;
}
Student stu[t];
for(int i=0;i<t;i++){
//记得delete
for(int j=0;j<3;j++)
stu[i].ans[j] = new char[20];
cin>>stu[i].no>>stu[i].ans[0]>>stu[i].ans[1]>>stu[i].ans[2];
}
//i:当前学生、j:与当前学生进行比较的学生、k:进行比较的试卷编号
for(int i=0;i<t-1;i++){
for(int j=i+1;j<t;j++){
for(int k=0;k<3;k++){
if(strcmp(stu[i].ans[k],stu[j].ans[k]))
cout<<stu[i].no<<' '<<stu[j].no<<' '<<k+1<<endl;
}
}
}
for(int i=0;i<t;i++){
for(int j=0;j<3;j++)
delete stu[i].ans[j];
}