Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
5
Добавлен:
14.03.2015
Размер:
6.61 Кб
Скачать
unit uMain;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls,ShellApi,Math, Spin;

type
TfrmMain = class(TForm)
Button1: TButton;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Edit4: TEdit;
Edit5: TEdit;
Edit6: TEdit;
Edit7: TEdit;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label5: TLabel;
Label6: TLabel;
Label9: TLabel;
Label7: TLabel;
Label10: TLabel;
Label11: TLabel;
Label4: TLabel;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
frmMain: TfrmMain;

implementation

uses StrUtils;

{$R *.dfm}

//Определяет какая цифра соответствует числу.
function IntToDigit(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
//Число соответствующее записи aSrcNumStr в системе счисления с основанием 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;
//Переводим дробную часть. Точность - до aTrgPrecision цифр после запятой.
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;
//По записи числа в системе счисления с онованием aBase, определяет само это число.
function AdelitnaB(A : String; B : String) : string;
var
octatok : Int64;
rez : Int64;
Srez:string;
begin
Result:='';
repeat
rez:= strtoint(A) div strtoint(B);
octatok:= strtoint(A) mod strtoint(B);
Result:=Result+IntToStr(rez);
until octatok = 0;
end;

procedure TfrmMain.Button1Click(Sender: TObject);
begin
// 1. Перевести оба числа в двоичную систему счисления.
Edit3.Text := XcimalStrToYcimalStr(10,Edit1.Text,2,0);
Edit4.Text := XcimalStrToYcimalStr(10,Edit2.Text,2,0);
// 2. Выполнить над переведенными числами машинную операцию деления
Edit5.Text := AdelitnaB(Edit3.Text,Edit4.Text);
// 3. Выполнить операцию над числами в десятичной системе счисления и перевести
//результат в двоичную систему счисления.
Edit6.Text := inttostr(round(Strtoint(Edit1.Text)/Strtoint(Edit2.Text))) ;
Edit7.Text := XcimalStrToYcimalStr(10,Edit6.Text,2,0);
end;

end.
Соседние файлы в папке ЛАБ№1
  • #
    14.03.20159.46 Кб5uMain.dcu
  • #
    14.03.201551 б5uMain.ddp
  • #
    14.03.20153.82 Кб5uMain.dfm
  • #
    14.03.20156.61 Кб5uMain.pas
  • #
    14.03.201551 б5uMain.~ddp
  • #
    14.03.20153.82 Кб5uMain.~dfm
  • #
    14.03.20156.61 Кб9uMain.~pas
  • #
    14.03.2015434 б5XcimalToYcimal.cfg
  • #
    14.03.20152.13 Кб5XcimalToYcimal.dof