急求急急急急急求,急求用C语言编写一个计算器程序,代码量为三百行左右!!!!!在线等

 我来答
雏迷啊
2018-01-08 · 超过17用户采纳过TA的回答
知道答主
回答量:45
采纳率:66%
帮助的人:12.5万
展开全部
#include <stdlib.h>#include <stdio.h>#include <string.h>#define MAXOP 100#define NUMBER '0' //标识读入的是数字#define NAME 'n' //标识读入的是字符串(函数名或非法字符串)#define ALPHA 26 int getop(char []);
void push (double); //压栈double pop(void); //出栈void clear(void); //清空栈void mathfnc(char []); //执行相应的数学函数sin、cos、exp等int main(void)
{ int type; int i, var = 0; double op1, op2,v; char s[MAXOP]; double variable[ALPHA]; for (i = 0; i < ALPHA; 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 '?': //打印栈顶元素
op2 = pop(); printf ("\t%.8g\n", op2);
push (op2); break; case '=': //保存数值
pop(); if (var >= 'A' && var <= 'Z')
variable[var - 'A'] = pop(); else
printf ("error: no variable name\n"); break; case 'c':
clear(); break; case 'd': //复制栈顶元素
op2 = pop();
push(op2);
push(op2); break; case 's': //交换栈元素
op1 = pop();
op2 = pop();
push(op1);
push(op2); case '\n':
v = pop(); //v保存最后的一次结果
printf ("\t%.8g\n", v); break; default: if (type >= 'A' && type <= 'Z')
push(variable[type - 'A']); else if (type == '@') //输入的字符@表示最近一次结果值
push(v); else
printf ("error: unknown command %s\n", s); break;
}
var = type;
} return 0;
}/* ----------------------------------------------------------- */#define MAXVAL 100int sp = 0; //标识栈顶double val[MAXVAL];void push(double f)
{ if (sp < MAXVAL)
val[sp++] = f; else
printf ("error: stack full, can't push %g\n", f);
}double pop(void)
{ if (sp > 0) return val[--sp]; else
{ printf ("error: statck empty\n"); return 0.0;
}
}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);
}/* ----------------------------------------------------------- */#include <ctype.h>int getch(void);void ungetch(int);int getop(char s[])
{ int i, c; while ((s[0] = c = getch()) == ' ' || c == '\t') //过滤开头的空白字符
;
s[1] = '\0';

i = 0; 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 != '.' && c != '-') return c; if (c == '-') //用于判断是负数还是减操作
{
if (isdigit(c = getch()) || c == '.')
s[++i] = c; else
{ if (c != EOF)
ungetch(c); return '-';
}
} 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;
}/* ----------------------------------------------------------- *//*
* 引用以下两个函数是因为:程序不能确定它已经读入的输入是否足够 *
* 除非超前多读入一些输入,在本程序中,读入一些字符合成一个数字 *
* 所以在看到第一个非数字字符之前,已经读入的数的完整性是不能确定的
* 由于程序要超前读入一个字符,这样就导致最后又一个字符不属于当前所要读入的数
*/#define BUFSIZE 100char buf[BUFSIZE];int bufp = 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;
}
意法半导体(中国)投资有限公司
2023-06-12 广告
单片机汇编程序是用汇编语言编写的程序,用于控制单片机的操作。汇编语言是一种比较接近计算机硬件语言的低级语言,相对于高级语言来说更容易理解和实现。下面是单片机汇编程序的基本步骤:1. 将代码和数据汇编到规定的段中。2. 在存储器中用未初始化的... 点击进入详情页
本回答由意法半导体(中国)投资有限公司提供
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式