抄袭查找(结构体+指针+函数)

题目描述

已知一群学生的考试试卷,要求对试卷内容进行对比,查找是否有抄袭。

每张试卷包含:学号(整数类型)、题目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];
}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值