Advertisement
RobertDeMilo

Декомпозиция и отладка кода (Гудуз)

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