diff --git a/histogram.cpp b/histogram.cpp new file mode 100644 index 0000000..da61b14 --- /dev/null +++ b/histogram.cpp @@ -0,0 +1,40 @@ +#include +#include "histogram.h" +using namespace std; +static 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; + } + } +} + +vector make_histogram(const vector& numbers, size_t bin_count) +{ + double min,max; + find_minmax(numbers, min, max); + vector bins(bin_count); + double bin_size = (max-min)/bin_count; + for (size_t i = 0; i < numbers.size(); i++) { + bool found = false; + for (size_t j = 0; (j < bin_count - 1) && !found; j++) { + auto lo = min + j * bin_size; + auto hi = min + (j + 1) * bin_size; + if ( (numbers[i] >= lo) && (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..d6b10a3 --- /dev/null +++ b/histogram.h @@ -0,0 +1,9 @@ +#ifndef HISTOGRAM_H_INCLUDED +#define HISTOGRAM_H_INCLUDED +#include + +std::vector +make_histogram(const std::vector& numbers, size_t bin_count); + + +#endif // HISTOGRAM_H_INCLUDED diff --git a/main.cpp b/main.cpp index eb44f24..b6e27d9 100644 --- a/main.cpp +++ b/main.cpp @@ -1,8 +1,8 @@ #include #include +#include "histogram.h" +#include "text.h" using namespace std; -const size_t SCREEN_WIDTH = 80; -const size_t MAX_ASTERISK = SCREEN_WIDTH - 3 - 1; struct Input{ vector numbers; @@ -28,83 +28,10 @@ Input input_data() return in; } -void find_minmax(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; - } - } -} int main() { - Input in = input_data(); - - double min,max; - find_minmax(in.numbers, min, max); - - vector bins(in.bin_count); - double bin_size = (max-min)/in.bin_count; - for (size_t i = 0; i < in.numbers.size(); i++) { - bool found = false; - for (size_t j = 0; (j < in.bin_count - 1) && !found; j++) { - auto lo = min + j * bin_size; - auto hi = min + (j + 1) * bin_size; - if ( (in.numbers[i] >= lo) && (in.numbers[i] < hi) ) { - bins[j]++; - found = true; - } - } - if (!found) { - bins[in.bin_count-1]++; - } - - } - size_t max_count = bins[0]; - for(size_t x: bins){ - if(x > max_count){ - max_count = x; - } - } - if (max_count > MAX_ASTERISK){ - for(size_t count: bins){ - size_t height = MAX_ASTERISK * (static_cast(count) /max_count); - if (count < 10){ - cout << " " << count << "|"; - } - else if (count < 100){ - cout << " " << count << "|"; - } - else{ - cout << count << "|"; - } - for(size_t i = 0; i < height; i++){ - cout << "*"; - } - cout << "\n"; - } - } - else{ - for(double x : bins){ - if (x < 10){ - cout << " " << x << "|"; - } - else if (x < 100){ - cout << " " << x << "|"; - } - else{ - cout << x << "|"; - } - for(size_t i = 0; i < x; i++){ - cout << "*"; - } - cout << "\n"; - } - } + auto in = input_data(); + auto bins = make_histogram(in.numbers, in.bin_count); + show_histogram_text(bins); return 0; } diff --git a/text.cpp b/text.cpp new file mode 100644 index 0000000..e983776 --- /dev/null +++ b/text.cpp @@ -0,0 +1,50 @@ +#include +#include "text.h" +#include +using namespace std; +const size_t SCREEN_WIDTH = 80; +const size_t MAX_ASTERISK = SCREEN_WIDTH - 3 - 1; +void show_histogram_text(const vector& bins) +{ + size_t max_count = bins[0]; + for(size_t x: bins){ + if(x > max_count){ + max_count = x; + } + } + if (max_count > MAX_ASTERISK){ + for(size_t count: bins){ + size_t height = MAX_ASTERISK * (static_cast(count) /max_count); + if (count < 10){ + cout << " " << count << "|"; + } + else if (count < 100){ + cout << " " << count << "|"; + } + else{ + cout << count << "|"; + } + for(size_t i = 0; i < height; i++){ + cout << "*"; + } + cout << "\n"; + } + } + else{ + for(double x : bins){ + if (x < 10){ + cout << " " << x << "|"; + } + else if (x < 100){ + cout << " " << x << "|"; + } + else{ + cout << x << "|"; + } + for(size_t i = 0; i < x; i++){ + cout << "*"; + } + cout << "\n"; + } + } +} diff --git a/text.h b/text.h new file mode 100644 index 0000000..56dc36a --- /dev/null +++ b/text.h @@ -0,0 +1,9 @@ +#ifndef TEXT_H_INCLUDED +#define TEXT_H_INCLUDED +#include + + +void show_histogram_text(const std::vector& bins); + + +#endif // TEXT_H_INCLUDED