Question
C++ Programming. any comments in the code will be greatly appreciated Config.h #define LAB3_TEST1 0 // 0 => test with char, 1 => test with
C++ Programming. any comments in the code will be greatly appreciated
Config.h
#define LAB3_TEST1 0 // 0 => test with char, 1 => test with int
#define LAB3_TEST2 0 // Prog exercise 2: moveToNth
#define LAB3_TEST3 0 // Prog exercise 3: find
/**
* Ordered list class tests.
*/
#define LAB4_TEST1 0 // merge: programming exercise 2
#define LAB4_TEST2 0 // subset: programming exercise 3
ListArray.h
#ifndef LISTARRAY_H
#define LISTARRAY_H
#include
#include
using namespace std;
#pragma warning( disable : 4290 )
template
class List
{
public:
static const int MAX_LIST_SIZE = 10; // Default maximum list size
// Constructors
List ( int maxNumber = MAX_LIST_SIZE ); // Default constructor
List ( const List& source ); // Copy constructor
// Overloaded assignment operator
List& operator= ( const List& source );
// Destructor
virtual ~List ();
// List manipulation operations
virtual void insert ( const DataType& newDataItem ) // Insert after cursor
throw ( logic_error );
void remove () throw ( logic_error ); // Remove data item
virtual void replace ( const DataType& newDataItem ) // Replace data item
throw ( logic_error );
void clear (); // Clear list
// List status operations
bool isEmpty () const; // List is empty
bool isFull () const; // List is full
// List iteration operations
void gotoBeginning () // Go to beginning
throw ( logic_error );
void gotoEnd () // Go to end
throw ( logic_error );
bool gotoNext () // Go to next data item
throw ( logic_error );
bool gotoPrior () // Go to prior data item
throw ( logic_error );
DataType getCursor () const
throw ( logic_error ); // Return data item
// Output the list structure -- used in testing/debugging
virtual void showStructure () const;
// In-lab operations
void moveToNth ( int n ) // Move data item to pos. n
throw ( logic_error );
bool find ( const DataType& searchDataItem ) // Find data item
throw ( logic_error );
protected:
// Data members
int maxSize,
size, // Actual number of data item in the list
cursor; // Cursor array index
DataType *dataItems; // Array containing the list data item
};
#endif
ListArray.cpp
#include "ListArray.h"
template
List::List ( int maxNumber )
{
maxSize = maxNumber;
size = 0;
cursor = -1;
dataItems = new DataType[maxSize];
}
//copy constructor
template
List::List(const List& source) {
maxSize = source.maxSize;
size = source.size;
cursor = source.cursor;
dataItems = new DataType[maxSize];
for (int i = 0; i
dataItems[i] = source.dataItems[i];
}
}
template
List& List::operator= ( const List& source )
{
if (this != &source) {
delete[] dataItems;
size = source.size;
maxSize = source.maxSize;
cursor = source.cursor;
dataItems = new DataType[maxSize];
}
for (int i = 0; i
dataItems[i] = source.dataItems[i];
}
return *this;
}
template
List::~List ()
{
delete[] dataItems;
}
template
void List::insert ( const DataType& newDataItem )
throw ( logic_error )
{
if (size == maxSize)
throw logic_error("List is full");
else
{
for (int i = size - 1; i>cursor; i--) {
DataType initialI = dataItems[i];
dataItems[i] = dataItems[i + 1];
dataItems[i + 1] = initialI;
}
dataItems[cursor + 1] = newDataItem;
size++;
cursor++;
}
}
template
void List::remove () throw ( logic_error )
{
if (size == 0) {
throw logic_error("the list is empty");
}
else {
if (cursor == size - 1)
{
size--;
gotoBeginning();
}
else
{
for (int i = cursor; i
{
dataItems[i] = dataItems[i + 1];
}
size--;
}
}
}
template
void List::replace ( const DataType& newDataItem )
throw ( logic_error )
{
if (size == 0) {
throw logic_error("The List is full");
}
else {
dataItems[cursor] = newDataItem; //Set the dataItems cursor Index value = to newDataItems value.
}
}
template
void List::clear ()
{
size = 0;
cursor = 0;
}
template
bool List::isEmpty () const
{
if (size == 0)
return true;
else
return false;
}
template
bool List::isFull () const
{
if (size != MAX_LIST_SIZE)
return false;
else
return false;
}
template
void List::gotoBeginning ()
throw ( logic_error )
{
if (size == 0) {
throw logic_error("The List is empty");
}
else {
cursor = 0;
}
}
template
void List::gotoEnd ()
throw ( logic_error )
{
if (size == 0) {
throw logic_error("The List is empty");
}
else {
cursor = size - 1;
}
}
template
bool List::gotoNext ()
throw ( logic_error )
{
if (size == 0) {
throw logic_error("The List is empty");
}
else {
if (cursor
cursor++;
return true;
}
}
return false;
}
template
bool List::gotoPrior ()
throw ( logic_error )
{
if (isEmpty()) {
throw logic_error("The List is empty");
}
else {
if (cursor != 0) {
cursor--;
return true;
}
}
return false;
}
template
DataType List::getCursor () const
throw ( logic_error )
{
DataType t;
if (isEmpty())
throw logic_error("list is empty");
else
return dataItems[cursor];
return t;
}
#include "show3.cpp"
template
void List::moveToNth ( int n )
throw ( logic_error )
{
}
template
bool List::find ( const DataType& searchDataItem )
throw ( logic_error )
{
return false;
}
Show3.cpp
#include "ListArray.h"
template
void List:: showStructure () const
// outputs the data items in a list. if the list is empty, outputs
// "empty list". this operation is intended for testing/debugging
// purposes only.
{
int j; // loop counter
if ( size == 0 )
cout
// The Ordered List code blows up below. Since this is just debugging
// code, we check for whether the OrderedList is defined, and if so,
// print out the key value. If not, we try printing out the entire item.
// Note: This assumes that you have used the double-inclusion protection
// in your OrderedList.cpp file by doing a "#ifndef ORDEREDLIST_CPP", etc.
// If not, you will need to comment out the code in the section under
// the "else", otherwise the compiler will go crazy in lab 4.
// The alternative is to overload operator
// the ordered list.
else
{
cout
for ( j = 0 ; j
cout
cout
for ( j = 0 ; j
if( j == cursor ) {
cout
cout
#ifdef ORDEREDLIST_CPP
.getKey()
#endif
;
cout
cout
}
else
cout
#ifdef ORDEREDLIST_CPP
.getKey()
#endif
}
cout
}
}
Test3.cpp
#include
using namespace std;
// Because of C++ template implementations, must include source for templated class
// That is ugly, but it is required.
#include "ListArray.cpp"
#include "config.h"
void print_help();
void showTwoLists(List list1, List list2); // Displays two lists that are supposedly equivalent.
int main()
{
// hack: put a "try/catch" with list creation code?
// we need to demonstrate use of the try/catch syntax.
#if LAB3_TEST1
List testList(8); // Test list to test with ints
List copyList(testList); // Used to test copy constructor
List assignList; // Used to test assignment operator
int testData; // List data item
#else
List testList(8); // Test list to test with chars
List copyList(testList); // Used to test copy constructor
List assignList; // Used to test assignment operator
char testData; // List data item
#endif
int n; // Position within list
char cmd; // Input command
print_help();
do
{
testList.showStructure(); // Output list
cout
cin >> cmd;
if ( cmd == '+' || cmd == '=' || cmd == '?' )
cin >> testData;
else if ( cmd == 'M' || cmd == 'm' )
cin >> n;
switch ( cmd )
{
case 'H' : case 'h':
print_help();
break;
case '+' : // insert
cout
try
{
testList.insert(testData);
}
catch (logic_error &e)
{
cerr
}
break;
case '-' : // remove
cout
try
{
testList.remove();
}
catch (logic_error &e)
{
cerr
}
break;
case '=' : // replace
cout
try
{
testList.replace(testData);
}
catch (logic_error &e)
{
cerr
}
break;
case '@' : // getCursor
try
{
cout
}
catch (logic_error &e)
{
cerr
}
break;
case '
cout
try
{
testList.gotoBeginning();
}
catch (logic_error &e)
{
cerr
}
break;
case '>' : // gotoEnd
cout
try
{
testList.gotoEnd();
}
catch (logic_error &e)
{
cerr
}
break;
case 'N' : case 'n' : // gotoNext
try
{
if ( testList.gotoNext() )
cout
else
cout
}
catch (logic_error &e)
{
cerr
}
break;
case 'P' : case 'p' : // gotoPrior
try
{
if ( testList.gotoPrior() )
cout
else
cout
}
catch (logic_error &e)
{
cerr
}
break;
case 'C' : case 'c' : // clear
cout
testList.clear();
break;
case 'E' : case 'e' : // isEmpty
if ( testList.isEmpty() )
cout
else
cout
break;
case 'F' : case 'f' : // isFull
if ( testList.isFull() )
cout
else
cout
break;
case '!' :
showTwoLists(copyList, testList);
break;
case '#' :
assignList.insert('x');
assignList = testList;
showTwoLists(assignList, testList);
break;
#if LAB3_TEST2
case 'M' : case 'm' : // In-lab Exercise 2
cout
try
{
testList.moveToNth(n);
}
catch (logic_error &e)
{
cerr
}
break;
#endif // LAB3_TEST1
#if LAB3_TEST3
case '?' : // In-lab Exercise 3
try
{
if ( testList.find(testData) )
cout
else
cout
}
catch (logic_error &e)
{
cerr
}
break;
#endif // LAB3_TEST3
case 'Q' : case 'q' : // Quit test program
break;
default : // Invalid command
cout
}
}
while ( cin && cmd != 'Q' && cmd != 'q' );
if( !cin ) {
cout
}
return 0;
}
void showTwoLists(List list1, List list2) {
// Variables should match, but dynamic memory buffer must be different
cout
cout
list1.showStructure();
cout
list2.showStructure();
cout
}
void print_help()
{
cout
cout
cout
cout
cout
cout
cout
cout : Go to the end of the list"
cout
cout
cout
cout
cout
cout
cout
cout
#if LAB3_TEST2
#else
#endif // LAB3_TEST2
cout
#if LAB3_TEST3
#else
#endif // LAB3_TEST3
cout
cout
}
Programming Exercise 2. Implement the member function moveToNth(..), that removes the item marked by the cursor and inserts it as the nth element of the list. Test you implementation by turning the flag LAB3_TEST2 from 0 to 1 in config.h (50 pts) Programming Exercise 3. Implement the ListArray member function find.) that searches for the element given as a parameter; the search starts at the cursor and stops when it finds the element or at the end of the list. The cursor remains on the last position searched. Test you implementation by turning the flag LAB3_TEST3 from 0 to 1 in config.h (50 pts) Programming Exercise 2. Implement the member function moveToNth(..), that removes the item marked by the cursor and inserts it as the nth element of the list. Test you implementation by turning the flag LAB3_TEST2 from 0 to 1 in config.h (50 pts) Programming Exercise 3. Implement the ListArray member function find.) that searches for the element given as a parameter; the search starts at the cursor and stops when it finds the element or at the end of the list. The cursor remains on the last position searched. Test you implementation by turning the flag LAB3_TEST3 from 0 to 1 in config.h (50 pts)Step by Step Solution
There are 3 Steps involved in it
Step: 1
Get Instant Access to Expert-Tailored Solutions
See step-by-step solutions with expert insights and AI powered tools for academic success
Step: 2
Step: 3
Ace Your Homework with AI
Get the answers you need in no time with our AI-driven, step-by-step assistance
Get Started