Guest User

Untitled

a guest
May 24th, 2014
248
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.26 KB | None | 0 0
  1. #ifndef __PROGTEST__
  2. #include <iostream>
  3. #include <iomanip>
  4. #include <cstdio>
  5. #include <cstdlib>
  6. #include <cstring>
  7. #include <sstream>
  8. #include <string>
  9. using namespace std;
  10. #endif /* __PROGTEST__ */
  11.  
  12. class CNameException{
  13.   public:
  14.       CNameException(const string & name){
  15.           stop = name;
  16.       }
  17.      
  18.       friend ostream& operator<<(ostream& os, const CNameException& obj){
  19.           os << "Unknown star base '" << obj.stop << "'" << endl;
  20.           return os;
  21.       }
  22.      
  23. private:
  24.     string stop;
  25. };
  26.  
  27.  
  28.  
  29.  
  30. struct TStop {
  31.               TStop (const string & name) : m_Next (NULL), m_Prev (NULL), m_Name (name) {};
  32.   TStop * m_Next;
  33.   TStop * m_Prev;
  34.   string  m_Name;
  35. };
  36.  
  37.  
  38. class CTrip{
  39. public:
  40.     CTrip (TStop * begin, TStop * end){
  41.         m_begin = begin;
  42.         m_end = end;
  43.     }
  44.     int Bases () const{
  45.         TStop * tmp = m_begin;
  46.         TStop * tmp2 = m_end;
  47.         int flag = 0;
  48.        
  49.         if(tmp < tmp2){
  50.             flag = 1;
  51.         }
  52.        
  53.         int pocet = 1;
  54.         if(flag == 1){
  55.        
  56.         while (tmp != m_end){
  57.             pocet++;
  58.             tmp = tmp -> m_Next;
  59.         }
  60.         }
  61.         else{
  62.            
  63.         while (tmp != m_end){
  64.             pocet++;
  65.             tmp = tmp -> m_Prev;
  66.         }  
  67.         }
  68.         return pocet;
  69.     }
  70.  
  71.    
  72.     friend ostream& operator<<(ostream& os, const CTrip& obj){
  73.         TStop * tmp = obj.m_begin;
  74.         TStop * tmp2 = obj.m_end;
  75.         int flag = 0;
  76.          if(tmp < tmp2){
  77.             flag = 1;
  78.         }
  79.        
  80.         if(obj.Bases()>1){
  81.             os << tmp->m_Name << endl;
  82.             if(flag == 1){
  83.                 tmp = tmp -> m_Next;
  84.             while(tmp != obj.m_end){
  85.                 os << "->" << tmp -> m_Name << endl;
  86.                 tmp = tmp -> m_Next;
  87.             }
  88.             }
  89.             else{
  90.                 tmp = tmp -> m_Prev;
  91.                while(tmp != obj.m_end){
  92.                 os << "->" << tmp -> m_Name << endl;
  93.                 tmp = tmp -> m_Prev;
  94.             }
  95.             }
  96.             os << "->" << tmp -> m_Name << endl;
  97.         }
  98.        
  99.         else{
  100.             os << tmp->m_Name << endl;
  101.         }
  102.        
  103.        
  104.         return os;
  105.     }
  106. private:
  107.  
  108.     TStop * m_begin;
  109.     TStop * m_end;
  110. };
  111.  
  112.  
  113. class CBusLine {
  114.   public:
  115.       CBusLine(){
  116.           m_Terminal1 = NULL;
  117.           m_Terminal2 = NULL;
  118.       }
  119.       CBusLine(CBusLine & orig){
  120.           m_Terminal1 = new TStop(orig.m_Terminal1 -> m_Name);
  121.           m_Terminal2 = new TStop(orig.m_Terminal2 -> m_Name);
  122.           TStop * tmpx = m_Terminal2;
  123.           TStop * copy = orig.m_Terminal1;
  124.           while(copy != NULL){
  125.               TStop * copy_tmp = new TStop(copy->m_Name);
  126.               tmpx -> m_Next = copy_tmp;
  127.               copy_tmp -> m_Prev = tmpx;
  128.               tmpx = copy_tmp;
  129.               copy = copy->m_Next;
  130.           }
  131.           cout << "============" << endl;
  132.         tmpx = m_Terminal1;
  133.         while(tmpx != NULL){
  134.         cout << tmpx -> m_Name << endl;
  135.         tmpx = tmpx -> m_Next;  
  136.    
  137.     }
  138.       }
  139.          
  140.    
  141.    
  142.      
  143.      
  144.     ~CBusLine(){
  145.         TStop* tmp = m_Terminal2;
  146.         while(tmp != NULL){
  147.             TStop* tmp2 = tmp;
  148.             tmp = tmp -> m_Prev;
  149.             delete tmp2;
  150.         }
  151.         m_Terminal1 = NULL;
  152.         m_Terminal2 = NULL;
  153.     }
  154.     void Add (istream & is);
  155.    CTrip Trip (const string & from, const string & to) const {
  156.        return CTrip(find(from), find(to));
  157.     }
  158.   private:
  159.     // todo
  160.       TStop *find (const string & check) const{
  161.           TStop * tmp = m_Terminal1;
  162.           while (tmp != NULL){
  163.               if(check == tmp ->m_Name)
  164.                   return tmp;
  165.               else
  166.                   tmp = tmp->m_Next;
  167.           }
  168.          
  169.           throw CNameException(check);
  170.           return NULL;
  171.       }
  172.     TStop * m_Terminal1, * m_Terminal2;
  173.     friend class CTester;
  174. };
  175.  
  176. void CBusLine::Add(istream& is){
  177.    
  178.     string line;
  179.     while(is.good()){
  180.         getline(is, line);
  181.         if(line == ""){
  182.             continue;
  183.         }
  184.         TStop * n = new TStop(line);
  185.         if(m_Terminal2 == NULL){
  186.             m_Terminal1 = n;
  187.             m_Terminal2 = n;
  188.         }
  189.         else{
  190.             m_Terminal2 -> m_Next = n;
  191.             n -> m_Prev = m_Terminal2;
  192.             m_Terminal2 = n;
  193.         }
  194.     }
  195.    
  196.    
  197.  /* TStop * tmp = m_Terminal1;
  198.     while(tmp != NULL){
  199.         cout << tmp -> m_Name << endl;
  200.         tmp = tmp -> m_Next;  
  201.    
  202.     }
  203.    /*
  204.     tmp = m_Terminal2;
  205.     while(tmp != NULL){
  206.         cout << tmp -> m_Name << endl;
  207.         tmp = tmp -> m_Prev;  
  208.    
  209. }*/
  210.  
  211. }
  212.  
  213.  
  214. int main(){
  215.  
  216.    istringstream is;
  217.     int           l;
  218.     CBusLine a;
  219.     is . clear ();
  220.     is . str ( "Newton\nBlack Hill\nWood Side\nGreen Hill\nLake Side\n" );
  221.     a.Add(is);
  222.     l = a.Trip("Black Hill", "Green Hill").Bases();
  223.     cout << l << endl;
  224.     cout << a.Trip("Black Hill", "Green Hill");
  225.    
  226.     l = a.Trip("Wood Side", "Newton").Bases();
  227.     cout << l << endl;
  228.     cout << a.Trip("Wood Side", "Newton");
  229.    
  230.     l = a . Trip ( "Black Hill", "Black Hill" ) . Bases (); // l = 1
  231.     cout << l << endl;
  232. cout << a . Trip ( "Black Hill", "Black Hill" );
  233. /*
  234. --8<----8<----8<----8<----8<----8<----8<--
  235. Black Hill
  236. --8<----8<----8<----8<----8<----8<----8<--
  237. */
  238. is . clear ();
  239. is . str ( "Great Newton\nLittle Burnside\n" );
  240. a . Add ( is );
  241. l = a . Trip ( "Great Newton", "Newton" ) . Bases (); // l = 6
  242. cout << l << endl;
  243. cout << a . Trip ( "Great Newton", "Newton" );
  244. /*
  245. --8<----8<----8<----8<----8<----8<----8<--
  246. Great Newton
  247.  -> Lakeside
  248.  -> Green Hill
  249.  -> Wood Side
  250.  -> Black Hill
  251.  -> Newton
  252. --8<----8<----8<----8<----8<----8<----8<--
  253. */
  254.  
  255. try { cout << a . Trip ( "Blue Hill", "Newton" ); }
  256. catch ( const CNameException & e ) { cout << e; }
  257. /*
  258. --8<----8<----8<----8<----8<----8<----8<--
  259. Unknown stop 'Blue Hill'
  260. --8<----8<----8<----8<----8<----8<----8<--
  261. */
  262.  
  263. CBusLine b;
  264. is . clear ();
  265. is . str ( "Newton Valley\nNewton Heights\n\n\nNewton Crossroad\nBlack Hill\n" );
  266. b . Add ( is );
  267. l = b . Trip ( "Newton Heights", "Black Hill" ) . Bases (); // l = 3
  268. cout << l << endl;
  269. cout << b . Trip ( "Newton Heights", "Black Hill" );
  270. /*
  271. --8<----8<----8<----8<----8<----8<----8<--
  272. Newton Heights
  273.  -> Newton Crossroad
  274.  -> Black Hill
  275. --8<----8<----8<----8<----8<----8<----8<--
  276. */
  277.  
  278. is . clear ();
  279. is . str ( "Little Beacon Hill\nBeacon Hill\nBeacon Hill\nGreen Hill" );
  280. b . Add ( is );
  281. l = b . Trip ( "Newton Crossroad", "Green Hill" ) . Bases (); // l = 6
  282. cout << b . Trip ( "Newton Crossroad", "Green Hill" );
  283. /*
  284. --8<----8<----8<----8<----8<----8<----8<--
  285. Newton Crossroad
  286.  -> Black Hill
  287.  -> Little Beacon Hill
  288.  -> Beacon Hill
  289.  -> Beacon Hill
  290.  -> Green Hill
  291. --8<----8<----8<----8<----8<----8<----8<--
  292. */
  293.  
  294. l = b . Trip ( "Green Hill", "Newton Heights" ) . Bases (); // l = 7
  295. cout << b . Trip ( "Green Hill", "Newton Heights" );
  296. /*
  297. --8<----8<----8<----8<----8<----8<----8<--
  298. Green Hill
  299.  -> Beacon Hill
  300.  -> Beacon Hill
  301.  -> Little Beacon Hill
  302.  -> Black Hill
  303.  -> Newton Crossroad
  304.  -> Newton Heights
  305. --8<----8<----8<----8<----8<----8<----8<--
  306. */
  307.  
  308. CBusLine c;
  309. is . clear ();
  310. is . str ( "Newton Valley\nNewton Heights\n\n\nNewton Crossroad\nBlack Hill\n" );
  311. c . Add ( is );
  312. CBusLine d = c;
  313. is . clear ();
  314. is . str ( "Wildcat Valley\nBurnside East\nBurnside Woods\nWood Side East\nWood Side Central" );
  315. c . Add ( is );
  316. is . clear ();
  317. is . str ( "Castle Hill\nLittle Bradford\nWood Side Mountains\nWood Side Central" );
  318. d . Add ( is );
  319. l = c . Trip ( "Black Hill", "Wood Side Central" ) . Bases (); // l = 6
  320. cout << c . Trip ( "Black Hill", "Wood Side Central" );
  321. /*
  322. --8<----8<----8<----8<----8<----8<----8<--
  323. Black Hill
  324.  -> Wildcat Valley
  325.  -> Burnside East
  326.  -> Burnside Woods
  327.  -> Wood Side East
  328.  -> Wood Side Central
  329. --8<----8<----8<----8<----8<----8<----8<--
  330. */
  331.  
  332. l = d . Trip ( "Black Hill", "Wood Side Central" ) . Bases (); // l = 5
  333. cout << l << endl;
  334. cout << d . Trip ( "Black Hill", "Wood Side Central" );
  335. /*
  336. --8<----8<----8<----8<----8<----8<----8<--
  337. Black Hill
  338.  -> Castle Hill
  339.  -> Little Bradford
  340.  -> Wood Side Mountains
  341.  -> Wood Side Central
  342. --8<----8<----8<----8<----8<----8<----8<--
  343. */
  344.  
  345.  
  346.  
  347. }
Advertisement
Add Comment
Please, Sign In to add comment