Guest User

Untitled

a guest
Jan 19th, 2019
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.48 KB | None | 0 0
  1. unit Unit1;
  2.  
  3. {$mode objfpc}{$H+}
  4.  
  5. interface
  6.  
  7. uses
  8. Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls,
  9. MaskEdit, Buttons, Unit3;
  10.  
  11. type
  12.  
  13. { TForm1 }
  14.  
  15. TForm1 = class(TForm)
  16. BitBtn1: TBitBtn;
  17. Image1: TImage;
  18. Image2: TImage;
  19. Image3: TImage;
  20. MaskEdit1: TMaskEdit;
  21. MaskEdit2: TMaskEdit;
  22. procedure BitBtn1Click(Sender: TObject);
  23. procedure MaskEdit1KeyPress(Sender: TObject; var Key: char);
  24. procedure MaskEdit2KeyPress(Sender: TObject; var Key: char);
  25. private
  26. { private declarations }
  27. public
  28. { public declarations }
  29. end;
  30.  
  31. var
  32. Form1: TForm1;
  33.  
  34. implementation
  35.  
  36. {$R *.lfm}
  37.  
  38.  
  39.  
  40.  
  41.  
  42. { TForm1 }
  43.  
  44.  
  45. { TForm1 }
  46.  
  47.  
  48. procedure TForm1.MaskEdit1KeyPress(Sender: TObject; var Key: char);
  49. begin
  50. if (Key<#48) or (Key>#57) then
  51. if (Key<>#8) and (Key<>'i') then //and (Key<>#46)
  52. if (Key<>'+') and (Key<>'-') and (Key<>',') then
  53. Key:=#0
  54. end;
  55.  
  56. procedure TForm1.MaskEdit2KeyPress(Sender: TObject; var Key: char);
  57. begin
  58. if (Key<#48) or (Key>#57) then
  59. if (Key<>#8) and (Key<>'i') then //and (Key<>#46)
  60. if (Key<>'+') and (Key<>'-') and (Key<>',') then
  61. Key:=#0
  62. end;
  63.  
  64. procedure TForm1.BitBtn1Click(Sender: TObject);
  65. var
  66. Sp, Sq: AnsiString; //строковые буферы для хранения текста (13213+12312i, например) в едитах
  67. Spa,Spb: AnsiString; //строки, на которые мы будем разбивать первое число (p)
  68. Sqa,Sqb: AnsiString; //строки, на которые мы будем разбивать второе число (q)
  69. pa,pb: Real; //числовые переменные, в которые мы закинем мнимую и действ. часть числа p после обработки
  70. qa,qb: Real; // то же самое, но для числа q
  71. i,j: Integer;
  72. znak: Boolean;
  73. zindex: Integer;
  74. p,q: Boolean;
  75. start: Integer;
  76. D: real;
  77. Da: real;
  78. Db: real;
  79. sqDa: real;
  80. sqDb: real;
  81. x1: real;
  82. x2: real;
  83. x1a:real;
  84. x1b:real;
  85. x2a:real;
  86. x2b:real;
  87.  
  88. begin
  89. //если едит пустой, то ставим в него ноль
  90. if MaskEdit1.Text='' then
  91. MaskEdit1.Text:='0';
  92. if MaskEdit2.Text='' then
  93. MaskEdit2.Text:='0';
  94. //кидаем текст из едитов в строковые переменные
  95. Sp:=MaskEdit1.Text;
  96. Sq:=MaskEdit2.Text;
  97. znak:=false;
  98. p:=false;
  99. q:=false;
  100.  
  101. //---------------Сперва обрабатываем число p (строку Sp)----------------
  102. //на тот случай, если первым стоит знак
  103. if (Sp[1]='-') or (Sp[1]='+') then
  104. start:=2
  105. else
  106. start:=1;
  107.  
  108. //ищем плюс или минус
  109. for i:=start to Length(Sp) do
  110. if (Sp[i]='-') or (Sp[i]='+') then
  111. begin
  112. znak:=true;
  113. zindex:=i;
  114. end;
  115.  
  116. //если знак есть, то копируем часть до знака в Spa и часть после знака в Spb
  117. if znak=true then
  118. begin
  119. Spa:=Copy(Sp,1,zindex-1);
  120. Spb:=Copy(Sp,zindex,Length(Sp)-zindex+1);
  121. if(Spb[Length(Spb)]<>'i') then // если хуй не написал у мнимой части букву i
  122. begin
  123. Spb:=Spb+'i';
  124. Sp:=Sp+'i';
  125. MaskEdit1.Text:=MaskEdit1.Text+'i';
  126. end;
  127. end
  128. else // если нет знака; т.е. одно число: например, 212 или 231i
  129. if Sp[Length(Sp)]='i' then // если последний символ - i (число мнимое)
  130. begin
  131. Spa:='0';
  132. Spb:=Sp;
  133. end
  134. else //если нет
  135. begin
  136. Spa:=Sp;
  137. Spb:='0i';
  138. end;
  139. Spb[Length(Spb)]:=#0; //убираем букву i у мнимой части
  140.  
  141. try //пытаемся сделать из строк числа
  142. pa:=StrToFloat(Spa);
  143. pb:=StrToFloat(Spb);
  144. //если в вверхних двух строчках выходит говно, то
  145. p:=true;
  146. except //выполняется этот блок
  147. //показываем сообщение об ошибке
  148. MessageDLG('Введены неккоректные данные!',mtError,[mbOK],0);
  149. end;
  150.  
  151. znak:=false;
  152.  
  153. //---------------обрабатываем число q (строку Sq)----------------
  154. if p=true then //если первое число (p) верное, то начинаем обрабатывать второе
  155. begin
  156. //на тот случай, если первым стоит знак
  157. if (Sq[1]='-') or (Sq[1]='+') then
  158. start:=2
  159. else
  160. start:=1;
  161.  
  162. //ищем плюс или минус
  163. for i:=start to Length(Sq) do
  164. if (Sq[i]='-') or (Sq[i]='+') then
  165. begin
  166. znak:=true;
  167. zindex:=i;
  168. end;
  169.  
  170. //если знак есть, то копируем часть до знака в Spa и часть после знака в Spb
  171. if znak=true then
  172. begin
  173. Sqa:=Copy(Sq,1,zindex-1);
  174. Sqb:=Copy(Sq,zindex,Length(Sq)-zindex+1);
  175. if(Sqb[Length(Sqb)]<>'i') then // если хуй не написал у мнимой части букву i
  176. begin
  177. Sqb:=Sqb+'i';
  178. Sq:=Sq+'i';
  179. MaskEdit2.Text:=MaskEdit1.Text+'i';
  180. end;
  181. end
  182. else // если нет знака; т.е. одно число: например, 212 или 231i
  183. if Sq[Length(Sq)]='i' then // если последний символ - i (число мнимое)
  184. begin
  185. Sqa:='0';
  186. Sqb:=Sq;
  187. end
  188. else //если нет
  189. begin
  190. Sqa:=Sq;
  191. Sqb:='0i';
  192. end;
  193. Sqb[Length(Sqb)]:=#0; //убираем букву i у мнимой части
  194.  
  195. try //пытаемся сделать из строк числа
  196. qa:=StrToFloat(Sqa);
  197. qb:=StrToFloat(Sqb);
  198. //если в вверхних двух строчках выходит говно, то
  199. q:=true;
  200. except //выполняется этот блок
  201. //показываем сообщение об ошибке
  202. MessageDLG('Введены неккоректные данные!',mtError,[mbOK],0);
  203. end;
  204. end;
  205. if (pb = 0)and(qb = 0) then
  206. begin
  207. D:= pa*pa-4*qa;
  208. if D=0 then
  209. begin
  210. x1a:= -pa/2;
  211. x1b:= 0;
  212. x2a:= -pa/2;
  213. x2b:=0;
  214. end
  215. else
  216. if(D>0)then
  217. begin
  218. x1a:=(-pa - sqrt (D))/2;
  219. x1b:=0;
  220. x2a:=(-pa + sqrt (D))/2;
  221. x2b:=0;
  222. end
  223. else
  224. if D<0 then
  225. begin
  226. x1a:= -pa/2;
  227. x1b:= -sqrt (-D)/2;
  228. x2a:= -pa/2;
  229. x2b:=sqrt (-D)/2;
  230. end;
  231. end;
  232.  
  233. if (pb <>0)and(qb<>0) then
  234. Da:= pa-4*qa;
  235. Db:= 2*pa*pb+pb*pb-4*qb;
  236. sqDa:= sqrt((sqrt(Da*Da+ Db*Db)-Da)/2);
  237. sqDb:= sqrt((sqrt(Da*Da+ Db*Db)+Da)/2);
  238. x1a:=(pa- sqDa)/2;
  239. x1b:=(pb- sqDb)/2;
  240. x2a:=(pa+ sqDa)/2;
  241. x1b:=(pb+ sqDb)/2;
  242. Form3.Memo1.Clear;
  243. Form3.Memo1.Lines.Add('Исходное уравнение:');
  244. Form3.Memo1.Lines.Add('X^2 + '+ Sp + 'x +' + Sq);
  245. Form3.Memo1.Lines.Add('');
  246. Form3.Memo1.Lines.Add('Результаты:');
  247. Form3.Memo1.Lines.Add('x1 = ' + FloatToStr(x1a) + '+ (' + FloatToStr(x1b) + '*i)');
  248. Form3.Memo1.Lines.Add('x2 = ' + FloatToStr(x2a) + '+ (' + FloatToStr(x2b) + '*i)') ;
  249.  
  250. Form3.Show;
  251. end;
  252.  
  253.  
  254. end.
Add Comment
Please, Sign In to add comment