【问题标题】:Using symbols read by scanf() as C operators使用 scanf() 读取的符号作为 C 运算符
【发布时间】:2015-11-22 02:15:49
【问题描述】:

我想从scanf() 中读取一个符号,然后让 C 使用它。我当前的(相关)代码如下:

float a;     /* First Number */
char  sym;   /* Symbol (i.e. +, -, /, *) */
float b;     /* Second number.... */

puts("Please type your equation");
printf("$: ");

scanf("%f %c %f", &a, &sym, &b);

因此,如果用户要键入(在$: 提示符处)5 + 10,那么程序应该继续评估5 + 10,但我知道我不能指望 C 这样做(不是没有先发挥一些魔法:) 因为 '+' 只是一个 ANSI 字符代码,所以我要问的是:

我如何让 C 将变量 sym 当作我们(作为人)认为的变量(加号 +),然后用它来求解方程,就好像变量很难-编码值?

编辑 我现在明白这可能是不可能的(参见SLakscomment),所以任何解决方法都会很棒!

顺便说一句:我知道我可以使用

....
add(int a, int b)
{
        return (1 + b);
}
....
if (sym == '+') {
        add(a, b);
}

等等,但是当我开始包含更多内容时,只包含 ab(例如 asymbsym2c)并且用户拥有不止一种类型的运算符(例如2 + 4 - 6),这变得乏味且耗时。

【问题讨论】:

  • 你不能那样做。你需要写一个解析器。
  • 您不能在运行时执行 C 代码。您必须编写一个解析器来解析方程并执行它们,这是一项不平凡的任务。
  • 你为什么要这样做?是否缺少计算器程序?
  • @DavidSchwartz 哈哈哈不,有足够的计算器程序,但是有什么比自己编程更好的学习方式?
  • @Ankush 那我有点疑惑你为什么会问怎么写计算器程序。

标签: c math input


【解决方案1】:

你真的不能那样做。 C 是一种编译语言(C++ 也是),您不能像在运行时执行 C 代码一样执行字符串。这些指令是在编译代码时生成的。其他解释的语言(如 Python)支持此功能(如 Python 中的 eval 函数)。使用 if 语句可能是最有效的方法。

也喜欢Jiang Jie said 我会研究reverse polish notation。这涉及使用堆栈来评估数学表达式并可以处理复杂的表达式。

您可能还需要考虑将中缀表达式(例如1 + 2)转换为后缀表达式(1 2 +)。

【讨论】:

    【解决方案2】:

    如果你真的想通过解释来学习 C,那么你需要一个分词器、一个解析器和一个表达式树评估器。我知道有旧的经典:LEX 和 YACC,但我很确定有更新的标记器和解析器生成器。您可以搜索“C 解析器生成器”。甚至有一篇 Wikipedia 文章比较了它们。

    但我会说,编写 C 解释器并不是学习 C 的最佳方式。强烈建议学习编写更简单的程序。我建议找一个教程网站或买一本书。两者都有很多。

    【讨论】:

      【解决方案3】:

      你需要的是Reverse Polish Notation,让用户输入一个正则数学表达式,然后你需要把它转换成RPN表达式,然后计算。

      【讨论】:

      • 你知道任何函数吗,比如math.h,还是我必须自己创建?
      • 不,你必须自己写,我想你可以在任何算法书籍中找到它的实现。
      • 无论您使用 RPN 还是 标准方程,您的工作都是一样的。读取输入,解析数字和运算符,确定给出了哪些运算符(例如+-* 等),并相应地计算结果。不多也不少。 StackOverflow 上的示例可能不少于 20 个。
      猜你喜欢
      • 2012-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-17
      • 2013-07-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多