#include "stdstuff.h" #include "IntSequence.h" int getSequenceNumber (char prompt[]) { int number; for (;;) { cout << prompt << " (0, 1, or 2): "; cin >> number; if (!cin.fail() && (number >= 0) && (number <= 2)) return number; cout << "Invalid data ignored.\n"; cin.clear(); cin.ignore (INT_MAX, '\n'); } } int getSequenceNumberAndValue (int &value) { int number; for (;;) { cout << "Enter sequence number (0, 1, or 2) and value: "; cin >> number >> value; if (!cin.fail() && (number >= 0) && (number <= 2)) return number; cout << "Invalid data ignored.\n"; cin.clear(); cin.ignore (INT_MAX, '\n'); } } void realMain () { IntSequence sequences[3]; int i, j, k, option, value; bool valueObtained; cout << "This test program uses three sequences. " << "They are numbered 0, 1, and 2.\n"; for (;;) { // display current sequence contents cout << endl; for (i = 0; i < 3; i++) { if (sequences[i].size() == 0) { cout << "Sequence " << i << " is empty.\n"; } else { cout << "Sequence " << i << ":"; for (valueObtained = sequences[i].startWalk(value); valueObtained; valueObtained = sequences[i].continueWalk(value)) { cout << " " << value; } cout << endl; } } // get user option cout << endl << "1 - add value to a sequence 2 - remove value from a sequence\n" << "3 - see if value is in a sequence 4 - remove all values\n" << "5 - compare two sequences 6 - compute sequence intersection\n" << "7 - compute sequence union 8 - test getValue\n" << "9 - quit Enter Option: "; cin >> option; switch (option) { case 1: i = getSequenceNumberAndValue(value); try { sequences[i].add(value); } catch (overflow_error &e) { cout << "Operation failed (" << e.what() << ").\n"; } break; case 2: i = getSequenceNumberAndValue(value); if (sequences[i].remove(value)) { cout << "Value successfully removed from sequence.\n"; } else { cout << "Operation failed (value was not in sequence).\n"; } break; case 3: i = getSequenceNumberAndValue(value); if (sequences[i].valueExists(value)) { cout << "That value is in the sequence.\n"; } else { cout << "That value is not in the sequence.\n"; } break; case 4: i = getSequenceNumber("Enter sequence number"); sequences[i].removeAll(); break; case 5: i = getSequenceNumber("Enter first sequence number"); j = getSequenceNumber("Enter second sequence number"); if (sequences[i] == sequences[j]) { cout << "Those two sequences are equal.\n"; } else { cout << "Those two sequences are not equal.\n"; } break; case 6: i = getSequenceNumber("Enter first sequence number"); j = getSequenceNumber("Enter second sequence number"); k = getSequenceNumber("Enter destination sequence number"); sequences[k] = sequences[i].intersect(sequences[j]); break; case 7: i = getSequenceNumber("Enter first sequence number"); j = getSequenceNumber("Enter second sequence number"); k = getSequenceNumber("Enter destination sequence number"); try { sequences[k] = sequences[i].unionWith(sequences[j]); } catch (overflow_error &e) { cout << "Operation failed (" << e.what() << ").\n"; } break; case 8: i = getSequenceNumber("Enter sequence number"); cout << "Contents:"; for (j = 0; j < sequences[i].size(); j++) { cout << " " << sequences[i].getValue(j); } cout << "\n"; try { value = sequences[i].getValue(-1); cout << "Exception not throw when index is -1\n"; } catch (out_of_range &e) { cout << "Exception properly throw when index is -1\n"; } try { value = sequences[i].getValue(sequences[i].size()); cout << "Exception not throw when index is too large\n"; } catch (out_of_range &e) { cout << "Exception properly throw when index is too large\n"; } break; case 9: return; default: cout << "\nInvalid option ignored.\n"; break; } } } int main () { try { realMain (); } catch (exception &e) { // catches all uncaught exceptions cout << "\nException <" << e.what() << "> occurred.\n"; } pause (); return 0; }