Guest User

delphi calc

a guest
May 31st, 2015
422
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 6.59 KB | None | 0 0
  1. unit uMain;
  2. interface
  3. uses
  4. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  5. Dialogs, StdCtrls
  6. ,Math;
  7. type
  8. TfrmMain = class(TForm)
  9. Label1: TLabel;
  10. Label2: TLabel;
  11. Label3: TLabel;
  12. Label4: TLabel;
  13. edSrcBase: TEdit;
  14. edSrcNum: TEdit;
  15. edTrgPrecision: TEdit;
  16. Label5: TLabel;
  17. Label6: TLabel;
  18. Label7: TLabel;
  19. btnTransform: TButton;
  20. edTrgBase: TEdit;
  21. edTrgNum: TEdit;
  22. procedure btnTransformClick(Sender: TObject);
  23. private
  24. { Private declarations }
  25. public
  26. { Public declarations }
  27. end;
  28. var
  29. frmMain: TfrmMain;
  30. implementation
  31. uses StrUtils;
  32. {$R *.dfm}
  33. //Визначаєякацифравідповідаєчислу.
  34. //Продовження лістингу програми:
  35. functionIntToDigit(aNum : Byte) : String;
  36. const
  37. SelfName : String = 'IntToDigit.';
  38. begin
  39. case aNum of
  40. 0..9 : Result := IntToStr(aNum);
  41. 10 : Result := 'A';
  42. 11 : Result := 'B';
  43. 12 : Result := 'C';
  44. 13 : Result := 'D';
  45. 14 : Result := 'E';
  46. 15 : Result := 'F';
  47. else
  48. Raise Exception.Create(SelfName + ' Числунезіставлена ​​цифра!');
  49. end;
  50. end;
  51. //Визначаєякечисловідповідаєцифрі.
  52. function DigitToInt(aDigit : AnsiChar; aBase : Byte) : Byte;
  53. const
  54. SelfName : String = 'DigitToInt.';
  55. begin
  56. if aBase < 2 then
  57. Raise Exception.Create(SelfName + ' Основасистемичисленнямаєбути>= 2!')
  58. ;
  59. case aDigit of
  60. '0'..'9' : Result := StrToInt(aDigit);
  61. 'A', 'a' : Result := 10;
  62. 'B', 'b' : Result := 11;
  63. 'C', 'c' : Result := 12;
  64. 'D', 'd' : Result := 13;
  65. 'E', 'e' : Result := 14;
  66. 'F', 'f' : Result := 15;
  67. else
  68. Raise Exception.Create(SelfName + ' Невідомийсимволвпредставленнічисла!');
  69. end;
  70. if Result > aBase - 1 then
  71. Raise Exception.Create(SelfName + ' Уданійсистемічисленнянемаєтакоїцифри!')
  72. ;
  73. end;
  74. // За записом числа всистемі числення з основою aBase, визначає саме це число.
  75. function XcimalStrToNumber(aStrXcimal : String; aBase : Byte) : Extended;
  76. const
  77. SelfName : String = 'XcimalStrToNumber.';
  78. var
  79. i, j : Integer;
  80. StrInt : String;
  81. StrFrac : String;
  82. Pos1 : Integer;
  83. Продовження лістингу програми:
  84. IntPart : Extended;
  85. FracPart : Extended;
  86. begin
  87. if Length(aStrXcimal) = 0 then
  88. Raise Exception.Create(SelfName + ' Незаданочисло!')
  89. ;
  90. // Шукаємо десяткову крапку. Вона у нас позначається знаком кома: ','.
  91. Pos1 := Pos(',', aStrXcimal);
  92. // Визначаємо підрядок із записом цілої частини числа
  93. // і підрядок із записом дробової частини.
  94. if Pos1 = 0 then begin
  95. //Значить число складається тільки з цілої частини.
  96. StrInt := aStrXcimal;
  97. StrFrac := '';
  98. end else begin
  99. // Число має цілу і дробову частину.
  100. StrInt := LeftStr(aStrXcimal, Pos1 - 1);
  101. StrFrac := Copy(aStrXcimal, Pos1 + 1, Length(aStrXcimal) - Pos1);
  102. end;
  103. // Визначаємо значення цілої частини числа.
  104. IntPart := 0;
  105. for i := 1 to Length(StrInt) do begin
  106. //Порядок розряду = позиції розряду при відліку від нуля в напрямку справа наліво.
  107. j := Length(StrInt) - i;
  108. IntPart := IntPart + DigitToInt(StrInt[i], aBase) * Power(aBase, j);
  109. end;
  110. // Визначаємо значення дробової частини числа.
  111. //Напочатку обчислюємо значення аналогічно тому, як це зроблено для цілої частини:FracPart := 0;
  112. for i := 1 to Length(StrFrac) do begin
  113. j := Length(StrFrac) - i;
  114. FracPart := FracPart + DigitToInt(StrFrac[i], aBase) * Power(aBase, j);
  115. end;
  116. // Тепер враховуємо експоненційну частина:
  117. FracPart :=FracPart / Power(aBase, Length(StrFrac));
  118. //Отримуємочисло, якевідповідаєзапису aStrXcimal
  119. //В системі числення з основою aBase.
  120. Result := IntPart + FracPart;
  121. end;
  122. //Перетворює запис числа в системі числення з основою aSrcBase в запис
  123. // цього ж числа в системі числення з онованіем aTrgBase.
  124. // Перетворення проводиться з точністю до aTrgPrecision цифр після коми
  125. // у результуючому поданні числа.function XcimalStrToYcimalStr (
  126. aSrcBase :Byte;
  127. aSrcNumStr : String;
  128. aTrgBase : Byte;
  129. aTrgPrecision : Byte
  130. ) : String;
  131. var
  132. //Числовідповіднезапису aSrc NumStr всистемічисленнязосновою aSrcBase.
  133. SrcNum : Extended;
  134. //Цілачастина, виділеназчисла SrcNum.
  135. IntPart : Int64;
  136. // Дробова частина, виділена з числа SrcNum.
  137. FracPart : Extended;
  138. // Подання цілої частини числа SrcNum в системі числення з основою aTrgBase.
  139. StrInt : String;
  140. // Подання дробової частини числа SrcNum в системі числення з основою aTrgBase.
  141. StrFrac :String;
  142. //Лічильник.
  143. i :Integer;
  144. // Для проміжних обчислень.
  145. TempNum :Extended;
  146. begin
  147. //Початковечисло.
  148. SrcNum :=XcimalStrToNumber(aSrcNumStr, aSrcBase);
  149. // Отримуємоцілуідробовучастинучисла.
  150. IntPart := Trunc(SrcNum);
  151. FracPart := Frac(SrcNum);
  152. // Переводимо цілу частину.
  153. StrInt := '';
  154. repeat
  155. StrInt := IntToDigit(IntPart mod aTrgBase) + StrInt;
  156. IntPart := IntPart div aTrgBase;
  157. until IntPart = 0;
  158. // Якщо дробова частина = 0, то переклад закінчено.
  159. if FracPart = 0 then begin
  160. Result := StrInt;
  161. exit;
  162. end;
  163. // Переводимо дробову частину. Точність - до aTr Precision цифр після коми.
  164. StrFrac := '';
  165. for i := 1 to aTrgPrecision do begin
  166. TempNum := FracPart * aTrgBase;
  167. StrFrac := StrFrac + IntToDigit(Trunc(TempNum));
  168. FracPart := Frac(TempNum);
  169. // Якщо дробова частина = 0, то переклад закінчено.
  170. if FracPart = 0 then Break;
  171. end;
  172. //Продовження лістингу програми:
  173. Result :=StrInt + ',' + StrFrac;
  174. end;
  175. procedure TfrmMain.btnTransformClick(Sender: TObject);
  176. begin
  177. edTrgNum.Text := XcimalStrToYcimalStr(
  178. StrToInt(edSrcBase.Text),
  179. edSrcNum.Text,
  180. StrToInt(edTrgBase.Text),
  181. StrToInt(edTrgPrecision.Text)
  182. );
  183. end;
  184. end.
Advertisement
Add Comment
Please, Sign In to add comment