`
huobengle
  • 浏览: 854528 次
文章分类
社区版块
存档分类
最新评论

数据结构-一元多项式加减程序

 
阅读更多

//一元多项式加减程序
//程序:张建波
//时间:2005/7/12 PM:20-08

//功能:
// 1:可以计算 1+2+3-1+2-5+6+3 (加减法均可)
// 2: 可以计算 2x+3x+5x-x^2+x^3+4x^7+9
// 3: 可以进行组合计算 A=1+2+x+x^2 B=x+x^2 A+B=3+2x+2x^2
//注意:除指数不能为 负!!其余都可以输入负数

#include <iostream.h>
#include <string.h>
#include <math.h>
#include "Menu.h"
#include "Key.h"

typedef struct Polyn //项的结构
{
int e; //指数
int c; //系数
}PolynElem;

///函数申明
char *MidStr(char *p,int F1,int F2); //取字符串
int sVal(char *s); //字符串,转整形变量
int fx(char *f,PolynElem *Arg); //从表达式中 分离项
void SpPolyn(char *PolynString,int *c,int *e); //添加项:分离系数、指数
void PolynElemSub(PolynElem *s,int &nn); //合并同类项
void AddPolynElem(PolynElem *argA,int &nA,PolynElem *argB,int nB,int isADD);
//合并A,B表达式,结果存在A中
void OutPutFx(PolynElem *arg,int n); // 输出表达式
void OrderFx(PolynElem *arg,int n); //表达式排序

void Test_Fx(); //测试程序

///~

int _f2_main(){


Menu m[3];
m[1].Name="一元多项式加减";
m[2].Name="返回 ";

int t=1,ID;
while(t)
{
ShowMenu("数据结构 一元多项式加减运算",m,2);//显示菜单
cout<<"/t说明:1-每个表达式最长不超过300字符!/n";
cout<<"/t 2-表达式可以由 含x的1次项(aX、x的n次项(X^n)、常数项(c)组成/n";
cout<<"/t 3-表达式中可以包含加减运算+/-/n";
cout<<"/t 例如:8x+2x^3+3x^4+60-4x^2-9+x/n";

ID=SelectMenuID();
switch(ID)
{
case 1:Test_Fx();InitKey();break;
case 2:t=0;break;
}

}

return 0;
}

void Test_Fx(){ //测试程序

PolynElem A[600],B[300];
char f1[300],f2[300];
cout<<"请输入数学表达式A:/nF(X)=";
cin>>f1;
cout<<"请输入数学表达式B:/nF(X)=";
cin>>f2;
cout<<"/n您输入的表达式/nA="<<f1<<endl;
cout<<"B="<<f2<<endl;


int nA,nB;

///加法演示
nA=fx(f1,A); //识别表达式,并分离系数,存入数组A中
nB=fx(f2,B);
PolynElemSub(A,nA); //把f1 中 同指数的加起来
PolynElemSub(B,nB); //把f1 中 同指数的加起来
cout<<"A+B=";
AddPolynElem(A,nA,B,nB,1); //加法合并
PolynElemSub(A,nA);//计算
OrderFx(A,nA);//排序
OutPutFx(A,nA);//输出结果


///减法演示
nA=fx(f1,A); //识别表达式,并分离系数,存入数组A中
nB=fx(f2,B);
PolynElemSub(A,nA); //把f1 中 同指数的加起来
PolynElemSub(B,nB); //把f1 中 同指数的加起来
cout<<"A-B=";
AddPolynElem(A,nA,B,nB,0); //减法合并
PolynElemSub(A,nA);//计算
OrderFx(A,nA);//排序
OutPutFx(A,nA);//输出结果

}

char *MidStr(char *p,int F1,int F2){ //取字符串
char *buf=new char[F2-F1+1]; //开辟一个临时数组,保存字符
int k=0;
for(int i=F1;i<=F2;i++) //从F1开始取字符串,直至F2结束
{
buf[k++]=p[i]; //把字符串保存在 buf中
}
buf[k]='/0';
return buf; //返回buf的首地址
}

int sVal(char *s){//字符串,转整形变量

int L=strlen(s);
char *h,*p;
h=p=s;
int tmp=0;
int K=0;
int PW=0;
while(*p)
{
switch(*p){
case '0':tmp=0;break;
case '1':tmp=1;break;
case '2':tmp=2;break;
case '3':tmp=3;break;
case '4':tmp=4;break;
case '5':tmp=5;break;
case '6':tmp=6;break;
case '7':tmp=7;break;
case '8':tmp=8;break;
case '9':tmp=9;break;
}
PW=(int)(pow(10,L-1));
tmp=tmp*PW;
K=K+tmp;

tmp=0;
L--;

p++;

}

return K;

}


void SpPolyn(char *PolynString,int *c,int *e){ //添加项:分离系数、指数
char *h,*p,*fc;
int F1=0,F2=0;
char *cc,*ee;

fc=h=p=PolynString; //指向PolynString

//处理 系数 没有的情况,如果没有输入系数,则自动添加 1

if(fc[0]=='x'){
int len=strlen(fc);
char *ss=new char[len+2];
ss[0]='1';
ss[1]='/0';
ss=strcat(ss,fc);
fc=h=p=PolynString=ss; //指向新的字符数据
}

int tmp=0;

if(strchr(fc,'X')!=NULL || strchr(fc,'x')!=NULL)
{
if(strchr(fc,'^')!=NULL)
{
while(*p)
{
if(*p=='X' || *p=='x')
{
cc=MidStr(h,F1,F2-1); //系数字符串
F1=F2;
}
p++;
F2++;
}
ee=MidStr(h,F1+2,strlen(h)); //指数字符串
*c=sVal(cc);
*e=sVal(ee);
}
else
{
//一次项
tmp=sVal(MidStr(h,0,strlen(h)-2));
*c=tmp;
*e=1;

}
}
else
{
//常数项
tmp=sVal(h);//转换数字
*c=tmp; //保存系数
*e=0; //指数置为 0
}
}

int fx(char *f,PolynElem *Arg) //从表达式中 分离项
{
int F1=0,F2=0;
int i=0;
int j=0;
int n=0;

int c,e;

char *p,*h;
char *tmp;

h=p=f; //保存表达式

int Flag=1;//符号 +/-

int L1=strlen(f); //防错处理
f[L1]='#';
f[L1+1]='/0';


while(*p){
if(*p=='+' || *p=='-' || *p=='#')
{
if(j==0){ //处理首字符是 + 或 -
if(*p=='-')Flag=-1;
else
Flag=1;
j++;
p++;
continue;
}

F2=j-1;
tmp=MidStr(h,F1,F2);//取项:即取字符串

F1=j+1; //重新标记 F1

SpPolyn(tmp,&c,&e);//分离系数

Arg[n].c=c*Flag;
Arg[n].e=e;
n++;
if(*p=='-')Flag=-1;
else
Flag=1;
}
j++;
p++;
}
return n;
}

void PolynElemSub(PolynElem *s,int &nn){ //合并同类项

int i,j;
int k;
int pn=0;
int n;
n=nn;
PolynElem TMP[1000]; //临时数组,保存加法结果

for(i=0;i<n;i++) //加
for(j=i+1;j<n;j++)
{
if(s[i].e==s[j].e) //指数相等,底数相加
{
s[j].c=s[j].c+s[i].c; //两数相加
s[i].c=0; //把加数 置为0 ,表示已经加过了
}
}
for(k=0;k<n;k++) //剔出系数为0的无用项
{
if(s[k].c==0)continue;
else
{
TMP[pn].c=s[k].c;
TMP[pn].e=s[k].e;
pn++;
}
}

for(k=0;k<pn;k++) //保存结果
{
s[k].c=TMP[k].c;
s[k].e=TMP[k].e;
}

nn=pn;//返回加合后的项数

}

void AddPolynElem(PolynElem *argA,int &nA,PolynElem *argB,int nB,int isADD){//合并A,B表达式,结果存在A中
int i,j,k;
i=nA;
j=nB;

for(k=0;k<nB;k++)
{
if(isADD==1)argA[nA+k].c=argB[k].c; //加法合并
else argA[nA+k].c=-(argB[k].c); //减法合并时,需要做+ - 处理
argA[nA+k].e=argB[k].e;
}
nA=nA+nB;
}

void OutPutFx(PolynElem *arg,int n){// 输出表达式
if(n==0)cout<<"0";
for(int i=0;i<n;i++)
{
cout<<arg[i].c;
if(arg[i].e!=0)
{
cout<<"X";
if(arg[i].e!=1)cout<<"^"<<arg[i].e;
}

if(arg[i+1].c>=0 && i+1<n)cout<<"+";
}
cout<<"/n";
}

void OrderFx(PolynElem *arg,int n){//表达式排序
int i,j;
PolynElem TMP;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
if(arg[j].e<arg[i].e)
{
TMP.c=arg[i].c;
TMP.e=arg[i].e;
arg[i].c=arg[j].c;
arg[i].e=arg[j].e;
arg[j].c=TMP.c;
arg[j].e=TMP.e;

}
}

}

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics