【id:21】【20分】E. 抄袭查找(结构体+指针+函数)时间限制1s内存限制128MB

题目描述

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

每张试卷包含:学号(整数类型)、题目1答案(字符串类型)、题目2答案(字符串类型)、题目3答案(字符串类型)

要求:使用结构体来存储试卷的信息。定义一个函数,返回值为一个整数,参数是两个结构体指针,函数操作是比较两张试卷的每道题目的答案,如果相同题号的答案相似度超过90%,那么就认为有抄袭,函数返回抄袭题号,否则返回0。相似度是指在同一题目中,两个答案的逐个位置上的字符两两比较,相同的数量大于等于任一个答案的长度的90%,就认为抄袭。

输入

第一行输入t表示有t张试卷

第二行输入第1张试卷的学生学号

第三行输入第1张试卷的题目1答案,最大长度不超过100

第四行输入第1张试卷的题目2答案,最大长度不超过100

第五行输入第1张试卷的题目3答案,最大长度不超过100

每张试卷对应4行输入

依次输入t张试卷的数据

输出

在一行中,把发现抄袭的两个学号和题目号输出,只输出第一次发现抄袭的题号,数据之间用单个空格隔开

如果发现是题目1抄袭,题目号为1,以此类推

输出顺序按照输入的学号顺序进行输出

样例查看模式

正常显示查看格式

输入样例1 <-复制

输出样例1

#include<iostream>
#include<string.h>
using namespace std;
struct test
{
    int number;
    char answer1[20];
    char answer2[20];
    char answer3[20];
};
//要求:使用结构体来存储试卷的信息。定义一个函数,返回值为一个整数,
//参数是两个结构体指针,函数操作是比较两张试卷的每道题目的答案,
//如果相同题号的答案相似度超过90%,那么就认为有抄袭,函数返回抄袭题号,
//否则返回0。相似度是指在同一题目中,两个答案的逐个位置上的字符两两比较
//,相同的数量大于等于任一个答案的长度的90%,就认为抄袭。
//先设置一个函数实现目的是返回相同率
bool TestCheck(char* a, char* b)
{
    int count = 0, len = 0;
    while (*a != '\0' && *b != '\0')
    {
        if (*a == *b)
        {
            count++;//相同的数量
        }
        a++, b++, len++;
    }
    if (count >= len * 0.9)//注意这里写成cout/len>=0.9可能会出现问题
    {
        return true;
    }
    else
    {
        return false;
    }
}
int compare(test &a, test &b)
{
    //比较answer1

    if (TestCheck(a.answer1, b.answer1))
    {
        return 1;
    }
    if (TestCheck(a.answer2, b.answer2))
    {
        return 2;
    }
    if (TestCheck(a.answer3, b.answer3))
    {
        return 3;
    }
    else
    {
        return 0;
    }
}//函数实现功能
int main()
{
    int t;
    cin >> t;
    //需要创建一个test类型的动态二维数组
    test* p = new test[t];
    for (int i = 0; i < t; i++)
    {
        cin >> p[i].number;
        cin >> p[i].answer1;
        cin >> p[i].answer2;
        cin >> p[i].answer3;
    }//读取各个数组的值
    for (int i = 0; i < t-1; i++)
    {
        for (int j = i+1 ; j < t; j++)
        {
            int res = compare(p[i], p[j]);
            if (res != 0)
            {
                cout << p[i].number << " " << p[j].number << " " << compare(p[i], p[j]) << endl;
            }
        }
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值