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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.05.2012, 21:05   #1
Маленыч
Пользователь
 
Аватар для Маленыч
 
Регистрация: 04.04.2012
Сообщений: 23
Восклицание Составить программу на языке Turbo Pascal 7.0 вычисления значения интеграла на интервале [a, b] для функции, заданной графически.

Здравствуйте!
У меня есть программа, которую необходимо проверить на работоспособность. Итак, само задание:



Код, составленной мной программы:

Код:
program integral;
{$E+}
{$N+}
uses crt;
const
  max=100;
var
  r,a,b,e:extended;
{---------------------------------------------------------------------------}
{Процедура вывода поясняющей информации}
procedure info;
begin
    writeln('Программа вычисляет значения на интервале [a,b] (a и b задаются пользователем) функции:');
    writeln('y = R – x, если x <= -R;');
    writeln('y = R^2 – 2*R*x – x^2, если –R <= x <= R;');
    writeln('y = x – R/2, если x >= R;');
    writeln('Максимальное значение вводимых переменных: ',max,’; минимальное значение переменных: ‘,min,’.’);
    writeln;
end;
{---------------------------------------------------------------------------}
{Процедура ввода данных}
procedure input(var r,a,b,e:extended);
var
  st:string;
  code:integer;
begin
  write('Введите радиус дуги (r) (0 < R < ',max,'): ');
  repeat
    readln(st);
    val(st,r,code);
    if (code=1) or (r<=0) or (r>max) then
      write('Ошибка ввода! Повторите ввод! (0 < R < ',max,') R = ');
  until (code=0) and (r>0) and (r<=max);
  {-----}
  write('Введите наименьшую границу (a) (',-max,' <= a < ',max,'): ');
  repeat
    readln(st);
    val(st,a,code);
    if (code=1) or (a<-max) or (a>=max) then
      write('Ошибка ввода! Повторите ввод!  (',-max,' <= a < ',max,') a = ');
  until (code=0) and (a>=-max) and (a<max);
  {-----}
  write('Введите наибольшую границу (b) (',a:3:2,' < b <= ',max,'): ');
  repeat
    readln(st);
    val(st,b,code);
    if (code=1) or (b<=-max) or (b>max) or (b<=a) then
      write('Ошибка ввода! Повторите ввод! (',a:3:2,' < b <= ',max,') a = ');
  until (code=0) and (b>-max) and (b<=max) and (b>a);
  {-----}
  write('Введите погрешность (e) (0 < e < ',max,'): ');
  repeat
    readln(st);
    val(st,e,code);
    if (code=1) or (e<=0) or (e>max) then
      write('Ошибка ввода! Повторите ввод! (0 < e < ',max,') e = ');
  until (code=0) and (e>0) and (e<=max);
  writeln;
end;
{---------------------------------------------------------------------------}
{Функция подсчета значения интеграла}
function calc(r,a,b,e:extended):extended;
var
  res,res1,h,x:extended;
  n:integer;
begin
  res1:=100;
  res:=0;
  n:=1;
  h:=b-a;
  while abs(res1-res)>e do
    begin
      res1:=res;
      res:=0;
      h:=(b-a)/n;
      n:=n*2;
      x:=a;
      while x<=b do
        begin
          if x<=-r then
            res:=res+r-x
          else
            if x<=r then
              res:=res+sqrt(r*r-x*x)
            else
              res:=res+x-r/2;
          x:=x+h;
        end;
      res:=res*h;
    end;
    calc:=res;
end;
{---------------------------------------------------------------------------}
{Процедура вывода}
procedure output(r,a,b,e:extended);
begin
  writeln('Значение интеграла на интервале [',a:5:2,',',b:5:2,'] с точностью до ',e:5:2,' равно ',calc(r,a,b,e):5:3,'.');
  readkey;
end;
{---------------------------------------------------------------------------}
{Основная программа}
begin
  info;
  input(r,a,b,e);
  output(r,a,b,e);
end.
Проблемы, возникающие при выполнении программы:
Иногда программа отказывается считать интеграл при вводе очень большой погрешности.
Помогите понять в чем тут могут быть проблемы? Вроде все составил верно. Заметьте, шаг интегрирования я определяю как h:=b-a, причем b всегда будет больше а, так как в программе имеется условие при вводе, которое запрещает делать переменную b меньше переменной а, и цикл while должен, по крайней мере, выполняться один раз.
Заранее спасибо!

Последний раз редактировалось Маленыч; 15.05.2012 в 21:11.
Маленыч вне форума Ответить с цитированием
Старый 15.05.2012, 21:52   #2
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,306
По умолчанию

Так подумал, что лучше дать вариант решения очень похожей задачи.
Глядиш, и друзьям сможешь помочь
Во вложении две странички из Т.А. Павловской. Паскаль, Язык программирования высокого уровня. Там все понятно.
Идея состоит в том, что-бы функцию интегрирования написать отдельно, а те функции, которые надо интегрировать - описать так-же отдельно и передавать в функцию интегрирования в виде параметра процедурного типа. Да там все прозрачно.


Как-то так ...
Вложения
Тип файла: rar 33.rar (99.4 Кб, 24 просмотров)
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 15.05.2012, 23:34   #3
Маленыч
Пользователь
 
Аватар для Маленыч
 
Регистрация: 04.04.2012
Сообщений: 23
По умолчанию

Хорошо, спасибо.
Маленыч вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
составить программу для вычисления значения функции и результаты выдать на печать. Бейсик SvetlanaFF Помощь студентам 13 28.10.2018 19:24
Составить программу для вычисления значения функции!!!! QBASIC ната22 Помощь студентам 2 06.12.2011 17:06
Составить программу для вычисления значения функции и результаты выдать на печать Pleasant_girl Помощь студентам 8 22.12.2009 22:57
вывести на экран в виде таблицы значения функций,заданной графически, на интервале от Хнач до Хкон с шаго Masiasia Помощь студентам 1 25.11.2009 10:06
составить программу для вычисления значения функции и результаты выдать на печать. Бейсик nata89 Помощь студентам 1 06.12.2008 19:53