Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++ Builder
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
CheburashkaRR
1 / 1 / 1
Регистрация: 17.03.2013
Сообщений: 28
1

Программа построения круговой диаграммы (завершить)

13.02.2014, 16:40. Просмотров 1295. Ответов 8
Метки нет (Все метки)

Вот это уже есть, помогите доделать и переделать:
А) Строится круговая диаграмма расходов за неделю.
Б) Ручной ввод значений дневных расходов.
В) Вывод максимального и минимального значений расходов.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
 
#include "Unit1.h"
#include "math.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
const int HB =6;
 AnsiString Title = " Використання енергії";
     float data[HB] = {0.5, 2.5, 7, 23, 24, 40};
     float pr[HB];
 
     AnsiString dTitle[HB] = {"Інші", " Гідро електростанції", "Атомні електростанції", "Газ", "Вугілля", "Нафта"};
     TColor cl [HB] = {clLime, clBlue, clPurple, clSkyBlue, clYellow, clTeal};
     #define R 80
     #define D 190
     #define TORAD 0.0174532
 
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{    int i,j;
      float bd;
      AnsiString bt;
      TColor bc;
      for (i=0;i<HB;i++)
for(j=0; j<HB-1; j++)
if(data[j+1]<data[j]){
bd = data[j];
 data[j] = data[j+1];
  data[j+1] = bd;
bt = dTitle[j];
dTitle[j] = dTitle[j+1];
dTitle[j+1] = bt;
bc = cl[ j];
 cl[j] = cl[j+1]; cl
  [j+1] = bc;
}
float sum = 0; for(i=0; i<HB; i++)
sum+=data[i]; for(i=0; i<HB; i++)
pr [i] = (data [i] /sum) *100;
}
//---------------------------------------------------------------------------
  //  const int HB =6;
   /*  AnsiString Title = " Використання енергії";
     float data[HB] = {0.5, 2.5, 7, 23, 24, 40};
     float pr[HB];
 
     AnsiString dTitle[HB] = {"Інші", " Гідро електростанції", "Атомні електростанції", "Газ", "Вугілля", "Нафта"};
     TColor cl [HB] = {clLine, clBlue, ClPurpule, clSkyBlue, ClYellow, clTeal};
     #define R 80
     #define D 190
     #define TORAD 0.0174532   */
 
void __fastcall TForm1::FormPaint(TObject *Sender)
{   int x, y;
    int i;
    Canvas->Font->Name = "Tahoma";
    Canvas->Font->Size = 12;
     x = (ClientWidth-Canvas->TextWidth(Title))/2;
      Canvas->Brush->Style = bsClear;
       Canvas->TextOutA(x,15,Title);
       x = (ClientWidth-D)/2 - R;
y = 15 + Canvas->TextWidth(Title) + 20;
int x0, y0; // центр сектора
int x1, y1; // координата точки початку дуги
int x2, y2; // координати точки кінця дуги
int a1, a2; // вугол між ОХ і прямими
x0 = x + R;
y0 = y + R;
a1 = 0;
for(i=0; i<HB; i++){ if(i != HB-1)
a2 = (a1 + 3.6 * pr[i]);
else
a2 = 359;
// координати початку дуги
x1 = x0 + R * cos(a2 * TORAD);
y1 = y0 + R * sin (a2 * TORAD);
       // координати кінця дуги
x2 = x0 + R * cos(a1 * TORAD);
y2 = y0 + R * sin(a1 * TORAD);
if (abs(a1-a2)<=6)
  Canvas->Pen->Style = psClear;
  else
  Canvas->Pen->Style = psSolid;
  Canvas->Brush->Color = cl[i];
  Canvas->Pie(x,y,x+D,y+D,x1,y1,x2,y2);
  a1 = a2;
}
Canvas->Font->Size-=2;
int dy = Canvas->TextHeight("a");
x = x + D + 40;
y = y + 20;
for (i=HB-1; i>=0; i--){
  Canvas->Brush->Color = cl[i];
  Canvas->Rectangle(x,y,x+40, y+dy);
  Canvas->Brush->Style = bsClear;
  Canvas->TextOutA(x+50,y,dTitle[i]+", "+
      FloatToStrF(pr[i], ffGeneral, 2,2)+"%");
      y = y + dy + 10;
      }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormResize(TObject *Sender)
{
 Form1->Refresh();        
}
//---------------------------------------------------------------------------
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.02.2014, 16:40
Ответы с готовыми решениями:

Изменение радиуса круговой диаграммы Pie в Chart
Всем привет =) Собственно сабж - как изменить радиус круговой диаграммы Pie в Chart? Пытаюсь так...

