Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- unit uMain;
- interface
- uses
- Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
- Dialogs, StdCtrls
- ,Math;
- type
- TfrmMain = class(TForm)
- Label1: TLabel;
- Label2: TLabel;
- Label3: TLabel;
- Label4: TLabel;
- edSrcBase: TEdit;
- edSrcNum: TEdit;
- edTrgPrecision: TEdit;
- Label5: TLabel;
- Label6: TLabel;
- Label7: TLabel;
- btnTransform: TButton;
- edTrgBase: TEdit;
- edTrgNum: TEdit;
- procedure btnTransformClick(Sender: TObject);
- private
- { Private declarations }
- public
- { Public declarations }
- end;
- var
- frmMain: TfrmMain;
- implementation
- uses StrUtils;
- {$R *.dfm}
- //Визначаєякацифравідповідаєчислу.
- //Продовження лістингу програми:
- functionIntToDigit(aNum : Byte) : String;
- const
- SelfName : String = 'IntToDigit.';
- begin
- case aNum of
- 0..9 : Result := IntToStr(aNum);
- 10 : Result := 'A';
- 11 : Result := 'B';
- 12 : Result := 'C';
- 13 : Result := 'D';
- 14 : Result := 'E';
- 15 : Result := 'F';
- else
- Raise Exception.Create(SelfName + ' Числунезіставлена цифра!');
- end;
- end;
- //Визначаєякечисловідповідаєцифрі.
- function DigitToInt(aDigit : AnsiChar; aBase : Byte) : Byte;
- const
- SelfName : String = 'DigitToInt.';
- begin
- if aBase < 2 then
- Raise Exception.Create(SelfName + ' Основасистемичисленнямаєбути>= 2!')
- ;
- case aDigit of
- '0'..'9' : Result := StrToInt(aDigit);
- 'A', 'a' : Result := 10;
- 'B', 'b' : Result := 11;
- 'C', 'c' : Result := 12;
- 'D', 'd' : Result := 13;
- 'E', 'e' : Result := 14;
- 'F', 'f' : Result := 15;
- else
- Raise Exception.Create(SelfName + ' Невідомийсимволвпредставленнічисла!');
- end;
- if Result > aBase - 1 then
- Raise Exception.Create(SelfName + ' Уданійсистемічисленнянемаєтакоїцифри!')
- ;
- end;
- // За записом числа всистемі числення з основою aBase, визначає саме це число.
- function XcimalStrToNumber(aStrXcimal : String; aBase : Byte) : Extended;
- const
- SelfName : String = 'XcimalStrToNumber.';
- var
- i, j : Integer;
- StrInt : String;
- StrFrac : String;
- Pos1 : Integer;
- Продовження лістингу програми:
- IntPart : Extended;
- FracPart : Extended;
- begin
- if Length(aStrXcimal) = 0 then
- Raise Exception.Create(SelfName + ' Незаданочисло!')
- ;
- // Шукаємо десяткову крапку. Вона у нас позначається знаком кома: ','.
- Pos1 := Pos(',', aStrXcimal);
- // Визначаємо підрядок із записом цілої частини числа
- // і підрядок із записом дробової частини.
- if Pos1 = 0 then begin
- //Значить число складається тільки з цілої частини.
- StrInt := aStrXcimal;
- StrFrac := '';
- end else begin
- // Число має цілу і дробову частину.
- StrInt := LeftStr(aStrXcimal, Pos1 - 1);
- StrFrac := Copy(aStrXcimal, Pos1 + 1, Length(aStrXcimal) - Pos1);
- end;
- // Визначаємо значення цілої частини числа.
- IntPart := 0;
- for i := 1 to Length(StrInt) do begin
- //Порядок розряду = позиції розряду при відліку від нуля в напрямку справа наліво.
- j := Length(StrInt) - i;
- IntPart := IntPart + DigitToInt(StrInt[i], aBase) * Power(aBase, j);
- end;
- // Визначаємо значення дробової частини числа.
- //Напочатку обчислюємо значення аналогічно тому, як це зроблено для цілої частини:FracPart := 0;
- for i := 1 to Length(StrFrac) do begin
- j := Length(StrFrac) - i;
- FracPart := FracPart + DigitToInt(StrFrac[i], aBase) * Power(aBase, j);
- end;
- // Тепер враховуємо експоненційну частина:
- FracPart :=FracPart / Power(aBase, Length(StrFrac));
- //Отримуємочисло, якевідповідаєзапису aStrXcimal
- //В системі числення з основою aBase.
- Result := IntPart + FracPart;
- end;
- //Перетворює запис числа в системі числення з основою aSrcBase в запис
- // цього ж числа в системі числення з онованіем aTrgBase.
- // Перетворення проводиться з точністю до aTrgPrecision цифр після коми
- // у результуючому поданні числа.function XcimalStrToYcimalStr (
- aSrcBase :Byte;
- aSrcNumStr : String;
- aTrgBase : Byte;
- aTrgPrecision : Byte
- ) : String;
- var
- //Числовідповіднезапису aSrc NumStr всистемічисленнязосновою aSrcBase.
- SrcNum : Extended;
- //Цілачастина, виділеназчисла SrcNum.
- IntPart : Int64;
- // Дробова частина, виділена з числа SrcNum.
- FracPart : Extended;
- // Подання цілої частини числа SrcNum в системі числення з основою aTrgBase.
- StrInt : String;
- // Подання дробової частини числа SrcNum в системі числення з основою aTrgBase.
- StrFrac :String;
- //Лічильник.
- i :Integer;
- // Для проміжних обчислень.
- TempNum :Extended;
- begin
- //Початковечисло.
- SrcNum :=XcimalStrToNumber(aSrcNumStr, aSrcBase);
- // Отримуємоцілуідробовучастинучисла.
- IntPart := Trunc(SrcNum);
- FracPart := Frac(SrcNum);
- // Переводимо цілу частину.
- StrInt := '';
- repeat
- StrInt := IntToDigit(IntPart mod aTrgBase) + StrInt;
- IntPart := IntPart div aTrgBase;
- until IntPart = 0;
- // Якщо дробова частина = 0, то переклад закінчено.
- if FracPart = 0 then begin
- Result := StrInt;
- exit;
- end;
- // Переводимо дробову частину. Точність - до aTr Precision цифр після коми.
- StrFrac := '';
- for i := 1 to aTrgPrecision do begin
- TempNum := FracPart * aTrgBase;
- StrFrac := StrFrac + IntToDigit(Trunc(TempNum));
- FracPart := Frac(TempNum);
- // Якщо дробова частина = 0, то переклад закінчено.
- if FracPart = 0 then Break;
- end;
- //Продовження лістингу програми:
- Result :=StrInt + ',' + StrFrac;
- end;
- procedure TfrmMain.btnTransformClick(Sender: TObject);
- begin
- edTrgNum.Text := XcimalStrToYcimalStr(
- StrToInt(edSrcBase.Text),
- edSrcNum.Text,
- StrToInt(edTrgBase.Text),
- StrToInt(edTrgPrecision.Text)
- );
- end;
- end.
Advertisement
Add Comment
Please, Sign In to add comment