12. Plágiumkereső

Czirkos Zoltán · 2019.02.27.

UML

plagium.zip letöltése

#include <algorithm>
#include <string>
#include <fstream>
#include <iostream>
#include <set>
#include <vector>
#include <iterator>


struct Dolgozat {
    std::string fnev, nev, neptun;
    std::set<std::string> parok;

    Dolgozat(std::string fnev, std::string nev, std::string neptun)
        : fnev(fnev), nev(nev), neptun(neptun)
    {
        std::ifstream is(fnev);
        std::string uj, elozo;
        is >> elozo;
        while (is >> uj) {
            parok.insert(elozo + " " + uj);
            elozo = uj;
        }
    }
};

std::vector<Dolgozat> dolgozatok_beolvas(std::string input_fnev) {
    std::vector<Dolgozat> dolgozatok;
    std::ifstream is(input_fnev);
    std::string fnev, neptun, nev;
    while (is >> fnev >> neptun) {
        std::getline(is, nev);
        dolgozatok.push_back(Dolgozat(fnev, nev, neptun));
    }
    return dolgozatok;
}

struct Hasonlosag {
    Dolgozat const *d1, *d2;
    double mertek;
    Hasonlosag(Dolgozat const * d1, Dolgozat const * d2)
        : d1(d1), d2(d2)
    {
        std::set<std::string> metszet;
        std::set_intersection(d1->parok.begin(), d1->parok.end(),
                              d2->parok.begin(), d2->parok.end(),
                              std::inserter(metszet, metszet.begin()));
        mertek = std::max(
                    (double)metszet.size() / (double)d1->parok.size(),
                    (double)metszet.size() / (double)d2->parok.size());
    }
    bool operator< (Hasonlosag const & masik) const {
        return this->mertek < masik.mertek;
    }
};

std::vector<Hasonlosag> hasonlit(std::vector<Dolgozat> const & dolgozatok) {
    std::vector<Hasonlosag> hasonlosagok;
    for (size_t i = 0; i != dolgozatok.size(); ++i)
        for (size_t j = i+1; j != dolgozatok.size(); ++j)
            hasonlosagok.push_back(Hasonlosag(&dolgozatok[i], &dolgozatok[j]));
    return hasonlosagok;
}

int main() {
    std::vector<Dolgozat> dolgozatok = dolgozatok_beolvas("input.ctr");
    std::vector<Hasonlosag> hasonlosagok = hasonlit(dolgozatok);
    std::sort(hasonlosagok.rbegin(), hasonlosagok.rend());  /* reverse iterator! */
    for (size_t i = 0; i < 20; ++i)
        std::cout << hasonlosagok[i].mertek*100
                  << "% " << hasonlosagok[i].d1->fnev
                  << " " << hasonlosagok[i].d2->fnev << std::endl;
}