马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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、函数解析式画图 |