Калькулятор с полем истории операций

Post Reply
Frez
Posts: 23
Joined: Fri Apr 03, 2015 4:49 am
My devices: iPad mini

Калькулятор с полем истории операций

Post by Frez » Wed Apr 15, 2015 5:36 am

Постарался учесть всевозможную защиту от дурака. Тестировал на iPad mini, хотелось бы услышать отзыв о работе приложения на устройстве с ретиной, не съезжает ли шаблон.
Также есть вопрос к автору среды: почему SB все числа, начиная от семизначных, выводит в формате 9.9999E+06? Это как-то можно изменить?



GRAPHICS
NOTES INSTRUMENTS DEFAULT

r=1 ! g=0.7 ! b=0.2
GRAPHICS CLEAR r,g,b
SET BUTTONS CUSTOM
DRAW FONT SIZE 100
DRAW FONT NAME "AmericanTypewriter"
SET ORIENTATION LANDSCAPE
SET BUTTONS FONT SIZE 60
f$="#"

DATA CHR$(215),"C",CHR$(8592),7,8,9,CHR$(247),"M","MC",4,5,6,"-","%",CHR$(8730),1,2,3,"+","=","+/-",0,"."

DIM but$(23)
FOR i=0 TO 22
READ but$(i)
NEXT i

h=SCREEN_HEIGHT() ! w=SCREEN_WIDTH()
i=-1

SPRITE "memo" BEGIN w/3*2,h/9*2/3
GRAPHICS CLEAR r,g,b
SPRITE END
SPRITE "memo" AT w/3,h/9
SPRITE "memo" SHOW

FOR ryad=0 TO 3
FOR strok=0 TO 5

IF ryad=3 AND strok=2 THEN CONTINUE strok
i+=1
'раскраска
FILL COLOR 0.3,0.6,0.8
IF strok=0 OR (ryad=3 AND strok=1) THEN FILL COLOR 0,0,0.2
IF strok>2 AND i<>20 AND i<>22 THEN FILL COLOR 0,0.6,0.6
IF i=1 OR i=2 THEN FILL COLOR 1,0.2,0.2

IF i=23 THEN BREAK
IF i=19 THEN
BUTTON but$(i) title but$(i) AT 5+strok*w/6, h/3+ryad*h/6 SIZE w/3-10, h/6-10
ELSE
BUTTON but$(i) title but$(i) AT 5+strok*w/6, h/3+ryad*h/6 SIZE w/6-10,h/6-10
ENDIF
NEXT strok
NEXT ryad


SPRITE "stroka" BEGIN w, h/9*2/3*2-10
GRAPHICS CLEAR r,g,b
DRAW COLOR 0,0,0
DRAW TEXT "0" AT 0,0
SPRITE END
SPRITE "stroka" AT w-64, h/9+h/9*1/2
SPRITE "stroka" SHOW
GET SPRITE "stroka" POS sw,sh

FIELD "history" TEXT "0" AT 0,0 SIZE w,h/12
FIELD "history" BACK ALPHA 0.5
FIELD "history" FONT SIZE 25

SORT but$

'r'

DEF zapis()
SPRITE "stroka" BEGIN
.txt_wid=TEXT_WIDTH(.s$)
IF .txt_wid<=.w THEN
GRAPHICS CLEAR .r,.g,.b
SPRITE "stroka" AT .sw-.txt_wid+64, .sh
DRAW TEXT .s$ AT 0,0
ENDIF
SPRITE END
ENDDEF

DEF stroka()
.h$=.s$
IF .d=0 AND .i<>2 THEN .h1$="" 'если первое число не введено
IF .i=2 AND VAL(.s$)<0 THEN .h$="("&.h$&")"
FIELD "history" SET TEXT .h1$&.h$ 'h1 - строка всего выражения, h - строка числа
.rez=0 'отмечает, что последней нажата цифра
END DEF

DEF math()
.val2=.s$
IF .znak=19 THEN .s$=LTRIM$(STR$(.val1*.val2,.f$))
IF .znak=20 THEN delenie()
IF .znak=1 THEN .s$=LTRIM$(STR$(.val1+.val2,.f$))
IF .znak=3 THEN .s$=LTRIM$(STR$(.val1-.val2,.f$))
IF .znak=22 THEN!IF VAL(.s$)>=0 THEN ! .s$=SQR(VAL(.s$)) ! ELSE ! .s$="ОШИБКА" ! ENDIF ! ENDIF
.val1=.s$ 'сохраняем результат
.val2=0
IF .i=22 AND .znak<>22 THEN RETURN
FIELD "history" SET TEXT .h1$&.h$&"="&.s$ ! .h1$=FIELD_TEXT$("history") ! .h$=""
.rez=1 'чтобы число сбросилось при наборе следующего
.d=0 'первое число еще не введено
.k=0
END DEF

