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

...

11 Коммитов

Автор SHA1 Сообщение Дата
81ff18f02d code:portection[6] 2025-05-02 13:22:42 +03:00
f37d1cd25c code:finished[5] 2025-05-02 12:13:26 +03:00
332a78f708 code:scaling[5] 2025-05-01 15:29:26 +03:00
a60b3a0445 code:scaling[5] 2025-05-01 14:27:39 +03:00
adcd8e719a code:svg_output_rectangle3.0[5] 2025-05-01 02:15:59 +03:00
76c58a3c2e code:svg_output_rectangle2.0[5] 2025-05-01 02:03:41 +03:00
e28c2321bc code:svg_output_rectangle[5] 2025-05-01 01:59:19 +03:00
f7e2afa797 code:svg_3[5] 2025-05-01 01:51:34 +03:00
30a95a6811 code:svg_2[5] 2025-05-01 01:46:49 +03:00
c7252e212a code:svg_1[5] 2025-05-01 01:25:36 +03:00
3a489a685e code:test[4] 2025-04-29 23:37:47 +03:00
12 изменённых файлов: 7334 добавлений и 17 удалений

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

@@ -13,7 +13,11 @@
<Option compiler="gcc" />
<Compiler>
<Add option="-g" />
<Add directory="include" />
</Compiler>
<Linker>
<Add option="-static-libstdc++" />
</Linker>
</Target>
<Target title="Release">
<Option output="bin/Release/Lab1" prefix_auto="1" extension_auto="1" />
@@ -22,6 +26,7 @@
<Option compiler="gcc" />
<Compiler>
<Add option="-O2" />
<Add directory="include" />
</Compiler>
<Linker>
<Add option="-s" />
@@ -32,7 +37,26 @@
<Add option="-Wall" />
<Add option="-fexceptions" />
</Compiler>
<Unit filename="histogram.cpp">
<Option target="Debug" />
</Unit>
<Unit filename="histogram.h">
<Option target="Debug" />
</Unit>
<Unit filename="histogram_internal.h">
<Option target="&lt;{~None~}&gt;" />
</Unit>
<Unit filename="main.cpp" />
<Unit filename="prot.cpp" />
<Unit filename="prot.h" />
<Unit filename="svg.cpp" />
<Unit filename="svg.h" />
<Unit filename="text.cpp">
<Option target="Debug" />
</Unit>
<Unit filename="text.h">
<Option target="Debug" />
</Unit>
<Extensions>
<lib_finder disable_auto="1" />
</Extensions>

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

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

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