Программа построения круговой диаграммы (нужен совет)
Получил курсовое задание &quot;Создать программу построения круговых диаграмм&quot;. Проблема в том, что не...

Составить процедуру графического построения круговой диаграммы
Программирование задач создания графических объектов. ТРЕБОВАНИЯ! Каждая программа должна...

Написать программу для построения круговой диаграммы в отдельном всплывающем окне
Написать программу для построения круговой диаграммы в отдельном всплывающем окне. Реализовать...

Программа построения диаграммы классов UML по коду
Всем привет) Собственно вопрос в теме. Кто-нибудь знает подобную?использовал? Спасибо

8
Kulgar
509 / 194 / 26
Регистрация: 07.08.2013
Сообщений: 814
13.02.2014, 16:51 2
CheburashkaRR, приучайте себя сразу к правильной табуляции. И всё у Вас получится.
C++ Coding Standard

Слава Ctrl+D
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
// ---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
 
#include "Unit1.h"
#include "math.h"
// ---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
const int HB = 6;
AnsiString Title = " Використання енергії";
float data[HB] =
{0.5, 2.5, 7, 23, 24, 40};
float pr[HB];
 
AnsiString dTitle[HB] =
{"Інші", " Гідро електростанції", "Атомні електростанції", "Газ", "Вугілля", "Нафта"};
TColor cl[HB] =
{clLime, clBlue, clPurple, clSkyBlue, clYellow, clTeal};
#define R 80
#define D 190
#define TORAD 0.0174532
 
// ---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner)
{
    int i, j;
    float bd;
    AnsiString bt;
    TColor bc;
    for (i = 0; i < HB; i++)
        for (j = 0; j < HB - 1; j++)
            if (data[j + 1] < data[j])
            {
                bd = data[j];
                data[j] = data[j + 1];
                data[j + 1] = bd;
                bt = dTitle[j];
                dTitle[j] = dTitle[j + 1];
                dTitle[j + 1] = bt;
                bc = cl[j];
                cl[j] = cl[j + 1]; cl[j + 1] = bc;
            }
    float sum = 0;
    for (i = 0; i < HB; i++)
        sum += data[i];
    for (i = 0; i < HB; i++)
        pr[i] = (data[i] / sum) * 100;
}
// ---------------------------------------------------------------------------
// const int HB =6;
/* AnsiString Title = " Використання енергії";
 float data[HB] = {0.5, 2.5, 7, 23, 24, 40};
 float pr[HB];
 
 AnsiString dTitle[HB] = {"Інші", " Гідро електростанції", "Атомні електростанції", "Газ", "Вугілля", "Нафта"};
 TColor cl [HB] = {clLine, clBlue, ClPurpule, clSkyBlue, ClYellow, clTeal};
 #define R 80
 #define D 190
 #define TORAD 0.0174532 */
 
