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

Вниз

Интересный алгоритм в обычном калькуляторе.   Найти похожие ветки 

 
Fergo ©   (2011-02-25 20:45) [0]

Товарищи помогите реализовать вот такой вот алгоритм: откройте обычный кальклятор Windows или любой электронный и далее жмем в нем "3" , "+" , "4", теперь когда нажимаем на "=" получаем ответ 7. Далее жмем еще раз сразу на "=" - прибавляется еще раз "4". Теперь жмем сразу на "+" и далее на "=". и видим что при дальнейших нажатиях на "="  прибавляется уже последний результат. Я перерыл всё что токо можно в интернете. все "калькуляторы" которые попадались такого алгоритма не имеют. Пытался реализовать сам, но получается очень много кода и слишком сложно все. может у вас чего нибудь получится. Есть вариант через дебаггер пропустить ВинКальк но эт на потом =)


 
Smile   (2011-02-25 20:51) [1]

Я не  модератор, но предлагаю подобные посты в ...


 
oldman ©   (2011-02-25 20:58) [2]


> Пытался реализовать сам, но получается очень много кода
> и слишком сложно все.


все очень просто при наличии мозгов


 
KilkennyCat ©   (2011-02-25 20:59) [3]

Легко:
Создаем три глобальных хрени:
var
 x, y, z : integer;

procedure TForm1.Create(..);
begin
 x := 3;
 y := 4;
 z := x + y;
end;

proceduer TForm1.ButtonRavnoClick(..);
begin
 inc(z, y);
 label1.caption := "rezultat: " + inttostrdef(z, "fig znaet");
end;


 
Pavia ©   (2011-02-25 21:01) [4]

Всё просто значение считывается из текстового поля.


 
Smile   (2011-02-25 21:02) [5]

Не пойму кому отдать предпочтение?
oldman © или
KilkennyCat ©
проблема однако
:)


 
И. Павел ©   (2011-02-25 21:04) [6]

Запоминайте предыдущую операцию и второй аргумент, и если кнопка "=" нажата, а первый аргумент еще не введен, то считайте, что требуется повтор операции.

А если первый аргумент введен, потом указана операция но не указан второй аргумент (но операция его требует) и сразу нажата "=", то просто считаете, что второй аргумент равен первому.


> Пытался реализовать сам, но получается очень много кода
> и слишком сложно все. может у вас чего нибудь получится.

попытка хорошая. Но курсач все равно придется делать самостоятельно :)


 
Smile   (2011-02-25 21:07) [7]

> И. Павел ©   (25.02.11 21:04) [6]

Последняя фраза коронная
:)


 
Inovet ©   (2011-02-25 21:08) [8]

Конечно, в дебагер этот ВинКалк, и разобрать по винтикам.

В WinXP, кстати, у калькулятора 2 режима, в Win7 ещё бльше, и вот эти штуки работают по-разному в каждом.


 
Игорь Шевченко ©   (2011-02-25 21:16) [9]


> inttostrdef


это сильно


 
Fergo ©   (2011-02-25 21:21) [10]

KilkennyCat я наверное в вопросе забыл указать что мне не буквально эта операция нужна=). ты вот открой делфи кинь 4 кнопки( "3","4","+" и "=" ) и Edit или Panel или еще чего не важно и попробуй сделать так чтоб то что я выше описал работало. лично у меня не получается.


 
Fergo ©   (2011-02-25 21:25) [11]


> Запоминайте предыдущую операцию и второй аргумент, и если
> кнопка "=" нажата, а первый аргумент еще не введен, то считайте,
>  что требуется повтор операции.
>
> А если первый аргумент введен, потом указана операция но
> не указан второй аргумент (но операция его требует) и сразу
> нажата "=", то просто считаете, что второй аргумент равен
> первому.

эт я и сам несколько раз прорабатывал в мозгах и наизусть уже знаю как там и что) а вот состряпать не могу. путаюсь потому что много что то переменных получается у меня.


 
Inovet ©   (2011-02-25 21:27) [12]

У такого калькулятора есть два регистра А и Б. Содержимое А отображается на дисплее, при вводе операции, содержимое копируется вместе с операцией в Б при нажатии на "=" А и Б обрабатывеются, согласно операции из Б.


 
Fergo ©   (2011-02-25 21:28) [13]

да кстати KilkennyCat ты учти еще что там еще есть и "/", "*", и "-" и они так же работают. но эт уже проще потом будет сделать.


 
Inovet ©   (2011-02-25 21:29) [14]

> [12] Inovet ©   (25.02.11 21:27)
> согласно операции из Б.

и результат помещается в А, в Б остаётся, что и было


 
Leon-Z ©   (2011-02-25 21:31) [15]

Удалено модератором
Примечание: п. 11 правил


 
KilkennyCat ©   (2011-02-25 21:33) [16]


> Игорь Шевченко ©   (25.02.11 21:16) [9]

э... а что нет такого? :) я думал, есть...


