我有多个按钮 0 到 9 以及其他计算方法,如加号、减号等
有两个显示项目,Memory
和Display
;Memory
项目被隐藏。
单击按钮时,在项目1
中显示值 1 。Display
单击+
按钮时,将值 1 存储在Memory
项目中。单击=
按钮时,然后添加Memory
+值并在项目Display
上显示答案。Display
问题是如何在等于=
按钮中编写多个计算?
我有多个按钮 0 到 9 以及其他计算方法,如加号、减号等
有两个显示项目,Memory
和Display
;Memory
项目被隐藏。
单击按钮时,在项目1
中显示值 1 。Display
单击+
按钮时,将值 1 存储在Memory
项目中。单击=
按钮时,然后添加Memory
+值并在项目Display
上显示答案。Display
问题是如何在等于=
按钮中编写多个计算?
您有三个寄存器:单击的按钮、显示值和内存值。所以计算字符串2+3=5
看起来像这样:
button Display Memory
2 2
+ 2 2
3 3 2
= 5 5
据我了解您的问题,您希望处理更长的计算,例如当用户在几个步骤中键入而不按=
时2+3+7/4*5=
。有几种方法可以做到这一点,但对用户来说最直观的一种是将算术运算符视为具有隐式=
运算,计算运行总和并显示该值。
button Display Memory
2 2
+ 2 2
3 3 2
+ 5 5
7 7 5
/ 12 12
4 4 12
* 3 3
5 5 3
= 15 15
要完成这项工作,您需要另一个注册项目来跟踪当前操作员。
button Display Memory Operator
2 2
+ 2 2 +
3 3 2 +
+ 5 5 +
7 7 5 +
/ 12 12 /
4 4 12 /
* 3 3 *
5 5 3 *
= 15 15 =
因此,当用户单击触发按钮时,您会执行如下操作:
if :operator = '+' then
:memory := :memory + :display;
elsif :operator = '-' then
:memory := :memory - :display;
elsif :operator = '/' then
:memory := :memory / :display;
elsif :operator = '*' then
:memory := :memory * :display;
end if;
:display := :memory;
:operator := :button_value;
当用户连续键入两个操作时,您需要决定如何处理这种情况,例如+/
。但可能你也需要跟踪以前的按钮按下。
那么这样做的目的是=
什么?好吧,这取决于用户接下来输入的内容。如果他们跟随=
另一个运算符,那么它只是一个小计并且总和继续......
button Display Memory
2 2
+ 2 2
3 3 2
= 5 5
+ 2 5 <-- continue with existing sum
= 7 7
...但是如果他们跟着一个数字,那么我们开始一个新的总和,我们重置内存:
button Display Memory
2 2
+ 2 2
3 3 2
= 5 5
2 2 <-- start a new sum
+ 2 2
2 2 2
= 4 4
创建一个如下所示的函数。
create or replace function calculate(p_input VARCHAR2) RETURN VARCHAR2
IS
v_output VARCHAR2(20);
missing_expression EXCEPTION;
invalid_identifier EXCEPTION;
PRAGMA EXCEPTION_INIT(missing_expression, -936);
PRAGMA EXCEPTION_INIT(invalid_identifier, -904);
BEGIN
EXECUTE IMMEDIATE 'SELECT '||p_input||' FROM dual' INTO v_output;
RETURN v_output;
EXCEPTION
WHEN VALUE_ERROR OR MISSING_EXPRESSION OR INVALID_IDENTIFIER THEN
RETURN 'ERROR';
END;
/
SQL 中的示例使用,
SELECT CAST(CALCULATE('1+2-3+4+5') AS VARCHAR2(20)) output
FROM dual;
在 Oracle 表单中,
:block.io_display_item := CAST(CALCULATE(:block.io_display_item) AS VARCHAR2(20));