单项式化简
{:9_239:} 好久没来发帖了,今天心血来潮,想写表达式解析。今天用了点时间完成了单项式解析部分。
下面代码是单项式的定义:
#defineMAXN 16
typedef struct
{
char num;// 未知数符号
int index; // 指数 按照数学中的定义,指数也应该可以是一串多项式
}unknow_num;
typedef struct //单项式
{
bool flag; //符号(+ -)
double value; //系数
int unknow_count;
unknow_num ntable; //一个单项式最多有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);
}
voidStringToItem(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.index=(int)denumber(&expStream);//解析指数
}else if (*expStream=='+' || *expStream=='-')
{
// + 直接 过滤,无实际作用
if (*expStream=='-')
flag=!flag; // 负负得正 0.0 还记得你初中老师给你强调的符号法则么。。
expStream++;
}
else
{
// 这里就是解析未知数字母了。
int idx = ++pi->unknow_count;
pi->ntable.index = 1; // 默认指数为1,如果有指数,将会在解析下一个字符的时候处理。
pi->ntable.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={0};
b = it->ntable.num;
strcat(szBuffer,b);
if (it->ntable.index>1)
{
b='^';
numberToStr(it->ntable.index,&b);
strcat(szBuffer,b);
}
}
}
测试代码:
void main()
{
char buf;
Item *it = NULL;
StringToItem("--4.6x2yz",&it);
ItemToString(it,buf);
printf("%s",buf);
}
输出:9.2xyz
多项式是由单项式组成。
还可以干嘛?
1、合并同类项
2、求解N元N次方程
3、函数解析式画图 我来占个空{:5_95:} 前来顶帖:sweat: 过来看看一起学习 一下啊:smile:smile:smile:smile:smile 得活很久很久才可以做得到。 看不懂。。。 谢谢分享 看看,学习下,支持
页:
[1]