2014-02-20 100 views
0

我试图创建一个解算不同长度(例如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号工作更长的时间。 我也在考虑使用某种递归函数,但我不确定如果我需要事先询问整个等式,我该怎么做?

+0

您可以尝试使用自己的解析器并使用http://en.wikipedia.org/wiki/Reverse_Polish_notation – Alexis

+0

一次只能读取一个字符。 – jxh

+0

但是,如果不使用字符串,那么可以将每个标记存储为'char',但是,您需要一个下降解析器。最好将表达式转换为抛光表示法,然后使用堆栈结构构建表达式树。 – nullpotent

回答

0

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

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

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

伪代码:

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输入转换成你的二进制文件格式;这将使用字符串。那么为什么你首先逃避了弦乐?

0

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

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

结构和代码可以详细阐述以支持多个参数。