Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.09.2009, 07:47   #1
*Elena*
Новичок
Джуниор
 
Регистрация: 21.09.2009
Сообщений: 4
По умолчанию Задача на графику

Создать программу, строящую на экране семейство графиков функций (т.е. кривых, имеющих общую формулу, но различные коэффициенты)
Построить кривые, заданные следующей формулой:
y=1/(a*x*x+b*x+c)

что то не могу понять как должно быть
*Elena* вне форума Ответить с цитированием
Старый 21.09.2009, 09:09   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Наверное имелось ввиду что-то подобное:
Код:
uses graph,crt;
var r,d:integer;s:string;
 x,y,a,b,c:double;
begin
 d:=detect; initgraph(d,r,'');
 moveto(GetMaxX div 2,GetMaxy div 2);

 a:=1;b:=2;c:=3;
 x:=1; while x<10 do begin
  y:=(1/(a*x*x+b*x+c));
  lineto(10*round(x),10*round(y));
  x:=x+0.001;
 end;

 a:=1.5;b:=2.5;c:=3;
 x:=1; while x<10 do begin
  y:=(1/(a*x*x+b*x+c));
  lineto(10*round(x),10*round(y));
  x:=x+0.001;
 end;
 readln;
 closegraph;
end.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 21.09.2009, 10:56   #3
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Пишется процедура построения графика от (a,b,c).
В цикле repeat until
Диалог Введите параметры
Строим график. При построении предусмотреть if (a*x*x+b*x+c)<>0
puporev вне форума Ответить с цитированием
Старый 21.09.2009, 11:35   #4
*Elena*
Новичок
Джуниор
 
Регистрация: 21.09.2009
Сообщений: 4
По умолчанию

Цитата:
Пишется процедура построения графика от (a,b,c).
В цикле repeat until
Диалог Введите параметры
Строим график. При построении предусмотреть if (a*x*x+b*x+c)<>0
у меня так и сделано, только вот графики почему то получаются даже не похожими, и как то все не красиво, если нужно вот мой код
Код:
Uses  Graph;

Var Gd, Gm,cout : Integer;
    a,c,b:real;
procedure f(a,b,c:real);
var x,y,get:real;
    x1,y1,x2,y2:integer;
    k:integer;
begin
 x:=-10;
 get:=getmaxx/2;
 k:=random(14)+1;
 setcolor(k);
 y:=(1/(a*x*x+b*x+c));
 x1:=round(x*40+get);
 y1:=round(-y*40+300);
repeat
   x:=x+0.1;
   if(a*x*x+b*x+c)=0 then x:=x+0.1 else
   y:=(1/(a*x*x+b*x+c));
    x2:=round(x*40+get);
    y2:=round(-y*40+300);
   line(x1,y1,x2,y2);
   x1:=x2;
   y1:=y2;
until(x>10);
end;
Begin
randomize;
 Gd:=Detect;
 InitGraph(Gd, Gm, '');
 a:=20;
 b:=0;
 c:=2;
 cout:=0;
repeat
cout:=cout+1;
f(a,b,c);
a:=random(100)+20;
b:=random(50)+10;
c:=random(30)+1;
until(cout>10);


setcolor(15);
line(320,0,320,480);
line(0,300,640,300);
 ReadLn;
 CloseGraph;
End.
*Elena* вне форума Ответить с цитированием
Старый 21.09.2009, 12:18   #5
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

У Вас проблема с масштабами по осям, а графики и будут не совсем похожи, это же графики обратной функции, очень сильно зависят от коэффициентов. Вот немного поправил, гляньте.
Код:
Uses  Graph;

Var Gd, Gm,cout : Integer;
    a,c,b:real;
procedure f(a,b,c:real);
var x,y,get,mx,my:real;
    x1,y1,x2,y2:integer;
    k:integer;
begin
 x:=-4;{слишком большой интервал -10:10, графики некрасивые}
 mx:=getmaxx/(2*abs(x));{масштаб по оси Х=ширина экрана в пикселях/разность мак и мин значений по оси Х}
 my:=getmaxy;{тоже бы надо также делать, но для этого надо знать мак и мин по оси У, 
поэтому просто берем с потолка, покрасивее, можете поэкспериментрировать}
 get:=getmaxx/2;
 k:=random(14)+1;
 setcolor(k);
 y:=(1/(a*x*x+b*x+c));
 x1:=round(x*mx+get);
 y1:=round(-y*my+300);
repeat
   x:=x+0.001;{берем маленький шаг}
   if abs(a*x*x+b*x+c)>0.01 then{если знаменатель близкое к нолю число,
результат-огромное число, выходит за real, да и не нужна нам такая точность}
    begin
     y:=(1/(a*x*x+b*x+c));
     x2:=round(x*mx+get);{растягиваем по оси Х}
     y2:=round(-y*my+300);{тоже по оси У}
     Putpixel(x2,y2,k);{поскольку графики у нас рваные, рисуем точками}
     {line(x1,y1,x2,y2);
     x1:=x2;
     y1:=y2;}
    end;
until(x>10);
end;
Begin
randomize;
 Gd:=Detect;
 InitGraph(Gd, Gm, '');
 a:=20;
 b:=0;
 c:=2;
 cout:=0;
setcolor(15);{сначала рисуем оси, потом графики}
line(320,0,320,480);
line(0,300,640,300);
repeat
cout:=cout+1;
f(a,b,c);
a:=random(100)+20;
b:=random(50)+10;
c:=random(30)+1;
until(cout>10);
ReadLn;
CloseGraph;
End.
puporev вне форума Ответить с цитированием
Старый 21.09.2009, 12:24   #6
*Elena*
Новичок
Джуниор
 
Регистрация: 21.09.2009
Сообщений: 4
По умолчанию

Спасибо большое, я думала что уже никак нельзя что то сделать
*Elena* вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите с задачей на графику! Fatality Помощь студентам 4 18.05.2009 20:14
Паскаль. Задача на графику..помогите доделать(( Diamond2107 Помощь студентам 8 17.05.2009 18:24
Delphi 7 задача на графику, игрушка Agent[PNZ] Помощь студентам 2 29.04.2008 10:54