diff --git a/Lab1.cbp b/Lab1.cbp
index 97bdf05..0277582 100644
--- a/Lab1.cbp
+++ b/Lab1.cbp
@@ -32,8 +32,14 @@
+
+
+
+
+
+
diff --git a/histogram.cpp b/histogram.cpp
index d526eb7..0bcaa87 100644
--- a/histogram.cpp
+++ b/histogram.cpp
@@ -2,16 +2,28 @@
using namespace std;
-static void
-find_minmax(const vector& numbers, double& min, double& max)
+void
+find_minmax(const vector& numbers, double& min, double& max, bool& empty_vector)
{
- min = numbers[0];
- max = numbers[0];
- // (здесь код поиска минимума и максимума)
- for (double value : numbers)
+ if (numbers.empty())
{
- if (value < min) {min = value;}
- else if (value > max) {max = value;}
+ empty_vector = true;
+ }
+ else
+ {
+ min = numbers[0];
+ max = numbers[0];
+ for (double x : numbers)
+ {
+ if (x > max )
+ {
+ max = x;
+ }
+ if (x < min)
+ {
+ min = x;
+ }
+ }
}
}
@@ -19,10 +31,22 @@ vector
make_histogram(const vector& numbers, size_t& bin_count)
{
double min, max;
- find_minmax(numbers, min, max);
+ bool empty_vector = false;
+ find_minmax(numbers, min, max, empty_vector);
+
double bin_size = (max - min) / bin_count;
vector bins(bin_count);
+
+ if (empty_vector)
+ {
+ for (size_t y : bins)
+ {
+ y = 0;
+ }
+ }
+
+
for (size_t i = 0; i < numbers.size(); i++)
{
for (size_t j = i + 1; j < numbers.size(); j++)
diff --git a/histogram_internal.h b/histogram_internal.h
new file mode 100644
index 0000000..8f2b497
--- /dev/null
+++ b/histogram_internal.h
@@ -0,0 +1,9 @@
+#ifndef HISTOGRAM_INTERNAL_H_INCLUDED
+#define HISTOGRAM_INTERNAL_H_INCLUDED
+
+#include
+
+void
+find_minmax(const std::vector& numbers, double& min, double& max, bool& empty_vector);
+
+#endif // HISTOGRAM_INTERNAL_H_INCLUDED
diff --git a/text.cpp b/text.cpp
index aceb930..011f6ff 100644
--- a/text.cpp
+++ b/text.cpp
@@ -17,6 +17,11 @@ show_histogram_text(const vector& bins, size_t& bin_count) {
}
}
+ if (max_count == 0)
+ {
+ max_count = 1;
+ }
+
for (size_t bin : bins)
{
if (bin < 100) cout << " ";
diff --git a/unittest.cpp b/unittest.cpp
new file mode 100644
index 0000000..74f357e
--- /dev/null
+++ b/unittest.cpp
@@ -0,0 +1,54 @@
+#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;
+ bool empty_vector = false;
+ find_minmax({1, 2}, min, max, empty_vector);
+ CHECK(empty_vector == false);
+ CHECK(min == 1);
+ CHECK(max == 2);
+}
+
+TEST_CASE("single number") {
+ double min = 0;
+ double max = 0;
+ bool empty_vector = false;
+ find_minmax({1}, min, max, empty_vector);
+ CHECK(empty_vector == false);
+ CHECK(min == 1);
+ CHECK(max == 1);
+}
+
+TEST_CASE("negative numbers") {
+ double min = 0;
+ double max = 0;
+ bool empty_vector = false;
+ find_minmax({-1, -2}, min, max, empty_vector);
+ CHECK(empty_vector == false);
+ CHECK(min == -2);
+ CHECK(max == -1);
+}
+
+TEST_CASE("identical numbers") {
+ double min = 0;
+ double max = 0;
+ bool empty_vector = false;
+ find_minmax({2, 2}, min, max, empty_vector);
+ CHECK(empty_vector == false);
+ CHECK(min == 2);
+ CHECK(max == 2);
+}
+
+TEST_CASE("empty vector") {
+ double min = 0;
+ double max = 0;
+ bool empty_vector = false;
+ find_minmax({}, min, max, empty_vector);
+ CHECK(empty_vector == true);
+ CHECK(min == 0);
+ CHECK(max == 0);
+}