数据结构-一元多项式加减程序
//一元多项式加减程序
//程序:张建波
//时间: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;
}
}
}
转载于:https://www.cnblogs.com/hgndinfo/archive/2006/02/09/2713930.html
数据结构-一元多项式加减程序相关推荐
- 一元多项式加减乘实现c/c++
一.实验题目: 一元多项式简单的计算器 1.主要功能: (1)输入并建立多项式: (2)输出多项式: (3)两个多项式相加,建立并输出和多项式: (4)两个多项式相减,建立并输出差多项式. (5)算 ...
- 数据结构 - 一元多项式相加减(C语言)
通常情况下,一元多项式可写成: an(x) = a1x^e1 + a2x^e2 + a3x^e3 + ... + amx^em (数字,m为下标),其中:pi是指数为ei的项的非零系数,0<= ...
- 一元多项式加减乘运算-数据结构-课程设计
Polyn.h #include <stdio.h> #include <stdlib.h> #include <malloc.h> typedef struct ...
- Linux加减程序编写,Makefile 入门(加减乘除实现)
Makefile 入门(加减乘除实现) 准备 使用任意Linux发行版即可,本文使用WSL Ubuntu. 开始之前,需要安装必要的工具: sudo apt install make g++ 开始 1 ...
- 数据结构(C语言)多项式加减
这是大二刚开始数据结构的平时作业,上次随便发了,没来得及写标题和内容.题目要求用链表来实现多项式的加减,其实就是设置一个两个指针进行遍历,在代码段里有一些注解,要是有不太清楚的地方可以在下面留言或是私 ...
- c语言中程序偏离,C语言中的指针加减偏移量
首先看一段程序: #include int main() { int a[5] = {1, 2, 3, 4, 5}; int* p = (int*)(&a + 1); printf(" ...
- 微信小程序购物车 数量加减功能
微信小程序购物车 数量加减功能 wxml <!-- 主容器 --> <view class="stepper"> <!-- 减号 --> < ...
- C语言(CED)编写一个程序,求两个字符之间的加减运算。
(请先看置顶博文)https://blog.csdn.net/GenuineMonster/article/details/104495419 复习C语言,不同的心境遇到了不同的问题: 问题: 编写一 ...
- android商品数量加减,微信小程序实现一个简单的商品数量加减案例
简介 这是一个用微信小程序原生代码实现的数量加减demo,主要是用于商品购物车或者商品详情修改数量使用,很简单哦~~~. 核心js方法说明addCount(增加数量) delCount (减少数量) ...
最新文章
- 懒加载中进行字典转模型
- 【实习】今日头条【抖音火山】后台开发实习生
- Kettle使用_22 维度更新 缓慢变化维 拉链表
- haroopad夜间模式与数学公式显示
- 小心DLL链接静态库时的内存错误
- 最新emlog媒体范美化版v6.3.1
- Caffe的创始人贾扬清说,算法工程师将不存在?
- python进程问题
- Activity的几种启动模式介绍
- 通过OpenOffice实现Office文档转换为PDF格式的文档
- 1、NoSQL数据库简介
- matlab产生窄带信号,窄带信号
- 玩转Python第三方库库tqdm
- Excel查找字符串下标(findsearch)
- 宇视网络视频录像机升级步骤
- append()与prepend()的区别
- 6-7 BMI计算(类与对象) (10分)
- 一文分析 Web3 尚未被主流采用的 6 个主要原因
- 自称中本聪的他被法官怒怼:你的证词毫无可信度!
- Facebook营销进阶技巧有哪些
热门文章
- 获取当前 服务 路径 .net
- HBuilder打包App方法
- 【知了堂学习笔记】数据库连接池简介,以及Eclipse中C3p0连接池的简单运用
- 权限管理系统如何分别实现对用户和角色的授权
- Hihocoder 最近公用祖先三 在线LCA
- POJ 2115 C Looooops (扩展欧几里德解同余方程 Ax = B(mod C) )
- ASP.NET典型三层架构企业级医药行业ERP系统实战(8大模块22个子系统)
- 当你遇到modifying layer that is being finalized的时候怎么办?
- 基于Carbide.C++ 的Symbian开发环境搭建
- VUE系列-Vue中组件的应用(三)