|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
好久没来发帖了,今天心血来潮,想写表达式解析。
今天用了点时间完成了单项式解析部分。
下面代码是单项式的定义:
- #define MAXN 16
- typedef struct
- {
- char num;// 未知数符号
- int index; // 指数 按照数学中的定义,指数也应该可以是一串多项式
- }unknow_num;
- typedef struct //单项式
- {
- bool flag; //符号(+ -)
- double value; //系数
- int unknow_count;
- unknow_num ntable[MAXN]; //一个单项式最多有MAXN个字母
- }Item;
复制代码
下面是核心代码:
- double denumber(char **str)
- {
- /*
- *数字流解析函数
- */
- char * start;
- char *stream1;
- double ret;
- stream1=start=*str;
- while (isdigit(*++stream1)||*stream1=='.');
- *str=stream1;
- sscanf(start,"%lf",&ret);
- return ret;
- }
- int numberToStr(double number,char *szBuffer)
- {
- return sprintf(szBuffer,"%.3lf",number);
- }
- void StringToItem(char *szExpression,Item **pIt)
- {
- // 将单项式字符串格式化
- // 同时具备单项式化简功能
- Item * pi;
- char *expStream; // 解析流
- double value=1;// 系数
- bool flag = true; // 正负号 默认为正
- pi = new Item;
- pi->value=1;
- pi->unknow_count=-1; // 初始化为-1
- expStream = szExpression;
- if(!*pIt)
- *pIt=pi;
- while (*expStream)// 循环解析数据流
- {
- if (isdigit(*expStream))
- {
- double v;
- v=denumber(&expStream); // 解析系数
- value*=v; // 系数相乘
- }else if (*expStream=='^')
- {
- // 指数处理
- expStream++;
- if(pi->unknow_count<0)
- assert(0); // 错误处理大坑待填
- pi->ntable[pi->unknow_count].index=(int)denumber(&expStream);//解析指数
- }else if (*expStream=='+' || *expStream=='-')
- {
- // + 直接 过滤,无实际作用
- if (*expStream=='-')
- flag=!flag; // 负负得正 0.0 还记得你初中老师给你强调的符号法则么。。
- expStream++;
- }
- else
- {
- // 这里就是解析未知数字母了。
- int idx = ++pi->unknow_count;
- pi->ntable[idx].index = 1; // 默认指数为1,如果有指数,将会在解析下一个字符的时候处理。
- pi->ntable[idx].num = *expStream++;
- }
- }
- pi->flag=flag; // 符号
- pi->value = value; // 系数保存
- }
复制代码
还有一段代码,将单项式结构转换成字符串:
- void ItemToString(Item *it,char *szBuffer)
- {
- /*
- * 将单项式转换成字符串
- */
- if (!it->flag)
- sprintf(szBuffer,"-%.3lf",it->value);
- else
- sprintf(szBuffer,"%.3lf",it->value);
- for (int i=0;i<it->unknow_count+1;i++)
- {
- char b[64]={0};
- b[0] = it->ntable[i].num;
- strcat(szBuffer,b);
- if (it->ntable[i].index>1)
- {
- b[0]='^';
- numberToStr(it->ntable[i].index,&b[1]);
- strcat(szBuffer,b);
- }
- }
- }
复制代码
测试代码:
- void main()
- {
- char buf[2000];
- Item *it = NULL;
- StringToItem("--4.6x2yz",&it);
- ItemToString(it,buf);
- printf("%s",buf);
- }
复制代码
输出:9.2xyz
多项式是由单项式组成。
还可以干嘛?
1、合并同类项
2、求解N元N次方程
3、函数解析式画图 |
评分
-
参与人数 2 | 荣誉 +10 |
鱼币 +10 |
贡献 +10 |
收起
理由
|
拈花小仙
| + 5 |
+ 5 |
+ 5 |
感谢楼主无私奉献! |
康小泡
| + 5 |
+ 5 |
+ 5 |
支持楼主! |
查看全部评分
|