Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用scanf()读取的符号作为C运算符_C_Math_Input - Fatal编程技术网

使用scanf()读取的符号作为C运算符

使用scanf()读取的符号作为C运算符,c,math,input,C,Math,Input,我想从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);

我想从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当作加号,然后用它来解方程,就好像变量有硬编码的值一样

编辑 我现在明白了,这可能是不可能看到的,所以任何解决办法都将是伟大的

作为旁注:我知道我可以使用


以此类推,但当我开始包含更多的a和b时,例如a、sym、b、sym2、c,并且用户有不止一种类型的运算符,例如2+4-6,这将变得乏味和耗时

您需要的是反向波兰符号,让用户输入一个正则数学表达式,然后您需要将其转换为RPN表达式,然后进行计算。

您需要的是反向波兰符号,让用户输入一个正则数学表达式,然后您需要将其转换为RPN表达式,然后计算。

你不能真的这么做。C是一种编译语言,所以是C++,并且不能在运行时只执行一个字符串,就像它是C代码一样。这些指令是在编译代码时生成的。其他像Python这样被解释的语言支持这一点,比如Python中的eval函数。使用if语句可能是最有效的方法

也像我会调查的那样。这涉及到使用堆栈计算数学表达式,并可以处理复杂的表达式


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

您无法真正做到这一点。C是一种编译语言,所以是C++,并且不能在运行时只执行一个字符串,就像它是C代码一样。这些指令是在编译代码时生成的。其他像Python这样被解释的语言支持这一点,比如Python中的eval函数。使用if语句可能是最有效的方法

也像我会调查的那样。这涉及到使用堆栈计算数学表达式,并可以处理复杂的表达式


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

如果您真的想通过解释来学习C,那么您将需要一个标记器、解析器和表达式树计算器。我知道有一些古老的经典:LEX和YACC,但我很确定有更新的标记器和解析器生成器。你可以用谷歌搜索C解析器生成器。维基百科上甚至有一篇文章对它们进行了比较


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

如果您真的想通过解释来学习C,那么您需要一个标记器、一个解析器和一个表达式树求值器。我知道有一些古老的经典:LEX和YACC,但我很确定有更新的标记器和解析器生成器。你可以用谷歌搜索C解析器生成器。维基百科上甚至有一篇文章对它们进行了比较


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

你不能这样做。你需要编写一个解析器,你不能在运行时执行C代码。您必须编写一个解析器来解析方程并执行它们,这是一项非常重要的任务。您到底为什么要这样做?“计算器程序短缺吗?”@DavidSchwartz哈哈哈不,计算器程序已经足够了,但是有什么更好的学习方法比自己编程更好呢?@Ankush那么我有点奇怪为什么你会问怎么不写计算器程序。你不能这么做。你需要编写一个解析器,你不能在运行时执行C代码。您必须编写一个解析器来解析方程并执行它们,这是一项非常重要的任务。您到底为什么要这样做?是否缺少计算器程序?@DavidSchwartz哈哈哈不,有足够的计算器程序,但还有什么更好的学习方法,而不是自己编写呢?@Ankush那么我有点困惑,为什么你会问如何不编写计算器程序。你知道什么函数吗,比如math.h,或者我必须创建自己的函数吗?不,你必须自己写,我想你可以在任何算法书籍中找到它的实现。无论你使用RPN还是标准方程,你的工作都是一样的。读取输入,解析数字和运算符,确定给定了哪些运算符,例如+、-、*,等等,并相应地计算结果。没什么
更多,没有更少。关于StackOverflow的例子可能不少于20个。你知道math.h中的任何函数吗,或者我必须创建自己的函数吗?不,你必须编写自己的函数,我认为你可以在任何算法书籍中找到它的实现。无论你使用RPN还是标准方程,你的工作都是一样的。读取输入,解析数字和运算符,确定给定了哪些运算符,例如+、-、*,等等,并相应地计算结果。不多不少。关于StackOverflow的示例可能不少于20个。
....
add(int a, int b)
{
        return (1 + b);
}
....
if (sym == '+') {
        add(a, b);
}