From 7a613b4b4798cca92addf157030612319ed4f4f6 Mon Sep 17 00:00:00 2001
From: MamakinYR <MamakinYR@mpei.ru>
Date: Mon, 22 Apr 2024 02:21:58 +0300
Subject: [PATCH] =?UTF-8?q?code:=20=D0=92=D1=8B=D0=B2=D0=BE=D0=B4=20=D0=B3?=
 =?UTF-8?q?=D1=80=D0=B0=D0=BD=D0=B8=D1=86=20=D0=BA=D0=BE=D1=80=D0=B7=D0=B8?=
 =?UTF-8?q?=D0=BD?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 histogram.cpp    | 22 +++++++++++++++++++++-
 histogram.h      |  4 +++-
 lab03.vcxproj    |  1 +
 lab1.cpp         |  3 ++-
 range_border.h   |  4 ++++
 svg.cpp          | 17 ++++++++++++-----
 svg.h            |  2 +-
 text.cpp         | 12 ------------
 unittest.cpp     | 14 ++++++++++++++
 unittest.vcxproj |  1 +
 10 files changed, 59 insertions(+), 21 deletions(-)
 create mode 100644 range_border.h

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<double>& numbers, double& min, double& max) {
     }
 }
 
+void find_max_capacity(const vector<size_t>& 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<double>& 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<size_t> make_histogram(const vector<double>& numbers, size_t bin_count)
 {
     double min_number, max_number;
@@ -32,7 +52,7 @@ vector<size_t> make_histogram(const vector<double>& 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 <vector>
 
-std::vector<size_t> make_histogram(const std::vector<double>& numbers, size_t bin_count);
\ No newline at end of file
+std::vector<size_t> make_histogram(const std::vector<double>& numbers, size_t bin_count);
+void find_range_border(const std::vector<double>& numbers, size_t bin_count, size_t bin_number, double& range_border);
+void find_max_capacity(const std::vector<size_t>& 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 @@
       <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</ExcludedFromBuild>
     </ClInclude>
     <ClInclude Include="histogram_internal.h" />
+    <ClInclude Include="range_border.h" />
     <ClInclude Include="svg.h" />
     <ClInclude Include="text.h" />
   </ItemGroup>
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<double> 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<vector>
+
+void find_range_border(const std::vector<double>& 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 <vector>
 #include <string>
 #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 << "<rect x = '" << x << "' y = '" << y << "' width = '" << width << "' height = '" << height << "' stroke = '" << stroke << "' fill = '" << fill << "' />";
 }
 
-void show_histogram_svg(const vector<size_t>& bins) {
+void show_histogram_svg(const vector<size_t>& bins, const vector<double>& 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<size_t>& 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<double>(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<double>(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<vector>
 
-void show_histogram_svg(const std::vector<size_t>& bins);
\ No newline at end of file
+void show_histogram_svg(const std::vector<size_t>& bins, const std::vector<double>& 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<size_t>& 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<size_t>& 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 @@
   <ItemGroup>
     <ClInclude Include="doctest.h" />
     <ClInclude Include="histogram_internal.h" />
+    <ClInclude Include="range_border.h" />
   </ItemGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
   <ImportGroup Label="ExtensionTargets">