защита 3 лабы
Этот коммит содержится в:
30
main.cpp
30
main.cpp
@@ -3,41 +3,41 @@
|
|||||||
#include "histogram.h"
|
#include "histogram.h"
|
||||||
#include "text.h"
|
#include "text.h"
|
||||||
#include "svg.h"
|
#include "svg.h"
|
||||||
#include <curl/curl.h>
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
struct Input {
|
struct Input {
|
||||||
vector<double> numbers;
|
vector<double> numbers;
|
||||||
size_t bin_count;
|
size_t bin_count;
|
||||||
|
size_t scale_step;
|
||||||
};
|
};
|
||||||
|
|
||||||
Input input_data(istream& in, bool prompt) {
|
Input input_data() {
|
||||||
Input inp;
|
Input in;
|
||||||
size_t number_count;
|
size_t number_count;
|
||||||
if (prompt){
|
|
||||||
cerr << "Enter number count: ";
|
cerr << "Enter number count: ";
|
||||||
}
|
|
||||||
cin >> number_count;
|
cin >> number_count;
|
||||||
|
|
||||||
inp.numbers.resize(number_count);
|
in.numbers.resize(number_count);
|
||||||
if (prompt){
|
|
||||||
cerr << "Enter numbers: ";
|
cerr << "Enter numbers: ";
|
||||||
}
|
|
||||||
for (size_t i = 0; i < number_count; i++) {
|
for (size_t i = 0; i < number_count; i++) {
|
||||||
cin >> inp.numbers[i];
|
cin >> in.numbers[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
if (prompt) {
|
|
||||||
cerr << "Enter bin count: ";
|
cerr << "Enter bin count: ";
|
||||||
|
cin >> in.bin_count;
|
||||||
|
|
||||||
|
cerr << "Enter scale step (2-9): ";
|
||||||
|
cin >> in.scale_step;
|
||||||
|
if (in.scale_step < 2 || in.scale_step > 9) {
|
||||||
|
cerr << "ERROR: Invalid scale step\n";
|
||||||
}
|
}
|
||||||
cin >> inp.bin_count;
|
|
||||||
return inp;
|
return in;
|
||||||
}
|
}
|
||||||
|
|
||||||
int main() {
|
int main() {
|
||||||
curl_global_init(CURL_GLOBAL_ALL);
|
auto in = input_data();
|
||||||
auto in = input_data(cin, true);
|
|
||||||
auto bins = make_histogram(in.numbers, in.bin_count);
|
auto bins = make_histogram(in.numbers, in.bin_count);
|
||||||
show_histogram_svg(bins);
|
show_histogram_svg(bins, in.scale_step);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
29
svg.cpp
29
svg.cpp
@@ -27,7 +27,32 @@ void svg_rect(double x, double y, double width, double height, string stroke = "
|
|||||||
<< "' stroke='" << stroke << "' fill='" << fill << "' />\n";
|
<< "' stroke='" << stroke << "' fill='" << fill << "' />\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
void show_histogram_svg(const vector<size_t>& bins) {
|
void draw_scale(double width, double height, double max_width, size_t step, double min, double max) {
|
||||||
|
const double BLOCK_WIDTH = 10;
|
||||||
|
const double SCALE_HEIGHT = 30;
|
||||||
|
const double TEXT_OFFSET = 20;
|
||||||
|
|
||||||
|
double scale_width = max_width;
|
||||||
|
double scale_x = width - max_width;
|
||||||
|
double scale_y = height - SCALE_HEIGHT;
|
||||||
|
|
||||||
|
svg_rect(scale_x, scale_y, scale_width, 2, "black", "black");
|
||||||
|
|
||||||
|
double step_size = scale_width / step;
|
||||||
|
for (size_t i = 0; i <= step; i++) {
|
||||||
|
double mark_x = scale_x + i * step_size;
|
||||||
|
svg_rect(mark_x, scale_y, 2, 10, "black", "black");
|
||||||
|
|
||||||
|
double value = min + (max - min) * i / step;
|
||||||
|
string label = to_string(value);
|
||||||
|
if (label.size() > 4) {
|
||||||
|
label = label.substr(0, 4);
|
||||||
|
}
|
||||||
|
svg_text(mark_x - 10, scale_y + TEXT_OFFSET, label);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void show_histogram_svg(const vector<size_t>& bins, size_t scale_step) {
|
||||||
if (bins.empty()) {
|
if (bins.empty()) {
|
||||||
cerr << "Error: Empty bins vector\n";
|
cerr << "Error: Empty bins vector\n";
|
||||||
return;
|
return;
|
||||||
@@ -58,5 +83,7 @@ void show_histogram_svg(const vector<size_t>& bins) {
|
|||||||
top += BIN_HEIGHT;
|
top += BIN_HEIGHT;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
draw_scale(IMAGE_WIDTH, IMAGE_HEIGHT, MAX_WIDTH, scale_step, 0, max_count);
|
||||||
|
|
||||||
svg_end();
|
svg_end();
|
||||||
}
|
}
|
||||||
|
|||||||
4
svg.h
4
svg.h
@@ -2,8 +2,8 @@
|
|||||||
#define SVG_H_INCLUDED
|
#define SVG_H_INCLUDED
|
||||||
|
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <cstddef> // Äëÿ size_t
|
#include <cstddef>
|
||||||
|
|
||||||
void show_histogram_svg(const std::vector<size_t>& bins);
|
void show_histogram_svg(const std::vector<size_t>& bins, size_t scale_step);
|
||||||
|
|
||||||
#endif // SVG_H_INCLUDED
|
#endif // SVG_H_INCLUDED
|
||||||
|
|||||||
Ссылка в новой задаче
Block a user