Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
отчет мой.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
4.46 Mб
Скачать

Задача 26. Круговая диаграмма.

В окне программы Круговая диаграмма (Рис. 33) отображается диаграмма, которая отображает долю каждой категории в общей сумме. Исходные данные могут быть представлены какв "готовом виде" (доля каждой категории в общей сумме), так и без предварительной обработки. Во втором случае программа сама вычисляет долю каждой категории. Также выполняется сортировка исходных данных.

Рис 33

Вывод: При выполнении этого задания мы научились выводить диаграммы на форме без помощи компонентов путем прописывания кода.

Листинг

#include "Math.h" // для доступа к sin и cos TForml *Forml; #undef PEOPLE // диаграмма "Население земли" #define ENERGY // диаграмма "Источники энергии" #ifdef PEOPLE #define HB 6 «define OBR /* выполнить предварительнуюобработку исходных данных (вычислить долю каждой категории в общей сумме) */ // *** исходные данные *** AnsiString Title = "Население земли"; // значения по каждой категории Графика 95 float datafHB] = {1.25e9,1е9,274е6,216е6,172е6,146еб}; // доля категории в общей сумме (процент) float pr[HB]; // *** подписи легенды *** AnsiString dTitle[HB] = {"Китай","Индия","США", "Индонезия","Бразилия","Россия"}; // *** цвет для каждой категории*** TColor cl[HB] = {clLime, clBlue, clMaroon, clGreen, clYellow, clTeal}; #endif #ifde£ ENERGY #define HB 6 #undef OBR /* предварительнуюобработку исходных данных выполнятьне надо - сумма элементов массива data должна быть равна 100 */ // *** исходные данные *** 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}; Часть 1, Примеры и задачи #endif #define R 80 // радиусдиаграммы #define D 160 // диаметр диаграммы #define TORAD 0.0174532 // коэф. пересчета угла из градусов // в радианы /* для пересчета величины угла из градусов врадианы, величину в градусах надо умножить на Pi/180 */ // конструктор формы fastcall TForml::TForml(TComponent* Owner) : TForm(Owner) int i,j; // сортировкаисходных данных методом"пузырька" float bd; AnsiString bt; TColor be;. for (i = 0; i < KB; i ++) for (j = 0 ; j < HB-1; j++) if (data[j+l] < datatj]) // поменять местами i-ый и i+1-ый элементы bd = datatj]; datatj] = data[j+l]; data[j+l] = bd; bt = dTitletj]; dTitletj] = dTitle[j+l]; dTitle[j+l] = bt; be = cl[j]; cl[j+l] = be; #ifdef OBR // обработка данных - вычисление доли // каждой категории в общей сумме float sum = 0; for (i = 0; i < HB; i++) sum += data[i]; for (i = 0; i < HB; i++) pr[i] = ( data[i] / sum) * 100; #else // исходные данные представленыв видепроцентов for ( i = 0; i < HB; pr[i] = data[i]; #endif // процедура обработки события Paint рисуетдиаграмму void fastcall TForml::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); // *** круговая диаграмма*** // здесь х,у - координатылевого верхнего угла // прямоугольника, в который вписан круг, из которого // вырезается сектор х = (ClientWidth - D) /2 - R; у = 15 + Canvas->TextHeight(Title) + 20; int xO,yO; // центр сектора (круга) int xl,yl; // координата точки начала дуги int x2,y2; // координата точки конца дуги int al,a2; // угол между осью ОХ и прямыми, // ограничивающими сектор // int n; // количество категорий (секторов) // n = sizeof(data)/ sizeof(float); xO = x + R; yO = у + R; al = 0; // первый сектор откладываемот оси ОХ //Canvas->Pen->Style = psClear; for (int i = 0; i < HB; i++ ) /* из-за ошибок округления возможна ситуация, когда между первым и последним секторами будет небольшой промежутокили последний сектор перекроет первый. Чтобы этого не было, зададим чтограница последнего сектора совпадает с прямой ОХ */ if (i != НВ-1) а2 = ( al + 3.6 * pr[i]); Графика £9 else а2 = 359; // координата точки начала дуги xl = хО + R * cos (а2 * TORAD); yl = уО + R * sin (а2 * TORAD); // координата точки конца дуги х2 = хО + R * cos (al * TORAD); у2 = уО + R * sin (al * TORAD); if ( abs(al-a2) <= 6 ) Canvas->Pen->Style = psClear; else Canvas->Pen->Style = psSolid; Canvas->Brush->Color = Canvas->Pie(x,y,x+D,y+D,xl,yl,x2,y2); al =a2; // следующий сектор рисуем от начала текущего // легенда Canvas->Font->Size -= 2; int dy = Canvas->TextHeight("a"); x = x + D + 40; у = у + 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) у = у + d y + 1 0 ;

}

}

void fastcall TForml::FormResize(TObject *Sender) Forml->Refresh();