> Fergo ©   (25.02.11 21:28) [13]
>
> да кстати KilkennyCat ты учти еще что там еще есть и "/",
>  "*", и "-" и они так же работают. но эт уже проще потом
> будет сделать.


я обязательно учту, но я сейчас занят реализацией:

> открой делфи кинь 4 кнопки( "3","4","+" и "=" ) и Edit или
> Panel или еще чего не важно и попробуй сделать так чтоб
> то что я выше описал работало


 
Fergo ©   (2011-02-25 21:34) [17]


> У такого калькулятора есть два регистра А и Б. Содержимое
> А отображается на дисплее, при вводе операции, содержимое
> копируется вместе с операцией в Б при нажатии на "=" А и
> Б обрабатывеются, согласно операции из Б.


> и результат помещается в А, в Б остаётся, что и было

Да, но хотелось бы увидеть это все в виде: var
...
...

proceduer TForm1.Button"3"Click(..);
begin
...
end;

proceduer TForm1.Button"+"Click(..);
begin
...
end;
и т.д.


 
KilkennyCat ©   (2011-02-25 21:36) [18]


> Да, но хотелось бы увидеть это все в виде: var
> ...
> ...


var
 A, Б : extended;


 
Fergo ©   (2011-02-25 21:38) [19]

KilkennyCat не придирайся, я ж ничего не сказал про proceduer и  inttostrdef=)


 
KilkennyCat ©   (2011-02-25 21:42) [20]

я думаю, что полезно разбить действия на функции.

function plus(a : extended; б : extended; var z : extended) : boolean;
begin
 try
  z := a + б;
  result := (z > a) and (z > б); //проверяем, произошло ли сложение и сообщаем
 except
  result := false;//сложение однозначно навернулось.
 end;
end;


 
Leon-Z ©   (2011-02-25 21:45) [21]

Ну все таки Мелко-Мягкие всех обманули с калькулятором.
Я думаю что это просто ГЛЮК в программе, а не специально запрограммированная возможность данного приложения.


 
KilkennyCat ©   (2011-02-25 21:49) [22]


> KilkennyCat не придирайся

хорошо.
даю половину кода, может даже больше.

var
 a, b : extended;
 flag : boolean;
 oper : byte;
.....................

вычислитель
begin
 case oper of
   1 : a := a + b;
   2 : a := a - b;
   3 : a := a * b;
   4 : a := a / b;
 end;
end;

помня oper можно бесконечно вызывать вычислитель


 
Fergo ©   (2011-02-25 21:49) [23]

I>
> Ну все таки Мелко-Мягкие всех обманули с калькулятором.
> Я думаю что это просто ГЛЮК в программе, а не специально
> запрограммированная возможность данного приложения.

)))))) я тож так думал пока не попробовл на обычном электронном Citezen"е))


 
KilkennyCat ©   (2011-02-25 21:54) [24]


> Inovet ©   (25.02.11 21:08) [8]

калькулятор в вин 7 в режиме для программиста не позволяет вводить вещественные числа. это меня прикольнуло.


 
Fergo ©   (2011-02-25 21:58) [25]

Удалено модератором
Примечание: Offtopic


 
Германн ©   (2011-02-25 21:59) [26]


> KilkennyCat ©   (25.02.11 21:54) [24]
>
>
> > Inovet ©   (25.02.11 21:08) [8]
>
> калькулятор в вин 7 в режиме для программиста не позволяет
> вводить вещественные числа. это меня прикольнуло.

Знать уже поставили на учет.


 
Leon-Z ©   (2011-02-25 22:00) [27]


> Fergo ©   (25.02.11 21:49) [23]
> я тож так думал пока не попробовл на обычном электронном
> Citezen"е))

И Citezen глючный!!!
А вообще я думаю надо прочитать про "польскую запись" - специальный
алгоритм для вычисления выражений.
Может там ответ ???


 
KilkennyCat ©   (2011-02-25 22:10) [28]

предлагаю плюнуть на алгоритм и заняться интерфейсом.
кидаем на форму один едит, и 16 кнопок.
кнопкам с цифрами присваиваем тэг соответсвенно цифре.
кнопка равно тэг 10
умнож - 13
делен -  14
сложение - 11
вычитание - 12
сброс - 20
десятичная точка - 18

и все вешаем на один обработчик клика.

procedure TForm.btnClick(Sender: TObject);
begin
  case (sender as TComponent).tag of
     1..9 : edit1.text := edit1.text + inttostr( (sender as TComponent).tag);
      18 : if  pos("." edit1.text) < 1 then edit1.text := edit1.text + "."
     12..14 begin
                 oper := (sender as TComponent).tag - 10;
                 if a = 0 then a := strtofloat(edit1.text) else begin
                   b := strtofloat(edit1.text);
                   вычислитель(oper);
                   edit1.text := floattostr(a);
                 end;
              end;
       15 : if a = 0 then a := strtofloat(edit1.text) else begin
                   b := strtofloat(edit1.text);
                   вычислитель(oper);
                   edit1.text := floattostr(a);
                 end;
       20 : begin
               a := 0;
               b := 0;
               oper := 0;
             end;
   end;            
