当前位置: 首页 > 编程日记 > 正文

C语言科学计算器思路,大神教你如何用C语言实现科学计算器

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;

}

相关文章:

BZOJ4292 : [PA2015]Równanie

注意到f(n)不会超过1459&#xff0c;于是暴力枚举f(n)&#xff0c;检验nk*f(n)是否合法即可。 #include<cstdio> long long k,a,b,t;int i,j,ans; int main(){scanf("%lld%lld%lld",&k,&a,&b);for(i1;i<1459&&k<b/i;i){tk*i;if(a<…

Docker入门六部曲——Stack

原文链接&#xff1a;http://www.dubby.cn/detail.html?id8739 准备知识 安装Docker&#xff08;版本最低1.13&#xff09;。阅读完Docker入门六部曲——Swarm&#xff0c;并且完成其中介绍的内容。拷贝一份docker-compose.yml。确保你的虚拟机都是可用的&#xff0c;使用do…

SVD神秘值分解

SVD分解 SVD分解是LSA的数学基础&#xff0c;本文是我的LSA学习笔记的一部分&#xff0c;之所以单独拿出来&#xff0c;是由于SVD能够说是LSA的基础&#xff0c;要理解LSA必须了解SVD&#xff0c;因此将LSA笔记的SVD一节单独作为一篇文章。本节讨论SVD分解相关数学问题&#xf…

ebook download websites (to be continue...)

http://free-ebook-collection.blogspot.com/转载于:https://www.cnblogs.com/jerryhong/archive/2008/10/24/1318469.html

Blender模块化建筑环境地形场景制作视频教程 Creating modular environments

Blender模块化建筑环境地形场景制作视频教程 Creating modular environments Blender模块化建筑环境地形场景制作视频教程 Creating modular environments 流派:电子学习| MP4 |视频:h264&#xff0c;1280720 |音频:AAC&#xff0c;44.1 KHz 语言&#xff1a;英语中英文字幕&…

文件系统演示C语言,基于C语言的简单文件系统的实现

1 题目介绍通过具体的文件存储空间的管理、文件物理结构、目录结构和文件操作的实现&#xff0c;加深对文件系统内部的数据结构、功能以及实现过程的理解。在内存中开辟一个虚拟磁盘空间作为文件存储分区&#xff0c;在其上实现一个简单的基于多级目录的单用户单任务系统中的文…

深度学习 vs 机器学习 vs 模式识别

http://www.csdn.net/article/2015-03-24/2824301 【编者按】本文来自CMU的博士&#xff0c;MIT的博士后&#xff0c;vision.ai的联合创始人Tomasz Malisiewicz的个人博客文章&#xff0c;阅读本文&#xff0c;你可以更好的理解计算机视觉是怎么一回事&#xff0c;同时对机器学…

2022-2028年中国乙丙橡胶行业市场全景调查及投资潜力研究报告

【报告类型】产业研究 【报告价格】4500起 【出版时间】即时更新&#xff08;交付时间约3个工作日&#xff09; 【发布机构】智研瞻产业研究院 【报告格式】PDF版 本报告介绍了中国乙丙橡胶行业市场行业相关概述、中国乙丙橡胶行业市场行业运行环境、分析了中国乙丙橡胶行…

ubuntu 下利用ndiswrapper安装无线网卡驱动

本文转载自 http://kangxincai.is-programmer.com/posts/10488.html 首先 安装 ndiswrapperubuntu下也就是 ndisgtk (用于安装无线网卡驱动)sudo apt-get install ndisgtk安装好了之后&#xff0c;找到你的无线网卡在windows下的驱动文件(含有.inf的目录)&#xff08;可以从网…

TSP问题——动态规划

Traveling Salesman Problem Description&#xff1a; Time Limit: 4sec Memory Limit:256MB 有编号1到N的N个城市&#xff0c;问从1号城市出发&#xff0c;遍历完所有的城市并最后停留在N号城市的最短路径长度。 Input&#xff1a;…

Blender从头到尾创建一辆宝马轿车视频教程

