Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 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.49 MB
Время: 3.071 c
1-1122644308
Destroyer
2005-07-29 17:38
2005.08.21
Как из статического массива сделать динамический?


3-1120754263
Сергей Сергеевич
2005-07-07 20:37
2005.08.21
Отркытие Excel файла сразу на нужном листе?


8-1113335006
Fedor
2005-04-12 23:43
2005.08.21
И снова DSPack


14-1122323478
mr. X
2005-07-26 00:31
2005.08.21
Вот Вы тут такие умные...


4-1120111340
Mishenka
2005-06-30 10:02
2005.08.21
Работа с двумя CDRom ами





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский