Помощь - Поиск - Пользователи - Календарь
Полная версия: Построение линейной диаграммы (данные из файла)
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Vini
Доброе время суток.
Помогите люди добрые
Составить (очень желательно изминить имеющуюся) программу, которая прочитает данные из файла и интерпретирует их в виде линейной диаграммы.
Нужно как-то изминить процедуру построения линии , чтоб координата конца 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
Попробуй так:
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
СПАСИБО за помощь вот окончательно замученная прога.
Правда может с "орфографией" не очень, но зато работает.
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(c);    {цвет линии}
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.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.