C语言实现简单计算器程序的示例

  介绍

这篇文章主要介绍C语言实现简单计算器程序的示例,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

这两天在看一个C语言写的计算器程序,做了不少的功夫,跟着作者一步步的进行完善,了解了许多细节性的东西,在此自己做个总结,加深自己对程序的印象,也算是梳理。

在该计算器程序,能进行加减乘,除罪,因为,exp等操作,同时能进行数值保存功能。而该计算器使用逆波兰表示法。即所有运算符都跟在操作数的后面,比如下列表达式:
(1 - 2) *(4 + 5)采用逆波兰表示法表示为:1 2 - 4 5 + *
逆波兰表达法中不需要圆括号,只要知道每个运算符需要几个操作数就不会引起歧义。

计算器程序实现很简单,具体原理如下:

,(/*,下一个运算符或操作数不是文件结束指示符,*/)   ,如果(/*,是数,*/)   ,/*将该数压入到栈中,*/,else  if (/*,是运算符,*/)   ,/*弹出所需数目的操作数,*/,/*执行运算,*/,/*将结果压入到栈中,*/,else  if (/*,是换行符,*/)   ,/*弹出并打印栈顶的值,*/其他的,   ,/*出错,*/

在程序设计中,使用模块化思想,getop函数来进行读入,该函数返回一个标识,用来标识读入的是什么类型。主循环体中根据该标识执行相应的动作。

以下是该程序:(我将所有函数和变量放在同一文件)

# include  & lt; stdlib.h>   # include  & lt; stdio.h>   # include  & lt; string.h>      # define  MAXOP  100年   # define  NUMBER  & # 39; 0 & # 39;,//标识读入的是数字   # define  NAME  & # 39; n # 39;,//标识读入的是字符串(函数名或非法字符串)   26 # define  ALPHA    int  getop (char  []),   void  push (双);,//压栈   流行(空白);double //出栈   void 明确(空白);,//清空栈   void  mathfnc (char []),//执行相应的数学函数罪,因为,经验等      int 主要(空白)   {   ,int 类型;   ,int 我,var =, 0;   ,double  op1, op2, v;   ,char  s [MAXOP];   ,double 变量(α);      ,for (小姐:=,0;,小姐:& lt;,α;,我+ +),//初始化用于保存数值的变量数组   ,变量[我]=,0.0;      ,while  ((type =, getop (s)), !=, EOF),//读取输入   ,{   ,switch (类型)   ,{   case 才能;数量:   push 才能;(atof (s));   打破才能;   case 才能;名称:   mathfnc才能(年代);   打破才能;   case 才能;& # 39;+ & # 39;   push 才能;(pop (), +, pop ());   打破才能;   case 才能;& # 39;* & # 39;:   push 才能;(pop (), *, pop ());   打破才能;   case 才能;& # 39;& # 39;:   op2 才能=,pop ();   push 才能;(pop(),安康;《凤凰社》第2章);   打破才能;   case 才能;& # 39;/& # 39;:   op2 才能=,pop ();   if 才能;(op2  !=, 0.0)   ,,push  (pop(),/,《凤凰社》第2章);   其他的才能   ,,printf (“错误:,zero 除数\ n");   打破才能;   case 才能;& # 39;% & # 39;   op2 才能=,pop ();   if 才能;(op2  !=, 0.0)   ,,push (作用(流行(),,《凤凰社》第2章);   其他的才能   ,,printf (“错误:,zero 除数\ n");   打破才能;   case 才能;& # 39;? & # 39;:,//打印栈顶元素   op2 才能=,pop ();   printf 才能;(“\ t % .8g \ n",,《凤凰社》第2章);   push 才能;(《凤凰社》第2章);   打破才能;   case 才能;& # 39;=& # 39;:,//保存数的值   ,,pop ();   if 才能;(var 祝辞=,& # 39;一个# 39;,,,,var  & lt;=, & # 39; z # 39;)   ,,变量[var 作用;& # 39;一个# 39;],=,pop ();   其他的才能   ,,printf (“错误:,no  variable  \ n"名称;);   打破才能;   case 才能;& # 39;c # 39;:   清晰的才能();   打破才能;   case 才能;& # 39;d # 39;:,//复制栈顶元素   op2 才能=,pop ();   推动才能(《凤凰社》第2章);   推动才能(《凤凰社》第2章);   打破才能;   case 才能;& # 39;& # 39;:,//交换栈元素   op1 才能=,pop ();   op2 才能=,pop ();   推动才能(凤凰社第一章);   推动才能(《凤凰社》第2章);   case 才能;& # 39;\ n # 39;:   v 才能=,pop ();,//v保存最后的一次结果   printf 才能;(“\ t % .8g \ n",, v);   打破才能;   默认值:才能   if 才能;(type 祝辞=,& # 39;一个# 39;,,,,type  & lt;=, & # 39; z # 39;)   ,才能推动(变量[type 安康;& # 39;一个# 39;]);   else 才能;if  (type ==, & # 39; @ # 39;),//输入的字符@表示最近一次结果值,   ,才能推动(v);   其他的才能   ,,printf (“错误:,unknown  command  % s \ n",, s);   打破才能;   ,}=,var 类型;,   ,}   ,return  0;   }/*,- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -女人。*/# define  MAXVAL  100年      int  sp =, 0,,//标识栈顶   double 瓦尔(MAXVAL);      void 推动(double  f)   {   ,if  (sp  & lt;, MAXVAL)   ,val [sp + +]=, f;   其他的,   ,printf (“错误:,stack ,,停下来# 39;t  push  % g \ n",, f);   }      double 流行(空白)   {   ,if  (sp 祝辞,0)   ,return 瓦尔(- sp);   其他的,   ,{   ,printf (“错误:,statck 空\ n");   ,return  0.0;   }大敌;   }      void 明确(空白)   {=,sp  0;   }      null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null

C语言实现简单计算器程序的示例