Open alexey-malov opened 8 years ago
for (size_t i = 0; i < inputString.length(); i++)
{
if (isalnum(inputString[i], loc))
{
resultWord += inputString.substr(i, 1);
}
}
Извлечение подстроки из одного символа - приводит к чрезмерным вычислениям Лучше перебирать через range-based for (нет необходимости в использовании индексов) В результирующей строке рекомендуется зарезервировать место, достаточное для хранения результьата без реаллокаций (метод reserve) Еще можно попробовать через адаптор boost::adaptor::filtered
пойдет
if (!IsDigit(word))
{
word = GetWordFromString(word);
if (!word.empty())
{
++words[word];
}
}
В соответствие с требованием задания отбрасывать последовательности символов, состоящих из цифр, не нужно. как впрочем и фильтрация черз isalphanum
Словом считается последовательность из одного и более символов, разделенная последовательностью из одного и более символов разделителей (пробелы, табуляции, символы конца строки).
не актуально
Задание:
Разработайте программу, выполняющую подсчет частоты встречаемости слов, поступающих _со стандартного потока ввода_ и выводящую слова их частоты их встречаемости в стандартный поток вывода.
Программа же читает их из файла, причем файл считывает в память целиком. Нужно считывать данные из стандартного потока или же из istream (позволит протестировать использующую его функцию путем подсовывания ей istringstream или ifstream или произвольного другого наследника)
BOOST_AUTO_TEST_CASE(testStringOperations)
{
BOOST_CHECK(CountWords("a a bbbb ; ; bbbb") == mapWords({ { "a", 2 }, { "bbbb", 2 } }));
BOOST_CHECK(CountWords("привет a a bbbb ; ; bbbb") == mapWords({ { "привет", 1 }, { "a", 2 }, { "bbbb", 2 } }));
BOOST_CHECK(CountWords("привет;;; a a bbbb ; ; bbbb") == mapWords({ { "привет", 1 }, { "a", 2 }, { "bbbb", 2 } }));
BOOST_CHECK(CountWords("asd zxc s , , s asd") == mapWords({ { "asd", 2 }, { "zxc", 1 }, { "s", 2 } }));
BOOST_CHECK(CountWords(" , , , ,asd zxc s , , s asd") == mapWords({ { "asd", 2 }, { "zxc", 1 }, { "s", 2 } }));
BOOST_CHECK(CountWords("R2D2") == mapWords({ { "R2D2", 1 } }));
BOOST_CHECK(CountWords("7777 это цифра") == mapWords({ { "это", 1 }, { "цифра", 1 } }));
}
Тесты привести в читаемый вид. Не проверяется ряд ситуаций: пустой ввод ввод, не содержащий слов *для каждого сценария использования должно быть ясно, что именно проверяется (либо имя теста, либо (что менее хорошо) комментарий, либо должно быть понятно из самой проверки (только для простых тестов обычно применимо)
Проверка от 01 декабря Не выполнено требование задания:
Словом считается последовательность из одного и более символов, разделенная последовательностью из одного и более символов разделителей (пробелы, табуляции, символы конца строки).
тесты должны запускаться и в Release-конфигурации -- выполнено
В тесты добавить проверку следующий ситуаций:
не хватает тестов пустой строки
#include "vector"
имена стандартных файлов должны быть указаны в угловых кавычках
WordCount.cpp:
#include "WordCount.h"
#include <sstream>
#include <algorithm>
#include <locale>
#include <fstream>
#include <boost/algorithm/string.hpp>
много лишних #include-ов
не устранена постоянная пересборка проектов
BOOST_AUTO_TEST_CASE(test_first_punctuation_after_the_word)
{
BOOST_CHECK(CountWords("......,,,,,., много знаков") == mapWords({ { "много", 1 }, { "знаков", 1 } }));
}
проверяем символы пунктуации перед словами - test punctuation before words
0,9
почему ссылка обычная?
не актуально