OB_List06
Home ] Up ]

 

//Date:   2003.10.01
//File:   OB_List06.cpp
//Author: AOU

#include <iostream.h>
#include <stdlib.h>
#include <time.h>


/*
project 02: 10/01/2003 - 10/08/2003
Implement the following fnctions with 
corresponding test functions:

friend COList fUnion(const COList &thisList, const COList &thatList);
COList fUnion(const COList &thatList) const;
COList operator +(const COList &thatList) const;

Submit the following (on paper and disk) 
for each function:

5  description
5  examples (2)
5  algorithm
5  properly indented function
5  properly indented test function
5  properly labeled output (10)
*/


/*
maintain an ordered list of integeres

int searchSequential(int x) const;
void testSearchSequential(void);

*/


////////////////////////////////////////
//constants
////////////////////////////////////////
const int MAX_SIZE = 25;
const int TEST_COUNT = 19;
const int MAX_VALUE = 15;
const int UNDEFINED = -911;


////////////////////////////////////////
//prototypes
////////////////////////////////////////
void testSortBubble(void);
void testInsert(void);
void testShuffle(void);
void testIsSorted(void);
void testPopulate(void);
void testConstructor(void);

void testIsEqual(void);
void testIsEqual2(void);
void testIsEqual3(void);

void testConstructorCopy(void);

void testSearchSequential(void);


////////////////////////////////////////
//class COList
////////////////////////////////////////
class COList
  {
  private:
    int a[MAX_SIZE];
    int n;
    void swap(int &x, int &y);
  public:
    COList(void);
    void display(void) const;
    void initialize(void);
    bool insert(int x);
    bool isSorted(void) const;
    void shuffle(void);
    void sortBubble(void);
    void populate(int n);
    COList(char ch);

    friend bool isEqual(const COList &thisList, const COList &thatList);
    bool isEqual(const COList &thatList) const;
    bool operator ==(const COList &thatList) const;

    COList(const COList &givenList);

    int searchSequential(int x) const;

    friend COList fUnion(const COList &thisList, const COList &thatList);
    COList fUnion(const COList &thatList) const;
    COList operator +(const COList &thatList) const;
  };


/*
Union of two lists
------------------
Plan1:  
  copy L1 to L3
  merge values from L2 to L3
  get rid of duplicates in L3

Plan2:
  copy L1 to L3 ignoring duplicates
  insert values from L2 to L3 ignoring duplicates

Plan3:
  copy L1 to L3
  append L2 to L3
  sort L3
  get rid of duplicates in L3

Plan4:
  copy L1 to tL1
  get rid of duplicates in tL1
  copy L2 to L3
  get rid of duplicates in L3
  insert values from tL1 to L3 ignoring duplicates

Plan5:
  insert values from L1 to L3 ignoring duplicates
  insert values from L2 to L3 ignoring duplicates

Plan6:
  pickSmart values from L1 and L2 to L3 ignoring duplicates

  
*/

//bool isEqual(COList thisList, COList thatList);



////////////////////////////////////////
//main
////////////////////////////////////////
void main(void)
  {
  srand(time(NULL));

  /*
  COList myList, youList, hisList;
  myList.display();

  myList.insert(12);
  myList.display();

  myList.insert(16);
  myList.display();

  myList.insert(14);
  myList.display();
  //testInsert();
  //testShuffle();
  //testSortBubble();
  */
  ///testPopulate();
  //testIsSorted();
  //testShuffle();
  //testSortBubble();
  //testConstructor();
  //testIsEqual();
  //testIsEqual2();
  //testIsEqual3();
  //testConstructorCopy();
  testSearchSequential();
  }


void testSearchSequential(void)
  {
  cout << "+++++++++++++++++++\n";
  cout << "testSearchSequential\n";
  cout << "+++++++++++++++++++\n";

  for (int c=1; c<=TEST_COUNT; c++)
    {
    COList myList('c');
    myList.display();

    int x = rand()%(MAX_VALUE+1);
    cout << "Searching for " << x << endl;
    if (UNDEFINED == myList.searchSequential(x))
      cout << x << " is NOT in the list\n";
    else
      cout << x << " is in the list at " << myList.searchSequential(x) << "\n";


    myList.display();

    cout << "*****************\n";

    }
  }


/*
Algorithm:
compare x from begin to end and return the position
if not found return UNDEFINED

for i=0 to n-1 do the following
  if x = a[i] then return i
  end for

return UNDEFINED

*/
int COList::searchSequential(int x) const
  {
  for (int i=0; i<=this->n-1; i++)
    if (x == a[i]) 
      return i;

  return UNDEFINED;
  }


void testConstructorCopy(void)
  {
  cout << "+++++++++++++++++++\n";
  cout << "testConstructorCopy\n";
  cout << "+++++++++++++++++++\n";

  for (int c=1; c<=TEST_COUNT; c++)
    {
    COList myList('c');
    myList.display();

    COList yourList(myList);
    yourList.display();
    myList.display();

    cout << "*****************\n";

    }
  }



COList::COList(const COList &oldList)
  {
  cout << "Copy constructor called\n";
  this->n = oldList.n;
  for (int i=0; i<=MAX_SIZE-1; i++)
    this->a[i] = oldList.a[i];
  }

void testIsEqual3(void)
  {
  cout << "++++++++++++\n";
  cout << "testIsEqual3\n";
  cout << "++++++++++++\n";

  for (int c=1; c<=TEST_COUNT; c++)
    {
    COList myList('c');
    myList.display();

    COList yourList('r');
    yourList.display();

    if (myList==yourList)
      cout << "Lists are equal\n";
    else
      cout << "Lists are NOT equal\n";

    cout << "After myList = yourList;\n";
    
    myList = yourList;

    myList.display();
    yourList.display();

    if (myList.operator ==(yourList))
      cout << "Lists are equal\n";
    else
      cout << "Lists are NOT equal\n";
    cout << "*****************\n";

    }
  }


bool COList::operator ==(const COList &thatList) const
  {
  if (this->n != thatList.n)
    return false;

  for (int i=0; i<=this->n-1; i++)
    if (this->a[i] != thatList.a[i])
       return false;

  return true;
  }



void testIsEqual2(void)
  {
  cout << "++++++++++++\n";
  cout << "testIsEqual2\n";
  cout << "++++++++++++\n";

  for (int c=1; c<=TEST_COUNT; c++)
    {
    COList myList('c');
    myList.display();

    COList yourList('r');
    yourList.display();

    if (myList.isEqual(yourList))
      cout << "Lists are equal\n";
    else
      cout << "Lists are NOT equal\n";

    cout << "After myList = yourList;\n";
    
    myList = yourList;

    myList.display();
    yourList.display();

    if (myList.isEqual(yourList))
      cout << "Lists are equal\n";
    else
      cout << "Lists are NOT equal\n";
    cout << "*****************\n";

    }
  }


bool COList::isEqual(const COList &thatList) const
  {
  if (this->n != thatList.n)
    return false;

  for (int i=0; i<=this->n-1; i++)
    if (this->a[i] != thatList.a[i])
       return false;

  return true;
  }


void testIsEqual(void)
  {
  cout << "+++++++++++\n";
  cout << "testIsEqual\n";
  cout << "+++++++++++\n";

  for (int c=1; c<=TEST_COUNT; c++)
    {
    COList myList('c');
    myList.display();

    COList yourList('r');
    yourList.display();

    if (isEqual(myList, yourList))
      cout << "Lists are equal\n";
    else
      cout << "Lists are NOT equal\n";

    cout << "After myList = yourList;\n";
    
    myList = yourList;

    myList.display();
    yourList.display();

    if (isEqual(myList, yourList))
      cout << "Lists are equal\n";
    else
      cout << "Lists are NOT equal\n";
    cout << "*****************\n";

    }


  /*
  if (myList == yourList)
    cout << "Go home\n";
  else
    cout << "Stay here\n";
  */
  }



/*
check of the counts are same
check all the corresponding values in both lists

if n of thisList != n of thatList
  exit with false

for i=0 to n-1
  if a[i] of thisList != a[i] of thatList
     exit with false
  end for

exit with true
*/
bool isEqual(const COList &thisList, const COList &thatList)
  {
  if (thisList.n != thatList.n)
    return false;

  for (int i=0; i<=thisList.n-1; i++)
    if (thisList.a[i] != thatList.a[i])
       return false;

  return true;
  }


