C/C++ code/*---------------------------------------

函数型计算器(VC++6.0,Win32 Console)程序由 yu_hua 于2007-07-27设计完成

功能:

目前提供了10多个常用数学函数:

⑴正弦sin

⑵余弦cos

⑶正切tan

⑷开平方sqrt

⑸反正弦arcsin

⑹反余弦arccos

⑺反正切arctan

⑻常用对数lg

⑼自然对数ln

⑽e指数exp

⑾乘幂函数∧

用法:

如果要求2的32次幂,可以打入2^32

如果要求30度角的正切可键入tan(Pi/6)

注意不能打入:tan(30)

如果要求1.23弧度的正弦,有几种方法都有效:

sin(1.23)

sin 1.23

sin1.23

如果验证正余弦的平方和公式,可打入sin(1.23)^2+cos(1.23)^2 或sin1.23^2+cos1.23^2

此外两函数表达式连在一起,自动理解为相乘如:sin1.23cos0.77+cos1.23sin0.77就等价于sin(1.23)*cos(0.77)+cos(1.23)*sin(0.77)

当然你还可以依据三角变换,再用sin(1.23+0.77)也即sin2验证一下。

本计算器充分考虑了运算符的优先级因此诸如:2+3*4^2 实际上相当于:2+(3*(4*4))

另外函数名前面如果是数字,那么自动认为二者相乘.

同理,如果某数的右侧是左括号,则自动认为该数与括弧项之间隐含一乘号。

如:3sin1.2^2+5cos2.1^2 相当于3*sin2(1.2)+5*cos2(2.1)

又如:4(3-2(sqrt5-1)+ln2)+lg5 相当于4*(3-2*(√5 -1)+loge(2))+log10(5)

此外,本计算器提供了圆周率 Pi键入字母时不区分大小写,以方便使用。

----------------------------------------*/

#include

#include

#include

#include

#include

#include

#include

#include

#include

using namespace std;

const char Tab=0x9;

const int DIGIT=1;

const int MAXLEN=16384;

char s[MAXLEN],*endss;

int pcs=15;

double fun(double x,char op[],int *iop) {

while (op[*iop-1]<32) //本行使得函数嵌套调用时不必加括号,如 arc sin(sin(1.234)) 只需键入arc sin sin 1.234

switch (op[*iop-1]) {

case 7: x=sin(x); (*iop)--;break;

case 8: x=cos(x); (*iop)--;break;

case 9: x=tan(x); (*iop)--;break;

case 10: x=sqrt(x); (*iop)--;break;

case 11: x=asin(x); (*iop)--;break;

case 12: x=acos(x); (*iop)--;break;

case 13: x=atan(x); (*iop)--;break;

case 14: x=log10(x);(*iop)--;break;

case 15: x=log(x); (*iop)--;break;

case 16: x=exp(x); (*iop)--;break;

}

return x;

}