end;


вроде бы все.


 
Fergo ©   (2011-02-25 22:10) [29]

нашел ток "обратную польскую запись":

program calc;
{$APPTYPE console}

type
 Real = double;

const
 prs = "+-*/(";
 pri: array [1 .. 5] of byte = (1, 1, 2, 2, 0);

var
 s1, s2: String;
 q: array [0 .. 500] of Real;
 w: array [0 .. 500] of Char;
 n, len, len2: Cardinal;
 t: Real;
 ch: Char;

procedure Push(x: Real);
begin
 Inc(len);
 q[len] := x;
end;

function Pop: Real;
begin
 Pop := q[len];
 q[len] := 0;
 Dec(len);
end;

procedure PushC(x: Char);
begin
 Inc(len2);
 w[len2] := x;
end;

function Popc: Char;
begin
 Popc := w[len2];
 w[len2] := #0;
 Dec(len2);
end;

function Oper(s1, s2: Real; s3: Char): Real;
var
 x, y, z: Real;
begin
 x := s1;
 y := s2;
 case s3 of
   "+": z := x + y;
   "-": z := x - y;
   "*": z := x * y;
   "/": z := x / y;
 end;
 Oper := z;
end;

procedure PreChange(var s: String);
var
 i: Cardinal;
begin
 if s[1] = "-" then
   s := "0" + s;
 i := 1;
 while i <= n do
   if (s[i] = "(") and (s[i + 1] = "-") then
     insert("0", s, i + 1)
   else
     Inc(i);
end;

function Change(s: String): String;
var
 i: Cardinal;
 rezs: String;
 c: Boolean;
begin
 c := false;
 for i := 1 to n do
   begin
     if not(s[i] in ["+", "-", "*", "/", "(", ")"]) then
       begin
         if c then
           rezs := rezs + " ";
         rezs := rezs + s[i];
         c := false;
       end
     else
       begin
         c := true;
         if s[i] = "(" then
           PushC(s[i])
         else
           if s[i] = ")" then
             begin
               while w[len2] <> "(" do
                 begin
                   rezs := rezs + " " + Popc;
                 end;
               Popc;
             end
           else
             if s[i] in ["+", "-", "*", "/"] then
               begin
                 while pri[Pos(w[len2], prs)] >= pri[Pos(s[i], prs)] do
                   rezs := rezs + " " + Popc;
                 PushC(s[i]);
               end;
       end;
   end;
 while len2 <> 0 do
   rezs := rezs + " " + Popc;
 Change := rezs;
end;

function Count(s: String): Real;
var
 ss: String;
 x, s1, s2: Real;
 chh, s3: Char;
 p, i, j: Cardinal;
 tmp: Integer;
begin
 i := 0;
 repeat
   j := i + 1;
   repeat
     Inc(i)
   until s[i] = " ";
   ss := copy(s, j, i - j);
   chh := ss[1];
   if not(chh in ["+", "-", "*", "/"]) then
     begin
       Val(ss, p, tmp);
       Push(p);
     end
   else
     begin
       s2 := Pop;
       s1 := Pop;
       s3 := chh;
       Push(Oper(s1, s2, s3));
     end;
 until i >= n;
 x := Pop;
 Count := x;
end;

procedure WriteL(x: Real);
var
 y, a, b: Cardinal;
 q: Real;
begin
 y := Trunc(x);
 b := 0;
 if Abs(x - y) < (1E-12) then
   Writeln(y)
 else
   begin
     if y > 0 then
       a := round(ln(y) / ln(10)) + 1
     else
       a := 1;
     q := x;
     repeat
       q := q * 10;
       Inc(b);
     until Abs(q - Trunc(q)) < (1E-12);
     Writeln(x:a + b:b);
   end;
end;

begin
 repeat
   Writeln("Enter expression");
   Readln(s1);
   n := Length(s1);
   PreChange(s1);
   n := Length(s1);
   s2 := Change(s1);
   if s2[1] = " " then
     delete(s2, 1, 1);
   s2 := s2 + " ";
   n := Length(s2);
   t := Count(s2);
   WriteL(t);
   Writeln("One more expression?(Y/N)");
   Readln(ch);
 until UpCase(ch) = "N";

end.


 
KilkennyCat ©   (2011-02-25 22:12) [30]

упс, я нулик забыл. ну и хрен с ним, и виндов только целые числа, а у моего калькулятора безнолевые.


 
Inovet ©   (2011-02-25 22:12) [31]

А что там видеть x, y doublе для аргументов, yo integr для операции


 
KilkennyCat ©   (2011-02-25 22:13) [32]


> Fergo ©   (25.02.11 22:10) [29]

ты меня пугаешь.


 
Inovet ©   (2011-02-25 22:17) [33]

> [24] KilkennyCat ©   (25.02.11 21:54)
> калькулятор в вин 7 в режиме для программиста не позволяет
> вводить вещественные числа. это меня прикольнуло.

Ага, тоже.


 
Palladin ©   (2011-02-25 22:17) [34]

найти мало, нужно понять


 
KilkennyCat ©   (2011-02-25 22:20) [35]


> KilkennyCat ©   (25.02.11 22:10) [28]

>        15 : if a = 0 then a := strtofloat(edit1.text) else
> begin
>                    b := strtofloat(edit1.text);
>                    вычислитель(oper);
>                    edit1.text := floattostr(a);
>                  end;


ошибся.
надо так:
        15 :  begin
                  if b := 0 then b := strtofloat(edit1.text);
                  вычислитель(oper);
                  edit1.text := floattostr(a);
                end;

но лучше ввести еще один флаг.


 
Fergo ©   (2011-02-25 22:21) [36]


> procedure TForm.btnClick(Sender: TObject);
> begin
>   case (sender as TComponent).tag of
>      1..9 : edit1.text := edit1.text + inttostr( (sender
> as TComponent).tag);
>       18 : if  pos("." edit1.text) < 1 then edit1.text :
> = edit1.text + "."
>      12..14 begin
>                  oper := (sender as TComponent).tag - 10;
>  
>                  if a = 0 then a := strtofloat(edit1.text)
> else begin
>                    b := strtofloat(edit1.text);
>                    вычислитель(oper);
>                    edit1.text := floattostr(a);
>                  end;
>               end;
>        15 : if a = 0 then a := strtofloat(edit1.text) else
> begin
>                    b := strtofloat(edit1.text);
>                    вычислитель(oper);
>                    edit1.text := floattostr(a);
>                  end;
>        20 : begin
>                a := 0;
>                b := 0;
>                oper := 0;
>              end;
>    end;            
> end;


а ты сам это проверял? просто мне кажется что тут будет ошибка в своевременности прсвоения переменной А и Б если А=0 или нет. а если мы А задали как "0"? но за вариант с тагами спс. что то о них не думал как то даж)


 
KilkennyCat ©   (2011-02-25 22:22) [37]

точнее, лучше сделать два обработчика кнопки равно и менять у нее тэг.
собственно, фигня задача.


 
Inovet ©   (2011-02-25 22:23) [38]

> [24] KilkennyCat ©   (25.02.11 21:54)
> в вин 7

Меня порадовало ведение всей истории с возможностью выбора из неё в удобоваримом виде, по умолчанию отключена, и даже сохранить в файл можно, наверно тоже полезная возможность.


 
Fergo ©   (2011-02-25 22:23) [39]


> точнее, лучше сделать два обработчика кнопки равно и менять
> у нее тэг.
> собственно, фигня задача.


а вот это реальная мысль..)


 
KilkennyCat ©   (2011-02-25 22:24) [40]


>  тут будет ошибка в своевременности прсвоения переменной
> А и Б если А=0 или нет.

да, возможно.
это решается малюсенькой доработкой, как я уже сказал, двойной обработкой "равно" (чтобы не лепить громадье условий и не вводить лишнии переменные)
а проверять это мне лень было, это ж надо делфи запускать... столько баттнов кидать...


 
Inovet ©   (2011-02-25 22:25) [41]

> [27] Leon-Z ©   (25.02.11 22:00)
> "польскую запись" - специальный
> алгоритм для вычисления выражений

Оно не вредно, но для двух операндов лишнее, имхо.


 
KilkennyCat ©   (2011-02-25 22:25) [42]


> Inovet ©   (25.02.11 22:23) [38]

я все никак не соберусь найти виденный когда калькулятор с историей и с вмешательством в любой момент истории. он еще красиво так был сделан, типа как крутые с принтером.


 
Inovet ©   (2011-02-25 22:29) [43]

> [42] KilkennyCat ©   (25.02.11 22:25)
> типа как крутые с принтером.

Что-то помню такое. Лента лезла из него. Старый вроде бы он.


 
KilkennyCat ©   (2011-02-25 22:31) [44]

ага.


 
Fergo ©   (2011-02-25 22:32) [45]

вариант с тагами мне понравился, ща буду кубатурить. спс всем) но если кто нибудь скинет готовый рабочий алгоритм буду признателен..


 
Inovet ©   (2011-02-25 22:49) [46]

> [42] KilkennyCat ©   (25.02.11 22:25)
> с вмешательством в любой момент истории

Посмотрел в Win7 - тоже можно в истории править, только пересчитывается правленая строка, а она может быть 123+456/789*159. Вот это выражение прямо в калькулятор скопировал.


 
Inovet ©   (2011-02-25 23:02) [47]

Делал как-то символьный вычислитель одному студенту. Залил экзешник, проверил на всякий случай http://www.virustotal.com

Название: CompareExpr.rar
Размер: 242.09 кб
Доступен до: 2011-03-27 23:58:13
Ссылка для скачивания файла: http://webfiles.ru/22111831


 
xmen   (2011-02-25 23:29) [48]


> Fergo ©   (25.02.11 22:10) [29]
>
> нашел ток "обратную польскую запись":

это совсем для других целей ...


 
Fergo ©   (2011-02-26 01:30) [49]

