Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Не получается правильно создать цикл repeat until.  (Прочитано 12307 раз)
0 Пользователей и 7 Гостей смотрят эту тему.
Tomoyo
Участник

ru
Offline Offline

« : 27-03-2010 12:08 » 

Смысл программы: если abs(y1+y2-1)<заданной точности, то должен выводиться результат. Если > заданной точности, то все расчеты должны повториться снова. Все это должно считаться в интервале температур от 329,35 до 373,15. У меня не получается правильно совместить условие и цикл.

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Button1: TButton;
    Label1: TLabel;
    Label2: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Edit4: TEdit;
    Label6: TLabel;
    Label7: TLabel;
    Label8: TLabel;
    Label9: TLabel;
    Label10: TLabel;
    Label11: TLabel;
    Label12: TLabel;
    Label13: TLabel;
    Edit5: TEdit;
    Edit6: TEdit;
    Edit7: TEdit;
    Edit8: TEdit;
    Edit9: TEdit;
    Edit10: TEdit;
    Edit11: TEdit;
    Edit12: TEdit;
    Edit3: TEdit;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var x1,x2,L12,L21,g1,g2,p10,p20,y1,y2,T:real;
begin
x1:=strtofloat(edit1.Text);
x2:=strtofloat(edit2.Text);
T:=strtofloat(edit3.Text);

repeat
L12:=(18.7/104)*exp(-(180.31/(1.987*T)));
L21:=(104/18.7)*exp(-(1722.1/(1.987*T)));
g1:=exp(-ln(x1+L12*x2)+x2*((L12/(x1+L12*x2))-(L21/(x2+L21*x1))));
g2:=exp(-ln(x2+L21*x1)-x1*((L12/(x1+L12*x2))-(L21/(x2+L21*x1))));
p10:=exp(34.61307+(-4873.446/T)-0.000000003249502*T-3.422*ln(T));
p20:=exp(30.79802+(-5966.069/T)+0.000000001030134*T-2.5*ln(T));
y1:=g1*(p10/1)*x1;
y2:=g2*(p20/1)*x2;


if (abs(y1+y2-1)<0.01) then
begin
edit4.Text:=floattostr(L12);
edit5.Text:=floattostr(L21);
edit6.Text:=floattostr(g1);
edit7.Text:=floattostr(g2);
edit8.Text:=floattostr(p10);
edit9.Text:=floattostr(p20);
edit10.Text:=floattostr(y1);
edit11.Text:=floattostr(y2);
edit12.Text:=floattostr(T);
end
else
T:=T+1;
until T>=373.15;



end;


end.
Записан
v2
Помогающий

ua
Offline Offline

« Ответ #1 : 27-03-2010 13:56 » 

А  если "Если > заданной точности" будет _всегда_ для текущего "T",  то как _долго_ "все расчеты должны повториться снова" ?

и попробовать заменить real на extended
« Последнее редактирование: 27-03-2010 14:00 от v2 » Записан
Tomoyo
Участник

ru
Offline Offline

« Ответ #2 : 27-03-2010 16:06 » 

Непонятно...
Записан
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 27-03-2010 19:08 » 

Либо использовать ещё одно условие в цикле ("до T>=373.15 или Нужно_остановиться"), где Нужно_остановиться - логическое условие "досрочного" выхода.
Либо выйти из цикла по break в if-блоке:
Код:
repeat
   { ... }
   if (condition) then
      begin
         {...}
         break;
      end
until T>=373.15;
Записан
v2
Помогающий

ua
Offline Offline

« Ответ #4 : 27-03-2010 20:08 » 

Tomoyo, расскажи о ещё двух исходных значениях "x1" и "x2".

Они задаются для всего интервала "Т" или ими можно/нужно манипулировать
для достижения необходимой точности в конкретной точке "Т"
Записан
Tomoyo
Участник

ru
Offline Offline

« Ответ #5 : 27-03-2010 20:43 » 

x1 и x2 задаются для всего интервала. Во все формулы подставляются они и температура, которая меняется, пока не выполнится условие.


Вад, последовала Вашему совету выйти еще в блоке if. Работает. Спасибо!
« Последнее редактирование: 27-03-2010 23:04 от RXL » Записан
v2
Помогающий

ua
Offline Offline

« Ответ #6 : 27-03-2010 20:51 » 

А если условие точности никогда не выполнится (несколько раз пересчитать одно и тоже делу не поможет), что тогда? Считаем значение для нового Т, или останавливаемся и говорим об этом бедному пользователю?
Записан
v2
Помогающий

ua
Offline Offline

« Ответ #7 : 27-03-2010 21:00 » 

... мрак Меня одолевают смутные сомнения
Записан
Tomoyo
Участник

ru
Offline Offline

« Ответ #8 : 27-03-2010 21:17 » 

Что мрак? Условие точности здесь обязательно должно выполниться, иначе прибор не правильно работал и дал неправильные экспериментальные данные)
Записан
v2
Помогающий

ua
Offline Offline

« Ответ #9 : 27-03-2010 21:30 » 

А зачем тогда его проверять, если "Условие точности здесь обязательно должно выполниться"
Записан
Tomoyo
Участник

ru
Offline Offline

« Ответ #10 : 27-03-2010 21:34 » 

Смысл заключается в том, чтобы узнать, при какой температуре имеет место соответствующий состав пара, найденный по  экспериментальному составу жидкости. Звучит не понятно, но ничего поделать не могу)


Там имеет место физико-химическая зависимость.
« Последнее редактирование: 27-03-2010 23:04 от RXL » Записан
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #11 : 27-03-2010 23:01 » 

Tomoyo, в твоей программе смешиваются вычисление и вывод результата. По уму, отдельно вычислили - отдельно отобразили результат. А тут получается, что ещё из цикла не вышли, как уже куда-то что-то выводим. Кроме того, если всё-таки нужная точность достигнута не будет - пользователь не увидит вообще ничего.
Записан
Tomoyo
Участник

ru
Offline Offline

« Ответ #12 : 28-03-2010 15:52 » new

Я же сказала уже, что в данной конкретной задаче точность будет достигнута, только вот при какой температуре, вот в чем вопрос. Тем более что уже все работает и работает правильно. Так что спасибо Вам еще раз.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines