Диаграмма – вывод массива на печать (BDS 2006, C++)
Напишем небольшую программу печати массива значений в виде диаграммы. Видел подобные задания в нескольких курсовых, например, требовалось написать демонстрационную программу сортировки массивов. Ее сделаем чуть позже, а пока попробуем просто вывести диаграмму.Создаем проект, форму, добавляем на форму сетку строк (StringGrid) под именем sg, две кнопки (Новый массив и Закрыть), панель и рисунок TImage под именем im.
Количество столбцов у сетки делаем 15, строк – 1, фиксированных нет, устанавливаем нужную ширину и шрифт.
В качестве переменных перед текстом программы указываем
const int arSize = 15;Первая – константа arSize, это размер массива, data – сам массив, а title – заголовок нашей диаграммы.
int data[arSize];
AnsiString title = "Диаграмма";
Нам понадобятся две функции – формирования нового массива (NewArray) и вывода массива на экран (ShowArray). Эти функции будут вызываться при инициализации формы и нажатии кнопки Новый массив.
В первой функции мы заполняем массив случайными числами с помощью функции rand().
void NewArray()Чтобы массив не формировался каждый раз одинаково, инициализируем случайный выбор с помощью srand от текущего времени. Полученными значениями заполняем сетку. И к тому же мы будем выводить значение над каждым столбиком. Столбики сделаем разноцветные. Цвет будет зависеть от значения элемента массива – чем оно больше, чем цвет «синее». Маленькие элементы более красные. Пересчитываем через значения RGB. Я подобрал примерно, но вы можете сделать и другой вариант расчета.
{
srand(time(NULL));
for(int i=0; i<15; i++)
{
data[i] = 1 + rand()%100;
frmMain->sg->Cells[i][0]=data[i];
}
}
Итак, вот текст функции ShowArray()
void ShowArray()
{
int wIm = frmMain->im->Width; //ширина рисунка
int hIm = frmMain->im->Height; //высота рисунка
int x, h, hCol, wCol, i;
int redColor, blueColor, greenColor; //цвета
//рисуем рамку
frmMain->im->Canvas->Brush->Color = (TColor)RGB(255,255,255);
frmMain->im->Canvas->Rectangle(0,0,wIm, hIm);
//Заголовок
frmMain->im->Canvas->Font->Name = "Tahoma";
frmMain->im->Canvas->Font->Size = 12;
//выводим посередине рисунка
x = (frmMain->im->Width - frmMain->Canvas->TextWidth(title))/2;
frmMain->im->Canvas->Brush->Style = bsClear;
frmMain->im->Canvas->TextOutA(x,10,title);
wCol = int(frmMain->im->Width/arSize); //определяем ширину столбца
x = 0; //позиция по горизонтали
int min, max; //максимальный и минимальный эелемент массива
min = 0; //принимаем за минимальный - первый элемент
max = 0; //принимаем за максимальный - первый элемент
for(i = 1; i<arSize; i++)
{
if (data[i] < data[min]) {
min = i; //если следующий меньше предыдущего, то он минимальный
}
if (data[i]>data[max]) {
max = i; //так же с максимальным эелементом
}
}
hCol = (frmMain->im->ClientHeight - 90)/data[max]; //коэффициент для расчета высоты столбца
for (i = 0; i < arSize; i++) {
h = hCol*data[i]; //высота, на которой выводим надпись
frmMain->im->Canvas->TextOutA(x+20,hIm-h-40, IntToStr(data[i]));
x+=wCol;
}
x = 0;
for (i = 0; i < arSize; i++) {
h = hCol*data[i]; //высота столбца для вывода на экран
if (data[i]<=40) {
blueColor = 0;
redColor = 255;
greenColor = (int)(data[i]*255/40); //пересчитываем цвет
}
else if ((data[i]>40) && (data[i]<=60)) {
redColor = 0;
greenColor = 255;
blueColor = 255 - (int)((60-data[i])*255/20);
}
else
{
redColor = 0;
blueColor = 255;
greenColor = (int)((100 - data[i])*255/40);
}
frmMain->im->Canvas->Brush->Color = (TColor)RGB(redColor, greenColor, blueColor);
frmMain->im->Canvas->Rectangle(x,hIm-h-20,x+wCol,hIm); //выводим столбик
x+=wCol;
}
}
Добавляем эти функции в инициализацию формы:
__fastcall TfrmMain::TfrmMain(TComponent* Owner)И в обработку кнопки
: TForm(Owner)
{
NewArray();
ShowArray();
}
void __fastcall TfrmMain::btnNewClick(TObject *Sender)И кнопке «Закрыть» пишем
{
NewArray();
ShowArray();
}
void __fastcall TfrmMain::btnCloseClick(TObject *Sender)Вот такая получилась заготовка.Ширина и высота столбиков пересчитаны в зависимости от количества элементов массива и размера рисунка. Можно немного дописать текст программы, чтобы при изменении размеров формы масштабировался рисунок и перерисовывался массив.
{
Close();
}
