Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <fstream>
- #include <string>
- #include <map>
- #include <vector>
- using namespace std;
- class TransportDB
- {
- protected:
- enum trType {bus, tbus, tram};
- struct RouteName
- {
- int num; char let;
- RouteName(int a, char l=0) {num=a; let=l;}
- RouteName(){}
- bool operator < (RouteName& oth)
- {
- return num<oth.num;
- }
- bool operator == (RouteName& oth)
- {
- return (num == oth.num && let == oth.let);
- }
- };
- struct Route;
- struct Stop
- {
- vector<Route*> routes;
- string name;
- Stop (string n)
- {
- name=n;
- }
- };
- struct Route
- {
- trType curType;
- RouteName name;
- vector<Stop*> stops;
- Route (RouteName rou, int cur)
- {
- name = rou;
- if (cur == 0)
- curType = bus;
- if (cur == 1)
- curType = tbus;
- if (cur == 2)
- curType = tram;
- }
- };
- vector<Route*> routes;
- vector<Stop*> stops;
- public:
- friend class Interface;
- };
- class Interface
- {
- private:
- TransportDB* pointer;
- int findStop(string stopName)
- {
- for (int i = 0; i < pointer->stops.size(); i++)
- if (pointer->stops[i]->name == stopName)
- return i;
- return -1;
- }
- /////////////////////////////////////////////
- TransportDB::RouteName convertStrToRName (string rName)
- {
- int c=0, num=0;
- while (c < rName.size() && rName[c] >= '0' && rName[c] <= '9')
- {
- num = num * 10 + rName[c]-'0';
- c++;
- }
- if (((int)rName.size()-c) >= 2)
- {
- cout << "Wrong route name!" << endl;
- return TransportDB::RouteName(0, 0);
- }
- char symb = 0;
- if (c == (int)rName.size() - 1)
- symb = rName[c];
- TransportDB::RouteName retName(num, symb);
- return retName;
- }
- int findRoute(string routeName, int trType)
- {
- TransportDB::RouteName rName = convertStrToRName(routeName);
- if (rName.num==0) return -1;
- for (int i = 0; i < pointer->routes.size(); i++)
- if (pointer->routes[i]->name == rName && pointer->routes[i]->curType == trType)
- return i;
- return -1;
- }
- void disjoinRouteStopPoint (TransportDB::Route* route,TransportDB::Stop* stop)
- {
- int pos = -1;
- for (int i=0; i<route->stops.size(); i++)
- {
- if (stop == route->stops[i])
- {
- pos = i;
- break;
- }
- }
- if (pos == -1) return;
- route->stops[pos] = route->stops.back();
- route->stops.pop_back();
- int posS = -1;
- for (int i=0; i < stop->routes.size(); i++)
- if (route == stop->routes[i])
- {
- posS = i;
- break;
- }
- if (posS == -1) return;
- stop->routes[posS] = stop->routes.back();
- stop->routes.pop_back();
- }
- void addRouteStopPoint (TransportDB::Route* route, TransportDB::Stop* stop)
- {
- route->stops.push_back(stop);
- stop->routes.push_back(route);
- }
- public:
- Interface()
- {
- pointer = new TransportDB();
- }
- Interface(TransportDB* getpointer)
- {
- pointer = getpointer;
- }
- void addRouteStop (string rName, int trType, string sName)
- {
- int posR = findRoute(rName, trType);
- int posS = findStop(sName);
- if (posR != -1 && posS != -1)
- addRouteStopPoint(pointer->routes[posR], pointer->stops[posS]);
- else cout << "No such route or stop to add!" << endl;
- }
- void disjoinRouteStop (string rName, int trType, string sName)
- {
- int posR = findRoute(rName, trType);
- int posS = findStop(sName);
- if (posR != -1 && posS != -1)
- disjoinRouteStopPoint(pointer->routes[posR], pointer->stops[posS]);
- else cout << "No such route or stop to remove!" << endl;
- }
- void addStop(string stopName)
- {
- TransportDB::Stop* firStop = new TransportDB::Stop (stopName);
- pointer->stops.push_back(firStop);
- }
- void addRoute(string routeName, int trType)
- {
- TransportDB::RouteName rName = convertStrToRName(routeName);
- if (rName.num==0) return;
- TransportDB::Route* firRoute = new TransportDB::Route(rName, trType);
- pointer->routes.push_back(firRoute);
- }
- /////////////////////////////////////
- void deleteRoute(string rName, int trType)
- {
- int pos = findRoute(rName, trType);
- if (pos == -1)
- return;
- TransportDB::Route* cur = pointer->routes[pos];
- while (!cur->stops.empty())
- disjoinRouteStopPoint(cur, cur->stops[0]);
- delete pointer->routes[pos];
- pointer->routes[pos] = pointer->routes.back();
- pointer->routes.pop_back();
- }
- void deleteStop(string stopName)
- {
- int pos = findStop(stopName);
- if (pos == -1)
- return;
- TransportDB::Stop* cur = pointer->stops[pos];
- while (!cur->routes.empty())
- disjoinRouteStopPoint(cur->routes[0], cur);
- delete pointer->stops[pos];
- pointer->stops[pos] = pointer->stops.back();
- pointer->stops.pop_back();
- }
- int routesCount()
- {
- return pointer->routes.size();
- }
- void printDB() {
- cout << "Routes:\n";
- for (int i=0;i<pointer->routes.size();i++) {
- auto cur = pointer->routes[i];
- cout << cur->name.num;
- if (cur->name.let!=0) cout << cur->name.let;
- cout << "\n";
- if (cur->curType==0) cout << " Bus";
- else if (cur->curType==1) cout << " Tbus";
- else cout << " Tram";
- cout << "\n";
- cout << " st: ";
- for (int j=0;j<cur->stops.size();j++) {
- cout << cur->stops[j]->name << " ";
- }
- cout << "\n";
- }
- cout << "\n";
- cout << "Stops\n";
- for (int i=0;i<pointer->stops.size();i++) {
- auto cur = pointer->stops[i];
- cout << cur->name << "\n";
- cout << " ro: ";
- for (int j=0;j<cur->routes.size();j++) {
- auto curr = cur->routes[j];
- cout << curr->name.num;
- if (curr->name.let!=0) cout << curr->name.let;
- if (curr->curType==0) cout << ":Bus";
- else if (curr->curType==1) cout << ":Tbus";
- else cout << ":Tram";
- cout << " ";
- }
- cout << "\n";
- }
- }
- };
- int main ()
- {
- Interface a;
- for (;;) {
- int c;
- cin >> c;
- if (c == 0) {
- string s; cin >> s;
- a.addStop(s);
- }
- else if (c == 1) {
- string s; cin >> s;
- a.deleteStop(s);
- }
- else if (c == 2) {
- string s; int q; cin >> s >> q;
- a.addRoute(s, q);
- }
- else if (c == 3) {
- string s; int q; cin >> s >> q;
- a.deleteRoute(s, q);
- }
- else if (c == 4) {
- string s1, s2; int q; cin >> s1 >> q >> s2;
- a.addRouteStop(s1, q,s2);
- }
- else {
- string s1, s2; int q; cin >> s1 >> q >> s2;
- a.disjoinRouteStop(s1, q, s2);
- }
- a.printDB();
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment