Academic Integrity: tutoring, explanations, and feedback — we don’t complete graded work or submit on a student’s behalf.

/************************************************************************** * co

ID: 3784061 • Letter: #

Question

/**************************************************************************

* complete .h file (.cpp file is complete) and an output is given *

**************************************************************************/

implement a generic dynamic array class. It will be atemplated class that provides the basic features of an array.

/********************************************************************

* output: bold one's are the one's I didn't know how to do *

********************************************************************/

The correct output is shown below:

The capacity of D is 15

The capacity of E is 15

The capacity of D is now 25

The capacity of E is now 30

D[0] = 11

Array index is negative

Array index is too large

/************************

* .cpp complete file *

*************************/

#include <string>


int doubleIt(dynarr<int> A)
{   
int newsize = 2*A.getCapacity();
A.reserve(newsize);   
   return newsize;
}
int main()
{   
dynarr<int> D(15);
std::cout << "The capacity of D is " << D.getCapacity() << std::endl;
dynarr<int> E(D);
std::cout << "The capacity of E is " << E.getCapacity() << std::endl;
D.reserve(25);   
std::cout << "The capacity of D is now " << D.getCapacity() << std::endl;   
E.reserve(2*E.getCapacity());   
std::cout << "The capacity of E is now " << E.getCapacity() << std::endl;
D[0] = 11;   
std::cout << "D[0] = " << D[0] << std::endl;
try {   
std::cout << D[-1] << std::endl;   
}   
   catch(InvalidIndex &ex) {
   std::cout << ex.getMessage() << std::endl;
}
try {
   std::cout << D[30] << std::endl;
}   
catch(InvalidIndex &ex) {
   std::cout << ex.getMessage() << std::endl;
}   
   return 0;
  
}

/************************************
* .h file (should be completed) *
*************************************/
#include <cassert>
#include <iostream>
#include <string>

class RuntimeException // generic run-time exception
{
protected:
std::string errorMsg;
public:   
RuntimeException(const std::string& err) { errorMsg = err; }   
std::string getMessage() const { return errorMsg; }
};
class InvalidIndex : public RuntimeException
{
public:
InvalidIndex(const std::string& err): RuntimeException(err) {};
};

template <class dynElem>
class dynarr {
private:   
int capacity;
dynElem *A;   
public:   
dynarr() : capacity(0), A(NULL){}   
dynarr(int N): capacity(N), A(new dynElem[N]){}
dynarr(const dynarr<dynElem> &other);
~dynarr();   
dynarr<dynElem> & operator=( const dynarr<dynElem> &other);   
dynElem & operator[](int ndx) throw(InvalidIndex);   
int getCapacity();
void reserve(int newcap);
};
template <class dynElem>
dynarr<dynElem>::dynarr(const dynarr<dynElem> &other)
{
   capacity = other.capacity;
   A = new dynElem[capacity];
   for(int i = 0; i < capacity; i++)
   A[i] = other.A[i];
}

template <class dynElem>
dynarr<dynElem>::~dynarr()
{


}
template <class dynElem>
dynarr<dynElem> & dynarr<dynElem>::operator=( const dynarr<dynElem> &other)
{
dynarr temp (other);
return temp;
}   
template <class dynElem>
dynElem & dynarr<dynElem>::operator[](int ndx) throw(InvalidIndex)
{
//if(ndx < capacity)
return A[ndx];
/*else if(ndx < 0)
std::cout<<"Array index is negative"<<std::endl;
else
std::cout<<"Array index is too large"<<std::endl; */
}
template <class dynElem>
int dynarr<dynElem>::getCapacity()
{   
return capacity;
  
}   
template <class dynElem>
void dynarr<dynElem>::reserve(int newcap)
{
// if newcap <= capacity, does nothing;
if(newcap > capacity)
{
// if capacity is 0, allocates a dynamic array of   
// capacity newcap and makes A point to that array;   
if(capacity == 0)
A = new dynElem[newcap];
// otherwise allocates a new dynamic array newA of capacity   
// newcap, copies values in A to newA, deletes A and sets   
// A equal to newA
else
{
dynElem *newA = new dynElem[newcap];
for(int i = 0; i < capacity; i++)
newA[i] = A[i];
delete A;
A = newA;
capacity = newcap;
}
}
}

Explanation / Answer

The following the code for only .h file where the exception throwing is handled for negative and overlfown indexes

PROGRAM CODE:

#include <cassert>
#include <iostream>
#include <string>
class RuntimeException // generic run-time exception
{
protected:
std::string errorMsg;
public:   
RuntimeException(const std::string& err) { errorMsg = err; }   
std::string getMessage() const { return errorMsg; }
};
class InvalidIndex : public RuntimeException
{
public:
InvalidIndex(const std::string& err): RuntimeException(err) {};
};

template <class dynElem>
class dynarr {
private:   
int capacity;
dynElem *A;   
public:   
dynarr() : capacity(0), A(NULL){}   
dynarr(int N): capacity(N), A(new dynElem[N]){}
dynarr(const dynarr<dynElem> &other);
~dynarr();   
dynarr<dynElem> & operator=( const dynarr<dynElem> &other);   
dynElem & operator[](int ndx) throw(InvalidIndex);   
int getCapacity();
void reserve(int newcap);
};
template <class dynElem>
dynarr<dynElem>::dynarr(const dynarr<dynElem> &other)
{
capacity = other.capacity;
A = new dynElem[capacity];
for(int i = 0; i < capacity; i++)
A[i] = other.A[i];
}

template <class dynElem>
dynarr<dynElem>::~dynarr()
{
delete A;
}
template <class dynElem>
dynarr<dynElem> & dynarr<dynElem>::operator=( const dynarr<dynElem> &other)
{
dynarr temp (other);
return temp;
}   
template <class dynElem>
dynElem & dynarr<dynElem>::operator[](int ndx) throw(InvalidIndex)
{
if(ndx < 0)
throw InvalidIndex("Array Index is negative") ;
else if(ndx < capacity)
return A[ndx];
else if(ndx > capacity)
throw InvalidIndex("Array index is too large");
}
template <class dynElem>
int dynarr<dynElem>::getCapacity()
{   
return capacity;
  
}   
template <class dynElem>
void dynarr<dynElem>::reserve(int newcap)
{
// if newcap <= capacity, does nothing;
if(newcap > capacity)
{
// if capacity is 0, allocates a dynamic array of   
// capacity newcap and makes A point to that array;   
if(capacity == 0)
A = new dynElem[newcap];
// otherwise allocates a new dynamic array newA of capacity   
// newcap, copies values in A to newA, deletes A and sets   
// A equal to newA
else
{
dynElem *newA = new dynElem[newcap];
for(int i = 0; i < capacity; i++)
newA[i] = A[i];
delete A;
A = newA;
capacity = newcap;
}
}
}

OUTPUT: