Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2011.06.19;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.75 MB
Время: 0.005 c
15-1298562424
И. Павел
2011-02-24 18:47
2011.06.19
Тяжелый рок!


2-1300115458
Сергей
2011-03-14 18:10
2011.06.19
Как преобразовать данные прочитанные с com порта?


15-1299141839
pasha_golub
2011-03-03 11:43
2011.06.19
Расшифровка математических выражений


2-1300046266
Fassy
2011-03-13 22:57
2011.06.19
Уравнение 0.1+ln(1+x)-sin(1+x)


6-1237876800
Vudu
2009-03-24 09:40
2011.06.19
Отключить/подключить интернет





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский