Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /** Copyright (c) 2018 Tsotne Zarandia */
- #include <fstream>
- #include <iostream>
- #include <list>
- #include <string>
- #include <vector>
- using namespace std;
- class Sagani {
- private:
- inline static int dgeID(const string &dge) {
- constexpr static const char * dgeebi[] { "ორშაბათი", "სამშაბათი",
- "ოთხშაბათი", "ხუთშაბათი", "პარასკევი", "შაბათი" };
- for (int i = 0; i <= 5; i++)
- if (dge == dgeebi[i])
- return i;
- return -1;
- }
- inline static const char * disciplina(int i) {
- constexpr static const char * disciplinebi[] { "ლექცია",
- "სამუშაო ჯგუფი", "პრაქტიკული", "ლაბორატორიული" };
- return disciplinebi[i];
- }
- struct Dro {
- string dge, auditoria, dawyeba, dasruleba;
- Dro(ifstream &fin) {
- string s;
- for (int i = 0; i < 4; i++) {
- getline(fin, s, ':');
- fin.ignore(2);
- getline(fin,
- s == "აუდიტორი" ? auditoria :
- s == "დაწყების დრო" ? dawyeba :
- s == "დასრულების დრო" ? dasruleba : dge);
- }
- if (!dge.empty() && (dge[0] == '-' || dge[0] == ' '))
- dge.clear();
- }
- inline const bool operator <(const Dro &d) {
- return dge == d.dge ?
- dawyeba < d.dawyeba : dgeID(dge) < dgeID(d.dge);
- }
- };
- public:
- string name;
- /* Index: 0 - lekcia, 1 - samushao jgufi, 2 - praktikuli, 3 - lab */
- Dro dronni[4];
- Sagani(string saxeli, ifstream &fin) :
- name(saxeli), dronni { Dro(fin), Dro(fin), Dro(fin), Dro(fin) } { }
- static list<pair<Sagani*, int>> sort(const vector<Sagani*> &sagnebi) {
- list<pair<Sagani*, int>> lst;
- for (auto sagani : sagnebi)
- for (int i = 0; i < 4; i++)
- if (!sagani->dronni[i].dge.empty()) {
- auto it = lst.begin();
- while (it != lst.end()
- && !(sagani->dronni[i]
- < it->first->dronni[it->second]))
- ++it; // დახარისხება ჩასმით
- lst.insert(it, make_pair(sagani, i));
- }
- return lst;
- }
- static void printSagnebi(list<pair<Sagani*, int>> lst, ostream &out) {
- string dge, dasruleba; // buffer
- for (auto l : lst) {
- if (dge != l.first->dronni[l.second].dge) {
- dge = l.first->dronni[l.second].dge;
- out << dge << ":" << endl << endl;
- dasruleba.clear();
- }
- out << "\t" << disciplina(l.second) << ":";
- if (dasruleba > l.first->dronni[l.second].dawyeba)
- out << " <----------"; // წინა საგანს ემთხვევა
- if (dasruleba < l.first->dronni[l.second].dasruleba)
- dasruleba = l.first->dronni[l.second].dasruleba;
- out << endl << "\t\t" << l.first->name << endl << "\t\t"
- << l.first->dronni[l.second].dawyeba << " - "
- << l.first->dronni[l.second].dasruleba << endl << "\t\t"
- << l.first->dronni[l.second].auditoria << endl << endl;
- }
- }
- void write(ostream &out) {
- out << endl << name << endl;
- for (int i = 0; i < 4; i++)
- if (!dronni[i].dge.empty()) {
- out << endl << "\t" << disciplina(i) << endl;
- out << "\t\tდღე: " << dronni[i].dge << endl;
- out << "\t\tაუდ: " << dronni[i].auditoria << endl;
- out << "\t\tდრო: " << dronni[i].dawyeba << " - "
- << dronni[i].dasruleba << endl;
- }
- }
- };
- int main() {
- ifstream fin("cxrili.txt");
- ofstream fout("cxril.txt");
- vector<Sagani*> sagnebi;
- {
- string str;
- while (getline(fin, str))
- sagnebi.push_back(new Sagani(str, fin));
- }
- Sagani::printSagnebi(Sagani::sort(sagnebi), fout);
- cout << "Sagnebis raodenoba: " << sagnebi.size() << endl;
- fout << "საგნების რაოდენობა: " << sagnebi.size() << endl;
- for (auto sagani : sagnebi) {
- sagani->write(fout);
- delete sagani;
- }
- fin.close();
- fout.close();
- return 0;
- }
Add Comment
Please, Sign In to add comment