Так народ, все. догнал сам. спс всем и отдельное спс KilkennyCat за то что напомнил про таги).
Если кому надо вот код...

var
 Form1: TForm1;
 x,y,z: Extended;
 oper: Integer;
 Check1, Check2: boolean;
implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
 case (sender as TComponent).tag of
   0..9    : Begin
               if Check2=true then
                 Begin
                   x:=StrToFloat(Edit1.Text);
                   Check2:=false;
                 End;
               if Check1=true then Edit1.Text:="0";
               if Edit1.text ="0" then Edit1.Text:=IntToStr((sender as TComponent).tag) else Edit1.text:= Edit1.text + IntToStr((sender as TComponent).tag);
               Check1:=false;
               if oper<>0 then y:=StrToFloat(Edit1.Text) else x:=StrToFloat(Edit1.Text);
             End;
     10    : if  pos(".",Edit1.text) < 1 then Edit1.text := Edit1.text + ".";
 11..14    : Begin
               oper:=(sender as TComponent).tag - 10;
               Check1:=true;
               if Check2=true then y:=StrToFloat(Edit1.Text);
             End;
     15    : Begin
               if oper<>0 then
               if Check2=false then
                 Begin
                   case oper of
                     1 : Edit1.Text:=FloatToStr(x*y);
                     2 : Edit1.Text:=FloatToStr(x/y);
                     3 : Edit1.Text:=FloatToStr(x+y);
                     4 : Edit1.Text:=FloatToStr(x-y);
                   End;
                   Check2:=true;
                 End
                 Else
                 Begin
                   case oper of
                     1 : Edit1.Text:=FloatToStr(StrToFloat(Edit1.Text)*y);
                     2 : Edit1.Text:=FloatToStr(StrToFloat(Edit1.Text)/y);
                     3 : Edit1.Text:=FloatToStr(StrToFloat(Edit1.Text)+y);
                     4 : Edit1.Text:=FloatToStr(StrToFloat(Edit1.Text)-y);
                   End;
                 End;
             End;
 end;
end;


 
KilkennyCat ©   (2011-02-26 01:34) [50]

нахрена из опера десятку вычитаешь? я ее вставлял лишь для совместимости с предыдущим постом.
и проверку его на ноль странно делать. если и будет равен нулю, то только при первом запуске.


 
KilkennyCat ©   (2011-02-26 01:35) [51]

и целых два флага... ужасть. они избыточны.
давай доделывай.
мы против сырых калькуляторов! :)


 
KilkennyCat ©   (2011-02-26 01:36) [52]

и вот это:
FloatToStr(StrToFloat( - за это расстрел на месте.


 
Fergo ©   (2011-02-26 01:40) [53]

сорь доделаю завтра эт мелочи ща лабал как мог на скорость пока жена царапала) кстати а про флаги я хз че там придумать.. если есть варианты подкинь идей... я спать) а то загрызет)


 
KilkennyCat ©   (2011-02-26 01:44) [54]


>  про флаги

менять тэг. тэг в качестве флага - в большинстве случаев идеальная вещь. не требует переменной. глобален.


 
Rouse_ ©   (2011-02-26 01:48) [55]

Фига у людей проблемы.
Блин, я даж немного в задумчивости...
Казалось бы сложить два числа. Мдя... Пошел таки принципиально искать форумы для начинающих врачей. Хз, мошт их реально так-же учат?


 
Inovet ©   (2011-02-26 01:53) [56]

Я что-то не доглядел. Зачем флаги? Состояние регистров для такой логики, как в [0] сдвигаем привычислении из аккумулятора во второй регистр

шаг действие  x  y op
1.    с       0  0 n
2.    3       3  0 n
3.    +       3  3 +
4.    4       4  3 +
5.    =       7  4 +
6.    =      11  4 +
7.    +      11 11 +
8.    =      22 11 +
9.    с       0  0 n


 
Inovet ©   (2011-02-26 01:54) [57]

> [56] Inovet ©   (26.02.11 01:53)

шаг действие  x  y op
1.    с       0  0 n
2.    3       3  0 n
3.    +       3  3 +
4.    4       4  3 +
5.    =       7  4 +
6.    =      11  4 +
7.    +      11 11 +
8.    =      22 11 +
9.    с       0  0 n


 
KilkennyCat ©   (2011-02-26 02:07) [58]


> Inovet ©  

да, верно. наглядная табличка.


 
KilkennyCat ©   (2011-02-26 02:09) [59]


> Rouse_ ©   (26.02.11 01:48) [55]

я бы не утверждал, что именно у людей проблемы. фиг его знает, кто там за компом. может, инопланетяне.


 
Inovet ©   (2011-02-26 02:33) [60]

Нет. Последнее действие надо отмечать, если оно было "=", то не сдвигать при "=". Это режим с константой называется т.е. признак режима нужен.
А вот по другой логике после "=" сбрасывать op. Это без константы.


 
Fergo ©   (2011-02-26 12:00) [61]

Удалено модератором


 
Fergo ©   (2011-02-26 12:07) [62]

