Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #ifndef __PROGTEST__
- #include <iostream>
- #include <iomanip>
- #include <cstdio>
- #include <cstdlib>
- #include <cstring>
- #include <sstream>
- #include <string>
- using namespace std;
- #endif /* __PROGTEST__ */
- class CNameException{
- public:
- CNameException(const string & name){
- stop = name;
- }
- friend ostream& operator<<(ostream& os, const CNameException& obj){
- os << "Unknown star base '" << obj.stop << "'" << endl;
- return os;
- }
- private:
- string stop;
- };
- struct TStop {
- TStop (const string & name) : m_Next (NULL), m_Prev (NULL), m_Name (name) {};
- TStop * m_Next;
- TStop * m_Prev;
- string m_Name;
- };
- class CTrip{
- public:
- CTrip (TStop * begin, TStop * end){
- m_begin = begin;
- m_end = end;
- }
- int Bases () const{
- TStop * tmp = m_begin;
- TStop * tmp2 = m_end;
- int flag = 0;
- if(tmp < tmp2){
- flag = 1;
- }
- int pocet = 1;
- if(flag == 1){
- while (tmp != m_end){
- pocet++;
- tmp = tmp -> m_Next;
- }
- }
- else{
- while (tmp != m_end){
- pocet++;
- tmp = tmp -> m_Prev;
- }
- }
- return pocet;
- }
- friend ostream& operator<<(ostream& os, const CTrip& obj){
- TStop * tmp = obj.m_begin;
- TStop * tmp2 = obj.m_end;
- int flag = 0;
- if(tmp < tmp2){
- flag = 1;
- }
- if(obj.Bases()>1){
- os << tmp->m_Name << endl;
- if(flag == 1){
- tmp = tmp -> m_Next;
- while(tmp != obj.m_end){
- os << "->" << tmp -> m_Name << endl;
- tmp = tmp -> m_Next;
- }
- }
- else{
- tmp = tmp -> m_Prev;
- while(tmp != obj.m_end){
- os << "->" << tmp -> m_Name << endl;
- tmp = tmp -> m_Prev;
- }
- }
- os << "->" << tmp -> m_Name << endl;
- }
- else{
- os << tmp->m_Name << endl;
- }
- return os;
- }
- private:
- TStop * m_begin;
- TStop * m_end;
- };
- class CBusLine {
- public:
- CBusLine(){
- m_Terminal1 = NULL;
- m_Terminal2 = NULL;
- }
- CBusLine(CBusLine & orig){
- m_Terminal1 = new TStop(orig.m_Terminal1 -> m_Name);
- m_Terminal2 = new TStop(orig.m_Terminal2 -> m_Name);
- TStop * tmpx = m_Terminal2;
- TStop * copy = orig.m_Terminal1;
- while(copy != NULL){
- TStop * copy_tmp = new TStop(copy->m_Name);
- tmpx -> m_Next = copy_tmp;
- copy_tmp -> m_Prev = tmpx;
- tmpx = copy_tmp;
- copy = copy->m_Next;
- }
- cout << "============" << endl;
- tmpx = m_Terminal1;
- while(tmpx != NULL){
- cout << tmpx -> m_Name << endl;
- tmpx = tmpx -> m_Next;
- }
- }
- ~CBusLine(){
- TStop* tmp = m_Terminal2;
- while(tmp != NULL){
- TStop* tmp2 = tmp;
- tmp = tmp -> m_Prev;
- delete tmp2;
- }
- m_Terminal1 = NULL;
- m_Terminal2 = NULL;
- }
- void Add (istream & is);
- CTrip Trip (const string & from, const string & to) const {
- return CTrip(find(from), find(to));
- }
- private:
- // todo
- TStop *find (const string & check) const{
- TStop * tmp = m_Terminal1;
- while (tmp != NULL){
- if(check == tmp ->m_Name)
- return tmp;
- else
- tmp = tmp->m_Next;
- }
- throw CNameException(check);
- return NULL;
- }
- TStop * m_Terminal1, * m_Terminal2;
- friend class CTester;
- };
- void CBusLine::Add(istream& is){
- string line;
- while(is.good()){
- getline(is, line);
- if(line == ""){
- continue;
- }
- TStop * n = new TStop(line);
- if(m_Terminal2 == NULL){
- m_Terminal1 = n;
- m_Terminal2 = n;
- }
- else{
- m_Terminal2 -> m_Next = n;
- n -> m_Prev = m_Terminal2;
- m_Terminal2 = n;
- }
- }
- /* TStop * tmp = m_Terminal1;
- while(tmp != NULL){
- cout << tmp -> m_Name << endl;
- tmp = tmp -> m_Next;
- }
- /*
- tmp = m_Terminal2;
- while(tmp != NULL){
- cout << tmp -> m_Name << endl;
- tmp = tmp -> m_Prev;
- }*/
- }
- int main(){
- istringstream is;
- int l;
- CBusLine a;
- is . clear ();
- is . str ( "Newton\nBlack Hill\nWood Side\nGreen Hill\nLake Side\n" );
- a.Add(is);
- l = a.Trip("Black Hill", "Green Hill").Bases();
- cout << l << endl;
- cout << a.Trip("Black Hill", "Green Hill");
- l = a.Trip("Wood Side", "Newton").Bases();
- cout << l << endl;
- cout << a.Trip("Wood Side", "Newton");
- l = a . Trip ( "Black Hill", "Black Hill" ) . Bases (); // l = 1
- cout << l << endl;
- cout << a . Trip ( "Black Hill", "Black Hill" );
- /*
- --8<----8<----8<----8<----8<----8<----8<--
- Black Hill
- --8<----8<----8<----8<----8<----8<----8<--
- */
- is . clear ();
- is . str ( "Great Newton\nLittle Burnside\n" );
- a . Add ( is );
- l = a . Trip ( "Great Newton", "Newton" ) . Bases (); // l = 6
- cout << l << endl;
- cout << a . Trip ( "Great Newton", "Newton" );
- /*
- --8<----8<----8<----8<----8<----8<----8<--
- Great Newton
- -> Lakeside
- -> Green Hill
- -> Wood Side
- -> Black Hill
- -> Newton
- --8<----8<----8<----8<----8<----8<----8<--
- */
- try { cout << a . Trip ( "Blue Hill", "Newton" ); }
- catch ( const CNameException & e ) { cout << e; }
- /*
- --8<----8<----8<----8<----8<----8<----8<--
- Unknown stop 'Blue Hill'
- --8<----8<----8<----8<----8<----8<----8<--
- */
- CBusLine b;
- is . clear ();
- is . str ( "Newton Valley\nNewton Heights\n\n\nNewton Crossroad\nBlack Hill\n" );
- b . Add ( is );
- l = b . Trip ( "Newton Heights", "Black Hill" ) . Bases (); // l = 3
- cout << l << endl;
- cout << b . Trip ( "Newton Heights", "Black Hill" );
- /*
- --8<----8<----8<----8<----8<----8<----8<--
- Newton Heights
- -> Newton Crossroad
- -> Black Hill
- --8<----8<----8<----8<----8<----8<----8<--
- */
- is . clear ();
- is . str ( "Little Beacon Hill\nBeacon Hill\nBeacon Hill\nGreen Hill" );
- b . Add ( is );
- l = b . Trip ( "Newton Crossroad", "Green Hill" ) . Bases (); // l = 6
- cout << b . Trip ( "Newton Crossroad", "Green Hill" );
- /*
- --8<----8<----8<----8<----8<----8<----8<--
- Newton Crossroad
- -> Black Hill
- -> Little Beacon Hill
- -> Beacon Hill
- -> Beacon Hill
- -> Green Hill
- --8<----8<----8<----8<----8<----8<----8<--
- */
- l = b . Trip ( "Green Hill", "Newton Heights" ) . Bases (); // l = 7
- cout << b . Trip ( "Green Hill", "Newton Heights" );
- /*
- --8<----8<----8<----8<----8<----8<----8<--
- Green Hill
- -> Beacon Hill
- -> Beacon Hill
- -> Little Beacon Hill
- -> Black Hill
- -> Newton Crossroad
- -> Newton Heights
- --8<----8<----8<----8<----8<----8<----8<--
- */
- CBusLine c;
- is . clear ();
- is . str ( "Newton Valley\nNewton Heights\n\n\nNewton Crossroad\nBlack Hill\n" );
- c . Add ( is );
- CBusLine d = c;
- is . clear ();
- is . str ( "Wildcat Valley\nBurnside East\nBurnside Woods\nWood Side East\nWood Side Central" );
- c . Add ( is );
- is . clear ();
- is . str ( "Castle Hill\nLittle Bradford\nWood Side Mountains\nWood Side Central" );
- d . Add ( is );
- l = c . Trip ( "Black Hill", "Wood Side Central" ) . Bases (); // l = 6
- cout << c . Trip ( "Black Hill", "Wood Side Central" );
- /*
- --8<----8<----8<----8<----8<----8<----8<--
- Black Hill
- -> Wildcat Valley
- -> Burnside East
- -> Burnside Woods
- -> Wood Side East
- -> Wood Side Central
- --8<----8<----8<----8<----8<----8<----8<--
- */
- l = d . Trip ( "Black Hill", "Wood Side Central" ) . Bases (); // l = 5
- cout << l << endl;
- cout << d . Trip ( "Black Hill", "Wood Side Central" );
- /*
- --8<----8<----8<----8<----8<----8<----8<--
- Black Hill
- -> Castle Hill
- -> Little Bradford
- -> Wood Side Mountains
- -> Wood Side Central
- --8<----8<----8<----8<----8<----8<----8<--
- */
- }
Advertisement
Add Comment
Please, Sign In to add comment