谁能帮我编一个多项式加减乘除的程序,用C或C++都成

谁能帮我编一个多项式加减乘除的程序,用C或C++都成
比如说我输入一个字符串,"3+5*10+1"然后就能把数得出来。
跟计算器似的。

#include "stdio.h"
#include "stdlib.h"
#include "string.h"
struct node{
int arr;
struct node *next;
};
typedef struct node Node;
typedef Node *Stack;
struct stacktop{
Stack top;
};
typedef struct stacktop *Top;
int jisuan(int sr1,int sr2,int sr3);
int opinion4(char *ptr,int *num);
int opinion3(char ch);
int opinion2(char ch);
int opinion(char ch);
void StackPush(int ch,Top ptop);
void StackPop(int *pi,Top ptop);
int main(void)
{

int value1;
int value2;
int value3;
char ch[100];
int R,a;
int i=0;
Top svalue;
Top sctype;
svalue=(Top)malloc(sizeof(struct stacktop));
svalue->top=NULL;
sctype=(Top)malloc(sizeof(struct stacktop));
sctype->top=NULL;
StackPush('a',sctype);
printf("请输入一个表达式:\n-->");
gets(ch);
while(ch!=NULL&&ch[i]!='\0')
{
if(opinion(ch[i])==1)//如果是操作符
{
if(opinion2(ch[i])<=opinion2(sctype->top->arr))
{
StackPop(&value1,svalue);
StackPop(&value2,svalue);
StackPop(&value3,sctype);

R=jisuan(value1,value2,value3);
StackPush(R,svalue);
}
StackPush(ch[i],sctype);
}
else if(opinion3(ch[i])==1)//不是操作符,是操作数
{
a=opinion4(ch,&i);
StackPush(a,svalue);
}
else
{
break;
}
i++;
}

while(sctype->top->arr!='a')
{
StackPop(&value1,svalue);
StackPop(&value2,svalue);
StackPop(&value3,sctype);
R=jisuan(value1,value2,value3);
StackPush(R,svalue);
}
printf("%d",R);
return 0;
}

int jisuan(int sr1,int sr2,int sr3)
{
switch((char)sr3)
{
case '+':return sr2+sr1;
case '-':return sr2-sr1;
case '*':return sr2*sr1;
case '/':return sr2/sr1;
}
}

/*将字符转换成数字*/
int opinion4(char *ptr,int *num)
{
int x;
int b=*num;
int c=0;
int d,e,f;
int brr[50];
int fang=1;
int total=0;
x=strlen(ptr);
while((opinion3(ptr[b])==1)&&b<x)
{
brr[c]=ptr[b]-48;
b++;
c++;
}

f=c-1;
if(c==1)
{
*num=b-1;
return brr[0];
}
else
{
for(d=0;d<c;d++)
{
for(e=f;e>0;e--)
fang=fang*10;
total=total+brr[d]*fang;
f--;
fang=1;
}
*num=b-1;
return total;
}
}

/*判断是否为数字*/
int opinion3(char ch)
{
if(ch>='0'&&ch<='9')
return 1;
else
return 0;
}

/*判断运算符的优先级*/
int opinion2(char ch)
{
switch(ch)
{
case '*':
case '/':return 2;
case '+':
case '-':return 1;
default:return 0;
}
}

void StackPop(int *pi,Top ptop)
{
Stack pnew;
pnew=ptop->top;
*pi=pnew->arr;
ptop->top=pnew->next;
free(pnew);
}

void StackPush(int ch,Top ptop)
{
Stack pnew;
pnew=(Stack)malloc(sizeof(Node));
if(pnew==NULL)
exit(1);
pnew->arr=ch;
if(ptop->top==NULL)
pnew->next=NULL;
else
pnew->next=ptop->top;
ptop->top=pnew;

}

/*判断是否为运算符*/
int opinion(char ch)
{
switch(ch)
{
case '+':
case '-':
case '*':
case '/': return 1;
default:
return 0;
}
}

如果有不会的加我百度HI
有什么问题可以随时问我。
yinatea@163.com
温馨提示:内容为网友见解,仅供参考
第1个回答  2009-08-02
#include<stdio.h>
#include<conio.h>
#include<math.h>
#include<stdlib.h>
#define UNKNOWN_CHAR 2
#define DIVISOR_IS_ZERO 3
#define FALSE 0
#define TRUE 1
/*定义结构,主要用于GetString函数,可以不管它*/
typedef struct string
{char str;
struct string *next;
}string;

/*函数声明*/