void __fastcall TForm1::FormPaint(TObject *Sender)
{
    int x, y;
    int i;
    Canvas->Font->Name = "Tahoma";
    Canvas->Font->Size = 12;
    x = (ClientWidth - Canvas->TextWidth(Title)) / 2;
    Canvas->Brush->Style = bsClear;
    Canvas->TextOutA(x, 15, Title);
    x = (ClientWidth - D) / 2 - R;
    y = 15 + Canvas->TextWidth(Title) + 20;
    int x0, y0; // центр сектора
    int x1, y1; // координата точки початку дуги
    int x2, y2; // координати точки кінця дуги
    int a1, a2; // вугол між ОХ і прямими
    x0 = x + R;
    y0 = y + R;
    a1 = 0;
    for (i = 0; i < HB; i++)
    {
        if (i != HB - 1)
            a2 = (a1 + 3.6 * pr[i]);
        else
            a2 = 359;
        // координати початку дуги
        x1 = x0 + R * cos(a2 * TORAD);
        y1 = y0 + R * sin(a2 * TORAD);
        // координати кінця дуги
        x2 = x0 + R * cos(a1 * TORAD);
        y2 = y0 + R * sin(a1 * TORAD);
        if (abs(a1 - a2) <= 6)
            Canvas->Pen->Style = psClear;
        else
            Canvas->Pen->Style = psSolid;
        Canvas->Brush->Color = cl[i];
        Canvas->Pie(x, y, x + D, y + D, x1, y1, x2, y2);
        a1 = a2;
    }
    Canvas->Font->Size -= 2;
    int dy = Canvas->TextHeight("a");
    x = x + D + 40;
    y = y + 20;
    for (i = HB - 1; i >= 0; i--)
    {
        Canvas->Brush->Color = cl[i];
        Canvas->Rectangle(x, y, x + 40, y + dy);
        Canvas->Brush->Style = bsClear;
        Canvas->TextOutA(x + 50, y, dTitle[i] + ", " + FloatToStrF(pr[i], ffGeneral, 2, 2) + "%");
        y = y + dy + 10;
    }
}
 
// ---------------------------------------------------------------------------
void __fastcall TForm1::FormResize(TObject *Sender)
{
    Form1->Refresh();
}
// ---------------------------------------------------------------------------


Так с чем конкретно у Вас сложности?
0
CheburashkaRR
1 / 1 / 1
Регистрация: 17.03.2013
Сообщений: 28
13.02.2014, 17:22  [ТС] 3
Не получается сделать ручной ввод значений и В)

А)-Примерно представляю как, но дальше не идет
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
 
