Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Построение линейной диаграммы (данные из файла)

Автор: Vini 4.12.2005 16:43

Доброе время суток.
Помогите люди добрые
Составить (очень желательно изминить имеющуюся) программу, которая прочитает данные из файла и интерпретирует их в виде линейной диаграммы.
Нужно как-то изминить процедуру построения линии , чтоб координата конца 1 линии была координатой начала 2 линии, и т.д. (5 значений в файле, 4 линии)
Ниже имеется измученная мной прога,


Program lineynay;
Uses Crt,Graph;
Const x=50; y=450;
{
х и у - горизонтальная и вертикальная
графические координаты левого нижнего угла диаграммы
}
var
x1 ,x2, grdr, grmd, st,i:integer;
f:text;
s1,s2,s3,s4,s5:integer;

Procedure Lin(c,k:integer; s:string; var xl,x2:integer);

{
данная процедура для каждой категории строит линию
в диаграмме и добавляет соответствующую запись в легенду;
с - цвет текущей линии,
k - число, относящееся к текущей линии,
s - переменная, содержащая текст записи, которая заносится в легенду;
x1 - горизонтальная координата правой границы предыдущей линии,
x2 - верхняя граница текущей записи в легенде
}
begin
SetColor( c ); {цвет линии}

Line(x1+30,y-k*20,x2+50,y-1); {линия 1=20 пикселям}

x1:=x1+50; {смещение начала следующей линии в диаграммы}
SetColor(15); {цвет легенды}
OuttextXY(x2,460,s); {надпись легенды}
x2:=x2+50; {смещение след надписи легеды}
end;

begin
ClrScr; {чистим экран}
assign(f,'GRAFIK.TXT'); {связывает f с файлом 'GRAFIK.TXT'}
reset(f); {открывает для чтения файл f}
while not eof(f) do {делать пока не конец файла}
Begin readln(f,s1,s2,s3,s4,s5);end;
{считывает из f во вспомогательные переменные}
close(f);
grdr:=detect; {автоопределение графического адаптера}
InitGraph(grdr, grmd,'');{иницыализация графики}
x1:=x-30; {координаты первого столбца по х}
x2:=55; {координаты первой легенды по у}
Line(x,y,x+325,y) ;{горизонтальная линия}
Line(x,100,x,y); {вертикальная линия}
OuttextXY(x-20,y,'0');
Line(x-3,y-100,x+3,y-100);
OuttextXY(x-20,y-100,'5');
Line(x-3,y-200,x+3,y-200);
OuttextXY(x-20,y-200,'10');
Line(x-3,y-300,x+3,y-300);
OuttextXY(x-20,y-300,'15');

{построение графика по данным из файла}
Lin(yellow, s1, 'A1', x1, x2);
Lin(magenta, s2, 'A2', x1, x2);
Lin(green, s3, 'A3', x1, x2);
Lin(lightred, s4, 'A4', x1, x2);
Lin(6, s5, 'A5', x1, x2);

SetTextStyle(defaultfont, horizdir, 2);
SetColor(cyan);
OuttextXY(100,30 , 'Деловая графика');
Readln;
Closegraph
End.

Автор: volvo 4.12.2005 17:08

Попробуй так:

Program lineynay;
Uses Crt,Graph;
Const
x=50; y=450;

var
x1 ,x2, grdr, grmd, st,i:integer;
f:text;
s1,s2,s3,s4,s5:integer;
start: integer;

Procedure Lin(c,k:integer; s:string; var xl,x2:integer);
begin
SetColor( c );
Line(x1+30, y-start*20, x2+50,y-k*20); start := k;
x1:=x1+50;
SetColor(15);
OuttextXY(x2,460,s);
x2:=x2+50;
end;

begin
ClrScr;
assign(f,'GRAFIK.TXT'); reset(f);
while not eof(f) do begin
readln(f,s1,s2,s3,s4,s5);
end;
close(f);

