Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.08.21;
Скачать: CL | DM;

Вниз

Различные способы вычисления 2х2   Найти похожие ветки 

 
БарЛог ©   (2005-07-26 20:45) [0]

Предлагаю поприкалываться на тему разработки самого сложного алгоритма вычисления 2х2. Коды просьба писАть на Делфи.


 
YurikGL ©   (2005-07-26 21:44) [1]

try
Calculyator:=TCalculyator.create(self);
Calculyator.sendTextOnLCD("2");
Calculyator.sendTextOnLCD("*");
Calculyator.sendTextOnLCD("2");
Calculyator.sendTextOnLCD("=");
showmessage("Ответ="Calculyator.GetTextFromLCD);
finally
Calculyator.free;
end


 
Джо ©   (2005-07-26 21:53) [2]

Условимся, что Button1 - это единица чего-либо. Соответственно, два баттона - это 2. Следовательно, выражение 2+2 можно решить так:

procedure TForm1.Button1Click(Sender: TObject);
var
 Res: Integer;
 function DvaButtona: Integer;
 begin
   Result := Integer(Button1) * 2;
 end;
 function ButtonKoef: Integer;
 begin
   Result := Integer(Button1);
 end;
begin
 Res := (DvaButtona + DvaButtona) div ButtonKoef;
 ShowMessage (IntToStr(Res));
end;

Вот так это и считается.
П.С. Ох, надо бы сегодня надраться....


 
Джо ©   (2005-07-26 22:17) [3]


> [2] Джо ©   (26.07.05 21:53)
> П.С. Ох, надо бы сегодня надраться....

Сказано - сделано. Теперь подход мне видится иным:

unit Unit2;

interface
uses SysUtils, Classes;

type

 IDigit = interface
   ["{C426815A-9731-4C48-A59F-ECF4B6894F5F}"]
   function GetValue: Double;
   property Value: Double read GetValue;
   function Plus (ADigit: IDigit): IDigit;
 end;

 TDigit = class (TInterfacedObject, IDigit)
 private
   FValue: Double;
   function GetValue: Double;
 public
   constructor Create (AValue: Double);
   property Value: Double read GetValue;
   function Plus (ADigit: IDigit): IDigit;
 end;

implementation

{ TDigit }

function TDigit.Plus(ADigit: IDigit): IDigit;
begin
 Result := TDigit.Create(FValue + ADigit.Value);
end;

constructor TDigit.Create(AValue: Double);
begin
 inherited Create;
 FValue := AValue
end;

function TDigit.GetValue: Double;
begin
 Result := FValue
end;

end.

Пользуем вот так:

procedure TForm1.Button1Click(Sender: TObject);
var
 Digit1,
 Digit2,
 Res: IDigit;
begin
 Digit1 := TDigit.Create(2);
 Digit2 := TDigit.Create(2);

 Res := Digit1.Plus (Digit2);

 ShowMessageFmt ("%f",[Res.Value])
end;

:*)


 
БарЛог ©   (2005-07-26 22:55) [4]

В [2] можно еще и

 function DvaButtona: Integer;
begin
  Result := ButtonKoef(Button1) * 2;
end;

а то зря функцию определял. тока надо ее определить ДО function DvaButtona.

Второй вариант [3] однозначно лучше =)


 
Гаврила ©   (2005-07-26 23:12) [5]


> [1] YurikGL ©  


У тебя ошибка в коде :-)))))


 
Джо ©   (2005-07-26 23:18) [6]


> [4] БарЛог ©   (26.07.05 22:55)
> Второй вариант [3] однозначно лучше =)

Не, одназначно лучше такой вариант:

unit Unit2;

interface
uses SysUtils, Classes;

type

INumber = interface
  ["{C426815A-9731-4C48-A59F-ECF4B6894F5F}"]
  function GetValue: Double;
  property Value: Double read GetValue;
  function Plus (ANumber: INumber): INumber;
end;

TNumber = class (TInterfacedObject, INumber)
private
  FValue: Double;
  function GetValue: Double;
public
  constructor Create (AValue: Double);
  property Value: Double read GetValue;
  function Plus (ANumber: INumber): INumber;
end;

IBinaryOperator = interface
  ["{ACC08A61-6F50-41C5-B007-65D06BDABF6C}"]
  procedure SetFirstOperand (ANumber: INumber);
  procedure SetSecondOperand (ANumber: INumber);
  function GetFirstOperand: INumber;
  function GetSecondOperand: INumber;
  property FirstOperand: INumber read GetFirstOperand write SetFirstOperand;
  property SecondOperand: INumber read GetSecondOperand write SetSecondOperand;
  function Result: INumber;
end;

// Abstract class for binary operations
TBinaryOperator = class (TInterfacedObject, IBinaryOperator)
private
  FFirstOperand,
  FSecondOperand: INumber;
public
  procedure SetFirstOperand (ANumber: INumber);
  procedure SetSecondOperand (ANumber: INumber);
  function GetFirstOperand: INumber;
  function GetSecondOperand: INumber;
  function Result: INumber; virtual; abstract;
end;

TPlusOperator = class (TBinaryOperator)
public
  function Result: INumber; override;
end;

TMinusOperator = class (TBinaryOperator)
public
  function Result: INumber; override;
end;

implementation

{ TNumber }

function TNumber.Plus(ANumber: INumber): INumber;
begin
Result := TNumber.Create(FValue + ANumber.Value);
end;

constructor TNumber.Create(AValue: Double);
begin
inherited Create;
FValue := AValue
end;

