diff --git a/histogram.cpp b/histogram.cpp new file mode 100644 index 0000000..6082ec2 --- /dev/null +++ b/histogram.cpp @@ -0,0 +1,48 @@ +#include "histogram.h" +#include + +static void find_minmax(const std::vector &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 make_histogram(const std::vector &numbers, size_t bin_count) +{ + double min = numbers[0]; + double max = numbers[0]; + find_minmax(numbers, min, max); + double bin_size = ( max - min ) / bin_count; + + std::vector bins ( 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; +} diff --git a/histogram.h b/histogram.h new file mode 100644 index 0000000..c66f9e7 --- /dev/null +++ b/histogram.h @@ -0,0 +1,10 @@ +#ifndef HISTOGRAM_H_INCLUDED +#define HISTOGRAM_H_INCLUDED + +#include + +std::vector +make_histogram(const std::vector& numbers, size_t bin_count); + + +#endif // HISTOGRAM_H_INCLUDED diff --git a/histogram.o b/histogram.o new file mode 100644 index 0000000..f840778 Binary files /dev/null and b/histogram.o differ diff --git a/text.cpp b/text.cpp new file mode 100644 index 0000000..f947f80 --- /dev/null +++ b/text.cpp @@ -0,0 +1,65 @@ +#include "text.h" +#include +#include + +const std::size_t SCREEN_WIDTH = 80; +const std::size_t MAX_ASTERISK = SCREEN_WIDTH - 3 - 1; + +void show_histogram_text(const std::vector &bins) +{ + std::size_t maxbin = bins[0]; + for (std::size_t i=1; i < bins.size(); i++) + { + if (maxbin < bins[i]) + { + maxbin = bins[i]; + } + } + if (maxbin <= MAX_ASTERISK) + { + for (size_t i=0; i < bins.size(); i++ ) + { + if (bins[i] < 10 ) + { + std::cout << " " << bins[i] << "|"; + } + else if (bins[i] < 100) + { + std::cout << " " << bins[i] << "|"; + } + else if (bins[i] < 1000) + { + std::cout << bins[i] << "|"; + } + for (size_t j=0; j < bins[i]; j++ ) + { + std::cout << "*"; + } + std::cout << std::endl; + } + } + else + { + for (std::size_t i=0; i < bins.size(); i++) + { + std::size_t heightG= MAX_ASTERISK * (static_cast(bins[i]) / maxbin); + if (bins[i] < 10 ) + { + std::cout << " " << bins[i] << "|"; + } + else if (bins[i] < 100) + { + std::cout << " " << bins[i] << "|"; + } + else if (bins[i] < 1000) + { + std::cout << bins[i] << "|"; + } + for (std::size_t j=0; j < heightG; j++ ) + { + std::cout << "*"; + } + std::cout << std::endl; + } + } +} diff --git a/text.h b/text.h new file mode 100644 index 0000000..99c853b --- /dev/null +++ b/text.h @@ -0,0 +1,8 @@ +#ifndef TEXT_H_INCLUDED +#define TEXT_H_INCLUDED +#include + + +void show_histogram_text(const std::vector &bins); + +#endif // TEXT_H_INCLUDED