rect002
Home ] Up ]

 

// rect002.cpp
#include <iostream.h>
#include <stdlib.h>
#include <time.h>
/////////////////////////////////////////////////////////////////////
// Constant definitions
// length and width should be in [MIN_DIM, MAX_DIM]
/////////////////////////////////////////////////////////////////////
const int MIN_DIM    = 1;
const int MAX_DIM    = 19;
const int TEST_COUNT = 5;
/////////////////////////////////////////////////////////////////////
// CRectangle class definition
/////////////////////////////////////////////////////////////////////
class CRectangle
  {
  private:
    int length;
    int width;
  public:
    CRectangle(int len=1, int wid=1);        
    int perimeter(void) const;
    int area(void) const;                       //p01
    void setDimension(int len, int wid);        //p01
    void setLength(int len);                    //p01
    void setWidth(int wid);                     //p01
    int getLength(void) const;                  //p01
    int getWidth(void) const;                   //p01
    void getDimension(int &len, int &wid) const;//p01
    void display(void) const;
    int & badSet(void);
    CRectangle(char ch);
    ~CRectangle(void);
    friend bool isSquare(const CRectangle &rect);
  };
/////////////////////////////////////////////////////////////////////
// isSquare function to check if a rectangle is square
/////////////////////////////////////////////////////////////////////
bool isSquare(const CRectangle &rect)
  {
  return (rect.length == rect.width);
  }
/////////////////////////////////////////////////////////////////////
// testIsSquare
/////////////////////////////////////////////////////////////////////
void testIsSquare(void)
  {
  cout << "------------------\n";
  cout << "testIsSquare(void)\n";
  cout << "------------------\n";
  
  for (int i=0; i<TEST_COUNT; i++)
    {
    char ch;
    if (rand()%2 == 0)
        ch = 'r';
      else
        ch = 's';
    CRectangle rect1(ch);
    rect1.display();
    if (isSquare(rect1))
        cout << "Is square\n";
      else
        cout << "Is NOT square\n";
    }
  }
/////////////////////////////////////////////////////////////////////
// ~CRectangle
// destructor for CRectangle
/////////////////////////////////////////////////////////////////////
CRectangle::~CRectangle(void)
  {
  cout << "Destructor called\n";
  }
/////////////////////////////////////////////////////////////////////
//void testDestructor(void)
/////////////////////////////////////////////////////////////////////
void testDestructor(void)
  {
  cout << "--------------------\n";
  cout << "testDestructor(void)\n";
  cout << "--------------------\n";
    {
    CRectangle rect;
    rect.display();
    }
    
    {
    CRectangle *p;
    p = new CRectangle;
    p->display();
    delete p;
    }
    {
    cout << "Dynamic array of rectangles\n";
    CRectangle *p;
    p = new CRectangle[5];
    p->display();
    delete []p;
    }
    
    {
    cout << "Static rectangle\n";
    static CRectangle rect;
    rect.display();
    }
    cout << "out of scope of static \n";
    {
    cout << "Static rectangle\n";
    static CRectangle rect;
    rect.display();
    exit(1);
    }
    cout << "out of scope of static \n";
  }
/////////////////////////////////////////////////////////////////////
// constructor with a character
// if character is 's' it builds a square
//                 'r' it builds a random
/////////////////////////////////////////////////////////////////////
CRectangle::CRectangle(char ch)
  {
  if (('s'==ch) || ('S'==ch))
      {
      length = rand()%MAX_DIM+1;
      width = length;
      }
    else if (('r'==ch) || ('R'==ch))
      {
      length = rand()%MAX_DIM+1;
      width  = rand()%MAX_DIM+1;
      }
    else
      length = width = 1;
  }
/////////////////////////////////////////////////////////////////////
// testConstructorRand(void)
/////////////////////////////////////////////////////////////////////
void testConstructorRand(void)
  {
  cout << "-------------------------\n";
  cout << "testConstructorRand(void)\n";
  cout << "-------------------------\n";
  
  for (int i=0; i<TEST_COUNT; i++)
    {
    char ch;
    switch (rand()%5)
      {
      case 0: ch = 'r'; break;
      case 1: ch = 'R'; break;
      case 2: ch = 's'; break;
      case 3: ch = 'S'; break;
      case 4: ch = 'k'; break;
      default:ch = 'k';
      }
    CRectangle rect1(ch);
    cout << "CRectangle rect1('" << ch << "');  => "; rect1.display();
    }
  }
/////////////////////////////////////////////////////////////////////
//badSet function
/////////////////////////////////////////////////////////////////////
int & CRectangle::badSet(void)
  {
  return length;
  }
/////////////////////////////////////////////////////////////////////
// testBadSet(void)
/////////////////////////////////////////////////////////////////////
void testBadSet(void)
  {
  cout << "----------------\n";
  cout << "testBadSet(void)\n";
  cout << "----------------\n";
  for (int i=0; i<TEST_COUNT; i++)
    {
    CRectangle r1('r');
    r1.display();
    r1.badSet()=99;
    cout << "After r1.badSet()=99;   ";
    r1.display();
    }
  }
/////////////////////////////////////////////////////////////////////
// Test function for default constructor
/////////////////////////////////////////////////////////////////////
void testConstructorDefault(void)
  {
  cout << "----------------------------\n";
  cout << "testConstructorDefault(void)\n";
  cout << "----------------------------\n";
  
  CRectangle r1;
  r1.display();
  CRectangle myRectangles[TEST_COUNT];
  cout << "Using for loop:\n";
  for (int i=0; i<TEST_COUNT; i++)
    myRectangles[i].display();
  cout << "Using pointer p, while loop, and p++:\n";
  CRectangle *p;
  p = myRectangles;
  while (true)
    {
    p->display();
    if (&myRectangles[TEST_COUNT-1] == p)
        break;
    p++;
    }
  cout << "Using pointer p, for loop, and (p+i)-> :\n";
  p = &myRectangles[0];
  for (i=0; i<TEST_COUNT; i++)
    (p+i)->display();
  cout << "Using pointer p, for loop, and (*(p+i)). :\n";
  p = &myRectangles[0];
  for (i=0; i<TEST_COUNT; i++)
    (*(p+i)).display();
  }
/////////////////////////////////////////////////////////////////////
// Constructor for CRectangle
// initializes the length and width with len and wid
// makes sure that the values are between MIN_DIM and MAX_DIM
// sets them to 1 if the the supplied values are out of range
/////////////////////////////////////////////////////////////////////
CRectangle::CRectangle(int len, int wid)
  {
  if ((len >= MIN_DIM) && (len <= MAX_DIM))
      length = len;
    else
      length = 1;
  if ((wid >= MIN_DIM) && (wid <= MAX_DIM))
      width = wid;
    else
      width = 1;
  }
/////////////////////////////////////////////////////////////////////
// Test function for constructor with given values for length & width
/////////////////////////////////////////////////////////////////////
void testConstructorWithDims(void)
  {
  cout << "-----------------------------\n";
  cout << "testConstructorWithDims(void)\n";
  cout << "-----------------------------\n";
  
  for (int i=0; i<TEST_COUNT; i++)
    {
    int len = rand()%MAX_DIM + 1;
    if (rand()%4 == 1)
      len = len + MAX_DIM/2;
    int wid = rand()%MAX_DIM + 1;
    if (rand()%4 == 1)
      wid = wid + MAX_DIM/2;
    if (rand()%3 == 1)
      len = -len;
    if (rand()%3 == 1)
      wid = -wid;
    cout << "len = " << len << ", wid = " << wid << endl;
    CRectangle rect(len, wid);
    cout << "CRectangle rect(len, wid);  => ";
    rect.display();
    }
  }
/////////////////////////////////////////////////////////////////////
// testAssignmentDefault
/////////////////////////////////////////////////////////////////////
void testAssignmentDefault(void)
  {
  cout << "---------------------------\n";
  cout << "testAssignmentDefault(void)\n";
  cout << "---------------------------\n";
  
  for (int i=0; i<TEST_COUNT; i++)
    {
    CRectangle rect1('r'), rect2('r'), rect3('r');
    cout << "rect1 = "; rect1.display();
    cout << "rect2 = "; rect2.display();
    cout << "rect3 = "; rect3.display();
    rect1 = rect2 = rect3;
    cout << "After rect1 = rect2 = rect3; \n";
    cout << "rect1 = "; rect1.display();
    cout << "rect2 = "; rect2.display();
    cout << "rect3 = "; rect3.display();
    }
  }
