From 21c4ae3caf11fe28a59b6714ac4102f5d1dcd30c Mon Sep 17 00:00:00 2001 From: LedovskojMM <LedovskoyMM@mpei.ru> Date: Sun, 4 Jun 2023 19:41:06 +0300 Subject: [PATCH] =?UTF-8?q?=D1=81=D0=B4=D0=B5=D0=BB=D0=B0=D1=82=D1=8C=20in?= =?UTF-8?q?put=5Fdata?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- histogam.cpp | 51 +++++++++++++++++++++++++++++++- histogam.h | 6 ++-- histogam_internal.h | 4 ++- lab1.depend | 16 +++++----- main.cpp | 36 ++++++++++++++++++++++- svg.cpp | 71 ++++++++++++++++++++++++++++++++++++++++++++- svg.h | 6 ++-- text.cpp | 51 +++++++++++++++++++++++++++++++- text.h | 6 ++-- 9 files changed, 228 insertions(+), 19 deletions(-) diff --git a/histogam.cpp b/histogam.cpp index ca73087..d2c9e3e 100644 --- a/histogam.cpp +++ b/histogam.cpp @@ -6,7 +6,7 @@ #include <conio.h> using namespace std; -void find_minmax(vector<double> numbers, double& min, double& max) { +/*void find_minmax(vector<double> 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<size_t> make_histogram(const vector<double>& numbers, size_t bin_count) { } return bins; } +*/ +void find_minmax(vector<double> 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<size_t> make_histogram (vector<double> numbers, size_t bin_count) +{ + double min; + double max; + find_minmax (numbers, min, max); + double bin_size = (max - min) / bin_count; + vector<size_t> 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 <vector> -std::vector<size_t> +/*std::vector<size_t> make_histogram(const std::vector<double>& numbers, size_t bin_count); - +*/ +std::vector<size_t> +make_histogram(const std::vector<double> 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 <vector> +/* +void find_minmax(std::vector<double> numbers, double& min, double& max); +*/ void find_minmax(std::vector<double> 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 @@ <iostream> <vector> -1685271547 source:c:\users\admin\onedrive\������� ����\lab1\main.cpp +1685895850 source:c:\users\admin\onedrive\������� ����\lab1\main.cpp <iostream> <vector> <cmath> @@ -14,10 +14,10 @@ <conio.h> "histogam_internal.h" -1682273839 c:\users\admin\onedrive\������� ����\lab1\histogam.h +1685896776 c:\users\admin\onedrive\������� ����\lab1\histogam.h <vector> -1682280773 source:c:\users\admin\onedrive\������� ����\lab1\histogam.cpp +1685896777 source:c:\users\admin\onedrive\������� ����\lab1\histogam.cpp <iostream> <vector> <cmath> @@ -25,20 +25,20 @@ "histogam_internal.h" <conio.h> -1682280773 source:c:\users\admin\onedrive\������� ����\lab1\text.cpp +1685896776 source:c:\users\admin\onedrive\������� ����\lab1\text.cpp <iostream> <vector> <cmath> "text.h" <conio.h> -1682273447 c:\users\admin\onedrive\������� ����\lab1\text.h +1685896777 c:\users\admin\onedrive\������� ����\lab1\text.h <vector> -1682273796 c:\users\admin\onedrive\������� ����\lab1\histogam_internal.h +1685896777 c:\users\admin\onedrive\������� ����\lab1\histogam_internal.h <vector> -1682339808 source:c:\users\admin\onedrive\������� ����\lab1\svg.cpp +1685896777 source:c:\users\admin\onedrive\������� ����\lab1\svg.cpp <math.h> <iostream> <conio.h> @@ -46,5 +46,5 @@ <string> "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<double> numbers; size_t bin_count{}; }; @@ -41,3 +41,37 @@ int main() show_histogram_svg(bins,min,max); return 0; } +*/ +struct Input { + vector<double> 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<size_t>& bins, double min,double max) { } svg_end(); } +*/ +void +svg_begin(double width, double height) +{ + cout << "<?xml version='1.0' encoding='UTF-8'?>\n"; + cout << "<svg "; + cout << "width='" << width << "' "; + cout << "height='" << height << "' "; + cout << "viewBox='0 0 " << width << " " << height << "' "; + cout << "xmlns='http://www.w3.org/2000/svg'>\n"; +} + +void +svg_end() +{ + cout << "</svg>\n"; +} + +void +svg_text(double left, double baseline, string text) +{ + cout << "<text x='" << left << "' y='" << baseline << "'>" << text << "</text>"; +} + +void +svg_rect(double x, double y, double width, double height, string stroke = "black", string fill = "black") +{ + cout << "<rect x='"<<x<<"' y='"<<y<<"' width='"<<width<<"' height='"<<height<<"' stroke='"<<stroke<<"' fill='"<<fill<<"' />"; + +} + + +void +show_histogram_svg(const vector<size_t>& 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[i]) + { + max_count=bins[i]; + } + } + + for (size_t bin : bins) + { + double bin_width = (MAX_WIDTH)*(bin/max_count); + svg_text(TEXT_LEFT, top + TEXT_BASELINE, to_string(bin)); + svg_rect(TEXT_WIDTH, top, bin_width, BIN_HEIGHT, BLACK, RED); + top += BIN_HEIGHT; + } + + svg_end(); +} diff --git a/svg.h b/svg.h index 75b2256..b06353d 100644 --- a/svg.h +++ b/svg.h @@ -1,7 +1,9 @@ #ifndef SVG_H_INCLUDED #define SVG_H_INCLUDED -void +/*void show_histogram_svg(const std::vector<size_t>& bins,double min, double max); - +*/ +void +show_histogram_svg(const std::vector<size_t>& 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 <conio.h> using namespace std; -void show_histogram_text(vector <size_t> bins, size_t bin_count ) { +/*void show_histogram_text(vector <size_t> 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 <size_t> bins, size_t bin_count ) { cout << "\n"; } } +*/ +void show_histogram_text(vector<size_t> 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_count<bins[i]) + { + max_count=bins[i]; + } + } + + size_t height; + bool flag = false; + if(max_count>max_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<double>(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 <vector> -void show_histogram_text(std::vector <size_t> bins, size_t bin_count ); - +/*void show_histogram_text(std::vector <size_t> bins, size_t bin_count ); +*/ +void +show_histogram_text(std::vector<size_t> bins, size_t bin_count); #endif // TEXT_H_INCLUDED