grdr:=detect;
InitGraph(grdr, grmd,'');
x1:=x-30;
x2:=55;
Line(x,y,x+325,y);
Line(x,100,x,y); OuttextXY(x-20,y,'0');
Line(x-3,y-100,x+3,y-100); OuttextXY(x-20,y-100,'5');
Line(x-3,y-200,x+3,y-200); OuttextXY(x-20,y-200,'10');
Line(x-3,y-300,x+3,y-300); OuttextXY(x-20,y-300,'15');

start := 0;
Lin(yellow, s1, 'A1', x1, x2);
Lin(magenta, s2, 'A2', x1, x2);
Lin(green, s3, 'A3', x1, x2);
Lin(lightred, s4, 'A4', x1, x2);
Lin(6, s5, 'A5', x1, x2);

SetTextStyle(defaultfont, horizdir, 2);
SetColor(cyan);
OuttextXY(100,30 , 'Деловая графика');
Readln;
Closegraph
End.
Там, правда, получается небольшое "захлестывание" линий, но сама идея должна быть понятна...

Автор: Vini 6.12.2005 6:17

СПАСИБО за помощь вот окончательно замученная прога.
Правда может с "орфографией" не очень, но зато работает.

Program Grafik_ALL;
Uses Crt,Graph;
label metka1,metka2,metka3;
Const x=50; y=450;
var
x1,x2,grdr,grmd,st,i,ugol,y3,sum,s1,s2,s3,s4,s5,v:integer;
f:text;
s : array[1..5] of integer;

Procedure Lin(c,k,k2:integer; s:string; var xl,x2:integer);
begin {начало тела процедуры}
SetColor©; {цвет линии}
Line(x1+30,y-k*20,x2+55,y-k2*20); {линия 1=20 пикселям}
x1:=x1+50; {смещение начала следующей линии в диаграммы}
SetColor(15); {цвет легенды}
OuttextXY(x2,460,s); {надпись легенды}
x2:=x2+50; {смещение след надписи легеды}
end; {конец тела процедуры}
{**}
Procedure sektor(c,k:integer; s:string; var ugol,y:integer);
var delta,xp,yp:integer;
pr,q,radian:real;
proc:string;
begin
q:=k/sum;
delta:=round(q*360);
If (ugol+delta)>360 then delta:=delta-1;
SetFillStyle(solidfill, c);
Pieslice(200, 300, ugol, ugol+delta,120) ;
pr:=100*q;
radian:=(ugol+delta/2)*pi/180;
xp:=round(200+cos(radian)*150);
yp:=round(300-sin(radian)*150);
OuttextXY(xp, yp, s);{надпись легенды}
ugol:=ugol+delta;
y:=y+30;
end;
{**}
Procedure stolb(c,k:integer; s:string; var xl,x2:integer);
begin
SetFillStyle(solidfill,c);{заполнение прямоуголника цветом с}
Bar(x1+30,y-k*20,x1+50,y-1); {прямоугольник диаграммы 1=20 пикселям}
x1:=x1+50; {смещение следующего прямо-ка диаграммы}
OuttextXY(x2,460,s); {надпись легенды}
x2:=x2+50; {смещение след надписи легеды}
end;
{***}

begin
ClrScr;
Writeln('Вас приветствует программа деловая графика.');
Writeln('Выбирите желаемый график для представления числовых данных из файла.');
Writeln('1)-Линейный');
Writeln('2)-Круговой');
Writeln('3)-Столбиковый');
Readln(v); {Выбор пользователя}
Case v of
1: Goto metka1;
2: Goto metka2;
3: Goto metka3;
end;
Begin;
metka1:
ClrScr; {чистим экран}
assign(f,'GRAFIK.TXT'); {связывает f с файлом 'GRAFIK.TXT'}
reset(f); {открывает для чтения файл f}
for i:=1 to 5 do
ReadLn(f, s[i]);{считывает из f во вспомогательные переменные s[i]}
close(f);
grdr:=detect; {автоопределение графического адаптера}
InitGraph(grdr, grmd,'');{иницыализация графики}

