Страницы

четверг, 5 декабря 2013 г.

Вывод массива с++

Диаграмма – вывод массива на печать (BDS 2006, C++)

Напишем небольшую программу печати массива значений в виде диаграммы. Видел подобные задания в нескольких курсовых, например, требовалось написать демонстрационную программу сортировки массивов. Ее сделаем чуть позже, а пока попробуем просто вывести диаграмму.


Печать массива в виде диаграммы

Делаем в Borland Developer Studio 2006, но можно и в более ранних или поздних версиях.
Создаем проект, форму, добавляем на форму сетку строк (StringGrid) под именем sg, две кнопки (Новый массив и Закрыть), панель и рисунок TImage под именем im.
Количество столбцов у сетки делаем 15, строк – 1, фиксированных нет, устанавливаем нужную ширину и шрифт.


В качестве переменных перед текстом программы указываем
const int arSize = 15;
int data[arSize];
AnsiString title = "Диаграмма";
Первая – константа arSize, это размер массива, data – сам массив, а title – заголовок нашей диаграммы.
Нам понадобятся две функции – формирования нового массива (NewArray) и вывода массива на экран (ShowArray). Эти функции будут вызываться при инициализации формы и нажатии кнопки Новый массив.
В первой функции мы заполняем массив случайными числами с помощью функции rand().
void NewArray()
{
    srand(time(NULL));
    for(int i=0; i<15; i++)
    {
        data[i] = 1 + rand()%100;
        frmMain->sg->Cells[i][0]=data[i];
    }
}
Чтобы массив не формировался каждый раз одинаково, инициализируем случайный выбор с помощью srand от текущего времени. Полученными значениями заполняем сетку. И к тому же мы будем выводить значение над каждым столбиком. Столбики сделаем разноцветные. Цвет будет зависеть от значения элемента массива – чем оно больше, чем цвет «синее». Маленькие элементы более красные. Пересчитываем через значения RGB. Я подобрал примерно, но вы можете сделать и другой вариант расчета.
Итак, вот текст функции 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();
}
Вот такая получилась заготовка.Ширина и высота столбиков пересчитаны в зависимости от количества элементов массива и размера рисунка. Можно немного дописать текст программы, чтобы при изменении размеров формы масштабировался рисунок и перерисовывался массив.