void testConstructor(void)
  {
  cout << "++++++++++++++\n";
  cout << "testConstructor\n";
  cout << "++++++++++++++\n";

  for (int c=1; c<=TEST_COUNT; c++)
    {
    COList myList('c');

    myList.display();

    cout << "*****************\n";

    }
  }


COList::COList(char ch)
  {
  cout << "Constructor COList(char ch) is called\n";
  //(*this).initialize();
  this->initialize();
  //initialize();

  int n = rand()%(MAX_SIZE+1);
  (*this).populate(n);
  }


void COList::swap(int &x, int &y)
  {
  if (x != y)
    {
    int temp = x;
    x = y;
    y = temp;
    }
  };


////////////////////////////////////////
//testSortBubble
////////////////////////////////////////
void testSortBubble(void)
  {
  cout << "++++++++++++++\n";
  cout << "testSortBubble\n";
  cout << "++++++++++++++\n";

  for (int c=1; c<=TEST_COUNT; c++)
    {
    COList myList('r');

    myList.display();


    myList.shuffle();

    cout << "After shuffle\n";
    myList.display();

    cout << "After sortBubble\n";
    myList.sortBubble();
    myList.display();

    cout << "*****************\n";

    }
  }



void COList::sortBubble(void)
  {
  int swaps;
  do 
    {
    swaps = 0;
    for (int i=0; i<=n-2; i++)
      if (a[i] > a[i+1])
        {
        swap(a[i], a[i+1]);
        swaps++;
        }

    } while (swaps!=0);

  }


void testShuffle(void)
  {
  cout << "+++++++++++\n";
  cout << "testShuffle\n";
  cout << "+++++++++++\n";

  for (int c=1; c<=TEST_COUNT; c++)
    {
    COList myList('r');


    myList.display();


    myList.shuffle();

    cout << "After shuffle\n";
    myList.display();

    cout << "*****************\n";

    }
  }


void COList::shuffle(void)
  {
  for (int i=1; i<=n*n; i++)
    {
    int pick = rand()%n;
    swap (a[0], a[pick]);
    }

  }


void testPopulate(void)
  {
  cout << "++++++++++++\n";
  cout << "testPopulate\n";
  cout << "++++++++++++\n";

  for (int c=1; c<=TEST_COUNT; c++)
    {
    COList myList;

    int n = rand()%(MAX_SIZE+1);
    cout << "n = " << n << endl;
    myList.populate(n);

    myList.display();

    cout << "*****************\n";

    }
  }


void COList::populate(int n)
  {
  for (int i=1; i<=n; i++)
    {
    int x = rand()%(MAX_VALUE+1);
    (*this).insert(x);
    }
  }


void testIsSorted(void)
  {
  cout << "++++++++++++\n";
  cout << "testIsSorted\n";
  cout << "++++++++++++\n";

  for (int c=1; c<=TEST_COUNT; c++)
    {
    COList myList('r');

    myList.display();

    if (myList.isSorted())
        cout << "List is sorted\n";
      else
        cout << "List is NOT NOT sorted\n";


    cout << "*****************\n";

    }
  }


bool COList::isSorted(void) const
  {
  for (int i=0; i<=n-2; i++)
    if (a[i] > a[i+1]) 
      return false;

  return true;
  }


void COList::initialize(void)
  {
  for (int i=0; i<=MAX_SIZE-1; i++)
    a[i] = UNDEFINED;

  n = 0;
  }

bool COList::insert(int x)
  {
  if (0 == n)
      {
      a[n] = x;
      n++;
      return true;
      };

  if (MAX_SIZE == n)
      return false;

  if (n > 0)
      {
      a[n] = x;
      n++;

      for (int i=n-1; i>=1; i--)
        {
        if (a[i] >= a[i-1]) return true;
        swap(a[i], a[i-1]);
        }

      return true;
      }

  return false;

  }


void COList::display(void) const
  {
  cout << "a[" << n << "]: ";
  for (int i=0; i<=n-1; i++)
    cout << a[i] << ' ';

  cout << endl;
  }


COList::COList(void)
  {
  cout << "BEING INITIALIZED\n";
  initialize();
  }