Технический форум
Вернуться   Технический форум > Программирование > Форум программистов > Помощь студентам


Ответ
 
Опции темы Опции просмотра
Старый 26.04.2013, 11:22   #1 (permalink)
Sandra 2000
Member
 
Аватар для Sandra 2000
 
Регистрация: 04.10.2012
Сообщений: 49
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
Exclamation Turbo Pascal, построение графика нелинейного уравнения

Помогите пожалуйста написать программу которая строит график заданного нелинейного уравнения :2^x=sin(x+Pi/6) или в запись в Pascal (exp(ln(2)*x)-sin(x+Pi/6)).

График должен выглядеть так.
Миниатюры
aacuiyiiue.jpg  
Sandra 2000 вне форума   Ответить с цитированием

Старый 26.04.2013, 11:22
Helpmaster
Member
 
Аватар для Helpmaster
 
Регистрация: 08.03.2016
Сообщений: 0

Решение проблемы может скрываться в одной из этих тем

Построение графика нелинейного уравнения, Turbo Pascal
Построение фигур в Turbo Pascal
Построение блок схем по коду Pascal
Задача в Паскале на построение графика функции
Решение нелинейного уравнения на Паскале
Построение графика ФНЧ, LR Фильтр

Старый 27.04.2013, 08:59   #2 (permalink)
Sandra 2000
Member
 
Аватар для Sandra 2000
 
Регистрация: 04.10.2012
Сообщений: 49
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Уже программа есть, работает в принципе правильно, но выдает ошибку, помогите исправить, чтобы ошибку не выдавало.
Код:
Program Grafik;
uses crt, graph;
const
s=0.001;
xs=30;
ys=-30;
var
j, X0, Y0, x, y, a, b:integer;
i:real;
st:string;

function f1(x:real):real;
begin
f1:=sin(x+Pi/6);
end;

function f2(x:real):real;
begin
f2:=exp(ln(2)*x);
end;

procedure labels;
begin
setcolor(white);
settextstyle(1,0,1);
outtextxy(x0-30,3,'y');
outtextxy(x0+290,y0-35,'x');
line(x0,1,x0,getmaxy);
line(1, y0,getmaxx,y0);
settextstyle(2,0,2);
for j:=-10 to 10 do
begin
setcolor(15);
line(x0+xs*j,y0-7,x0+xs*j,y0+7);
line(x0-7,y0+ys*j,x0+7,y0+ys*j);
setcolor(green);
str(j,st);
outtextxy(x0+xs*j-10,y0+7,st);
if j<>0 then
outtextxy(x0+10,y0+ys*j-10,st);
end;
end;

procedure drawgrafik1;
begin
i:=-10;
settextstyle(1,0,4);
repeat
i:=i+s;
x:=round(x0+i*xs);
y:=y0+round(f1(i)*ys);
putpixel(x,y,14);
until i>25;
begin
settextstyle(1,0,1);
setcolor(14);
outtextxy(x0+300,y0+50,'y1=cos2x');
end;
end;

procedure drawgrafik2;
begin
i:=-10;
repeat
i:=i+s;
x:=round(x0+i*xs);
y:=y0+round(f2(i)*ys);
putpixel(x,y,13);
until i>25;
begin
settextstyle(1,0,1);
setcolor(13);
outtextxy(x0+170,y0-200,'y2=lg(x+2)');
end;
end;

BEGIN
clrscr;
a:=detect;
initgraph(a,b,'');
line(682,0,690,10);
line(682,0,674,10);
line(1362,353,1357,363);
line(1362,353,1357,345);
x0:=round(getmaxx/2);
y0:=round(getmaxy/2);
labels;
drawgrafik1;
drawgrafik2;
readln;
closegraph;
END.
Миниатюры
aiie.jpg  
Sandra 2000 вне форума   Ответить с цитированием
Старый 27.04.2013, 21:43   #3 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от Sandra 2000 Посмотреть сообщение
Уже программа есть, работает в принципе правильно, но выдает ошибку, помогите исправить, чтобы ошибку не выдавало.
К сожалению, помочь не смогу: у меня графика работает в DOS VGA моде, т.е. с экраном 640х480 пикселей, у Вас же в явной форме заданы параметры экрана с большим разрешением. Единственно, установил, что сбой происходит при рисовании графика второй (показательной) функции. Вот если бы все параметры экрана задавались через доли GetMaxX и GetMaxY, было бы другое дело. А то у Вас где-то так, где-то этак. Увы...
Vladimir_S вне форума   Ответить с цитированием
Старый 28.04.2013, 09:09   #4 (permalink)
Sandra 2000
Member
 
