使用C语言写的科学计算器,可以实现四则运算、三角函数运算、指对数运算;优先级正确;能智能屏蔽空格,能识别输入错误和运算错误,能实现继续运算、清空运算结果和有效退出的功能

#include

#include

#include

#define INPUT_MAX 1000

#define NODE_MAX 500

#define NUM_OPT 20

#define LEN_OPT 6

#define NUM_OPS 200

typedef enum{

Opd=0,

Opt=1

}Type;

typedef struct{

int opt;

double opd;

Type tp;

}Node;

//括号栈,检测括号是否匹配

char brackets[NUM_OPS];

int bb=0;

int input(Node *in);

int translate(char *p,Node *re,int *len);

double translateopd(char *p,int *len);

int translateopt(char *p,int *len);

int cmp(const char *s,const char *d);

int calculate(Node *n,double *r);

int sclt(int opr,double *opd);

int dclt(int opr,double *opd1,double opd2);

int prid(int c);

/*功能:表达式输入和转换

* 接收输入并翻译为操作符和操作数存入表达式链

*输入:表达式链的地址

*输出:执行状态,正确返回1,错误返回0

*/

int input(Node *in)

{

//input->string

char ins[INPUT_MAX]={0};

int insi=0;

char temp_in=0;

int len=0;

//检测开头的空格

while(' '==(ins[0]=getchar()));

//检测是不是直接输入了一个回车

if(ins[0]!='\n')

{

do{

temp_in=getchar();

//只能忽略多余空格

if(ins[insi]==' '&&temp_in==' ')

continue;

ins[++insi]=temp_in;

}while(temp_in!='\n');

ins[insi]=0;

}

insi=0;

//输入回车直接输出0

if(ins[0]=='\n')

in->tp=Opd,in->opd=0.0,in++;

else

//压入表达式链

while(ins[insi])

{

if(translate(ins+insi,in++,&len))

insi+=len;

else

return 0;

}

//自动添加等号

if((in-1)->opt!='=')

in->opt='=',in->tp=Opt,in++;

in->opt=-1,in->tp=Opt;

return 1;

}

/*功能:翻译字符串为操作数或操作符

*输入:字符串地址,翻译返回节点,操作数和操作符长度返回地址

*输出:翻译结果状态

*/

int translate(char *p,Node *re,int *len)

{

if(*p>='0'&&*p<='9')

{

re->tp=Opd;

re->opd=translateopd(p,len);

return 1;

}

else if(*p=='e'||*p=='p')

{

if(*p=='e')

{

re->tp=Opd;

re->opd=M_E;

*len=1;

if(p[1]==' ')

(*len)++;//十分重要,此处必须加括号

return 1;

}

else

{

if(p[1]=='i')

{

re->tp=Opd;

re->opd=M_PI;

*len=2;

if(p[2]==' ')

(*len)++;

return 1;

}

else

return 0;

}

}

else

{

re->tp=Opt;

re->opt=translateopt(p,len);

if(re->opt)

return 1;

else

return 0;

}

}

/*功能:翻译操作数

*/

double translateopd(char *p,int *len)

{

int flag=0;

int pointnum=1;

double temp=0;

int i=0;

do{

if(!flag&&p[i]!='.')

temp=temp*10+p[i++]-'0';

else if(!flag&&p[i]=='.')

flag=1,i++;

else

temp+=(p[i++]-'0')*pow(0.1,pointnum),pointnum++;

}while((p[i]>='0'&&p[i]<='9')||p[i]=='.');

if(p[i]==' ')

i++;

*len=i;

return temp;

}

/*功能:翻译操作数

* 如果运算符非法,则返回0,合法则返回非零标志

*/

int translateopt(char *p,int *len)

