可用c语言编程的科学计算器,一个用C语言实现的科学计算器
使用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语言实现的科学计算器相关推荐
- c语言编程后总有一个错误,C语言编程,之后出现错误,请大神帮忙看下什么问题?...
int main(void) { int a = 10; int *p1 = &a; char ch = 'c'; char *p2 = &ch; printf("p1=&g ...
- 有没有c 或c语言的短期培训学校,根河学c语言编程,根河学c语言编程的学校,根河学c语言编程报个培训班怎么样...
根河学c语言编程,根河学c语言编程的学校,根河学c语言编程报个培训班怎么样 首页 > 软件 > 根河学c语言编程 作者:镀金池 发布时间:2017-11-30 11:02 另外,尽早调 ...
- 8051单片机c语言编程模板,完美的8051单片机C语言编程模板.doc
完美的8051单片机C语言编程模板.doc <8051单片机C语言编程模板> [程序开始处的程序说明] /***************************************** ...
- C语言编程题,给定一个日期,输出这个日期是该年的第几天
/**C语言编程题给定一个日期,输出这个日期是该年的第几天 */ int getIndexOfDay(int year, int month, int day) {int months[12] = { ...
- c语言编程判断输入的一个字符串是否是“回文”。所谓“回文”字符串就是左读和右读都一样的字符串。例如: “abcba“就是一个回文字符串。
编程判断输入的一个字符串是否是"回文".所谓"回文"字符串就是左读和右读都一样的字符串.例如: "abcba"就是一个回文字符串. 要求:先 ...
- 沈阳工业大学c语言编程题,金融工程专业《C语言程序设计》启发式教学探讨
一.引言 C语言是一门高级程序设计语言,掌握C语言不仅有利于提高学生的思维能力,而且有利于培养学生的编程能力,对学习其他计算机语言课程具有很大的帮助.因此,<C语言程序设计>既是计算机各类 ...
- 红灯停绿灯行c语言编程,基于物联网应用的《C语言程序设计》教学模式研究
[摘要] 物联网是信息技术的最新发展发向,C语言程序设计又是物联网相关专业中的基础课,在物联网中的应用广泛,本文结合所任教的技工院校学生特点,在分析了C语言教学中存在的问题后,对C语言的教学模式进行了 ...
- 数学在c语言编程中的历史,用计算机C语言编程解古代数学题
用计算机C语言编程解古代数学题 C语言广泛的应用于基础软件.桌面系统.网络通信.音频视频.游戏娱乐等诸多领域.是世界上使用最广泛的编程语言之一本文由论文联盟http://www.LWlm.cOm收集整 ...
- 基于c语言编程思路的实践与探索,C语言程序设计趣味教学探索与实践
张竞丹 王乐 江武汉 范金坪 管明祥 摘要:"C语言程序设计"是高等职业教育中计算机.电子专业的专业基础课程,在其专业课程体系中具有重要的作用.文章针对高职院校"C语言程 ...
- c语言编程测试char的整数生成,C语言编程实验
<C语言编程实验>由会员分享,可在线阅读,更多相关<C语言编程实验(30页珍藏版)>请在人人文库网上搜索. 1.C语言实验习题7-1输出图形(10分)编写程序输出图形.第一行输 ...
最新文章
- 程序员的浪漫,你值得拥有!
- day 01 ————立志运维的第一天开始,承若书!
- SmartCode Release 4
- Linux内核编码风格
- 利用cookie显示上次浏览的时间
- 【职场】公司利益和个人利益,永远不可能完全一致
- 无需复杂插件即可从Eclipse启动和调试Tomcat
- 神经网络最常用的10个激活函数,一文详解数学原理及优缺点
- 机器学习、深度学习方面书籍收集(持续更新……)
- Linux多进程的应用
- 用计算机关闭无线网络连接,干货分享:打印机无线连接断开了怎么办?
- 【网络通信 -- SIP 电话】项目实战记录 -- FreeSwitch 服务器搭建与典型 SIP 电话应用
- android 视频编辑应用,安卓视频剪辑软件推荐
- Android 项目必备(二十)-->NFC 的基本使用
- PS教程!手把手教你绘制3个效果酷炫的GIF动画效果
- Could not set property ‘XXX‘ of ‘class XXX‘ with value ‘XX‘
- 2022-2028全球与中国自动输送分拣系统市场现状及未来发展趋势
- 单相半波可控整流电路仿真设计(任务书+lunwen+MATLAB仿真源文件)
- 长城欧拉,一个最伤女人“芯”的汽车品牌
- 后端传来map数据,前端的获取方式
热门文章
- 关键词搜索排行榜-精准找到行业流量关键词
- 计算机驱动恢复出厂设置在哪里,Windows系统恢复出厂设置在哪?怎么恢复出厂设置?...
- Cox模型中的时间依存协变量和时间依存系数(R语言)第二部分
- 安装linux ubuntu11系统时,应该如何选择键盘布局,在ubuntu上创建新键盘布局需要哪些步骤?...
- 语音通知事件提醒功能实现流程
- linux-快速返回上次所在目录
- 老男孩五篇重要文章:http://oldboy.blog.51cto.com/2561410/1184139
- B-JUI表单验证规则总结
- B-JUI刷新当前标签页的方法
- Windows7 内部版本7601 此Windows副本不是正版