Материал: Мансуров. Основы программирования в среде Lazarus. 2010

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

Глава 6 Программирование приложений с графическим интерфейсом

____________________________________________________________________

begin Memo1.Clear;

n:=StrToInt(Edit1.Text); for h:=0 to n-1 do begin

x.Add('0');

end;

for k:=1 to n-1 do begin

for i:=k+1 to n do begin

if a.Strings[(k-1)*n+(k-1)]='0' then begin

{Начало блока перестановки уравнений}

p:=k; {В блок схеме используется буква l, но она похожа на цифру 1,

поэтому используем идентификатор p}

for r:=i to n do

if abs(StrToFloat(a.Strings[(r-1)*n+(k-1)]))> abs(StrToFloat (a.Strings[(p-1)*n+(k-1)])) then p:=r;

if p<>k then begin

for j:=k to n do; begin

t:=StrToFloat(a.Strings[(k-1)*n+(j-1)]); a.Strings[(k-1)*n+(j-1)]:= a.Strings[(p-1)*n+(j-1)]; a.Strings[(p-1)*n+(j-1)]:=FloatToStr(t);

end;

t:=(StrToFloat (b.Strings[k-1])); b.Strings[k-1]:=b.Strings[p-1]; b.Strings[p-1]:=FloatToStr (t);

end;

end; // Конец блока перестановок уравнений m:=StrToFloat (a.Strings[(i-1)*n+ (k-1)])/StrToFloat (a.Strings[(k-1)*n+(k-1)]); a.Strings[(i-1)*n+(k-1)]:='0';

for j:=k+1 to n do begin

a.Strings[(i-1)*n+(j-1)]:=

601

6.3 Визуальное программирование в среде Lazarus

____________________________________________________________________

FloatToStr(StrToFloat(a.Strings[(i-1) *n+(j-1)])-(m*StrToFloat(a.Strings[(k-1)* n+(j-1)])));

end; b.Strings[i-1]:=FloatToStr(StrToFloat (b.Strings[i-1])- (m*StrToFloat(b.Strings[k-1])));

end;

end;

{Проверка существования решения}

if StrToFloat (a.Strings[(n-1)*n+(n-1)])<>0 then {Решение существует и единственно}

begin x.Strings[n-1]:=(FloatToStr(StrToFloat

(b.Strings[n-1])/StrToFloat(a.Strings[(n-1)* n+(n-1)])));

for i:=n-1 downto 1 do begin

s:=0;

for j:=i+1 to n do begin

s:=s-StrToFloat (a.Strings[(i-1)*n+(j-1)])* StrToFloat (x.Strings[j-1]);

end; x.Strings[i-1]:=(FloatToStr((StrToFloat (b.Strings[i-1])+s)/

StrToFloat (a.Strings[(i-1)*n+(i-1)]))); end;

Memo1.Lines.Add('Решение:'); for j:=0 to x.Count-1 do

Memo1.Lines.Add('X'+IntToStr(j+1)+

'='+x.Strings[j]);

end else

if StrToFloat (b.Strings[n-1])=0 then Memo1.Lines.Add('Система уравнений'+

' не имеет решения.')

else

Memo1.Lines.Add('Система уравнений'+

' имеет бесконечное множество решений.');

end;

procedure TForm1.FormCreate(Sender: TObject); begin

602

Глава 6 Программирование приложений с графическим интерфейсом

____________________________________________________________________

A:=TStringList.Create;

b:=TStringList.Create;

x:=TStringList.Create;

v:=1;

v2:=1;

end;

procedure TForm1.Edit2Change(Sender: TObject); begin

if Edit2.Text = '-' then exit; StrToFloat (Edit2.Text); BitBtn1.Enabled:=true;

end;

procedure TForm1.BitBtn1Click(Sender: TObject); var n:integer;

begin

if (Edit2.Text= '-') or (Edit2.Text= '') then exit; begin

n:=StrToInt(Edit1.Text);

Edit2.SetFocus;

Edit2.SelectAll; if v2=1 then

Edit1.Enabled:=false; if v2<=n+1 then

begin

if v<=n+1 then v:=v+1

else v:=1;

if v<=n+1 then begin

if v<=n then Label3.Caption:='Введите a' +

IntToStr(v2) +

IntToStr(v);

if v>n then

Label3.Caption:='Введите b'+IntToStr(v2); A.Add(Edit2.Text);

end;

if v>n+1 then begin

b.Add(Edit2.Text);

603

6.3 Визуальное программирование в среде Lazarus

____________________________________________________________________

v2:=v2+1;

v:=1;

if v2<=n then Label3.Caption:='Введите a' +

IntToStr(v2)+

IntToStr(v)

else begin

Label3.Caption:='';

calculate;

BitBtn1.Enabled:=false;

Button1.SetFocus;

end;

end;

end; end else

Edit2.SetFocus;

end;

procedure TForm1.Button1Click(Sender: TObject); begin

b.Clear;

a.Clear;

x.Clear;

Memo1.Clear;

Edit1.Enabled:=true;

Edit1.Clear;

Edit2.Clear;

Edit1.SetFocus;

v:=1;

v2:=1;

Label3.Caption:='';

end;

procedure TForm1.Button2Click(Sender: TObject); begin

Close;

end;

procedure TForm1.Edit1Change(Sender: TObject); begin

if strtoint(Edit1.Text)>1 then begin

BitBtn1.Enabled:=true;

604

Глава 6 Программирование приложений с графическим интерфейсом

____________________________________________________________________

Edit2.Enabled:=true;

Edit2.Clear; Label3.Caption:='Введите a11'; Edit2.SetFocus;

end else begin

BitBtn1.Enabled:=false;

Edit2.Enabled:=false;

end;

end;

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: char);

begin

if Key = #13 then Key := #0; end;

initialization {$I Unit1.lrs}

end.

Проанализируем программу с двух точек зрения – с точки зрения пользо-

вателя и с точки зрения программиста.

С точки зрения пользователя мы видим, что программа может решать сис-

тему уравнений не более чем с девятью неизвестными. Попробуйте ввести дву-

значное число. У вас не получится!

Во-вторых, хотя ввод коэффициентов и организован более или менее удов-

летворительно, к сожалению, у пользователя нет возможности обозреть ранее введенные коэффициенты. При большом числе уравнений здесь немудрено до-

пустить ошибки, перепутать коэффициенты. Хотя подсказка, какой коэффици-

ент надо вводить в данный момент, присутствует.

Обратимся теперь к коду программы. В программе используется класс

TStringList. Но, вообще говоря, класс TStringList не предназначен для вычислений! Он предназначен для обработки строк, т.е. для обработки сим-

вольной информации. Посмотрите сколько здесь производится преобразований

605

Смотрите также:

11 Горм +
113
14
1433
1511
1632
199
204
2N4264RE
3773