DEF delenie()
IF .val2<>0 THEN
.s$=.val1/.val2
ELSE
.s$="ОШИБКА"
ENDIF
END DEF

DEF story()
.k=0
.d=1 'отмечает что первое число уже введено
.h1$=FIELD_TEXT$("history")
ls$=RIGHT$(.h1$,1)
IF ls$=.but$(1) OR ls$=.but$(3) OR ls$=.but$(19) OR ls$=.but$(20) THEN .h1$=LEFT$(.h1$,LEN(.h1$)-1)
IF .but$(.i)<>CHR$(8730) THEN .h1$&=.but$(.i)
FIELD ("history") SET TEXT .h1$
.h1$=FIELD_TEXT$("history") ! .h$=""
END DEF

DEF sbros
IF .rez=1 OR .s$="0" THEN
.s$="" ! .h$="" ! GRAPHICS CLEAR .r,.g,.b
ENDIF
ENDDEF

DEF koren
kor$=""
ravno=INSTR(REVERSE$(.h1$),"=")

IF ravno=-1 THEN ravno=LEN(.h1$)
IF .i=22 THEN kor$=CHR$(8730)&"("&RIGHT$(.h1$,ravno)&")"
.h1$=LEFT$(.h1$,LEN(.h1$)-ravno)
.h1$&=kor$
ENDDEF

DEF memo(m)
SPRITE "memo" BEGIN
GRAPHICS CLEAR .r,.g,.b
DRAW FONT SIZE 20
DRAW TEXT "M="&m AT .w/20,h/9*2/3
SPRITE END
ENDDEF

rez=1

'g'
LOOP:
SLOWDOWN

DRAW FONT SIZE 100

FOR i=0 TO 22
IF BUTTON_PRESSED(but$(i)) THEN
NOTES SET "115: c#"
NOTES PLAY

'Обработка CE
IF i=16 THEN
s$="0" ! h$="0" ! h1$="" ! rez=1 ! k=0 ! znak=0 ! val1=0 ! d=0 ! GRAPHICS CLEAR r,g,b
stroka() ! zapis
ENDIF

IF s$="ОШИБКА" THEN GOTO LOOP

'Обрабатываем нажатие на цифры
IF i>5 AND i<15 THEN
sbros()
s$&=but$(i)
stroka()
zapis
ENDIF

'Операторы вычислений
IF i=1 OR i=3 OR i=19 OR i=20 THEN
IF rez=0 THEN
IF d=1 THEN ! math() ! zapis ! ENDIF
val1=s$
rez=1
END IF
znak=i
story()
ENDIF

'Обработка =
IF i=15 THEN
IF rez=0 AND d=1 THEN
math() ! zapis
END IF
ENDIF

'Обработка Корня
IF i=22 THEN
IF rez=0 AND d=1 THEN math
story
koren
znak=i
math
zapis
ENDIF

'Обработка +/-
IF i=2 THEN
s$-=2*s$
IF rez=0 THEN ! stroka ! zapis ! ENDIF
IF rez=1 AND d=0 THEN ! koren ! stroka ! zapis ! ENDIF 'если получен результат предыдущих вычислений
ENDIF

'Обработка %
IF i=0 THEN
IF rez=0 AND d=1 THEN
IF znak<4 THEN ! s$=val1*(s$/100) ! ELSE ! s$=s$/100 ! ENDIF
h$&="%"
math ! zapis
ENDIF
ENDIF

'Обработка нуля
IF i=5 THEN
sbros()
IF s$<>"0" AND s$<>"" THEN
s$&="0"
stroka() ! zapis
ELSE
s$="0" ! h$="0"! stroka() ! zapis
END IF
ENDIF

'Обработка точки
IF i=4 THEN
IF k=0 THEN 'если еще не вводили точку
IF rez=1 THEN
s$="0."
ELSE
s$&="."
ENDIF
stroka() ! zapis
k=1 'одну точку уже ввели
END IF
ENDIF

'Обработка DEL
IF i=21 THEN
IF LEN(s$)>0 AND LEN(h$)>0 THEN
s$=LEFT$(s$, LEN(s$)-1)
h$=LEFT$(h$, LEN(h$)-1)
stroka ! zapis
ENDIF
IF LEN(s$)=0 THEN
s$="0" ! h$="0"
stroka ! zapis
ENDIF
ENDIF

