Сравнить коммиты
	
		
			2 Коммитов 
		
	
	
		
			bdd81ee9f0
			...
			a19e2ec179
		
	
	| Автор | SHA1 | Дата | 
|---|---|---|
| 
							
							
								
								 | 
						a19e2ec179 | 6 месяцев назад | 
| 
							
							
								
								 | 
						a8255653ea | 6 месяцев назад | 
@ -0,0 +1,44 @@
 | 
				
			|||||||
 | 
					#include <iostream>
 | 
				
			||||||
 | 
					#include <vector>
 | 
				
			||||||
 | 
					#include "text.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					using namespace std;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					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 max_bin = bins[0];
 | 
				
			||||||
 | 
					    for(size_t i = 0; i < bin_count; i++)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        if(bins[i] > max_bin)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            max_bin = bins[i];
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for (size_t bin: bins)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        size_t height = bin;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (max_bin > MAX_ASTERISK)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					          height = MAX_ASTERISK * (static_cast<double>(bin) / max_bin);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (bin < 100)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            cout << ' ';
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        if (bin < 10)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            cout << ' ';
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        cout << bin << "|";
 | 
				
			||||||
 | 
					        for(size_t i = 0; i < height; i++)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            cout << "*";
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        cout << endl;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -0,0 +1,41 @@
 | 
				
			|||||||
 | 
					#include "histogram.h"
 | 
				
			||||||
 | 
					#include "histogram_internal.h"
 | 
				
			||||||
 | 
					bool find_minmax(vector<double> vec, double& min, double& max) {
 | 
				
			||||||
 | 
					    if(vec.size() == 0){
 | 
				
			||||||
 | 
					        return false;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					        min = vec[0];
 | 
				
			||||||
 | 
					        max = vec[0];
 | 
				
			||||||
 | 
					        for (double x : vec) {
 | 
				
			||||||
 | 
					            if (x < min) {
 | 
				
			||||||
 | 
					                min = x;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            else if (x > max)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                max = x;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    return true;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					vector<size_t> make_histogram(size_t number, vector<double> vec) {
 | 
				
			||||||
 | 
					    vector<size_t> bins(number);
 | 
				
			||||||
 | 
					    double mn, mx;
 | 
				
			||||||
 | 
					    find_minmax(vec, mn, mx);
 | 
				
			||||||
 | 
					    float bin_size = (mx - mn) / number;
 | 
				
			||||||
 | 
					    for (size_t i = 0; i < vec.size(); i++) {
 | 
				
			||||||
 | 
					        bool fl = false;
 | 
				
			||||||
 | 
					        for (size_t j = 0; (j < number - 1) && !fl; j++) {
 | 
				
			||||||
 | 
					            auto lo = mn + j * bin_size;
 | 
				
			||||||
 | 
					            auto hi = mn + (j + 1) * bin_size;
 | 
				
			||||||
 | 
					            if ((lo <= vec[i]) && (vec[i] < hi)) {
 | 
				
			||||||
 | 
					                bins[j]++;
 | 
				
			||||||
 | 
					                fl = true;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        if (!fl) {
 | 
				
			||||||
 | 
					            bins[number - 1]++;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return bins;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -0,0 +1,4 @@
 | 
				
			|||||||
 | 
					#include <vector>
 | 
				
			||||||
 | 
					#include <iostream>
 | 
				
			||||||
 | 
					using namespace std;
 | 
				
			||||||
 | 
					vector<size_t> make_histogram(size_t number, vector<double> vec);
 | 
				
			||||||
@ -0,0 +1 @@
 | 
				
			|||||||
 | 
					bool find_minmax(const std::vector<double> vec, double& min, double& max);
 | 
				
			||||||
@ -1,9 +1,25 @@
 | 
				
			|||||||
#include <iostream>
 | 
					#include "histogram.h"
 | 
				
			||||||
 | 
					#include "text.h"
 | 
				
			||||||
 | 
					#include "svg.h"
 | 
				
			||||||
 | 
					struct Input {
 | 
				
			||||||
 | 
					    vector<double> vec;
 | 
				
			||||||
 | 
					    size_t korz{};
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					Input input_data() {
 | 
				
			||||||
 | 
					    Input in;
 | 
				
			||||||
 | 
					    size_t n, korz;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
using namespace std;
 | 
					    cerr << "Number of elem ";
 | 
				
			||||||
 | 
					    cin >> n;
 | 
				
			||||||
int main()
 | 
					    in.vec.resize(n);
 | 
				
			||||||
{
 | 
					    for (size_t i = 0; i < n; i++)
 | 
				
			||||||
    cout << "Hello world!" << endl;
 | 
					        cin >> in.vec[i];
 | 
				
			||||||
    return 0;
 | 
					    cerr << "Enter bin count: ";
 | 
				
			||||||
 | 
					    cin >> in.korz;
 | 
				
			||||||
 | 
					    return in;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					int main() {
 | 
				
			||||||
 | 
					    auto in = input_data();
 | 
				
			||||||
 | 
					    auto bins = make_histogram(in.korz, in.vec);
 | 
				
			||||||
 | 
					    show_histogram_svg(bins);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -0,0 +1,77 @@
 | 
				
			|||||||
 | 
					#include "svg.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					using namespace std;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					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 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)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        const auto RED = "#" + std::to_string(int(ceil(10 - (bin * 9) / max_count))) + std::to_string(int(ceil(10 - (bin * 9) / max_count))) + std::to_string(int(ceil(10 - (bin * 9) / max_count)));
 | 
				
			||||||
 | 
					        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();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -0,0 +1,6 @@
 | 
				
			|||||||
 | 
					#include <iostream>
 | 
				
			||||||
 | 
					#include <vector>
 | 
				
			||||||
 | 
					#include <string>
 | 
				
			||||||
 | 
					#include <math.h>
 | 
				
			||||||
 | 
					using namespace std;
 | 
				
			||||||
 | 
					void show_histogram_svg(const vector<size_t>& bins);
 | 
				
			||||||
@ -0,0 +1,44 @@
 | 
				
			|||||||
 | 
					#include <iostream>
 | 
				
			||||||
 | 
					#include <vector>
 | 
				
			||||||
 | 
					#include "text.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					using namespace std;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					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 max_bin = bins[0];
 | 
				
			||||||
 | 
					    for(size_t i = 0; i < bin_count; i++)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        if(bins[i] > max_bin)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            max_bin = bins[i];
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for (size_t bin: bins)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        size_t height = bin;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (max_bin > MAX_ASTERISK)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					          height = MAX_ASTERISK * (static_cast<double>(bin) / max_bin);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (bin < 100)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            cout << ' ';
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        if (bin < 10)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            cout << ' ';
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        cout << bin << "|";
 | 
				
			||||||
 | 
					        for(size_t i = 0; i < height; i++)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            cout << "*";
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        cout << endl;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -0,0 +1,3 @@
 | 
				
			|||||||
 | 
					#include <iostream>
 | 
				
			||||||
 | 
					#include <vector>
 | 
				
			||||||
 | 
					void show_histogram_text(std::vector<size_t> bins);
 | 
				
			||||||
@ -0,0 +1,37 @@
 | 
				
			|||||||
 | 
					#define DOCTEST_CONFIG_NO_MULTITHREADING
 | 
				
			||||||
 | 
					#define DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN
 | 
				
			||||||
 | 
					#include "doctest.h"
 | 
				
			||||||
 | 
					#include "histogram_internal.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEST_CASE("distinct positive numbers") {
 | 
				
			||||||
 | 
					    double min = 0;
 | 
				
			||||||
 | 
					    double max = 0;
 | 
				
			||||||
 | 
					    find_minmax({1, 2}, min, max);
 | 
				
			||||||
 | 
					    CHECK(min == 1);
 | 
				
			||||||
 | 
					    CHECK(max == 2);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					TEST_CASE("distinct negative numbers"){
 | 
				
			||||||
 | 
					    double min = 0;
 | 
				
			||||||
 | 
					    double max = 0;
 | 
				
			||||||
 | 
					    find_minmax({-1, -2}, min, max);
 | 
				
			||||||
 | 
					    CHECK(min == -2);
 | 
				
			||||||
 | 
					    CHECK(max == -1);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					TEST_CASE("vector of the same elements"){
 | 
				
			||||||
 | 
					    double min = 0;
 | 
				
			||||||
 | 
					    double max = 0;
 | 
				
			||||||
 | 
					    find_minmax({3,3,3}, min, max);
 | 
				
			||||||
 | 
					    CHECK(min == 3);
 | 
				
			||||||
 | 
					    CHECK(max == 3);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					TEST_CASE("empty vector"){
 | 
				
			||||||
 | 
					    double min = 0;
 | 
				
			||||||
 | 
					    double max = 0;
 | 
				
			||||||
 | 
					    CHECK(!find_minmax({}, min, max));
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					TEST_CASE("vector of one elements"){
 | 
				
			||||||
 | 
					    double min = 0;
 | 
				
			||||||
 | 
					    double max = 0;
 | 
				
			||||||
 | 
					    find_minmax({3}, min, max);
 | 
				
			||||||
 | 
					    CHECK(min == max);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
					Загрузка…
					
					
				
		Ссылка в новой задаче