- •Задача 1. Конвертер
- •Задача 2. Фунты-килограммы
- •Задача 3. Сила тока.
- •Задача 4. Сопротивление
- •Задача 5. Кафе
- •Задача 6. Любимый напиток
- •Задача 7. Электроэнергия
- •Задание 8. Осаго
- •Задание 9.Просмотр иллюстраций
- •Задача 10. Калькулятор
- •Задача 11. Калькулятор-2
- •Задача 12.Секундомер
- •Задача 13. Угадай число
- •Задание 14.Угадай число-2
- •Задание 15.Запуск Internet Explorer
- •Задание 16.Конвертор
- •Задание 17.Конвертор 2
- •Задание 18.Погода
- •Задание 19.Средняя температура
- •Задание 20. Простая база данных
- •Задание 21. Редактор текста
- •Задание 22. Приветствие
- •Задача 23. Олимпийский флаг
- •Задание 24. Диаграмма
- •Задача 26. Круговая диаграмма.
- •Задача 27. Просмотр иллюстраций.
- •Задача 28 .Часы
- •Задача 29. Пинг понг.
- •Задача 30. Полет в облаках
- •Задача 31.Баннер
- •Задача 32. Фоновый рисунок
- •Задача 33. Wav
- •Задача 34. Mp3 Player
- •Задача 35.Воспроизведение midi
- •Задача 36.Compact Disk Player (версия 1)
- •Задача 37.Compact Disk Player (версия 2)
- •Задача 38.VideoPlayer
- •Задача 39. Анимация
- •Задача 40. Записная книжка
- •Задача 41 Магазин
- •Задача 42. Ежедневник
- •Задача 43. Сапер
- •Часть 1. Примеры и задачи
- •Часть 1. Примеры и задачи
- •Задача 44 Игра 15
- •Часть 1. Примеры и задачи
- •Задача 45. Игра "Собери картинку" (Puzzle)
- •Задача 46 Игра "Парные картинки"
- •Задача 47. Экзаменатор
- •Задача 48. Экзаменатор-2
- •Задача 49. Календарь
- •Задача 50. Будильник
- •Задача 51. Очистка диска
- •Задача 52.Печать
- •Задачи для самостоятельного решения Задача 1. Скидка
- •Задача 2.Доход по вкладу
- •Задача 3. Таблица умножения
- •Задача 4.Поездка на автомобиле
- •Задача 5.Стоимость разговора
- •Задача 6. Стеклопакет
- •Задача7. Калькулятор
- •Задача 8. Электроэнергия
- •Задача 9. Добрый день
- •Задача 10. Часы
- •Задача 11. Узоры
- •Задача 12. Курс доллара
- •Задача 13. Диаграмма
- •Задача 14. Домашние животные
- •Задача 15. Кораблик
- •Задача 16. Сапер
- •Задача 17 .Экзаменатор
- •Задача 18. База данных "Расходы"
Задача 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();
