Форум: "Потрепаться";
Текущий архив: 2005.08.21;
Скачать: [xml.tar.bz2];
ВнизРазличные способы вычисления 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;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 1.776 c