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

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

Форум «Всё о Паскале» _ Задачи _ !HELP! 2 графика по данным из файлов !HELP!

Автор: Zopaa 29.05.2009 2:25


program gjhg;
uses graph;
const n=100;
h=10;
g=9.8;
m=4;
l=15;
v=10;
p=1000;
c=2;
k=3;
var driver,mode,i,,j:integer;
var tm,fi0,fi1,w1,w0,t,dt:real;
f,e:text;
begin
dt:=0.00001;
tm:=20;
fi0:=pi/6;
w0:=0;
assign(f,'dta');
rewrite(f);
assign(e,'atd');
rewrite(e);
while t<tm do
begin
if sin(fi0)<=(h/l) then
begin
w1:=w0+(dt/sqr(l)/m)*(-c*fi0-m*g*sin(fi0)*l);
fi1:=fi0+w0*dt;
fi0:=fi1;
w0:=w1;
t:=t+dt;
end
else begin
w1:=w0+(dt/m/sqr(l))*(-c*fi0-m*g*sin(fi0)*l-k*w0*sqr(l));
fi1:=fi0+w0*dt;
fi0:=fi1;
w0:=w1;
t:=t+dt;
end;
j:=j+1;
if j mod 1000=0 then
begin
writeln(e,t,fi1);
writeln(f,t,w1);
j:=0;
end;
end;
close(f);
close(e);
end.


далее нужно строить график, помогите разобраться...если можно то прям щас smile.gif blush.gif

Автор: amega 29.05.2009 2:57

http://forum.pascal.net.ru/index.php?showtopic=23570&hl=

Автор: Zopaa 29.05.2009 3:01

я это видела, но что-то у меня не получается...он мне ошибку выдавал ошибочно арифметическое действие для ввода...в месте где я говорила с читать из файла.

Автор: Krjuger 29.05.2009 3:15

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

Автор: Zopaa 29.05.2009 3:18

я творила творила, и закрыла не сохроняя..

Автор: Zopaa 29.05.2009 19:38

 
program gjhg;
uses graph;
const n=100;
xgmin=100;
xgmax=480;
ygmin=200;
ygmax=300;
h=10;
g=9.8;
m=4;
l=15;
v=10;
p=1000;
c=2;
k=3;
var driver,mode,i,xg,yg,xl,yl,j:integer;
a,b,ymin,ymax:real;
x,y:array[1..n] of real;
s:string;
var tm,fi0,fi1,w1,w0,t,dt:real;
f,e:text;
begin
dt:=0.00001;
tm:=20;
fi0:=pi/6;
w0:=0;
assign(f,'dta');
rewrite(f);
assign(e,'atd');
rewrite(e);
while t<tm do
begin
if cos(fi0)<=(h/l) then
begin
w1:=w0+(dt/sqr(l)/m)*(-c*fi0-m*g*sin(fi0)*l);
fi1:=fi0+w0*dt;
fi0:=fi1;
w0:=w1;
t:=t+dt;
end
else begin
w1:=w0+(dt/m/sqr(l))*(-c*fi0-m*g*sin(fi0)*l-k*w0*sqr(l));
fi1:=fi0+w0*dt;
fi0:=fi1;
w0:=w1;
t:=t+dt;
end;
j:=j+1;
if j mod 100000=0 then
begin
writeln(e,t,' ',fi1);
writeln(f,t,' ',w1);
j:=0;
end;
end;
close(f);
close(e);
end.



program gjhg;
uses graph;
const n=30;
xgmin=100;
xgmax=480;
ygmin=200;
ygmax=300;
var driver,mode,i,xg,yg,xl,yl,q:integer;
a,b,ymin,ymax:real;
x,y,z,u:array[1..n] of real;
s:string;
w1,t:real;
f,e:text;
begin
a:=0;
b:=20;
driver:=detect;
Initgraph(driver,mode, 'D:\work');
ClearDevice;
assign(f,'dta');
reset(f);
for i:=1 to n do
readln(f,x[i],y[i]);
{for i:=1 to n do writeln(x[i],y[i]); }
assign(e,'atd');
reset(e);
for i:=1 to n do
readln(e,z[i],u[i]);
{for i:=1 to n do writeln(z[i],u[i]); }
ymax:=y[1];
for i:=2 to n do
if y[i]>ymax then
begin
ymax:=y[i];
end;
ymin:=y[1];
for i:=2 to n do
if y[i]<ymin then
begin
ymin:=y[i];
end;
rectangle(xgmin,ygmin,xgmax,ygmax);
q:=0;
i:=30;
while q<1 do
begin
if frac((xgmax-xgmin)/i)=0 then
q:=i else i:=i+1;
end;
xl:=xgmin;
while xl<xgmax do begin
Line(xl,ygmin,xl,ygmax);
xl:=xl+q;
str(xl,s);
OutTextXY(xl-40,ygmin+110,s);
end;
q:=0;
i:=30;
while q<1 do
begin
if frac((ygmax-ygmin)/i)=0 then
q:=i else i:=i+1;
end;
yl:=ygmin;
while yl<ygmax do
begin
Line(xgmin,yl,xgmax,yl);
yl:=yl+q;
str(yl,s);
OutTextXY(xgmin-25,yl-6,s);
end;
xg:=round(xgmin+(x[1]-a)/(b-a)*(xgmax-xgmin));
yg:=round(ygmax-(y[1]-ymin)/(ymax-ymin)*(ygmax-ygmin));
Moveto (xg,yg);
for i:=2 to n do
begin
xg:=round(xgmin+(x[i]-a)/(b-a)*(xgmax-xgmin));
yg:=round(ygmax-(y[i]-ymin)/(ymax-ymin)*(ygmax-ygmin));
Lineto (xg,yg);
end;
OutTextXY(ygmin-100,xgmin+80,'fi');
OutTextXY(ygmax+190,xgmax-180,'t');
readln;
closegraph;
end.


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

