pikabuka

Decomposition_and_debugging

Feb 15th, 2022
1,449
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.72 KB | None | 0 0
  1. #include <cassert>
  2. #include <iostream>
  3. #include <map>
  4. #include <string>
  5. #include <vector>
  6.  
  7. using namespace std;
  8.  
  9. enum class QueryType {
  10.     NewBus,
  11.     BusesForStop,
  12.     StopsForBus,
  13.     AllBuses,
  14. };
  15.  
  16. struct Query {
  17.     QueryType type;
  18.     string bus;
  19.     string stop;
  20.     vector<string> stops;
  21. };
  22.  
  23. istream& operator>>(istream& is, Query& q) {
  24.     // Реализуйте эту функцию
  25.     string type;
  26.     is >> type;
  27.  
  28.     map <string, QueryType> m = {
  29.         {"NEW_BUS", QueryType::NewBus},
  30.         {"BUSES_FOR_STOP", QueryType::BusesForStop},
  31.         {"STOPS_FOR_BUS", QueryType::StopsForBus},
  32.         {"ALL_BUSES", QueryType::AllBuses},
  33.         };
  34.     q.type = m[type];
  35.     is.ignore(1);
  36.  
  37.     switch (q.type) {
  38.     case QueryType::NewBus:
  39.         is >> q.bus;
  40.         is.ignore(1);
  41.         int stop_count;
  42.         is >> stop_count;
  43.         is.ignore(1);
  44.         q.stops.clear();
  45.         while (is.peek() != '\n') {
  46.             string stop;
  47.             is >> stop;
  48.             q.stops.push_back(stop);
  49.         }
  50.         break;
  51.     case QueryType::BusesForStop:
  52.         is >> q.stop;
  53.         break;
  54.     case QueryType::StopsForBus:
  55.         is >> q.bus;
  56.         break;
  57.     case QueryType::AllBuses:
  58.         break;
  59.  
  60.     }
  61.  
  62.     return is;
  63. }
  64.  
  65. struct BusesForStopResponse {
  66.     // Наполните полями эту структуру
  67.     vector<string> stops;
  68. };
  69.  
  70. ostream& operator<<(ostream& os, const BusesForStopResponse& r) {
  71.     // Реализуйте эту функцию
  72.     if (r.stops.size() != 0) {
  73.         os << r.stops[0];
  74.         for (size_t i = 1; i < r.stops.size(); ++i){
  75.             os << " " << r.stops[i];
  76.         }
  77.     } else {
  78.         os << "No stop";
  79.     }
  80.     return os;
  81. }
  82.  
  83. struct StopsForBusResponse {
  84.     // Наполните полями эту структуру
  85.     string bus;
  86.     vector<string> stops;
  87.     map<string, vector<string> > buses_to_stops;
  88. };
  89.  
  90. ostream& operator<<(ostream& os, const StopsForBusResponse& r) {
  91.     // Реализуйте эту функцию
  92.     if (r.stops.size() != 0) {
  93.         size_t stops_count = 0;
  94.         for (auto& stop : r.stops) {
  95.             os << "Stop " << stop << ":";
  96.             if (r.buses_to_stops.count(stop) != 0) {
  97.                 size_t count = 0;
  98.                 for (auto& bus : r.buses_to_stops.at(stop)) {
  99.                     if (r.bus != bus) {
  100.                         os << " " << bus;
  101.                         ++count;
  102.                     }
  103.                 }
  104.                 if (count == 0) {
  105.                     os << " no interchange";
  106.                 }
  107.             } else {
  108.                 os << " no interchange";
  109.             }
  110.             ++stops_count;
  111.             if ((stops_count + 1) <= r.stops.size()) {
  112.                 os << endl;
  113.             }
  114.         }
  115.     } else {
  116.         os << "No bus";
  117.     }
  118.    
  119.     return os;
  120. }
  121.  
  122. struct AllBusesResponse {
  123.     // Наполните полями эту структуру
  124.     map<string, vector<string>> buses_to_stops;
  125. };
  126.  
  127. ostream& operator<<(ostream& os, const AllBusesResponse& r) {
  128.     // Реализуйте эту функцию
  129.     if (r.buses_to_stops.size() != 0) {
  130.         size_t buses_count = 0;
  131.         for (auto& item : r.buses_to_stops) {
  132.             os << "Bus " << item.first << ":";
  133.             for (auto& stop : r.buses_to_stops.at(item.first)) {
  134.                 os << " " << stop;
  135.             }
  136.             ++buses_count;
  137.             if ((buses_count + 1) <= r.buses_to_stops.size()) {
  138.                 os << endl;
  139.             }
  140.         }
  141.     } else {
  142.         os << "No buses";
  143.     }
  144.     return os;
  145. }
  146.  
  147. class BusManager {
  148. public:
  149.     void AddBus(const string& bus, const vector<string>& stops) {
  150.         // Реализуйте этот метод
  151.         buses_to_stops[bus] = stops;
  152.         for (string stop : stops) {
  153.             stops_to_buses[stop].push_back(bus);
  154.         }
  155.     }
  156.  
  157.     BusesForStopResponse GetBusesForStop(const string& stop) const {
  158.         // Реализуйте этот метод
  159.         BusesForStopResponse response;
  160.         if (stops_to_buses.count(stop) > 0) {
  161.             response.stops = stops_to_buses.at(stop);
  162.         }
  163.         return response;
  164.     }
  165.  
  166.     StopsForBusResponse GetStopsForBus(const string& bus) const {
  167.         // Реализуйте этот метод
  168.         StopsForBusResponse response;
  169.         if (buses_to_stops.count(bus) > 0) {
  170.             response.bus = bus;
  171.             response.stops = buses_to_stops.at(bus);
  172.             response.buses_to_stops = stops_to_buses;
  173.         }
  174.         return response;
  175.     }
  176.  
  177.     AllBusesResponse GetAllBuses() const {
  178.         // Реализуйте этот метод
  179.         AllBusesResponse response;
  180.         response.buses_to_stops = buses_to_stops;
  181.         return response;
  182.     }
  183.    
  184. private:
  185.     map<string, vector<string>> buses_to_stops;
  186.     map<string, vector<string>> stops_to_buses;
  187. };
  188.  
  189. // Не меняя тела функции main, реализуйте функции и классы выше
  190.  
  191. int main() {
  192.     int query_count;
  193.     Query q;
  194.  
  195.     cin >> query_count;
  196.  
  197.     BusManager bm;
  198.     for (int i = 0; i < query_count; ++i) {
  199.         cin >> q;
  200.         switch (q.type) {
  201.             case QueryType::NewBus:
  202.                 bm.AddBus(q.bus, q.stops);
  203.                 break;
  204.             case QueryType::BusesForStop:
  205.                 cout << bm.GetBusesForStop(q.stop) << endl;
  206.                 break;
  207.             case QueryType::StopsForBus:
  208.                 cout << bm.GetStopsForBus(q.bus) << endl;
  209.                 break;
  210.             case QueryType::AllBuses:
  211.                 cout << bm.GetAllBuses() << endl;
  212.                 break;
  213.         }
  214.     }
  215. }
Advertisement
Add Comment
Please, Sign In to add comment