Как мыслить как программист.
Первое, что нам нужно, это определения начала или слова и конца слова.Вы можете подумать, что начало слова - это не пробел, которому предшествует пробел, а конец слова - это не пробел, за которым следует пробел.Но эти определения неверны, потому что они игнорируют возможность слова в начале или конце строки.Правильное определение начала слова - это не пробел в начале строки или не пробел, которому предшествует пробел.Точно так же конец слова - это не пробел в конце строки или не пробел, за которым следует пробел.
Теперь у нас есть определения, которые мы фиксируем их в двух функциях.Очень важно разбить сложные проблемы на более мелкие части, и способ сделать это - написать функции (или классы).
bool beginning_of_word(string str, int index)
{
return str[index] != ' ' && (index == 0 || str[index - 1] == ' ');
}
bool end_of_word(string str, int index)
{
return str[index] != ' ' && (index == str.size() - 1 || str[index + 1] == ' ');
}
Теперь мы приближаемся, но нам все еще нужна идея поискаследующее начало слова или следующий конец слова, так что мы можем циклически просматривать предложение, находя каждое слово по одному.Вот две функции для поиска следующего начала и следующего конца слова.Они начинаются с данного индекса и находят следующий индекс, который является началом или концом слова.Если такой индекс не найден, они возвращают -1.
int next_beginning_of_word(string str, int index)
{
++index;
while (index < str.size())
{
if (beginning_of_word(str, index))
return index; // index is a start of word so return it
++index;
}
return -1; // no next word found
}
int next_end_of_word(string str, int index)
{
++index;
while (index < str.size())
{
if (end_of_word(str, index))
return index; // index is an end of word so return it
++index;
}
return -1; // no next word found
}
Теперь у нас есть способ перебрать слова в предложении, и мы готовы написать основной цикл.Мы используем substr
, чтобы вычеркнуть слова из предложения, substr
принимает два параметра: индекс начала слова и длину слова.Мы можем получить длину слова, вычтя начало из конца и добавив единицу.
int populateMyArray(string* array, string sentence)
{
// find the first word
int start = next_beginning_of_word(sentence, -1);
int end = next_end_of_word(sentence, -1);
int count = 0;
while (start >= 0) // did we find it?
{
// add to array
array[count] = sentence.substr(start, end - start + 1);
++count;
// find the next word
start = next_beginning_of_word(sentence, start);
end = next_end_of_word(sentence, end);
}
return count;
}
Теперь для дополнительного кредита мы можем переписать countWords
, используя next_beginning_of_word
int countWords(string sentence)
{
int start = next_beginning_of_word(sentence, -1);
int count = 0;
while (start >= 0)
{
++count;
start = next_beginning_of_word(sentence, start);
}
return count;
}
Обратите внимание на сходство функций countWords
и populateMyArray
, циклы очень похожи.Это должно придать вам уверенности.
Именно так работают программисты, когда у вас есть проблема, которая слишком сложна для вашего решения, разбивайте ее на более мелкие части.