/*可以无限接受字符,输入一个字符就给你个空间,返回一个字符串首地址 . */
/*这个函数可以看成普通的scanf()*/
char *GetString();
/*从字符串str第*rank个字符开始分析直到遇到 ')' or ']' or '}' or '\0' . */
/*有错误就把错误代号装在*errorNum中,返回从中计算出的值*/
double GetASResultOf(char * str, int *rank, int *errorNum);
/*从字符串str第*rank个字符开始分析直到遇到不符合要求的字符,返回这个单位值.*/
/*如:str="12+sin(30)+[12+cos(60)]"
GetUnitageOf(str,0,errorNum)=12
GetUnitageOf(str,3,errorNum)=0.5
GetUnitageOf(str,11,errorNum)=12.5 */
double GetUnitageOf(char * str, int *rank, int *errorNum);
int main()
{
/*定义变量*/
double value;
int rank=0;
int errorNum=TRUE;
char * str;

/*接收字符*/
printf("counter v1.0\n");
printf("Made by PT\n");
printf("Date 2005-07-16\n\n");
printf("Please input your arithmetic:\n");
str=GetString();

/*调用处理函数,*/
value = GetASResultOf(str, &rank, &errorNum);

/*错误处理(没完善)*/
if (errorNum==TRUE) printf("The result is: %lf\n",value, rank);
else if (errorNum==UNKNOWN_CHAR) printf("char error!\n");
else if (errorNum==DIVISOR_IS_ZERO) printf("Divisor could not be 0\n");
else printf("Other error\n");

getch();
return 0;
}

/*0==[=========>无限动态字符接受函数*/
char *GetString()
{
char *CharToString(string * sHead, int arraySize);
int arraySize=0;
string *s;
string *sHead;

s = (string *)malloc(sizeof(string));
sHead = s;
s->str = getchar();
arraySize++;

while((s->str)!='\n')
{
arraySize++;
s->next=(string *)malloc(sizeof(string));
s=s->next;
s->str=getchar();
}

return CharToString(sHead, arraySize);
}

char *CharToString(string * sHead, int arraySize)
{
char *strArray;
string *s=sHead;
int i=0;
strArray = (char*)malloc(arraySize*sizeof(char));

while(i<arraySize)
{
if (s->str=='=' || s->str=='\n') break;
if (s->str!=32) strArray[i++]=s->str;
s=s->next;
}
strArray[i]='\0';
return strArray;
}
/*0==[=========> 得到一个单位的值*/
double GetUnitageOf(char * str, int *rank, int *errorNum)
{
double CharToNum(char * str, int *rank);
double value;

/*如果是数字或负号就返回这个数字*/
if ((str[*rank]>=48 && str[*rank]<=57) || (str[*rank]=='-'))
{if (str[*rank]=='-') {(*rank)++;value = (-1)*GetUnitageOf(str, rank,errorNum);}
else {value = CharToNum(str, rank);}}

/*如果是括号就用GetASResultOf取得括号里面的值并返回*/
else if (str[*rank]=='(' ||
str[*rank]=='[' ||
str[*rank]=='{' )
{(*rank)++;
value = GetASResultOf(str, rank, errorNum);}

/*返回sin(x)*/
else if (str[*rank]=='s' &&
str[(*rank)+1]=='i' &&
str[(*rank)+2]=='n')
{ (*rank)=(*rank)+3;
value = GetUnitageOf(str, rank, errorNum);
value = sin(value);
}

/*返回cos(x)*/
else if (str[*rank]=='c' &&
str[(*rank)+1]=='o' &&
str[(*rank)+2]=='s')
{*rank=*rank+3;
value = cos(GetUnitageOf(str, rank, errorNum));}

/*返回tan(x)*/
else if (str[*rank]=='t' &&
str[(*rank)+1]=='a' &&
str[(*rank)+2]=='n')
{*rank=*rank+3;
value = tan(GetUnitageOf(str, rank, errorNum));}
/*还可以加一些的,懒得加了*/

/*defult:处理错误*/
else {*errorNum = UNKNOWN_CHAR;value = 0;}

/*检查errorNum*/
if (*errorNum==TRUE){return value;}
else return FALSE;
}

