Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- unit Unit1;
- {$mode objfpc}{$H+}
- interface
- uses
- Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls,
- MaskEdit, Buttons, Unit3;
- type
- { TForm1 }
- TForm1 = class(TForm)
- BitBtn1: TBitBtn;
- Image1: TImage;
- Image2: TImage;
- Image3: TImage;
- MaskEdit1: TMaskEdit;
- MaskEdit2: TMaskEdit;
- procedure BitBtn1Click(Sender: TObject);
- procedure MaskEdit1KeyPress(Sender: TObject; var Key: char);
- procedure MaskEdit2KeyPress(Sender: TObject; var Key: char);
- private
- { private declarations }
- public
- { public declarations }
- end;
- var
- Form1: TForm1;
- implementation
- {$R *.lfm}
- { TForm1 }
- { TForm1 }
- procedure TForm1.MaskEdit1KeyPress(Sender: TObject; var Key: char);
- begin
- if (Key<#48) or (Key>#57) then
- if (Key<>#8) and (Key<>'i') then //and (Key<>#46)
- if (Key<>'+') and (Key<>'-') and (Key<>',') then
- Key:=#0
- end;
- procedure TForm1.MaskEdit2KeyPress(Sender: TObject; var Key: char);
- begin
- if (Key<#48) or (Key>#57) then
- if (Key<>#8) and (Key<>'i') then //and (Key<>#46)
- if (Key<>'+') and (Key<>'-') and (Key<>',') then
- Key:=#0
- end;
- procedure TForm1.BitBtn1Click(Sender: TObject);
- var
- Sp, Sq: AnsiString; //строковые буферы для хранения текста (13213+12312i, например) в едитах
- Spa,Spb: AnsiString; //строки, на которые мы будем разбивать первое число (p)
- Sqa,Sqb: AnsiString; //строки, на которые мы будем разбивать второе число (q)
- pa,pb: Real; //числовые переменные, в которые мы закинем мнимую и действ. часть числа p после обработки
- qa,qb: Real; // то же самое, но для числа q
- i,j: Integer;
- znak: Boolean;
- zindex: Integer;
- p,q: Boolean;
- start: Integer;
- D: real;
- Da: real;
- Db: real;
- sqDa: real;
- sqDb: real;
- x1: real;
- x2: real;
- x1a:real;
- x1b:real;
- x2a:real;
- x2b:real;
- begin
- //если едит пустой, то ставим в него ноль
- if MaskEdit1.Text='' then
- MaskEdit1.Text:='0';
- if MaskEdit2.Text='' then
- MaskEdit2.Text:='0';
- //кидаем текст из едитов в строковые переменные
- Sp:=MaskEdit1.Text;
- Sq:=MaskEdit2.Text;
- znak:=false;
- p:=false;
- q:=false;
- //---------------Сперва обрабатываем число p (строку Sp)----------------
- //на тот случай, если первым стоит знак
- if (Sp[1]='-') or (Sp[1]='+') then
- start:=2
- else
- start:=1;
- //ищем плюс или минус
- for i:=start to Length(Sp) do
- if (Sp[i]='-') or (Sp[i]='+') then
- begin
- znak:=true;
- zindex:=i;
- end;
- //если знак есть, то копируем часть до знака в Spa и часть после знака в Spb
- if znak=true then
- begin
- Spa:=Copy(Sp,1,zindex-1);
- Spb:=Copy(Sp,zindex,Length(Sp)-zindex+1);
- if(Spb[Length(Spb)]<>'i') then // если хуй не написал у мнимой части букву i
- begin
- Spb:=Spb+'i';
- Sp:=Sp+'i';
- MaskEdit1.Text:=MaskEdit1.Text+'i';
- end;
- end
- else // если нет знака; т.е. одно число: например, 212 или 231i
- if Sp[Length(Sp)]='i' then // если последний символ - i (число мнимое)
- begin
- Spa:='0';
- Spb:=Sp;
- end
- else //если нет
- begin
- Spa:=Sp;
- Spb:='0i';
- end;
- Spb[Length(Spb)]:=#0; //убираем букву i у мнимой части
- try //пытаемся сделать из строк числа
- pa:=StrToFloat(Spa);
- pb:=StrToFloat(Spb);
- //если в вверхних двух строчках выходит говно, то
- p:=true;
- except //выполняется этот блок
- //показываем сообщение об ошибке
- MessageDLG('Введены неккоректные данные!',mtError,[mbOK],0);
- end;
- znak:=false;
- //---------------обрабатываем число q (строку Sq)----------------
- if p=true then //если первое число (p) верное, то начинаем обрабатывать второе
- begin
- //на тот случай, если первым стоит знак
- if (Sq[1]='-') or (Sq[1]='+') then
- start:=2
- else
- start:=1;
- //ищем плюс или минус
- for i:=start to Length(Sq) do
- if (Sq[i]='-') or (Sq[i]='+') then
- begin
- znak:=true;
- zindex:=i;
- end;
- //если знак есть, то копируем часть до знака в Spa и часть после знака в Spb
- if znak=true then
- begin
- Sqa:=Copy(Sq,1,zindex-1);
- Sqb:=Copy(Sq,zindex,Length(Sq)-zindex+1);
- if(Sqb[Length(Sqb)]<>'i') then // если хуй не написал у мнимой части букву i
- begin
- Sqb:=Sqb+'i';
- Sq:=Sq+'i';
- MaskEdit2.Text:=MaskEdit1.Text+'i';
- end;
- end
- else // если нет знака; т.е. одно число: например, 212 или 231i
- if Sq[Length(Sq)]='i' then // если последний символ - i (число мнимое)
- begin
- Sqa:='0';
- Sqb:=Sq;
- end
- else //если нет
- begin
- Sqa:=Sq;
- Sqb:='0i';
- end;
- Sqb[Length(Sqb)]:=#0; //убираем букву i у мнимой части
- try //пытаемся сделать из строк числа
- qa:=StrToFloat(Sqa);
- qb:=StrToFloat(Sqb);
- //если в вверхних двух строчках выходит говно, то
- q:=true;
- except //выполняется этот блок
- //показываем сообщение об ошибке
- MessageDLG('Введены неккоректные данные!',mtError,[mbOK],0);
- end;
- end;
- if (pb = 0)and(qb = 0) then
- begin
- D:= pa*pa-4*qa;
- if D=0 then
- begin
- x1a:= -pa/2;
- x1b:= 0;
- x2a:= -pa/2;
- x2b:=0;
- end
- else
- if(D>0)then
- begin
- x1a:=(-pa - sqrt (D))/2;
- x1b:=0;
- x2a:=(-pa + sqrt (D))/2;
- x2b:=0;
- end
- else
- if D<0 then
- begin
- x1a:= -pa/2;
- x1b:= -sqrt (-D)/2;
- x2a:= -pa/2;
- x2b:=sqrt (-D)/2;
- end;
- end;
- if (pb <>0)and(qb<>0) then
- Da:= pa-4*qa;
- Db:= 2*pa*pb+pb*pb-4*qb;
- sqDa:= sqrt((sqrt(Da*Da+ Db*Db)-Da)/2);
- sqDb:= sqrt((sqrt(Da*Da+ Db*Db)+Da)/2);
- x1a:=(pa- sqDa)/2;
- x1b:=(pb- sqDb)/2;
- x2a:=(pa+ sqDa)/2;
- x1b:=(pb+ sqDb)/2;
- Form3.Memo1.Clear;
- Form3.Memo1.Lines.Add('Исходное уравнение:');
- Form3.Memo1.Lines.Add('X^2 + '+ Sp + 'x +' + Sq);
- Form3.Memo1.Lines.Add('');
- Form3.Memo1.Lines.Add('Результаты:');
- Form3.Memo1.Lines.Add('x1 = ' + FloatToStr(x1a) + '+ (' + FloatToStr(x1b) + '*i)');
- Form3.Memo1.Lines.Add('x2 = ' + FloatToStr(x2a) + '+ (' + FloatToStr(x2b) + '*i)') ;
- Form3.Show;
- end;
- end.
Add Comment
Please, Sign In to add comment