Аватар для Sandra 2000
 
Регистрация: 04.10.2012
Сообщений: 49
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Выдает ошибку 201.Ошибка проверки диапазона.
Sandra 2000 вне форума   Ответить с цитированием
Старый 28.04.2013, 10:34   #5 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от Sandra 2000 Посмотреть сообщение
Выдает ошибку 201.Ошибка проверки диапазона.
Ладно, получите:
Код:
uses
 crt, graph;
const
 s=0.001;
 xs=30;
 ys=-30;
var
 j, X0, Y0, x, y, a, b:integer;
 i:real;
 st:string;

function f1(x:real):real;
begin
 f1:=sin(x+Pi/6);
end;

function f2(x:real):real;
begin
 f2:=exp(ln(2)*x);
end;

procedure labels;
begin
 setcolor(white);
 settextstyle(1,0,1);
 outtextxy(x0-30,3,'y');
 outtextxy(x0+290,y0-35,'x');
 line(x0,1,x0,getmaxy);
 line(1, y0,getmaxx,y0);
 settextstyle(2,0,2);
 for j:=-10 to 10 do
  begin
   setcolor(15);
   line(x0+xs*j,y0-7,x0+xs*j,y0+7);
   line(x0-7,y0+ys*j,x0+7,y0+ys*j);
   setcolor(green);
   str(j,st);
   outtextxy(x0+xs*j-10,y0+7,st);
   if j<>0 then outtextxy(x0+10,y0+ys*j-10,st);
  end;
end;

procedure drawgrafik1;
begin
 i:=-10;
 settextstyle(1,0,4);
 repeat
  i:=i+s;
  x:=round(x0+i*xs);
  y:=y0+round(f1(i)*ys);
  putpixel(x,y,14);
 until i>25;
 settextstyle(1,0,1);
 setcolor(14);
 SetTextJustify(RightText,CenterText);
 outtextxy(2*x0,y0+50,'y1=Sin(x+Pi/6)');
end;

procedure drawgrafik2;
var Xmax:Word;
begin
 i:=-10;
 repeat
  i:=i+s;
  x:=round(x0+i*xs);
  y:=y0+round(f2(i)*ys);
  putpixel(x,y,13);
  Xmax:=x;
 until i>3;
 settextstyle(1,0,1);
 setcolor(13);
 SetTextJustify(LeftText,CenterText);
 outtextxy(Xmax+20,40,'y2=Exp(x*Ln(2))');
end;

BEGIN
 a:=detect;
 initgraph(a,b,'');
 x0:=GetMaxX div 2;
 y0:=GetMaxY div 2;
 line(x0,0,x0+8,10);
 line(x0,0,x0-8,10);
 line(2*x0,y0,2*x0-5,y0+10);
 line(2*x0,y0,2*x0-5,y0-10);
 labels;
 drawgrafik1;
 drawgrafik2;
 ReadKey;
 closegraph;
END.
Основная ошибка в том, что при построении графика функции f2 (процедура drawgrafik2) был задан слишком большой предел (25), вследствие чего транслятор вылетал за границы разрядной сетки. Вполне достаточно оказалось значения 3 (выделено красным).
Кроме того, исправлены еще некоторые мелочи: графические выводы теперь годятся для любого экранного разрешения, исправлен вид формул выводимых функций (те, что прописаны в программе, явно не отсюда) и параметры вывода формул, убрана абсолютно ненужная команда очистки текстового экрана ClrScr: при включении (InitGraph) графического экрана он автоматически очищается; а чтобы очистить его в процессе работы принудительно, следует использовать команду ClearDevice, ну и т.п.
Миниатюры
sand.jpg  
Vladimir_S вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.




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

Powered by vBulletin® Version 6.2.5.
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.