/*0==[=========>这个是把字符转换成数字的函数,只在GetUnitageOf()里用*/
/*数字不能超过15个,其余的将被抹去.*/
double CharToNum(char * str, int *rank)
{
int j=0;
double value=0;

while((str[*rank]>=48 && str[*rank]<=57) || (str[*rank]==46))
{
if (str[*rank]!='.')
{if ((j++)<=15) {value = value*10+(str[*rank]-48);}}
else
{if (j<=15)
{
for ((*rank)++,j=1; (str[*rank]>=48 && str[*rank]<=57 && str[*rank]!='\0'); (*rank)++, j++)
{value = value+(str[*rank]-48)*pow(0.1,j);}
return value;
}
}

(*rank)++;
}
return value;
}
/*0==[=========>这个函数写的太复杂了,实在不好作解释,反正是在GetPDResultOf
函数和GetUnitageOf函数之间转啊转的*/
/*简单地说就是把str中第一个加减号前的式子算出来放在value变量中.再用函数
GetPDResultOf算出直到二个加减号前的式子然后与value相加或相减放在
变量value中,以此类推,直到遇上 ')' or ']' or '}' or '\0' */
double GetASResultOf(char * str, int *rank, int *errorNum)
{
double GetPDResultOf(char * str, int *rank, int *errorNum);
double value;
double dwIf_Zero;

/*遇上 ')' or ']' or '}' or '\0' 就返回*/
while (str[*rank]!=')' &&
str[*rank]!=']' &&
str[*rank]!='}' &&
str[*rank]!='\0')
{
if ((str[*rank]>=48 && str[*rank]<=57) ||
str[*rank]=='s' ||
str[*rank]=='c' ||
str[*rank]=='t')
{
if ((str[*rank-1]==')' ||
str[*rank-1]==']' ||
str[*rank-1]=='}') &&
*rank!=0)
{value = value*GetUnitageOf(str, rank, errorNum);}
else
{value = GetUnitageOf(str, rank, errorNum);}
}

else if (str[*rank]=='+')
{if (str[*rank-1]!= '(' &&
str[*rank-1]!= '[' &&
str[*rank-1]!= '{' && (*rank)!=0 )
{(*rank)++; value = value + GetPDResultOf(str, rank, errorNum);}
else {*errorNum=UNKNOWN_CHAR;return 0;}}

else if (str[*rank]=='-')
{if (str[*rank-1]!= '(' &&
str[*rank-1]!= '[' &&
str[*rank-1]!= '{' && (*rank)!=0 )
{(*rank)++; value = value - GetPDResultOf(str, rank, errorNum);}
else {value = GetUnitageOf(str, rank, errorNum);}}

else if (str[*rank]=='*')
{if (str[*rank-1]!= '(' &&
str[*rank-1]!= '[' &&
str[*rank-1]!= '{' && (*rank)!=0 )
{(*rank)++; value = value * GetUnitageOf(str, rank, errorNum);}
else {*errorNum=UNKNOWN_CHAR;return 0;}}

else if (str[*rank]=='/')
{if (str[*rank-1]!= '(' &&
str[*rank-1]!= '[' &&
str[*rank-1]!= '{' && (*rank)!=0 )
{(*rank)++;
dwIf_Zero=GetUnitageOf(str, rank, errorNum);
if (dwIf_Zero==0) {*errorNum=DIVISOR_IS_ZERO;return 0;}
else value = value /dwIf_Zero;}
else {*errorNum=UNKNOWN_CHAR;return 0;}}

else if (str[*rank]== '(' ||
str[*rank]== '[' ||
str[*rank]== '{' )
{if (str[*rank-1]!= '(' &&
str[*rank-1]!= '[' &&
str[*rank-1]!= '{' && (*rank)!=0 )
{(*rank)++; value = value*GetASResultOf(str, rank, errorNum);}
else {value = GetUnitageOf(str, rank, errorNum);}}

else {*errorNum=UNKNOWN_CHAR;return FALSE;}

if (*errorNum!=TRUE) return FALSE;
}
(*rank)++;
return value;
}

double GetPDResultOf(char * str, int *rank, int *errorNum)
{
double value;
double dwIf_Zero;
value = GetUnitageOf(str, rank, errorNum);
if (str[*rank]=='\0') return value;

while (str[*rank]!='+' &&
str[*rank]!='-' &&
str[*rank]!=')' &&
str[*rank]!=']' &&
str[*rank]!='}')
{
if (str[*rank]=='*')
value = value * GetUnitageOf(str, rank, errorNum);
else if (str[*rank]=='/')
{
dwIf_Zero= GetUnitageOf(str, rank, errorNum);
if (dwIf_Zero=0) {*errorNum=DIVISOR_IS_ZERO;return 0;}
else value = value /dwIf_Zero;
}
else if (str[*rank]=='(' ||
str[*rank]=='[' ||
str[*rank]=='{')
{(*rank)++;
value = value * GetUnitageOf(str, rank, errorNum);}
else {*errorNum=UNKNOWN_CHAR;return FALSE;}
if (*errorNum!=TRUE) return FALSE;
}

return value;
}
第2个回答  2009-08-02
楼上的程序我在哪看过,不复杂,楼主好好研究
第3个回答  2009-08-02
这个用两个栈就可以了

