diff --git a/kenobi.cpp b/kenobi.cpp new file mode 100644 index 0000000..041c393 --- /dev/null +++ b/kenobi.cpp @@ -0,0 +1,133 @@ +// g++ -Wall -pedantic -std=c++17 -pthread kenobi.cpp -o kenobi +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include // getline +#include // find +#include // ceil +#include // per gettimeofday + +using namespace std; + +struct Film { + string name; + vector actor_indicies; +}; + +struct Actor { + string name; + vector film_indices; +}; + +map A; // Dizionario {actor_id (key): Actor (value)} +map F; // Dizionario {film_id (value): Film (value)} +int MAX_ACTOR_ID = -1; + +void DataRead() +{ + ifstream actors("data/Attori.txt"); // leggo il file + ifstream movies("data/FilmFiltrati.txt"); // leggo il file + + string s,t; // creo delle stringhe per dopo, notazione triste? Si + const string space /* the final frontier */ = " "; // stringa spazio per dopo + + for (int i = 1; getline(actors,s); i++) + { + if (s.empty()) // serve per saltare le righe vuote, a volte capita + continue; + try { + Actor TmpObj; // creo un oggetto temporaneo della classe Actor + int id = stoi(s.substr(0, s.find(space))); + TmpObj.name = s.substr(s.find(space)+1); + A[id] = TmpObj; // Notazione di Matlab/Python, ma da C++17 funziona + if (id > MAX_ACTOR_ID) + MAX_ACTOR_ID = id; + } catch (...) { + cout << "Could not read the line " << i << " of Actors file" << endl; + } + } + + for (int i = 1; getline(movies,t); i++) + { + if (t.empty()) + continue; + + try{ + Film TmpObj; + int id = stoi(t.substr(0, t.find(space))); + TmpObj.name = t.substr(t.find(space)+1); + F[id] = TmpObj; + } catch (...) { + cout << "Could not read the line " << i << " of Film file" << endl; + } + } +} + +// Inizio a costruire il grafo + +void BuildGraph() +{ + ifstream relations("data/Relazioni.txt"); + string s; + const string space = " "; + + for (int i=1; getline(relations,s); i++){ // Scorro relations + if (s.empty()) + continue; + try { + int id_film = stoi(s.substr(0, s.find(space))); // Indice del film + int id_attore = stoi(s.substr(s.find(space)+1)); // Indice dell'attore + if (A.count(id_attore) && F.count(id_film)) { // Escludi film e attori filtrati + A[id_attore].film_indices.push_back(id_film); + F[id_film].actor_indicies.push_back(id_attore); + } + } catch (...) { + cout << "Could not read the line " << i << " of Releations file" << endl; + } + } +} + +// Stampo il grafo (i primi max_n_film soltanto) +void PrintGraph(size_t max_n_film = 100) +{ + const size_t n = min(max_n_film, F.size()); // Potrebbero esserci meno film di max_n_film + size_t i = 0; + for (const auto& [id_film, film] : F) { // Loop sulle coppie id:film della mappa + cout << id_film << "(" << film.name << ")"; + if (!film.actor_indicies.empty()) { + cout << ":"; + for (int id_attore : film.actor_indicies) + cout << " " << id_attore << "(" << A[id_attore].name << ")"; + } + cout << endl; + + i++; // Tengo il conto di quanti ne ho stampati + if (i >= n) // e smetto quando arrivo ad n + break; + } +} + +// Trova un film in base al titolo, restituisce -1 se non lo trova +int FindFilm(string title) +{ + for (const auto& [id, film] : F) + if (film.name == title) + return id; + return -1; +} + +// Trova un film in base al titolo, restituisce -1 se non lo trova +int FindActor(string name) +{ + for (const auto& [id, actor] : A) + if (actor.name == name) + return id; + return -1; +}