From c93309c956598da50a1745d1632d209f153e2f04 Mon Sep 17 00:00:00 2001 From: MelnikovDM Date: Mon, 27 May 2024 15:24:03 +0300 Subject: [PATCH] build: corrections and uniq var --- labor01.cpp | 60 ++++++++++++++++++++++++-------------------------- svg.cpp | 63 +++++++++++++++++++++++++++++++---------------------- svg.h | 2 +- 3 files changed, 66 insertions(+), 59 deletions(-) diff --git a/labor01.cpp b/labor01.cpp index 40331b4..c083a7c 100644 --- a/labor01.cpp +++ b/labor01.cpp @@ -1,48 +1,42 @@ #include #include +#include +#include +#include #include "histogram.h" -#include #include "text.h" #include "svg.h" -#include -#include -#include using namespace std; -struct Input { + +struct Input +{ vector numbers; size_t bin_count{}; - vector colors; }; -Input -input_data(istream& inn, bool promt) { - if (promt == true) { - cerr << "Sovet:" << endl; - } - size_t number_count; - cerr << "Enter number_count: "; - inn >> number_count; + +Input input_data(istream& stream, bool prompt) { Input in; - cerr << "Enter numbers: "; + size_t number_count; + if (prompt) { + cerr << "Enter number count: "; + } + stream >> number_count; in.numbers.resize(number_count); for (size_t i = 0; i < number_count; i++) { - inn >> in.numbers[i]; + if (prompt) { + cerr << "Enter number " << i + 1 << ": "; + } + stream >> in.numbers[i]; } - cerr << "Enter bin_count: "; - inn >> in.bin_count; - in.colors.resize(in.bin_count); - sort(begin(in.numbers), end(in.numbers)); - in.numbers.erase(unique(begin(in.numbers), end(in.numbers)), end(in.numbers)); - number_count = in.numbers.size(); - cerr << "Enter colors: "; - for (size_t i = 0; i < in.bin_count; i++) { - inn >> in.colors[i]; + if (prompt) { + cerr << "Enter bin count: "; } + stream >> in.bin_count; return in; } - size_t write_data(void* items, size_t item_size, size_t item_count, void* ctx) { size_t data_size = item_size * item_count; @@ -57,21 +51,23 @@ download(const string& address) { CURL* curl = curl_easy_init(); if (curl) { CURLcode res; + double start; curl_easy_setopt(curl, CURLOPT_URL, address.c_str()); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data); curl_easy_setopt(curl, CURLOPT_WRITEDATA, &buffer); res = curl_easy_perform(curl); - if (res != CURLE_OK) { - cerr << curl_easy_strerror(res); - exit(1); + if (res == CURLE_OK) { + res = curl_easy_getinfo(curl, CURLINFO_STARTTRANSFER_TIME, &start); + if (CURLE_OK == res) { + cerr<<"Time: " << start; + } } curl_easy_cleanup(curl); } return input_data(buffer, false); } - -int main(int argc, char* argv[]) { + int main(int argc, char* argv[]) { Input input; if (argc > 1) { input = download(argv[1]); @@ -80,5 +76,5 @@ int main(int argc, char* argv[]) { input = input_data(cin, true); } const auto bins = make_histogram(input.numbers, input.bin_count); - show_histogram_svg(bins, input.colors); + show_histogram_svg(bins); } \ No newline at end of file diff --git a/svg.cpp b/svg.cpp index 26e2fe7..a6215de 100644 --- a/svg.cpp +++ b/svg.cpp @@ -1,19 +1,30 @@ #include #include #include -#include "svg_iternal.h" - +#include "svg.h" using namespace std; -void svg_text(double left, double baseline, string text) { +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 MAX_WIDTH = IMAGE_WIDTH - TEXT_WIDTH; + +void +svg_text(double left, double baseline, string text) { cout << "" << text << ""; } -void svg_rect(double x, double y, double width, double height, string stroke, string fill) { - cout << "\n"; +void +svg_rect(double x, double y, double width, double height, string stroke = "black", string fill = "aaaaaa") { + cout << "\n"; } -void svg_begin(double width, double height) { +void +svg_begin(double width, double height) { cout << "\n"; cout << "\n"; } -void svg_end() { +void +svg_end() { cout << "\n"; } -string check_color(const string& color) { - if (color.find(" ") == -1 || color.find('#') == 0) { - return color; +void +show_histogram_svg(const vector& bins) { + const auto MAX_WIDTH = IMAGE_WIDTH - TEXT_WIDTH; + size_t max_count = 0; + for (size_t x : bins) { + if (x > max_count) { + max_count = x; + } } - else { - return "black"; + if (max_count == 0) { + max_count = 1; + } + auto scale_factor = static_cast(MAX_WIDTH) / (max_count * BLOCK_WIDTH); + if (scale_factor > 1) { + scale_factor = 1; } -} - -void show_histogram_svg(const vector& bins, const vector& colors) { - 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; svg_begin(400, 300); double top = 0; - for (size_t j = 0; j < bins.size(); j++) { - const double bin_width = BLOCK_WIDTH * bins[j]; - svg_text(TEXT_LEFT, top + TEXT_BASELINE, to_string(bins[j])); - svg_rect(TEXT_WIDTH, top, bin_width, BIN_HEIGHT, check_color(colors[j]), "black"); + for (size_t bin : bins) { + double bin_width = BLOCK_WIDTH * bin * scale_factor; + svg_text(TEXT_LEFT, top + TEXT_BASELINE, to_string(bin)); + svg_rect(TEXT_WIDTH, top, bin_width, BIN_HEIGHT); top += BIN_HEIGHT; } svg_end(); diff --git a/svg.h b/svg.h index 3a7e6b5..85ee392 100644 --- a/svg.h +++ b/svg.h @@ -4,6 +4,6 @@ #include void -show_histogram_svg(const std::vector& bins, const std::vector& colors); +show_histogram_svg(const std::vector& bins); #endif // SVG_H_INCLUDED \ No newline at end of file