Punchcard

Урок 6: Декомпозиция и отладка кода

Jun 9th, 2023
122
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.00 KB | Source Code | 0 0
  1. #include <cassert>
  2. #include <iostream>
  3. #include <map>
  4. #include <string>
  5. #include <vector>
  6. #include <sstream>
  7. #include <unordered_map>
  8.  
  9. using namespace std;
  10.  
  11. enum class QueryType {
  12.     NewBus,
  13.     BusesForStop,
  14.     StopsForBus,
  15.     AllBuses,
  16. };
  17.  
  18. struct Query {
  19.     QueryType type;
  20.     string bus;
  21.     string stop;
  22.     vector<string> stops;
  23. };
  24.  
  25. istream& operator>>(istream& is, Query& q) {
  26.    
  27.     string in_type;
  28.     is >> in_type;
  29.  
  30.     if (in_type == "NEW_BUS"s) {
  31.         q.type = QueryType::NewBus;
  32.         int stop_num;
  33.         is >> q.bus >> stop_num;
  34.         string st;
  35.         q.stops.clear();
  36.         for (int i = 0; i < stop_num; ++i){
  37.             is >> st;
  38.             q.stops.push_back(st);
  39.         }
  40.     }
  41.     else if (in_type == "BUSES_FOR_STOP"s) {
  42.         q.type = QueryType::BusesForStop;
  43.         is >> q.stop;
  44.     }
  45.     else if (in_type == "STOPS_FOR_BUS"s) {
  46.         q.type = QueryType::StopsForBus;
  47.         is >> q.bus;
  48.     }
  49.     else if (in_type == "ALL_BUSES"s) {
  50.         q.type = QueryType::AllBuses;
  51.     }
  52.    
  53.     return is;
  54. }
  55.  
  56. struct BusesForStopResponse {
  57.    
  58.     vector <string> buses;    
  59. };
  60.  
  61. ostream& operator<<(ostream& os, const BusesForStopResponse& r) {
  62.    
  63.     if(r.buses.empty()) {
  64.         os << "No bus"s;
  65.     }
  66.     else {
  67.         for (auto &bus : r.buses) {
  68.             os << bus << " "s;
  69.         }
  70.     }
  71.     return os;
  72. }
  73.  
  74. struct unorderedStops {
  75.     string stop;
  76.     vector <string> buses;
  77. };
  78.  
  79. struct StopsForBusResponse {
  80.     vector<unorderedStops> stop_buses; 
  81. };
  82.  
  83. ostream& operator<<(ostream& os, const StopsForBusResponse& r) {
  84.    
  85.     if(r.stop_buses.empty()) {
  86.         os << "No stop"s;
  87.     }
  88.     else {
  89.         bool first = true;
  90.         for (auto stp_bss : r.stop_buses) {
  91.             if (!first) {          
  92.                 os << endl;
  93.             }          
  94.             first = false;                     
  95.             os << "Stop "s << stp_bss.stop << ": "s;
  96.  
  97.             if (stp_bss.buses.empty()) {
  98.                 os << "no interchange"s;
  99.             }
  100.             else {
  101.                 for (auto& bus : stp_bss.buses) {
  102.                     os << bus << " "s;
  103.                 }
  104.             }
  105.  
  106.         }
  107.     }
  108.     return os;
  109. }
  110.  
  111. struct AllBusesResponse {
  112.     map <string, vector<string>> bus_stops;
  113. };
  114.  
  115. ostream& operator<<(ostream& os, const AllBusesResponse& r) {
  116.    
  117.     if (r.bus_stops.empty()) {
  118.         os << "No buses"s;
  119.     }
  120.     else {
  121.         for (auto& [bus, stops] : r.bus_stops) {
  122.             os << "Bus "s << bus << ": "s;
  123.             for (auto& stop : stops) {
  124.                 os << stop << " "s;
  125.             }
  126.             os << endl;
  127.         }      
  128.     }
  129.     return os;
  130. }
  131.  
  132. bool operator==(const StopsForBusResponse& lhs, const StopsForBusResponse& rhs) {  
  133.    
  134.  
  135.     return lhs.stop_buses == rhs.stop_buses;
  136. }
  137. bool operator==(const unorderedStops& lhs, const unorderedStops& rhs) {
  138.  
  139.  
  140.     return lhs.stop == rhs.stop && lhs.buses == rhs.buses;
  141. }
  142.  
  143. bool operator==(const AllBusesResponse& lhs, const AllBusesResponse& rhs) {
  144.    
  145.     return lhs.bus_stops == rhs.bus_stops;
  146. }
  147. bool operator==(const BusesForStopResponse& lhs, const BusesForStopResponse& rhs) {
  148.    
  149.     return lhs.buses == rhs.buses;
  150. }
  151.  
  152. class BusManager {
  153. private:
  154. map<string, vector<string>> buses_to_stops, stops_to_buses;
  155.    
  156. public:
  157.     void AddBus(const string& bus, const vector<string>& stops) {
  158.        
  159.         for (auto& stop : stops) {
  160.             stops_to_buses[stop].push_back(bus);
  161.             buses_to_stops[bus].push_back(stop);
  162.         }
  163.     }
  164.  
  165.     BusesForStopResponse GetBusesForStop(const string& stop) const {
  166.        
  167.         BusesForStopResponse ret;
  168.         if (stops_to_buses.count(stop) == 0) {
  169.             return ret;
  170.         }
  171.         ret.buses = stops_to_buses.at(stop);       
  172.         return ret;    
  173.     }
  174. /*
  175. STOPS_FOR_BUS 272
  176.     Stop Vnukovo: 32 32K 950
  177.     Stop Moskovsky: no interchange
  178.     Stop Rumyantsevo: no interchange
  179.     Stop Troparyovo: 950
  180. */ 
  181.     StopsForBusResponse GetStopsForBus(const string& bus) const {
  182.         // StopsForBusResponse: map <string, vector<string>> stop_buses;
  183.         StopsForBusResponse ret;       
  184.         if (buses_to_stops.count(bus) == 0) {
  185.             return ret;
  186.         }
  187.         vector <string> dummy;
  188.         for (const string& stop : buses_to_stops.at(bus)) {
  189.             if (stops_to_buses.count(stop) > 0 && stops_to_buses.at(stop).size() == 1) {
  190.                 ret.stop_buses.push_back({stop, {}});
  191.             }
  192.             else {
  193.                 for (const string& other_bus : stops_to_buses.at(stop)) {
  194.                     if(other_bus == bus) continue;                 
  195.                     dummy.push_back(other_bus);
  196.                 }
  197.                 ret.stop_buses.push_back({stop, dummy});
  198.                 dummy.clear();
  199.             }          
  200.         }
  201.        
  202.         return ret;            
  203.     }
  204. /*
  205. ALL_BUSES
  206.     Bus 272: Vnukovo Moskovsky Rumyantsevo Troparyovo
  207.     Bus 32: Tolstopaltsevo Marushkino Vnukovo
  208.     Bus 32K: Tolstopaltsevo Marushkino Vnukovo Peredelkino Solntsevo Skolkovo
  209.     Bus 950: Kokoshkino Marushkino Vnukovo Peredelkino Solntsevo Troparyovo
  210. */ 
  211.  
  212.     AllBusesResponse GetAllBuses() const {
  213.         // AllBusesResponse: map <string, vector<string>> bus_stops;
  214.         AllBusesResponse ret;
  215.         if (buses_to_stops.empty()) return ret;
  216.         for (const auto& [bus, stops] : buses_to_stops) {
  217.             ret.bus_stops[bus] = stops;        
  218.         }
  219.         return ret;
  220.     }
  221. };
  222.  
  223. void TestQueryInput() {
  224. /*
  225.     QueryType type;
  226.     string bus;
  227.     string stop;
  228.     vector<string> stops;
  229. */ 
  230.    
  231.     istringstream input;
  232.     // Метод str(строка) у istringstream позволяет задать содержимое, которое будет считываться из istringstream
  233.     input.str("NEW_BUS 32 3 Tolstopaltsevo Marushkino Vnukovo"s);
  234.     Query q;
  235.     input >> q;
  236.     assert(q.type == QueryType::NewBus);
  237.     assert(q.bus == "32"s);
  238.     vector <string> st = {"Tolstopaltsevo"s, "Marushkino"s, "Vnukovo"s};
  239.     assert(q.stops == st);
  240. }
  241.  
  242. void BusManagerTest() {
  243.    
  244.     BusManager bm;
  245.     AllBusesResponse dummy;
  246.     BusesForStopResponse dummy2;
  247.     // ALL_BUSES
  248.     assert(bm.GetAllBuses() == dummy);
  249.     // BUSES_FOR_STOP Marushkino
  250.     assert(bm.GetBusesForStop("Marushkino"s) == dummy2);   
  251.     // STOPS_FOR_BUS 32K
  252.     StopsForBusResponse dummy3;
  253.     assert(bm.GetStopsForBus("32K"s) == dummy3);
  254.     // NEW_BUS 32 3 Tolstopaltsevo Marushkino Vnukovo
  255.     bm.AddBus("32"s, {"Tolstopaltsevo"s, "Marushkino"s, "Vnukovo"s});
  256.     // NEW_BUS 32K 6 Tolstopaltsevo Marushkino Vnukovo Peredelkino Solntsevo Skolkovo
  257.     bm.AddBus("32K"s, {"Tolstopaltsevo"s, "Marushkino"s, "Vnukovo"s, "Peredelkino"s, "Solntsevo"s, "Skolkovo"s});
  258.     // BUSES_FOR_STOP Vnukovo
  259.     BusesForStopResponse dummy4;
  260.     dummy4.buses = {"32"s, "32K"s};
  261.     assert(bm.GetBusesForStop("Vnukovo"s) == dummy4);  
  262.     // NEW_BUS 950 6 Kokoshkino Marushkino Vnukovo Peredelkino Solntsevo Troparyovo
  263.     bm.AddBus("950"s, {"Kokoshkino"s, "Marushkino"s, "Vnukovo"s, "Peredelkino"s, "Solntsevo"s, "Troparyovo"s});
  264.     // NEW_BUS 272 4 Vnukovo Moskovsky Rumyantsevo Troparyovo
  265.     bm.AddBus("272"s, {"Vnukovo"s, "Moskovsky"s, "Rumyantsevo"s, "Troparyovo"s});
  266.     // STOPS_FOR_BUS 272
  267.     dummy3.stop_buses = {{"Vnukovo"s, {"32"s, "32K"s, "950"s}}, {"Moskovsky"s, {}}, {"Rumyantsevo"s, {}}, {"Troparyovo"s, {"950"s}}};
  268.     StopsForBusResponse dummy_left;
  269.     dummy_left = bm.GetStopsForBus("272"s);
  270.         // cout << dummy_left << endl;
  271.         // cout << dummy3 << endl;
  272.     assert(dummy_left == dummy3);
  273.     // ALL_BUSES
  274.     dummy.bus_stops = {{"272"s, {"Vnukovo"s, "Moskovsky"s, "Rumyantsevo"s, "Troparyovo"s}}, {"32"s, {"Tolstopaltsevo"s, "Marushkino"s, "Vnukovo"s}}, {"32K"s, {"Tolstopaltsevo"s, "Marushkino"s, "Vnukovo"s, "Peredelkino"s, "Solntsevo"s, "Skolkovo"s}}, {"950"s, {"Kokoshkino"s, "Marushkino"s, "Vnukovo"s, "Peredelkino"s, "Solntsevo"s, "Troparyovo"s}}};
  275.     assert(bm.GetAllBuses() == dummy); 
  276.    
  277. }
  278.  
  279. // Реализуйте функции и классы, объявленные выше, чтобы эта функция main
  280. // решала задачу "Автобусные остановки"
  281.  
  282. int main() {
  283.     int query_count;
  284.     Query q;
  285.    
  286.     TestQueryInput();
  287.     BusManagerTest();
  288.    
  289.     cin >> query_count;
  290.  
  291.     BusManager bm;
  292.     for (int i = 0; i < query_count; ++i) {
  293.         cin >> q;
  294.         switch (q.type) {
  295.             case QueryType::NewBus:
  296.                 bm.AddBus(q.bus, q.stops);
  297.                 break;
  298.             case QueryType::BusesForStop:
  299.                 cout << bm.GetBusesForStop(q.stop) << endl;
  300.                 break;
  301.             case QueryType::StopsForBus:
  302.                 cout << bm.GetStopsForBus(q.bus) << endl;
  303.                 break;
  304.             case QueryType::AllBuses:
  305.                 cout << bm.GetAllBuses() << endl;
  306.                 break;
  307.         }
  308.     }
  309. }
Advertisement
Add Comment
Please, Sign In to add comment