2012-12-13 56 views
-2

当用户想要输入时,有什么方法可以从用户和用户选择中的任何算术运算符中输入数字。我基本上试图制作一种计算器,用户首先输入数字,最后输入运算符以便适用。但是没有任何修复限制,用户将首先输入多少个数字。它的用户希望。我的程序本身应该猜测它是一个字符输入还是一个整数输入。可能吗 ??存储整数和算术运算符的数据类型?

+0

'用户首先会输入数字和去年的运营商适用于它 - 所以...你想处理后缀表达式? – Mike

+1

你如何设想将操作符与数字相关联?对于输入“1 2 3 + - ”,这是否意味着(1 + 2) - 3或1 +(2-3)? – unwind

回答

1

这只是一个简单的算术类型编程问题的概述。

将输入作为字符并存储在char数组缓冲区中。 然后使用strtol可以将其转换为long int

For more about strtol()

另外采取运营商作为一个字符阵列,其中每个字符索引处将代表操作者。

应用switch - case并基于这些情况(这将是运营商+,-等)执行您的操作。

另一种方法是infix arithmetic notations转换为postfix notations,并使用stacks为,简单地解决。在这种情况下,将不与运算符优先级问题,因为您已经应用了逻辑存储运营商在堆栈,只是弹出一个由一个和执行操作。

+0

感谢队友你解决了我的问题。感谢Omkant。 –

0

一个整数应该以0〜9或减号开始。

运算符应该是一个字符减号或0〜9个字符以外的字符。

以字符串形式获取输入,判断它是运算符还是整数,然后使用atoi将字符串转换为整数。

如果你有能力写一个计算器,那对你来说应该是简单的任务。

0

我的建议是建立一个OPP(对象优先解析器)来操作用户输入的字符串。 将输入作为字符串时,用户有权与算术运算符一起输入整个algebric方程,因为它们仅被视为字符。然后你可以把它转换成一个char数组,对它执行OPP操作。 http://code.google.com/p/expressionparser/

或者你可以做的是一个循序渐进的像数步输入,然后然后操作员号码:)

0

你真的不列出许多细节还是你要如何处理任何的例子,所以我无法给你更好的建议。既然你不知道的输入(数字/字符)的顺序,或量它的最好把它作为一个字符串:

char *expression_buf = NULL; 
scanf("%m[^\n]", expression_buf); // grab any number of characters/digits with spaces 
//do some postfix stuff 
free(expression_buf); 

然后你就可以弄清楚什么是数字的,什么是不:

#include <ctype.h> 
isdigit(expression_buf[index]) 

这几乎是所有你需要的工具。然后弹出数字/运算符并按顺序应用它们。将它们放在堆叠上将有助于您按照正确的顺序将它们弹出。

1

让我们假设用户只能进入follwing操作格式之一:

x + y 
x * y 
x - y 
x/y 

这里后,你如何能做到这一点:

#include<stdio.h> 
#include<stdlib.h> 

int main() { 
    int x, y; 
    char op; 

    printf ("Enter your Expression The Format should be One of the following:\nx + y\nx - y\nx * y\nx/y\n"); 
    if (scanf("%d %c %d",&x,&op,&y)<3) { 
     printf("Wrong Expression\n"); 
     return 0; 
    } 
    switch (op) { 
     case '+': 
      printf("%d + %d = %d\n",x,y,x+y); 
      break; 
     case '-': 
      printf("%d - %d = %d\n",x,y,x-y); 
      break; 
     case '*': 
      printf("%d * %d = %d\n",x,y,x*y); 
      break; 
     case '/': 
      printf("%d/%d = %d\n",x,y,x/y); 
      break; 
     default: 
      printf("Invalid operator %c\n",op); 
    } 
    return 0; 
}