用c\/c++写可以实现加减乘除的程序并且数值和运算字符由我自由赋予
public:int coef; \/\/多项式系数 int exp; \/\/多项式指数 \/\/初始化项的系数和指数 term( int c=0,int e=0):coef(c),exp(e){} };我有源代码,可以找我。

c++编程 多项式的乘法
non=c->a; c->a=(m->next->a); (m->next->a)=non; } m=m->next; } m=c; m=m->next; } m=tem; return m;}求乘法的实现,方法不限,可以不用我的实现方法,急求,谢谢 展开  我来答 3个回答 #热议# 生活中有哪些成瘾食物?徐志伟 2015-11-13 · 知道合伙人制造业行家 徐志伟 知...

C++ 输出多项式及多项式相乘
我这有一个实现加减乘除的多项式程序,自己写的,另外输入形式为:-2x^3 + 5x^2 + 3x + 4 即可。其中百度的现实问题,有一个@a什么的 应该是& COPYA, & COPYB去掉中间空格 include<stdio.h> include<stdlib.h> include<ctype.h> typedef struct _POLYNODE{ int coef;\/\/系数 int exp;\/\/...

会C语言的朋友帮个忙啊 帮我编个小程序
5.设计方案并提交应用程序的源程序清单。6.心得体会。四、参考题目案例一:从键盘上输入一个数据,给出转化要求,通过程序实现可以供用户选择把这个数据转化成2进制,8进制,16进制的形式。案例二:采用c语言的结构体类型实现对某个具体班级的学籍管理系统的实现。包括可以录入数据,可以修改数据,可以进行查找,可以统计总分,...

用C++写出以下程序一元多项式简单的计算器
我前段时间编了一元二次方程的解,挺详细,给你吧!!希望能帮你!!include<iostream.h> include<stdio.h> include<math.h> void main(){ float a,b,c,s,x1,x2;double t;cout<<"请输入三个数字:a,b,c"<<endl;cin>>a>>b>>c;cout<<"方程"<<a<<"x*x"<<"+"<<c<<"x"<<...

数据结构要求做个多项式计算器 用C语言 哪位高人有代码谢谢
一、问题描述 在控制台下实现一个一元稀疏多项式的简易计算器。二、基本要求 该计算器的基本功能如下:(1) 多项式输入,输入格式如下:<系数><空格><指数><回车>以0<空格>0结束输入。例如多项式:-3<空格>8<回车>6<空格>3<回车>-18<空格>0<回车>0<空格>0<回车>注意:输入可以不按多项式次数由高向低按顺序...

帮忙用Microsoft Visual C++ 6.0编写一个程序,题目是:一元多项式...
int coef; \/\/多项式的系数 int exp; \/\/指数 struct polynode *next;}node;node *create() \/\/用尾插法建立一元多项式的链表 { node *h,*r,*s;int c,e;h=(node*)malloc(sizeof(node));r=h;printf("coef:");scanf("%d",&c);printf("exp: ");scanf("%d",&e);while(c!=0) \/...

编写一元多项式的计算器程序
Link MakeNode(float c, int e){ Link p;p=(Link)malloc(sizeof(LNode));p->coef=c; p->expn=e; p->next=NULL;return p;} void InitPoly(LinkList &P){ P=MakeNode(0,-1);} void Create(LinkList &P){ Link rear;float c; int e;InitPoly(P);rear=P;printf("Input coef...

如何用c语言编写一个多项式的输入与建立并输出
\/\/ 很简单,类里增加一个公开变量 DV public class BF_CheckUpdate { public DataGridView DV; 增加变量,用于引用控件 pubic BF_CheckUpdate(DataGridView dv){ this.DV=dv;} \/\/ 构造时传入datagridview控件 \/\/...private static void CheckUpdatetimer_Elapsed(object sender, System.Ti...

一元多项式简单的计算器 用C实现 不要C++
(2)输出多项式;(3)两个多项式相加,建立并输出和多项式;(4)两个多项式相减,建立并输出差多项式。(5)算法的时间复杂度、另外可以提出算法的改进方法 实现提示:可选择带头结点的单向循环链表或单链表存储多项式,头结点可存放多项式的参数,如项数等。2.要求:一元多项式简单计算器的基本功能 参考资料:...

相似回答