【问题标题】:Variable length arithmetic calculator WITHOUT using strings?不使用字符串的可变长度算术计算器?
【发布时间】:2014-02-20 16:42:18
【问题描述】:

我正在尝试创建一个计算器来解决不同长度的算术表达式(例如 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 个数字的方程式。 我也在考虑使用某种递归函数,但我不确定如果我需要预先询问整个方程,我会怎么做?

【问题讨论】:

  • 你可以尝试自己做解析器并使用en.wikipedia.org/wiki/Reverse_Polish_notation
  • 一次读取一个字符。
  • 当然,不使用字符串,您可以将每个标记存储为char,但是 - 您需要一个下降解析器。最好将表达式转换为波兰符号,然后构建具有堆栈结构的表达式树。
  • 有没有什么方法可以不使用编译器来编译程序?
  • 如前所述,您需要将输入字符串(方程)解析成某种形式,例如RPN。具体说明方程遵循什么样的规则:简单的从左到右或代数(在加减之前乘除)。是否允许使用括号? + - * / 以外的其他运算符?如果您的操作数只是数字,您可能可以在很大程度上动态评估它们(尽管使用代数(基于堆栈)表示法,并非所有都可以立即评估)。最后,不要吝啬错误检测、报告甚至修复——还有更多错误的输入方式!

标签: c calculator


【解决方案1】:

如果您打算从用户输入或命令行参数中读取 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 输入转换为二进制文件格式;这将使用字符串。那你当初为什么要逃避弦乐呢?

【讨论】:

    【解决方案2】:

    您可以创建一个结构列表,每个结构都必须包含一个值或一个子列表、一个运算符(字符?)和对下一个(和或之前)字符的引用。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-15
      • 1970-01-01
      • 2019-03-11
      • 2013-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多