Родитель
							
								
									48de4476ce
								
							
						
					
					
						Сommit
						32335cc93c
					
				| @ -0,0 +1,45 @@ | |||||||
|  | #include "histogram.h" | ||||||
|  | #include <vector> | ||||||
|  | #include <stdlib.h> | ||||||
|  | #include <iostream> | ||||||
|  | 
 | ||||||
|  | void | ||||||
|  | find_minmax(const std::vector<double>& numbers, double& min, double& max, bool& res){ | ||||||
|  |     if (numbers.size() == 0){ | ||||||
|  |         res = false; | ||||||
|  |         return; | ||||||
|  |     } | ||||||
|  |     min = numbers[0]; | ||||||
|  |     max = numbers[0]; | ||||||
|  |     for (auto 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; | ||||||
|  |     bool res = true; | ||||||
|  |     find_minmax (numbers, min, max, res); | ||||||
|  |     if (res == false){ | ||||||
|  |         std::cerr << "Number of elements cannot be equal to zero"; | ||||||
|  |         exit(1); | ||||||
|  |     } | ||||||
|  |     double bin_size = (max - min) / bin_count; | ||||||
|  |     std::vector<size_t> bins(bin_count); | ||||||
|  |     for (auto x : numbers) { | ||||||
|  |         bool found = false; | ||||||
|  |         for (size_t j = 0; (j < bin_count - 1) && !found ; j++) { | ||||||
|  |             if ((min + j * bin_size <= x) && (x < min + (j + 1) * bin_size)) { | ||||||
|  |                 bins[j] += 1; | ||||||
|  |                 found = true; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         if (!found) bins[bin_count - 1]++; | ||||||
|  |     } | ||||||
|  |     return bins; | ||||||
|  | } | ||||||
| @ -0,0 +1,6 @@ | |||||||
|  | #pragma once | ||||||
|  | #include <vector> | ||||||
|  | 
 | ||||||
|  | std::vector<size_t> | ||||||
|  | make_histogram(const std::vector<double>& numbers, size_t bin_count); | ||||||
|  | 
 | ||||||
| @ -0,0 +1,43 @@ | |||||||
|  | <?xml version="1.0" encoding="UTF-8" standalone="yes" ?> | ||||||
|  | <CodeBlocks_project_file> | ||||||
|  | 	<FileVersion major="1" minor="6" /> | ||||||
|  | 	<Project> | ||||||
|  | 		<Option title="lab34" /> | ||||||
|  | 		<Option pch_mode="2" /> | ||||||
|  | 		<Option compiler="gcc" /> | ||||||
|  | 		<Build> | ||||||
|  | 			<Target title="Debug"> | ||||||
|  | 				<Option output="bin/Debug/lab34" prefix_auto="1" extension_auto="1" /> | ||||||
|  | 				<Option object_output="obj/Debug/" /> | ||||||
|  | 				<Option type="1" /> | ||||||
|  | 				<Option compiler="gcc" /> | ||||||
|  | 				<Compiler> | ||||||
|  | 					<Add option="-g" /> | ||||||
|  | 				</Compiler> | ||||||
|  | 			</Target> | ||||||
|  | 			<Target title="Release"> | ||||||
|  | 				<Option output="bin/Release/lab34" prefix_auto="1" extension_auto="1" /> | ||||||
|  | 				<Option object_output="obj/Release/" /> | ||||||
|  | 				<Option type="1" /> | ||||||
|  | 				<Option compiler="gcc" /> | ||||||
|  | 				<Compiler> | ||||||
|  | 					<Add option="-O2" /> | ||||||
|  | 				</Compiler> | ||||||
|  | 				<Linker> | ||||||
|  | 					<Add option="-s" /> | ||||||
|  | 				</Linker> | ||||||
|  | 			</Target> | ||||||
|  | 		</Build> | ||||||
|  | 		<Compiler> | ||||||
|  | 			<Add option="-Wall" /> | ||||||
|  | 		</Compiler> | ||||||
|  | 		<Unit filename="histogram.cpp" /> | ||||||
|  | 		<Unit filename="histogram.h" /> | ||||||
|  | 		<Unit filename="main.cpp" /> | ||||||
|  | 		<Unit filename="svg.cpp" /> | ||||||
|  | 		<Unit filename="svg.h" /> | ||||||
|  | 		<Unit filename="text.cpp" /> | ||||||
|  | 		<Unit filename="text.h" /> | ||||||
|  | 		<Extensions /> | ||||||
|  | 	</Project> | ||||||
|  | </CodeBlocks_project_file> | ||||||
| @ -0,0 +1,35 @@ | |||||||
|  | #include <iostream> | ||||||
|  | #include <vector> | ||||||
|  | #include "histogram.h" | ||||||
|  | #include "text.h" | ||||||
|  | #include "svg.h" | ||||||
|  | 
 | ||||||
|  | using namespace std; | ||||||
|  | 
 | ||||||
|  | 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); | ||||||
|  |     vector<double> numbers(number_count); | ||||||
|  |     for (size_t i = 0; i < number_count; i++) { | ||||||
|  |         cin >> in.numbers[i]; | ||||||
|  |     } | ||||||
|  |     cin >> in.bin_count; | ||||||
|  |     return in; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | int | ||||||
|  | main() { | ||||||
|  |     auto in = input_data(); | ||||||
|  |     auto bins = make_histogram(in.numbers, in.bin_count); | ||||||
|  |     show_histogram_svg(bins); | ||||||
|  |     return 0; | ||||||
|  | } | ||||||
| @ -0,0 +1,61 @@ | |||||||
|  | #include "svg.h" | ||||||
|  | #include <vector> | ||||||
|  | #include <iostream> | ||||||
|  | 
 | ||||||
|  | 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 = "orange"){ | ||||||
|  |     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; | ||||||
|  |     svg_begin(IMAGE_WIDTH, IMAGE_HEIGHT); | ||||||
|  |     double top = 0; | ||||||
|  |     double maxbin = bins[0]; | ||||||
|  |     for (size_t bin : bins) { | ||||||
|  |         if (maxbin < bin){ | ||||||
|  |             maxbin = bin; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |     for (size_t bin : bins) { | ||||||
|  |         double bin_width = BLOCK_WIDTH * bin; | ||||||
|  |         if ((IMAGE_WIDTH - TEXT_WIDTH) < (bin * BLOCK_WIDTH)){ | ||||||
|  |             bin_width = (IMAGE_WIDTH - TEXT_WIDTH) * ( bin / maxbin ); | ||||||
|  |         } | ||||||
|  |         svg_text(TEXT_LEFT, top + TEXT_BASELINE, to_string(bin)); | ||||||
|  |         svg_rect(TEXT_WIDTH, top, bin_width, BIN_HEIGHT); | ||||||
|  |         top += BIN_HEIGHT; | ||||||
|  |     } | ||||||
|  |     svg_end(); | ||||||
|  | } | ||||||
| @ -0,0 +1,5 @@ | |||||||
|  | #pragma once | ||||||
|  | #include <vector> | ||||||
|  | 
 | ||||||
|  | void | ||||||
|  | show_histogram_svg(const std::vector<size_t>& bins); | ||||||
| @ -0,0 +1,43 @@ | |||||||
|  | #include "text.h" | ||||||
|  | #include <vector> | ||||||
|  | #include <iostream> | ||||||
|  | 
 | ||||||
|  | using namespace std; | ||||||
|  | 
 | ||||||
|  | const size_t SCREEN_WIDTH = 80; | ||||||
|  | const size_t MAX_LENGTH = SCREEN_WIDTH - 3 - 1; | ||||||
|  | 
 | ||||||
|  | void | ||||||
|  | show_histogram_text(vector<size_t> bins, size_t bin_count ){ | ||||||
|  |     auto max_count = bins[0]; | ||||||
|  |     for (auto x : bins) { | ||||||
|  |         if (x > max_count) { | ||||||
|  |             max_count = x; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |     for (size_t i = 0; i < bin_count; i++) { | ||||||
|  |         size_t j = 100; | ||||||
|  |         while (bins[i] < j) { | ||||||
|  |             cout << " "; | ||||||
|  |             j /= 10; | ||||||
|  |         } | ||||||
|  |         cout << bins[i] << "|"; | ||||||
|  |         if (max_count > MAX_LENGTH) { | ||||||
|  |             auto count = bins[i]; | ||||||
|  |             size_t height = MAX_LENGTH * (static_cast<double>(count) / max_count); | ||||||
|  |             j = 0; | ||||||
|  |             while (j < height) { | ||||||
|  |                 cout << "*"; | ||||||
|  |                 j++; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         else { | ||||||
|  |            j = 0; | ||||||
|  |            while (j < bins[i]) { | ||||||
|  |                 cout << "*"; | ||||||
|  |                 j++; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         cout << endl; | ||||||
|  |     } | ||||||
|  | } | ||||||
| @ -0,0 +1,5 @@ | |||||||
|  | #pragma once | ||||||
|  | #include <vector> | ||||||
|  | 
 | ||||||
|  | void | ||||||
|  | show_histogram_text(std::vector<size_t> bins, size_t bin_count ); | ||||||
					Загрузка…
					
					
				
		Ссылка в новой задаче