IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

2 страниц V  1 2 >  
 Ответить  Открыть новую тему 
> построение графика функции
сообщение
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 19
Пол: Мужской

Репутация: -  0  +


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.

это программа построения графика функции по точкам
почему-то она не работает при данной функции f:=sin(3*x)+cos(x)/exp(x)
при значениях b больше 19
пишет ошибку invalid floating point operation
может кто подскажет

Сообщение отредактировано: volvo -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






Цитата
почему-то она не работает при данной функции f:=sin(3*x)+cos(x)/exp(x)
при значениях b больше 19
blink.gif
Задал в программе
a := 1; b := 25

все прекрасно отчертилось... Может, потому, что у меня ВСЕГДА используется сопроцессор? (я установил это в опциях IDE)
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Новичок
*

Группа: Пользователи
Сообщений: 19
Пол: Мужской

Репутация: -  0  +


спасибо за совет
Возник вопрос: в каких все-таки случаях надо подключать сопроцессор
ведь в данном случае не используются типы переменных double, extended, single
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Perl. Just code it!
******

Группа: Пользователи
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


А какже

 x,y,a,b:real;


?

cool.gif


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Новичок
*

Группа: Пользователи
Сообщений: 19
Пол: Мужской

Репутация: -  0  +


Цитата
Эмуляция сопроцессора
Очень часто у многих возникает вопрос - почему при компиляции у меня возникает ошибка Error 116: Must be in 8087 mode to compile this.
Ответ: Вы используете один из следующих вещественных типов:
Single, Double, Extended, Comp
Для работы с этими типами, необходима эмуляция сопроцессора. Просто добавьте в начало программы директивы:
{$E+, $N+}

можетя что-то не так понял
видимо в моей проге {$N+} используется по какой-то другой причине
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Perl. Just code it!
******

Группа: Пользователи
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


Цитата(FAQ)
{$N-} - Использование сопроцессора. (Глобальная директива). При указании режима {$N-} генерируется код для программного выполнения всех вещественных вычислений. При режиме {$N+} генерируется код для выполнения таких вычислений аппаратно с помощью сопроцессора.


Для корректной работы с числами с плавающей точкой нужна эта директива, сколько же можно обсуждать !


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7





Группа: Пользователи
Сообщений: 4
Пол: Мужской
Реальное имя: Карен

Репутация: -  0  +


Ребята у меня вот такая вот функция
y=2^x-5*cos(x)-3
Мне нужно построить по точкам.
Подойдет ли данная программа для моей функции???
Заранее спасибо.
P.S. В Паскале понимаю очень мало.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Гость






А заменить функцию на твою и попробовать МЫ должны? Почему не ТЫ?

Замени, и прогони программу. Заодно и расскажешь, работает или нет... Мне тоже интересно...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Новичок
*

Группа: Пользователи
Сообщений: 12
Пол: Мужской

Репутация: -  0  +


Можно ли создавать скрин графика с белым фоном. Если да, то как?
Добавил в приведённой выше программе setBkColor(white);
save_bmp(0, 0, getmaxx, getmaxy, 'screen.bmp', 1);
Не помогло no1.gif


Сообщение отредактировано: Сталкер -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Гость






Цитата(Сталкер @ 19.04.2007 19:48)
Можно ли создавать скрин графика с белым фоном.
И это можно...

Цитата(Сталкер @ 19.04.2007 19:48) *

Добавил в приведённой программе
setBkColor(white);
save_bmp(0, 0, getmaxx, getmaxy, 'screen.bmp', 1);
Не помогло no1.gif

Еще бы... Ты попробуй добавить:

setfillstyle(solidfill, white);
bar(0, 0, getmaxx, getmaxy);
...
save_bmp(0, 0, getmaxx, getmaxy, 'screen.bmp', 1);
Чувствуешь разницу?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Новичок
*

Группа: Пользователи
Сообщений: 12
Пол: Мужской

Репутация: -  0  +


Спасибо. yes2.gif Теперь можно экономить чёрный картридж. good.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


Новичок
*

Группа: Пользователи
Сообщений: 13
Пол: Женский
Реальное имя: татьяна

