formula.cpp
上传用户:hyb6888
上传日期:2016-01-24
资源大小:5186k
文件大小:7k
源码类别:

输入法编程

开发平台:

Visual C++

  1. #include "stdafx.h"
  2. #include "windows.h"
  3. #include "math.h"
  4. #include "formula.h"
  5. stackOP::stackOP()
  6. {
  7. topOP=-1;
  8. topNum=-1;
  9. }
  10. stackOP::~stackOP()
  11. {
  12. }
  13. ///////////////////////////////////////////////////////
  14. //数据栈
  15. bool stackOP::IsNullNum()
  16. {
  17. if(topNum>=0)
  18. return false;
  19. else
  20. return true;
  21. }
  22. double stackOP::pushNum(double num)
  23. {
  24. topNum++;
  25. return stackNum[topNum]=num;
  26. }
  27. double stackOP::pushNum(char *ss)
  28. {
  29. double total1=0,total2=0,tem=1,t;
  30. int point=-1,len,i;
  31. len=strlen(ss);
  32. for(i=0;i<len;i++)
  33. {
  34. if(ss[i]=='.')
  35. point=1;
  36. else
  37. {
  38. if('0'<= ss[i] && ss[i] <='9')
  39. {
  40. if(point==-1)
  41. total1=total1*10+(ss[i]-0x30);
  42. else
  43. {   
  44. for(tem=1,t=0;t<point;t++)
  45. tem=tem*10;
  46. total2=total2+(ss[i]-0x30)/tem;
  47. point++;
  48. }
  49. }
  50. }
  51. }
  52. topNum++;
  53. return stackNum[topNum]=total1+total2;
  54. }
  55. int stackOP::popNum(double *Num)
  56. {
  57. int ret;
  58. if(topNum>=0)
  59. {    
  60. *Num=stackNum[topNum];
  61. stackNum[topNum]=0;
  62. topNum--;
  63. ret = 0;
  64. }
  65. else
  66. {
  67. //MessageBox(0,"popNum","栈空",0);
  68. ret = -1;
  69. }
  70. return ret;
  71. }
  72. int stackOP::GetTopNum(double *lnum)
  73. {
  74. int ret;
  75. if(topNum>=0)
  76. {  
  77. *lnum=stackNum[topNum];
  78. ret = 0;
  79. }
  80. else
  81. {
  82. //MessageBox(0,"栈空","栈空",0);
  83. ret = -1;
  84. }
  85. return ret;
  86. }
  87. /////////////////////////////////////////////////////////
  88. // 操作符栈
  89. // 进栈时并检查栈顶操作符,如果栈顶操作符大于本操作符,说明需要计算栈顶数据
  90. // 如果计算后还是大小本操作符就必须继续计算直到小于为止.
  91. //
  92. int stackOP::pushOP(char *ss)
  93. {
  94. int ret,flag=0;
  95. char lanOP[100]="";
  96. //空操作符最小,作为结束
  97. while(1)
  98. {
  99. ret=MycmpOP(ss);//操作符比较,返回为空说明栈已空
  100. if(ret>0)       //本操作符大于栈顶操作符
  101. if(ss[0]!=0&&ss[0]!=')') //如遇到空操作符就不再进栈.
  102. {
  103. topOP++;
  104. strcpy(stack[topOP],ss);
  105. }
  106. break;
  107. }
  108. else       //等于或小于
  109. {
  110. if(flag=caculateOP())  //非0表示不再比较后序操作符
  111. {      
  112. break;
  113. }
  114. }
  115. }
  116. //return -1 have false;
  117. return flag;
  118. }
  119. int stackOP::GetTop(char *ss)
  120. {
  121. int ret;
  122. if(topOP>=0)
  123. {  
  124. strcpy(ss,stack[topOP]);
  125. ret = 0;
  126. }
  127. else
  128. {
  129. //MessageBox(0,"栈空","栈空",0);
  130. ret = -1;
  131. }
  132. return ret;
  133. }
  134. int stackOP::GetSort(char *ss)
  135. {
  136. char lanOP[100]="";
  137. int ret=-1;
  138. strcpy(lanOP,ss);
  139. if(strcmp(lanOP,"")==0)
  140. {
  141. ret=1;
  142. }
  143. if(strcmp(lanOP,"+")==0||strcmp(lanOP,"-")==0)
  144. {
  145. ret=10;
  146. }
  147. if(strcmp(lanOP,"*")==0||strcmp(lanOP,"/")==0)
  148. {
  149. ret=20;
  150. }
  151. if(strcmp(lanOP,"^")==0)
  152. {
  153. ret=30;
  154. }
  155. if(strcmp(lanOP,"~")==0)
  156. {
  157. ret=30;
  158. }
  159. if(strcmp(lanOP,")")==0)
  160. {
  161. ret=1;
  162. }
  163. if(strcmp(lanOP,"(")==0)
  164. {
  165. ret=-40;
  166. }
  167. return ret;
  168. }
  169. //操作符比较,返回为空说明栈已空
  170. int stackOP::MycmpOP(char *ss)
  171. {
  172. int ret;
  173. if(topOP<0)
  174. ret=1;
  175. else
  176. {
  177. //为正说明当前的操作符的优先级低于栈顶
  178. ret=abs(GetSort(ss))-GetSort(stack[topOP]);
  179. //当右括号与左括号比较左括号优先
  180. if(stack[topOP][0]=='(' , ss[0]==')')
  181. ret=-1;
  182. }
  183. return ret;
  184. }
  185. //非零说明有错误发生
  186. int stackOP::popOP(char *ss)
  187. {
  188. int ret;
  189. if(topOP<0)
  190. {
  191. MessageBox(0,"popOP","0",0);
  192. ret=-1;
  193. }
  194. else
  195. {
  196. strcpy(ss,stack[topOP]);
  197. stack[topOP][0]=0;
  198. topOP--;
  199. ret=0;
  200. }
  201. return ret;
  202. }
  203. //返回非0表示不再比较后序操作符
  204. //返回-1表示有错误发生
  205. //计算的结果依然存储在栈中
  206. int stackOP::caculateOP()
  207. {
  208. double num1,num2,num3,num4,num5;
  209. char lanOP[100]="";
  210. int ret=0,i;
  211. num1=num2=num3=num4=num5=0;
  212. if(popOP(lanOP))
  213. ret=-1;
  214. if(strcmp(lanOP,"^")==0)
  215. {
  216. if(popNum(&num2) || popNum(&num1))
  217. {
  218. ret=-1;
  219. //MessageBox(0,"popNum","栈空",0);
  220. }
  221. num3=1;
  222. for(i=1;i<=num2;i++)
  223. num3=num1*num3;
  224. pushNum(num3);
  225. }
  226. if(strcmp(lanOP,"+")==0)
  227. {
  228. if(popNum(&num2) || popNum(&num1))
  229. {
  230. ret=-1;
  231. //MessageBox(0,"popNum","栈空",0);
  232. }
  233. num2=num1+num2;
  234. pushNum(num2);
  235. }
  236. if(strcmp(lanOP,"-")==0)
  237. {
  238. if(popNum(&num2) || popNum(&num1))
  239. {
  240. ret=-1;
  241. //MessageBox(0,"popNum","栈空",0);
  242. }
  243. num2=num1-num2;
  244. pushNum(num2);
  245. }
  246. if(strcmp(lanOP,"*")==0)
  247. {
  248. if(popNum(&num2) || popNum(&num1))
  249. {
  250. ret=-1;
  251. //MessageBox(0,"popNum","栈空",0);
  252. }
  253. num2=num1*num2;
  254. pushNum(num2);
  255. }
  256. if(strcmp(lanOP,"/")==0)
  257. {
  258. if(popNum(&num2) || popNum(&num1))
  259. {
  260. ret=-1;
  261. //MessageBox(0,"popNum","栈空",0);
  262. }
  263. num2=num1/num2;
  264. pushNum(num2);
  265. }
  266.     //右括号符相当于空操作符
  267. if(strcmp(lanOP,"(")==0)
  268. {
  269. ret =1;
  270. }
  271. return ret;
  272. }
  273. //返回为0说明正确
  274. int stackOP::GetResult(double *Num)
  275. {
  276. int ret=1; 
  277. if( topOP==-1 && topNum==0)
  278. {
  279. *Num=stackNum[0];
  280. ret=0; 
  281. }
  282. return ret;
  283. }
  284. ///////////////////////////////////////////////////////////
  285. formula::formula()
  286. {
  287. myflage=0;
  288. Exp=0;
  289. pExpscan=Exp;
  290. resultvar=0;
  291. }
  292. /////////////////////////////////////
  293. //  retss,收集到字符串
  294. //返回值:
  295. //-1,说明出现了错误
  296. //1,说明为数值
  297. //2,说明为操作符
  298. int formula::GetStr(char *retss)
  299. {
  300. int i,t=0,len,ret=-1;
  301. char *temss,*pp;
  302. pp=pExpscan;
  303. len=strlen(pp);
  304. temss=new char[len+1];
  305. temss[0]=0;
  306. t=0;
  307. for(i=0;i<=len;i++)
  308. {
  309. if(pp[i]=='.'||('0'<=pp[i] && pp[i]<='9'))
  310. {
  311. temss[t]=pp[i];
  312. t++;
  313. }
  314. else
  315. {
  316. temss[t]=0;
  317. if(temss[0]!=0) //说明有数字收集到temss中
  318. ret=1;   
  319. else
  320. if(pp[i]!=0)   //说明未到字符串尾部
  321. {
  322. temss[0]=pp[i];
  323. temss[1]=0;
  324. ret=2;
  325. }
  326. // t=0;
  327. // temss[0]=0;
  328. break;//得到一个串就结束。
  329. }
  330. }
  331.     strcpy(retss,temss);
  332. // MessageBox(0,retss,temss,0);
  333. pExpscan+=strlen(temss);
  334. return ret;
  335. }
  336. //-1表示有错误发生
  337. formula::caculate(char *Expression)
  338. {
  339. char ss[100]=" ";
  340. int ret;
  341. myflage=0;
  342. setformula(Expression);
  343. while((ret=GetStr(ss))!=-1)
  344. {
  345. if(1==ret)
  346. {
  347. stackop.pushNum(ss);
  348. }
  349. if(2==ret)
  350. {
  351. myflage=stackop.pushOP(ss);
  352. if(myflage==-1)
  353. break;   //表示有错误发生
  354. }
  355. }
  356. if(myflage!=-1)
  357. {
  358. myflage=stackop.pushOP("");
  359. stackop.GetResult(&resultvar);
  360. }
  361. }
  362. int formula::getformulaVar(double *Num)
  363. {
  364. stackop.GetResult(Num);
  365. return myflage;
  366. }
  367. //设置公式的表达式字符串
  368. formula::setformula(char *Expression)
  369. {
  370. int i,t=0,len;
  371. //去掉多余的空格
  372. len=strlen(Expression);
  373. if(Exp!=0)
  374. delete []Exp;
  375. Exp=new char[len+1];
  376. for(i=0;i<len;i++)
  377. {
  378. if(Expression[i]!=' ')
  379. {
  380. if(Expression[i]==-93 && Expression[i+1]==-85)
  381. {
  382. Exp[t]='+';
  383. i++;
  384. t++;
  385. continue;
  386. }
  387. if(Expression[i]==-93 && Expression[i+1]==-83)
  388. {
  389. Exp[t]='-';
  390. i++;
  391. t++;
  392. continue;
  393. }
  394. if( Expression[i]==-95&&Expression[i+1]==-63)
  395. {
  396. Exp[t]='*';
  397. t++;
  398. i++;
  399. continue;
  400. }
  401. if( Expression[i]==-95&&Expression[i+1]==-62)
  402. {
  403. Exp[t]='/';
  404. i++;
  405. t++;
  406. continue;
  407. }
  408. Exp[t]=Expression[i];
  409. t++;
  410. }
  411. }
  412. Exp[t]=0;
  413. //MessageBox(0,Exp," d",0);
  414. pExpscan=Exp;
  415. }
  416. formula::~formula()
  417. {
  418. if(Exp!=0)
  419. delete []Exp;
  420. }