// In C++
// Complete the Do's (bolded)
Page
of 3
ZOOM
#include using namespace std; int Zero = 0; void eat_white (istream & in) /* Pre: "in" is a valid input file stream. Post: Any white space skipped over to EOF or the next non-white space character.*/ { while ((in.peek()!=EOF) && isspace(in.peek())) in.ignore(); }; /*inline */int & element (int* tri2d, int NC, int i, int j) { /* DO 1: Study the following code to see how the "valid/stored elements are counted. This version (#1) has TWO nested loops: */ int row, col; int index = -1; if (ij) { col = i; row = j; } else // if (i==j) return Zero; for (int ii = 0; ii < row; ii++) for (int jj = 0; jj < NC; jj++) if (jj > ii) index++; for (int jj = 0; jj < col; jj++) index++; return tri2d[index]; /* DO 2: Study the following code to see how it simplifies the above counting using this version (#2) has a single loop: Next, comment out the above version (#1) and uncomment the following version #2 and run:*/ /* int row, col, index = -1; if (i < j) { row = i; col = j; } else if (i > j) { col = i; row = j; } else return Zero; for (int k = 0; k < row; k++) index += (NC - 1 - k); index += (col - row); return tri2d[index]; */ /* DO 3: Study the following code to see how it further simplifies the above logic using a "formula version" (#3), which can be written EITHER as a conditional expression (#3a), in which case "element" can be an "inline" function OR as a conditional statement (#3b). Next, comment out the above versions (#1 and #2) and then uncomment each of the versions 3a and 3b SEPARATELY and run:*/ // Version 3a: /* return ((ij)? tri2d[NC*j-j*(j+1)/2 +
i-j-1] : Zero)); */ // Version 3b: /* if (ij) return tri2d[NC*j-j*(j+1)/2 + i-j-1]; else // if (i==j) return Zero; */ }; void printtri (int * dist2d, int NC) { for (int i=0; i> NC; dist2d = new int[NC*(NC-1)/2]; cout << endl << "Now enter distances from each city to ONLY the remaining cities row by row in increasing order of cities " << endl; for (int i=0; i> element (dist2d, NC, i, j); char command; cout << endl << "If you want to get or set any particular distance, input" << endl << "g (for get) or s (for set) followed by two city numbers" << endl << "(with zero-based indexing) and an integer value (for s)," << endl << "p to print the whole distance array, or d (for done) to end:" << endl; do { int i, j, val; eat_white(cin); cin >> command; if ((command == 's')||(command == 'S')) { cin >> i >> j >> val; if (i!=j) { element (dist2d, NC, i, j) = val; cout << "Done setting distance from city " << i
<< " to city " << j << " to " << val << endl << "Next command: "; } else cout << "Distance from a city to itself is zero " << "and cannot be changed; sorry!" << endl << "Next command: "; } else if ((command == 'g') || (command == 'G')) { cin >> i >> j; cout << "The distance from city " << i << " to city " << j << " is " << element (dist2d, NC, i, j) << endl << "Next command: "; } else if ((command == 'p') || (command == 'P')) { cout << "Reporting distance chart:" << endl; printtri (dist2d, NC); cout << "Next command: "; } else if ((command != 'd') && (command != 'D')) cout << "Please enter a valid command (s/S, g/G, p/P, or d/D): "<< endl; } while ((command != 'd') && (command != 'D')); return(0); };