|  |  |  | @ -2,39 +2,70 @@ | 
			
		
	
		
			
				
					|  |  |  |  | #include <cmath> | 
			
		
	
		
			
				
					|  |  |  |  | #include <vector> | 
			
		
	
		
			
				
					|  |  |  |  | using namespace std; | 
			
		
	
		
			
				
					|  |  |  |  | int main() | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 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 count, bin_count; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |  size_t i, j; | 
			
		
	
		
			
				
					|  |  |  |  |     float min, max, bin_size; | 
			
		
	
		
			
				
					|  |  |  |  |     float low, hi; | 
			
		
	
		
			
				
					|  |  |  |  |     cerr << "Count= "; | 
			
		
	
		
			
				
					|  |  |  |  |     cin >> count; | 
			
		
	
		
			
				
					|  |  |  |  |     cerr << "Bin_count= "; | 
			
		
	
		
			
				
					|  |  |  |  |     cin >> bin_count; | 
			
		
	
		
			
				
					|  |  |  |  |     vector<double>numbers(count); | 
			
		
	
		
			
				
					|  |  |  |  |     vector<size_t>bins(bin_count); | 
			
		
	
		
			
				
					|  |  |  |  |     for (i = 0; i < count; i++) | 
			
		
	
		
			
				
					|  |  |  |  |     { | 
			
		
	
		
			
				
					|  |  |  |  |         cin >> numbers[i]; | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | size_t number_count; | 
			
		
	
		
			
				
					|  |  |  |  | cerr << "number_count= "; | 
			
		
	
		
			
				
					|  |  |  |  | cin >> number_count; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | Input in; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | in.numbers.resize(number_count); | 
			
		
	
		
			
				
					|  |  |  |  | cerr << "numbers: "; | 
			
		
	
		
			
				
					|  |  |  |  | for (size_t i = 0; i < number_count; i++) { | 
			
		
	
		
			
				
					|  |  |  |  |     cin >> in.numbers[i]; | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | cerr << "bin_count= "; | 
			
		
	
		
			
				
					|  |  |  |  | cin >> in.bin_count; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | return in; | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | void | 
			
		
	
		
			
				
					|  |  |  |  | find_minmax(const vector<double>& numbers, double &min, double &max) | 
			
		
	
		
			
				
					|  |  |  |  | { | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     min = numbers[0]; | 
			
		
	
		
			
				
					|  |  |  |  |     max = numbers[0]; | 
			
		
	
		
			
				
					|  |  |  |  |     for (i = 0; i < count; i++) | 
			
		
	
		
			
				
					|  |  |  |  |     for (size_t i = 0; i < numbers.size(); i++) | 
			
		
	
		
			
				
					|  |  |  |  |     { | 
			
		
	
		
			
				
					|  |  |  |  |         if (numbers[i] > max) | 
			
		
	
		
			
				
					|  |  |  |  |             max = numbers[i]; | 
			
		
	
		
			
				
					|  |  |  |  |         if (numbers[i] < min) | 
			
		
	
		
			
				
					|  |  |  |  |             min = numbers[i]; | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  |     bin_size = (max - min) / bin_count; | 
			
		
	
		
			
				
					|  |  |  |  |     low = min; | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | vector <size_t> make_histogram (const vector<double>& numbers, size_t &bin_count) | 
			
		
	
		
			
				
					|  |  |  |  | { | 
			
		
	
		
			
				
					|  |  |  |  |    vector <size_t> bins(bin_count); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |    double min, max; | 
			
		
	
		
			
				
					|  |  |  |  |    float low, hi; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |    find_minmax(numbers, min, max); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |    double bin_size = (max - min) / bin_count; | 
			
		
	
		
			
				
					|  |  |  |  |    low = min; | 
			
		
	
		
			
				
					|  |  |  |  |     hi = low + bin_size; | 
			
		
	
		
			
				
					|  |  |  |  |     for ( i = 0; i < count; i++) | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     for (size_t i = 0; i < numbers.size(); i++) | 
			
		
	
		
			
				
					|  |  |  |  |     { | 
			
		
	
		
			
				
					|  |  |  |  |         bool found = false; | 
			
		
	
		
			
				
					|  |  |  |  |         for (j = 0; (j < bin_count -1) && !found; j++) | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |         for (size_t j = 0; (j < bin_count - 1) && !found; j++) | 
			
		
	
		
			
				
					|  |  |  |  |         { | 
			
		
	
		
			
				
					|  |  |  |  |             low = min + j * bin_size; | 
			
		
	
		
			
				
					|  |  |  |  |             hi = min + (j + 1) * bin_size; | 
			
		
	
	
		
			
				
					|  |  |  | @ -49,55 +80,46 @@ int main() | 
			
		
	
		
			
				
					|  |  |  |  |             bins[bin_count - 1]++; | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  |     return bins; | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | void show_histogram_text(const vector<size_t>& bins, size_t &bin_count) | 
			
		
	
		
			
				
					|  |  |  |  | { | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     size_t sum_bins=0; | 
			
		
	
		
			
				
					|  |  |  |  |     for (size_t bin:bins) | 
			
		
	
		
			
				
					|  |  |  |  |     { | 
			
		
	
		
			
				
					|  |  |  |  |         sum_bins+=bin; | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  |     size_t sred_bin = sum_bins/bin_count; | 
			
		
	
		
			
				
					|  |  |  |  | size_t max_bin = bins[0]; | 
			
		
	
		
			
				
					|  |  |  |  | for (size_t bin : bins) | 
			
		
	
		
			
				
					|  |  |  |  | if (bin > max_bin) | 
			
		
	
		
			
				
					|  |  |  |  | max_bin = bin; | 
			
		
	
		
			
				
					|  |  |  |  | for (size_t bin : bins) | 
			
		
	
		
			
				
					|  |  |  |  | { | 
			
		
	
		
			
				
					|  |  |  |  | int height = bin; | 
			
		
	
		
			
				
					|  |  |  |  | if (max_bin > MAX_ASTERISK) | 
			
		
	
		
			
				
					|  |  |  |  | { | 
			
		
	
		
			
				
					|  |  |  |  | height = MAX_ASTERISK * (static_cast<double>(bin) / max_bin); | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | if (bin < 100) | 
			
		
	
		
			
				
					|  |  |  |  | cout << " "; | 
			
		
	
		
			
				
					|  |  |  |  | if (bin < 10) | 
			
		
	
		
			
				
					|  |  |  |  | cout << " "; | 
			
		
	
		
			
				
					|  |  |  |  | cout << bin << "|"; | 
			
		
	
		
			
				
					|  |  |  |  | for (int i = 0; i < height; i++) | 
			
		
	
		
			
				
					|  |  |  |  | cout << "*"; | 
			
		
	
		
			
				
					|  |  |  |  | cout << endl; | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     const size_t SCREEN_WIDTH = 80; | 
			
		
	
		
			
				
					|  |  |  |  |     const size_t MAX_ASTERISK = SCREEN_WIDTH - 3 - 1; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     size_t max_bin=bins[0]; | 
			
		
	
		
			
				
					|  |  |  |  |     for (size_t bin:bins) | 
			
		
	
		
			
				
					|  |  |  |  |         if (bin>max_bin) | 
			
		
	
		
			
				
					|  |  |  |  |             max_bin=bin; | 
			
		
	
		
			
				
					|  |  |  |  |     for (size_t bin:bins) | 
			
		
	
		
			
				
					|  |  |  |  |     { | 
			
		
	
		
			
				
					|  |  |  |  |         int height = bin; | 
			
		
	
		
			
				
					|  |  |  |  |         if (max_bin > MAX_ASTERISK) | 
			
		
	
		
			
				
					|  |  |  |  |         { | 
			
		
	
		
			
				
					|  |  |  |  |             height = MAX_ASTERISK * (static_cast<double>(bin) / max_bin); | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  |         if (bin < 100) | 
			
		
	
		
			
				
					|  |  |  |  |             cout << " "; | 
			
		
	
		
			
				
					|  |  |  |  |         if (bin < 10) | 
			
		
	
		
			
				
					|  |  |  |  |             cout << " "; | 
			
		
	
		
			
				
					|  |  |  |  |         cout<<bin<<"|"; | 
			
		
	
		
			
				
					|  |  |  |  |          if (height>sred_bin){ | 
			
		
	
		
			
				
					|  |  |  |  |              for(size_t i=0; i<sred_bin; i++) | 
			
		
	
		
			
				
					|  |  |  |  |                  cout<<"*"; | 
			
		
	
		
			
				
					|  |  |  |  |              for(size_t i=sred_bin; i<height; i++) | 
			
		
	
		
			
				
					|  |  |  |  |                  cout<<"+"; | 
			
		
	
		
			
				
					|  |  |  |  |          } | 
			
		
	
		
			
				
					|  |  |  |  |          else{ | 
			
		
	
		
			
				
					|  |  |  |  |              for (size_t i=0; i<height; i++) | 
			
		
	
		
			
				
					|  |  |  |  |                  cout<<"*"; | 
			
		
	
		
			
				
					|  |  |  |  |              for (size_t i=height; i<sred_bin; i++) | 
			
		
	
		
			
				
					|  |  |  |  |                  cout<<"-"; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |          } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | cout<<endl; | 
			
		
	
		
			
				
					|  |  |  |  | int | 
			
		
	
		
			
				
					|  |  |  |  | main() | 
			
		
	
		
			
				
					|  |  |  |  | { | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  |     auto in = input_data(); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     auto bins = make_histogram(in.numbers, in.bin_count); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     show_histogram_text(bins, in.bin_count); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     return 0; | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
	
		
			
				
					|  |  |  | 
 |