diff --git a/histogam.cpp b/histogam.cpp index ca73087..d2c9e3e 100644 --- a/histogam.cpp +++ b/histogam.cpp @@ -6,7 +6,7 @@ #include using namespace std; -void find_minmax(vector numbers, double& min, double& max) { +/*void find_minmax(vector numbers, double& min, double& max) { min = numbers[0]; for (auto i = 0; i < numbers.size(); i++) { if (numbers[i] < min) { @@ -64,3 +64,52 @@ vector make_histogram(const vector& numbers, size_t bin_count) { } return bins; } +*/ +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; + } + } + return; +} + +vector make_histogram (vector numbers, size_t bin_count) +{ + double min; + double max; + find_minmax (numbers, min, max); + double bin_size = (max - min) / bin_count; + vector bins(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 ((lo <= numbers[i]) && (numbers[i] < hi)) + { + bins[j]++; + found = true; + } + } + + if (!found) + { + bins[bin_count - 1]++; + } + } + + return bins; +} diff --git a/histogam.h b/histogam.h index af2d8ad..0dc005d 100644 --- a/histogam.h +++ b/histogam.h @@ -2,8 +2,10 @@ #define HISTOGAM_H_INCLUDED #include -std::vector +/*std::vector make_histogram(const std::vector& numbers, size_t bin_count); - +*/ +std::vector +make_histogram(const std::vector numbers, size_t bin_count); #endif // HISTOGAM_H_INCLUDED diff --git a/histogam_internal.h b/histogam_internal.h index 58eecb6..2a76b21 100644 --- a/histogam_internal.h +++ b/histogam_internal.h @@ -2,6 +2,8 @@ #define HISTOGAM_INTERNAL_H_INCLUDED #include +/* +void find_minmax(std::vector numbers, double& min, double& max); +*/ void find_minmax(std::vector numbers, double& min, double& max); - #endif // HISTOGAM_INTERNAL_H_INCLUDED diff --git a/lab1.depend b/lab1.depend index ae3ebd8..e0fcee0 100644 --- a/lab1.depend +++ b/lab1.depend @@ -3,7 +3,7 @@ -1685271547 source:c:\users\admin\onedrive\Рабочий стол\lab1\main.cpp +1685895850 source:c:\users\admin\onedrive\Рабочий стол\lab1\main.cpp @@ -14,10 +14,10 @@ "histogam_internal.h" -1682273839 c:\users\admin\onedrive\Рабочий стол\lab1\histogam.h +1685896776 c:\users\admin\onedrive\Рабочий стол\lab1\histogam.h -1682280773 source:c:\users\admin\onedrive\Рабочий стол\lab1\histogam.cpp +1685896777 source:c:\users\admin\onedrive\Рабочий стол\lab1\histogam.cpp @@ -25,20 +25,20 @@ "histogam_internal.h" -1682280773 source:c:\users\admin\onedrive\Рабочий стол\lab1\text.cpp +1685896776 source:c:\users\admin\onedrive\Рабочий стол\lab1\text.cpp "text.h" -1682273447 c:\users\admin\onedrive\Рабочий стол\lab1\text.h +1685896777 c:\users\admin\onedrive\Рабочий стол\lab1\text.h -1682273796 c:\users\admin\onedrive\Рабочий стол\lab1\histogam_internal.h +1685896777 c:\users\admin\onedrive\Рабочий стол\lab1\histogam_internal.h -1682339808 source:c:\users\admin\onedrive\Рабочий стол\lab1\svg.cpp +1685896777 source:c:\users\admin\onedrive\Рабочий стол\lab1\svg.cpp @@ -46,5 +46,5 @@ "svg.h" -1685271547 c:\users\admin\onedrive\Рабочий стол\lab1\svg.h +1685896776 c:\users\admin\onedrive\Рабочий стол\lab1\svg.h diff --git a/main.cpp b/main.cpp index 94cfea0..40cc40b 100644 --- a/main.cpp +++ b/main.cpp @@ -11,7 +11,7 @@ using namespace std; -struct Input { +/*struct Input { vector numbers; size_t bin_count{}; }; @@ -41,3 +41,37 @@ int main() show_histogram_svg(bins,min,max); return 0; } +*/ +struct Input { + vector numbers; + size_t bin_count{}; +}; + +Input +input_data(istream& in) +{ + size_t number_count; + cerr << "Enter number count: "; + in >> number_count; + Input ik; + ik.numbers.resize(number_count); + for (size_t i = 0; i < number_count; i++) + { + cin >> ik.numbers[i]; + } + cerr << "Enter bin count: "; + cin>> ik.bin_count; + return ik; +} + + + + +int main() +{ + auto in = input_data(cin); + auto bins = make_histogram(in.numbers, in.bin_count); + show_histogram_svg(bins); + getch(); + return 0; +} diff --git a/svg.cpp b/svg.cpp index 5d9d2b4..3767df5 100644 --- a/svg.cpp +++ b/svg.cpp @@ -6,7 +6,7 @@ #include "svg.h" using namespace std; -size_t k=0; +/*size_t k=0; float step(size_t& k, size_t bin_count, double min,double max){ float interval; @@ -70,3 +70,72 @@ show_histogram_svg(const vector& bins, double min,double max) { } svg_end(); } +*/ +void +svg_begin(double width, double height) +{ + cout << "\n"; + cout << "\n"; +} + +void +svg_end() +{ + cout << "\n"; +} + +void +svg_text(double left, double baseline, string text) +{ + cout << "" << text << ""; +} + +void +svg_rect(double x, double y, double width, double height, string stroke = "black", string fill = "black") +{ + cout << ""; + +} + + +void +show_histogram_svg(const vector& bins) +{ + const auto IMAGE_WIDTH = 400; + const auto IMAGE_HEIGHT = 300; + const auto TEXT_LEFT = 20; + const auto TEXT_BASELINE = 20; + const auto TEXT_WIDTH = 50; + const auto BIN_HEIGHT = 30; + const auto BLOCK_WIDTH = 10; + const auto BLACK = "black"; + const auto RED = "red"; + const auto MAX_WIDTH = IMAGE_WIDTH-TEXT_WIDTH; + + + svg_begin(IMAGE_WIDTH,IMAGE_HEIGHT); + + double top = 0; + double max_count = bins[0]; + for (size_t i = 0; i < bins.size(); i++) + { + if (max_count& bins,double min, double max); - +*/ +void +show_histogram_svg(const std::vector& bins); #endif // SVG_H_INCLUDED diff --git a/text.cpp b/text.cpp index 8ed839d..9193bf3 100644 --- a/text.cpp +++ b/text.cpp @@ -4,7 +4,7 @@ #include "text.h" #include using namespace std; -void show_histogram_text(vector bins, size_t bin_count ) { +/*void show_histogram_text(vector bins, size_t bin_count ) { for (size_t i = 0; i < bin_count; i++) { if (bins[i] < 100) { @@ -20,3 +20,52 @@ void show_histogram_text(vector bins, size_t bin_count ) { cout << "\n"; } } +*/ +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; + size_t i,j; + double max_count; + max_count = bins[0]; + for (i=0; i< bin_count; i++) + { + if (max_countmax_asterisk) + { + flag=true; + } + for (j = 0; j < bin_count; j++) + { + if (bins[j] < 100) + { + cout << " "; + } + if (bins[j] < 10) + { + cout << " "; + } + cout << bins[j] << "|"; + + if (flag) + { + height = max_asterisk * (static_cast(bins[j]) / max_count); + } + else + { + height=bins[j]; + } + for (i = 0; i < height; i++) + { + cout << "*"; + } + cout << endl; + } +} diff --git a/text.h b/text.h index 6779782..84881e6 100644 --- a/text.h +++ b/text.h @@ -2,7 +2,9 @@ #define TEXT_H_INCLUDED #include -void show_histogram_text(std::vector bins, size_t bin_count ); - +/*void show_histogram_text(std::vector bins, size_t bin_count ); +*/ +void +show_histogram_text(std::vector bins, size_t bin_count); #endif // TEXT_H_INCLUDED