diff --git a/main.cpp b/main.cpp
index 34dd0b3..1c3d92b 100644
--- a/main.cpp
+++ b/main.cpp
@@ -1,98 +1,43 @@
 #include <iostream>
 #include <vector>
+#include "histogram.h"
+#include "text.h"
 
 using namespace std;
 
 const size_t SCREEN_WIDTH = 80;
 const size_t MAX_ASTERISK = SCREEN_WIDTH - 3 - 1;
 
-void printspace (int number)
-{
-    if (number < 10) cout << "  ";
-    else if (number < 100) cout << " ";
-}
+struct
+Input {
+    vector<double> numbers;
+    size_t bin_count{};
+};
 
-int main()
+Input
+input_data ()
 {
+    Input in;
+
+    cin >> in.bin_count;
+
     size_t number_count;
     cerr << "enter number count: ";
     cin >> number_count;
 
-    vector<double> numbers(number_count);
+    in.numbers.resize(number_count);
     for (size_t i=0; i<number_count; i++)
     {
         cerr << "enter number" << (i+1) << ": ";
-        cin >> numbers[i];
-    }
-    size_t bin_count;
-    cerr << "enter bin count: ";
-    cin >> bin_count;
-
-    vector<size_t> bins(bin_count);
-
-    double min = numbers[0];
-    double max = numbers[0];
-    for (double x : numbers)
-    {
-        if (x<min)
-        {
-            min=x;
-        }
-        else if (x>max)
-        {
-            max=x;
-        }
-    }
-
-    double bin_size = (max - min) / bin_count;
-
-    size_t max_count = 0;
-
-    for (size_t i = 0; i < number_count; 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]++;
-                if (bins[j] > max_count)
-                {
-                    max_count = bins[j];
-                }
-                found = true;
-            }
-        }
-        if (!found)
-        {
-            bins[bin_count - 1]++;
-        }
+        cin >> in.numbers[i];
     }
+    return in;
+}
 
-    if (max_count <= 76)
-    {
-        for (size_t i = 0; i < bin_count; i++)
-        {
-            printspace(bins[i]);
-            cout << bins[i] << "|";
-            for (size_t j = 0; j < bins[i]; j++)
-            {
-                cout << "*";
-            }
-            cout << endl;
-        }
-    }
-    else
-    {
-        for (size_t i = 0; i < bin_count; i++){
-            size_t height = 76 * (static_cast<double>(bins[i]) / max_count);
-            printSpace(bins[i]);
-            cout << bins[i] << "|";
-            for (size_t j = 0; j < height; j++)
-            {
-                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);
 }