Вы не можете выбрать более 25 тем
			Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
		
		
		
		
		
			
		
			
				
	
	
		
			121 строка
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C++
		
	
			
		
		
	
	
			121 строка
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C++
		
	
| #include <iostream>
 | |
| #include <vector>
 | |
| 
 | |
| using namespace std;
 | |
| 
 | |
| struct Input {
 | |
|     vector<double> numbers;
 | |
|     size_t bin_count{};
 | |
| };
 | |
| 
 | |
| Input
 | |
| input_data() {
 | |
|     Input in;
 | |
| 
 | |
|     size_t number_count;
 | |
|     cerr << "Enter number count: ";
 | |
|     cin >> number_count;
 | |
| 
 | |
|     in.numbers.resize(number_count);
 | |
|     for (size_t i = 0; i < number_count; i++) {
 | |
|         cin >> in.numbers[i];
 | |
|     }
 | |
| 
 | |
|     cerr << "Enter number bin: ";
 | |
|     cin >> in.bin_count;
 | |
| 
 | |
|     return in;
 | |
| }
 | |
| 
 | |
| void
 | |
| find_minmax(const 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;
 | |
|         }
 | |
|     }
 | |
| }
 | |
| 
 | |
| vector<size_t>
 | |
| make_histogram(const vector<double>& numbers, size_t bin_count, double min, double max) {
 | |
|     vector<size_t> bins(bin_count);
 | |
| 
 | |
|     double bin_size = (max - min) / bin_count;
 | |
| 
 | |
|     for (size_t i = 0; i < numbers.size(); 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]++;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     return bins;
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 | |
| void
 | |
| show_histogram_text(const vector<size_t>& bins) {
 | |
|     const size_t SCREEN_WIDTH = 80;
 | |
|     const size_t MAX_ASTERISK = SCREEN_WIDTH - 3 - 1;
 | |
| 
 | |
|     size_t max_count = bins[0];
 | |
|     for (size_t i = 0; i < bins.size(); i++) {
 | |
|         if (bins[i] > max_count) {
 | |
|             max_count = bins[i];
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     for (size_t i = 0; i < bins.size(); i++) {
 | |
|         if (bins[i] < 10) {
 | |
|             cout << "  " << bins[i] << "|";
 | |
|         }
 | |
|         else if (bins[i] < 100) {
 | |
|             cout << " " << bins[i] << "|";
 | |
|         }
 | |
|         else if (bins[i] < 1000) {
 | |
|             cout << bins[i] << "|";
 | |
|         }
 | |
| 
 | |
|         size_t height;
 | |
|         if (max_count <= MAX_ASTERISK) {
 | |
|             height = bins[i];
 | |
|         }
 | |
|         else {
 | |
|             height = MAX_ASTERISK * (bins[i] * 1.0 / max_count);
 | |
|         }
 | |
| 
 | |
|         for (size_t j = 0; j < height; j++) {
 | |
|             cout << "*";
 | |
|         }
 | |
|         cout << endl;
 | |
|     }
 | |
| }
 | |
| 
 | |
| int
 | |
| main() {
 | |
|     Input in = input_data();
 | |
| 
 | |
|     double min, max;
 | |
|     find_minmax(in.numbers, min, max);
 | |
| 
 | |
|     auto bins = make_histogram(in.numbers, in.bin_count, min, max);
 | |
|     show_histogram_text(bins);
 | |
| 
 | |
|     return 0;
 | |
| }
 |