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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.10.2015, 13:01   #1
r1nz0r
 
Регистрация: 23.10.2015
Сообщений: 8
По умолчанию Алгоритм целочисленного деления[Pascal/Delphi]

День добрый, дорогие программисты.
Есть код для простого решения уравнения методом половинного деления, но нужно усложнить. Усложнение следующее:

"Каждый раз уменьшая автоматически погрешность в 2 раза, определить и вывести две минимальные погрешности, для которых решение находится для переменных типа single и extended."

Не совсем понимаю что от меня требуется.
Нужно все переменные в отдельных процедурах сделать синглом и экстендедом?

Вот код:
Код:

Var A,B,C,x,y,e,xmin,xmax: single;
         otvet,shagi: string;
Function Kvadr(a,b,c,x:single):single;
  Begin
   Result:=a*x*x+b*x+c;
  End;

Procedure schet;
Var h,u:single;
    i:integer;
  Begin
  h:=(xmax-xmin)/2;
  x:=xmin+h;
  u:=kvadr(a,b,c,xmin);
  i:=0;
  while i<50 do
    Begin
        inc(i);
        y:=kvadr(a,b,c,x);
        h:=h/2;
        If abs(y)<e then
        Begin
          str(x:12:7,otvet);
          str(i,shagi);
          Exit;
        End;
          If u*y>0 then
            x:=x+h
          Else
            x:=x-h;
          End;
          otvet:='Нет корней';
          shagi:='';
     End;

Procedure TForm1.Button1Click(Sender: TObject);
Var  i,z,j,k,l,m,n: integer;

begin
  Label9.Visible:=False;
  Val(Edit1.Text,A,z);
  Val(Edit2.Text,B,j);
  Val(Edit3.Text,C,k);
  Val(Edit4.Text,e,l);
  Val(Edit5.Text,xmin,m);
  Val(Edit6.Text,xmax,n);
  if (z<>0) or (j<>0) or (k<>0) or (l<>0) or (m<>0) or (n<>0) then
    begin
      label9.visible:=True;
      exit;
    end;
  Schet;
  Edit7.Text:=otvet;
  Edit8.Text:=shagi;
End;
End.

Последний раз редактировалось Stilet; 25.10.2015 в 13:42.
r1nz0r вне форума Ответить с цитированием
Старый 25.10.2015, 18:51   #2
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,309
По умолчанию

Задание понял так:
1. Пишем код, в котором одни переменные имеют тип Singl, а другие Extendet.
2. В коде, после задания (ввода с клавиатуры) некоторой погрешности вычисления, необходимо найти решение. Если решение найдено, то значение погрешности уменьшаем в два раза (в программе, естественно) и вычисления повторяем. При некотором значении погрешности программа зациклится. Так думаю, что этот момент можно проконтролировать ограничивая число циклов поиска решения.
3. Все эти вычисления повторить с переменными типа extendet.
4. Полученные в этих задачах минимальные погрешности и выводятся.

Как-то так, ...
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 29.10.2015, 18:03   #3
r1nz0r
 
Регистрация: 23.10.2015
Сообщений: 8
По умолчанию

Цитата:
Сообщение от ViktorR Посмотреть сообщение
Задание понял так:
1. Пишем код, в котором одни переменные имеют тип Singl, а другие Extendet.
2. В коде, после задания (ввода с клавиатуры) некоторой погрешности вычисления, необходимо найти решение. Если решение найдено, то значение погрешности уменьшаем в два раза (в программе, естественно) и вычисления повторяем. При некотором значении погрешности программа зациклится. Так думаю, что этот момент можно проконтролировать ограничивая число циклов поиска решения.
3. Все эти вычисления повторить с переменными типа extendet.
4. Полученные в этих задачах минимальные погрешности и выводятся.

Как-то так, ...
Можно немного поподробнее про второй пункт, с зацикливанием.
r1nz0r вне форума Ответить с цитированием
Старый 30.10.2015, 11:55   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

я полностью согласен с постом от ViktorR
поэтому могу пояснить.
у Вас в цикле уже есть эта проверка.
вот это:
Цитата:
Код:
 while i<50 do
и позволяет избежать зацикливания.

Правда, непонятно, откуда взялось число 50 ?!
я бы взял число МИНИМУМ на два/три порядка больше
например,
Код:
 while i<5000 do
