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. formula::~formula()
  293. {
  294. if(Exp!=0)
  295. delete []Exp;
  296. }
  297. /////////////////////////////////////
  298. //  retss,收集到字符串
  299. //返回值:
  300. //-1,说明出现了错误
  301. //1,说明为数值
  302. //2,说明为操作符
  303. int formula::GetStr(char *retss)
  304. {
  305. int i,t=0,len,ret=-1;
  306. char *temss,*pp;
  307. pp=pExpscan;
  308. len=strlen(pp);
  309. temss=new char[len+1];
  310. temss[0]=0;
  311. t=0;
  312. for(i=0;i<=len;i++)
  313. {
  314. if(pp[i]=='.'||('0'<=pp[i] && pp[i]<='9'))
  315. {
  316. temss[t]=pp[i];
  317. t++;
  318. }
  319. else
  320. {
  321. temss[t]=0;
  322. if(temss[0]!=0) //说明有数字收集到temss中
  323. ret=1;   
  324. else
  325. if(pp[i]!=0)   //说明未到字符串尾部
  326. {
  327. temss[0]=pp[i];
  328. temss[1]=0;
  329. ret=2;
  330. }
  331. // t=0;
  332. // temss[0]=0;
  333. break;//得到一个串就结束。
  334. }
  335. }
  336.     strcpy(retss,temss);
  337. // MessageBox(0,retss,temss,0);
  338. pExpscan+=strlen(temss);
  339. delete []temss;
  340. return ret;
  341. }
  342. //-1表示有错误发生
  343. formula::caculate(char *Expression)
  344. {
  345. char ss[100]=" ";
  346. int ret;
  347. myflage=0;
  348. setformula(Expression);
  349. while((ret=GetStr(ss))!=-1)
  350. {
  351. if(1==ret)
  352. {
  353. stackop.pushNum(ss);
  354. }
  355. if(2==ret)
  356. {
  357. myflage=stackop.pushOP(ss);
  358. if(myflage==-1)
  359. break;   //表示有错误发生
  360. }
  361. }
  362. if(myflage!=-1)
  363. {
  364. myflage=stackop.pushOP("");
  365. stackop.GetResult(&resultvar);
  366. }
  367. }
  368. int formula::getformulaVar(double *Num)
  369. {
  370. stackop.GetResult(Num);
  371. return myflage;
  372. }
  373. //设置公式的表达式字符串
  374. formula::setformula(char *Expression)
  375. {
  376. int i,t=0,len;
  377. //去掉多余的空格
  378. len=strlen(Expression);
  379. if(Exp!=0)
  380. delete []Exp;
  381. Exp=new char[len+1];
  382. for(i=0;i<len;i++)
  383. {
  384. if(Expression[i]!=' ')
  385. {
  386. if(Expression[i]==-93 && Expression[i+1]==-85)
  387. {
  388. Exp[t]='+';
  389. i++;
  390. t++;
  391. continue;
  392. }
  393. if(Expression[i]==-93 && Expression[i+1]==-83)
  394. {
  395. Exp[t]='-';
  396. i++;
  397. t++;
  398. continue;
  399. }
  400. if( Expression[i]==-95&&Expression[i+1]==-63)
  401. {
  402. Exp[t]='*';
  403. t++;
  404. i++;
  405. continue;
  406. }
  407. if( Expression[i]==-95&&Expression[i+1]==-62)
  408. {
  409. Exp[t]='/';
  410. i++;
  411. t++;
  412. continue;
  413. }
  414. Exp[t]=Expression[i];
  415. t++;
  416. }
  417. }
  418. Exp[t]=0;
  419. //MessageBox(0,Exp," d",0);
  420. pExpscan=Exp;
  421. }