double calc(char *expr,char **addr) {

static deep; //递归深度

static char *fname[]={ "sin","cos","tan","sqrt","arcsin","arccos","arctan","lg","ln","exp",NULL};

double ST[10]={0.0}; //数字栈

char op[10]={'+'}; //运算符栈

char c,*rexp,*pp,*pf;

int ist=1,iop=1,last;

if (!deep) {

pp=pf=expr;

do {

c = *pp++;

if (c!=' '&& c!=Tab)

*pf++ = c;

} while (c!='\0');

}

pp=expr;

if ((c=*pp)=='-'||c=='+') {

op[0] = c;

pp++;

}

last = !DIGIT;

while ((c=*pp)!='\0') {

if (c=='(') {//左圆括弧

deep++;

ST[ist++]=calc(++pp,addr);

deep--;

ST[ist-1]=fun(ST[ist-1],op,&iop);

pp = *addr;

last = DIGIT;

if (*pp == '('||isalpha(*pp) && strnicmp(pp,"Pi",2)) {//目的是:当右圆括弧的右恻为左圆括弧或函数名字时,默认其为乘法

op[iop++]='*';

last = !DIGIT;

c = op[--iop];

goto operate ;

}

}

else if (c==')') {//右圆括弧

pp++;

break;

} else if (isalpha(c)) {

if (!strnicmp(pp,"Pi",2)) {

if (last==DIGIT) {

cout<< "π左侧遇)" <

}

ST[ist++]=3.14159265358979323846264338328;

ST[ist-1]=fun(ST[ist-1],op,&iop);

pp += 2;

last = DIGIT;

if (!strnicmp(pp,"Pi",2)) {

cout<< "两个π相连" <

}

if (*pp=='(') {

cout<< "π右侧遇(" <

}

} else {

for(int i=0; (pf=fname[i])!=NULL; i++)

if (!strnicmp(pp,pf,strlen(pf)))break;

if (pf!=NULL) {

op[iop++] = 07+i;

pp += strlen(pf);

} else {

cout<< "陌生函数名" <

}

}

} else if (c=='+'||c=='-'||c=='*'||c=='/'||c=='^') {

char cc;

if (last != DIGIT) {

cout<< "运算符粘连" <

}

pp++;

if (c=='+'||c=='-') {

do {

cc = op[--iop];

--ist;

switch (cc) {

case '+': ST[ist-1] += ST[ist];break;

case '-': ST[ist-1] -= ST[ist];break;

case '*': ST[ist-1] *= ST[ist];break;

case '/': ST[ist-1] /= ST[ist];break;

case '^': ST[ist-1] = pow(ST[ist-1],ST[ist]);break;

}

} while (iop);

op[iop++] = c;

} else if (c=='*'||c=='/') {

operate: cc = op[iop-1];

if (cc=='+'||cc=='-') {

op[iop++] = c;

} else {

--ist;

op[iop-1] = c;

switch (cc) {

case '*': ST[ist-1] *= ST[ist];break;

case '/': ST[ist-1] /= ST[ist];break;

case '^': ST[ist-1] = pow(ST[ist-1],ST[ist]);break;

}

}

} else {

cc = op[iop-1];

if (cc=='^') {

cout<< "乘幂符连用" <

}

op[iop++] = c;

}

last = !DIGIT;

} else {

if (last == DIGIT) {

cout<< "两数字粘连" <

}

ST[ist++]=strtod(pp,&rexp);

ST[ist-1]=fun(ST[ist-1],op,&iop);

if (pp == rexp) {

cout<< "非法字符" <

}

pp = rexp;

last = DIGIT;

if (*pp == '('||isalpha(*pp)) {

op[iop++]='*';

last = !DIGIT;

c = op[--iop];

goto operate ;

}

}

}

*addr=pp;

if (iop>=ist) {

cout<< "表达式有误" <

}

while (iop) {

--ist;

switch (op[--iop]) {

case '+': ST[ist-1] += ST[ist];break;

case '-': ST[ist-1] -= ST[ist];break;

case '*': ST[ist-1] *= ST[ist];break;

case '/': ST[ist-1] /= ST[ist];break;

case '^': ST[ist-1] = pow(ST[ist-1],ST[ist]);break;

}

}

return ST[0];

}