всё остальное понятно?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 10.11.2015, 16:19   #5
r1nz0r
 
Регистрация: 23.10.2015
Сообщений: 8
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
я полностью согласен с постом от ViktorR
поэтому могу пояснить.
у Вас в цикле уже есть эта проверка.
вот это:

и позволяет избежать зацикливания.

Правда, непонятно, откуда взялось число 50 ?!
я бы взял число МИНИМУМ на два/три порядка больше
например,
Код:
 while i<5000 do
всё остальное понятно?
В общем, так и не смог понять как делать.
Преподаватель давал такой алгоритм, что-то вроде того, что корень находится меньше чем за 50 шагов.
Так же я выяснил, что нужно сделать две процедуры, в каждой из которых считается отдельно для сингла и для экстендеда переменных, и потом прогнать в другой процедуре их, каждый раз уменьшая погрешность в 2 раза. То есть не в самих процедурах, где идет вычисление корня, а в главной, которая прогоняет эти процедуры. Вот встает вопрос, как мне сделать цикл, ибо я не смогу же уловить именно МИНИМАЛЬНУЮ погрешность, для которой находится решение(нужно именно минимальную, т.е. пограничную с той, с которой уже не будет работать переменная типа single/extended).
r1nz0r вне форума Ответить с цитированием
Старый 10.11.2015, 16:32   #6
r1nz0r
 
Регистрация: 23.10.2015
Сообщений: 8
По умолчанию

Вот исходный алгоритм.
фото
Форма выглядит примерно так, в последние 3 поля программа должна вывести значения.
фото
Сама начальная погрешность задается непосредственно в процедуре.
Сейчас код выглядит примерно так, что дальше делать, вообще не понимаю...
Код:
unit Unit1;

interface
     procedure schetSG;
     procedure schetEXT;
     Var A,B,C,x,y,xmin,xmax,e: single;
         x1,y1,e1: extended;
         otvet,shagi,pogrsg,pogrext: string;
implementation

Function Kvadr(a,b,c,x:single):single;
  Begin
   Result:=a*x*x+b*x+c;
  End;

  procedure ssss;
   Var h,u:single;
    i:integer;
  begin
  h:=(xmax-xmin)/2;
  x:=xmin+h;
  u:=kvadr(a,b,c,xmin);
  i:=0;
  while i<50 do
    Begin
        inc(i);
        y:=kvadr(a,b,c,x);
        h:=h/2;
        If abs(y)<e then
        Begin
          str(e:14:12,pogrsg);
          Str(i,shagi);
          Exit;
        End;
        If u*y>0 then
          x:=x+h
        Else
          x:=x-h;

    End;
  end;

Procedure schetSG;
  Begin
  while e>1.5e-45 do
  begin
  e:=0.1;
  ssss;
  e:=e/2;
  End;
  end;



  Procedure schetEXT;
Var h,u,e:extended;
    i:integer;
  Begin
  h:=(xmax-xmin)/2;
  x1:=xmin+h;
  u:=kvadr(a,b,c,xmin);
  i:=0;
  e:=0.1;
  while i<50 do
    Begin
        inc(i);
        y1:=kvadr(a,b,c,x1);
        h:=h/2;
        If abs(y1)<e then
        Begin
          str(x1:12:6,otvet);
          Str(e:14:12,pogrext);
          Exit;
        End;
        If u*y1>0 then
          x1:=x1+h
        Else
          x1:=x1-h;
        e:=e/2;
    End;
    otvet:='Нет корней';
  End;
end.
r1nz0r вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
задача pascal. Ввести N чисел и число K. Проверить, что сумма остатков от деления нечетных Х на К, больше суммы остатков деления.. N.i.k.o.l.a.y. Помощь студентам 4 17.11.2014 14:59
алгоритм деления пополам ДаняКраб Общие вопросы Delphi 2 08.07.2012 15:15
Алгоритм деления отрезка на части Игорь Кулакевич Помощь студентам 7 30.09.2011 23:50
Написать алгоритм деления двоичных десятичных чисел. Lazio Фриланс 1 08.05.2011 02:46
Pascal Алгоритм деления bpystep Помощь студентам 4 18.05.2009 20:28