Технический форум

Технический форум (http://www.tehnari.ru/)
-   Delphi, Kylix and Pascal (http://www.tehnari.ru/f43/)
-   -   График функции (http://www.tehnari.ru/f43/t49560/)

Олеся 28.03.2011 18:17

График функции
 
Помогите пожалуйста исправить ошибки в задачах(((((
их две.Вот первая:
uses graph;
function F(x:real):real;
begin
F:=exp(5/2*ln(abs(sqr(x)+3*sqr(x)*x)))+sqrt(x-1);
end;
var xn,xk,max,min,x,y,mx,my,dx:real;
x0,y0,i,px,py:integer;
s:string;
begin
x0:=0;
initgraph(x0,y0,'');
x0:=40;{начало экранных координат}
y0:=getmaxY div 2;
xn:=0.1;xk:=25;{интервал по Х}
mx:=(getmaxX-80)/xk;{масштаб по Х}
{найдем максимумдля масштаба по У, минимум-бесконечность}
max:=F(xn);
x:=xn;
while x<=xk do
begin
x:=x+0.01;
if F(x)>max then max:=F(x)
end;
my:=(y0-40)/max;{по У}
setbkcolor(15);{цвет фона}
setcolor(8);{цвет линий}
line(0,y0,getmaxX,y0);{оси}
line(x0,0,X0,getmaxY);
for i:=1 to round(xk)+1 do{максимальное количество засечек в одну сторону}
begin
line(x0-3,y0-round(i/10*my),x0+3,y0-round(i/10*my));{засечки на оси Y}
line(x0-3,y0+round(i/10*my),x0+3,y0+round(i/10*my));
line(x0+round(i*mx),y0-3,x0+round(i*mx),Y0+3); {засечки на оси Х}
str(i/10:0:1,s);
{подпись оси У}
outtextXY(x0-35,y0-round(i/10*my),s);{соответственно засечкам}
outtextXY(x0-35,y0+round(i/10*my),'-'+s);
{подпись оси Х}
str(i,s);
outtextXY(x0+round(i*mx),y0+10,s);
end;
{центр}
outtextXY(x0+5,y0+10,'0');
{подписи концов осей}
outtextXY(getmaxX-10,y0-10,'X');
outtextXY(x0-10,10, 'Y');
setcolor(8);
{график}
x:=xn;
dx:=0.001;
while x<=xk do
begin
x:=x+dx; {наращиваем х}
px:=x0+round(x*mx); {изменение по оси Х}
y:=F(x); {график в реальных координатах}
py:=y0-round(y*my);{в экранных}
putpixel(px,py,8);
end;
readln
end.
ошибку выводит(((


и вот вторая:
uses graph;
function F(x:real):real;
begin
F:=exp(2.8*ln(abs(18*sqr(x)-ln(x))));
end;
var xn,xk,max,min,x,y,mx,my,dx:real;
x0,y0,i,px,py:integer;
s:string;
begin
writeln('vvedi interval');
readln(xk);
x0:=0;
initgraph(x0,y0,'');
x0:=40;{начало экранных координат}
y0:=getmaxY div 2;
xn:=0.1;
mx:=(getmaxX-80)/xk;{масштаб по Х}
{найдем максимумдля масштаба по У, минимум-бесконечность}
max:=F(xn);
x:=xn;
while x<=xk do
begin
x:=x+0.01;
if F(x)>max then max:=F(x)
end;
my:=(y0-40)/max;{по У}
setbkcolor(15);{цвет фона}
setcolor(8);{цвет линий}
line(0,y0,getmaxX,y0);{оси}
line(x0,0,X0,getmaxY);
for i:=1 to round(xk)+1 do{максимальное количество засечек в одну сторону}
begin
line(x0-3,y0-round(i/10*my),x0+3,y0-round(i/10*my));{засечки на оси Y}
line(x0-3,y0+round(i/10*my),x0+3,y0+round(i/10*my));
line(x0+round(i*mx),y0-3,x0+round(i*mx),Y0+3); {засечки на оси Х}
str(i/10:0:1,s);
{подпись оси У}
outtextXY(x0-35,y0-round(i/10*my),s);{соответственно засечкам}
outtextXY(x0-35,y0+round(i/10*my),'-'+s);
{подпись оси Х}
str(i,s);
outtextXY(x0+round(i*mx),y0+10,s);
end;
{центр}
outtextXY(x0+5,y0+10,'0');
{подписи концов осей}
outtextXY(getmaxX-10,y0-10,'X');
outtextXY(x0-10,10, 'Y');
setcolor(8);
{график}
x:=xn;
dx:=0.001;
while x<=xk do
begin
x:=x+dx; {наращиваем х}
px:=x0+round(x*mx); {изменение по оси Х}
y:=F(x); {график в реальных координатах}
py:=y0-round(y*my);{в экранных}
putpixel(px,py,8);
end;
readln
end.

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


Пожалуйстааааааааааааааааа,очень надо

Vladimir_S 28.03.2011 21:48

Цитата:

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

Естественно, если у Вас поставлено считывание только одной переменной:
readln(xk);
Замените на
readln(x0,xk);
и не будет ошибки. Числа вводить через пробел. Соответственно дальше
x0:=0;
надо убрать.

Олеся 29.03.2011 12:55

сделала как вы посоветовали,но график все равно строится не в заданном мной интервале(((

Vladimir_S 29.03.2011 13:07

Цитата:

Сообщение от Олеся (Сообщение 494219)
сделала как вы посоветовали,но график все равно строится не в заданном мной интервале(((

Олеся, будет время - посмотрю Ваши программы. К сожалению, пока я на работе и очень занят. Возможно, вечером.

Олеся 29.03.2011 13:21

была бы очень благодарна))))я уже неделю с ними мучаюсь(((:tehnari_ru_325:

Vladimir_S 29.03.2011 23:11

Вложений: 1
Цитата:

Сообщение от Олеся (Сообщение 493779)
Вот первая:

М-да... Стыдно сказать, но часа три провозился. В общем, основательно переделал, получилось так:
Код:

uses CRT, graph;

function F(x:real):real;
 begin
  F:=exp(5/2*ln(abs(sqr(x)+3*sqr(x)*x)))+sqrt(x-1);
 end;

var
 xn,xk,max,min,x,y,mx,my,y_min,y_max,z:real;
 x0,y0,i,px,py,N:integer;
 s:string;

BEGIN
  initgraph(..., ..., ''); {параметры процедуры InitGraph задайте сами!

 {найдем максимум и минимум для масштаба по У}
  xn:=1.0; {начальное значение х}
  xk:=1.2; {конечное значение х}
  max:=F(xn);
  min:=F(xn);
  x:=xn;
  while x<=xk do
  begin
    x:=x+0.01;
    if F(x)>max then max:=F(x);
    if F(x)<min then min:=F(x);
  end;
  y_min:=TRUNC(min/10)*10;
  y_max:=(TRUNC(max/10)+1)*10;
  x0:=40;{начало экранных координат}
  y0:=getmaxY-40 ;
  mx:=(getmaxX-40)/(xk-xn);{масштаб по Х}
  my:=(getmaxY-40)/(y_max-y_min);{масштаб по Y}
  setbkcolor(15);{цвет фона}
  setcolor(8);{цвет линий}
  line(40,y0,getmaxX,y0);{оси}
  line(40,0,40,y0);
  N:=Round((y_max-y_min)/10);
  SetTextStyle(defaultfont,horizdir,1);
  SetTextJustify(RightText,CenterText);
  for i:=0 to N do
  begin
    line(x0-3,y0-round(i*10*my),x0+3,y0-round(i*10*my));{засечки на оси Y}
    str(Round(y_min+i*10),s);
    {подпись оси У}
    if i<N then
    outtextXY(x0-10,y0-round(i*10*my),s);{соответственно засечкам}
  end;
  N:=Round((xk-xn)/0.02);
  SetTextJustify(CenterText,TopText);
  for i:=0 to N do
  begin
    line(x0+round(i*0.02*mx),y0-3,x0+round(i*0.02*mx),y0+3);{засечки на оси Х}
    str((xn+0.02*i):4:2,s);
    {подпись оси Х}
    if i<N then
    outtextXY(x0+round(i*0.02*mx),y0+10,s);{соответственно засечкам}
  end;
  N:=Round((xk-xn)/0.0001);
  x:=xn;
  y:=F(x);
  MoveTo(x0,y0-round((y-y_min)*my));
  SetColor(Red);
  for i:=1 to N do
  begin
    x:=xn+0.0001*i;
    y:=F(x);
    LineTo(x0+round((x-xn)*mx),y0-round((y-y_min)*my));
  end;
  ReadKey;
END.

В итоге должно получиться вот так: Вложение 33869

Со второй - и не знаю, как получится со временем.

Олеся 29.03.2011 23:30

ой,спасибо огромнооооооооое))))))))))))))))))))))))))

Олеся 29.03.2011 23:30

:tehnari_ru_674:

Хелен 31.03.2011 12:27

F:=exp(5/2*ln(abs(sqr(x)+3*sqr(x)*x)))+sqrt(x-1);

Я так понимаю, это уравнение рисует программа?
А если я например хочу, сама ввести любое другое, будь то: F(x)=cos(x) или F(x)=ax^2+bx+c. и чтобы не только нарисовало, но и корни посчитала?

Vladimir_S 31.03.2011 12:46

Цитата:

Сообщение от Хелен (Сообщение 495314)
F:=exp(5/2*ln(abs(sqr(x)+3*sqr(x)*x)))+sqrt(x-1);

Я так понимаю, это уравнение рисует программа?
А если я например хочу, сама ввести любое другое, будь то: F(x)=cos(x) или F(x)=ax^2+bx+c. и чтобы не только нарисовало, но и корни посчитала?

Тогда нужно сесть и, например, написать соответствующую универсальную программу.


Часовой пояс GMT +4, время: 20:39.

Powered by vBulletin® Version 4.5.3
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.