这两天在看一个C语言写的计算器程序,做了不少的功夫,跟着作者一步步的进行完善,了解了许多细节性的东西,在此自己做个总结,加深自己对程序的印象,也算是梳理。
在该计算器程序,能进行加减乘除、sin、cos、exp等操作,同时能进行数值保存功能。而该计算器使用逆波兰表示法。即所有运算符都跟在操作数的后面,比如下列表达式:
(1 - 2) * (4 + 5)采用逆波兰表示法表示为:1 2 - 4 5 + *
逆波兰表达法中不需要圆括号,只要知道每个运算符需要几个操作数就不会引起歧义。
计算器程序实现很简单,具体原理如下:
while(/* 下一个运算符或操作数不是文件结束指示符 */)
if(/* 是数 */)
/* 将该数压入到栈中 */
else if (/* 是运算符 */)
/* 弹出所需数目的操作数 */
/* 执行运算 */
/* 将结果压入到栈中 */
else if (/* 是换行符 */)
/* 弹出并打印栈顶的值 */
else
/* 出错 */
在程序设计中,使用模块化思想,getop函数来进行读入,该函数返回一个标识,用来标识读入的是什么类型。主循环体中根据该标识执行相应的动作。
以下是该程序: (我将所有函数和变量放在同一文件)
#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 =