Удалено модератором


 
Inovet ©   (2011-02-26 12:20) [63]

> [61] Fergo ©   (26.02.11 12:00)
> (ща вы скажете что я совсем тютю..) а вы дальше по табле
> посмотрите и поймете что без флагов тут никуда

Не скажу. Ты посмотри следующие посты, про режим с константой, в некоторых калькуляторах он даже специально включается и на индикаторе отображается, так что надо поднять флаг если действие "=", если текущее "=" и флаг
поднят не сдвигать.

if (действие <> "=") or not f then сдвигаем;
f := действие = "=";

Ешё из этого режима попробуй

1+2=
4=
10=


 
Inovet ©   (2011-02-26 12:23) [64]

Удалено модератором


 
Tag   (2011-02-26 12:31) [65]

> спс всем и отдельное спс KilkennyCat за то что напомнил про таги

Использование Tag сродни использованию Goto.
Биойогурт, создающий благоприятную микрофлору в кишечнике, способствующую более <strikeout>легкой дефекации</strikeout> эффективному говнокодированию.


 
Fergo ©   (2011-02-26 12:31) [66]

я мож чго не понимаю в том что ты мне пытаешься обьяснить.. но мне кажется что Check2 в моем коде как раз это и делает...


 
Fergo ©   (2011-02-26 12:36) [67]

я как то помню пытался алгоритм составить где надо было вводить цифры в массив а потом они длжны были выборочно рандомно выбраться и ниразу не повториться. как песни в винампе типа проигрываются и чтоб рандомно и не повторялись.. все оказалось оч просто но всеж часа 3 я потупить умудрился над этой задачкой)


 
Tag   (2011-02-26 12:38) [68]

Удалено модератором


 
Fergo ©   (2011-02-26 12:40) [69]

Inovet ты приведи код рабочего калька с таким алгоритмом..) я пока своим доволен но хотелось бы по рационльнее.. а то 3 флага и правда много.. но хз мож в мелкософтовском кальке тож как нибудь так... в электронных то там вообще одни триггеры и логические AND XOR OR NOT  итд.. но  и в них этот алгоритм есть...


 
Fergo ©   (2011-02-26 12:41) [70]


> Tag

код в студию!)


 
Tag   (2011-02-26 12:46) [71]

> Fergo ©   (26.02.11 12:41) [70] код в студию!)

См. Fergo ©   (26.02.11 01:30) [49]


 
Inovet ©   (2011-02-26 12:52) [72]

> [69] Fergo ©   (26.02.11 12:40)
> Inovet ты приведи код рабочего калька с таким алгоритмом..)

Так не интересно тебе же самому.


 
Fergo ©   (2011-02-26 12:57) [73]


> Inovet ©   (26.02.11 12:52) [72]


> Так не интересно тебе же самому.

Интересно или нет эт я сам решу... Просто это не первый форум где я этот вопрос задавал. и пока никто толком не сделал этот алгоритм. только теории... а в реале 0


 
Fergo ©   (2011-02-26 13:01) [74]

фиг знает мне вот наоборот нравится решать подобные задачки если этого еще кто нибудь просит, но над этой я оч давно бьюсь(


 
Tag   (2011-02-26 13:12) [75]

> Fergo ©   (26.02.11 12:57) [73] и пока никто толком не сделал этот алгоритм

Анекдот про неуловимого Джо знаешь?

> Fergo ©   (26.02.11 13:01) [74] фиг знает мне вот наоборот нравится решать подобные задачки если этого еще кто нибудь просит, но над этой я оч давно бьюсь(

Судя по обилию постов, ты просто флудишь на форуме.

P.S. Никто не безгрешен...


 
Inovet ©   (2011-02-26 13:34) [76]

> [75] Tag   (26.02.11 13:12)
> Судя по обилию постов, ты просто флудишь на форуме.

Код клянчит готовый и на слабо разводит.


 
Inovet ©   (2011-02-26 13:36) [77]

> [73] Fergo ©   (26.02.11 12:57)
> пока никто толком не сделал этот алгоритм

Тебе весь алгоритм разъяснили, да какой там алгоритм и теории - пшик один.

Спрашивай, что не ясно в двух строчках кода.


 
KilkennyCat ©   (2011-02-26 14:22) [78]


> Tag   (26.02.11 12:31) [65]
>
> > спс всем и отдельное спс KilkennyCat за то что напомнил
> про таги
>
> Использование Tag сродни использованию Goto.


А пояснить? (не про биойогурт)


 
Fergo ©   (2011-02-26 14:25) [79]

Удалено модератором


 
KilkennyCat ©   (2011-02-26 14:56) [80]


> Fergo ©   (26.02.11 14:25) [79]
>
>  пока только я код привел более
> менее рабочий

да. он правда очень сильно напоминает мой, но это, наверное, совпадение?


 
boriskb ©   (2011-02-26 14:56) [81]


> Fergo ©  


Скажи пожалуйста, как ты сам оцениваешь:
1) Ты типичный представитель программистов такого возраста;
2) Ты Выше среднего уровня;
3) Ты чуть ниже среднего уровня.


 
KilkennyCat ©   (2011-02-26 14:58) [82]


> boriskb ©   (26.02.11 14:56) [81]

там нет графы для него.
4) выше высшего уровня туповатый плагиатор.


 
Fergo ©   (2011-02-26 15:14) [83]

Удалено модератором


 
Fergo ©   (2011-02-26 15:16) [84]

Удалено модератором


 
Inovet ©   (2011-02-26 15:18) [85]

> [82] KilkennyCat ©   (26.02.11 14:58)
> там нет графы для него.

Я думал автору интересно самому сделать, а всё как всегда: "Дайте! Не даёте? Да вы ничё не можете, только теории задвигать можете, я сам так можу, у-а-а, у-а-а."


 
boriskb ©   (2011-02-26 15:32) [86]


> KilkennyCat ©   (26.02.11 14:58) [82]


> Inovet ©   (26.02.11 15:18) [85]


Меня собственно насторожила фраза:

> ваши эти теории я и сам знаю. ты сделай а потом говори
.
.
.
> теории я и сам могу выводить кучами а когда делать начинаешь
> ( для тех кто в танке - ставить компоненты на форму и код
> писать) вот там то и ваши теории н катят на 100%.


То есть абсолютно с ног на голову всё ставит и гордится.
Вот и хотелось узнать - это типично?


 
KilkennyCat ©   (2011-02-26 15:49) [87]


> boriskb ©   (26.02.11 15:32) [86]

наверняка типично. Возможно, у социологов даже есть категория.


 
Fergo ©   (2011-02-26 16:12) [88]

фиг знает народ вот если меня когда просят я не парю мозги теориями я беру и сам делаю а потом обьясняю что и как с РЕАЛЬНО РАБОЧИМ ПРИМЕРОМ.


 
Fergo ©   (2011-02-26 16:14) [89]

ладно бы если бы я ниче не сделав просил бы ответ тупо. я ваши все варианты перепробовал да и до этого еще много раз пытался по своему сделать... ну не получается у меня тупо в логике тут...


 
KilkennyCat ©   (2011-02-26 16:25) [90]


> Fergo ©   (26.02.11 16:12) [88]

это личное дело каждого, как тратить время и каким принципам следовать.

> Fergo ©   (26.02.11 16:14) [89]

Inovet привел прекрасную табличку, не увидеть и не переложить алгоритм по которой...


 
Sha ©   (2011-02-26 20:55) [91]

Как-то так получается

type
 TOper= (opEq, opAdd, opSub, opMul, opDiv);

type
 TForm1 = class(TForm)
   Button1: TButton;
   Button2: TButton;
   Button3: TButton;
   Button4: TButton;
   Button5: TButton;
   Button6: TButton;
   Button7: TButton;
   Button8: TButton;
   Button9: TButton;
   Button10: TButton;
   Button11: TButton;
   Button12: TButton;
   Button13: TButton;
   Button14: TButton;
   Button15: TButton;
   Edit1: TEdit;
   Button16: TButton;
   Button17: TButton;
   procedure Button1Click(Sender: TObject);
   procedure Button2Click(Sender: TObject);
   procedure Button3Click(Sender: TObject);
   procedure Button4Click(Sender: TObject);
   procedure Button5Click(Sender: TObject);
   procedure Button6Click(Sender: TObject);
   procedure Button7Click(Sender: TObject);
   procedure Button8Click(Sender: TObject);
   procedure Button9Click(Sender: TObject);
   procedure Button10Click(Sender: TObject);
   procedure Button11Click(Sender: TObject);
   procedure Button12Click(Sender: TObject);
   procedure Button13Click(Sender: TObject);
   procedure Button14Click(Sender: TObject);
   procedure Button15Click(Sender: TObject);
   procedure Button16Click(Sender: TObject);
   procedure Button17Click(Sender: TObject);
   procedure FormCreate(Sender: TObject);
 private
   Value1: double;
   Value2: double;
   Oper: TOper;
   HasData: boolean;
   Fractional: boolean;
   EqPressed: boolean;
   procedure Reset;
   procedure Cipher(ch: char);
   procedure Calculate(NextOper: TOper);
 public
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Reset;
begin;
 HasData:=false;
 Fractional:=false;
 EqPressed:=false;
 Value1:=0;
 Value2:=0;
 Oper:=opAdd;
 Edit1.Text:="0"+DecimalSeparator;
 end;

procedure TForm1.Cipher(ch: char);
var
 s : string;
begin;
 s:=Edit1.Text;
 if (not HasData) or (s="0"+DecimalSeparator) then begin;
   s:=ch+DecimalSeparator;
   Fractional:=false;
   end
 else if Fractional then s:=s+ch
 else Insert(ch,s,pos(DecimalSeparator,s));
 Edit1.Text:=s;
 HasData:=true;
 end;

procedure TForm1.Calculate(NextOper: TOper);
label
 SkipOperation;
