简易计算器设计中的一个数据结构问题——Ada应用实例之二
一网友用C写了一个简易计算器程序(原帖地址),但他发现“低位数的表达式能计算正确,高位数就出错了。”
经检查,发现两个问题。一是计算结果赋给一个类型为char的变量。二是读入的数字字符串的数值转换成数值后,在以后的处理过程中对其进行加‘0’或减‘0’的操作。
第一个问题导致“高位数”计算出错,这是因为char的取值范围是-128..127,如果计算结果超出此范围,则被转换为错误结果。第二个问题虽然不影响计算,但实际是无意义和不安全的。除了0..9的数值之外,一个数值加‘0’后不能转换为数字字符串,反之亦然。
如果用Ada编程,很容易发现第一个问题。编译器将报告赋值语句两边的类型不匹配。
该程序用一个栈来存放操作符和操作数。操作符的类型char。可能该网友的原意是使操作数与操作符的类型一致,所以进行加‘0’或减‘0’的操作。
如果用Ada编程,可以用带判别式的记录来解决此问题。相关类型定义如下:
type token_type is (operator, operand); --定义枚举类型
type item_type (token : token_type) is --定义栈元素的记录类型
record
case token is
when operator =>
operator_val : character;
when operand =>
operand_val : integer;
end case;
end record;
type item_type_ptr is access all item_type; --定义栈元素的指针类型
stack : array (1..100) of item_type_ptr; --栈是栈元素的指针数组
以下语句把操作符和操作数加到stack中:
stack(1) := new item_type(operator);
stack(1).operator_val := '+';
stack(2) := new item_type(operand);
stack(2).operand_val := 1;