C++ Notes: Examples: Crossword Helper

  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 
// -- crosswordhelper.cpp - Find words that match a pattern.
//    Reads dictionary from local file "words.dict", then
//    reads patterns from user and lists all words that match
//    the pattern.  Patterns are simply either a lowercase
//    letter which must match or a dot which will match 
//    anything.  Eg, "..able" with match "doable", "liable", ...
//    Making this more efficient is an interesting problem.
//    Fred Swartz - 2002-09-24

#include <iostream>
#include <fstream>
#include <string>
#include <vector>
using namespace std;

bool match(string pat, string w); //--- prototype

//============================================================= main
int main() {
    string word;           // holds each input word as we read it
    vector<string> dictionary; 
    string pattern;        // pattern as entered by user

    //--- read dictionary
    ifstream dictInput;
    dictInput.open("word.list");
    if (!dictInput) {
        cerr << "Unable to open word.list file" << endl;
        exit(1);
    }

    int n = 0;
    while (dictInput >> word) {
        dictionary.push_back(word);
        if (n++%10000 == 0) {
            cout << '.';
        }
    }
    cout << endl << "Dictionary size = " << n << endl;
    cout << "Enter your patterns, one per line." << endl;
    //--- read patterns and try to match them in dictionary.
    while (cin >> pattern) {
        int numberOfMatches = 0;
        for (int i=1; i<n; i++) {
            if (match(pattern, dictionary[i])) {
                cout << "Found " << dictionary[i] << endl;
                numberOfMatches++;
            }
        }
        cout << "Number of matches: " << numberOfMatches << endl;
        cout << "Enter another pattern" << endl;
    }
    return 0;
}//end main

//========================================================= match
bool match(string pat, string w) {
    int len = pat.size();
    if (w.size() != len)  return false;

    for (int i=0; i<len; i++) { //--- look for mismatches
        if (pat[i] != '.') {
            if (pat[i] != w[i]) {
                return false;
            }
        }
    }
    return true;   // no mismatches in this word.
}//end match