鱼C论坛

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

[技术交流] 单项式化简

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

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

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

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 支持楼主!

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> 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-11-23 01:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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