begin;
 if EqPressed
 then if NextOper<>opEq
      then goto SkipOperation
      else // Value2 OK
 else Value2:=StrToFloat(Edit1.Text);

 case Oper of
   opAdd: Value1:=Value1 + Value2;
   opSub: Value1:=Value1 - Value2;
   opMul: Value1:=Value1 * Value2;
   opDiv: Value1:=Value1 / Value2;
   else Value1:=0;
   end;

SkipOperation:
 EqPressed:=true;
 if NextOper<>opEq then begin;
   EqPressed:=false;
   Value2:=Value1;
   Oper:=NextOper;
   end;
 Edit1.Text:=FloatToStr(Value1);
 HasData:=false;
 end;

procedure TForm1.FormCreate(Sender: TObject);
begin;
 Reset;
 end;

procedure TForm1.Button10Click(Sender: TObject);
begin;
 Cipher("0");
 end;

procedure TForm1.Button1Click(Sender: TObject);
begin;
 Cipher("1");
 end;

procedure TForm1.Button2Click(Sender: TObject);
begin;
 Cipher("2");
 end;

procedure TForm1.Button3Click(Sender: TObject);
begin;
 Cipher("3");
 end;

procedure TForm1.Button4Click(Sender: TObject);
begin;
 Cipher("4");
 end;

procedure TForm1.Button5Click(Sender: TObject);
begin;
 Cipher("5");
 end;

procedure TForm1.Button6Click(Sender: TObject);
begin;
 Cipher("6");
 end;

procedure TForm1.Button7Click(Sender: TObject);
begin;
 Cipher("7");
 end;

procedure TForm1.Button8Click(Sender: TObject);
begin;
 Cipher("8");
 end;

procedure TForm1.Button9Click(Sender: TObject);
begin;
 Cipher("9");
 end;

procedure TForm1.Button11Click(Sender: TObject);
begin;
 Calculate(opDiv);
 end;

procedure TForm1.Button12Click(Sender: TObject);
begin;
 Calculate(opMul);
 end;

procedure TForm1.Button13Click(Sender: TObject);
begin;
 Calculate(opSub);
 end;

procedure TForm1.Button14Click(Sender: TObject);
begin;
 Calculate(opAdd);
 end;

procedure TForm1.Button15Click(Sender: TObject);
begin;
 Reset;
 end;

procedure TForm1.Button16Click(Sender: TObject);
begin;
 Calculate(opEq);
 end;

procedure TForm1.Button17Click(Sender: TObject);
begin;
 Fractional:=true;
 end;


 
Fergo ©   (2011-02-26 21:53) [92]

я тож решил наконец. проверил по всякому всё работает. ща опять начнете говорить что что то тут не рационально паршивцы)))


var
 Form1: TForm1;
 x,y: Extended;
 oper: Byte;
 Check1, Check2, Check3: boolean;
implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
 case (sender as TComponent).tag of
   0..9    : Begin
               if Check1=true then Edit1.Text:="0";
               if Edit1.text ="0" then Edit1.Text:=IntToStr((sender as TComponent).tag) else Edit1.text:= Edit1.text + IntToStr((sender as TComponent).tag);
               Check1:=false;
               if (Check2=false) and (Check3=false)then x:=StrToFloat(Edit1.Text);
               if (Check2=true) and (Check3=false)then y:=StrToFloat(Edit1.Text);
               if (Check2=true) and (Check3=true)then y:=StrToFloat(Edit1.Text);
             End;
     10    : if  pos(".",Edit1.text) < 1 then Edit1.text := Edit1.text + ".";
 11..14    : Begin
               oper:=(sender as TComponent).tag;
               Check1:=true;
               Check2:=true;
               if Check3=true then y:=StrToFloat(Edit1.Text);
             End;
     15    : Begin
               if oper<>0 then
                 Begin
                   case oper of
                     11 : x:=x*y;
                     12 : x:=x/y;
                     13 : x:=x+y;
                     14 : x:=x-y;
                   End;
                   Edit1.Text:=FloatToStr(x);
                   Check1:=true;
                   Check2:=false;
                   Check3:=true;
                 End;

             End;
 end;
end;


 
Fergo ©   (2011-02-26 21:55) [93]


> Sha ©

спс за кодец наконец то) ща проверю мож тож нормик будет...


 
Игорь Шевченко ©   (2011-02-26 22:10) [94]

http://www.delphimaster.ru/forums.shtml#rule

изучай



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

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

Наверх




Память: 0.76 MB
Время: 0.009 c
15-1298755792
Юрий
2011-02-27 00:29
2011.06.19
С днем рождения ! 27 февраля 2011 воскресенье


8-1212599857
DevilDevil
2008-06-04 21:17
2011.06.19
плагин для фотошопа ?


15-1299060395
Scott Storch
2011-03-02 13:06
2011.06.19
Цифровая подпись


15-1299063412
>|<
2011-03-02 13:56
2011.06.19
Что лучше, DOA или ODAC?


2-1299834174
ssnakess
2011-03-11 12:02
2011.06.19
Тип данных String