#include "Unit1.h"
#include "math.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
const int HB =7;
 AnsiString Title = "Витрати за тиждень";
 float data[HB] = {5, 7, 10, 16, 18, 23, 33};
     //float data[HB] = {0.5, 2.5, 7, 23, 24, 40};
     float pr[HB];
 
     AnsiString dTitle[HB] = { "Неділя", "Субота", "Пятниця", "Четвер","Середа", "Вівторок", "Понеділок"};
     TColor cl [HB] = {clLime, clBlue, clPurple, clSkyBlue, clYellow, clTeal, clRed};
     #define R 80
     #define D 190
     #define TORAD 0.0174532
 
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{    int i,j;
      float bd;
      AnsiString bt;
      TColor bc;
      for (i=0;i<HB;i++)
for(j=0; j<HB-1; j++)
if(data[j+1]<data[j]){
bd = data[j];
 data[j] = data[j+1];
  data[j+1] = bd;
bt = dTitle[j];
dTitle[j] = dTitle[j+1];
dTitle[j+1] = bt;
bc = cl[ j];
 cl[j] = cl[j+1]; cl
  [j+1] = bc;
}
float sum = 0; for(i=0; i<HB; i++)
sum+=data[i]; for(i=0; i<HB; i++)
pr [i] = (data [i] /sum) *100;
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::FormPaint(TObject *Sender)
{   int x, y;
    int i;
    Canvas->Font->Name = "Tahoma";
    Canvas->Font->Size = 12;
     x = (ClientWidth-Canvas->TextWidth(Title))/2;
      Canvas->Brush->Style = bsClear;
       Canvas->TextOutA(x,15,Title);
       x = (ClientWidth-D)/2 - R;
y = 15 + Canvas->TextWidth(Title) + 20;
int x0, y0; // центр сектора
int x1, y1; // координата точки початку дуги
int x2, y2; // координати точки кінця дуги
int a1, a2; // вугол між ОХ і прямими
x0 = x + R;
y0 = y + R;
a1 = 0;
for(i=0; i<HB; i++){ if(i != HB-1)
a2 = (a1 + 3.6 * pr[i]);
else
a2 = 360;
// координати початку дуги
x1 = x0 + R * cos(a2 * TORAD);
y1 = y0 + R * sin (a2 * TORAD);
       // координати кінця дуги
x2 = x0 + R * cos(a1 * TORAD);
y2 = y0 + R * sin(a1 * TORAD);
if (abs(a1-a2)<=7)
  Canvas->Pen->Style = psClear;
  else
  Canvas->Pen->Style = psSolid;
  Canvas->Brush->Color = cl[i];
  Canvas->Pie(x,y,x+D,y+D,x1,y1,x2,y2);
  a1 = a2;
}
Canvas->Font->Size-=2;
int dy = Canvas->TextHeight("a");
x = x + D + 40;
y = y + 20;
for (i=HB-1; i>=0; i--){
  Canvas->Brush->Color = cl[i];
  Canvas->Rectangle(x,y,x+40, y+dy);
  Canvas->Brush->Style = bsClear;
  Canvas->TextOutA(x+50,y,dTitle[i]+", "+
      FloatToStrF(pr[i], ffGeneral, 2,2)+"%");
      y = y + dy + 10;
      }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormResize(TObject *Sender)
{
 Form1->Refresh();
}
//---------------------------------------------------------------------------
0
Kulgar
509 / 194 / 26
Регистрация: 07.08.2013
Сообщений: 814
13.02.2014, 17:34 4
CheburashkaRR, про табуляцию Вы меня не услышали. Что ж. Если так хотите себе создавать пробелмы - Ваше право.
Цитата Сообщение от CheburashkaRR Посмотреть сообщение
Не получается сделать ручной ввод значений и В)
Разместите на форме компоненту ComboBox, заполните её днями недели и рядом Edit, в который будет заносится расход за выбранный день. Ну и кнопку, которая будет это значение размещать, как я понял, в массив:
C++
1
float data[HB] = {5, 7, 10, 16, 18, 23, 33};
Кстати, для круговых диаграмм, как и диграмм вообще, не проще ли использовать компонент Chart?
Круговая диаграмма / C++ Builder
Chart круговая диаграмма / C++ Builder
Изменение радиуса круговой диаграммы Pie в Chart / C++ Builder
Или Вам именно на канве формы надо рисовать?
0
13.02.2014, 17:34
CheburashkaRR
1 / 1 / 1
Регистрация: 17.03.2013
Сообщений: 28
13.02.2014, 18:32  [ТС] 5
спасибо за советы, да, нужно использовать поменьше готовых компонент. По поводу табуляции - не привыкла наверное, не сочтите за оскорбление
0
CheburashkaRR
1 / 1 / 1
Регистрация: 17.03.2013
Сообщений: 28
13.02.2014, 22:14  [ТС] 6
Что-то получилось, но работает неверно, помогите исправить ошибки
0
Вложения
Тип файла: rar 3.1.rar (40.1 Кб, 14 просмотров)
Kulgar
509 / 194 / 26
Регистрация: 07.08.2013
Сообщений: 814
14.02.2014, 10:51 7
CheburashkaRR, мелких ошибок полно. Комментировать всё не буду. Смотрите сами.
1
Вложения
Тип файла: rar 3.1.rar (346.7 Кб, 26 просмотров)
CheburashkaRR
1 / 1 / 1
Регистрация: 17.03.2013
Сообщений: 28
15.02.2014, 19:10  [ТС] 8
Спасибо!))
0
Avazart
Эксперт С++
7823 / 5721 / 563
Регистрация: 10.12.2010
Сообщений: 26,165
Записей в блоге: 17
16.02.2014, 12:40 9
Цитата Сообщение от CheburashkaRR Посмотреть сообщение
C++
1
2
3
#define R 80
#define D 190 
#define TORAD 0.0174532
Отдавайте предпочтения константам перед define-нами:
C++
1
2
3
const int R=80;
const int D=190;
const double Torad=0.0174532;
1
16.02.2014, 12:40
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.02.2014, 12:40

Рисование круговой диаграммы
Всем доброго, пытаюсь разобраться но даже не знаю где найти... Может кто сталкивался или просто...

Создание круговой диаграммы
привет всем.народ подскажите какой прогой можно забабахать нечто подобное(нужно то что справа...

Вывод круговой диаграммы
/* Программа: PieGraph */ /* Назначение: Вывод круговой диаграммы при помощи ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru