diff --git a/histogram.cpp b/histogram.cpp index 3e35c3e..9a04267 100644 --- a/histogram.cpp +++ b/histogram.cpp @@ -1,15 +1,13 @@ #include "histogram.h" #include -#include using namespace std; void find_minmax(const vector& numbers, double& min, double& max) { - if (numbers.empty()) return; max = numbers[0]; - min = numbers[0]; + min = numbers[1]; for (double x : numbers) { if (x < min) min = x; - if (x > max) max = x; + else if (x > max) max = x; } } @@ -36,8 +34,3 @@ vector make_histogram(vector numbers, size_t bin_count) { return bins; } -double calculate_average_height(const vector& bins) { - if (bins.empty()) return 0.0; - double sum = accumulate(bins.begin(), bins.end(), 0.0); - return sum / bins.size(); -} diff --git a/histogram.h b/histogram.h index 4821faa..e42cdf5 100644 --- a/histogram.h +++ b/histogram.h @@ -1,7 +1,9 @@ #ifndef HISTOGRAM_H_INCLUDED #define HISTOGRAM_H_INCLUDED + #include using namespace std; + vector make_histogram(vector numbers, size_t bin_count); double calculate_average_height(const vector& bins); diff --git a/histogram_internal.h b/histogram_internal.h index 945d37c..0187157 100644 --- a/histogram_internal.h +++ b/histogram_internal.h @@ -1,6 +1,10 @@ #ifndef HISTOGRAM_INTERNAL_H_INCLUDED #define HISTOGRAM_INTERNAL_H_INCLUDED +#include + void find_minmax(const std::vector& numbers, double& min, double& max); +double calculate_average_height(const std::vector& bins); + #endif // HISTOGRAM_INTERNAL_H_INCLUDED diff --git a/main.cpp b/main.cpp index 8f132ec..16b174a 100644 --- a/main.cpp +++ b/main.cpp @@ -3,34 +3,33 @@ #include "histogram.h" #include "text.h" #include "svg.h" -#include "histogram_internal.h" using namespace std; - struct Input { vector numbers; - size_t bin_count{}; + size_t bin_count; }; -Input input_data(){ - size_t number_count, bin_count; +Input input_data(istream& in) { + Input inp; + size_t number_count; cerr << "Enter number count: "; cin >> number_count; - Input in; - in.numbers.resize(number_count); - for (size_t i = 0; i < number_count; i++) - { - cerr << "Enter Num[" << i << "]: "; - cin >> in.numbers[i]; + inp.numbers.resize(number_count); + cerr << "Enter numbers: "; + for (size_t i = 0; i < number_count; i++) { + cin >> inp.numbers[i]; } + cerr << "Enter bin count: "; - cin >> in.bin_count; - return in; + cin >> inp.bin_count; + return inp; } -int main() -{ - auto in = input_data(); + + +int main() { + auto in = input_data(cin); auto bins = make_histogram(in.numbers, in.bin_count); show_histogram_svg(bins); return 0; diff --git a/svg.cpp b/svg.cpp index e6c6c64..f17f5a8 100644 --- a/svg.cpp +++ b/svg.cpp @@ -2,7 +2,7 @@ #include #include #include "svg.h" -#include "histogram.h" + using namespace std; void svg_begin(double width, double height) { @@ -22,7 +22,7 @@ void svg_text(double left, double baseline, string text) { cout << "" << text << "\n"; } -void svg_rect(double x, double y, double width, double height, string stroke, string fill) { +void svg_rect(double x, double y, double width, double height, string stroke = "black", string fill = "black") { cout << "\n"; } @@ -51,13 +51,10 @@ void show_histogram_svg(const vector& bins) { } } - double avg_height = calculate_average_height(bins); - for (size_t bin : bins) { const double bin_width = MAX_WIDTH * (static_cast(bin) / max_count); svg_text(TEXT_LEFT, top + TEXT_BASELINE, to_string(bin)); - string fill_color = (bin > avg_height) ? "red" : "green"; - svg_rect(TEXT_WIDTH, top, bin_width, BIN_HEIGHT, "black", fill_color); + svg_rect(TEXT_WIDTH, top, bin_width, BIN_HEIGHT, "black", "red"); top += BIN_HEIGHT; } diff --git a/text.cpp b/text.cpp index 9f8573c..f5c2730 100644 --- a/text.cpp +++ b/text.cpp @@ -1,37 +1,9 @@ -#include "text.h" -#include +#ifndef TEXT_H_INCLUDED +#define TEXT_H_INCLUDED + +#include using namespace std; -void show_histogram_text(vector bins, size_t bin_count) { - const size_t SCREEN_WIDTH = 80; - const size_t MAX_ASTERISK = SCREEN_WIDTH - 3 - 1; - double max_bin; - size_t height; - max_bin = bins[0]; - height = bins[0]; - for (size_t i = 0; i < bin_count; i++) { - if (bins[i] > max_bin) { - max_bin = bins[i]; - } - } +void show_histogram_text(vector bins, size_t bin_count); - bool flag = false; - if (max_bin > 80) { - flag = true; - } - for (size_t i = 0; i < bin_count; i++) { - if (bins[i] < 100) cout << " "; - if (bins[i] < 10) cout << " "; - cout << bins[i] << "|"; - if (flag == true) { - height = MAX_ASTERISK * (static_cast(bins[i]) / max_bin); - } - else { - height = bins[i]; - } - for (size_t j = 0; j < height; j++) { - cout << "*"; - } - cout << endl; - } -} +#endif