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 для получения двух вертикальных линий.
Цикл по точкам (k = 0, 1, ..., N-1 ) для занесения звездочек в массив Mas.
Вывод массива Mas по строкам, начиная с верхней. Для каждой строки
выводится также значение ординаты yi для текущей i-ой строки.
6. Вывод значений xmin, xmax под двумя вертикальными чертами.
Текст функции grasim1, реализующей этот алгоритм, дан ниже.
Комментарии п1, п2, . . . в конце строк указывают начало
соответствующего пункта алгоритма (п пункт).
Следует обратить внимание на пункт 2, начинающийся со строки с //п2,
где для определения минимальных и максимальных значений используется
цикл по k и стандартные функции min, max. Например, функция min
равна минимальному из двух значений, указанных в скобках.
Вывод с форматированием обеспечивают манипуляторы setw и setprecision.
При выводе строки символьной матрицы Mas между соседними символами
(пробел, звездочка, | ) вставляются два пробела для растягивания графика по
горизонтали. Если эти пробелы убрать, то график будет слишком сжат.
В тексте программы grasim1 предусмотрена запись в файл таблицы со
значениями абсцисс и ординат всех точек.
- 10.3 Операторы управления
- 10. 4 Оператор мультиветвления switch
- 10.6 Применение функции printf для форматирования
- 11.1 Графические программы
- 11.2 Построение символьного графика
- 11.4 Построение графика в графическом режиме
- 12.1 Передача данных для построения графика в MathCad
- 12.4 Указатели
- 12.5 Описание указателей
- 12.6 Указатели для массивов и строк
- 13.3 Оператор динамического выделения памяти new
- Void main ( ) {
- Void tab( ); };
- Void main ( ) {
- 15.1 Класс объектов, элементы класса
- 15.2 Доступ к элементам класса
- 15.3 Вызов элементов класса
- 15.4 Конструкторы классa
- 15.5 Пример класса Tkplk
- 16.1 Наследование
- 16.2 Полиморфизм
- 16.3 О перегрузке функций и операций
- 17. 1 Среда программирования и библиотека vcl
- 17.2 Консольное приложение в Builder
- При выполнении лабораторных работ в дисплейном классе используется
- 17.5 Вид экрана в builder
- 17.6 Работа с проектом в системе Builder
- 18.1 Редактор кода
- 18.4 Пример запроса, ввода, вывода для Win -программы