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 24.06.2011 02:33

UniCalc. Универсальный калькулятор
 
Вложений: 2
Собственно ещё один калькулятор.
Версия: 0.1 alpha 2

Отличия от других:
+ полностью написан на MP, без использования библиотек;
+ считает числа любой длины.

Скриншоты (пока нету):





Что может:
~ все стандартные действия "+ - * /";
~ скобки, любой степени вложенности;
~ поддержка чисел с плавающей запятой;
~ история, 20 строк.

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

Проект распространяеться под лицензией GNU GPL v2, так что если появиться желание посмотреть исходники пишите в личку. Исходники не то чтобы документированны, но откомментированны в некоторых местах плотно.

О всех найденных багах и идеях, как можно их пофиксить, писать сюда. Если найдёте баг при счёте, то напишите сюда выражение.

Жду отзывов, предложений и советов :) .

И инструкция по применению:

Клавиши:
0..9 - числовые значения
* - дробная точка
ЛСК - меню (фейк)
ПСК - BackSpace
# - клавиша для создания комбинаций
#+1 - (
#+2 - +
#+3 - )
#+4 - *
#+5 - смена знака
#+6 - /
#+7 - экспоненциальная запись числа
#+8 - -
#+9 - нет действий
#+* - удаление последнего элемента(числа или знака)
#+0 - очищение дисплея калькулятора
#+ПСК - отменить последнее действие
#+# - возврат без каких-либо действий

impersonalis 24.06.2011 11:08

Ответ: UniCalc. Универсальный калькулятор
 
Управление такое (не качал - сморел скриншоты) есть:
http://www.forum.boolean.name/showthread.php?t=5164

Ksanatos 24.06.2011 11:21

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

Reizel 24.06.2011 23:01

Ответ: UniCalc. Универсальный калькулятор
 
2 года на стд.операции ??? ну разве что числа любой длины...
хотя сам долго не допирал как подобное сделать)
сделай что нибудь в стиле подсчета производной (по одной и более переменным), и соответственно подсчет первообразной. Цены твоему калькулятору не будет))

Ksanatos 24.06.2011 23:08

Ответ: UniCalc. Универсальный калькулятор
 
ну в основном за эти два года я 10 раз востонавливал один и тот же код, и 4 раза менял всё кроме графики. И вся соль в том, что проектом занимаюсь от силы несколько часов в неделю ))). Ну не считаю последний день, когда на пороге релиза правил код 8 часов подряд, только на тестовые компиляции убил не менее 3 часов ))).
Насчет производной: примитивы врятли смогут это обеспечить...

Tadeus 24.06.2011 23:17

Ответ: UniCalc. Универсальный калькулятор
 
я джва года ждал эту программу!!

Ksanatos 25.06.2011 01:46

Ответ: UniCalc. Универсальный калькулятор
 
Tadeus
Если хочешь над кем-то по-издеваться, то купи себе плюшевого мишку, а людей оставь в покое.

Tadeus 25.06.2011 01:48

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

Сообщение от Ksanatos (Сообщение 193016)
Tadeus
Если хочешь над кем-то по-издеваться, то купи себе плюшевого мишку, а людей оставь в покое.

http://lurkmore.ru/%D0%9A%D0%BE%D1%8...B0%D0%BD%D1%8B милейший, прочтите

impersonalis 25.06.2011 18:42

Ответ: UniCalc. Универсальный калькулятор
 
Ksanatos прав: никто не скачал, все обсорали. Чел к вам с открытой душой - а вы =\

Ksanatos 26.06.2011 02:57

Ответ: UniCalc. Универсальный калькулятор
 
ВНИМАНИЕ!
В делении найдена ошибка! Буду исправлять.

Reizel 26.06.2011 11:17

Ответ: UniCalc. Универсальный калькулятор
 
Насчет производной:
Производная это просто. Если конечно ты не вычисляешь формулу прямо в строке какими нибудь циклами. Если ты делаешь так, то тут просто обходишь все ветки дерева и по стандартным правилам составляешь новое дерево(производной).
А вот первообразную кака находить я ХЗ, но думаю решение есть, напрягать мозги пока не хотел по этому поводу.
Удачи)

Ksanatos 26.06.2011 13:33

Ответ: UniCalc. Универсальный калькулятор
 
ну собственно я не видел ничего сложного в составлении производной из выражения с одной переменной, но я сам никогда не состовлял из нескольких, тока закончил 10 класс и вроде в программе Мордковича этого нет...
как расправлюсь с жуками, думаю смогу занятся внедрением переменных и нахождением производной.

Reizel 26.06.2011 15:38

Ответ: UniCalc. Универсальный калькулятор
 
Производной функции по какой либо переменной (допустим, х) считается производная этой функции, в которой все переменные, отличные от Х считаются постоянными. Т.е
z=x*10y
dZ/dX(пр-я по Х) = 10y*(x`) = 10y
dZ/dY = 10*x

Ksanatos 26.06.2011 15:50

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

Ksanatos 28.06.2011 00:03

Ответ: UniCalc. Универсальный калькулятор
 
UniCalc 0.2 alpha
Changes:
- Сделал разделение графики на разные разрешения экранов. В данный момент есть только 128x160, но скоро подкорректирую для 240x320. Мультискрина не будет.
- Исправил баг с экспонентой и дробной точкой. Теперь нельзя перенасытить число ими ))).
- При нажатии на # внизу появляется панелька, как и должа.
- Ускорен ввод.
- Деление работает почти всегда, кроме случаев с периудом.

Уже поправил код под экраны 240х320, осталось иконки новые сделать, завтра днём возможно будет готово.

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 приводит числа к нужному формату, потом проводит нужную операцию.

Reizel 03.07.2011 11:47

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

struct TTree;
struct TTree
{
//float value;
char * value// - твоя строка с числом.
char class_;//Класс узла
char subclass_; //Расширение
TNode * sub[2]; //Ветви
};

PS дереву пофиг какую структуру в себе хранить в качестве значения (числового), поэтому вместо float value можно юзать char * value - та же строка с числом. В обходе дерева попросту придется использовать не стандартные операции + - * /, а те, которые придумал ты сам для своих чисел.

Ksanatos 03.07.2011 12:59

Ответ: UniCalc. Универсальный калькулятор
 
Павел
И как это портировать на j2me?

Reizel 03.07.2011 18:25

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

Ksanatos 03.07.2011 20:47

Ответ: UniCalc. Универсальный калькулятор
 
http://download.oracle.com/javame/co...139/index.html
это всё, что можно выжать из последней конфигурации CLDC 1.1. Ничего отдалённо похожего на деревья я не вижу, а ты?

Reizel 03.07.2011 22:04

Ответ: UniCalc. Универсальный калькулятор
 
Class TPoint
{
public int class_;
public int subclass_;
public char * value;
public TTree * sub[2];
};

Неужели так нельзя на j2me?

Ksanatos 03.07.2011 23:54

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

JACUK 04.07.2011 02:53

Ответ: UniCalc. Универсальный калькулятор
 
Поищи примеры деревьев на паскале, может поможет!


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

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