/////////////////////////////////////////////////////////////////////
// Display member functio
/////////////////////////////////////////////////////////////////////
void CRectangle::display(void) const
  {
  cout << "Rectangle (" << length << ", " << width << ')' << endl;
  }
/////////////////////////////////////////////////////////////////////
// getLength
// Returns the length of the function
/////////////////////////////////////////////////////////////////////
int CRectangle::getLength(void) const                  //p01
  {
  return length;
  }
/////////////////////////////////////////////////////////////////////
// testGetLength
/////////////////////////////////////////////////////////////////////
void testGetLength(void)
  {
  cout << "-------------------\n";
  cout << "testGetLength(void)\n";
  cout << "-------------------\n";
  
  for (int i=0; i<TEST_COUNT; i++)
    {
    CRectangle rect('r');
    rect.display();
    cout << "Length = " << rect.getLength() << endl;
    }
  }
/////////////////////////////////////////////////////////////////////
// perimeter function member
// Calculates and returns the perimeter of the rectangle
/////////////////////////////////////////////////////////////////////
int CRectangle::perimeter(void) const
  {
  return (2*(length+width));
  }
/////////////////////////////////////////////////////////////////////
// Test function for perimeter
/////////////////////////////////////////////////////////////////////
void testPerimeter(void)
  {
  cout << "-------------------\n";
  cout << "testPerimeter(void)\n";
  cout << "-------------------\n";
  
  for (int i=0; i<TEST_COUNT; i++)
    {
    CRectangle rect('r');
    rect.display();
    cout << "Perimeter = " << rect.perimeter() << endl;
    }
  }
/////////////////////////////////////////////////////////////////////
// main function
/////////////////////////////////////////////////////////////////////
void main(void)
  {
  srand(time(NULL));
  testConstructorDefault();
  testConstructorWithDims();
  testConstructorRand();
  testPerimeter();
  testGetLength();
  testBadSet();
  testAssignmentDefault();
  testIsSquare();
  testDestructor();
  }
 
