Как рассчитать гласные рядом друг с другом в C ++? - PullRequest
0 голосов
/ 19 октября 2019

У меня проблема с одним из моих домашних заданий. Моя задача заключается в следующем:

  • написать программу на C ++
  • input: строка
  • output: число гласных рядом друг с другом
  • пример: ввод -> компьютеры;output -> 1 2 1 2 (потому что c, mp, t, rs)

Я уже пробовал пару вещей, но это не работает. Это одна из моих попыток:

cout << "Type your word: ";
cin >> YourWord;
cout << "Your word is: " << YourWord << endl;

//maganhangzók
char a = 'a';
char e = 'e';
char i = 'i';
char o = 'o';
char u = 'u';

//massalhangzok
char b = 'b';
char c = 'c';
char d = 'd';
char f = 'f';
char g = 'g';
char h = 'h';
char j = 'j';
char k = 'k';
char l = 'l';
char m = 'm';
char n = 'n';
char p = 'p';
char q = 'q';
char r = 'r';
char s = 's';
char t = 't';
char v = 'v';
char w = 'w';
char x = 'x';
char y = 'y';
char z = 'z';

int counter[YourWord.length()];
int nothing = 0;

for(int i=1; i<YourWord.length(); i++) {
    if (((YourWord[i] = a) || (YourWord[i] = e) || (YourWord[i] =  i) || (YourWord[i] = o) || (YourWord[i] = u)) && ((YourWord[i-1] = a) || (YourWord[i-1] = e) || (YourWord[i-1] =  i) || (YourWord[i-1] = o) || (YourWord[i-1] = u))) {
        nothing++;
    } else if (((YourWord[i] = a) || (YourWord[i] = e) || (YourWord[i] =  i) || (YourWord[i] = o) || (YourWord[i] = u)) && ((YourWord[i-1] = b) || (YourWord[i-1] = c) || (YourWord[i-1] = d) || (YourWord[i-1] = f) || (YourWord[i-1] = g) || (YourWord[i-1] = j) || (YourWord[i-1] = k) || (YourWord[i-1] = l) || (YourWord[i-1] = m) || (YourWord[i-1] = n) || (YourWord[i-1] = p) || (YourWord[i-1] =  q) || (YourWord[i-1] = r) || (YourWord[i-1] = s) || (YourWord[i-1] = t) || (YourWord[i-1] =  v) || (YourWord[i-1] =  w) || (YourWord[i-1] = x) || (YourWord[i-1] = y) || (YourWord[i-1] = z))) {
        counter[i] = counter[i];
    } else if (((YourWord[i] = b) || (YourWord[i] = c) || (YourWord[i] =  d) || (YourWord[i] = f) || (YourWord[i] = g) || (YourWord[i] = j) || (YourWord[i] =  k) || (YourWord[i] = l) || (YourWord[i] = m) || (YourWord[i] = n) || (YourWord[i] = p) || (YourWord[i] = q) || (YourWord[i] = r) || (YourWord[i] = s) || (YourWord[i] = t) || (YourWord[i] = v) || (YourWord[i] =  w) || (YourWord[i] = x) || (YourWord[i] = y) || (YourWord[i] = z)) && ((YourWord[i-1] = b) || (YourWord[i-1] = c) || (YourWord[i-1] =  d) || (YourWord[i-1] = f) || (YourWord[i-1] = g) || (YourWord[i-1] = j) || (YourWord[i-1] = k) || (YourWord[i-1] = l) || (YourWord[i-1] = m) || (YourWord[i-1] = n) || (YourWord[i-1] = p) || (YourWord[i-1] = q) || (YourWord[i-1] = r) || (YourWord[i-1] = s) || (YourWord[i-1] = t) || (YourWord[i-1] =  v) || (YourWord[i-1] =  w) || (YourWord[i-1] = x) || (YourWord[i-1] = y) || (YourWord[i-1] = z))) {
        counter[i]++;
    } else {
            counter[i+1]++;
    }
}

К сожалению, это излишне сложно и абсолютно непригодно. Может ли кто-нибудь помочь мне с подсказкой, с чего мне начать?

1 Ответ

0 голосов
/ 19 октября 2019

Проблема с вашим кодом заключается в том, что он пытается сделать две вещи одновременно:

  1. решает, находится ли символ в выбранном наборе или нет
  2. на основе этих решений вычислите запрошенные числа.