'Обработка М
IF i=17 THEN
IF m=0 THEN ! m=s$ ! ELSE ! s$=m ! stroka ! zapis ! ENDIF
memo(m)
ENDIF

'Обработка MC
IF i=18 THEN ! m=0 ! memo(m) ! ENDIF

ENDIF
NEXT i

GOTO LOOP
Last edited by Frez on Wed Apr 15, 2015 7:01 am, edited 1 time in total.

User avatar
Mr. Kibernetik
Site Admin
Posts: 4605
Joined: Mon Nov 19, 2012 10:16 pm
My devices: iPad, iPhone, MacBook
Location: Russia
Flag: Russia

Re: Калькулятор с полем истории операций

Post by Mr. Kibernetik » Wed Apr 15, 2015 5:40 am

Frez wrote:Также есть вопрос к автору среды: почему SB все числа, начиная от семизначных, выводит в формате 9.9999E+06? Это как-то можно изменить?
Посмотрите документацию к команде PRINT, форматный вывод числа. А также к функции STR$().

Frez
Posts: 23
Joined: Fri Apr 03, 2015 4:49 am
My devices: iPad mini

Re: Калькулятор с полем истории операций

Post by Frez » Wed Apr 15, 2015 6:41 am

Mr. Kibernetik wrote:
Frez wrote:Также есть вопрос к автору среды: почему SB все числа, начиная от семизначных, выводит в формате 9.9999E+06? Это как-то можно изменить?
Посмотрите документацию к команде PRINT, форматный вывод числа. А также к функции STR$().
Спасибо, разобрался :) Думал, это как-то на типе переменных завязано. А какой формат вывода стоит по умолчанию?

User avatar
Mr. Kibernetik
Site Admin
Posts: 4605
Joined: Mon Nov 19, 2012 10:16 pm
My devices: iPad, iPhone, MacBook
Location: Russia
Flag: Russia

Re: Калькулятор с полем истории операций

Post by Mr. Kibernetik » Wed Apr 15, 2015 6:51 am

Frez wrote:А какой формат вывода стоит по умолчанию?
Если точность не указана, то выводится 6 знаков.

User avatar
Mr. Kibernetik
Site Admin
Posts: 4605
Joined: Mon Nov 19, 2012 10:16 pm
My devices: iPad, iPhone, MacBook
Location: Russia
Flag: Russia

Re: Калькулятор с полем истории операций

Post by Mr. Kibernetik » Wed Apr 15, 2015 7:01 am

Если более точно, то по умолчанию используется стандартное форматирование вещественных чисел по спецификации IEEE printf: http://pubs.opengroup.org/onlinepubs/00 ... rintf.html
в формате %G

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

Frez
Posts: 23
Joined: Fri Apr 03, 2015 4:49 am
My devices: iPad mini

Re: Калькулятор с полем истории операций

Post by Frez » Wed Apr 15, 2015 7:03 am

Mr. Kibernetik wrote:Если более точно, то по умолчанию используется стандартное форматирование вещественных чисел по спецификации IEEE printf: http://pubs.opengroup.org/onlinepubs/00 ... rintf.html
в формате %G

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

User avatar
Фант
Posts: 1358
Joined: Sat Nov 30, 2013 10:01 am
My devices: iPad 4 (iOS 9.3), iMac (MAC OS 11.03)
Location: Россия,Санкт-Петербург
Flag: Russia
Contact:

Re: Калькулятор с полем истории операций

Post by Фант » Wed Apr 15, 2015 8:16 am

На экране ретина вроде все отображается правильно!

Frez
Posts: 23
Joined: Fri Apr 03, 2015 4:49 am
My devices: iPad mini

Re: Калькулятор с полем истории операций

Post by Frez » Wed Apr 15, 2015 8:35 am

Фант wrote:На экране ретина вроде все отображается правильно!
Спасибо за тест! Косяков в работе не заметили?

User avatar
Фант
Posts: 1358
Joined: Sat Nov 30, 2013 10:01 am
My devices: iPad 4 (iOS 9.3), iMac (MAC OS 11.03)
Location: Россия,Санкт-Петербург
Flag: Russia
Contact:

Re: Калькулятор с полем истории операций

Post by Фант » Wed Apr 15, 2015 9:00 am

Сильно не тестил.

Post Reply