Сравнить коммиты

..

16 Коммитов

Автор SHA1 Сообщение Дата
235345646546
61cb5628b1 Merge branch 'main' of http://uit.mpei.ru/git/DolganovVI/cs-lab34 2025-05-05 01:28:29 +03:00
31d9eed759 code: добавлен вывод 2025-05-05 01:22:21 +03:00
f4630d7ab9 code: исправления мелкие 2025-05-05 01:22:04 +03:00
235345646546
75680b6dbf code: файл проекта с тестами 2025-05-05 01:16:50 +03:00
235345646546
0b036581a4 code: библиотека для тестов 2025-05-05 01:15:42 +03:00
235345646546
b0edf2568c code: для работы тестов 2025-05-05 01:15:16 +03:00
235345646546
dbfc506d98 code: для работы теста 2025-05-05 01:14:11 +03:00
d95be10161 code: фуннкции для вывода 2025-05-05 01:12:25 +03:00
3e42f19403 code: заголовочный файл для text 2025-05-05 01:12:06 +03:00
7e5ef3b1b3 code: фуннкции для построенния гистограммы 2025-05-05 01:11:20 +03:00
dbe45a69e0 code: заголовочный файл для svg 2025-05-05 01:10:59 +03:00
23d34a88a5 code: заголовочный файл для histogramm 2025-05-05 01:10:33 +03:00
312f8066c3 code: фуннкции для определения значений для построенния гистограммы 2025-05-05 01:06:24 +03:00
235345646546
b662a0b0e2 code: добавлены тесты 2025-05-05 00:50:48 +03:00
2633ce2005 code: Добавлен файл для тестов 2025-04-28 00:43:15 +03:00
89d83a8b0b code: Добавлена структура и подпрограммы 2025-04-27 23:29:46 +03:00
12 изменённых файлов: 7377 добавлений и 72 удалений

7106
doctest.h Обычный файл

Разница между файлами не показана из-за своего большого размера Загрузить разницу

39
histogram.cpp Обычный файл
Просмотреть файл

@@ -0,0 +1,39 @@
#include "histogram.h"
#include <vector>
void find_minmax(const std::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;
}
}
}
std::vector<size_t> make_histogram(const std::vector<double>& numbers, size_t bin_count)
{
double min, max;
find_minmax(numbers, min, max);
std::vector<size_t> bins(bin_count);
double bin_size = (max - min) / bin_count;
for (double num : numbers) {
bool found = false;
for (size_t j = 0; j < bin_count - 1 && !found; j++) {
double lo = min + j * bin_size;
double hi = min + (j + 1) * bin_size;
if (lo <= num && num < hi) {
bins[j]++;
found = true;
}
}
if (!found) {
bins[bin_count - 1]++;
}
}
return bins;
}

8
histogram.h Обычный файл
Просмотреть файл

@@ -0,0 +1,8 @@
#ifndef HISTOGRAM_H_INCLUDED
#define HISTOGRAM_H_INCLUDED
#include <vector>
std::vector<size_t> make_histogram(const std::vector<double>& numbers, size_t bin_count);
#endif // HISTOGRAM_H_INCLUDED

8
histogram_internal.h Обычный файл
Просмотреть файл

@@ -0,0 +1,8 @@
#ifndef HISTOGRAM_INTERNAL_H_INCLUDED
#define HISTOGRAM_INTERNAL_H_INCLUDED
#include <vector>
void find_minmax(const std::vector<double>& numbers, double& min, double& max);
#endif // HISTOGRAM_INTERNAL_H_INCLUDED

Просмотреть файл

