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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.05.2008, 15:00   #1
Georgia
 
Регистрация: 21.05.2008
Сообщений: 3
По умолчанию Запомнить результат в виде массива

Текст программы прилагаю. Но её необходимо доработать. я застопорилась. подтолкните. пожалуйста.
Условие задачи в следующем:"Составить программу, в которой
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. Как их запомнить в виде массива? и как потом из этих трёх выбрать два для задания пределов интегрирования.
Код:
  uses crt;
      Const xh=-10;xk=10;n=100; e=0.001;
      var i:integer;      x,h,z,w: 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 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);
      {..................??????????}
      readln;
      end;

     procedure prav_pryam;
      var i,g:integer; k,h,xb,s:real;
      a:array [1..g] of real;
      begin clrscr;
      for i:=1 to g do read (a[i]);
      a[i]:=d;
      a[i+1]:=k;
            h:=(d-k)/n; s:=0; xb:=d;
      s:=0;
      for i:=1 to g 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.

Последний раз редактировалось Stilet; 21.05.2008 в 15:02.
Georgia вне форума Ответить с цитированием
Старый 21.05.2008, 15:05   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Дык вот же они: z-w, z+w и c, че их в массив гнать то?
выбери первые два корня и не парься.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 21.05.2008, 15:41   #3
Georgia
 
Регистрация: 21.05.2008
Сообщений: 3
По умолчанию

Спасибо. но затруднение вызывает следующее:Запомнить результаты решения (по методу хорд)в виде массива и использовать для вычисления интеграла.
Не могли бы написать фрагмент программы. каким образом запомнить?

В этом и трудность, что надо не просто решить, а решить так, как задано (точно по условию).

Последний раз редактировалось Stilet; 21.05.2008 в 15:44.
Georgia вне форума Ответить с цитированием
Старый 21.05.2008, 15:47   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Код:
 var i:integer;      x,h,z,w: real;  
a:array[1..3] of real;
............
 writeln ('1j koren po metodu scanirovaniya=',(z-w):2:1);   
    writeln ('2j koren po metodu scanirovaniya=',(z+w):2:1); 
a[1]:=z-w;a[2]:=z+w;
.............
writeln ('koren uravnenia po metodu hord = ',c:2:1);  
a[3]:=c;
............
Только чесно говоря с трудом верится что такая программа работает...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 22.05.2008, 16:14   #5
Georgia
 
Регистрация: 21.05.2008
Сообщений: 3
По умолчанию

Посмотри еще, пожалуйста. Найденные корни надо брать только из метода хорд. А как их ввести в процедуру 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.

Последний раз редактировалось Georgia; 23.05.2008 в 14:07. Причина: дополнение, опечатки в задаче
Georgia вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
результат запроса Ko$tello БД в Delphi 7 18.04.2012 12:13
Результат прогресса Stilet Свободное общение 10 15.04.2008 13:03
переписать из массива в линейный двунаправленный список чётные элементы массива Black_Ak24 Помощь студентам 12 08.01.2008 00:44
Запомнить положение переключателя StasSv Microsoft Office Excel 2 03.01.2008 10:57
Представить данные о студентах института в виде массива записей. Паскаль. menlo Помощь студентам 3 12.12.2007 20:40