Blender从头到尾创建一辆宝马轿车视频教程 Blender: Create Realistic BMW 507 From Start to Finish 流派:电子学习| MP4 |视频:h264&#xff0c;1280720 |音频:AAC&#xff0c;44.1 KHz 语言&#xff1a;英语中英文字幕&#xff08;根据原英文字幕机译更准确&#xff09;|大…

OC学习笔记之Foundation框架NSNumber、NSValue和NSDate(转)

一、NSNumber OC数组类NSArray&#xff0c;它只能存放 OC的对象&#xff0c;对于基本的数据类型确无能为力&#xff0c;但是实际编程中经常要把基本的数据如int、float&#xff0c;结构体存放的OC数组中&#xff0c;怎么办&#xff1f;这里的 NSNumber就有用了&#xff0c;它能…

android读取xml 字符串,Android 读取本地Xml文件,并转换成String

问题不是解析本地 xml 文件&#xff0c;而是要将 xml 文件中的所有内容(包含格式&#xff0c;标签等)&#xff0c;直接转换成 String。与前端H5页面交互时&#xff0c; iOS 在请求远程 xml 文件耗时太长(有时需要4~5s)&#xff0c;所以采用本地下载&#xff0c;然后传给前端的方…

Docker入门六部曲——容器

原文链接&#xff1a;http://www.dubby.cn/detail.html?id8734 准备 已经安装好Docker 1.13或者以上的版本。读完的上一篇文章&#xff08;基本引导&#xff09;。简单的测试一下你的本地环境是否已经OK了&#xff1a;docker run hello-world。 介绍 让我们开始构建一个Doc…

window.name实现的跨域数据传输

2019独角兽企业重金招聘Python工程师标准>>> 这篇文章是对 JavaScript跨域总结与解决办法 的补充。 有三个页面&#xff1a; a.com/app.html&#xff1a;应用页面。a.com/proxy.html&#xff1a;代理文件&#xff0c;一般是一个没有任何内容的html文件&#xff0c;需…

ajax frameworks(转贴)

Thinking in AJAX(三) —— AJAX框架汇总 引 此文原出于AJAX Patterns网站的一篇《Ajax Frameworks》的wiki文章&#xff0c;很早前我就注意到&#xff0c;后来在国内也有人翻译了&#xff0c;不过最近发现此wiki还是在不断添加维护中&#xff0c;截止此文发布前&#xff0c;作…

Maya角色面部表情动画制作视频教程 Maya: Facial Rigging

Maya角色面部表情动画制作视频教程 Maya: Facial Rigging Maya角色面部表情动画制作视频教程 Maya: Facial Rigging Maya角色面部表情动画制作视频教程 Maya: Facial Rigging MP4 |视频:h264&#xff0c;1280x720 |音频:AAC&#xff0c;44.1 KHz&#xff0c;2 Ch 语言&#x…

(一三〇)UITextField的光标操作扩展

简介 在iOS开发中&#xff0c;有时候需要完全自主的定义键盘&#xff0c;用于完整的单词输入&#xff0c;例如计算机应用中&#xff0c;需要一次性的输入sin(&#xff0c;在移动光标时要完整的跳过sin(&#xff0c;在删除时也要完整的删除&#xff0c;这就需要对光标的位置进行…

android 多个占位符,Android多语言支持:由于占位符计数不同导致的字符串格式问题...

我正在制作一个法语Android应用程序,我正在努力支持英语.我使用“占位符”来格式化我的字符串,因此我可以将它们调整为男性和女性用户.例如,我的s​​trings.xml文件中的这个字符串&#xff1a;Les %1$s sont compliqu%2$ss...将成为“Les hommessontcompliqus”(“男人很复杂”…

Docker入门六部曲——Swarm

原文链接&#xff1a;http://www.dubby.cn/detail.html?id8738 准备工作 安装Docker&#xff08;版本最低1.13&#xff09;。安装好Docker Compose&#xff0c;上一篇文章介绍过的。安装好Docker Machine&#xff0c;上一篇文章也提到了&#xff0c;Mac和Windows已经预先安装…

