logo search
Шпора по информатике / 002

11.2 Построение символьного графика

Этот график должен состоять из символов, занимающих определенные позиции в

каждой из рассматриваемых строк экрана. Номера позиций, т.е. столбцов, и

строк могут быть только целыми, т.к. оператор cout не позволяет выводить

символы между строками.

Для формирования графика используем матрицу Мas(i,j) размера ( ky x kx)

с номерами строк i=0,1,.., ky-1 и номерами столбцов j=0,1,..,kx-1. Значением

каждого её элемента будет некоторый символ. Эта матрица показана на рис. 11.1.

j= 0 1 2 . . . kx-1

i= 0 . . . . . . .

1 . . . . . . .

2 . . . . . . .

i . . . . . . . .

. . . . . . . .

ky-1 . . . . . . .

j

Рис. 11.1. Матрица Mas из символов для поля графика

Начало координат графика – это левый нижний угол матрицы, т.е. ему

соответствуют значения j = 0, i = ky-1. Каждый элемент матрицы на рисунке

условно представлен точкой , но вместо точки может быть другой символ.

Матрица будет описана в программе как

char Mas [20] [20] ;

Это означает, что в матрице не более 400 элементов и каждый элемент

занимает 1 байт. Очевидно, что размер матрицы можно выбрать и другим.

Хотя значение Mas(i,j) может быть любым символом, но для графика будем

использовать только символы пробела, звездочки и символ ' | ' для

вертикальной черты. Перед построением графика массив Mas заполняется

пробелами, а элементам первого и последнего столбцов присваиваются

значения ' | ', т.е. в цикле по i записываем

Mas [i] [0] = ' | ' ;

Mas [i] [kx-1] = ' | ' ;

Это даст две вертикальных черты на графике, см. рис. 11.2.

| * * *

| * * |

* * * * |

| * * |

| * |

0.5 4.5

Рис. 11.2. Символьный график при kx = 9, ky = 5, N = 13

Перейдем к рисованию точек графика. Линию, например, y(x), на графике

будем изображать звездочками, расставляемыми в определенных позициях

графика с помощью оператора присваивания

Mas [i] [j] = ' * ' ;

Для каждой звездочки графика необходимо определить конкретные значения i, j.

Получим формулы для этого.

Пусть изображаются N точек функции y(x) и каждая точка имеет координаты

(x(k) , y(k) ), k=0, 1,.., N-1. Из всех значений абсцисс и ординат определим

минимальные и максимальные значения xmin, xmax, ymin, ymax. Положим, что

эти значения определяют границы графика, т.е. имеем следующее соответствие

точек графика и номеров i,j элементов массива Mas для угловых точек рис. 11.1.

x y i j

xmin ymin ky-1 0

xmax ymin ky-1 kx-1

xmin ymax 0 0

xmax ymax 0 kx-1

Будем рассматривать точки на рис. 11.1 как сетку и определим шаги по осям

stepx, stepy, т.е. расстояние между узлами сетки, как

stepx = (xmax - xmin) / ( kx - 1) ,

stepy = (ymax - ymin) / ( ky - 1)

Тогда для произвольных значений i, j получаем

xj = xmin + stepx * j

yi= ymax - stepy * i (11.1)

Из (11.1) получаем формулу для перехода от координат произвольной точки

графика (x(k);y(k)) к номерам (j,i) для нее

j = ( x[k] - xmin) /stepx + 0.5 ,

i = ( ymax – y[k] ) /stepy + 0.5 , (11.2)

Отметим, что в правые части формул (11.2) для i и j добавлены значения 0.5.

Это нужно для учета округления, т.к. при присваивании вещественных

значений целым переменным i, j происходит отбрасывание дробной части.

Например, для i=1.9 получим i=1, но если добавить 0.5, то получим правильное

значение i=2. Для наглядности графика выведем подписи значений y для сетки

по оси ординат, т.е. значения y(i) из (11.1), а также значения xmin, xmax

под осью абсцисс, см. рис. 11.2.

В заключение приведем алгоритм построения графика.

1. Заполнение массива Mas пробелами.

2. Вычисление границ поля xmin, xmax, ymin, ymax.

3. Заполнение символами ' | ' (черта) первого и последнего столбцов в

массиве Mas для получения двух вертикальных линий.

  1. Цикл по точкам (k = 0, 1, ..., N-1 ) для занесения звездочек в массив Mas.

  2. Вывод массива Mas по строкам, начиная с верхней. Для каждой строки

выводится также значение ординаты yi для текущей i-ой строки.

6. Вывод значений xmin, xmax под двумя вертикальными чертами.

Текст функции grasim1, реализующей этот алгоритм, дан ниже.

Комментарии п1, п2, . . . в конце строк указывают начало

соответствующего пункта алгоритма (п  пункт).

Следует обратить внимание на пункт 2, начинающийся со строки с //п2,

где для определения минимальных и максимальных значений используется

цикл по k и стандартные функции min, max. Например, функция min

равна минимальному из двух значений, указанных в скобках.

Вывод с форматированием обеспечивают манипуляторы setw и setprecision.

При выводе строки символьной матрицы Mas между соседними символами

(пробел, звездочка, | ) вставляются два пробела для растягивания графика по

горизонтали. Если эти пробелы убрать, то график будет слишком сжат.

В тексте программы grasim1 предусмотрена запись в файл таблицы со

значениями абсцисс и ординат всех точек.