diff --git a/histogram.cpp b/histogram.cpp new file mode 100644 index 0000000..0b25335 --- /dev/null +++ b/histogram.cpp @@ -0,0 +1,41 @@ +#include "histogram.h" +#include "histogram_internal.h" +bool find_minmax(vector vec, double& min, double& max) { + if(vec.size() == 0){ + return false; + } + min = vec[0]; + max = vec[0]; + for (double x : vec) { + if (x < min) { + min = x; + } + else if (x > max) + { + max = x; + } + } + return true; +} +vector make_histogram(size_t number, vector vec) { + vector bins(number); + double mn, mx; + find_minmax(vec, mn, mx); + float bin_size = (mx - mn) / number; + for (size_t i = 0; i < vec.size(); i++) { + bool fl = false; + for (size_t j = 0; (j < number - 1) && !fl; j++) { + auto lo = mn + j * bin_size; + auto hi = mn + (j + 1) * bin_size; + if ((lo <= vec[i]) && (vec[i] < hi)) { + bins[j]++; + fl = true; + } + } + if (!fl) { + bins[number - 1]++; + + } + } + return bins; +} diff --git a/histogram_internal.h b/histogram_internal.h new file mode 100644 index 0000000..6631db5 --- /dev/null +++ b/histogram_internal.h @@ -0,0 +1 @@ +bool find_minmax(const std::vector vec, double& min, double& max); diff --git a/svg.cpp b/svg.cpp new file mode 100644 index 0000000..f763352 --- /dev/null +++ b/svg.cpp @@ -0,0 +1,77 @@ +#include "svg.h" + +using namespace std; + +void +svg_begin(double width, double height) +{ + cout << "\n"; + cout << "\n"; +} + +void +svg_end() +{ + cout << "\n"; +} + +void +svg_text(double left, double baseline, string text) +{ + cout << "" << text << ""; +} + +void +svg_rect(double x, double y, double width, double height, string stroke = "black", string fill = "black") +{ + cout << ""; + +} + + + +void +show_histogram_svg(const vector& bins) +{ + const auto IMAGE_WIDTH = 400; + const auto IMAGE_HEIGHT = 300; + const auto TEXT_LEFT = 20; + const auto TEXT_BASELINE = 20; + const auto TEXT_WIDTH = 50; + const auto BIN_HEIGHT = 30; + const auto BLOCK_WIDTH = 10; + const auto BLACK = "black"; + + const auto MAX_WIDTH = IMAGE_WIDTH-TEXT_WIDTH; + + + svg_begin(IMAGE_WIDTH,IMAGE_HEIGHT); + + double top = 0; + double max_count = bins[0]; + for (size_t i = 0; i < bins.size(); i++) + { + if (max_count +#include +#include +#include +using namespace std; +void show_histogram_svg(const vector& bins); diff --git a/text.cpp b/text.cpp new file mode 100644 index 0000000..03aa0c5 --- /dev/null +++ b/text.cpp @@ -0,0 +1,44 @@ +#include +#include +#include "text.h" + +using namespace std; + +void show_histogram_text(vector bins, size_t bin_count){ + const size_t SCREEN_WIDTH = 80; + const size_t MAX_ASTERISK = SCREEN_WIDTH - 3 - 1; + + size_t max_bin = bins[0]; + for(size_t i = 0; i < bin_count; i++) + { + if(bins[i] > max_bin) + { + max_bin = bins[i]; + } + } + + for (size_t bin: bins) + { + size_t height = bin; + + if (max_bin > MAX_ASTERISK) + { + height = MAX_ASTERISK * (static_cast(bin) / max_bin); + } + + if (bin < 100) + { + cout << ' '; + } + if (bin < 10) + { + cout << ' '; + } + cout << bin << "|"; + for(size_t i = 0; i < height; i++) + { + cout << "*"; + } + cout << endl; + } +} diff --git a/unittest.cpp b/unittest.cpp new file mode 100644 index 0000000..ad48da0 --- /dev/null +++ b/unittest.cpp @@ -0,0 +1,37 @@ +#define DOCTEST_CONFIG_NO_MULTITHREADING +#define DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN +#include "doctest.h" +#include "histogram_internal.h" + +TEST_CASE("distinct positive numbers") { + double min = 0; + double max = 0; + find_minmax({1, 2}, min, max); + CHECK(min == 1); + CHECK(max == 2); +} +TEST_CASE("distinct negative numbers"){ + double min = 0; + double max = 0; + find_minmax({-1, -2}, min, max); + CHECK(min == -2); + CHECK(max == -1); +} +TEST_CASE("vector of the same elements"){ + double min = 0; + double max = 0; + find_minmax({3,3,3}, min, max); + CHECK(min == 3); + CHECK(max == 3); +} +TEST_CASE("empty vector"){ + double min = 0; + double max = 0; + CHECK(!find_minmax({}, min, max)); +} +TEST_CASE("vector of one elements"){ + double min = 0; + double max = 0; + find_minmax({3}, min, max); + CHECK(min == max); +}