int main(int argc,char **argv) {

if (argc<=1) {

if (GetConsoleOutputCP()!=936) system("chcp 936>NUL");//中文代码页

cout << "计算函数表达式的值。"<

while (1) {

cout << "请输入表达式:";

gets(s);

if (s[0]==0) break;//

cout << s <

cout << setprecision(15) << calc(s,&endss) << endl;

}

} else {

strncpy(s,argv[1],MAXLEN-1);s[MAXLEN-1]=0;

if (argc>=3) pcs=atoi(argv[2]);

if (pcs<0||15

printf("%.*lf\n",pcs,calc(s,&endss));

}

return 0;

}

c语言用栈编写计算器程序,用c语言实现简易的计算器四则运算的代码最好用栈方法实现,该怎么解决...相关推荐

  1. 用C语言循环结构编写一个程序实现求5的阶乘。

    用C语言循环结构编写一个程序实现求5的阶乘. #include<stdio.h>intmain(){int fac(int n);int n; int y;printf("inp ...

  2. c语言课程设计计算器程序分析,c语言课程设计简单计算器程序..docx

    课程设计名称:C语言课程设计 课程设计题目: 简单计算器程序 TOC \o "1-5" \h \z \o "Current Document" 第1章需求分析1 ...

  3. ubuntu系统下c语言入门以及编写简单程序

    目录 一,hello world入门 二,在windows系统中编写简单程序 三,在ubuntu系统下用makefile方式编写程序 一,hello world入门 在linux操作系统中打开终端 1 ...

  4. c语言计算器开题报告,基于单片机的简易电子计算器设计开题报告.doc

    第 PAGE 3页 授人以渔能力为本 毕业设计开题报告 学生姓名 学生学号 毕业设计题目 基于单片机的简易电子计算器设计 1.选题背景(含国内外相关研究综述及评价)与意义 随着社会的发展,科学的进步, ...

  5. 使用c语言实现复数运算的程序,用C语言实现的复数运算程序设计

    用C语言实现的复数运算程序设计 电大理工 2009年3月 Study of Science and Engineering at RTVU. 第1期 总第238期 用C语言实现的复数运算程序设计 王彦 ...

  6. c语言怎么让他变成程序,用C语言编了个程序,怎样让它点击“下一步”后继续弹出窗口...

    可以参考下面的代码: #include int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,PSTR szCmdLine, ...

  7. C语言编写利率程序,《C语言及程序设计》实践参考——定期存款利息计算器

    返回:贺老师课程教学链接  项目要求 [项目:定期存款利息计算器] 输入存款金额并选择存款种类,计算出利息(不计利息税)和本息合计.要求使用switch语句,根据选择的存款种类,确定利率和存期后计算. ...

  8. c语言编写excel程序,基于C语言的Excel核价程序的设计与实现

    Excel是财务工作的常用工具,但是对于复杂的函数操作,对于一些不熟悉计算机编程知识的财务人员是一件比较头疼的事情.笔者结合C语言对Excel文件的OLE操作函数,开发出的应用程序简单易用,解决了财务 ...

  9. 用c语言编写MIDI程序,使用C语言编写钢琴小程序

    网上搜索键盘钢琴,可以搜索到不少小游戏,最常玩的就是Flash小游戏,26个按键的. 后来想用C语言自己实现一个,没有界面--控制台的. 原理很简单,先在控制台中获取按键事件,在按键事件中,开一个线程 ...

最新文章

  1. Go语言的Channel文章,整个人都感觉不好了
  2. OpenVINO + OpenCV实现车辆检测与道路分割
  3. 推荐3个C++系统项目!初级开发者必学!
  4. 监听 html dom 变化,如何监听页面 DOM 变动并高效响应
  5. 如何让linux服务器同步互联网时间
  6. MATLAB绘图辅助操作
  7. 为什么很多公司只给博士发安家费,却不给研究生和本科生发?
  8. vuejs对象更新渲染_vue 对对象的属性进行修改时,不能渲染页面 vue.$set()
  9. Atitit mybatis 简化开发与提升开发效率法 目录 1.1. 使用注解模式代替xml模式 1 1.2. 使用通用mapper代替专用mapper 1 1.3. 使用js等脚本语言来输出sq
  10. Windows Server 无法启用 网络发现
  11. 433MHZ LORA扩频模块于PDA的完美结合
  12. 学生来看我,我自我满足...........
  13. Google AI逆天了!
  14. java提供的对集合操作的常用方法,并集,交集,差集
  15. MMdetection绘制mAP-自用
  16. iOS根据图片比例计算显示大小
  17. HDU - 7047 - Link with Balls ( 插板法 + 组合数 )
  18. 自我复盘-20210820
  19. 数据,数据流,数据管道
  20. 如何通过SEO搜索引擎关键词优化获客?

热门文章

  1. 【Linux】一篇文章搞定 进程 及相关操作
  2. 【一文就够】浏览器缓存机制详细知识点梳理
  3. 猫猫学IOS(十五)UI之曾经大热的打砖块小游戏
  4. flashdevelop java_FlashDevelop使用详解教程
  5. TCP握手与挥手详解(附有图)
  6. EL表达式和JSTL表达式及案例
  7. npm install 报错
  8. python猪肉价格预测_预测猪肉年底会涨到30元,用python分析:肉涨真正利好哪些股?...
  9. C++对象内存布局(转载)
  10. 我,一个正在成长的西门少年