Как избежать длинных операторов переключения? C ++

Я работаю над «словарем» для своего класса. У меня есть массив int с именем NumOfWordsInFile [] , где NumOfWordsInFile [0] соответствует количеству слов в A. txt и NumOfWordsInFile [25] соответствует Z.txt

На данный момент у меня есть огромный переключатель для 26 различных состояний букв. У меня есть функция под названием AddWord (строковое слово) . AddWord получает первую букву переданного слова и вставляет ее в соответствующий файл .txt. Теперь вот в чем проблема. Каждый раз, когда слово добавляется в A.txt, я должен увеличивать NumOfWordsInFile [0] на 1. Единственный способ, который я могу придумать, - это использовать эти огромные переключатели. У меня также есть функция deleteWord, которая, наоборот, уменьшает NumOfWordsInFile [] , если слово удалено. Теперь я не хочу иметь два переключателя корпуса 26, но проблема в том, что я не знаю, как еще это сделать. Теперь я мог бы проделать то же самое с функцией удаления, но я действительно не хочу, чтобы для прохождения еще сотни строк кода. Есть ли лучший способ сделать это?

Пример переключателя в функции AddWord :

case 'w':
    if (numOfWordsInFile[22] < maxWordsPerFile) {
        fout.open(fileName.data(), ios::app);
        fout << word << " " << endl;
        numOfWordsInFile[22]++;
        if (totalWordsInDict < maxWordsInDict) {
            totalWordsInDict++;
        }
        return(Dictionary::success);
    } else {
        return(Dictionary::failure);
    }

case 'x':
    if (numOfWordsInFile[23] < maxWordsPerFile) {
        fout.open(fileName.data(),ios::app);
        fout << word << " " << endl;
        numOfWordsInFile[23]++;
        if (totalWordsInDict < maxWordsInDict) {
            totalWordsInDict++;
        }
        return(Dictionary::success);
    } else {
        return(Dictionary::failure);
    }

Функция удаления.

bool Dictionary::DeleteAWord(string word)
{
    ofstream fout;
    ifstream fin;
    string x;
    string fileName="#.txt";
    int count=0;
    vector <string> words;
    bool deleted=false;

    fileName[0]=toupper(word[0]);
    fin.open(fileName.data()); //makes the file depending on the first letter of the argument "word"

    while (fin >> x)
    {
        words.push_back(x);
        count++;//number of elements in vector
    }
    if (SearchForWord(x))
    {
        for ( ;count > 0; count--)
        {
            if (words[count-1] == word)
            {
                // cout << "Found word " << word << " during search, now deleting" << endl;
                words.erase(words.begin()+(count-1));
                deleted = true;

                /*
                    This clearly doesn't work and is what I need help with, I know why it
                    doesn't work but I don't know how to make it better than having another
                    huge switch.
                */
                numOfWordsInFile[toupper(word[0])]--;
                /*

                */

                totalWordsInDict--;
                fin.close();
            }
        }

        if (deleted)
        {
            fout.open(fileName.data());
            for (int i = 0; i < words.size(); i++)
                fout << words[i] << endl;
            return(Dictionary::success);
        }
        return(Dictionary::failure);
    }
    return(Dictionary::failure);
}
8
задан Mateen Ulhaq 4 April 2011 в 00:30
поделиться