| 
 Разгледзім асноўныя прынцыпы пабудовы гістаграм на прыкладах пабудовы гістаграмы і кругавой дыяграмы. Інтэрактыўнасць у дадзеным выпадку забяспечваецца данымі ў файле. 
Прыклад 15.3. Стварыць праект, у якім неабходна пабудаваць гістаграму па даных з масіва з n элементаў. Значэнні элементаў масіва лічыць з тэкставага файла. Тэкставы файл змясціць у папку Win32\Debug. У гэтым выпадку для доступу да файла досыць прапісаць імя файла. Калі файл захоўваецца ў іншым месцы, то для доступу да файла неабходна прапісаць поўны шлях. 
Этапы выканання задання 
- Змясціць на форму кампаненты: малюнак (Image) і кнопка (Button).
 
- Змяніць уласцівасці Caption у кампанента Button1 на «Построить».
 
- Устанавіць памеры Image — 600 × 400.
 
- Напісаць апрацоўшчык падзеі OnClick для кампанента Button1, у якім дыяграма будуецца з дапамогай прамавугольнікаў.
 
 
4.1. Лічыць даныя з файла ў масівы: масіў d — захоўвае колькасці, па якіх будуецца дыяграма; масіў s — подпісы элементаў. Для працы з файламі падключыць бібліятэку <fstream>. Для чытання радкоў з файла падключыць бібліятэку <string>, для працы з масівамі — бібліятэку <vector>. Прапісаць дырэктыву Using NameSpace std для звароту да каманд стандартных бібліятэк. 4.2. Знайсці максімальны элемент у масіве — элемент n_max, які стаіць на месцы. 4.3. Разлічыць маштабны каэфіцыент:  . Для таго каб пакінуць месца для вываду надпісаў, ад вышыні формы адымаем 40. 4.4. У цыкле будаваць n прамавугольнікаў аднолькавай шырыні. Шырыня прамавугольніка —   .Вышыня прамавугольніка вызначаецца значэннем  , пераўтвораным да цэлага тыпу. Колер прамавугольнікаў задаваць выпадкова — кожны складальнік колеру змяняецца ў дыяпазоне ад 1 да 245 (выключаем чорны колер і колеры блізкія да белага). 4.5. Вывесці надпісы над прамавугольнікамі. Для вываду радкоў, лічаных з файла, іх трэба пераўтварыць так, каб можна было вывесці на канву. Для гэтага можна скарыстацца функцыяй c_str(). 
Прыклад 15.4. Стварыць праект, у якім трэба пабудаваць кругавую дыяграму па даным з масіва. Значэнні элементаў масіва лічыць з тэкставага файла. Тэкставы файл змясціць у папку Win32\Debug. 
- Змясціць на форму кампаненты: малюнак (Image) і кнопка (Button).
 
- Змяніць уласцівасці Caption у кампанента Button1 на «Построить».
 
- Устанавіць памеры Image — 500 × 500.
 
- Для працы з файламі падключыць бібліятэку <fstream>. Для чытання радкоў з файла падключыць бібліятэку <string>, для працы з масівамі — бібліятэку <vector>. Для вылічэнняў спатрэбяцца трыганаметрычныя функцыі, таму неабходна падключыць бібліятэку <cmath>.  Прапісаць дырэктыву using namespace std для звароту да каманд стандартных бібліятэк.
 
- Напісаць апрацоўшчык падзеі OnClick для кампанента Button1, у якім дыяграма будуецца з дапамогай сектараў.
 
 
5.1. Лічыць даныя з файла ў масіў. 5.2. Знайсці суму элементаў масіва — sum. 5.3. Разлічыць маштабны каэфіцыент:  . 5.4. У цыкле будаваць n сектараў. Колер сектара задаваць выпадкова — кожны складальнік колеру змяняецца ў дыяпазоне ад 1 да 245 (выключаем чорны колер і колеры блізкія да белага). 5.5. Сектары вызначаюцца кругам радыуса R, упісаным у квадрат з каардынатамі дыяганалі (x1; y1) — (x2; y2). Значэнні x1 = 50, y1 = 50, x2 = x1 + 2R, y2 = y1 + 2R, R = 200. 5.6. Разлік ключавых пунктаў для пабудовы сектара (гл. малюнак). 5.7. Для пабудовы сектара каардынаты пунктаў (x3; y3) і (x4; y4) трэба пераўтварыць у экранныя: павялічыць гарызантальныя на  , а ў вертыкальных памяняць знак і павялічыць на   .  5.8. Вывесці надпісы ўверсе кампанента Image. Для вываду радкоў, лічаных з файла, іх трэба пераўтварыць так, каб можна было вывесці на канву. Для гэтага можна скарыстацца функцыяй c_str (). Месцазнаходжанне надпісу разлічваецца так жа, як і для гістаграмы. 
 | 
