Klasa Liczby Binarne

0

Witam.

Mam do napisania program w Delphi. Jego treść i wymagania są następujące:
Zaprojektuj klasę reprezentującą czterocyfrowe liczby binarne. Klasa powinna zawierać poniższe
elementy:

Konstruktory:

  • z czterema parametrami, inicjujący liczbę wartością binarną przekazaną jako cztery kolejne cyfry
    Metody ustawiające/zwracające wartość obiektów klasy:

  • zwracająca liczbę binarną w postaci łańcucha znakowego

  • zwracająca liczbę jako wartość dziesiętną
    Metody realizujące operacje na obiektach klasy (wszystkie metody zmieniają obiekt, na rzecz którego zostały wywołane i nie zwracają żadnego wyniku):

  • dodająca drugą liczbę binarną przekazaną jako obiekt

  • mnożąca przez drugą liczbę binarną przekazaną jako obiekt
    Wraz z kolegą stworzyliśmy dwa programy, są bardzo chaotyczne. Jesteśmy początkujący. Czy ktoś jest w stanie edytować te programy by spełniały podane wyżej wymagania. Ewentualnie stworzyć go od podstaw by sprostał wymaganiom, był czytelny i przejrzysty. W załączniku wstawiam dwa programy. Proszę o pomoc.

1
andrzejsamson napisał(a):

Witam.
Zaprojektuj klasę reprezentującą czterocyfrowe liczby binarne. Klasa powinna zawierać poniższe
elementy:

Jak rozumiem chodzi o liczby z przedziału 1000-9999 czy od 0001 - 9999?

andrzejsamson napisał(a):

Konstruktory:

  • z czterema parametrami, inicjujący liczbę wartością binarną przekazaną jako cztery kolejne cyfry
    Metody ustawiające/zwracające wartość obiektów klasy:
    -zwracająca liczbę binarną w postaci łańcucha znakowego

  • zwracająca liczbę jako wartość dziesiętną
    Metody realizujące operacje na obiektach klasy (wszystkie metody zmieniają obiekt, na rzecz którego
    zostały wywołane i nie zwracają żadnego wyniku):

  • dodająca drugą liczbę binarną przekazaną jako obiekt

  • mnożąca przez drugą liczbę binarną przekazaną jako obiekt

Że niby coś takiego:

type
  TClassBin = class
  strict private
    Fb1, Fb2, Fb3, FB4: Integer;
  public
    constructor Create(const b1, b2, b2, b4: integer);
    function BinValue(): integer;
    function DecValue(): Integer;
    procedure AddClassBin(const secondValue: TClassBin);
    procedure MultiplicationClassBin(const secondValue: TClassBin);
  end;

?? Czy ja czegoś nie ogarniam?

W powyższej klasie zaproponowałem Integer bo nie do końca rozkminiam co i jak czyli czy ma być przekazany create(1,2,2,4) jako liczba 1224 czy np 0001,0010,1001,0001 jako liczba 1291? ... oczywiście w zależności od potrzeb trzeba użyć LongWord lub Byte. Szczegóły konwersji itd znajdziesz tu:
http://stackoverflow.com/questions/21361627/converting-decimal-integer-to-binary-how-and-why-it-works-the-way-it-does

0

Chodzi o liczby z przedziału 0001-9999.

Po prostu wpisuejsz w okno liczbe 2 klikasz Button "Dziesietne na Binarne" i dajesz "Wyświetl" i pokazuje Ci że jest to 0010. Albo wpisujesz 0011 Dajesz Binarne na dziesietne i wyskakuje Ci że jest to 3.

W spakowanym .zip folder projekt02 to działa. Ale brakuje tego dodawania mnożenia odejmowania. Tego nie wiem jak zrobić, dlatego chciałem by ktoś edytował ten program.

0
  • z czterema parametrami, inicjujący liczbę wartością binarną przekazaną jako cztery kolejne cyfry

Ktoś chyba nie słyszał o macierzach... tym bardziej tzw. open arrays...

A mnie się wydaje, że to wcale nie chodzi o parametry jako liczby, a cyfry jako znaki; Zresztą pakowanie parametrów do konstruktora i jedynie do niego tylko komplikuje sprawę, bo nie widzę informacji na temat możliwości modyfikacji już wpisanej liczby; Przez to trzeba będzie za każdym razem tworzyć nowy obiekt i w konstruktorze podawać nowe cyfry, co jest co najmniej dziwne (i niewygodne);

  • zwracająca liczbę binarną w postaci łańcucha znakowego

Biorąc pod uwagę powyższe, wystarczy potraktować macierz jako łańcuch znaków i go zwrócić;

  • zwracająca liczbę jako wartość dziesiętną

Dodać prefiks % i przekonwertować procedurą Val;

Wait, w tagu widzę Delphi7 - widać niechcący studiujesz archeologię... o.O

0

No niestety, program na jakim pracujemy to właśnie Delphi7 :).

1

@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.

1 użytkowników online, w tym zalogowanych: 0, gości: 1