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