C语言_算术表达式求值_代码

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Node *node,*head;
Node_ys_char *node_char;
switch(m)
{
case 2:
JiWei=2;
max=50;
break;
case 8:
JiWei=8;
max=56;
break;
case 10:
JiWei=10;
max=97;
break;
case 16:
JiWei=16;
node_char->next=NULL;
}
p=q;
n=0;
x=0;
y=0;
if(mark_2==0)
{
head=node;
mark_2=1;
}
}
return head;
}
//作只有加减乘除运算的表达式求值
Node *Compute(Node *p)
{
int mark=0;
Node *m,*n;
char max_char,min_char;
p->next->c='#';
return top;
}
//将数与运算符分开,并将其他进制转化为10进制
Node *StackChange(CharNode *top,int m)
{
CharNode *p,*q;
long double x=0,y=0;
char a[10],b[10];
int n=0,i=0,JiWei,max,min=47,mark_1=0,mark_2=0,h,k=0;
{
m=n;
}
if(Precede(max_char,min_char)=='>'||mark==1)
{
switch(m->next->c)
{
case '+':m->n =m->n + n->n ;break;
case '-':m->n =m->n - n->n ;break;
case '*':m->n =m->n * n->n ;break;
}IntNode;
//用来存储数的结点类型
typedef struct Node
{
long double n;
struct Node_ys_char *next;
}Node;
//用来存储运算符的结点类型
typedef struct Node_ys_char
{
char c;
struct Node_ys_char *next_c;
if(m->c=='(')
{
t=k;
k=m;
}
}
q=m->next ;
}
if(q->next->c==')')
{
n=q->next;
}
}
if(n->c==')')
{
p=k->next;
q->next->c='#';
R=Compute(p);
t->next =R;
t->next_c=NULL;
R->next=n->next_c;
if(q->c=='-')
{
p=(CharNode *)malloc(sizeof(CharNode));
p->c='0';
p->next=q;
top=p;
p=q;
}
if(q->c=='(')
{
e=(CharNode *)malloc(sizeof(CharNode));
e->c='0';
p=(CharNode *)malloc(sizeof(CharNode));
m=n=p;
while(p->next->c!='#')
{
max_char=n->next->c;
n=n->next->next;
min_char=n->next->c;
if((Precede(max_char,min_char)=='<'||Precede(max_char,min_char)=='=')&&mark!=1)
};//定义一个二维数组存放算术符号的优先级
switch(x)
{
case '+':i=0;break;
case '-':i=1;break;
case '*':i=2;break;
case '/':i=3;break;
case '#':i=4;break;
}
switch(y)
{
case '+':j=0;break;
max=103;
break;
}
p=q=top;
while(p->c !='#')
{
while((q->c>min)&&(q->c<max)||(q->c==46))
{
if(q->c==46)
{
mark_1=1;
q=q->next;
}
if(mark_1==0)
{
a[n]=q->c;
q=q->next;
top_2=StackChange(top_1,m);//进制转换,将数与运算符分开,将头指针带回;
R=GetOutcome(top_2);得出结果
printf("运算结果的十进制形式为:\n");
printf("%lf",R->n);
printf("\n继续进行运算请输入y否则退出:\n");
scanf("%c",&a);
q=q->next ;
//node->next=node_char;
node_char=node_char->next_c;
node_char->next_c=NULL;
node_char->next=NULL;
}
else
{
node->next=node_char;
node_char->next_c=NULL;
p->c='+';
e->next=p;
p->next=q;
p=q;
top=e;
}
while(p->c!='#')
{
q=(CharNode *)malloc(sizeof(CharNode));
scanf("%c",&q->c);
if((p->c=='(')&&(q->c=='-'))
{
e=(CharNode *)malloc(sizeof(CharNode));
GetOutcome(head);
}
else
{
R=Compute(head);
return R;
}ຫໍສະໝຸດ Baidu
}
main()
{
int m;//进制
char a;
CharNode *top_1;
Node *top_2,*R;
printf("\n\n");
printf("███████████████████████████████████████\n");
node->next->c='#';
return head;
}
q=q->next;
if(q->c<=min)
while(q->c<=min)
{
node_char->next_c=(Node_ys_char *)malloc(sizeof(Node_ys_char));
node_char->next_c->c=q->c;
case '-':j=1;break;
case '*':j=2;break;
case '/':j=3;break;
case '#':j=4;break;
}
if(from[i][j]==1)//说明运算符i的优先级比j的优先级高
return '>';
if(from[i][j]==-1)
return '<';
case '/':m->n =m->n / n->n ;break;
}
m->next=n->next;
n=m;
}
if(m->next->c=='#')
{
m=n=p;
mark=1;
}
}
return m;
}
//求用户输入表达式的值
Node *GetOutcome(Node *head)
{
Node *p,*q,*R;
n++;
}
if(mark_1==1)
{
b[i]=q->c;
q=q->next;
i++;
}
}
for(h=n-1;h>=0;h--)
{
x=(a[n-h-1]-48)*pow(JiWei,h)+x;//
}
for(h=0;h<i;h++)
{
y=y+(b[h]-48)*pow(JiWei,(-(h+1)));//
e->c='0';
e->next=q;
p->next=e;
p=q;
}
else
{
p->next=q;
p=q;
}
}
p->c='+';
p->next=(CharNode *)malloc(sizeof(CharNode));
p->next->c='0';
p=p->next;
p->next=(CharNode *)malloc(sizeof(CharNode));
}
node=(Node *)malloc(sizeof(Node));//
node->n=x+y;
mark_1=0;
n=0;
i=0;
if(mark_2==1)
node_char->next=node;
node_char=(Node_ys_char *)malloc(sizeof(Node_ys_char));
Node_ys_char *m,*n,*t,*k;
n=(Node_ys_char *)malloc(sizeof(Node_ys_char));
n->c='(';
p=q=head;
while((n->c!=')')&&(q->next->c!='#'))
{
if(q->next->c=='(')
{
m=q->next;
源代码:
//用来存储字符的结点类型
typedef struct CharNode
{
char c;
struct CharNode *next;
}CharNode;
//用来存储数的结点类型
typedef struct IntNode
{
long double i;
struct IntNode *next;
else
return '=';
}
//输入表达式,并对特殊情况做处理
CharNode *CreatRegister()
{
CharNode *top,*p,*q,*e;
top=(CharNode *)malloc(sizeof(CharNode));
p=q=top;
scanf("%c",&p->c);
scanf("%c",&p->c);
scanf("%c",&a);
if(a=='y'||a=='Y')
goto loop;
}
printf("████\n");
printf("██表达式求值系统██\n");
printf("████\n");
printf("███████████████████████████████████████\n");
printf("本程序可分别进行2进制,8进制,10进制,16进制的加减乘除运算:\n");
k=m;
}
else if(q->next->next_c==NULL)
q=q->next->next;
else
{
m=q->next->next_c;
k=q->next;//t=q->next;
if(m->c=='(')
{
t=k;
k=m;
}
while(m->next_c!=NULL)
{
m=m->next_c;
node_char->c=q->c;
node->next=node_char;
node_char->next_c=NULL;
node_char->next=NULL;
if(q->c=='#')
{
node->next=(Node_ys_char *)malloc(sizeof(Node_ys_char));
struct Node *next;
}Node_ys_char;
char Precede(char x,char y)//运算符优先级判断
{
int i,j;
int from[5][5]
={
{0,0,-1,-1,0},
{0,0,-1,-1,0},
{1,1,0,0,1},
{1,1,0,0,1},
{0,0,-1,-1,0}
loop:
printf("...............请输入进制..............\n");
printf("你选的进制为:");
scanf("%d",&m);
printf("请输入表达式,表达式请以#结尾:\n");
top_1=CreatRegister();//录入表达式,并对特殊情况作处理,将头指针带回;
相关文档
最新文档