expresscalculate
//本程序接受任意含有+、-、*、/和()的数值表达式,数值允许带小数,输入以#结束。如:((2.4+3.5)*2-(2+3.5)/2)*(2+3)#
#include <stdio.h>
#include "G:\express\mystack.h" char piror[7][7]={'>','>','<','<','<','>','>',
'>','>','<','<','<','>','>',
'>','>','>','>','<','>','>',
'>','>','>','>','<','>','>',
'<','<','<','<','<','=','f',
'>','>','>','>','f','>','>',
'<','<','<','<','<','f','='};
//保存算符优先矩阵 int chartoint(char ch)//将运算符变成数组(算符优先矩阵)下标
{
switch(ch)
{
case '+':return 0;
case '-':return 1;
case '*':return 2;
case '/':return 3;
case '(':return 4;
case ')':return 5;
case '#':return 6;
}
} int numchar(char ch)//判断是否为数字符号
{
if (ch>='0' && ch<='9')
return 1;
else return 0;
} int isoptr(char ch)//判断是否为合法的运算符号
{
switch(ch)
{
case '+':
case '-':
case '*':
case '/':
case '(':
case ')':
case '#':return 1;
default :return 0;
}
} float operate(float n1,char ch,float n2)//对操作数按运算符进行运算
{
switch(ch)
{
case '+':return n1+n2;
case '-':return n1-n2;
case '*':return n1*n2;
case '/':return n1/n2;
}
} main()
{
char str[80];
gets(str);
int i=0;
int number1,exp10;
char ch1,ch2,curroptr1;
float number,number2,n1,n2,n3,curroptr,ch3; sqstack optr,opnd;
initstack(optr);push(optr,'#');
initstack(opnd); while(str[i]!='\0')
{
if(numchar(str[i]))
{
number1=0;
while(numchar(str[i]))
{
number1=number1*10+(str[i]-'0');
i++;
}
//已经读取了一个整数 if (str[i]=='.')
{
i++;
number2=0.0;exp10=10;
while(numchar(str[i]))
{
number2=number2+((str[i]-'0')*1.0)/exp10;
exp10=exp10*10;
i++;
printf("number2_____decimal part=%f\n",number2);
}
number=number1+number2;
printf("number_float=%f\n",number);// 将实数压入堆栈
push(opnd,number);
}
else
{
push(opnd,number1);// 将整数压入堆栈
printf("number_____int=%d\n",number1);
}
}
else if(!isoptr(str[i]))
{
printf("express error---1!\n");
exit(0);
}
else
{
ch1=(char)gettop(optr);
ch2=str[i];
printf("ch1=%c,ch2=%c\n",ch1,ch2); if(piror[chartoint(ch1)][chartoint(ch2)]=='>')
{
while(piror[chartoint(ch1)][chartoint(ch2)]=='>')
{
pop(opnd,n2);
pop(opnd,n1);
pop(optr,curroptr);
curroptr1=(char)curroptr;
printf("\n---%f %c %f=====%f\n",n1,curroptr1,n2,operate(n1,curroptr1,n2));
push(opnd,operate(n1,curroptr1,n2));
ch1=(char)gettop(optr);
}
}
if(piror[chartoint(ch1)][chartoint(ch2)]=='<') push(optr,ch2);
if(piror[chartoint(ch1)][chartoint(ch2)]=='=') pop(optr,ch3);
if(piror[chartoint(ch1)][chartoint(ch2)]=='f')
{
printf("express error---2!\n");
exit(0);
}
i++;
}
}
pop(opnd,n3);
printf("\nresult=%f\n",n3);
}
#include <stdlib.h>
#include <stdio.h> #define stackinitsize 50
#define stackincrement 8 typedef float elemtype; typedef struct{
elemtype *base;
elemtype *top;
int stacksize;
}sqstack; int initstack(sqstack &s)
{s.base=(elemtype * ) malloc(stackinitsize*sizeof(int));
s.top=s.base;
s.stacksize=stackinitsize;
return 1;
} int push(sqstack &s,elemtype e)
{
*(s.top)=e;
s.top++;
return 1;
} elemtype gettop(sqstack s)
{
return *(s.top-1);
} int emptystack(sqstack s)
{if (s.top==s.base) return 1;
else return 0;
} int pop(sqstack &s,elemtype &e)
{ if (emptystack(s)) return 0;
--s.top;
e=*(s.top);
return 1;
}
expresscalculate的更多相关文章
随机推荐
- poj1828
poj1828 [问题的描述]是这样的:程序猿的近亲 猴子(......)最近在进行王位争夺站. 题中使用二维坐标轴上的点(x,y)来代表猴子所占有的位置, 每只猴子占有一个坐标点.并且一个坐标点上面 ...
- Swift - 使用CoreLocation实现定位(经纬度、海拔、速度、距离等)
CoreLocation是iOS中一个提供设备定位的框架.通过这个框架可以实现定位处理,从而获取位置数据,比如经度.纬度.海拔信息等. 1,定位精度的设置 定位服务管理类CLLocationMan ...
- 绘图quartz之渐变
实现线性渐变 径向渐变 自己新建的view中有一个drawRect:(cgrect)rect方法 在这个方法里 可以通过画图 将内容显示在画板上(即最下边的view) 渐变的方式分两种 ...
- JavaScript HTML DOM 事件
JavaScript HTML DOM 事件 HTML DOM 使 JavaScript 有能力对 HTML 事件做出反应. 实例 Mouse Over Me 对事件做出反应 我们可以在事件发生时执行 ...
- Business Intelligence (BI)
BI, 全称Business Inteligence. 帮助企业更有效地利用数据,提供经营决策支持.让决策管理者随时随地获取关键信息,基于数字决策,最终提高决策水平. 包括范围(层次由低到高):数据报 ...
- javascript——闭包
<script type="text/javascript"> //什么是闭包: //是指语法域位于某个特定的区域,具有持续参照(读写)位于该区域内自身范围之外的执行域 ...
- 第三篇、调优之路 Apache调优
1. 简介 在第一篇中整合了apache + tomcat ,利用了apache解析静态文件为tomcat解压.但是在测试机上发现两者性能不足,不能充分利用服务器的性能,该篇中将对apache进行性 ...
- Oracle 面试宝典 - General Questions
转自 http://www.orafaq.com/wiki/Interview_Questions Tell us about yourself/ your background. What are ...
- js 去除字符串开头或者前几个字符。slice 也可以用于截取某一部分
摘草自w3 slice() 方法可从已有的数组中返回选定的元素. 语法 arrayObject.slice(start,end) 参数 描述 start 必需.规定从何处开始选取.如果是负数,那么它规 ...
- Lambda表达式中的表达式lambda和语句lambda区别
Lambda表达式可分为表达式lambda和语句lambda 表达式lambda:表达式位于 => 运算符右侧的lambda表达式称为表达式lambda (input parameters) = ...