From bdab39b266b33f30b509b025ed12c9b67c2d2584 Mon Sep 17 00:00:00 2001 From: MovsisianRG Date: Sun, 19 May 2024 17:49:43 +0300 Subject: [PATCH] code: all files --- gitignore.c | 2 ++ histogram.cpp | 55 ++++++++++++++++++++++++++++++++++++++ histogram.h | 8 ++++++ lab1var1.cbp | 8 ++++++ lab1var1.layout | 15 +++++++++++ svg.cpp | 71 +++++++++++++++++++++++++++++++++++++++++++++++++ svg.h | 8 ++++++ text.cpp | 51 +++++++++++++++++++++++++++++++++++ text.h | 8 ++++++ unittest.c | 1 + unittest.cbp | 38 ++++++++++++++++++++++++++ unittest.cpp | 12 +++++++++ unittest.layout | 5 ++++ 13 files changed, 282 insertions(+) create mode 100644 gitignore.c create mode 100644 histogram.cpp create mode 100644 histogram.h create mode 100644 lab1var1.layout create mode 100644 svg.cpp create mode 100644 svg.h create mode 100644 text.cpp create mode 100644 text.h create mode 100644 unittest.c create mode 100644 unittest.cbp create mode 100644 unittest.cpp create mode 100644 unittest.layout diff --git a/gitignore.c b/gitignore.c new file mode 100644 index 0000000..f346b09 --- /dev/null +++ b/gitignore.c @@ -0,0 +1,2 @@ +/bin +obj/ diff --git a/histogram.cpp b/histogram.cpp new file mode 100644 index 0000000..e9a6a7d --- /dev/null +++ b/histogram.cpp @@ -0,0 +1,55 @@ +#include +#include +#include "histogram.h" + +void find_minmax(const std::vector &numbers, double &min, double &max) +{ + //min = numbers[0]; + //max = numbers[0]; + for (double x : numbers) + { + + if (x < min) + { + min = x; + } + + else if (x > max) + { + max = x; + } + } +} + +std::vector make_histogram(const std::vector& numbers, size_t bin_count) +{ + std::vector bins(bin_count); + int max_count = bins[0]; + double min = numbers[0]; + double max = numbers[0]; + + find_minmax(numbers, min, max); + double bin_size = (max - min) / bin_count; + + for (size_t i = 0; i < numbers.size(); i++) + { + bool found = false; + for (size_t j = 0; (j < bin_count - 1) && !found; j++) + { + auto lo = min + j * bin_size; + auto hi = min + (j + 1) * bin_size; + + if ((lo <= numbers[i]) && (numbers[i] < hi)) + { + bins[j]++; + found = true; + } + } + + if (!found) + { + bins[bin_count - 1]++; + } + } + return bins; +} diff --git a/histogram.h b/histogram.h new file mode 100644 index 0000000..c638903 --- /dev/null +++ b/histogram.h @@ -0,0 +1,8 @@ +#ifndef HISTOGRAM_H_INCLUDED +#define HISTOGRAM_H_INCLUDED + + +std::vector +make_histogram(const std::vector& numbers, size_t bin_count); + +#endif // HISTOGRAM_H_INCLUDED diff --git a/lab1var1.cbp b/lab1var1.cbp index ad9972e..bfc6fcd 100644 --- a/lab1var1.cbp +++ b/lab1var1.cbp @@ -32,7 +32,15 @@ + + + + + + diff --git a/lab1var1.layout b/lab1var1.layout new file mode 100644 index 0000000..d2a2fdf --- /dev/null +++ b/lab1var1.layout @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/svg.cpp b/svg.cpp new file mode 100644 index 0000000..fb8a895 --- /dev/null +++ b/svg.cpp @@ -0,0 +1,71 @@ +#include +#include +#include "svg.h" +// #include"svg_rect.h" + +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; + +void svg_begin(double width, double height) +{ + std::cout << "\n"; + std::cout << "\n"; +} + +void svg_end() +{ + std::cout << "\n"; +} + +void svg_text(double left, double baseline, std::string text) +{ + // std::cout << "text"; + + std::cout << " " << text << " "; + + // std::cout << "2"; +} + +void svg_rect(double x, double y, double width, double height) +{ + + std::cout << ""; +} + +void show_histogram_svg(const std::vector &bins) +{ + const auto SCALE = (IMAGE_WIDTH - TEXT_WIDTH); + 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; + svg_begin(IMAGE_WIDTH, IMAGE_HEIGHT); + double top = 0; + for (size_t bin : bins) + { + double bin_width = BLOCK_WIDTH * bin; + + if (bin_width > SCALE) + { + bin_width = SCALE; + } + + svg_text(TEXT_LEFT, top + TEXT_BASELINE, std::to_string(bin)); + svg_rect(TEXT_WIDTH, top, bin_width, BIN_HEIGHT); + top += BIN_HEIGHT; + } + + svg_end(); +} diff --git a/svg.h b/svg.h new file mode 100644 index 0000000..632dcbf --- /dev/null +++ b/svg.h @@ -0,0 +1,8 @@ +#ifndef SVG_H_INCLUDED +#define SVG_H_INCLUDED +#include + +void +show_histogram_svg(const std::vector& bins); + +#endif //SVG_H_INCLUDED diff --git a/text.cpp b/text.cpp new file mode 100644 index 0000000..4e9d067 --- /dev/null +++ b/text.cpp @@ -0,0 +1,51 @@ +#include +#include +#include "text.h" + +const size_t SCREEN_WIDTH = 80; +const size_t MAX_ASTERISK = SCREEN_WIDTH - 3 - 1; + + +void show_histogram_text(std::vector &bins, size_t bin_count) +{ + int max_count = bins[0]; + for (int i = 0; i < bin_count; i++) + { + if (bins[i] > max_count) + { + max_count = bins[i]; + } + } + std::vector height(bin_count); + for (int i = 0; i < bin_count; i++) + { + if (bins[i] > MAX_ASTERISK) + { + height[i] = (MAX_ASTERISK * bins[i]) / max_count; + } + else + height[i] = bins[i]; + } + + for (int i = 0; i < bin_count; i++) + { + + if (bins[i] < 100) + { + std::cout << " "; + } + + if (bins[i] < 10) + { + std::cout << " " ; + } + + std::cout << bins[i] << "|"; + + for (int j = 0; j < height[i]; j++) + { + std::cout << "*"; + } + std::cout << std::endl; + } +} diff --git a/text.h b/text.h new file mode 100644 index 0000000..cff550c --- /dev/null +++ b/text.h @@ -0,0 +1,8 @@ +#ifndef TEXT_H_INCLUDED +#define TEXT_H_INCLUDED +#include + +void +show_histogram_text(std::vector &bins, size_t bin_count); + +#endif // TEXT_H_INCLUDED diff --git a/unittest.c b/unittest.c new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/unittest.c @@ -0,0 +1 @@ + diff --git a/unittest.cbp b/unittest.cbp new file mode 100644 index 0000000..7f9621b --- /dev/null +++ b/unittest.cbp @@ -0,0 +1,38 @@ + + + + + + diff --git a/unittest.cpp b/unittest.cpp new file mode 100644 index 0000000..a9ba7e5 --- /dev/null +++ b/unittest.cpp @@ -0,0 +1,12 @@ +#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); +} diff --git a/unittest.layout b/unittest.layout new file mode 100644 index 0000000..593c06e --- /dev/null +++ b/unittest.layout @@ -0,0 +1,5 @@ + + + + +