@@ -1,79 +1,35 @@
#include <iostream>
#include "histogram.h"
#include "text.h"
#include "svg.h"
#include <iostream>
#include <vector>
using namespace std;
const size_t SCREEN_WIDTH = 80;
const size_t MAX_ASTERISK = SCREEN_WIDTH - 3 - 1;
struct Input {
vector<double> numbers;
size_t bin_count{};
};
Input
input_data() {
size_t number_count;
cin >> number_count;
Input in;
in.numbers.resize(number_count);
for (size_t i = 0; i < number_count; i++) {
cin >> in.numbers[i];
}
cin >> in.bin_count;
return in;
}
int main()
{
size_t number_count;
cout << "Enter number count: ";
cin >> number_count;
vector<double> numbers(number_count);
for (int i = 0; i < number_count; i++) {
cin >> numbers[i];
}
size_t bin_count;
cout << "Enter bin count: ";
cin >> bin_count;
vector<size_t> bins(bin_count);
double min = numbers[0];
double max = numbers[0];
for (double x : numbers) {
if (x < min) {
min = x;
}
else if (x > max) {
max = x;
}
}
double bin_size = (max - min) / bin_count;
for (size_t i = 0; i < number_count; 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]++;
}
}
double max_count = bins[0];
for (double x : bins) {
if (x > max_count) {
max_count = x;
}
}
size_t height;
bool flag = true;
for (size_t j = 0; j < bin_count; j++) {
if (bins[j] < 100) {
cout << " ";
}
if (bins[j] < 10) {
cout << " ";
}
cout << bins[j] << "|";
if (max_count > MAX_ASTERISK) {
for (size_t i = 0; i < bins[j]; i++) {
if (bins[j] != MAX_ASTERISK && flag) {
double count = bins[j];
height = MAX_ASTERISK * (static_cast<double>(count) / max_count);
bins[j] = height;
flag = false;
}
}
}
for (size_t i = 0; i < bins[j]; i++) {
cout << "*";
}
cout << endl;
flag = true;
}
}
Input in = input_data();
auto bins = make_histogram(in.numbers, in.bin_count);
show_histogram_svg(bins);
return 0;
}

Просмотреть файл

@@ -1,7 +1,7 @@
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.13.35919.96 d17.13
VisualStudioVersion = 17.13.35919.96
MinimumVisualStudioVersion = 10.0.40219.1
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mpei", "mpei.vcxproj", "{3F915897-865A-46B2-93EB-362990D3FBC2}"
EndProject

57
svg.cpp Обычный файл
Просмотреть файл

@@ -0,0 +1,57 @@
#include "svg.h"
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
void svg_begin(double width, double height) {
cout << "<?xml version='1.0' encoding='UTF-8'?>\n";
cout << "<svg width='" << width << "' height='" << height << "' "
<< "viewBox='0 0 " << width << " " << height << "' "
<< "xmlns='http://www.w3.org/2000/svg'>\n";
}
void svg_end() {
cout << "</svg>\n";
}
void svg_text(double left, double baseline, const string& text) {
cout << "<text x='" << left << "' y='" << baseline << "'>"
<< text << "</text>\n";
}
void svg_rect(double x, double y, double width, double height,
const string& stroke, const string& fill) {
cout << "<rect x='" << x << "' y='" << y << "' "
<< "width='" << width << "' height='" << height << "' "
<< "stroke='" << stroke << "' fill='" << fill << "'/>\n";
}
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 MAX_BIN_WIDTH = IMAGE_WIDTH - TEXT_WIDTH - 10;
svg_begin(IMAGE_WIDTH, IMAGE_HEIGHT);
// Íàõîäèì ìàêñèìàëüíîå çíà÷åíèå â êîðçèíàõ äëÿ ìàñøòàáèðîâàíèÿ
size_t max_count = *max_element(bins.begin(), bins.end());
double scaling_factor = max_count > 0 ?
static_cast<double>(MAX_BIN_WIDTH) / max_count : 1.0;
double top = 0;
for (size_t bin : bins) {
const double bin_width = bin * scaling_factor;
svg_text(TEXT_LEFT, top + TEXT_BASELINE, to_string(bin));
svg_rect(TEXT_WIDTH, top, bin_width, BIN_HEIGHT,
"#2ecc71", "#27ae60"); // Çåë¸íûå ñòîëáöû (ñâåòëûé è ò¸ìíûé îòòåíêè)
top += BIN_HEIGHT;
}
svg_end();
}

13
svg.h Обычный файл
Просмотреть файл

