2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 запомнить результат в виде массива
Сообщение23.05.2008, 13:16 
Текст программы прилагаю. Но её необходимо доработать. я застопорилась. подтолкните. пожалуйста.
Условие задачи в следующем:"Составить программу, в которой
1. определить все корни уравнения (которое записано в задаче у меня)" на отрезке от -10 до 10.
2. вычислить определенный интеграл от х (i) до x(i+1). поинтегральная функция - это уравнение из пункта 1, x(i) x(i+1) - это два соседних корня заданного уравнения, i=1,2,3,..,n-1. n- число корней.
Указания: 1. при определении корней использовать метод сканирования с последующим уточнением решения методом хорд
2. определенные интегралы вычислять методом правых прямоугольников.
3. методы интегрирования и уточнения корней оформить в виде процедур или функций языка Пакаль.
4.Пределы интегрирования вводить не вручную, а запомнить результаты решения в виде массива и использовать для вычисления интеграла.
Вот.
Эта программа находит три корня уравнения= 1,3,7. Как их запомнить в виде массива? и как потом из этих трёх выбрать два для задания пределов интегрирования.
Найденные корни надо брать только из метода хорд. А как их ввести в процедуру Prav_pryam для ввода пределов интегрирования? Что-то не так. Если убрать процедуру нахождения интеграла, то всё идет как надо вроде. а в ней я нав. напортачила. если можно побыстрее.пож-ста.
Препод сказал, что нужно запомнить в массиве не сами корни, а их количество. Ну помоготе, прошу. В общем, все верно. но вот с этими массивами и затем вводами пределов из массива проблема.

Код:
uses crt;
      const xh=-10;xk=10;n=100;e=0.001;
      var i:integer; x,z,w,h:real;

      Function f(x: real): real;
      Begin
      f:=x*x*x-11*x*x+31*x-21;
      end;

      procedure metod_scanirov(x:real);
      var h:real;
      begin clrscr;
      writeln ('vvedite X=');
      readln (z);
      writeln ('vvedite pogreshnost H=');
      readln (w);
      if f(z+w)>f(z) then w:=-w;
      repeat z:=z+w; until f(z+w)>f(z);
      writeln ('1j koren po metodu scanirovaniya=',(z-w):2:1);
      writeln ('2j koren po metodu scanirovaniya=',(z+w):2:1); readln;
      end;

      procedure metod_hord(a,b:real);
      var t:integer;  c1,c: real; m:array [1..3] of real;
      begin
      c:=a;
      repeat c1:=c;
      c:=a-(f(a)*(b-a))/(f(b)-f(a));
      if (f(a)*f(c)<=0) then
      b:=c else a:=c;
      until abs (c1-c)<e;
      writeln ('koren uravnenia po metodu hord = ',c:2:1);
      m[t]:=c; writeln ('m=',m[t]:2:0);
      writeln ('funkciya ot kornya=',c:2:1,' ravna F(',c:1:0,')= ',f(c):2:1);
      readln; end;

      procedure prav_pryam;
      var i,t,n:integer; d,k,h,xb,s:real;   m:array [1..3] of real;
      begin
      for t:=1 to 3 do read (m[t]);
      d:=m[t];      k:=m[t+1];
       h:=(d-k)/n; s:=0; xb:=d;
      s:=0;
      for i:=1 to n do begin x:=xb+i*h; s:=s+f(x)*h; end;
      writeln ('integral ot',d:2:0,'  do',k:2:0,'  funkcii F (x) raven ',s:5:3);
      readln; end;

      begin
      metod_scanirov(x);
      x:=xh;     h:=(xk-xh)/n;
      for i:=1 to n do begin
      if f(x)*f(x+h)<=0 then metod_hord (x,x+h);  x:=x+h;
      prav_pryam; end; end.

 
 
 
 
Сообщение23.05.2008, 15:13 
Аватара пользователя
Все мы в юности думали, что отступы придуманы врагом рода человеческого, а впихнуть на одну строчку как можно больше операторов - дело чести, ведь так важно экономить строчки, вдруг не хватит.
Поверьте, однако, что в действительности дело обстоит ровно наоборот.

 
 
 
 
Сообщение26.05.2008, 13:27 
Критиковать легче, чем помочь.
Делаем, как требует препод, а не как нам проще. подстраиваемся.а когда не получается, просим помощи. у вас.
Я задала конкретный вопрос.трудно?

 
 
 
 
Сообщение26.05.2008, 22:34 
Аватара пользователя
Georgia писал(а):
Критиковать легче, чем помочь.
Естественно. У нас ведь "страна Советов, а не страна баранов".
Если препод требует писать вот буквально вот в таком виде (отступы, разбивка), то лучше вообще нигде не учиться, чем там. А если всё-таки не требует, то и незачем...
Ваш "конкретный вопрос" имеет четыре головы, причём...
... а, ладно.
Короче, сначала надо как-то пройти по всему отрезку, найти корни и их количество, и запомнить то и другое.
Примерно так:
Код:
m:=0 {это сколько у нас корней.}
for i:=1 to n do
begin
  {... здесь проверяем, есть ли корень на интервале...}
  if ... {если он есть, то}
  begin
    {... уточняем корень...}
    m:=m+1;
    x[m]:={... наш очередной корень};
  end;
end;

 
 
 
 
Сообщение27.05.2008, 15:27 
uses crt;
const xh=-10;xk=10;n=100;e=0.001;
var i:integer; x,z,w,h:real;
var t:array [1..5] of real;

Function f(x: real): real;
Begin
f:=x*x*x-11*x*x+31*x-21;
end;

procedure metod_scanirov(x:real);
var h:real;
begin clrscr;
writeln ('vvedite X=');
readln (z);
writeln ('vvedite pogreshnost H=');
readln (w);
if f(z+w)>f(z) then w:=-w;
repeat z:=z+w; until f(z+w)>f(z);
writeln ('1j koren po metodu scanirovaniya=',(z-w):2:1);
writeln ('2j koren po metodu scanirovaniya=',(z+w):2:1); readln;
end;

procedure metod_hord(a,b:real);
var t:integer;
c1,c: real;
begin
c:=a;
repeat c1:=c;
c:=a-(f(a)*(b-a))/(f(b)-f(a));
if (f(a)*f(c)<=0) then
b:=c else a:=c;
until abs (c1-c)<e;
writeln ('koren uravnenia po metodu hord = ',c:2:1);
writeln ('funkciya ot kornya=',c:2:1,' ravna F(',c:1:0,')= ',f(c):2:1);
end;
procedure kur;
var m,i,n:integer;
begin
m:=0;
x:=xh;
h:=(xk-xh)/n;
for i:=1 to n do begin
if f(x)*f(x+h)<=0 then begin metod_hord (x,x+h);
m:=m+1; t[m]:=x; x:=x+h;end;end; readln; end;

procedure prav_pryam;
var j,t,l:integer; d,k,h,xb,s:real;
begin
d:=t[m];
k:=t[m+1];
h:=(d-k)/n; s:=0; xb:=d;
s:=0;
for i:=1 to n do begin x:=xb+i*h; s:=s+f(x)*h; end;
writeln ('integral ot',d:2:0,' do',k:2:0,' funkcii F (x) raven ',s:5:3);
readln; end;

begin
metod_scanirov(x);
metod_hord(h,x+h);
prav_pryam; end.
посмотрите, пож-ста, еще. что не так?

 
 
 [ Сообщений: 5 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group