Ubuntu 查看磁盘空间大小命令转

df -hDf命令是linux系统以磁盘分区为单位查看文件系统&#xff0c;可以加上参数查看磁盘剩余空间信息&#xff0c;命令格式&#xff1a;df -hl显示格式为&#xff1a; 文件系统 容量 已用 可用 已用% 挂载点 Filesystem Size Used Avail Use% Moun…

MSSQLid清零

truncate table [cellphone2016].[dbo].[tp_phone_9]转载于:https://www.cnblogs.com/wangchuang/p/5259615.html

Blender 3D插图插画设计视频教程 Fantastic 3D illustration with Blender

Blender 3D插图插画设计视频教程 Fantastic 3D illustration with Blender Blender 3D插图插画设计视频教程 Fantastic 3D illustration with Blender Blender 3D插图插画设计视频教程 Fantastic 3D illustration with Blender Brellias |时长:1h 30m |视频:H264 1920x1080 |音…

Linux搜索文件&搜索文件名&替换文件内容

locate是Linux系统提供的一种快速检索全局文件的系统命令,它并不是真的去检索所以系统目录,而是检索一个数据库文件locatedb(Ubuntu系置/var/cache/locate/locatedb),该数据库文件包含了系统所有文件的路径索引信息,所以查找速度很快。time结尾的选项,其单位为天,min结尾的选项其单位为分钟,这些选项的值都为一个正负整数, 如+7,表示,7天以前被访问过的文件,-7表示7天以内被访问过的文件,7表示恰好7天前被访问的文件。:快速返回某个指定命令的位置信息。

Lock和Synchronize区别详解

synchronized是Java中的一个关键字,当我们调用它时会从在虚拟机指令层面加锁,关键字为monitorenter和monitorexitLock是Java中的一个接口,它有许多的实现类来为它提供各种功能,加锁的关键代码为大体为Lock和unLock;synchronized可对实例方法、静态方法和代码块加锁,相对应的,加锁前需要获得实例对象的锁或类对象的锁或指定对象的锁。说到底就是要先获得对象的监视器(即对象的锁)然后才能够进行相关操作。

android usb 触摸屏 apk,Android插入USB设备,自动弹出提示运行apk

USB HOST模式开发下可能会遇到这个问题。第一步是在AndroidManifest.xml文件中修改,主意下面红色字体......一般调用的activity都是Main和Lanunch入口&#xff0c;加入上面的action后&#xff0c;在SDK中以Run As Android Application时&#xff0c;仅执行安装动作&#xff0c;…

sskeychain使用(轻量级框架)

原文地址&#xff1a;http://www.ithao123.cn/content-2407927.html keychain的主要功能就是帮助用户安全地记住他的密码&#xff0c;keychain保存的密码文件都是经过加密的&#xff0c;其它人不能直接通过打开keychain的文件获得保存在keychain中的密码。在mac上可以安装钥匙串…

如何在团队中做好Code Review

一、Code Review的好处 想要做好Code Review&#xff0c;必须让参与的工程师充分认识到Code Review的好处 1、互相学习&#xff0c;彼此成就 无论是高手云集的架构师团队&#xff0c;还是以CURD为主的业务开发团队&#xff0c;大家的技术能力、经验都是有差异的。 通过Code…

分布式服务框架 Zookeeper -- 管理分布式环境中的数据

2019独角兽企业重金招聘Python工程师标准>>> 转自&#xff1a;http://www.ibm.com/developerworks/cn/opensource/os-cn-zookeeper/ Zookeeper 分布式服务框架是 Apache Hadoop 的一个子项目&#xff0c;它主要是用来解决分布式应用中经常遇到的一些数据管理问题&am…

ubuntu18下配置VS Code

配置逻辑主要是 launch.json指定预先处理的任务(preLaunchTask)及读取build文件(program) tasks.json指定输入原始文件和输入build文件(args) 参考:https://www.cnblogs.com/JsonZhangAA/p/9750282.html launch.json中的配置 {"version": "0.2.0","co…