@@ -0,0 +1,13 @@
#ifndef SVG_H_INCLUDED
#define SVG_H_INCLUDED
#include <vector>
#include <string>
void svg_begin(double width, double height);
void svg_end();
void svg_text(double left, double baseline, const std::string& text);
void svg_rect(double x, double y, double width, double height, const std::string& stroke = "black", const std::string& fill = "black");
void show_histogram_svg(const std::vector<size_t>& bins);
#endif // SVG_H_INCLUDED

40
text.cpp Обычный файл
Просмотреть файл

@@ -0,0 +1,40 @@
#include "text.h"
#include <iostream>
#include <vector>
void show_histogram_text(std::vector<size_t> bins, size_t bin_count)
{
const size_t SCREEN_WIDTH = 80;
const size_t MAX_ASTERISK = SCREEN_WIDTH - 3 - 1;
double max_count = bins[0];
for (double x : bins) {
if (x > max_count) {
max_count = x;
}
}
size_t height;
bool flag = true;
for (size_t j = 0; j < bin_count; j++) {
if (bins[j] < 100) {
std::cout << " ";
}
if (bins[j] < 10) {
std::cout << " ";
}
std::cout << bins[j] << "|";
if (max_count > MAX_ASTERISK) {
for (size_t i = 0; i < bins[j]; i++) {
if (bins[j] != MAX_ASTERISK && flag) {
double count = bins[j];
height = MAX_ASTERISK * (static_cast<double>(count) / max_count);
bins[j] = height;
flag = false;
}
}
}
for (size_t i = 0; i < bins[j]; i++) {
std::cout << "*";
}
std::cout << std::endl;
flag = true;
}
}

8
text.h Обычный файл
Просмотреть файл

@@ -0,0 +1,8 @@
#ifndef TEXT_H_INCLUDED
#define TEXT_H_INCLUDED
#include <vector>
void show_histogram_text(const std::vector<size_t> bins, size_t bin_count);
#endif // TEXT_H_INCLUDED

39
unittest.cpp Обычный файл
Просмотреть файл

@@ -0,0 +1,39 @@
#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("Identical numbers") {
double min = 0, max = 0;
find_minmax({ 5, 5, 5 }, min, max);
CHECK(min == 5);
CHECK(max == 5);
}
TEST_CASE("Empty vector") {
double min = 42, max = 42;
find_minmax({}, min, max);
CHECK(min == 42);
CHECK(max == 42);
}
TEST_CASE("Single element") {
double min = 0, max = 0;
find_minmax({ 42 }, min, max);
CHECK(min == 42);
CHECK(max == 42);
}
TEST_CASE("Negative numbers") {
double min = 0, max = 0;
find_minmax({ -3, -1, -2 }, min, max);
CHECK(min == -3);
CHECK(max == -1);
}

31
unittest.sln Обычный файл
Просмотреть файл

@@ -0,0 +1,31 @@
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.13.35919.96 d17.13
MinimumVisualStudioVersion = 10.0.40219.1
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "unittest", "unittest.vcxproj", "{D377E954-A910-442F-89B7-380240614335}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|x64 = Debug|x64
Debug|x86 = Debug|x86
Release|x64 = Release|x64
Release|x86 = Release|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{D377E954-A910-442F-89B7-380240614335}.Debug|x64.ActiveCfg = Debug|x64
{D377E954-A910-442F-89B7-380240614335}.Debug|x64.Build.0 = Debug|x64
{D377E954-A910-442F-89B7-380240614335}.Debug|x86.ActiveCfg = Debug|Win32
{D377E954-A910-442F-89B7-380240614335}.Debug|x86.Build.0 = Debug|Win32
{D377E954-A910-442F-89B7-380240614335}.Release|x64.ActiveCfg = Release|x64
{D377E954-A910-442F-89B7-380240614335}.Release|x64.Build.0 = Release|x64
{D377E954-A910-442F-89B7-380240614335}.Release|x86.ActiveCfg = Release|Win32
{D377E954-A910-442F-89B7-380240614335}.Release|x86.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {33670898-B3DF-4CA9-BB8F-B62E319D4269}
EndGlobalSection
EndGlobal