В целях удобства чтения часть 2 должна использовать часть 1, а не включать ее.

Это тем более, что вы, похоже, используете очень длинные строки кода. Таким образом, читатель должен использовать горизонтальный ползунок, и в этом случае невозможно одновременно увидеть конец длинной строки кода и более короткие строки кода, которые следуют. Это затрудняет поиск ошибок.

Поскольку это C ++, следовательно, объектно-ориентированное программирование, мы можем делегировать решение о том, является ли символ частью выбранных, какому-то специальному объекту, например, CharTester класс. Объект CharTester получает во время создания строку, содержащую все «выбранные» символы. Таким образом, алгоритм, который вычисляет запрошенные числа, может быть намного короче.

Объект CharTester может делегировать всю тяжелую работу в строку Метод поиска .

Источниккод для создания этого вспомогательного объекта будет выглядеть, например, так:

    static const char  EnglishConsonantList[] =
        "bcdfghjklmnpqrstvwxzBCDFGHJKLMNPQRSTVWXZ";
    CharTester  cht(EnglishConsonantList);

Хорошая вещь с вышеуказанным стилем кодирования состоит в том, что, если какой-то официальный Грамматический комитет решит, что с этого момента Y будет согласной вместогласных, необходимые изменения в вашем исходном коде минимальны. И ваш учитель, возможно, не выше сказанного, например, « Теперь, когда вы сделали это для согласных, пожалуйста, сделайте это для гласных. » - это, чтобы заставить вас понять, насколько гибок ваш исходный код именно,

Таким образом, мы приводим следующий код, где наиболее интересной является функция goodCharCounts(), которая возвращает объект std::vector, содержащий запрошенные числа.

#include  <vector>
#include  <string>
#include  <iostream>

using  std::string;
using  std::cout;


class CharTester {
public:
    CharTester(const string& list) : goodCharList(list)
    {};
    bool isGoodChar(char ch) const;

private:
    string  goodCharList;    // list of "chosen" characters
};

bool CharTester::isGoodChar(char ch) const
{
    // hard work there:
    bool isGood = (goodCharList.find(ch) != string::npos);

    return isGood;
}


// THE ALGORITHM:

std::vector<int>  goodCharCounts(const CharTester& cht, const std::string& str)
{
    std::vector<int>  posVec;

    int  counter = 0;
    // loop on all characters of the input string
    for (char ch : str) {
        bool isGood = cht.isGoodChar(ch);

        if (isGood) {
            counter++;
        }
        else if (counter > 0) {
            // end of current "chosen" group, so must register it
            posVec.push_back(counter);
            counter = 0;
        }
    }

    if (counter > 0) {
        // register last "chosen" group
        posVec.push_back(counter);
        counter = 0;
    }

    return  posVec;
}

Мы можемпротестируйте алгоритм, добавив следующую основную программу:

// test one string and print the results:
void doUnitTest(const CharTester& cht, const string& str)
{
    std::vector<int>  counts = goodCharCounts(cht, str);

    cout << str << " --> ";
    // loop on all numbers:
    for (int n : counts) {
        cout << n << ' ';
    }
    cout << std::endl;
}


// possible lists of "chosen" characters :

//-- const wchar_t FrenchVowelList[]      = L"AEIOUYÀÂÉÊÈÏÔÛÙaeiouyàâéêèïôûù";
//-- const wchar_t RussianVowelList[]     = L"АЕИОЭЙЫЮЯЁУаеиоэйыюяёу";

static const char  EnglishVowelList[] =  "aeiouyAEIOUY";
static const char  EnglishConsonantList[] =
    "bcdfghjklmnpqrstvwxzBCDFGHJKLMNPQRSTVWXZ";


int main()
{
    CharTester  cht(EnglishConsonantList);  

    doUnitTest(cht, "computers");
    doUnitTest(cht, "Some computers are cheap. Aeiuo-XrZT.");

    return EXIT_SUCCESS;
}

Выполнение:

computers --> 1 2 1 2 
Some computers are cheap. Aeiuo-XrZT. --> 1 1 1 2 1 2 1 2 1 4 

Примечание:

Выше я использовал тип char исвязанный классический тип C ++ string, потому что именно так вы и поступаете в своем коде. Однако для производственного кода вам, вероятно, придется использовать более общие типы wide wchar_t и wstring, чтобы разрешить использование символов, не относящихся к ASCII, таких как á, à, ê, ẞ. и т. д. (символы Юникода).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...