ECE231 – Spring 2009 – Programming Assignment 4
This is a step-by-step tutorial for this assignment and an explanation of the basics of how it works for those that are having a difficult time understanding or just are stuck somewhere. To view the assignment click here.
So for this assignment we are only going to be doing input and output. So the only header file we need is the iostream library.
1 2 3 4 |
#include <iostream> using namespace std; |
Defining the Node Class
For the node class we need 5 private variables: type, value, node1, node2, next, a constructor, 5 member functions, and a friend class.
Because most of the functions only return a single variable it would be a waste to have the functions outside the class so I put them all inside the class.
So here is what your class should look like:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
class node { protected: int type; // type of component double value; // value of the component int node1; // first node of the component int node2; // second node of the component node *next; // pointer to the next node in list public: node(int a, double b, int c, int d) { type = a; value = b; node1 = c; node2 = d; } int getType() { return type; } double getValue() { return value; } int getNode1() { return node1; } int getNode2() { return node2; } node *getNext() { return next; } friend class circuit; }; |
Defining the Circuit Class
For the circuit class we need 2 private variables: first and last, a constructor, a copy constructor, 6 member functions, and a friend function.
For these I will put most of the functions on the outside of the class.
So here is what your class should look like:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
class circuit { protected: node *first; // pointer to first node in list node *last; // pointer to last node in list node *getNode(int & , double & , int & , int & ); public: circuit(); circuit(const circuit & ); ~circuit(); void insert(int , double , int , int ); void insertInFront(node * ); void insertInBack(node * , node * ); void insertInMiddle(node * , node * , node * ); bool remove(int , int ); bool isEmpty(); friend ostream & operator << (ostream & , circuit ); }; |
Writing the Actual Functions for the Circuit Class
First, we have the private function getNode. This function creates a new member of the node class and returns the address to it.
1 2 3 4 5 6 7 8 |
node* circuit::getNode(int &t, double &v, int &n1, int &n2) { node *temp = new node(t, v, n1, n2); assert( temp != 0 ); return temp; } |
Second, we have the a constructor, a copy constructor, and a class destructor:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
circuit::circuit() { first = last = 0; } circuit::circuit(const circuit &c) { first = last = 0; node *nc = c.first; while(nc != 0) { insert(nc->type, nc->value, nc->node1, nc->node2); nc = nc->next; } } circuit::~circuit() { if( !isEmpty() ) { node *nc = first; node *temp; while(nc != 0) { temp = nc; nc = nc->next; delete temp; } } } |
Next, we have the 6 member functions:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 |
void circuit::insert(int t, double v, int n1, int n2) { node *newNode = getNode(t, v, n1, n2); node *nc = first; node *nc_next = first; if(isEmpty()) { first = last = newNode; newNode->next = 0; } else if(first == last) { if(newNode->node1 < first->node1) insertInFront(newNode); else if(newNode->node1 > first->node1) insertInBack(newNode, first); else // if newNode->node1 == first->node1 { if(newNode->node2 < first->node2) insertInFront(newNode); else insertInBack(newNode, first); } } else { while(nc->next != 0) { if(newNode->node1 < nc_next->node1) { if(nc_next == first) insertInFront(newNode); else insertInMiddle(newNode, nc, nc_next); break; } if(newNode->node1 == nc_next->node1) { if(newNode->node2 <= nc_next->node2) { if(nc_next == first) insertInFront(newNode); else insertInMiddle(newNode, nc, nc_next); break; } } if(newNode->node1 >= nc_next->node1 and nc_next == last) { insertInBack(newNode, nc_next); break; } nc = nc_next; nc_next = nc->next; } } } void circuit::insertInFront(node *n) { n->next = first; first = n; } void circuit::insertInBack(node *n, node *p) { p->next = last = n; n->next = 0; } void circuit::insertInMiddle(node *cn, node *p , node *n) { p->next = cn; cn->next = n; } bool circuit::remove(int n1, int n2) { node *nc = first; node *nc_next = first; node *temp; if( isEmpty() ) return false; while (nc_next != 0) { if(nc_next != 0 and nc_next->node1 == n1 and nc_next->node2 == n2) { temp = nc_next; nc->next = nc_next->next; if(first == last) first = last = 0; if(nc_next == first) first = temp->next; if (nc_next == last) last = nc; delete nc_next; return true; } nc = nc_next; nc_next = nc->next; } return false; } bool circuit::isEmpty() { return ( first == 0 and last == 0 ); } |
Last, we have a friend function:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
ostream & operator << (ostream &os, circuit c) { node *nc = c.first; // node count variable used for looping through list int lcv = 1; // loop control variable cout << "First: " << c.first << " Last: " << c.last << endl; while (nc != 0) { os << lcv << ". " << "node1: " << nc->getNode1() << " node2: " << nc->getNode2() << " type: " << nc->getType() << " value: " << nc->getValue() << " next: " << nc->getNext() << endl; nc = nc->getNext(); lcv++; } if(c.first == 0) os << "List is empty" << endl; return os; } |
Testing your program
Our teacher gave us a test program, however I expanded it a little bit to test a bit more fully.
So here is my test program:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 |
#include <iostream> #include "yourprogramname.h" using namespace std; const int M=7; const int R=2; int main() { circuit c, c2, c3; int d[M*3] = {1,1,4, 1,1,3, 2,2,3, 1,1,2, 1,5,6, 1,2,5, 3,1,3}; double v[M] = {10.5, 30.7, 100.4, 20.6, 35.5, 45.9, 60.8}; int d1[R*8] = {1,2, 5,6, 3,6, 1,4, 1,3, 2,5, 2,3, 1,3}; int i, j; for( i=0,j=0; i<M; i++,j=j+3 ) { cout << i+1 << endl; cout << "Inserting new node into list with:" << endl; cout << "node1: " << d[j+1] << " node2: " << d[j+2] << " type: " << d[j] << " value: " << v[i] << endl; c.insert( d[j], v[i], d[j+1], d[j+2] ); cout << "List: " << endl; cout << c << endl << endl; } for( i=0; i<R*8; i=i+2 ) { cout << "Removing node with:" << endl; cout << "node1: " << d1[i] << " node2: " << d1[i+1] << endl; if( c.remove( d1[i], d1[i+1] ) == false ) cout << "Node not found" << endl; cout << "List: " << endl; cout << c << endl << endl; } cout << "nnMaking List #2:" << endl; int d2[M*3] = {2,2,4, 1,1,3, 2,2,3, 1,1,2, 1,5,6, 1,2,5, 3,1,3}; for( i=0,j=0; i<M; i++,j=j+3 ) { cout << i+1 << endl; cout << "Inserting new node into list with:" << endl; cout << "node1: " << d2[j+1] << " node2: " << d2[j+2] << " type: " << d2[j] << " value: " << v[i] << endl; c2.insert( d2[j], v[i], d2[j+1], d2[j+2] ); cout << "List: " << endl; cout << c2 << endl << endl; } cout << "nnMaking List #3:" << endl; int d3[M*3] = {2,2,4, 3,3,3, 2,2,3, 1,1,2, 1,5,6, 1,2,5, 3,1,3}; for( i=0,j=0; i<M; i++,j=j+3 ) { cout << i+1 << endl; cout << "Inserting new node into list with:" << endl; cout << "node1: " << d3[j+1] << " node2: " << d3[j+2] << " type: " << d3[j] << " value: " << v[i] << endl; c3.insert( d3[j], v[i], d3[j+1], d3[j+2] ); cout << "List: " << endl; cout << c3 << endl << endl; } return 0; } |