无名侠 发表于 2015-9-5 14:48:29

单项式化简

{: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、函数解析式画图

黑龍 发表于 2015-9-13 12:41:04

我来占个空{:5_95:}

waliemiao 发表于 2015-10-15 03:37:07

前来顶帖:sweat:

dps521 发表于 2015-11-30 11:12:43

过来看看一起学习 一下啊:smile:smile:smile:smile:smile

孤心傲 发表于 2015-11-30 12:43:17

得活很久很久才可以做得到。

1748504919 发表于 2015-12-5 16:28:42

看不懂。。。

ELI_ 发表于 2016-7-1 15:21:55

谢谢分享

li83126 发表于 2016-7-12 12:39:54

看看,学习下,支持
页: [1]
查看完整版本: 单项式化简