可变长度算术计算器没有使用字符串?

时间:2014-02-20 16:42:19

标签: c calculator

我正在尝试创建一个计算器来解决不同长度的算术表达式(例如2 + 3/4或7 * 8/2 + 12-14),我想知道是否有可能这样做而没有使用字符串。

我找到了无数的教程,解释了如何制作一个只有两个数字和一个算子的简单计算器,我还发现了使用sscanf和字符串来获取输入的例子。

但是,我的问题是:有没有办法(甚至可能)在不使用字符串的情况下获得可变长度输入?

起初我以为我可以简单地添加更多说明符:

int num1 , num2, num3;
char op1, op2;

printf("Please enter your equation to evaluate: ");
scanf("%d%c%d%c%d", &num1, &op1, &num2, &op2, &num3);

但显然,这对于长度超过3个数字或少于3个数字的等式不起作用。 我也在考虑使用某种递归函数,但如果我需要预先考虑整个方程式,我不知道如何做到这一点?

2 个答案:

答案 0 :(得分:0)

如果您打算从用户输入或命令行参数中读取ASCII,那么在字符串世界中你就是不可避免的。你可以做的是尽早将它们转换成别的东西。

您可以完全放弃ASCII并定义二进制文件格式。

例如,您可能会说每对两个字节都是一个标记。第一个字节是元素类型(有符号整数,无符号整数,浮点数,运算符),第二个字节是值。

伪代码:

while(!done) {
  int type = read(f);
  int value = read(f);
  switch(type) {
      case TYPE_INTEGER:
          push_to_stack(value);
          break;
      case TYPE_FLOAT:
          push_to_stack_as_float(value);
          break;
      case TYPE_OPERATOR:
          execute_operator(value);
          break;
  }
}

相当为什么你会强迫自己沿着这条路走下去,我不知道。您可能会发现自己想编写一个程序将ASCII输入转换为二进制文件格式;哪个会使用字符串。那你为什么一开始就逃避弦乐?

答案 1 :(得分:0)

你可以创建一个struct列表,每个struct都必须包含一个值或一个子列表,一个operator(char?)和一个对下一个(和之前)char的引用。

然后您只需向用户询问一个数字(或“(”/“)”)和一个操作符号。每个数字+运算符都是列表中的新元素,每个(是一个子列表,每个)都是返回上级列表(你甚至可以不创建一个子列表,但是在运行中详细说明并返回结果,如递归函数)

还可以详细说明结构和代码以支持多个参数。