diff --git a/cs-lab34.vcxproj b/cs-lab34.vcxproj
index ea0ce50..d02216c 100644
--- a/cs-lab34.vcxproj
+++ b/cs-lab34.vcxproj
@@ -17,7 +17,6 @@
Release
x64
-
17.0
@@ -53,27 +52,24 @@
true
Unicode
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
Level3
@@ -130,9 +126,12 @@
true
-
-
+
+
+
+
+
-
+
\ No newline at end of file
diff --git a/histogram.cpp b/histogram.cpp
new file mode 100644
index 0000000..4c759c6
--- /dev/null
+++ b/histogram.cpp
@@ -0,0 +1,43 @@
+#include "histogram.h"
+#include
+#include
+using namespace std;
+
+void
+find_minmax(const 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) {
+ vector bins(bin_count);
+
+ double min = 0, max = 0;
+ find_minmax(numbers, min, max);
+
+ double bin_size = (max - min) / bin_count;
+ for (int i = 0; i < numbers.size(); i++) {
+ bool found = false;
+ for (int 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..2044428
--- /dev/null
+++ b/histogram.h
@@ -0,0 +1,5 @@
+#pragma once
+#include
+
+std::vector
+make_histogram(const std::vector& numbers, size_t bin_count);
diff --git a/main.cpp b/main.cpp
index 2c17ffd..f5e24d0 100644
--- a/main.cpp
+++ b/main.cpp
@@ -1,86 +1,40 @@
-#include
#include
-#include
+#include
+#include
+#include "histogram.h"
+#include "text.h"
using namespace std;
-int main() {
- const size_t WIDTH = 80;
- const size_t MAX_ASTERISK = WIDTH - 3 - 1;
- size_t i, j;
- size_t number_count;
- cerr << "insert number count: \n";
- cin >> number_count;
- vector numbers(number_count);
- cerr << "insert numbers: \n";
- for (i = 0; i < number_count; i++) {
- cin >> numbers[i];
- }
- size_t bin_count;
- cerr << "insert bin count: \n";
- cin >> bin_count;
+struct Input {
+ vector numbers;
+ size_t bin_count{};
+};
+
+Input
+input_data() {
+ size_t number_count;
+ cerr << "Enter number count: ";
+ cin >> number_count;
+
+ Input in;
+ in.numbers.resize(number_count);
+ cerr << "Enter numbers: ";
+ for (size_t i = 0; i < number_count; i++) {
+ cin >> in.numbers[i];
+ }
+
+ cerr << "Enter bin count: ";
+ cin >> in.bin_count;
- vector bins(bin_count);
- double min, max;
- min = numbers[0];
- max = numbers[0];
- for (double x : numbers) {
- if (x < min) {
- min = x;
- }
- else if (x > max) {
- max = x;
- }
- }
- for (i = 0; i < number_count; i++) {
- for (j = number_count - 1; j > i; j--) {
- if (numbers[i] == numbers[j]) {
- numbers.erase(numbers.begin() + j);
- number_count = number_count - 1;
- }
- }
- }
- for (i = 0; i < number_count; i++) {
- cout << numbers[i];
- }
- cout << "\n";
- double bin_size = (max - min) / bin_count;
- for (i = 0; i < number_count; i++) {
- bool found = false;
- for (j = 0; (j < bin_count && !found); j++) {
- auto lo = min + j * bin_size;
- auto hi = min + (j + 1) * bin_size;
- if ((lo <= numbers[i]) && (hi > numbers[i])) {
- bins[j]++;
- found = true;
- }
- }
- if (!found) {
- bins[bin_count - 1]++;
- }
- }
+ return in;
+}
- size_t maxcount = bins[0];
- for (size_t x : bins) {
- if (x > maxcount) {
- maxcount = x;
- }
- }
+int main()
+{
+ const size_t SCREEN_WIDTH = 80;
+ const size_t MAX_ASTERISK = SCREEN_WIDTH - 3 - 1;
- size_t height = 0;
- for (i = 0; i < bin_count; i++) {
- if (bins[i] < 100) {
- cout << " ";
- }
- if (bins[i] < 10) {
- cout << " ";
- }
- cout << bins[i] << "|";
- if (maxcount > 76) {
- height = MAX_ASTERISK * (static_cast(bins[i]) / maxcount);
- }
- for (j = 0; j < height; j++) {
- cout << "*";
- }
- cout << "\n";
- }
- return 0;
-}
\ No newline at end of file
+ auto in = input_data();
+ auto bins = make_histogram(in.numbers, in.bin_count);
+ show_histogram_text(bins, MAX_ASTERISK, in.bin_count);
+ return 0;
+}
diff --git a/text.cpp b/text.cpp
new file mode 100644
index 0000000..f4ecca4
--- /dev/null
+++ b/text.cpp
@@ -0,0 +1,29 @@
+#include "text.h"
+#include
+#include
+using namespace std;
+
+void
+show_histogram_text(const vector& bins, size_t MAX_ASTERISK, size_t bin_count) {
+ double max_count = bins[0];
+ for (double x : bins) {
+ if (x > max_count) {
+ max_count = x;
+ }
+ }
+
+ for (int i = 0; i < bin_count; i++) {
+ double count = bins[i];
+ size_t height = MAX_ASTERISK * (static_cast(count) / max_count);
+ string line(height, '*');
+ if (bins[i] < 100)
+ {
+ cout << ' ';
+ }
+ if (bins[i] < 10)
+ {
+ cout << ' ';
+ }
+ cout << bins[i] << "|" << line << endl;
+ }
+}
diff --git a/text.h b/text.h
new file mode 100644
index 0000000..039f725
--- /dev/null
+++ b/text.h
@@ -0,0 +1,5 @@
+#pragma once
+#include
+
+void
+show_histogram_text(const std::vector& bins, size_t MAX_ASTERISK, size_t bin_count);