Описание математического аппарата.
В этой задаче используется довольно сложный математический аппарат. Происходит расчет объема вытекаемой воды, а также изменения объема и высоты водяного столба в сосуде.
Формула, определяющая объем вытекаемой воды в секунду:, где S – площадь сегмента, которая рассчитывается по формуле: , где λ – угол в градусах при вершине сектора, который рассчитывается по формуле: , где a и b –прилежащий и противолежащий катет в прямоугольном треугольнике(). Формула перевода из градусов в радианы: , v – скорость вытекания вода из трубы(формула Герона):, где h – высота столба жидкости, а g – ускорение свободного падения.
Если высота столба выше канала то объем рассчитывается по формуле: .
В программе это представлено так:
poz:=Kanal.poz/10;
r:=Kanal.V/20;
if (h>poz) and (h<(poz+2*r)) then
begin
x:=h-Poz;
y:=abs(r-x);
z:=sqrt(sqr(r)-sqr(y));
St:=y*z;
Ss:=sqr(r)*arctan(z/y);
if r>x then S:=Ss-St else S:=Ss+St;
dV:=dV- S*sqrt(2*98.1*(h-poz))
end
else if h>=poz+2*r then dV:=dV-Pi*sqr(r)*sqrt(2*98.1*(h-poz));
end;
Структура диалогов.
(1)
(2) (3)
(4)
(5)
Диалоговые окна добавление/изменений канала физически являются одной формой, поэтому их поведение одинаково. При работе с ней надо ввести требуемые данные. При работе с этой формой могут произойти ошибки, которые обрабатываются следующим способом:
procedure TForm2.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
var
V,H,D,k,j:integer;
i:boolean;
BEGIN
if RadioGroup1.ItemIndex=0 then
begin
if ModalResult=mrOk then
try
if Trim(Edit1.Text)='' then
begin
Edit1.SetFocus;
raise Exception.Create(‘');
end;
V:=StrToInt(Edit1.Text);
if V<=0 then
begin
Edit1.SetFocus;
raise Exception.Create(');
end;
k:=0;
For j:=1 to 10 do
if CopyZ[j]=true then inc(k);
if k=10 then raise Exception.Create(');
except
on EConvertError do
begin
CanClose:=False;
Edit1.SetFocus;
MessageDlg('’);
end;
on E:Exception do
begin
CanClose:=False;
MessageDlg(E.Message,mtWarning,[mbCancel],0);
end;
end;
end
else
if RadioGroup1.ItemIndex=1 then
if ModalResult=mrOk then
try
k:=0;
For j:=StrToInt(Edit2.Text) to StrToInt(Edit2.Text)+StrToInt(Edit1.Text) do
if CopyZZ[j]=false then inc(k);
if StrToInt(Edit2.Text)+StrToInt(Edit1.Text)>300 then raise Exception.Create(')
else if k<>StrToInt(Edit1.Text)+1 then raise Exception.Create(');
if Trim(Edit1.Text)='' then
begin
Edit1.SetFocus;
raise Exception.Create(');
end;
if Trim(Edit2.Text)='' then
begin
Edit2.SetFocus;
raise Exception.Create('Âû ');
end;
i:=false;
D:=StrToint(Edit1.Text);
i:=true;
if D<=0 then
begin
Edit1.SetFocus;
raise Exception.Create(');
end;
H:=StrToint(Edit2.Text);
if (H<0) or (H>300) then
begin
Edit2.SetFocus;
raise Exception.Create(');
end;
except
on EConvertError do
if not(i) then
begin
CanClose:=False;
Edit1.SetFocus;
MessageDlg(');
end
else
begin
CanClose:=False;
Edit2.SetFocus;
MessageDlg(');
end;
on E:Exception do
begin
CanClose:=False;
MessageDlg(E.Message,mterror,[mbCancel],0);
end;
end;
end;
Инструкция по эксплуатации:
В начале программы отображается пустой сосуд. Чтобы произошло действие нужно добавить хотябы один канал. После добавления подводящего канала уровени воды начнется подниматься. Так же можно добавить отводящий канал, в этом случае прирост высоты столба может остановиться, если сравняются объемы подводимой и отводимой воды. Созданные каналы можно удальть, редактировать, если предварительно их выделить в списке.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.