diff --git a/histogram.cpp b/histogram.cpp index 41832b0..cd7d886 100644 --- a/histogram.cpp +++ b/histogram.cpp @@ -23,6 +23,26 @@ void find_minmax(const vector& numbers, double& min, double& max) { } } +void find_max_capacity(const vector& bins, size_t& max_bin_capacity) +{ + max_bin_capacity = bins[0]; + for (size_t x : bins) + { + if (x > max_bin_capacity) + { + max_bin_capacity = x; + } + } +} + +void find_range_border(const vector& numbers, size_t bin_count, size_t bin_number, double& range_border) +{ + double min_number, max_number; + find_minmax(numbers, min_number, max_number); + double bin_size = abs((max_number - min_number) / bin_count); + range_border = min_number + bin_number * bin_size; +} + vector make_histogram(const vector& numbers, size_t bin_count) { double min_number, max_number; @@ -32,7 +52,7 @@ vector make_histogram(const vector& numbers, size_t bin_count) { bins[i] = 0; } - double bin_size = (max_number - min_number) / bin_count; + double bin_size = abs((max_number - min_number) / bin_count); for (size_t i = 0; i < numbers.size(); i++) { bool found = false; diff --git a/histogram.h b/histogram.h index 1991ac2..9123ee8 100644 --- a/histogram.h +++ b/histogram.h @@ -1,4 +1,6 @@ #pragma once #include -std::vector make_histogram(const std::vector& numbers, size_t bin_count); \ No newline at end of file +std::vector make_histogram(const std::vector& numbers, size_t bin_count); +void find_range_border(const std::vector& numbers, size_t bin_count, size_t bin_number, double& range_border); +void find_max_capacity(const std::vector& bins, size_t& max_bin_capacity); \ No newline at end of file diff --git a/lab03.vcxproj b/lab03.vcxproj index 09294d5..3c12bb1 100644 --- a/lab03.vcxproj +++ b/lab03.vcxproj @@ -29,6 +29,7 @@ false + diff --git a/lab1.cpp b/lab1.cpp index 0924133..8e3e6ea 100644 --- a/lab1.cpp +++ b/lab1.cpp @@ -27,7 +27,8 @@ int main() const size_t SCREEN_WIDTH = 80; const size_t MAX_ASTERISK = SCREEN_WIDTH - 3 - 1; auto in = input_data(); + vector numbers_data = in.numbers; auto bins = make_histogram(in.numbers, in.bin_count); - show_histogram_svg(bins); + show_histogram_svg(bins, in.numbers, in.bin_count); return 0; } diff --git a/range_border.h b/range_border.h new file mode 100644 index 0000000..b39b103 --- /dev/null +++ b/range_border.h @@ -0,0 +1,4 @@ +#pragma once +#include + +void find_range_border(const std::vector& numbers, size_t bin_count, size_t bin_number, double& range_border); \ No newline at end of file diff --git a/svg.cpp b/svg.cpp index 26d379d..0b2b0b8 100644 --- a/svg.cpp +++ b/svg.cpp @@ -3,7 +3,7 @@ #include #include #include "svg.h" -#include "text.h" +#include "histogram.h" using namespace std; void svg_begin(double width, double height) { @@ -27,7 +27,7 @@ void svg_rect(double x, double y, double width, double height, string stroke = " cout << ""; } -void show_histogram_svg(const vector& bins) { +void show_histogram_svg(const vector& bins, const vector& numbers, size_t& bin_count) { const auto IMAGE_WIDTH = 400; const auto IMAGE_HEIGHT = 300; const auto TEXT_LEFT = 20; @@ -39,9 +39,16 @@ void show_histogram_svg(const vector& bins) { double top = 0; size_t max_bin_capacity{}; find_max_capacity(bins, max_bin_capacity); - for (size_t bin : bins) { - const double bin_width = (IMAGE_WIDTH - TEXT_WIDTH) * (static_cast(bin) / max_bin_capacity); - svg_text(TEXT_LEFT, top + TEXT_BASELINE, to_string(bin)); + double range_border = 0; + for (size_t i = 0; i < bins.size(); i++) { + const double bin_width = (IMAGE_WIDTH - TEXT_WIDTH) * (static_cast(bins[i]) / max_bin_capacity); + if (i != 0) + { + find_range_border(numbers, bin_count, i, range_border); + svg_text(TEXT_LEFT, top + TEXT_BASELINE, to_string(range_border)); + top += BIN_HEIGHT; + } + svg_text(TEXT_LEFT, top + TEXT_BASELINE, to_string(bins[i])); svg_rect(TEXT_WIDTH, top, bin_width, BIN_HEIGHT, "purple", "#ffcc00"); top += BIN_HEIGHT; } diff --git a/svg.h b/svg.h index f40efe2..c504824 100644 --- a/svg.h +++ b/svg.h @@ -1,4 +1,4 @@ #pragma once #include -void show_histogram_svg(const std::vector& bins); \ No newline at end of file +void show_histogram_svg(const std::vector& bins, const std::vector& numbers, size_t& bin_count); \ No newline at end of file diff --git a/text.cpp b/text.cpp index af82aa6..709a0e3 100644 --- a/text.cpp +++ b/text.cpp @@ -4,18 +4,6 @@ #include "text.h" using namespace std; -void find_max_capacity(const vector& bins, size_t& max_bin_capacity) -{ - max_bin_capacity = bins[0]; - for (size_t x : bins) - { - if (x > max_bin_capacity) - { - max_bin_capacity = x; - } - } -} - void show_histogram_text(const vector& bins, size_t max_asterisk) { size_t max_bin_capacity{}; diff --git a/unittest.cpp b/unittest.cpp index 485d693..8c4e254 100644 --- a/unittest.cpp +++ b/unittest.cpp @@ -2,6 +2,7 @@ #define DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN #include "doctest.h" #include "histogram_internal.h" +#include "range_border.h" TEST_CASE("distinct positive numbers") { double min = 0; @@ -18,10 +19,23 @@ TEST_CASE("empty vector") { CHECK(min == 0); CHECK(max == 0); } + TEST_CASE("negative values") { double min = 0; double max = 0; find_minmax({-2, -4}, min, max); CHECK(min == -4); CHECK(max == -2); +} + +TEST_CASE("negative borders") { + double range_border = 0; + find_range_border({-2, -4}, 2, 1, range_border); + CHECK(range_border == -3); +} + +TEST_CASE("more bins than numbers") { + double range_border = 0; + find_range_border({3}, 2, 1, range_border); + CHECK(range_border == 3); } \ No newline at end of file diff --git a/unittest.vcxproj b/unittest.vcxproj index 3e22914..aacb221 100644 --- a/unittest.vcxproj +++ b/unittest.vcxproj @@ -133,6 +133,7 @@ +