x1:=x-30; {координаты первой линии по х}
x2:=45; {координаты первой легенды по у}
Line(x,y,x+325,y) ;{горизонтальная линия}
Line(x,100,x,y); {вертикальная линия}
OuttextXY(x-20,y,'0');{надпись цены деления}
Line(x-3,y-100,x+3,y-100); {черта цены деления}
OuttextXY(x-20,y-100,'5');
Line(x-3,y-200,x+3,y-200);
OuttextXY(x-20,y-200,'10');
Line(x-3,y-300,x+3,y-300);
OuttextXY(x-20,y-300,'15');{надпись цены деления}

{построение графика по данным из файла}
Lin(yellow, s[1],s[2], 'A1', x1, x2);
Lin(magenta, s[2],s[3], 'A2', x1, x2);
Lin(green, s[3],s[4], 'A3', x1, x2);
Lin(lightred, s[4],s[5], 'A4', x1, x2);
OuttextXY(x2,460,'A5'); {вывод легенды для 5-го значения}

SetTextStyle(defaultfont, horizdir, 2);
SetColor(cyan);
OuttextXY(100,30 , 'Деловая графика');
Readln;
Closegraph;
exit;
End;

{*************}
begin
metka2:
ClrScr;
assign(f,'GRAFIK.TXT'); {связывает f с файлом 'GRAFIK.TXT'}
reset(f); {открывает для чтения файл f}
while not eof(f) do {делать пока не конец файла}
Begin
readln(f,s1,s2,s3,s4,s5); {считывает из f во вспомогательные переменные}
end;
close(f);
grdr:=detect;
InitGraph(grdr, grmd, '');

sum:=s1+s2+s3+s4+s5;
y3:=200; ugol:=0;
Circle(200,300,120);
sektor(yellow, s1, 'А1',ugol,y3);
sektor(magenta, s2, 'А2',ugol,y3);
sektor(green, s3, 'А3',ugol,y3);
sektor(lightred, s4, 'А4',ugol,y3);
sektor(blue, s5, 'А5',ugol,y3);
SetTextStyle(defaultfont, horizdir,2);
SetColor(cyan);
OuttextXY(100, 15, 'Деловая графика');

Readln;
Closegraph;
exit;
end;

{******************}
begin
metka3:
ClrScr; {чистим экран}
assign(f,'GRAFIK.TXT'); {связывает f с файлом 'GRAFIK.TXT'}
reset(f); {открывает для чтения файл f}
while not eof(f) do {делать пока не конец файла}
Begin
readln(f,s1,s2,s3,s4,s5); {считывает из f во вспомогательные переменные}
end;
close(f);

grdr:=detect;
InitGraph(grdr, grmd,'');{определение видео режима}
x1:=x-29; {координаты первого столбца по х}
x2:=55; {координаты первой легенды по у}
Line(x,y,x+325,y) ;{горизонтальная линия}
Line(x,100,x,y); {вертикальная линия}
OuttextXY(x-20,y,'0');
Line(x-3,y-100,x+3,y-100);
OuttextXY(x-20,y-100,'5');
Line(x-3,y-200,x+3,y-200);
OuttextXY(x-20,y-200,'10');
Line(x-3,y-300,x+3,y-300);
OuttextXY(x-20,y-300,'15');

{построение графика по данным из файла}
stolb(yellow, s1, 'A1', x1, x2);
stolb(magenta, s2, 'A2', x1, x2);
stolb(green, s3, 'A3', x1, x2);
stolb(lightred, s4, 'A4', x1, x2);
stolb(blue, s5, 'A5', x1, x2);

SetTextStyle(defaultfont, horizdir, 2);
SetColor(cyan);
OuttextXY(100,30 , 'Деловая графика');
Readln;
Closegraph;
End;
exit;
end.