C语言算数表达式求值课程设计报告Word下载.docx
- 文档编号:22208613
- 上传时间:2023-02-03
- 格式:DOCX
- 页数:16
- 大小:23.03KB
C语言算数表达式求值课程设计报告Word下载.docx
《C语言算数表达式求值课程设计报告Word下载.docx》由会员分享,可在线阅读,更多相关《C语言算数表达式求值课程设计报告Word下载.docx(16页珍藏版)》请在冰豆网上搜索。
}CharNode;
//用来存储数的结点类型
typedefstructIntNode
longdoublei;
structIntNode*next;
}IntNode;
typedefstructNode
longdoublen;
structNode_ys_char*next;
}Node;
//用来存储运算符的结点类型
typedefstructNode_ys_char
structNode_ys_char*next_c;
structNode*next;
}Node_ys_char;
三详细设计
我任务是整个程序的算法设计,以及部分子函数的编写,经过其他组员编写的子函数的处理,将表达式变为一个普通的表达式,其中
数与运算符已经分开,将这个表达式的头指针传递到我所编写函数中,运算思想为:
找到最内层的一对括号,计算括号间的表达式的值,得到值之后,用这个值替换掉原始位置上的一对括号,以及其中的表
达式。
例如(((6.5-2*2.25)*2-6)/2+1.5)+3#,第一次替换后为((2*2-6)/2+1.5)+3#,第二次替换后为(-2/2+1.5/+3#,第三次替换后为0.5+3#,当没有括号时调用四则运算函数直接计算。
如果一开始输入的表达式中没有括号,则直接调用四则运算函数进行计算。
整个程序的算法思想见流程图。
函数的功能如下:
charPrecede(charx,chary)
运算符优先级判断
CharNode*CreatRegister()
输入表达式,并对特殊情况做处理
Node*StackChange(CharNode*top,intm)
将数与运算符分开,并将其他进制转化为10进制
Node*Compute(Node*p)
作只有加减乘除运算的表达式求值
Node*GetOutcome(Node*head)
求用户输入表达式的值
main()
主函数
主要部分的详细流程图)
开始
输入表达式
四程序的调试与运行结果说明
在编写只有加减乘除的表达式求值的表达式求值时,原始思想是用两个指针分别指向相邻的两个运算符,若后者大,则进行后面运算符的运算,然后指针继续后移,当再次遇到的两个运算符,前者与后者相等,则进行前面运算符的运算;
此算法思想错误,导致计算6+2*3+1#结果正确,而当计算6-2*3+1#时,却得出-1的错误结果,正确结果为+1;
这是因为先计算2*3得到6;
表达式变为6-6+1#;
接着进行6+1的运算,得到7;
当前计算循序错误,导致结果错误。
后来将程序改为先进行优先级高的运算符的运算,当优先级相等时,不计算。
指针后移,当遇到表达式结束标志时,便将指针移到表达式的头位置,此时,判断是否进行运算的条件发生变化,当前后运算符的优先级相等时,进行前面运算符的运算;
使得第一次将乘除运算符运算完,第二进行只有加减运算符的运
五课程设计总结进过调试程序能得出大多数表达式的正确结果,虽然经过了一些特殊情况表达式的输入,得出了正确结果,但不排除还有某些漏洞使得一些特殊情况的表达式不能得出正确结果,还有待进一步的测试。
特点:
本程序能进行小数、以及2进制、8进制、16进制的运算。
不足:
结果都以10进制形式表示,用户不能改变;
结果的10进制形式不能超出longdouble型数据能存储的数的范围;
进一步的设想:
将数分段存储,内存动态分配,使其能进行天文数字运算;
录入其他的运算符例如指数运算,开方运算,取余运算,解一元一次方程,解二元一次方程组。
附录:
源代码:
//用来存储字符的结点类型typedefstructCharNode{
}CharNode;
//用来存储数的结点类型typedefstructIntNode
structIntNode*next;
//用来存储数的结点类型typedefstructNode
//用来存储运算符的结点类型typedefstructNode_ys_char{
charPrecede(charx,chary)//运算符优先级判断{
inti,j;
intfrom[5][5]
={
{0,0,-1,-1,0},
{1,1,0,0,1},
{0,0,-1,-1,0}
};
//定义一个二维数组存放算术符号的优先级switch(x)
case'
+'
:
i=0;
break;
-'
i=1;
*'
i=2;
/'
i=3;
#'
i=4;
}
switch(y)
j=0;
j=1;
j=2;
j=3;
j=4;
if(from[i][j]==1)//说明运算符i的优先级比j的优先级高return'
>
'
;
if(from[i][j]==-1)return'
<
elsereturn'
='
//输入表达式,并对特殊情况做处理CharNode*CreatRegister()
CharNode*top,*p,*q,*e;
top=(CharNode*)malloc(sizeof(CharNode));
p=q=top;
scanf("
%c"
&
p->
c);
scanf("
if(q->
c=='
)
{p=(CharNode*)malloc(sizeof(CharNode));
p->
c='
0'
next=q;
top=p;
p=q;
}if(q->
('
e=(CharNode*)malloc(sizeof(CharNode));
e->
p=(CharNode*)malloc(sizeof(CharNode));
e->
next=p;
top=e;
}while(p->
c!
q=(CharNode*)malloc(sizeof(CharNode));
q->
if((p->
)&
&
(q->
))
{e=(CharNode*)malloc(sizeof(CharNode));
next=e;
p=q;
else
next=(CharNode*)malloc(sizeof(CharNode));
next->
p=p->
next;
returntop;
//将数与运算符分开,并将其他进制转化为10进制
Node*StackChange(CharNode*top,intm)
CharNode*p,*q;
longdoublex=0,y=0;
chara[10],b[10];
intn=0,i=0,JiWei,max,min=47,mark_1=0,mark_2=0,h,k=0;
Node*node,*head;
Node_ys_char*node_char;
switch(m)
case2:
JiWei=2;
max=50;
break;
case8:
JiWei=8;
max=56;
case10:
JiWei=10;
max=97;
case16:
JiWei=16;
max=103;
}p=q=top;
while(p->
c!
while((q->
c>
min)&
c<
max)||(q->
c==46))
if(q->
c==46)
mark_1=1;
q=q->
if(mark_1==0)
a[n]=q->
c;
n++;
if(mark_1==1)
b[i]=q->
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)));
node=(Node*)malloc(sizeof(Node));
//node->
n=x+y;
mark_1=0;
n=0;
if(mark_2==1)
node_char->
next=node;
node_char=(Node_ys_char*)malloc(sizeof(Node_ys_char));
node_char->
c=q->
node->
next=node_char;
next_c=NULL;
next=NULL;
next=(Node_ys_char*)malloc(sizeof(Node_ys_char));
node->
returnhead;
=min)
while(q->
{node_char->
next_c=(Node_ys_char*)malloc(sizeof(Node_ys_char));
next_c->
next;
//node->
node_char=node_char->
next_c;
x=0;
y=0;
if(mark_2==0)
head=node;
mark_2=1;
//作只有加减乘除运算的表达式求值
intmark=0;
Node*m,*n;
charmax_char,min_char;
m=n=p;
max_char=n->
n=n->
min_char=n->
if((Precede(max_char,min_char)=='
||Precede(max_char,min_char)=='
mark!
=1){
m=n;
}if(Precede(max_char,min_char)=='
||mark==1)
switch(m->
c)
m->
n=m->
n+n->
n;
n-n->
n*n->
n/n->
next=n->
n=m;
if(m->
m=n=p;
mark=1;
returnm;
//求用户输入表达式的值
Node*p,*q,*R;
Node_ys_char*m,*n,*t,*k;
n=(Node_ys_char*)malloc(sizeof(Node_ys_char));
n->
p=q=head;
while((n->
)'
m=q->
k=m;
elseif(q->
next_c==NULL)q=q->
k=q->
//t=q->
t=k;
while(m->
next_c!
=NULL)
m=m->
if(m->
q=m->
n=q->
if(n->
p=k->
R=Compute(p);
t->
next=R;
R->
GetOutcome(head);
R=Compute(head);
returnR;
main()
intm;
//进制
chara;
CharNode*top_1;
Node*top_2,*R;
printf("
\n\n"
);
printf(”■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■\n"
printf("
■
■■\n"
■■
表达式求值系统
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■\n"
本程序可分别进行2进制,8进制,10进制,16进制的加减乘除运算:
\n"
loop:
请输入进制\n"
你选的进制为:
"
%d"
m);
请输入表达式,表达式请以#结尾:
top_1=CreatRegister();
//录入表达式,并对特殊情况作处理,将头指针带回;
top_2=StackChange(top_1,m);
//进制转换,将数与运算符分开,将头指针带回;
R=GetOutcome(top_2);
得出结果
运算结果的十进制形式为:
%lf"
R->
n);
\n继续进行运算请输入y否则退出:
a);
if(a=='
y'
||a=='
Y'
gotoloop;
运行结果:
表达式宋值丢统
行呂进
4mny*曹Vtocentinu.t
件零的邃制为:
诃
怙墙入丧达尢表这武请如结屋k^<
6-5-2"
2.2S>
-2-4>
r^2*U5>
^3fl憧尊结果的十进制形式为:
3円曲
縊绫进行运算请输入事否则退岀二
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 算数 表达式 求值 课程设计 报告