哪位帮忙用C语言设计一个多功能计算器

用C语言设计一个多功能计算器实现功能:1)具备整型数据、浮点型数据的算术(加、减、乘、除)运算功能。依次输入第一个运算数、运算符(+,-,*,/),第二个运算数,然后输出... 用C语言设计一个多功能计算器
实现功能:
1)具备整型数据、浮点型数据的算术(加、减、乘、除)运算功能。
依次输入第一个运算数、运算符(+,-,*,/),第二个运算数,然后输出结果。
结果可以作为下一个运算的第一运算数。按‘C’清屏,按‘X’退出。
例如:输入:2
+
5
输出:7
2)实现单运算符表达式计算的功能。
输入的操作数可以包含整数或浮点数。如果遇到错误的表达式,应输出错误提示信息。
输入表达式如下:
例如:输入:2+5
输出:7
展开
 我来答
哈v呀
2007-03-13 · 超过19用户采纳过TA的回答
知道答主
回答量:75
采纳率:0%
帮助的人:59.1万
展开全部
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <ctype.h>
#include <string.h>

#define MAXOP 100
#define NUMBER '0'
#define MAXVAL 100
#define BUFSIZE 100
#define NAME 'n'

int getop(char s[]);
void push(double);
double pop(void);
int getch(void);
void ungetch(int c);
double atof(char s[]);
void mathfnc(char s[]);
void clear(void);

int sp = 0; double val[MAXVAL];
int bufp = 0; char buf[BUFSIZE];
int main(void)
{
int i, type, var = 0;
double op2, v;
char s[MAXOP];
double variable[26];

for(i = 0; i < 26; i++)
variable[i] = 0.0;

while ((type = getop(s)) != EOF) {
switch(type) {

case NUMBER :
push (atof(s));
break;

case NAME :
mathfnc(s);
break;

case '+' :
push (pop() + pop());
break;

case '*' :
push (pop() * pop());
break;

case '-' :
op2 = pop();
push (pop() - op2);
break;

case '/' :
op2 = pop();
if (op2 != 0.0)
push (pop() / op2);
else
printf ("error: zero divisor\n");
break;

case '%' :
op2 = pop();
if(op2 != 0.0)
push(fmod(pop(), op2));
else
printf("error : zero divisor\n");
break;

case 'c' :
clear();
break;

case '=' :
pop();
if(var >= 'A' && var <= 'Z')
variable[var - 'A'] = pop();
else
printf("error : no variable name\n");
break;

case '\n' :
v = pop();
printf("\t %.8g\n", v);
break;

default :
if(type >= 'A' && type <= 'Z')
push(variable[type - 'A']);
else if (type == 'v')
push(v);
else
printf("error : unknown command %s\n", s);
}
var = type;
}
return 0;
}

/*读入一个数*/
int getop(char s[])
{
int i, c;

while((s[0] = c = getch()) == ' ' || c == '\t') /*去除空格*/
;
s[1] = '\0';
i = 0;
if(c == '-')
if(isdigit(c = getch()) || c == '.')
s[++i] = c;
else {
if(c != EOF)
ungetch(c);
return '-';
}

if(islower(c)) {
while(islower(s[++i] = c = getch()))
;
s[i] = '\0';
if(c != EOF)
ungetch(c);
if(strlen(s) > 1)
return NAME;
else
return c;
}

if(!isdigit(c) && c != '.')/*如果不是数字就返回*/
return c;

if(isdigit(c)) /*读取整数部分*/
while(isdigit(s[++i] = c = getch()))
;

if(c == '.') /*读取小数部分*/
while(isdigit(s[++i] = c = getch()))
;

s[i] = '\0';

if(c != EOF)
ungetch(c); /*把多读入的一个字符返回到输入流*/
return NUMBER;
}

void clear(void)
{
sp = 0;
}

void mathfnc(char s[])
{
double op2;
if(strcmp(s, "sin") == 0)
push(sin(pop()));
else if(strcmp(s, "cos") == 0)
push(cos(pop()));
else if(strcmp(s, "exp") == 0)
push(exp(pop()));
else if(strcmp(s, "pow") == 0) {
op2 = pop();
push(pow(pop(), op2));
}else
printf("error : %s not supported\n", s);
}

void push(double f)
{
if(sp < MAXVAL)
val[sp++] = f;
else
printf("error : stack full, can't pust %g\n", f);
}

double pop(void)
{
if(sp > 0)
return val[--sp];
else {
printf("error: stack empty\n");
return 0.0;
}
}

int getch(void)
{
return ((bufp > 0) ? buf[--bufp] : getchar());
}

void ungetch(int c)
{
if(bufp >= BUFSIZE)
printf("ungetch : too many characters\n");
else
buf[bufp++] = c;
}

double atof(char s[])
{
double val,power;
int i, sign;

for(i = 0; isspace(s[i]); i++)
;

sign = (s[i] == '-') ? -1 : 1;
if(s[i] == '+' || s[i] == '-')
i++;
for(val =0.0; isdigit(s[i]); i++)
val = 10.0 * val + (s[i] - '0');
if(s[i] == '.')
i++;
for(power = 1.0; isdigit(s[i]); i++) {
val = 10.0 * val + (s[i] - '0');
power *= 10.0;
}
return sign * val / power;
}
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式