program Grafik_funkcii;
uses crt,graph;
var
{координаты графика функции}
x,y,a,b:real;
{Номера типа графического дрaйвера и номера графического режима}
driver,mode:integer;
{cx,cy - координаты центра системы координат на экране,
mx,my - масштаб (количество пикселей на единицу),
ex,ey - координаты точки графика в масштабе экрана}
cx,cy,mx,my,ex,ey,n:integer;
{Описание функции, график которой затем выводится на экран}
function f(x:real):real;
begin
f:=sin(3*x)+cos(x)/exp(x)
end;
procedure DeleniyaX(a:real);
var
stroka:string;x,s:real;
begin
{Деления выставляются в 10-ти точках от -a до a c шагом s}
x:=-a;s:=2*a/10;
repeat
ex:=trunc(cx+x*mx)-10;
ey:=cy+5;
str(x:3:1,stroka);
outtextxy(ex,ey,stroka);
x:=x+s;
until x>a;
end;
procedure DeleniyaY(b:real);
var
stroka:string;y:real;s:integer;
begin
{Деления по оси Y выставляются в 10 точках от -b до b}
s:=trunc((getmaxy-30)/10);ey:=getmaxy-30;
repeat
ex:=cx+5;
y:=b-ey/my;
str(y:3:1,stroka);
if abs(y)>0.5 then outtextxy(ex,ey+5,stroka);
ey:=ey-s;
until ey<10;
end;
{Подпрограмма построения графика}
procedure MyGrafik(a,b:real);
{Процедура строит график от -a до a c шагом s}
var p,n:integer;s,t:real;
strx:string;
begin
{Положение начала координат на экране}
cx:=trunc(getmaxx/2);cy:=trunc(getmaxy/2);
{Цвета фона и текста}
SetBkColor(yellow);SetColor(blue);
line(10,cy,getmaxx-50,cy);{Ось X}
{Стрелочка на оси X}
line(getmaxx-60,cy-5,getmaxx-50,cy);
line(getmaxx-60,cy+5,getmaxx-50,cy);
line(cx,10,cx,getmaxy-20); {Ось Y}
{Рисование стрелочки на оси y}
line(cx-5,20,cx,10);line(cx+5,20,cx,10);
setcolor(magenta);
{Подписи к осям}
outtextxy(cx+10,10,'y');
outtextxy(getmaxx-50,cy-10,'x');
{Определение масштаба по осям X и Y исходя из того,
что X от -a до a}
mx:=trunc((getmaxx)/(2*a));
{Y от -b до b}
my:=trunc((getmaxy)/(2*b));
{Вывод значений по оси X от -a до a}
DeleniyaX(a);
{Вывод значений по оси Y от -b до b}
DeleniyaY(b);
outtextxy(10,50,'График функции');
{x меняется от -a до a c шагом s в n+1 точке}
x:=-a;n:=500;s:=2*a/n;
moveto(trunc(cx+x*mx),trunc(cy-f(x)*my));
Repeat
y:=f(x);
ex:=trunc(cx+x*mx);
ey:=trunc(cy-y*my);
lineto(ex,ey);
x:=x+s;
Until ex>getmaxx-70;
end;
Begin
clrscr;
write('a=');readln(a);
write('b=');readln(b);
{Открытие графического режима}
driver:=detect;
initgraph(driver,mode,'d:\tp\bgi');
{очистка экрана в графическом режиме}
cleardevice;
{выполнение процедуры вывода графика}
MyGrafik(a,b);
{задержка}
repeat
{до нажатия клавиши Enter}
until keypressed;
End.
a := 1; b := 25
спасибо за совет
Возник вопрос: в каких все-таки случаях надо подключать сопроцессор
ведь в данном случае не используются типы переменных double, extended, single
А какже
x,y,a,b:real;
Ребята у меня вот такая вот функция
y=2^x-5*cos(x)-3
Мне нужно построить по точкам.
Подойдет ли данная программа для моей функции???
Заранее спасибо.
P.S. В Паскале понимаю очень мало.
А заменить функцию на твою и попробовать МЫ должны? Почему не ТЫ?
Замени, и прогони программу. Заодно и расскажешь, работает или нет... Мне тоже интересно...
Можно ли создавать скрин графика с белым фоном. Если да, то как?
Добавил в приведённой выше программе setBkColor(white);
save_bmp(0, 0, getmaxx, getmaxy, 'screen.bmp', 1);
Не помогло
setfillstyle(solidfill, white);Чувствуешь разницу?
bar(0, 0, getmaxx, getmaxy);
...
save_bmp(0, 0, getmaxx, getmaxy, 'screen.bmp', 1);
Спасибо. Теперь можно экономить чёрный картридж.
люди помогите плиз, беру самую простую функцию y=x*x;
при любых а,b выдаёт ошибку вот в этом месте
Repeat.
y:=f(x);
ex:=trunc(cx+x*mx); <=пишет что-то про точки
ey:=trunc(cy-y*my);
lineto(ex,ey);
x:=x+s;
Until ex>getmaxx-70;
пишет "invalid floating point operation"
и выставляет курсор в начало строки
"ey:=trunc(cy-y*my);" и попробовала поставить a=1 b=10
Во-первых, какой у тебя компилятор? А во-вторых, прикрепи-ка файл с программой (не надо весь текст копировать, именно прикрепи PAS-файл!!!) сюда, есть смутное подозрение...
я честно говоря не особо разбираюсь в компиляторах
Прикрепленные файлы
GRAFIK.PAS ( 2.85 килобайт )
Кол-во скачиваний: 332
Угу ... Я так и думал:
function f(x:real):real;
begin
y:=x*x;
end;
function f(x:real):real;
begin
f:=x*x; { <--- Внимательно - ты же должна вернуть результат ФУНКЦИИ }
end;
function f(x:real):real;
begin
f:=x*x; { <--- Внимательно - ты же должна вернуть результат ФУНКЦИИ }
end;
...Где-то стек должен переполниться? Вот в твоем случае он переполняется
for k:=0 to n do
y:=y(x)+y1; { <--- Вот тут... }
...
Другими словами:
F = 10 *
((-1)0 * 19! * (4*x2)10) / (0! * 20!) +
((-1)1 * 18! * (4*x2)9) / (1! * 18!) +
((-1)2 * 17! * (4*x2)8) / (2! * 16!) +
((-1)3 * 16! * (4*x2)7) / (3! * 14!) +
((-1)4 * 15! * (4*x2)6) / (4! * 12!) +
((-1)5 * 14! * (4*x2)5) / (5! * 10!) +
((-1)6 * 13! * (4*x2)4) / (6! * 8!) +
((-1)7 * 12! * (4*x2)3) / (7! * 6!) +
((-1)8 * 11! * (4*x2)2) / (8! * 4!) +
((-1)9 * 10! * (4*x2)1) / (9! * 2!) +
((-1)10 * 9! * (4*x2)0) / (10! * 0!)
?
Тогда ты будешь смеяться, но тебе вообще не нужна НИ функция вычисления факториала, НИ функция возведения в степень... Все, что нужно знать - это чему равен первый член ряда, и как изменяется относительно предыдущего последующий... Вот так будет выглядеть твоя функция:
function f(x: real): real;
var
s, item: real;
p, k: integer;
begin
item := 1/10; s := item;
for k := 9 downto 0 do begin
if k = 9 then p := 1 else p := k + 1;
item := - item * ((19 - k) * p * 4 * sqr(x)) /
(pred(2 * (10 - k)) * (2 * (10 - k)));
s := s + item;
end;
f := 10 * s;
end;
не преувеличила либо ты не правильно посчитал либо не правильно задал у=1 при х=0, а при х=1 у=8654053
кстати у тебя почему то у тебя при х=0 у=8654053?
ты мне лучше скажи как мне функцию с процедурами правильно записать чтобы не переполнять?
у меня просто этих функций мама не горюй и если я у каждой буду члены вычислять меня в дурку заберут
function f(x: real): real;Чему будет равно значение F(0)? Единице... А F(1)? Упс, тоже единица... Так что учи матчасть
function pow(a: real; n: integer): real;
var i: integer; p: real;
begin
p := 1;
for i := 1 to n do p := p * a;
pow := p;
end;
var
s, power: real;
i, k: integer;
begin
s := pow(4 * sqr(x), 10) / 20;
for k := 1 to 10 do begin
power := pow(4 * sqr(x), 10 - k);
if odd(k) then power := - power;
for i := 1 to pred(k) do begin
power := power * (20 - k - i) / (i + 1);
end;
s := s + power;
end;
f := 10 * s;
end;
x := 0;
writeln(f(x) :10 :5); { <--- Старая функция F }
ну ты понимаешь что здесь где-то ошибка
, т.к.
1. я в ручную задавала эту функцию(без процедур степеней и факториалов) и значения были совершенно другие;
2. я некот значения вручную просчитывала
3. у этой ф-и 4 симметричных корня +-0,446(приблизит) и +-1.68(тоже приблизит)
немного не так надо ещё 20-2k+i