// default size of queue array const int DefaultSize = 100; // a queue of ints class queue { protected: int *q; // array of queue elements int size; // number of elements queue can hold int front; // current position of front element int back; // current position of back element public: // dynamically allocate the array // and initialize front, back, size Queue(int sz = DefaultSize); ~Queue(); // deallocate the array bool insert(int i); // insert item i at back bool remove(int &i); // remove front item into i bool isfull(); // returns true iff the queue is full bool isempty(); // returns true iff the queue is empty };
Sample solution Queue::Queue(int sz) { q = new int[sz]; if (q == NULL) { size = 0; } else { size = sz; } front = -1; back = -1; } bool Queue::insert(int i) { // make sure it is ok to insert if ((q == NULL) || isfull()) { return false; } // handle inserts into an empty queue else if (back == -1) { front = 0; back = 0; } // handle inserts into a non-empty queue else { back++; if (back == size) { back = 0; } q[back] = i; } return true; } |
Question 2: file I/O and command line arguments
Write a complete program that expects to receive two command line
arguments (aside from the name of the executable of course).
If the correct number of arguments are supplied, it takes the first
as a filename and the second as a block of text to search for,
opens the file, and counts the
number of times the text appears in the file. For example, in the
line below the text "foo" appears three times:
blah blah foo blahfoo blah blahfooblah
Sample solution #include <iostream> #include <fstream> #include <string> using namespace std; // count the number of times the pattern appears in // the text contents int countMatches(string pattern, string contents); int main(int argc, char *argv[]) { // check for the right number of command line arguments if (argc != 3) { cout << "Expected use is\n"; cout << argv[0] << " filename pattern" << endl; return 0; } // attempt to open the input file ifstream fpin; fpin.open(argv[1]); if (fpin.fail()) { cout << "Unable to open file " << argv[1] << endl; return 0; } // read the input file into a string string contents = ""; while (!fpin.eof()) { char c; fpin.get(c); if (!fpin.eof()) { contents += c; } } // count and display the number of pattern matches in the contents int count = countMatches(argv[2], contents); cout << "Found pattern " << argv[2] << " " << count; cout << " times in file " << argv[1] << endl; return 0; } // count the number of times the pattern appears in // the text contents int countMatches(string pattern, string contents) { int count = 0; int pattlen = pattern.length(); int textlen = contents.length(); // for each possible starting position in the text, // check if the pattern matches starting from that spot for (int spos = 0; spos < (textlen - pattlen); spos++) { bool currMatch = true; for (int tpos = 0; tpos < pattlen; tpos++) { if (contents[spos+tpos] != pattern[tpos]) { currMatch = false; } } if (currMatch) { count++; } } return count; } |
Question 3: exceptions
In your own words, describe how exceptions (try, throw, and catch)
work in C++, and provide a short code example.