27.12.2008, 09:26 | #1 (permalink) |
Новичок
Регистрация: 26.12.2008
Сообщений: 3
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
решена задача в паскале правильно или нет?
------------------------------------------------------------------ uses graph,crt; var Koordx,koordy,x0,y0,dx,dy,dk,gd,gm,i,l,intsn,d,n:i nteger; x1,x2,x,y,sn,xx:real; s:string; begin repeat writeln('vvedite x1 i x2 (x1<x2)'); readln(x1,x2); until x2>x1; gd:=detect; initgraph(gd,gm,''); dx:=round((getmaxx-2*20)/(x2-x1)); dy:=3*dx div 2; X0:=round(20-dx*x1); Y0:=getmaxY div 2; setcolor(white); line(0, Y0, getmaxx, Y0); OutTextXY(getmaxx-10, Y0-15, 'X'); if trunc(x2) - round(x1) > 20 then dk:=(trunc(x2) - round(x1)) div 20 +1 else dk:=1; for i:=round(x1) to trunc(x2) do if i mod dk = 0 then begin str(i,s); Line(X0+round(i*dx), Y0-5,X0+round(i*dx), Y0+5); OutTextXY(X0+round(i*dx), Y0+5, s); end; if x1*x2<0 then begin Line(X0, 1,X0, getmaxy); OutTextXY(X0+5, 5, 'Y'); end; setcolor(green); n:=600; xx:=(x2-x1)/(N-1); x:=x1; y:=sin(x); KoordX:=X0+round(x*dx); KoordY:=Y0-round(y*dy); MoveTo(KoordX,KoordY); for i:=1 to N-1 do begin x:=x+xx; y:=sin(x); KoordX:=X0+round(x*dx); KoordY:=Y0-round(y*dy); LineTo(KoordX,KoordY); end; repeat until keypressed; closegraph; end. |
27.12.2008, 09:26 | |
Helpmaster
Member
Регистрация: 08.03.2016
Сообщений: 0
|
Рекомендую обратить внимание на аналогичные темы Задача на Паскале и С++ Задача на Паскале Задача на Паскале Задача на Паскале |
27.12.2008, 11:15 | #2 (permalink) |
Специалист
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
|
Нет, не правильно. Я попытался ее запустить, и всё, что получил на экране - горизонтальную линию на середине высоты экрана. Я не имею возможности и (простите) желания разбирать Вашу программу, но создается впечатление, что Вы просто попытались скомпилировать что-то из каких-то кусков - накручено сильно много и бездумно. Ну вот, для начала. Вы задаете цикл вида
repeat writeln('vvedite x1 i x2 (x1<x2)'); readln(x1,x2); until x2>x1; АБСОЛЮТНО бессмысленный! Он выполнится заведомо один раз. Далее. Положение Х-оси Вы задаете посередине высоты экрана - зачем? Ведь экспонента не может иметь отрицательных значений! Скатали у коллеги, которому был задан какой-нибудь синус? Ну и т.д. |
27.12.2008, 11:35 | #3 (permalink) |
support
Регистрация: 19.08.2007
Адрес: Зея
Сообщений: 15,797
Записей в дневнике: 71
Сказал(а) спасибо: 166
Поблагодарили 203 раз(а) в 86 сообщениях
Репутация: 75760
|
Все гораздо проще:
запрашиваете пределы для аргумента функции, потом в цикле изменяете координату Х, вычисляете Y и выводите точку. Приращение аргумента советую взять 0.1. Точка выводится командой PutPixel(x,y). Удачи .
__________________
Убить всех человеков! |
27.12.2008, 14:22 | #4 (permalink) | |
Специалист
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
|
Цитата:
P.S. А для построения кривой IMHO предпочтительна команда LineTo. Но это дело вкуса. |
|
27.12.2008, 19:00 | #5 (permalink) |
Новичок
Регистрация: 26.12.2008
Сообщений: 3
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
спасиб за советы0)
|
Ads | |
Member
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
|
|
|