{

char fu[NUM_OPT][LEN_OPT]={"+","-","*","/","^","(",")","sin","cos","tan","asin","acos","atan","ln","lg","="};

int fu_int[NUM_OPT]={'+','-','*','/','^','(',')','s','c','t','s'+'a','c'+'a','t'+'a','n','g','='};

int i=0;

for(i=0;itp==Opt&&n->opt=='-')

OPRD[db]=0.0,db++;//Push(&OPRD,0.0);

while(1)

{

//判断前面有没有负号

if(n->tp==Opd)

{

OPRD[db]=n->opd,db++,n++;//Push(&OPRD,n->opd),n++;

}

else

{

//双目运算符

if(prid(n->opt))

{

//if(!GetTop(OPRT,&top))

if(tb)

top=OPRT[tb-1];

if(!tb)

{

if(n->opt=='='||n->opt==')')

{

if(n->opt==')')

{

bb--;//if(!Pop(&brackets,&temp))

if(bb<0)

{

printf("Bracket does not match!");

return 0;

}

}

break;

}

else

OPRT[tb]=n->opt,tb++,n++;//Push(&OPRT,n->opt),n++;

continue;

}

if(prid(top)==0)

{

//Pop(&OPRD,&a);

//Pop(&OPRT,&o);

db--;

a=OPRD[db];

tb--;

o=OPRT[tb];

if(sclt(o,&a))

{

OPRD[db]=a,db++;//Push(&OPRD,a);

continue;

}

else

return 0;

}

if(prid(top)>=prid(n->opt))

{

//Pop(&OPRD,&b);

//Pop(&OPRD,&a);

//Pop(&OPRT,&o);

db--;

b=OPRD[db];

db--;

a=OPRD[db];

tb--;

o=OPRT[tb];

if(dclt(o,&a,b))

{

OPRD[db]=a,db++;//Push(&OPRD,a);

}

else

return 0;

}

else

{

OPRT[tb]=n->opt,tb++,n++;//Push(&OPRT,n->opt),n++;

}

}

else

{

//单目运算符和括号

double x=0.0;

if(n->opt=='(')

{

brackets[bb]='(',bb++;//Push(&brackets,'(');

if(len=calculate(n+1,&x))

{

OPRD[db]=x,db++;//Push(&OPRD,x);

n+=len,n++;

if(n->tp==Opt&&n->opt==-1)

{

printf("Bracket does not match!");

return 0;

}

}

else

return 0;

}

else

{

OPRT[tb]=n->opt,tb++;//Push(&OPRT,n->opt);

n++;

}

}

}

}

*r=OPRD[db-1];

return n-nb+1;

}

/*功能:单目运算

*/

int sclt(int opr,double *opd)

{

switch(opr)

{

case 's':

*opd=sin(*opd);

break;

case 'c':

*opd=cos(*opd);

break;

case 't':

*opd=tan(*opd);

break;

case 'a'+'s':

if(*opd1)

{

printf("Beyond asin()!");

return 0;

}

else

*opd=asin(*opd);

break;

case 'a'+'c':

if(*opd1)

{

printf("Beyond acos()!");

return 0;

}

else

*opd=acos(*opd);

break;

case 'a'+'t':

if(*opd>-3.141592654/2&&*opd<3.141592654/2)

*opd=atan(*opd);

else

{

printf("Beyond atan()!");

return 0;

}

break;

case 'n':

if(*opd>0)

*opd=log(*opd);

else

{

printf("Beyond ln()!");

return 0;

}

break;

case 'g':

if(*opd>0)

*opd=log10(*opd);

else

{

printf("Beyond lg()!");

return 0;

}

break;

}

return 1;

}

/*功能:双目运算

*/

int dclt(int opr,double *opd1,double opd2)

{

switch(opr)

{

case '+':

*opd1 = *opd1+opd2;break;

case '-':

*opd1 = *opd1-opd2;break;

case '*':

*opd1 = (*opd1)*opd2;break;

case '/':

if(opd2>pow(0.1,8)||opd2<0-pow(0.1,8))

*opd1 = (*opd1)/opd2;

else

{

printf("Error 1/0 !");

return 0;

}

break;

case '^':

*opd1 = pow(*opd1,opd2);break;

}

return 1;

}

/*功能:判断优先级

*/

int prid(int c)

{

switch(c)

{

case '+':

case '-':

case '=':

case ')':

return 1;break;

case '*':

case '/':

return 2;break;

case '^':

return 3;break;

default :return 0;break;

}

}

int main()

{

int c=0;

while(1)

{

Node nodes[NODE_MAX]={0};

double r=0.0;

//清空括号栈

bb=0;//InitStack(&brackets);

printf("Enter: ");

//输入

if(!input(nodes))

{

printf("Input Error!");

continue;

}

//计算

if(calculate(nodes,&r))

{

if(bb)

{

printf("Bracket does not match!");

continue;

}

if(floor(r)==r)

printf("%d",(int)r);

else

printf("%.4f",r);

}

c=getchar();

if(c=='q')//退出

break;

else if(c=='c')//清屏

system("clear");

if(c!='\n')

getchar();

}

printf("Quit...\n");

return 0;

}