/*
SAMPLE RUN:
----------------------------
testConstructorDefault(void)
----------------------------
Rectangle (1, 1)
Using for loop:
Rectangle (1, 1)
Rectangle (1, 1)
Rectangle (1, 1)
Rectangle (1, 1)
Rectangle (1, 1)
Using pointer p, while loop, and p++:
Rectangle (1, 1)
Rectangle (1, 1)
Rectangle (1, 1)
Rectangle (1, 1)
Rectangle (1, 1)
Using pointer p, for loop, and (p+i)-> :
Rectangle (1, 1)
Rectangle (1, 1)
Rectangle (1, 1)
Rectangle (1, 1)
Rectangle (1, 1)
Using pointer p, for loop, and (*(p+i)). :
Rectangle (1, 1)
Rectangle (1, 1)
Rectangle (1, 1)
Rectangle (1, 1)
Rectangle (1, 1)
Destructor called
Destructor called
Destructor called
Destructor called
Destructor called
Destructor called
-----------------------------
testConstructorWithDims(void)
-----------------------------
len = -1, wid = 7
CRectangle rect(len, wid);  => Rectangle (1, 7)
Destructor called
len = 17, wid = 15
CRectangle rect(len, wid);  => Rectangle (17, 15)
Destructor called
len = 10, wid = 12
CRectangle rect(len, wid);  => Rectangle (10, 12)
Destructor called
len = 16, wid = 10
CRectangle rect(len, wid);  => Rectangle (16, 10)
Destructor called
len = 2, wid = 15
CRectangle rect(len, wid);  => Rectangle (2, 15)
Destructor called
-------------------------
testConstructorRand(void)
-------------------------
CRectangle rect1('s');  => Rectangle (19, 19)
Destructor called
CRectangle rect1('r');  => Rectangle (18, 17)
Destructor called
CRectangle rect1('r');  => Rectangle (14, 5)
Destructor called
CRectangle rect1('R');  => Rectangle (11, 18)
Destructor called
CRectangle rect1('S');  => Rectangle (19, 19)
Destructor called
-------------------
testPerimeter(void)
-------------------
Rectangle (12, 15)
Perimeter = 54
Destructor called
Rectangle (1, 3)
Perimeter = 8
Destructor called
Rectangle (2, 11)
Perimeter = 26
Destructor called
Rectangle (8, 15)
Perimeter = 46
Destructor called
Rectangle (13, 17)
Perimeter = 60
Destructor called
-------------------
testGetLength(void)
-------------------
Rectangle (9, 15)
Length = 9
Destructor called
Rectangle (2, 6)
Length = 2
Destructor called
Rectangle (3, 18)
Length = 3
Destructor called
Rectangle (18, 13)
Length = 18
Destructor called
Rectangle (14, 1)
Length = 14
Destructor called
----------------
testBadSet(void)
----------------
Rectangle (1, 9)
After r1.badSet()=99;   Rectangle (99, 9)
Destructor called
Rectangle (2, 15)
After r1.badSet()=99;   Rectangle (99, 15)
Destructor called
Rectangle (8, 10)
After r1.badSet()=99;   Rectangle (99, 10)
Destructor called
Rectangle (13, 11)
After r1.badSet()=99;   Rectangle (99, 11)
Destructor called
Rectangle (19, 17)
After r1.badSet()=99;   Rectangle (99, 17)
Destructor called
---------------------------
testAssignmentDefault(void)
---------------------------
rect1 = Rectangle (1, 5)
rect2 = Rectangle (18, 10)
rect3 = Rectangle (18, 12)
After rect1 = rect2 = rect3;
rect1 = Rectangle (18, 12)
rect2 = Rectangle (18, 12)
rect3 = Rectangle (18, 12)
Destructor called
Destructor called
Destructor called
rect1 = Rectangle (1, 9)
rect2 = Rectangle (16, 12)
rect3 = Rectangle (19, 9)
After rect1 = rect2 = rect3;
rect1 = Rectangle (19, 9)
rect2 = Rectangle (19, 9)
rect3 = Rectangle (19, 9)
Destructor called
Destructor called
Destructor called
rect1 = Rectangle (7, 1)
rect2 = Rectangle (3, 6)
rect3 = Rectangle (17, 4)
After rect1 = rect2 = rect3;
rect1 = Rectangle (17, 4)
rect2 = Rectangle (17, 4)
rect3 = Rectangle (17, 4)
Destructor called
Destructor called
Destructor called
rect1 = Rectangle (2, 9)
rect2 = Rectangle (5, 15)
rect3 = Rectangle (14, 10)
After rect1 = rect2 = rect3;
rect1 = Rectangle (14, 10)
rect2 = Rectangle (14, 10)
rect3 = Rectangle (14, 10)
Destructor called
Destructor called
Destructor called
rect1 = Rectangle (17, 6)
rect2 = Rectangle (8, 13)
rect3 = Rectangle (3, 13)
After rect1 = rect2 = rect3;
rect1 = Rectangle (3, 13)
rect2 = Rectangle (3, 13)
rect3 = Rectangle (3, 13)
Destructor called
Destructor called
Destructor called
------------------
testIsSquare(void)
------------------
Rectangle (16, 5)
Is NOT square
Destructor called
Rectangle (15, 11)
Is NOT square
Destructor called
Rectangle (10, 3)
Is NOT square
Destructor called
Rectangle (6, 6)
Is square
Destructor called
Rectangle (8, 14)
Is NOT square
Destructor called
--------------------
testDestructor(void)
--------------------
Rectangle (1, 1)
Destructor called
Rectangle (1, 1)
Destructor called
Dynamic array of rectangles
Rectangle (1, 1)
Destructor called
Destructor called
Destructor called
Destructor called
Destructor called
Static rectangle
Rectangle (1, 1)
out of scope of static
Static rectangle
Rectangle (1, 1)
Destructor called
Destructor called
Press any key to continue
*/