Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Object Pascal: кроссплатформенные технологии > ПРОВЕРТЕ ПРОГУ


Автор: pumbey 20.5.2006, 00:29
значения:
1.    Функция:  f(x)=abs(cos(x)+sqr(sin(3-x))*sqr(sin(3-x)));
2.    Область значений аргумента:  x є [-1,1]
3.    Шаг изменения аргумента: Δx=0,02

условие:
1.   максимального (Ymax) и минимального  (Ymin) значений функции на заданном отрезке и соответствующих им значений аргумента (Xmax) и (Xmin);

  2. максимального ( y'max) и минимального ( y'min) значений первой производной   заданной функции в интервале x   [-1,1]
  и соответствующих им значений аргумента ( dxmax) и (dxmin );

3. площадь фигуры, ограниченной сверху кривой y=f(x), снизу – осью абсцисс, слева и справа – прямыми х = -1 и х = 1.

4. площади фигуры, ограниченной сверху кривой y=f’(x), снизу – осью абсцисс, слева и справа – прямыми x = -1 и x = 1. Расчет площади фигуры проводить по формуле «правых прямоугольников» с заданной точностью Ε≤0,001.
 
            Точность вычислений E оценивать по формуле :
 ,
            Где Si – значение интеграла при n разбиениях интервала интегрирования;
              Si+1 – значение интеграла при 2n разбиениях интервала интегрирования;

       5.  Построение графиков функций y=f(x); y=f’(x). 
прога:
Код

program p_S_s;
uses CRT,Graph;
function gr:integer;
var
i,j:integer;
begin
 moveto(300,0);
 lineto(300,getmaxy);
 moveto(0,300);
 lineto(getmaxx,300);
end;
var
    i,j:integer  ;
    x,y,z,Ymax,Ymin,Xmax,Xmin:real;
    dx,S:real;
    h,s0,st,f1,ff,e,a,b:real;
          Gd, Gm, n:integer;
    w:string;
function f(x:real):real;
         begin
              f:=abs(cos(x)+sqr(sin(3-x))*sqr(sin(3-x)));
         end;
function Dif(x,dx:real):real;
         begin
              Dif:=(f(x+dx)-f(x))/dx;
         end;

BEGIN
clrscr;
Gd := Detect;
  InitGraph(Gd, Gm, 'd:\bp\bgi\');
  if GraphResult <> grOk then
    Halt(1);


for i:=-100 to 100 do
  begin
       x:=i/100;
       y:=f(x);
       j:=round(-y*100);
       PutPixel(i+300,j+300,10); { Plot "stars" }
 end;
     x:=-1; dx:=0.02;
     Ymax:=0;Ymin:=100;
     Xmax:=x;Xmin:=x;
     while x<=1.001 do
           begin
           ff:=f(x);
                if ff>Ymax then
                   begin
                        Ymax:=f(x);
                        Xmax:=x;
                   end;
                if ff<Ymin then
                   begin
                        Ymin:=f(x);
                        Xmin:=x;
                   end;
                x:=x+dx;
           end;


      n:=201;
      e:=0.001;
      a:=-1;
      b:=1;
      st:=0;
             repeat
                    h:=(b-a)/n;

                    x:=a;
                    f1:=f(x);
                    s0:=0;
                    st:=0;
                    while x<b do
                      begin
                       s0:=s0+f(x);
                       x:=x+h;
                      end;
                      s0:=s0*h;
                      n:=n*2;
                      x:=a;
                      h:=(b-a)/n;
                    while x<b do
                      begin
                       st:=st+f(x);
                       x:=x+h;
                      end;
                      st:=st*h;
           until abs((st-s0)/st)<e;
                      S:=st;
 gr;
 outtextxy(10,10,'S = ');
 str(s:2:3,w);
 outtextxy(40,10,w);
 outtextxy(10,20,'X(max) = ');
 str(Xmax:2:3,w);
 outtextxy(80,20,w);
 outtextxy(10,30,'Y(max) = ');
 str(Ymax:2:3,w);
 outtextxy(80,30,w);
 outtextxy(10,40,'X(min) = ');
 str(Xmin:2:3,w);
 outtextxy(80,40,w);
 outtextxy(10,50,'Y(min) = ');
 str(Ymin:2:3,w);
 outtextxy(80,50,w);

 readkey;
 ClearDevice;
dx:=0.02;
for i:=-100 to 100 do
  begin
       x:=i/100;
       y:=dif(x,dx);
       j:=round(-y*100);
       PutPixel(i+300,j+300,10); { Plot "stars" }
 end;


     x:=-0.99; dx:=0.02;
     Ymax:=0;Ymin:=100;
     Xmax:=x;Xmin:=x;
     while x<=0.99 do
           begin
           ff:=dif(x,dx);
                if ff>Ymax then
                   begin
                        Ymax:=dif(x,dx);
                        Xmax:=x;
                   end;
                if ff<Ymin then
                   begin
                        Ymin:=dif(x,dx);
                        Xmin:=x;
                   end;
                x:=x+dx;
           end;
      n:=199;
      e:=0.001;
      a:=-0.99;
      b:=0.99;
      st:=0;
             repeat
                    h:=(b-a)/n;
                    x:=a;
                    f1:=dif(x,dx);
                    s0:=0;
                    st:=0;
                    while x<b do
                      begin
                       s0:=s0+dif(x,dx);
                       x:=x+h;
                      end;
                      s0:=s0*h;
                      n:=n*2;
                      x:=a;
                      h:=(b-a)/n;
                    while x<b do
                      begin
                       st:=st+dif(x,dx);
                       x:=x+h;
                      end;
                      st:=st*h;
           until abs((st-s0)/st)<e;
                      S:=st;

 gr;
 outtextxy(10,10,'S = ');
 str(s:2:3,w);
 outtextxy(40,10,w);
 outtextxy(10,20,'X(max) = ');
 str(Xmax:2:3,w);
 outtextxy(80,20,w);
 outtextxy(10,30,'Y(max) = ');
 str(Ymax:2:3,w);
 outtextxy(80,30,w);
 outtextxy(10,40,'X(min) = ');
 str(Xmin:2:3,w);
 outtextxy(80,40,w);
 outtextxy(10,50,'Y(min) = ');
 str(Ymin:2:3,w);
 outtextxy(80,50,w);

 readkey;
 CloseGraph;

END.




 

Автор: armageddon 22.5.2006, 16:32
ну и вопросик, проверьте прогу? что именно не так? тебе самому не проверить работает ли она? 

Автор: nikitao 23.5.2006, 20:16
armageddon,  smile 


pumbey, без проблем, только напиши коментарии, а то очень сложно, ибо ф-ции имеют неговорящие имена.

Сразу сделаю несколько замечаний( чтобы просто улучшить ваш код в дальнейшем  smile  )
1. Создовайте имена ф-ций и переменных говорящими. Лишних 2-3 буквы в дальнейшем вам могут сильно помочь.
2. Коментируйте код, а то сами запутаетесь.
3.  ф-ция  gr использует графический режим, но при этом не проверяет действительно ли программа на момент выполнения ф-ции в нем находится. Иными словами ее использование не безопасно  smile 
4. Как я понял блок глобальных переменных у вас находится между ф-циями  smile . Это очень плохо. Страдает читабельность программы. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)