diff --git a/histogram.cpp b/histogram.cpp index a247501..8b24bce 100644 --- a/histogram.cpp +++ b/histogram.cpp @@ -4,7 +4,11 @@ #include "histogram_internal.h" using namespace std; -void find_minmax(const vector& numbers, double& min, double& max) { +bool find_minmax(const vector& numbers, double& min, double& max) { + if(numbers.empty()){ + return false; + } + else{ min = numbers[0]; max = numbers[0]; for (double x : numbers) { @@ -15,6 +19,8 @@ void find_minmax(const vector& numbers, double& min, double& max) { max = x; } } + return true; + } } //создание гистограммы diff --git a/histogram_internal.h b/histogram_internal.h index 0a08577..428ad04 100644 --- a/histogram_internal.h +++ b/histogram_internal.h @@ -4,7 +4,7 @@ #include -void find_minmax(const std::vector& numbers, double& min, double& max); +bool find_minmax(const std::vector& numbers, double& min, double& max); #endif // HISTOGRAM_INTERNAL_H_INCLUDED diff --git a/svg.cpp b/svg.cpp index 25a2805..386b01b 100644 --- a/svg.cpp +++ b/svg.cpp @@ -50,16 +50,26 @@ show_histogram_svg(const vector& bins) { const auto BIN_HEIGHT = 30; const auto BLOCK_WIDTH = 10; + const auto MAX_WIDTH = IMAGE_WIDTH - TEXT_WIDTH; + + size_t max_bin = 0; + for (size_t bin : bins) { + if (bin > max_bin) { + max_bin = bin; + } + } // svg_begin(400, 300); double top = 0; for (size_t bin : bins) { - const double bin_width = BLOCK_WIDTH * bin; - svg_text(TEXT_LEFT, top + TEXT_BASELINE, to_string(bin)); - svg_rect(TEXT_WIDTH, top, bin_width, BIN_HEIGHT); + + double bin_width = 0; + bin_width = (MAX_WIDTH * bin) / max_bin; + + svg_text(IMAGE_WIDTH - TEXT_LEFT, top + TEXT_BASELINE, to_string(bin)); + svg_rect(IMAGE_WIDTH - TEXT_WIDTH - bin_width, top, bin_width, BIN_HEIGHT); top += BIN_HEIGHT; } svg_end(); } -//Самостоятельно. Реализуйте для гистограммы в SVG масштабирование: самый длинный столбец должен занимать (IMAGE_WIDTH - TEXT_WIDTH) точек.!!!!!!!!!!!!!!!!!!!!!!!!!! diff --git a/unittest.cpp b/unittest.cpp index fde8f10..768ffaa 100644 --- a/unittest.cpp +++ b/unittest.cpp @@ -3,7 +3,13 @@ #include "doctest.h" #include "histogram_internal.h" -TEST_CASE("distinct positive numbers") { +TEST_CASE("пустой вектор") { + double min = 0; + double max = 0; + CHECK(!(find_minmax({}, min, max))); +} + +TEST_CASE("позитивные числа") { double min = 0; double max = 0; find_minmax({1, 2}, min, max); @@ -11,7 +17,7 @@ TEST_CASE("distinct positive numbers") { CHECK(max == 2); } -TEST_CASE("all negative numbers"){ +TEST_CASE("все негативные"){ double min = 0; double max = 0; find_minmax({-1, -2}, min, max); @@ -19,7 +25,7 @@ TEST_CASE("all negative numbers"){ CHECK(max == -1); } -TEST_CASE("vector of the same elements"){ +TEST_CASE("одинаковые элементы"){ double min = 0; double max = 0; find_minmax({3,3,3}, min, max); @@ -27,3 +33,12 @@ TEST_CASE("vector of the same elements"){ CHECK(max == 3); } + +TEST_CASE("один элемент"){ + double min = 0; + double max = 0; + find_minmax({3}, min, max); + CHECK(min == 3); + CHECK(max == 3); + +}