@andrzejsamson - nie do końca rozumiem jak ma ten program wyglądać (opis niestety ale nie jest jednoznaczny) i nie mam w chwili obecnej Delphi7 pod ręką, jednak napisałem prosty przykład w języku Free Pascal (bardzo podobny do Delphi); Poniżej kod takiej klasy oraz link do sprawdzenia poprawności działania:
http://ideone.com/wfY9wR
type
TBinaryNumber = class(TObject)
private type
TBinaryDigits = array [0 .. 3] of Char;
private
FDigits: TBinaryDigits;
private
function BinaryToDecimal(ADigits: TBinaryDigits): UInt8;
function DecimalToBinary(ANumber: UInt8): TBinaryDigits;
private
function GetAsBinary(): String;
function GetAsDecimal(): UInt8;
public
constructor CreateAsBinary(ADigits: array of Char);
constructor CreateAsDecimal(ANumber: UInt8);
public
procedure Add(ABinaryNumber: TBinaryNumber);
procedure Multiply(ABinaryNumber: TBinaryNumber);
public
property AsBinary: String read GetAsBinary;
property AsDecimal: UInt8 read GetAsDecimal;
end;
constructor TBinaryNumber.CreateAsBinary(ADigits: array of Char);
begin
FDigits := ADigits;
end;
constructor TBinaryNumber.CreateAsDecimal(ANumber: UInt8);
begin
FDigits := DecimalToBinary(ANumber);
end;
function TBinaryNumber.BinaryToDecimal(ADigits: TBinaryDigits): UInt8;
var
intCode: Integer;
begin
Val('%' + ADigits, Result, intCode);
end;
function TBinaryNumber.DecimalToBinary(ANumber: UInt8): TBinaryDigits;
begin
Result := BinStr(ANumber, Length(TBinaryDigits));
end;
function TBinaryNumber.GetAsBinary(): String;
begin
Result := FDigits;
end;
function TBinaryNumber.GetAsDecimal(): UInt8;
begin
Result := BinaryToDecimal(FDigits);
end;
procedure TBinaryNumber.Add(ABinaryNumber: TBinaryNumber);
begin
FDigits := BinStr(UInt8(Self.AsDecimal + ABinaryNumber.AsDecimal), Length(TBinaryDigits));
end;
procedure TBinaryNumber.Multiply(ABinaryNumber: TBinaryNumber);
begin
FDigits := BinStr(UInt8(Self.AsDecimal * ABinaryNumber.AsDecimal), Length(TBinaryDigits));
end;
Klasa bardzo prosta, choć imlementuje nieco więcej, niż to co wymagane (to raczej nie grzech);
Wewnątrz trzymane są zawsze cyfry liczby w postaci binarnej; Do dyspozycji są dwa konstruktory, umożliwiające podanie liczby w postaci binarnej (znaki cyfr) lub dziesiętnej (jako UInt8
); Dodatkowo, użycie open array w konstruktorze CreateAsBinary
umożliwia podanie dowolnej macierzy znaków - standardowej macierzy znaków, a także łańcucha znaków ze stałej, zmiennej lub literału;
Prywatne metody BinaryToDecimal
oraz DecimalToBinary
służą do konwersji macierzy znaków na natywną liczbę dziesiętną oraz liczbę na macierz znaków; Wykorzystywane są w kilku miejscach klasy, więc przydatne; Metoda Add
umożliwia dodanie liczby z parametru (jako obiektu), natomiast Multiply
pomnożenie przez obiekt z argumentu;
Dodatkowo dopisałem właściwości - AsBinary
do pobrania liczby jako łańcucha znaków, AsDecimal
do pobrania liczby jako natywnej, dziesiętnej; Właściwość AsDecimal
przydaje się w metodach Add
i Multiply
, aby móc dodać lub pomnożyć liczby, przed konwersją wyniku i wpisaniem łańcucha do macierzy z pola FDigits
;
Dodawanie i mnożenie zrealizowane jest w ten sposób, że wykroczenie poza zakres (liczba większa niż 15
, binarnie 0b1111
) nie powoduje żadnego błędu czy wyjątku - po prostu wynik zostanie obcięty do czterech młodszych bitów (to zapewnia funkcja BinStr
i jej argument Cnt
); Można przekręcić licznik - najwyżej wyjdą bzdury w wyniku;
Kod napisany jest w ten sposób, że po zmianie pojemności macierzy z typu TBinaryDigits
, kod automatycznie się dostosuje i możliwe będzie przechowywanie większych liczb, bez konieczności modyfikacji kodu metod;
Podsumowując - spróbuj skompilować ten kod pod Delphi7; Na pewno nie obejdzie się bez poprawek - nie pamiętam czy dostępna jest w nim funkcja BinStr
(ale na pewno istnieje funkcja do konwersji liczby na ciąg znaków z cyframi binarnymi), nie istnieje także typ UInt8
(trzeba go zamienić na Byte
); Nie pamiętam też, czy wszystkie przypisania przejdą;
W każdym razie kod pozostawiam dla ciekawych, w razie gdyby ktoś trafił tutaj z Google czy innej wyszukiwarki.