鱼C论坛

 找回密码
 立即注册
查看: 3260|回复: 7

[技术交流] 单项式化简

[复制链接]
发表于 2015-9-5 14:48:29 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
好久没来发帖了,今天心血来潮,想写表达式解析。


今天用了点时间完成了单项式解析部分。
下面代码是单项式的定义:
  1. #define  MAXN 16
  2. typedef struct  
  3. {
  4.         char num;// 未知数符号
  5.         int index; // 指数    按照数学中的定义,指数也应该可以是一串多项式
  6. }unknow_num;
  7. typedef struct //单项式
  8. {
  9.         bool flag; //符号(+ -)
  10.         double value; //系数
  11.         int unknow_count;
  12.         unknow_num ntable[MAXN]; //一个单项式最多有MAXN个字母
  13. }Item;
复制代码


下面是核心代码:
  1. double denumber(char **str)
  2. {
  3.         /*
  4.         *数字流解析函数
  5.         */
  6.         char * start;
  7.         char *stream1;
  8.         double ret;
  9.         stream1=start=*str;
  10.         while (isdigit(*++stream1)||*stream1=='.');
  11.         *str=stream1;
  12.         sscanf(start,"%lf",&ret);
  13.         return ret;
  14. }
  15. int numberToStr(double number,char *szBuffer)
  16. {
  17.         return sprintf(szBuffer,"%.3lf",number);
  18. }
  19. void  StringToItem(char *szExpression,Item **pIt)
  20. {
  21.         // 将单项式字符串格式化
  22.         // 同时具备单项式化简功能
  23.         Item * pi;
  24.         char *expStream; // 解析流
  25.         double value=1;// 系数
  26.         bool flag = true;  // 正负号 默认为正
  27.         pi = new Item;
  28.         pi->value=1;
  29.         pi->unknow_count=-1; // 初始化为-1
  30.         expStream = szExpression;
  31.         if(!*pIt)
  32.                 *pIt=pi;
  33.         while (*expStream)// 循环解析数据流
  34.         {
  35.                 if (isdigit(*expStream))
  36.                 {
  37.                         double v;
  38.                         v=denumber(&expStream); // 解析系数
  39.                         value*=v; // 系数相乘
  40.                 }else if (*expStream=='^')
  41.                 {
  42.                         // 指数处理
  43.                         expStream++;
  44.                         if(pi->unknow_count<0)
  45.                                 assert(0); // 错误处理大坑待填
  46.                         pi->ntable[pi->unknow_count].index=(int)denumber(&expStream);//解析指数
  47.                 }else if (*expStream=='+' || *expStream=='-')
  48.                 {
  49.                         // + 直接 过滤,无实际作用
  50.                         if (*expStream=='-')
  51.                                 flag=!flag; // 负负得正 0.0 还记得你初中老师给你强调的符号法则么。。

  52.                         expStream++;
  53.                 }
  54.                 else
  55.                 {
  56.                         // 这里就是解析未知数字母了。
  57.                         int idx = ++pi->unknow_count;
  58.                         pi->ntable[idx].index = 1; // 默认指数为1,如果有指数,将会在解析下一个字符的时候处理。
  59.                         pi->ntable[idx].num = *expStream++;
  60.                 }
  61.         }
  62.         pi->flag=flag; // 符号
  63.         pi->value = value; // 系数保存
  64. }
复制代码


还有一段代码,将单项式结构转换成字符串:
  1. void ItemToString(Item *it,char *szBuffer)
  2. {
  3.         /*
  4.         * 将单项式转换成字符串
  5.         */
  6.         if (!it->flag)
  7.                 sprintf(szBuffer,"-%.3lf",it->value);
  8.         else
  9.                 sprintf(szBuffer,"%.3lf",it->value);
  10.         for (int i=0;i<it->unknow_count+1;i++)
  11.         {
  12.                 char b[64]={0};
  13.                 b[0] = it->ntable[i].num;
  14.                 strcat(szBuffer,b);
  15.                 if (it->ntable[i].index>1)
  16.                 {
  17.                         b[0]='^';
  18.                         numberToStr(it->ntable[i].index,&b[1]);
  19.                         strcat(szBuffer,b);
  20.                 }
  21.         }
  22. }
复制代码


测试代码:
  1. void main()
  2. {
  3.         char buf[2000];
  4.         Item *it = NULL;
  5.         StringToItem("--4.6x2yz",&it);
  6.         ItemToString(it,buf);
  7.         printf("%s",buf);
  8. }
复制代码

输出:9.2xyz


多项式是由单项式组成。
还可以干嘛?
1、合并同类项
2、求解N元N次方程
3、函数解析式画图

评分

参与人数 2荣誉 +10 鱼币 +10 贡献 +10 收起 理由
拈花小仙 + 5 + 5 + 5 感谢楼主无私奉献!
康小泡 + 5 + 5 + 5 支持楼主!

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-9-13 12:41:04 | 显示全部楼层
我来占个空
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-10-15 03:37:07 | 显示全部楼层
前来顶帖:sweat:
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-11-30 11:12:43 | 显示全部楼层
过来看看  一起学习 一下啊:smile:smile:smile:smile:smile
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-11-30 12:43:17 | 显示全部楼层
得活很久很久才可以做得到。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-12-5 16:28:42 From FishC Mobile | 显示全部楼层
看不懂。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-7-1 15:21:55 | 显示全部楼层
谢谢分享
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-7-12 12:39:54 | 显示全部楼层
看看,学习下,支持
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-28 01:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表