Автор: Zopaa 30.05.2009 3:26

ну кто-нибудь...ну не получается у меня...

Автор: Krjuger 30.05.2009 3:34

Ну ты хоть напиши,что имено не работает,не запускается,выводин неправильно или что?плюс ты хотяб нашипи,что у тебя в файле то написано,или помогающим тебе угадать надо?

Автор: Zopaa 30.05.2009 3:43

ну в программе видно, в файл f записывается t и w1(в данном случае это у меня время и скорость ), а в файл e записывается t и fi1(время и угол) .
все работает, но пока написано только для построения одного графика по данным файла f.
теперь нужно построить на том же графике, ну или на другом, по данным файла e.+ надо внизу и сбоку подписать значения...вот...у меня уже мозг перестал думать после всего что надумала, а сдавать в понедельник..

Автор: Lapp 30.05.2009 8:47

Дорогая Zopaa (кхм..), очень тебе не повезло с ником((. Кто тебе такой присоветовал? Плюнь ему в лицо - скажи, я просил. Очень он тебе вредит. Я много раз порывался тебе ответить, но как подумаю, с чем буду разговаривать - сразу желание пропадает. И, думаю, не один я так. Но вот, пересилил, вроде. Если в середине ответа вырвет - не обессудь, все усилия прилагаю, чтоб сдержаться..

Давай с начала.
Прога, которая делает файлы, gjhg (тебе специально хочется, чтоб другие время тратили на хотя бы чтение таких названий??), вылетает у тебя по Range Check. Включи себе в опциях эту проверку и никогда не выключай, иначе годы потратишь, чтоб понять, почему у тебя вдруг программа не работает.
Вылет в строке:

                j:=j+1;

, и это естественно. Либо сделай j типа LongInt, либо (лучше) убери вообще j и сравнивай непосредственно t.

Дальше - зачем тебе в ней юнит Graph? Выброси, лишний.
Все, больше не могу... извини... может, попозже... кто не спрятался - я не виноват!!

Автор: Lapp 30.05.2009 10:00

Уважаемая Zopaa, объясни еще раз - чего ты хочешь?
Извини, конечно, что прошу тебя тратить время не по прямому назначению, но не могла ли бы ты сказать поточнее, что тебе нужно? Вот твоя продукция (не решаюсь тут назвать нужным словом):

Прикрепленное изображение

Что в нем не так? Все, вроде, подписано..

Автор: Krjuger 30.05.2009 16:07

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

Автор: Zopaa 30.05.2009 16:34

во-первых я не могу сооброзить как построить второй график, другим цветом на том который сейчас(чтобы была вторая линия), во-вторых подписи под графиком(всмысле цифры) какие-то левые, я так думаю что мне надо те значения по которым строится...вобще мне надо как-то так сделать чтобы было красиво...

Автор: Krjuger 30.05.2009 20:17

Вообще главная задача программы,чтобы работала,насчет красиво,тогда поясни,что в твоем понимании красиво.Цифры как раз те по которым стоится.

Максимальный номер цвета, воспринимаемый адаптером в текущем графическом режиме, может быть получен при помощи функции GetMaxColor : Word
На экране всегда различаются цвет фона и цвет пера. Все процедуры изображения фигур, если не содержат в себе явной установки цвета, рисуют эти фигуры цветом пера, который устанавливается процедурой SetColor(Color : Word).
Константа Число Цвет
Black 0 Черный
Blue 1 Синий
Green 2 Зеленый
Cyan 3 Голубой
Red 4 Красный
Magenta 5 Фиолетовый
Brown 6 Коричневый
LightGray 7 Ярко-серый
DarkGray 8 Темно-серый
LightBlue 9 Ярко-синий
LightGreen 10 Ярко-зеленый
LightCyan 11 Ярко-голубой
LightRed 12 Ярко-красный
LightMagena 13 Ярко-фиолетовый
Yellow 14 Желтый
White 15 Белый
Захочеш фон поменять.SetBkColor( Color :Word)

Какой второй график?Ты как раз и строиш второй график.Лап скрин привел даже с результатом,или тебе надо время от скорости?,а вообще я бы посовеловал создать процедуру начертания графиков и дальше в зависимости от параметров строить,в твоем слушае, как параменты, поменяются файлы и значения осей.

Автор: volvo 30.05.2009 20:24

Цитата
Blink 128 Мерцание
Это что за фигня? Нет мерцания в граф. режимах... Не надо путать Crt и Graph...

Цитата
во-первых я не могу сооброзить как построить второй график, другим цветом на том который сейчас(чтобы была вторая линия), во-вторых подписи под графиком(всмысле цифры) какие-то левые
Во-первых, не надо все сваливать в одну куче: оформила бы построение графика из файла отдельной процедурой - было бы по-человечески, и не надо копировать код для построения второго графика, и отлаживать надо один раз, а не 2. Ты же предпочла сделать все через ... рекурсию (Lapp, я не мог удержаться, извини smile.gif ), привязать все к каким-то магическим цифрам, что ж ты хочешь теперь?

А во-вторых, по-хорошему файл, по которому ты строишь график, должен содержать всю необходимую информацию для его построения, и границы по оси абсцисс/ординат, и сами значения. А дело программы - только отобразить эти данные, а не вычислять их...

Автор: Krjuger 30.05.2009 20:35

Цитата

Нет мерцания в граф. режимах... Не надо путать Crt и Graph...

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

Автор: Lapp 31.05.2009 10:40

Цитата(Krjuger @ 30.05.2009 17:17) *
насчет красиво,тогда поясни,что в твоем понимании красиво.
Krjuger, ты о чем вообще?.. smile.gif
Мне представляется, что автор как нельзя лучше изложила свою концепцию красоты, назвав себя ником Zopaa..

Автор: Krjuger 31.05.2009 14:56

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

Автор: sheka 31.05.2009 15:35

Цитата(Krjuger @ 31.05.2009 10:56) *

привликает к ней внимание. lol.gif blum.gif
смайлы в тему, особенно второй! (извините);

скажите, при чем тут файлы, и что они должны содержать и в каком виде?
раза 3 перечитал тему и не понял ни про файди ни вообще в чем проблема уважаемой ....
объясните пожалуйста.


Автор: Krjuger 31.05.2009 15:41

Ну как я понял она в первом куске вычисляет координаты точек и записывает их в 2 файла(первый скорость-время,второй угол время)ну и в общем ей надо их оба вывести один на другом,причем ее программа спокойно выводит один график,но ей надо чтобы КРАСИВО......и чтобы оба были друг на друге,либо друг под другом(по моему первый вариант даже бред(зачем зависимость угла и зависимость скорости от времени на одном графике рисовать.)

Автор: sheka 31.05.2009 16:00

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

volvo, я где-то видел ссылку по которой объяснялось как вмонтировать графические файлы в ехе, не мог бы ее скинуть?

Автор: Lapp 31.05.2009 16:09

Цитата(sheka @ 31.05.2009 13:00) *
вмонтировать графические файлы в ехе
Что ты имеешь в виду под графическими файлами?.. bgi? И зачем тебе это здесь? Уточни, плз.

Автор: volvo 31.05.2009 16:11

Цитата
как вмонтировать графические файлы в ехе
Очень просто, так же, как и вмонтировать драйверы в EXE-шник: преобразовать изображение с помощью BINOBJ в формат OBJ-файла, и прилинковать его к программе через {$L PIC.OBJ}, а зачем тебе это понадобилось?

Автор: sheka 31.05.2009 16:36

Цитата(Lapp @ 31.05.2009 12:09) *

Что ты имеешь в виду под графическими файлами?.. bgi?

да, bgi,tpu итд.

просто если прога готова, то с ней надо в папке носить эти файлы - что очень не удобно и иногда они "куда-то деваются".

volvo, я тебя вообще не понимаю, так как ничего этого не знаю!
в том посте было достаточно подробно описано(хотя и там ничего почти не понял), но хочу разобраться.

и еще маленький вопрос не по теме - почему прога сделаная не делфи на ноутбуках работает, а сделаная на паскале - нет?


Автор: volvo 31.05.2009 16:44

Цитата
хочу разобраться.
Разбирайся: http://volvo71.narod.ru/faq_folder/bgiexe.htm

Цитата
маленький вопрос не по теме
Вопрос действительно не по теме... По крайней мере в этом разделе и с такими исходными данными. Нужно знать хотя бы версию ОС, и ее реакцию на запуск EXE-шника, чтобы отвечать на этот вопрос. У меня на ноуте под WinXP все прекрасно работало.

Автор: Zopaa 1.06.2009 4:11

 program gjhg;
uses graph;
const n=30;
xgmin=100;
xgmax=540;
ygmin=100;
ygmax=380;
var driver,mode,i,xg,yg,xl,yl,q,o:integer;
a,b,ymin,ymax:real;
x,y,z,u:array[1..n] of real;
s:string;
w1,t:real;
f,e:text;
begin
writeln('vvedite 1, eclu xotute yvudet'' Fi ot T; vvedite 2, eclu xotute yvudet'' W ot T ') ;
read(o);
a:=0;
b:=20;
driver:=detect;
Initgraph(driver,mode, 'D:\work');
ClearDevice;
assign(f,'dta');
reset(f);
{for i:=1 to n do
readln(f,x[i],y[i]);
{for i:=1 to n do writeln(x[i],y[i]); }
assign(e,'atd');
reset(e);
{for i:=1 to n do
readln(e,z[i],u[i]);
{for i:=1 to n do writeln(z[i],u[i]); }
if o=1 then begin
for i:=1 to n do readln(f,x[i],y[i]) end
else begin
for i:=1 to n do readln(e,x[i],y[i]); end;
{ x[i]:=z[i];
y[i]:=u[i];
end else
begin }
ymax:=y[1];
for i:=2 to n do
if y[i]>ymax then
begin
ymax:=y[i];
end;
ymin:=y[1];
for i:=2 to n do
if y[i]<ymin then
begin
ymin:=y[i];
end;
rectangle(xgmin,ygmin,xgmax,ygmax);
q:=0;
i:=30;
while q<1 do
begin
if frac((xgmax-xgmin)/i)=0 then
q:=i else i:=i+1;
end;
xl:=xgmin;
while xl<xgmax do begin
Line(xl,ygmin,xl,ygmax);
xl:=xl+q;
str(xl,s);
OutTextXY(xl-10,ygmin+290,s);
end;
q:=0;
i:=30;
while q<1 do
begin
if frac((ygmax-ygmin)/i)=0 then
q:=i else i:=i+1;
end;
yl:=ygmin;
while yl<ygmax do
begin
Line(xgmin,yl,xgmax,yl);
yl:=yl+q;
str(yl,s);
OutTextXY(xgmin-26,yl-7,s);
end;
{if o=1 then begin}
xg:=round(xgmin+(x[1]-a)/(b-a)*(xgmax-xgmin));
yg:=round(ygmax-(y[1]-ymin)/(ymax-ymin)*(ygmax-ygmin));
Moveto (xg,yg);
setcolor(9);
for i:=2 to n do
begin
xg:=round(xgmin+(x[i]-a)/(b-a)*(xgmax-xgmin));
yg:=round(ygmax-(y[i]-ymin)/(ymax-ymin)*(ygmax-ygmin));
Lineto (xg,yg);
setcolor(9);
setcolor(10);
end;
SetTextJustify(1,3);
OutTextXY(ygmin-5,xgmin-10,'fi');
SetTextJustify(2,1);
OutTextXY(ygmax+170,xgmax-160,'t');
{end;}
{if o=2 then begin
x[i]:=z[i];
y[i]:=u[i];
xg:=round(xgmin+(x[1]-a)/(b-a)*(xgmax-xgmin));
yg:=round(ygmax-(y[1]-ymin)/(ymax-ymin)*(ygmax-ygmin));
Moveto (xg,yg);
setcolor(9);
for i:=2 to n do
begin
xg:=round(xgmin+(x[i]-a)/(b-a)*(xgmax-xgmin));
yg:=round(ygmax-(y[i]-ymin)/(ymax-ymin)*(ygmax-ygmin));
Lineto (xg,yg);
setcolor(9);
end;
setcolor(10);
SetTextJustify(1,3);
OutTextXY(ygmin-5,xgmin-10,'w');
SetTextJustify(2,1);
OutTextXY(ygmax+170,xgmax-160,'t')
end; }
if (o<>1) and (o<>2) then write('error');
readln;
closegraph;
end.


почему он не хочет что-либо строить..где ошибка??

Автор: Lapp 1.06.2009 9:38

Цитата(Zopaa @ 1.06.2009 1:11) *
почему он не хочет что-либо строить..где ошибка??

Дорогая моя Zopaa, когда же ты поймешь, что твоя краткость вредит тебе самой? Твой код у меня отработал, построил график (все тот же). Что ты хотела - я не знаю. Гадать, тратить время на подробный анализ кода в попытке понять, что ты пыталась сделать - извини, не могу. Уважай собеседников, давай больше информации.
Успехов тебе.