Прыклад 15.3. Форма на этапе канструявання: 
  
Тэкставы файл з данымі: 
  
Падключэнне бібліятэк: 
  
Апрацоўшчык падзеі OnClick для кампанента Button1. 
| 
 void __fastcall TForm1::Button1Click(TObject *Sender) 
{ 
  //чытанне даных з файла 
  ifstream fin("date.txt"); 
  int n; 
  fin >> n; 
  vector <int> d(n); 
  vector <string> s(n); 
  for(int i = 0; i < n; i++) 
    fin >> s[i] >> d[i]; 
  //пошук максімальнага 
  int n_max = 0; 
  for (int i = 0; i < n; i++) 
    if (d[i] > d[n_max]) 
      n_max = i; 
  //каэфіцыент маштабавання
  
  int  h = Image1 -> Height - 40; 
  double k = 1. * h / d[n_max]; 
  //шырыня слупка
  
  int w = Image1 -> Width/(2 * n + 1); 
  int x = w; 
  for (int i = 0; i < n; i++) { 
    //колер
  
    int cr = rand()% 245 + 1; 
    int cg = rand()% 245 + 1; 
    int cb = rand()% 245 + 1; 
    TColor c = TColor (RGB(cr, cg, cb)); 
    Image1 -> Canvas -> Brush -> Color = c; 
    Image1 -> Canvas -> Rectangle 
    (x, h + 40, x + w, h - (int)(k * d[i]) + 30); 
    //надпіс
  
    Image1 -> Canvas -> Brush -> Color = clWhite; 
    Image1 -> Canvas -> Font -> Color = c; 
    Image1 -> Canvas -> TextOut 
      (x + 3, 3, s[i].c_str()); 
    //пераход да наступнага слупка 
    x += 2 * w; 
  } 
} 
 | 
 
 
Дадатак у час працы: 
  
Прыклад 15.4. Форма на этапе канструявання: 
  
Разлік ключавых пунктаў для пабудовы сектара: 
  
Велічыня вугла u2 адпавядае бягучаму значэнню даных з масіва і роўная  . Велічыня вугла u1 — сумарнае значэнне вуглоў для ўжо пабудаваных сектараў. Спачатку u1 = 0. 
Значэнні x3 і y3 — катэты прамавугольнага трохвугольніка з вуглом u1 і гіпатэнузай роўнай радыусу круга, таму x3 = R cos u1, y3 = R sin u1. 
Аналагічна вызначаем x4 і y4:  y4 = R cos (u1 + u2), y4 = R sin (u1 + u2). 
Апрацоўшчык падзеі OnClick для кампанента Button1. 
| 
 void __fastcall TForm1::Button1Click                (TObject *Sender) 
{ 
  //чытанне даных з файла 
  ifstream fin("date.txt"); 
  int n; 
  fin >> n; 
  vector <int> d(n); 
  vector <string> s(n); 
  for(int i = 0; i < n; i++) 
    fin >> s[i] >> d[i]; 
  //пошук сумы
  
  int sum = 0; 
  for (int i = 0; i < n; i++) 
    sum += d[i]; 
  //каэфіцыент маштабавання
  
  double pi = acos(-1.); 
  double k = 2 * pi / sum; 
  //вызначэнне круга 
  double u1 = 0; 
  int w = Image1 -> Width/(2 * n + 1); 
  int x = w ; 
  int R = 200; 
  int x1 = 50, y1 = 50; 
  int x2 = x1 + 2 * R, y2 = y1 + 2 * R; 
  //цэнтр вобласці пабудовы 
  int c_X = Image1 -> Width / 2; 
  int c_Y = Image1 -> Height / 2; 
  for (int i = 0; i < n - 1; i++){ 
    double u2 = k * d[i]; 
    int x3 = int (R * cos(u1)) + c_X; 
    int y3 = c_Y - int (R * sin(u1)); 
    int x4 = int (R * cos(u1 + u2)) + c_X; 
    int y4 = c_Y - int (R * sin(u1 + u2)); 
    //колер
  
    int cr = rand()% 255 + 1; 
    int cg = rand()% 255 + 1; 
    int cb = rand()% 255 + 1; 
    TColor c = TColor (RGB(cr, cg, cb)); 
    Image1 -> Canvas -> Brush -> Color = c; 
    //сектар 
    Image1 -> Canvas -> Pie 
    (x1, y1, x2, y2, x3, y3, x4, y4); 
    //пераход да наступнага сектару 
    u1 += u2; 
    //надпіс 
    Image1 -> Canvas -> Brush -> Color = clWhite; 
    Image1 -> Canvas -> Font -> Color = c; 
    Image1 -> Canvas ->  
    TextOut(x + 3, 3, s[i].c_str()); 
    //пераход да наступнага надпісу 
    x += 2 * w; 
 | 
 
 
 Дадатак у час працы: 
  
 
 |