rendered paste body/* - BEGIN OF FILE - */
/* - include statements - */
#include <iostream>
#include <cstdlib>
#include <fstream>
#include <cctype>
#include <string>
#include <vector>
using namespace std;
/* - - - - - - - - - - - */
/* - global variables - */
const int DICT_SIZE = 250000;
const int ALPHABET_SIZE = 26;
const int FAILED = -1;
const int ZERO = 0;
const int ONE = 1;
/* - - - - - - - - - - - */
/* - function prototypes - */
int readDict(string readin[]);
void parseDict(string a[], int n[], int m);
int menu();
int checkString(string m);
int checkInput(string m);
string toLowerCase(string n);
int binarySearch(string list[], int size, string target);
void searchFull(string list[], string target, int size);
bool match(string target, string w);
/* - - - - - - - - - - - - */
int main () {
/* - variable initialisation - */
string target;
string input;
string dictionary[DICT_SIZE];
int FirstLetterChange[ALPHABET_SIZE] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 };
int size;
int find;
/* - - - - - - - - - - - - - */
size = readDict(dictionary);
if (size == FAILED) {
cout << "Read Failed: Check location for dict.txt" << endl;
system("pause");
return EXIT_FAILURE;
}
/* - special function made to determine where the first word from each
letter of the alphabet starts from in the dictionary array,
ideally would read the dictionary into a multi-dimensional array or vector - */
parseDict(dictionary, FirstLetterChange, size);
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
/* - enable looped menu - */
while(true) {
switch(menu()) {
case 1:
cout << "Enter word" << endl;
cin >> input;
if (checkString(input) == FAILED) {
cout << "Inappropriate Entry" << endl;
}
else {
target = toLowerCase(input);
find = binarySearch(dictionary,size,target);
if (find == FAILED) {
cout << target << " is not in dictionary" << endl;
}
else {
cout << target << " is in dictionary" << endl;
}
}
break;
case 2:
cout << "Enter word pattern with ? for missing letters " << endl;
cin >> input;
if (checkString(input) == FAILED) {
cout << "Inappropriate Entry" << endl;
}
else {
target = toLowerCase(input);
searchFull(dictionary, target, size);
}
break;
case 3:
system("pause");
return EXIT_SUCCESS;
default:
cout << "Invalid Choice" << endl;
}
}
/* - - - - - - - - - - */
}
/* - functions - */
int readDict(string readin[]) {
//precondition - none
//postcondition - reads dict.txt into an array
int loop = ZERO;
string line;
ifstream myfile ("dict.txt");
if (myfile.is_open())
{
while (! myfile.eof() )
{
getline (myfile,line);
readin[loop] = line;
loop++;
}
myfile.close();
return loop;
}
else {
return FAILED;
}
}
void parseDict(string a[], int n[], int m) {
//precondition - dictionary array
//postcondition - ascertains where each letter starts in dictionary array
char temp = 'a';
int num1 = 1;
string str;
int i = 0;
while (i < m) {
str = a[i];
if (str.at(0) != temp) {
n[num1] = i;
num1++;
temp++;
}
i++;
}
}
int menu() {
//precondition - none
//postcondition - users entry point
// using a cstring so can to atoi to find menu option
// as well as using isdigit function
string choice;
cout << "\tCrossword Helper " << endl << endl;
cout << " 1 : Check if word is in dictionary " << endl;
cout << " 2 : Find words in dictionary which match pattern " << endl;
cout << " 3 : Quit " << endl;
cin >> choice;
cin.clear();
if (checkInput(choice) != ZERO) {
return FAILED;
}
return atoi(choice.c_str());
}
int checkString(string m) {
//precondition - none
//postcondition - checks to see whether string m contains any incorrect chars
for (int i = ZERO; i < m.length(); i++) {
if (isalpha(m.at(i))) {
}
else if (m.at(i) != '?') {
return FAILED;
}
}
return ZERO;
}
int checkInput(string m) {
//precondition - none
//postcondition - checks to see whether string m contains any incorrect chars
for (int i = ZERO; i < m.length(); i++) {
if (isdigit(m.at(i))) {
}
else {
return FAILED;
}
}
return ZERO;
}
string toLowerCase(string n) {
//precondition - none
//postcondition - switches string n into lower case
for (int i = ZERO; i < n.length(); i++) {
if (isupper(n.at(i))) {
n.at(i) = tolower(n.at(i));
}
}
return n;
}
// the following segment of code has been modified from
// http://www.paked.net/subject_pages/computer_science/prog1.htm
int binarySearch(string list[], int size, string target) {
//precondition -
//postcondition -
int left, right, midpt;
left = ZERO;
right = size - 1;
int key;
while (left <= right) {
midpt = (int) ((left + right) / 2);
key = list[midpt].compare(target);
if (key == ZERO) {
return midpt;
}
else if (key < ZERO) {
left = midpt + ONE;
}
else {
right = midpt - ONE;
}
}
return FAILED;
}
// end of code segment modified from
// http://www.paked.net/subject_pages/computer_science/prog1.htm
// the following segment of code has been modified from
// http://www.fredosaurus.com/notes-cpp/examples/crosswordhelper/crosswordhelper.html
void searchFull(string list[], string target, int size) {
//precondition - none
//postcondition - sends each term to the match function and if it matches prints it
for (int i = ZERO; i < size; i++) {
if (match(target, list[i])) {
cout << list[i] << endl;
}
}
}
bool match(string target, string findMatch) {
//precondition - none
//postcondition - looks for matches between strings with ? as a wildcard
if (findMatch.size() != target.size()) {
return false;
}
for (int i = ZERO; i < target.size(); i++) {
if (target[i] != '?') {
if (target[i] != findMatch[i]) {
return false;
}
}
}
return true;
}
// end of code segment modified from
// http://www.fredosaurus.com/notes-cpp/examples/crosswordhelper/crosswordhelper.html
/* - - - - - - - */
/* - END OF FILE - */