saintiago / oop

0 stars 0 forks source link

Замечания по программе Vector #2

Open alexey-malov opened 8 years ago

alexey-malov commented 8 years ago
double GetPositiveAverage(std::vector<double> numbers)
{
    double positiveTotal = 0;
    auto positiveCount = std::count_if(numbers.begin(), numbers.end(), [](double number) { return number > 0; });
    std::for_each(numbers.begin(), numbers.end(), [&positiveTotal](double number)
    {
        if (number > 0)
        {
            positiveTotal += number;
        }
    });
    return (positiveTotal / positiveCount);
}

при отсутствии положительных чисел программа выдает неправильный результат for_each использовать нет нужды, когда есть range-based-for как вариант, можно использовать алгоритм accumulate для подсчета суммы (он же может и подсчитывать количество положительных элементов) аргумент следует принимать по константной ссылке, т.к. ты не меняешь его

alexey-malov commented 8 years ago
std::string GetVectorItems(const std::vector<double> & numbers)
{
    std::ostringstream oss;
    std::copy(numbers.begin(), numbers.end(), std::ostream_iterator<double>(oss, " "));
    return oss.str();
}

Поведение не соответствует имени. Лучше назвать как-то вроде VectorToString

alexey-malov commented 8 years ago
    std::transform(numbers.begin(), numbers.end(), numbers.begin(), 
        [positiveAverage](double & number) { return number += positiveAverage; });

Неправильно используется алгоритм transform:

Neither op nor binary_op should directly modify the elements passed as its arguments: These are indirectly modified by the algorithm (using the return value) if the same range is specified for result.

number должен приниматься по значению или константной ссылке. итоговое значение должно возвращаться.

alexey-malov commented 8 years ago
std::vector<double> ReadVector(std::string vectorStr)
{
    std::stringstream ss(vectorStr);
    double number;
        std::vector<double> result;
    while (!ss.eof())
    {
        ss >> number;
        result.push_back(number);
    }

    return result;
}

если ввести что-нибудь, что не является числом, то твой цикл зависнет. читать здесь: http://www.viva64.com/en/d/0289/print/

alexey-malov commented 8 years ago

программа должна считывать числа до конца (EOF), а не только первую строку

alexey-malov commented 8 years ago

тесты не компилируются

1>f:\teaching\ips\2015\oop\students\rysaev\oop_labs\lab2\dictionary\dictionary.h(17): error C2039: 'map': is not a member of 'std'
1>  c:\vs2015\vc\include\vector(17): note: see declaration of 'std'
1>f:\teaching\ips\2015\oop\students\rysaev\oop_labs\lab2\dictionary\dictionary.h(17): error C2143: syntax error: missing ';' before '<'
1>f:\teaching\ips\2015\oop\students\rysaev\oop_labs\lab2\dictionary\dictionary.h(17): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>f:\teaching\ips\2015\oop\students\rysaev\oop_labs\lab2\dictionary\dictionary.h(17): error C2334: unexpected token(s) preceding '{'; skipping apparent function body
1>  Dictionary.cpp
1>f:\teaching\ips\2015\oop\students\rysaev\oop_labs\lab2\dictionary\dictionary.h(17): error C2039: 'map': is not a member of 'std'
1>  c:\vs2015\vc\include\vector(17): note: see declaration of 'std'
1>f:\teaching\ips\2015\oop\students\rysaev\oop_labs\lab2\dictionary\dictionary.h(17): error C2143: syntax error: missing ';' before '<'
1>f:\teaching\ips\2015\oop\students\rysaev\oop_labs\lab2\dictionary\dictionary.h(17): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>f:\teaching\ips\2015\oop\students\rysaev\oop_labs\lab2\dictionary\dictionary.h(17): error C2334: unexpected token(s) preceding '{'; skipping apparent function body
1>f:\teaching\ips\2015\oop\students\rysaev\oop_labs\lab2\dictionary\dictionary.cpp(28): error C2065: 'enRu': undeclared identifier
1>f:\teaching\ips\2015\oop\students\rysaev\oop_labs\lab2\dictionary\dictionary.cpp(28): error C2228: left of '.size' must have class/struct/union
1>  f:\teaching\ips\2015\oop\students\rysaev\oop_labs\lab2\dictionary\dictionary.cpp(28): note: type is 'unknown-type'
1>f:\teaching\ips\2015\oop\students\rysaev\oop_labs\lab2\dictionary\dictionary.cpp(33): error C2065: 'enRu': undeclared identifier
1>f:\teaching\ips\2015\oop\students\rysaev\oop_labs\lab2\dictionary\dictionary.cpp(33): error C2228: left of '.insert' must have class/struct/union
1>  f:\teaching\ips\2015\oop\students\rysaev\oop_labs\lab2\dictionary\dictionary.cpp(33): note: type is 'unknown-type'
1>f:\teaching\ips\2015\oop\students\rysaev\oop_labs\lab2\dictionary\dictionary.cpp(39): error C2065: 'enRu': undeclared identifier
1>f:\teaching\ips\2015\oop\students\rysaev\oop_labs\lab2\dictionary\dictionary.cpp(40): error C3312: no callable 'begin' function found for type 'unknown-type'
1>f:\teaching\ips\2015\oop\students\rysaev\oop_labs\lab2\dictionary\dictionary.cpp(40): error C3312: no callable 'end' function found for type 'unknown-type'
1>f:\teaching\ips\2015\oop\students\rysaev\oop_labs\lab2\dictionary\dictionary.cpp(45): error C2065: 'word': undeclared identifier
1>f:\teaching\ips\2015\oop\students\rysaev\oop_labs\lab2\dictionary\dictionary.cpp(45): error C2228: left of '.first' must have class/struct/union
1>  f:\teaching\ips\2015\oop\students\rysaev\oop_labs\lab2\dictionary\dictionary.cpp(45): note: type is 'unknown-type'
1>f:\teaching\ips\2015\oop\students\rysaev\oop_labs\lab2\dictionary\dictionary.cpp(45): error C2228: left of '.second' must have class/struct/union
1>  f:\teaching\ips\2015\oop\students\rysaev\oop_labs\lab2\dictionary\dictionary.cpp(45): note: type is 'unknown-type'
1>f:\teaching\ips\2015\oop\students\rysaev\oop_labs\lab2\dictionary\dictionary.cpp(57): error C2065: 'enRu': undeclared identifier
1>f:\teaching\ips\2015\oop\students\rysaev\oop_labs\lab2\dictionary\dictionary.cpp(62): error C2065: 'enRu': undeclared identifier
1>f:\teaching\ips\2015\oop\students\rysaev\oop_labs\lab2\dictionary\dictionary.cpp(62): error C2228: left of '.find' must have class/struct/union
1>  f:\teaching\ips\2015\oop\students\rysaev\oop_labs\lab2\dictionary\dictionary.cpp(62): note: type is 'unknown-type'
1>f:\teaching\ips\2015\oop\students\rysaev\oop_labs\lab2\dictionary\dictionary.cpp(62): error C2228: left of '.end' must have class/struct/union
1>  f:\teaching\ips\2015\oop\students\rysaev\oop_labs\lab2\dictionary\dictionary.cpp(62): note: type is 'unknown-type'
alexey-malov commented 8 years ago

В проекте не включена поддержка структурных исключений (PRoperties - C++ - Code Generation - Enable C++ Exceptions)

1>c:\sdk\2012\boost_1_55_0\include\boost\test\impl\execution_monitor.ipp(948): warning C4535: calling _set_se_translator() requires /EHa