forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Проекты на MidletPascal (http://forum.boolean.name/forumdisplay.php?f=88)
-   -   UniCalc. Универсальный калькулятор (http://forum.boolean.name/showthread.php?t=14974)

Ksanatos 28.06.2011 04:15

Ответ: UniCalc. Универсальный калькулятор
 
Павел
Как выпущу бету, возьмусь за 0.2. Почищу и переделаю формат переменной с выражением, тогда производную будет намного легче реализовать. Уже есть наброски.

cherepets 28.06.2011 11:17

Ответ: UniCalc. Универсальный калькулятор
 
Я делал похожий кальк. на дельфи.
Можешь рассказать в каком виде у тебя хранится математическое выражение после разбиения на части?

Ksanatos 28.06.2011 13:40

Ответ: UniCalc. Универсальный калькулятор
 
У меня нет видимого разбиения на части. Всё выражение хранится в одной переменной. Расчёт происходит по меткам в строке.

Ksanatos 29.06.2011 01:12

Ответ: UniCalc. Универсальный калькулятор
 
экран 240х320 придётся отложить, еду на природу с родителями, отдыхать... вернее работать... в общем доделаю как приеду.

Ksanatos 29.06.2011 01:14

Ответ: UniCalc. Универсальный калькулятор
 
cherepets
да кстати на данный момент вид строки абсолютно идентичен тому что на экране телефона. к следующей версии думаю всё переделать.

Ksanatos 30.06.2011 16:20

Ответ: UniCalc. Универсальный калькулятор
 
Changes:
+ графика оптимизиванна под экраны 240х320;
+ исправлен баг с приоритетом действий;
+ небольшие изменения в графике.

Ksanatos 30.06.2011 22:50

Ответ: UniCalc. Универсальный калькулятор
 
Changes:
+ исправлен баг в делении, но теперь он считает с точностью до 16 знаков. Это сделанно для того, чтобы периуды в ответе не циклили навечно кальк. В будующем можно будет поменять количество знаков после запятой при делении.
В будующем и мышины будут летать :cool:

Reizel 30.06.2011 23:49

Ответ: UniCalc. Универсальный калькулятор
 
Цитата:

Сообщение от Ksanatos (Сообщение 193447)
У меня нет видимого разбиения на части. Всё выражение хранится в одной переменной. Расчёт происходит по меткам в строке.

Это печально.

Ksanatos 01.07.2011 01:24

Ответ: UniCalc. Универсальный калькулятор
 
Павел
а что по твоему было бы лучше?
В java одной строки для всего калькулятора хватит вполне.

Reizel 01.07.2011 19:22

Ответ: UniCalc. Универсальный калькулятор
 
Синтаксический анализ

Ksanatos 01.07.2011 21:09

Ответ: UniCalc. Универсальный калькулятор
 
Вот функция подсчёта, можно упростить, но мне лень.
Код:

function Counting(bufstring : string): string;//подсчёт всей строки
  var
    minus : boolean;
    bufstring2,bufstring3 : string;
    OpenBracket,CloseBracket : integer;//позиции открывающей и закрывающей скобок
    FirstNumber,SecondNumber : string;//первое и второе буферные числа
    i,j : integer;//счётчики
    ch : char;
  begin
    //решение выражений в скобках
    while pos(bufstring,'(')<>-1 do
      if getChar(bufstring,pos(bufstring,'(')-1)<>' ' then
        //место для решения функций
        nop;
        //-------------------------
      else
        begin
          OpenBracket:=pos(bufstring,'(');
          bufstring2:=copy(bufstring,OpenBracket+1,length(bufstring));
          i:=0;
          for CloseBracket:=0 to length(bufstring2) do
            if getChar(bufstring2,CloseBracket)='(' then
              i:=i+1;
            else if getChar(bufstring2,CloseBracket)=')' then
              if i<>0 then
                i:=i-1;
              else
                break;
          bufstring2:=copy(bufstring2,0,CloseBracket);
          bufstring:=copy(bufstring,0,OpenBracket)+Counting(bufstring2)+copy(bufstring,OpenBracket+CloseBracket+2,length(bufstring));
        end;
    //---------------------------
    //умножение
    while (pos(bufstring,'*')<>-1) or (pos(bufstring,'/')<>-1) do
      begin
        i:=pos(bufstring,'*');
        j:=pos(bufstring,'/');
        if (i<>-1) and (((j<>-1) and (i<j)) or (j=-1)) then
          ch:=getChar(bufstring,i);
        if (j<>-1) and (((i<>-1) and (j<i)) or (i=-1)) then
          ch:=getChar(bufstring,j);
        bufstring2:=copy(bufstring,0,pos(bufstring,ch)-1);
        j:=PositionOfLastNumber(bufstring2);
        FirstNumber:=copy(bufstring2,j,length(bufstring2));
        FirstNumber:=NumCalibration(FirstNumber);
        bufstring2:='';
        for i:=pos(bufstring,ch)+2 to length(bufstring) do
          if getChar(bufstring,i)=' ' then
            break;
        if i>length(bufstring) then
          i:=i-1;
        SecondNumber:=copy(bufstring,pos(bufstring,ch)+2,i);
        SecondNumber:=NumCalibration(SecondNumber);
        bufstring:=copy(bufstring,0,j)+OperationFilter(FirstNumber,SecondNumber,ch)+copy(bufstring,i,length(bufstring));
      end;
    //---------
    //вычитание
    bufstring3:=bufstring;
    repeat
      if (pos(bufstring3,'-')<>-1) then
        if getChar(bufstring3,pos(bufstring3,'-')+1)=' ' then
          begin
            bufstring2:=copy(bufstring,0,pos(bufstring,'-')-1);
            j:=PositionOfLastNumber(bufstring2);
            FirstNumber:=copy(bufstring2,j,length(bufstring2));
            FirstNumber:=NumCalibration(FirstNumber);
            bufstring2:='';
            for i:=pos(bufstring,'-')+2 to length(bufstring) do
              if getChar(bufstring,i)=' ' then
                break;
            if i>length(bufstring) then
              i:=i-1;
            SecondNumber:=copy(bufstring,pos(bufstring,'-')+2,i);
            SecondNumber:=NumCalibration(SecondNumber);
            bufstring:=copy(bufstring,0,j)+OperationFilter(FirstNumber,SecondNumber,'-')+copy(bufstring,i,length(bufstring));
            bufstring3:=bufstring;
          end;
        else
          bufstring3:=copy(bufstring3,0,pos(bufstring3,'-'))+copy(bufstring3,pos(bufstring3,'-')+1,length(bufstring3));
      else
        break;
    until false;
    //---------
    //сложение
    while pos(bufstring,'+')<>-1 do
      begin
        bufstring2:=copy(bufstring,0,pos(bufstring,'+')-1);
        j:=PositionOfLastNumber(bufstring2);
        FirstNumber:=copy(bufstring2,j,length(bufstring2));
        FirstNumber:=NumCalibration(FirstNumber);
        bufstring2:='';
        for i:=pos(bufstring,'+')+2 to length(bufstring) do
          if getChar(bufstring,i)=' ' then
            break;
        if i>length(bufstring) then
          i:=i-1;
        SecondNumber:=copy(bufstring,pos(bufstring,'+')+2,i);
        SecondNumber:=NumCalibration(SecondNumber);
        bufstring:=copy(bufstring,0,j)+OperationFilter(FirstNumber,SecondNumber,'+')+copy(bufstring,i,length(bufstring));
      end;
    //--------
    Counting:=bufstring;
  end;


Reizel 02.07.2011 11:13

Ответ: UniCalc. Универсальный калькулятор
 
Код:

float GetValue(TTree * node)
{
 switch(node->class_)
{
case VALUE:
return node->value;
break;
case OPERATION:
float v1 = GetValue(node->sub[0]);
float v2 = GetValue(node->sub[1]);
switch(node->subclass_)
{
case OPERATION_PLUS:
return v1+v2;
case OPERATION_MINUS:
return v1=v2;
}
break;
}
}

Вот так будет быстрее и надежнее

Ksanatos 02.07.2011 21:04

Ответ: UniCalc. Универсальный калькулятор
 
Java я только начинаю учить, поэтому есть некоторые вопросы.
поясни некоторые строки:
(TTree * node) - что за класс TTree и для чего нужна звёздочка?
(node->class_) и node->value и т.д. - ... О_о что это вообще?

impersonalis 02.07.2011 21:13

Ответ: UniCalc. Универсальный калькулятор
 
Цитата:

Сообщение от Ksanatos (Сообщение 194009)
... О_о что это вообще?

Си++

2Павел
Забавная опечатка, превращающаяся в баг:
Код:

return v1=v2;
этот return будет всегда возвращать true

Ksanatos 02.07.2011 22:21

Ответ: UniCalc. Универсальный калькулятор
 
2Павел
Я оперирую строкой только потому, что даже число с плавающей запятой(что появилось только в конф. CLDC 1.1) меня не устраивает. Для каждого действия своя функция. OperationFilter приводит числа к нужному формату, потом проводит нужную операцию.


Часовой пояс GMT +4, время: 09:10.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot