diff --git a/histogram.cpp b/histogram.cpp new file mode 100644 index 0000000..864bd97 --- /dev/null +++ b/histogram.cpp @@ -0,0 +1,37 @@ +#include "histogram.h" + +void find_minmax(const std::vector& vec, double& min, double& max) { + + + min = vec[0]; + max = vec[0]; + for (double x : vec) { + if (x < min) min = x; + else if (x > max) max = x; + } +} + +std::vector make_histogram(size_t number, const std::vector& vec) { + std::vector bins(number); + if (vec.empty()) return bins; + + double mn, mx; + find_minmax(vec, mn, mx); + float bin_size = (mx - mn) / number; + + for (size_t i = 0; i < vec.size(); i++) { + bool fl = false; + for (size_t j = 0; (j < number - 1) && !fl; j++) { + auto lo = mn + j * bin_size; + auto hi = mn + (j + 1) * bin_size; + if ((lo <= vec[i]) && (vec[i] < hi)) { + bins[j]++; + fl = true; + } + } + if (!fl) { + bins[number - 1]++; + } + } + return bins; +} diff --git a/histogram.h b/histogram.h new file mode 100644 index 0000000..02727a2 --- /dev/null +++ b/histogram.h @@ -0,0 +1,9 @@ +#ifndef HISTOGRAM_H_INCLUDED +#define HISTOGRAM_H_INCLUDED + +#include +#include + +std::vector make_histogram(size_t number, const std::vector& vec); + +#endif // HISTOGRAM_H_INCLUDED diff --git a/main.cpp b/main.cpp index 75616f3..551e54b 100644 --- a/main.cpp +++ b/main.cpp @@ -1,112 +1,36 @@ #include #include +#include "histogram.h" +#include "text.h" -using namespace std; +struct Input { + std::vector numbers; + size_t bin_count{}; +}; -int main() -{ - const size_t SCREEN_WIDTH = 80; - const size_t MAX_ASTERISK = SCREEN_WIDTH - 3 - 1; +Input input_data() { + Input in; size_t number_count; - cerr << "Enter number count: "; - cin >> number_count; - vector numbers(number_count); - cerr << "Enter numbers: "; - for (size_t i=0; i> numbers[i]; - } - size_t bin_count; - cerr << "Enter bin count: "; - cin >> bin_count; - - vector bins(bin_count); - - double min = numbers[0]; - double max = numbers[0]; - for (double x : numbers) - { - if (x < min) - { - min = x; - } - else if (x > max) - { - max = x; - } - } - - double bin_size=(max-min)/bin_count; - for(size_t i=0; i> number_count; + in.numbers.resize(number_count); - for (size_t i = 0; i < bin_count; i++) - { - if (bins[i] > Maxbins) - { - Maxbins = bins[i]; - } + std::cerr << "\nEnter " << number_count << " elements:" << std::endl; + for (size_t i = 0; i < number_count; i++) { + std::cin >> in.numbers[i]; } - const size_t MAX_HEIGHT = SCREEN_WIDTH - 3 - 1; + std::cerr << "Enter the number of bins: "; + std::cin >> in.bin_count; - if (Maxbins <= MAX_HEIGHT) - { - for (size_t i = 0; i < bin_count; i++) - { - if (bins[i] < 10) - { - cout << " "; - } - cout << " " << bins[i] << "|"; - for (size_t j = 0; j < bins[i]; j++) - { - cout << "*"; - } - cout << endl; - } - } - else - { - for (size_t i = 0; i < bin_count; i++) - { - size_t height = static_cast (MAX_HEIGHT * (static_cast(bins[i]) / Maxbins)); + return in; +} - if (bins[i] < 100) - { - cout << " "; - } - if (bins[i] < 10) - { - cout << " "; - } - cout << bins[i] << "|"; - for (size_t j = 0; j < height; j++) - { - cout << "*"; - } - cout << endl; - } - } +int main() { + auto in = input_data(); + auto bins = make_histogram(in.bin_count, in.numbers); + show_histogram(bins); return 0; } diff --git a/text.cpp b/text.cpp new file mode 100644 index 0000000..3ca4555 --- /dev/null +++ b/text.cpp @@ -0,0 +1,48 @@ +#include "text.h" +#include + +void show_histogram(const std::vector& bins) { + + + bool gigant = false; + auto spaces = 0; + size_t mx_count = 0; + + for (auto x : bins) { + if (x > 76) gigant = true; + if (x > mx_count) mx_count = x; + + auto len = 0; + auto num = x; + while (num > 0) { + num /= 10; + len++; + } + if (len > spaces) spaces = len; + } + + for (size_t i = 0; i < bins.size(); i++) { + + int len = 1; + auto num = bins[i]; + for (; num /= 10; ++len); + while (len < spaces) { + std::cout << " "; + len++; + } + std::cout << bins[i] << "|"; + + + if (gigant) { + size_t stars = (mx_count > 0) ? (76 * bins[i] / mx_count) : 0; + for (size_t j = 0; j < stars; j++) { + std::cout << "*"; + } + } else { + for (size_t j = 0; j < bins[i]; j++) { + std::cout << "*"; + } + } + std::cout << std::endl; + } +} diff --git a/text.h b/text.h new file mode 100644 index 0000000..f1c59f4 --- /dev/null +++ b/text.h @@ -0,0 +1,8 @@ +#ifndef TEXT_H_INCLUDED +#define TEXT_H_INCLUDED + +#include + +void show_histogram(const std::vector& bins); + +#endif // TEXT_H_INCLUDED