Репутация: -  0  +


люди помогите плиз, беру самую простую функцию 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;
.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #13


Гость






Цитата
<=пишет что-то про точки
Что именно "про точки"? Я вот только что попробовал, мне ничего ни про какие точки не пишет (исправил только функцию F в программе, приведенной в первом посте, и задал A = 1, B = 10) - график построился и с подключенным сопроцессором, и без него (Турбо Паскаль 7).
 К началу страницы 
+ Ответить 
сообщение
Сообщение #14


Новичок
*

Группа: Пользователи
Сообщений: 13
Пол: Женский
Реальное имя: татьяна

Репутация: -  0  +


пишет "invalid floating point operation"
и выставляет курсор в начало строки
"ey:=trunc(cy-y*my);" и попробовала поставить a=1 b=10
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #15


Гость






Во-первых, какой у тебя компилятор? А во-вторых, прикрепи-ка файл с программой (не надо весь текст копировать, именно прикрепи PAS-файл!!!) сюда, есть смутное подозрение...

Сообщение отредактировано: volvo -
 К началу страницы 
+ Ответить 
сообщение
Сообщение #16


Новичок
*

Группа: Пользователи
Сообщений: 13
Пол: Женский
Реальное имя: татьяна

Репутация: -  0  +


я честно говоря не особо разбираюсь в компиляторахsad.gif


Прикрепленные файлы
Прикрепленный файл  GRAFIK.PAS ( 2.85 килобайт ) Кол-во скачиваний: 329
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #17


Гость






Угу yes2.gif ... Я так и думал:

Цитата
function f(x:real):real;
begin
y:=x*x;
end;
Замени на
function f(x:real):real;
begin
f:=x*x; { <--- Внимательно - ты же должна вернуть результат ФУНКЦИИ }
end;
 К началу страницы 
+ Ответить 
сообщение
Сообщение #18


Новичок
*

Группа: Пользователи
Сообщений: 13
Пол: Женский
Реальное имя: татьяна

Репутация: -  0  +


Цитата(volvo @ 5.07.2008 1:39) *

Угу yes2.gif ... Я так и думал:

Замени на
function f(x:real):real;
begin
f:=x*x; { <--- Внимательно - ты же должна вернуть результат ФУНКЦИИ }
end;


ой спасибо блин я тормоз ypriamii.gif !thanks.gif


вот смотри теперь я беру свою огромнейшую функцию 20й степени, которая при х=1 равна 1'200'000 с хвостиком, она мне строит график, но по бокам какие-то вертикальные полосы, при том чем больше значение ф-и тем их меньше. что это может быть?

слушай а можешь здесь ещё посмотреть задание функции?
пишет "stack overflow error" показывает ошибку у первой проц. степени

Добавлено через 17 мин.
вот здесь глянь плиз

Сообщение отредактировано: зайка -


Прикрепленные файлы
Прикрепленный файл  FACT_STE.PAS ( 1.16 килобайт ) Кол-во скачиваний: 328
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #19


Гость






Цитата
а можешь здесь ещё посмотреть задание функции?
Еще бы увидеть саму эту функцию, что именно ты пытаешься закодировать - непонятно. А Stack OverFlow у тебя - потому что бесконечная рекурсия:

...
for k:=0 to n do
y:=y(x)+y1; { <--- Вот тут... }
...

Где-то стек должен переполниться? Вот в твоем случае он переполняется
Цитата
у первой проц. степени
.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #20


Новичок
*

Группа: Пользователи
Сообщений: 13
Пол: Женский
Реальное имя: татьяна

Репутация: -  0  +


Цитата(volvo @ 5.07.2008 12:26) *

Еще бы увидеть саму эту функцию, что именно ты пытаешься закодировать - непонятно. А Stack OverFlow у тебя - потому что бесконечная рекурсия:

в общем щас попытаюсь
F=10*суммa(от0до10)[[((-1)^k)*(19-k)!*((4*(x^2))^(10-k))]/[k!*(20-2*k)!]]
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

2 страниц V  1 2 >
 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 28.03.2024 20:23
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name