function TNumber.GetValue: Double;
begin
Result := FValue
end;

{ TPlus }

{ TBinaryOperator }

function TBinaryOperator.GetFirstOperand: INumber;
begin
 Result := FFirstOperand
end;

function TBinaryOperator.GetSecondOperand: INumber;
begin
 Result := FSecondOperand
end;

procedure TBinaryOperator.SetFirstOperand(ANumber: INumber);
begin
 FFirstOperand := ANumber
end;

procedure TBinaryOperator.SetSecondOperand(ANumber: INumber);
begin
 FSecondOperand := ANumber
end;

{ TPlus }

{ TPlus }

function TPlusOperator.Result: INumber;
begin
 Result := TNumber.Create(
   FFirstOperand.Value + FSecondOperand.Value
 );
end;

{ TMinusOperator }

function TMinusOperator.Result: INumber;
begin
 Result := TNumber.Create(
   FFirstOperand.Value - FSecondOperand.Value
 );
end;

end.


Употребляем-с:

procedure TForm1.Button1Click(Sender: TObject);
begin
 // складываем
 with TPlusOperator.Create as IBinaryOperator do
 begin
   FirstOperand := TNumber.Create(2);
   SecondOperand := TNumber.Create(2);
   ShowMessageFmt ("%f",[Result.Value])
 end;
 // или вычитаем
 with TMinusOperator.Create as IBinaryOperator do
 begin
   FirstOperand := TNumber.Create(2);
   SecondOperand := TNumber.Create(2);
   ShowMessageFmt ("%f",[Result.Value])
 end;
end;

%-)


 
Джо ©   (2005-07-26 23:20) [7]

Метод Plus из интерфейса IDigit -- удалить нафихх. Не будем мешать операторы с операндами! :)


 
pasha_golub ©   (2005-07-26 23:27) [8]

Гыгы, идиоты...

4


А вот теперь, кто расскажет как как я на Делфи это сделал, получит приз... от П... (м)


 
Джо ©   (2005-07-26 23:33) [9]


>  [8] pasha_golub ©   (26.07.05 23:27)
> А вот теперь, кто расскажет как как я на Делфи это сделал,
> получит приз... от П... (м)

Ты воспользовался счетом на пальцах. Примерно так:

unit Unit2;

interface
uses SysUtils;

type

 TPalm = class
 private
   FFingerCount: Integer;
 public
   procedure AddFinger;
   function Count: Integer;
 end;

implementation

{ TPalm }

procedure TPalm.AddFinger;
begin
 Inc (FFingerCount)
end;

function TPalm.Count: Integer;
begin
 if FFingerCount <= 5 then
   Result := FFingerCount
 else
   raise Exception.Create("Нехватает пальцев на руке!");
end;

end.

А считал так:

procedure TForm1.Button1Click(Sender: TObject);
var
 Palm: TPalm;

 procedure ZagniDvaPaltza (const APalm: TPalm);
 begin
   APalm.AddFinger;
   APalm.AddFinger;
 end;

begin
 Palm := TPalm.Create;
 try
   ZagniDvaPaltza(Palm);
   ZagniDvaPaltza(Palm);
   ShowMessageFmt ("%d",[Palm.Count])
 finally
   Palm.Free;
 end;
end;

Я угадал?


 
pasha_golub ©   (2005-07-26 23:37) [10]

Джо, тебе лична от меня приз!

Ясен, палец, музыкальный диск.

Выбирай чего хотишь! (Токмо не сильно оригинальничай, ну шобы в Осле было ;0) ...


 
Юрий Зотов ©   (2005-07-26 23:47) [11]

А в алгоритме Джо ошибка. Гы. Он считает 2+2, а не 2х2.


 
Джо ©   (2005-07-26 23:50) [12]


> [10] pasha_golub ©   (26.07.05 23:37)

Давай шото грустное тогда... Такое, шоб под него можно было выпить и повеситься, я люблю :)
Но, по сабжу - знатоки уверяют, что табличные способы самые быстрые. Посему, без них копилка наших способов будет не полна :^). Итак:

function DvaPlusDva: Integer;
type
 TTablitza = array [1..2,1..2] of Integer;
const
 Tablitza: TTablitza =
 (
   (2,3),
   (3,4)
 );
begin
 Result := Tablitza[2,2]
end;

%-|


 
Джо ©   (2005-07-26 23:51) [13]


>  [11] Юрий Зотов ©   (26.07.05 23:47)

Опс :-(


 
Юрий Зотов ©   (2005-07-26 23:52) [14]

Правильно так:

Proizvedenie := 0;
Mnojimoe := ZagniDvaPaltza(Palm);
Mnojitel := ZagniDvaPaltza(Palm);
for i := 1 to Mnojitel do
 Proizvedenie :=  Proizvedenie + Mnojimoe;


 
Джо ©   (2005-07-27 00:07) [15]


> [14] Юрий Зотов ©   (26.07.05 23:52)

Эдак пальцы сломать не долго :-)



Страницы: 1 вся ветка

Текущий архив: 2005.08.21;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.046 c
1-1122550947
Pasha L
2005-07-28 15:42
2005.08.21
AND и OR, оперирующие с интежером


4-1119448969
Алена
2005-06-22 18:02
2005.08.21
Отловить завершение процесса


1-1122642655
mazepa
2005-07-29 17:10
2005.08.21
excell


8-1112792366
anat
2005-04-06 16:59
2005.08.21
OpenGL нужна помощь


1-1123145404
HunTeR_IzV
2005-08-04 12:50
2005.08.21
StringGrid