可用c语言编程的科学计算器,一个用C语言实现的科学计算器相关推荐

  1. c语言编程后总有一个错误,C语言编程,之后出现错误,请大神帮忙看下什么问题?...

    int main(void) { int a = 10; int *p1 = &a; char ch = 'c'; char *p2 = &ch; printf("p1=&g ...

  2. 有没有c 或c语言的短期培训学校,根河学c语言编程,根河学c语言编程的学校,根河学c语言编程报个培训班怎么样...

    根河学c语言编程,根河学c语言编程的学校,根河学c语言编程报个培训班怎么样 首页 > 软件 > 根河学c语言编程 作者:镀金池   发布时间:2017-11-30 11:02 另外,尽早调 ...

  3. 8051单片机c语言编程模板,完美的8051单片机C语言编程模板.doc

    完美的8051单片机C语言编程模板.doc <8051单片机C语言编程模板> [程序开始处的程序说明] /***************************************** ...

  4. C语言编程题,给定一个日期,输出这个日期是该年的第几天

    /**C语言编程题给定一个日期,输出这个日期是该年的第几天 */ int getIndexOfDay(int year, int month, int day) {int months[12] = { ...

  5. c语言编程判断输入的一个字符串是否是“回文”。所谓“回文”字符串就是左读和右读都一样的字符串。例如: “abcba“就是一个回文字符串。

    编程判断输入的一个字符串是否是"回文".所谓"回文"字符串就是左读和右读都一样的字符串.例如: "abcba"就是一个回文字符串. 要求:先 ...

  6. 沈阳工业大学c语言编程题,金融工程专业《C语言程序设计》启发式教学探讨

    一.引言 C语言是一门高级程序设计语言,掌握C语言不仅有利于提高学生的思维能力,而且有利于培养学生的编程能力,对学习其他计算机语言课程具有很大的帮助.因此,<C语言程序设计>既是计算机各类 ...

  7. 红灯停绿灯行c语言编程,基于物联网应用的《C语言程序设计》教学模式研究

    [摘要] 物联网是信息技术的最新发展发向,C语言程序设计又是物联网相关专业中的基础课,在物联网中的应用广泛,本文结合所任教的技工院校学生特点,在分析了C语言教学中存在的问题后,对C语言的教学模式进行了 ...

  8. 数学在c语言编程中的历史,用计算机C语言编程解古代数学题

    用计算机C语言编程解古代数学题 C语言广泛的应用于基础软件.桌面系统.网络通信.音频视频.游戏娱乐等诸多领域.是世界上使用最广泛的编程语言之一本文由论文联盟http://www.LWlm.cOm收集整 ...

  9. 基于c语言编程思路的实践与探索,C语言程序设计趣味教学探索与实践

    张竞丹 王乐 江武汉 范金坪 管明祥 摘要:"C语言程序设计"是高等职业教育中计算机.电子专业的专业基础课程,在其专业课程体系中具有重要的作用.文章针对高职院校"C语言程 ...

  10. c语言编程测试char的整数生成,C语言编程实验

    <C语言编程实验>由会员分享,可在线阅读,更多相关<C语言编程实验(30页珍藏版)>请在人人文库网上搜索. 1.C语言实验习题7-1输出图形(10分)编写程序输出图形.第一行输 ...

最新文章

  1. 故事营销:一个具有争议的成功营销案例
  2. HDU-5723 Abandoned country
  3. synchronized锁的基本用法
  4. 如何让整个表格高度固定_Saas产品中,表格设计有哪些要点
  5. redis延迟队列 如何确保成功消费_千万级延时任务队列如何实现,看美图开源的-LMSTFY...
  6. 【深度学习】深度学习经典数据集汇总
  7. [转载] 七龙珠第一部——第110话 加油 孙悟空
  8. AI以假乱真怎么办?TequilaGAN教你轻松辨真伪
  9. 关于android MTK相机L版本,切换屏幕比例后,分辨率随之改变,但重新进入相机后原有分辨率不再生效问题...
  10. 用 vue-route 的 beforeEach 实现导航守卫(路由跳转前验证登录)
  11. Make jQuery throw error when it doesn't match an element
  12. 第三周 3.14 --- 3.20
  13. pscc显示无法访问adobe服务器,Adobe Photoshop 提示无法加载扩展,因为它未经正确签署错误提示解决方案...
  14. uni-app自定义二维码扫描及本地图片扫描
  15. 【安防百科】HDSDI、960H、HDCVI、HDTVI、AHD方案对比
  16. 基于php校园官方网站的背景,校园微信平台的设计
  17. 良田高拍仪接口文档对接
  18. 给我“空降”一个弟兄
  19. Linux进阶 | Docker部署nginx的web服务,VOLUME的使用详解,实现数据持久化!
  20. 《评人工智能如何走向新阶段》后记(再续22)

热门文章

  1. Vray材质——金属材质
  2. 关于C程序设计谭浩强第五版考研学习心得的分享
  3. php qps是什么意思,tps和qps的区别和理解
  4. GBIT51233-2016装配式木结构建筑技术标准
  5. AMD GPU任务调度(2)—— 内核态分析
  6. cur前缀_常用英语前缀
  7. Cloning into ‘vue-element-admin‘... fatal: unable to access ‘https://github.com/PanJiaChen/vue-eleme
  8. PHP-FPM 性能优化
  9. 小马哥spring编程核心思想_《Spring Boot编程思想(核心篇)》小马哥著 PDF电子书下载...
  10. 想成为CSS大师,你倒是学啊 -30个资源大推荐