@@ -26,9 +26,13 @@ std::vector<size_t> make_histogram(std::vector<double> numbers, size_t bin_count
}
static void find_minmax(std::vector<double> numbers, double& min, double& max) {
bool find_minmax(std::vector<double> numbers, double& min, double& max) {
if(numbers.size()==0){
return false;
}
min = numbers[0];
max = numbers[0];
for (double number : numbers) {
if (min > number) {
min = number;
@@ -37,5 +41,5 @@ static void find_minmax(std::vector<double> numbers, double& min, double& max) {
max = number;
}
}
return;
return true;
}

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

@@ -4,7 +4,7 @@
#include <vector>
static void find_minmax(std::vector<double> numbers, double& min, double& max);
bool find_minmax(std::vector<double> numbers, double& min, double& max);
std::vector<size_t> make_histogram(std::vector<double> numbers, size_t bin_count);
#endif // HISTOGRAM_H_INCLUDED

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

@@ -1,49 +1,48 @@
using namespace std;
#include "histogram.h"
#include "text.h"
#include "svg.h"
#include "prot.h"
#include <cstdio>
struct Input {
std::vector<double> numbers;
size_t bin_count{};
int width;
};
Input input_data();
int main()
{
Input in = input_data();
std::vector<size_t> bins = make_histogram(in.numbers, in.bin_count);
show_histogram_text(bins, in.bin_count);
show_histogram_svg(bins, in.width);
return 0;
}
Input input_data() {
Input input_struct;
size_t countOfNumbers;
cerr << "Input your count of numbers:\n";
cin >> countOfNumbers;
input_struct.numbers.resize(countOfNumbers);
cerr << "Input bin count:\n";
cin >> input_struct.bin_count;
cerr << "Input numbers:\n";
for (int i = 0; i < countOfNumbers; i++) {
cerr << i << ":" << endl;
cin >> input_struct.numbers[i];
}
cerr << endl;
cerr << "Input bin count:\n";
cin >> input_struct.bin_count;
input_struct.width = input_width(countOfNumbers);
return input_struct;
}

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

@@ -0,0 +1,25 @@
#include "prot.h"
int input_width(int countOfNumbers){
const int BLOCK_WIDTH = 10;
bool check = false;
int width =0;
while(check == false){
std::cout << "Input width:"<<std::endl;
std::cin >> width;
if(width < 70){
std::cout << "width less 70" << std::endl;
}
else if(width > 800){
std::cout << "width more 800" << std::endl;
}
else if(width < countOfNumbers*BLOCK_WIDTH / 3.0){
std::cout << "ìåíåå òðåòè êîëè÷åñòâà ÷èñåë, óìíîæåííûõ íà øèðèíó áëîêà " << std::endl;
}
else{
check = true;
}
}
return width;
}

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

@@ -0,0 +1,8 @@
#ifndef PROT_H_INCLUDED
#define PROT_H_INCLUDED
#include <vector>
#include <iostream>
int input_width(int countOfNumbers);
#endif // PROT_H_INCLUDED

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

@@ -0,0 +1,42 @@
#include "svg.h"
#include "text.h"
void svg_begin(double width, double height) {
std::cout << "<?xml version='1.0' encoding='UTF-8'?>\n";
std::cout << "<svg ";
std::cout << "width='" << width << "' ";
std::cout << "height='" << height << "' ";
std::cout << "viewBox='0 0 " << width << " " << height << "' ";
std::cout << "xmlns='http://www.w3.org/2000/svg'>\n";
}
void svg_end() {
std::cout << "</svg>\n";
}
void show_histogram_svg(const std::vector<size_t>& bins, int TEXT_WIDTH) {
const auto IMAGE_WIDTH = 400;
const auto IMAGE_HEIGHT = 300;
const auto TEXT_LEFT = 20;
const auto TEXT_BASELINE = 20;
const auto BIN_HEIGHT = 30;
svg_begin(400, 300);
size_t maxCount = maxBin(bins);
double top = 0;
for (size_t bin : bins) {
const double bin_width = (IMAGE_WIDTH - TEXT_WIDTH) * (bin / double(maxCount));
svg_text(TEXT_LEFT, top + TEXT_BASELINE, std::to_string(bin));
svg_rect(TEXT_WIDTH, top, bin_width, BIN_HEIGHT,"red","#006B3C");
top += BIN_HEIGHT;
}
svg_end();
}
void svg_text(double left, double baseline, std::string text) {
std::cout << "<text x='" << left << "' y='"<< baseline <<"'>" << text<<"</text>";
}
void svg_rect(double x, double y, double width, double height,std::string stroke="black", std::string fills="black"){
std::cout << "<rect x='"<<x<<"' y='"<<y<<"' width='"<<width<<"' height='"<<height<<"' stroke='"<<stroke<<"' fill='"<<fills<<"' />";
}

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

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

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

@@ -0,0 +1,41 @@
#include "text.h"
void show_histogram_text(std::vector<size_t> bins , size_t bin_count) {
size_t maxCount = maxBin(bins);
size_t count_stars;
for (size_t i = 0; i < bin_count; i++) {
if (bins[i] < 100) {
std::cout << " ";
}
if (bins[i] < 10) {
std::cout << " ";
}
std::cout << bins[i];
std::cout << "|";
if (maxCount > MAX_ASTERISK) {
count_stars = MAX_ASTERISK * (static_cast<double>(bins[i]) / maxCount);
}
else {
count_stars = bins[i];
}
for (size_t i2 = 0; i2 < count_stars; i2++) {
std::cout << "*";
}
std::cout << std::endl;
}
}
const size_t maxBin(std::vector<size_t> bins) {
size_t max = bins[0];
for (int i = 1; i < bins.size(); i++) {
if (max < bins[i]) {
max = bins[i];
}
}
return max;
}

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

@@ -0,0 +1,12 @@
#ifndef TEXT_H_INCLUDED
#define TEXT_H_INCLUDED
#include <iostream>
#include <vector>
const size_t SCREEN_WIDTH = 80;
const size_t MAX_ASTERISK = SCREEN_WIDTH - 3 - 1;
void show_histogram_text(std::vector<size_t> bins , size_t bin_count);
const size_t maxBin(std::vector<size_t> bins);
#endif // TEXT_H_INCLUDED

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

@@ -0,0 +1,44 @@
#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("empty vector") {
std::vector<double> numbers{};
double min=0, max=0;
CHECK(!find_minmax(numbers, min, max));
}
TEST_CASE("1 val") {
std::vector<double> numbers{1};
double min=0, max=0;
find_minmax(numbers, min, max);
CHECK(min == 1);
CHECK(max == 1);
}
TEST_CASE("- val") {
std::vector<double> numbers{-1,-2};
double min=0, max=0;
find_minmax(numbers, min, max);
CHECK(min == -2);
CHECK(max == -1);
}
TEST_CASE("same val") {
std::vector<double> numbers{2,2};
double min=0, max=0;
find_minmax(numbers, min, max);
CHECK(min == 2);
CHECK(max == 2);
}
TEST_CASE("check prot1") {
check(input_width(int countOfNumbers, 10));
}