Консультация № 182935
25.04.2011, 11:44
53.02 руб.
0 12 1
Здравствуйте! Помогите написать программу на Borland Pascal:
Дан массив вещественных чисел {A}n (n=20); нужно построить график A(n)

Обсуждение

Неизвестный
26.04.2011, 07:47
общий
Дан массив вещественных чисел {A}n (n=20); нужно построить график A(n)


Обычно график предполагает построение зависимости от какой-либо функции. Например y= 2 * x.
давно
Профессионал
304622
583
30.04.2011, 11:49
общий
Надо рисовать в графическом режиме или консольном (символьном)? (Можно и так, и так.)
давно
Профессионал
304622
583
30.04.2011, 11:56
общий
Напротив. Все компьютерные графики либо сразу задаются в виде набора значений (Excel), либо неявно сводятся к этому.
Неизвестный
30.04.2011, 17:31
общий
Адресаты:
Напротив. Все компьютерные графики либо сразу задаются в виде набора значений (Excel), либо неявно сводятся к этому.


Любой график представляет собой соотношение значений аргумента и значения функции. В Excel точно также - например, по оси Х - месяцы, по оси Y - значения.
В данной задаче пока вижу одну сторону - массив A(20). Думаю, это значения функции. Но с какой периодичностью откладывать значения по оси Х?
давно
Профессионал
304622
583
30.04.2011, 23:34
общий
это ответ
Здравствуйте, Pagon!

Поскольку вы на уточняющий вопрос не отвечаете, делаю предположение, что нужен символьный график. (Для вывода массива по номерам элементов это более вероятно.) Не стал выводить нулевую горизонтальную ось -- это чуть сложнее. Напишите, если надо.

Разумеется, если всё-таки надо в графическом режиме -- переделаю под graph.

Код:

const n=20;

var a:array[1..n] of real;
maxa,mina:real;
i,j:integer;

begin
{ Задание исодных данных. Этот блок может быть изменен
в зависимости от заданного спосба получения исходных данных }
for i:=1 to n do a[i]:=exp(-0.01*sqr(i));

{ Поиск максимального и минимального значения в массиве }
maxa:=a[1]; mina:=a[1];
for i:=1 to n do
begin
if a[i]>maxa then maxa:=a[i];
if a[i]<mina then mina:=a[i];
end;

{ Стандартный текстовый экран -- 25 строк. Последняя строка будет
содержать номера элементов. Начинаем перебирать номера строк в графике
в обратном порядке от 23 до 0, т.к. график выводится сверху вниз.}
for j:=23 downto 0 do
begin
{ Вертикальная ось }
if j=23
then write('^')
else write('|');

{ Перебираем элементы массива }
for i:=1 to n do
{ Если его соотношение к дипазону значений массива
соответствует номеру строки }
if ((a[i]-mina)/(maxa-mina)*23>=j) and
((a[i]-mina)/(maxa-mina)*23<j+1)
{ то выводим знак }
then write('*')
{ иначе пробел }
else write(' ');

writeln;
end;

{ Номера элементов -- выводится каждый пятый }
write(' ');
i:=5;
while (i<=n) do
begin
{ Каждый номер выводится с форматом :5, т.е. чтобы
занимать все пять позиций }
write(i:5);
i:=i+5;
end;
readln;
end.
давно
Профессионал
304622
583
30.04.2011, 23:51
общий
Любой график представляет собой соотношение значений аргумента и значения функции.


Это в математике. В компьютерных программах проще: что засунул в переменные (или в ячейки), то и получил.

В Excel точно также - например, по оси Х - месяцы, по оси Y - значения.


Возьмите Excel'ный лист и введите произвольные числа в ячейки от A1 до A20. Потом выделите диапазон A1:A20 и создайте диаграмму типа "График". Согласитесь, что получился график массива A(20).

(Поймите, это ж задача по ПАСКАЛЮ. По программированию, а не по началам анализа.}

В данной задаче пока вижу одну сторону - массив A(20). Думаю, это значения функции. Но с какой периодичностью откладывать значения по оси Х?


Надо откладывать номера. При желании можно растянуть диапазон 1..20 на всю ширину экрана. Но это имеет смысл, если автору вопроса нужен всё-таки модуль graph. А пока так .
Неизвестный
03.05.2011, 22:47
общий
Ребят, пасиба за ответы, забыл уточнить, нужно в графическом режиме, с координатными осями, по y значение элемента массива, по x номер элемента массива)
давно
Профессионал
304622
583
04.05.2011, 10:47
общий
Сегодня сделаю.
Неизвестный
04.05.2011, 22:48
общий
Адресаты:

жду с нетерпением)0
давно
Профессионал
304622
583
05.05.2011, 01:04
общий
Примерно так.

Надеюсь вы знаете, как в Borland Pascal прописывается путь к egavga.bgi в процедуре initgraph

Код:

uses graph,crt;

const n=20;

var a:array[1..n] of real;
maxa,mina:real;
i,j:integer;
s:string;

begin
{ Задание исодных данных. Этот блок может быть изменен
в зависимости от заданного спосба получения исходных данных }
for i:=1 to n do a[i]:=exp(-0.01*sqr(i-5))-0.2;

{ Поиск максимального и минимального значения в массиве }
maxa:=a[1]; mina:=a[1];
for i:=1 to n do
begin
if a[i]>maxa then maxa:=a[i];
if a[i]<mina then mina:=a[i];
end;

i:=0;j:=0;
{ инициализация графического режима. Третий аргумент -- путь к egavga.bgi.
Если скопировать его в директория программы -- то пустая строка. }
initgraph(i,j,'');
{ Дл каждой точки по очереди }
for i:=1 to n do
begin
{ Щирина экрана -- 640, высота -- 480.
Позиция по X: отступ 20 точек плюс i-1 раз интервал между точками
600/20 = 30.
Позиция по Y: расстояние от нижнего края (с учётом отступа
в 20 точек) пропорционально разнице между значением элемента
массива и минимумом }
circle(20+30*(i-1),round(440-(a[i]-mina)/(maxa-mina)*400),5);
end;

{ вертикальная ось }
line(1,0,1,480);
{ горизонтальная ось. Задаётся по нулевому значению. Если 0 в диапазон
значений массива (от mina до maxa) не попадает, то ось не выведется. }
line(0,round(440-(0-mina)/(maxa-mina)*400),
640,round(440-(0-mina)/(maxa-mina)*400));

{ Номера элементов -- выводится каждый пятый }
i:=5;
while (i<=n) do
begin
{ Преобразуем номер в строку }
str(i,s);
outtextxy(20+30*(i-1),470,s);
i:=i+5;
end;
readkey;
closegraph;
end.
Неизвестный
05.05.2011, 19:39
общий
Адресаты:

Спасибо большое, и ещё, а как сделать чтобы горизонтальная ось всегда выводилась?
давно
Профессионал
304622
583
09.05.2011, 22:16
общий
09.05.2011, 22:19
Код:
как сделать чтобы горизонтальная ось всегда выводилась?


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

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