Guest User

Untitled

a guest
May 24th, 2014
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 9.41 KB | None | 0 0
  1.  Úkolem je realizovat třídu CBusLine, která bude implementovat seznam zastávek jedné autobusové linky.
  2.  
  3. Předpokládáme, že autobusy v modelovaném městě jezdí zásadně dvousměrně. Vyjíždějí z jedné konečné, projíždějí definovaným seznamem zastávek a končí ve druhé konečné. Tam jízdu přeruší a po nezbytné přestávce autobus jede po stejné trase zpět na první konečnou (pochopitelně projíždí zastávky v opačném pořadí). Seznam zastávek se tedy vyplatí reprezentovat jako dvousměrně zřetězený spojový seznam, ve třídě CBusLine máme odkaz na obě konečné.
  4.  
  5. Vaším úkolem je realizovat třídu CBusLine a další podpůrné třídy. Jejich rozhraní je následující: CBusLine
  6.  
  7. konstruktor bez parametrů
  8.  
  9.   vytvoří prázdnou instanci třídy, tedy nastaví obě členské proměnné na NULL,
  10.  
  11. destruktor
  12.  
  13.   uvolní prostředky alokované instancí,
  14.  
  15. kopírující konstruktor
  16.  
  17.   vytvoří hlubokou kopii instance,
  18.  
  19. Add
  20.  
  21.   metoda přidá další zastávky do existujícího seznamu (prodloužení trasy). Vkládané zastávky jsou přidávané na konec seznamu, tedy za původní m_Terminal2). Po přidání zastávek musí opět vzniknout platný dvousměrně zřetězený spojový seznam. Parametrem volání je vstupní stream, v tomto vstupním streamu jsou uvedená jména zastávek, vždy jedna zastávka na jedné řádce. Ve vstupním streamu mohou vyskytovat prázdné řádky (budou ignorovány) a duplicity (v seznamu zastávek se to samé jméno může objevit vícekrát, v počtu podle vstupu).
  22.  
  23. Trip
  24.  
  25.   metoda nalezne cestu mezi dvojicí zastávek. Parametrem volání jsou dva řetězce - nástupní a výstupní zastávka. Použití metody je zřejmé z ukázek níže:
  26.  
  27.       výpis nalezené cesty zobrazí se seznam zastávek počínaje nástupní a konče výstupní. Ve výpisu je každá zastávka na jedné řádce, za každou (i za poslední) řádkou výstupu je odřádkování (viz ukázka níže).
  28.       Metoda Stops spočte počet zastávek v nalezené cestě, návratová hodnota zahrnuje počáteční a koncovou zastávku.
  29.  
  30.   Pokud se zadané zastávky v seznamu nevyskytují, bude vyhozena výjimka CNameException. Můžete předpokládat, že zadaná nástupní/výstupní zastávka je v seznamu uvedena nejvýše jednou, tedy cesta je unikátní,
  31.  
  32. m_Terminal1
  33.  
  34.   členská proměnná ukazuje vždy na první konečnou (nastavena na NULL pro prázdný seznam),
  35.  
  36. m_Terminal2
  37.  
  38.   členská proměnná ukazuje vždy na druhou konečnou (nastavena na NULL pro prázdný seznam),
  39.  
  40. CTester
  41.  
  42.   tato třída je implementována v testovacím prostředí. Je používaná pro kontrolu struktury Vašeho spojového seznamu. Ponechte deklaraci friend, pokud ji odstraníte, odevzdaný program nepůjde zkompilovat.
  43.  
  44. TStop
  45.  
  46. Tato struktura je používaná pro reprezentaci seznamu zastávek. Má následující rozhraní:
  47.  
  48. m_Next
  49.  
  50.   obsahuje ukazatel na další prvek ve spojovém seznamu, poslední prvek obsahuje hodnotu NULL. Pokud začneme procházet spojový seznam z m_Terminal1, pak při použití odkazů m_Next projdeme celou trasu,
  51.  
  52. m_Prev
  53.  
  54.   obsahuje ukazatel na předchozí prvek ve spojovém seznamu, první prvek obsahuje hodnotu NULL. Pokud začneme procházet spojový seznam z m_Terminal2, pak při použití odkazů m_Prev projdeme celou trasu,
  55.  
  56. m_Name
  57.  
  58.   obsahuje jméno zastávky (řetězec).
  59.  
  60. CNameException
  61.  
  62. Třída reprezentuje výjimku, která bude vygenerovaná pokud není nalezena požadovaná zastávka. Rozhraní musí umožňovat zobrazení ve výstupním streamu pomocí operátoru «, ve výpisu je na konci odřádkování.
  63.  
  64. Odevzdávejte soubor, který obsahuje pouze implementovanou třídu CBusLine a další podpůrné třídy. Třída musí splňovat veřejné rozhraní podle ukázky - pokud Vámi odevzdané řešení nebude obsahovat popsané rozhraní, dojde k chybě při kompilaci. Do třídy si ale můžete doplnit další metody (veřejné nebo i privátní) a členské proměnné. Odevzdávaný soubor musí obsahovat jak deklaraci třídy (popis rozhraní) tak i definice metod, konstruktoru a destruktoru. Je jedno, zda jsou metody implementované inline nebo odděleně. Pro usnadnění odevzdávání můžete využít toho, že ProgTest definuje proměnnou preprocesoru PROGTEST. Použijte přiložený archiv jako základ Vašeho řešení.
  65.  
  66. Implementovaná třída nesmí používat datové struktury z STL (vector, list, …, není pro to ani důvod). Jejich použití povede k chybě při kompilaci. Třída je testovaná v omezeném prostředí, konkrétní omezení je zřejmé z hodnocení referenčního řešení.
  67.  
  68. V realizované třídě se nemusíte zabývat implementací operátoru =. Progtest v této úloze netestuje tuto funkcionalitu. Pozor - testovací prostředí kontroluje strukturu Vašeho spojového seznamu, dejte zejména pozor na odkaz m_Terminal2. Požadované veřejné rozhraní třídy:
  69.  
  70. #ifndef __PROGTEST__
  71. #include <iostream>
  72. #include <iomanip>
  73. #include <cstdio>
  74. #include <cstdlib>
  75. #include <cstring>
  76. #include <sstream>
  77. #include <string>
  78. using namespace std;
  79. #endif /* __PROGTEST__ */
  80.  
  81. class CNameException
  82.  {
  83.    public:
  84.     // op <<
  85.  };
  86.  
  87. struct TStop
  88.  {
  89.                    TStop  ( const string & name )
  90.                     : m_Next ( NULL ), m_Prev ( NULL ), m_Name ( name ) { }
  91.    TStop         * m_Next;
  92.    TStop         * m_Prev;
  93.    string          m_Name;
  94.  };
  95.  
  96. class CBusLine
  97.  {
  98.    public:
  99.     // default constructor
  100.     // copy constructor
  101.     // destructor
  102.     // Add   ( istream & is )
  103.     // Trip  ( const string & from, const string & to ) const
  104.    private:
  105.     // todo
  106.     TStop        * m_Terminal1, * m_Terminal2;
  107.     friend class CTester;
  108.  };
  109.  
  110. Ukázka použití třídy:
  111.  
  112. istringstream is;
  113. int           l;
  114. CBusLine a;
  115. is . clear ();
  116. is . str ( "Newton\nBlack Hill\nWood Side\nGreen Hill\nLakeside\n" );
  117. a . Add ( is );
  118. l = a . Trip ( "Black Hill", "Green Hill" ) . Stops (); // l = 3
  119. cout << a . Trip ( "Black Hill", "Green Hill" );
  120. /*
  121. --8<----8<----8<----8<----8<----8<----8<--
  122. Black Hill
  123.  -> Wood Side
  124.  -> Green Hill
  125. --8<----8<----8<----8<----8<----8<----8<--
  126. */
  127.  
  128. l = a . Trip ( "Wood Side", "Newton" ) . Stops (); // l = 3
  129. cout << a . Trip ( "Wood Side", "Newton" );
  130. /*
  131. --8<----8<----8<----8<----8<----8<----8<--
  132. Wood Side
  133.  -> Black Hill
  134.  -> Newton
  135. --8<----8<----8<----8<----8<----8<----8<--
  136. */
  137.  
  138. l = a . Trip ( "Black Hill", "Black Hill" ) . Stops (); // l = 1
  139. cout << a . Trip ( "Black Hill", "Black Hill" );
  140. /*
  141. --8<----8<----8<----8<----8<----8<----8<--
  142. Black Hill
  143. --8<----8<----8<----8<----8<----8<----8<--
  144. */
  145.  
  146. is . clear ();
  147. is . str ( "Great Newton\nLittle Burnside\n" );
  148. a . Add ( is );
  149. l = a . Trip ( "Great Newton", "Newton" ) . Stops (); // l = 6
  150. cout << a . Trip ( "Great Newton", "Newton" );
  151. /*
  152. --8<----8<----8<----8<----8<----8<----8<--
  153. Great Newton
  154.  -> Lakeside
  155.  -> Green Hill
  156.  -> Wood Side
  157.  -> Black Hill
  158.  -> Newton
  159. --8<----8<----8<----8<----8<----8<----8<--
  160. */
  161.  
  162. try { cout << a . Trip ( "Blue Hill", "Newton" ); }
  163. catch ( const CNameException & e ) { cout << e; }
  164. /*
  165. --8<----8<----8<----8<----8<----8<----8<--
  166. Unknown stop 'Blue Hill'
  167. --8<----8<----8<----8<----8<----8<----8<--
  168. */
  169.  
  170. CBusLine b;
  171. is . clear ();
  172. is . str ( "Newton Valley\nNewton Heights\n\n\nNewton Crossroad\nBlack Hill\n" );
  173. b . Add ( is );
  174. l = b . Trip ( "Newton Heights", "Black Hill" ) . Stops (); // l = 3
  175. cout << b . Trip ( "Newton Heights", "Black Hill" );
  176. /*
  177. --8<----8<----8<----8<----8<----8<----8<--
  178. Newton Heights
  179.  -> Newton Crossroad
  180.  -> Black Hill
  181. --8<----8<----8<----8<----8<----8<----8<--
  182. */
  183.  
  184. is . clear ();
  185. is . str ( "Little Beacon Hill\nBeacon Hill\nBeacon Hill\nGreen Hill" );
  186. b . Add ( is );
  187. l = b . Trip ( "Newton Crossroad", "Green Hill" ) . Stops (); // l = 6
  188. cout << b . Trip ( "Newton Crossroad", "Green Hill" );
  189. /*
  190. --8<----8<----8<----8<----8<----8<----8<--
  191. Newton Crossroad
  192.  -> Black Hill
  193.  -> Little Beacon Hill
  194.  -> Beacon Hill
  195.  -> Beacon Hill
  196.  -> Green Hill
  197. --8<----8<----8<----8<----8<----8<----8<--
  198. */
  199.  
  200. l = b . Trip ( "Green Hill", "Newton Heights" ) . Stops (); // l = 7
  201. cout << b . Trip ( "Green Hill", "Newton Heights" );
  202. /*
  203. --8<----8<----8<----8<----8<----8<----8<--
  204. Green Hill
  205.  -> Beacon Hill
  206.  -> Beacon Hill
  207.  -> Little Beacon Hill
  208.  -> Black Hill
  209.  -> Newton Crossroad
  210.  -> Newton Heights
  211. --8<----8<----8<----8<----8<----8<----8<--
  212. */
  213.  
  214. CBusLine c;
  215. is . clear ();
  216. is . str ( "Newton Valley\nNewton Heights\n\n\nNewton Crossroad\nBlack Hill\n" );
  217. c . Add ( is );
  218. CBusLine d = c;
  219. is . clear ();
  220. is . str ( "Wildcat Valley\nBurnside East\nBurnside Woods\nWood Side East\nWood Side Central" );
  221. c . Add ( is );
  222. is . clear ();
  223. is . str ( "Castle Hill\nLittle Bradford\nWood Side Mountains\nWood Side Central" );
  224. d . Add ( is );
  225. l = c . Trip ( "Black Hill", "Wood Side Central" ) . Stops (); // l = 6
  226. cout << c . Trip ( "Black Hill", "Wood Side Central" );
  227. /*
  228. --8<----8<----8<----8<----8<----8<----8<--
  229. Black Hill
  230.  -> Wildcat Valley
  231.  -> Burnside East
  232.  -> Burnside Woods
  233.  -> Wood Side East
  234.  -> Wood Side Central
  235. --8<----8<----8<----8<----8<----8<----8<--
  236. */
  237.  
  238. l = d . Trip ( "Black Hill", "Wood Side Central" ) . Stops (); // l = 5
  239. cout << d . Trip ( "Black Hill", "Wood Side Central" );
  240. /*
  241. --8<----8<----8<----8<----8<----8<----8<--
  242. Black Hill
  243.  -> Castle Hill
  244.  -> Little Bradford
  245.  -> Wood Side Mountains
  246.  -> Wood Side Central
  247. --8<----8<----8<----8<----8<----8<----8<--
  248. */
Advertisement
Add Comment
Please, Sign In to add comment