diff --git a/lab01.cbp b/lab01.cbp
index 5f11f48..247aa25 100644
--- a/lab01.cbp
+++ b/lab01.cbp
@@ -32,6 +32,7 @@
+
diff --git a/main.cpp b/main.cpp
index e9f4b54..604f7d8 100644
--- a/main.cpp
+++ b/main.cpp
@@ -3,71 +3,65 @@
using namespace std;
-const size_t SCREEN_WIDTH = 80;
-const size_t MAX_ASTERISK = SCREEN_WIDTH - 3 - 1;
-
-void indent(int number)
+struct Input
{
- if (number < 10)
- {
- cout << " ";
- }
- else if (number < 100)
- {
- cout << " ";
- }
- else
- {
- cout << "";
- }
-}
+ vector numbers;
+ size_t bin_count{};
+};
-int main()
+Input
+input_data()
{
+ Input in;
size_t number_count;
- cerr << "Enter number count: ";
cin >> number_count;
+ in.numbers.resize(number_count);
vector numbers(number_count);
for (size_t i = 0; i < number_count; i++)
{
- cerr << "Enter numbers: ";
- cin >> numbers[i];
+ cin >> in.numbers[i];
}
- size_t bin_count;
- cerr << "Enter bin count: ";
- cin >> bin_count;
-
- vector bins(bin_count);
+ cin >> in.bin_count;
+ return in;
+}
- double min = numbers[0];
- double max = numbers[0];
+void find_minmax( const vector& numbers, double& minN, double& maxN)
+{
+ minN = numbers[0];
+ maxN = numbers[0];
- for (double x : numbers)
+ for (double x: numbers)
{
- if (x < min)
+ if (minN > x)
{
- min = x;
+ minN = x;
}
- else if (x > max)
+ if (maxN < x)
{
- max = x;
+ maxN = x;
}
}
+}
- size_t max_count = 0;
- double bin_size = (max - min) / bin_count;
+vector make_histogram(const vector& numbers, size_t bin_count)
+{
+ double minN, maxN;
+ find_minmax( numbers, minN, maxN);
- for (size_t i = 0; i < number_count; i++)
+ vector bins(bin_count);
+ double diff = (maxN - minN) / bin_count;
+ size_t max_count = 0;
+ for (size_t i = 0; i numbers[i]))
{
bins[j]++;
if (bins[j] > max_count)
@@ -77,7 +71,7 @@ int main()
found = true;
}
}
- if (!found)
+ if(!found)
{
bins[bin_count - 1]++;
if (bins[bin_count - 1] > max_count)
@@ -86,35 +80,63 @@ int main()
}
}
}
+ return bins;
+}
+
+void show_histogram_text(const vector & bins,size_t bin_count, size_t max_count)
+{
+ const size_t SCREEN_WIDTH = 80;
+ const size_t MAX_ASTERISK = SCREEN_WIDTH - 3 - 1;
+
+ bool scaling = false;
- if (max_count <= 76)
+ if (max_count > MAX_ASTERISK)
{
- for (size_t i = 0; i < bin_count; i++)
- {
- indent(bins[i]);
- cout << bins[i] << "|";
- for (size_t j = 0; j < bins[i]; j++)
- {
- cout << "*";
- }
- cout << endl;
- }
+ scaling = true;
}
- else
+ for (size_t i = 0; i < bin_count; i++)
{
- for (size_t i = 0; i < bin_count; i++)
+ if (bins[i] < 10)
+ {
+ cout << " ";
+ }
+ else if (bins[i] < 100)
+ {
+ cout << " ";
+ }
+ else
+ {
+ cout << "";
+ }
+ cout << bins[i] << '|';
+
+ size_t number_of_stars = bins[i];
+
+ if (scaling)
{
- size_t height = 76 * (static_cast(bins[i]) / max_count);
- indent(bins[i]);
- cout << bins[i] << "|";
- for (size_t j = 0; j < height; j++)
+ if (bins[i] == max_count)
{
- cout << "*";
+ number_of_stars = MAX_ASTERISK * 1.0;
}
- cout << endl;
+ else
+ {
+ number_of_stars = MAX_ASTERISK * (static_cast(bins[i]) / max_count);
+ }
+ }
+
+ for (size_t j = 0; j < number_of_stars; j++)
+ {
+ cout << '*';
}
+ cout << endl;
}
- return 0;
+}
+int main()
+{
+ size_t max_count;
+ auto in = input_data();
+ auto bins = make_histogram(in.numbers, in.bin_count);
+ show_histogram_text(bins, in.bin_count, max_count);
}