计算机技术基础课程设计简单的加减乘除运算Word格式.docx
- 文档编号:17586907
- 上传时间:2022-12-07
- 格式:DOCX
- 页数:13
- 大小:89.24KB
计算机技术基础课程设计简单的加减乘除运算Word格式.docx
《计算机技术基础课程设计简单的加减乘除运算Word格式.docx》由会员分享,可在线阅读,更多相关《计算机技术基础课程设计简单的加减乘除运算Word格式.docx(13页珍藏版)》请在冰豆网上搜索。
charb[100];
//也是用来记录栈顶的变量
}Op;
//同上,此栈为运算符号栈
为了方便起见,选择用指针做参数来记录数据
voidPop_St(float*e)//用指针作参数直接记录数据,方便
在连续计算中涉及到计算符号优先级别的比较,所以调用函数完成该比较.扩号的优先级别最高,其次是乘除,再次是加减,用>
=,<
来表示优先级别.
charPrecede(charp)
chare;
switch(p)
{
case'
+'
:
-'
if(Op.top!
=-1&
&
Op.b[Op.top]!
='
('
)e='
>
'
;
elsee='
<
break;
*'
/'
if(Op.b[Op.top]=='
||Op.b[Op.top]=='
)'
elsee='
break;
}
……….
然后调用函数进行计算
进入程序的核心部分,把表达式转化为逆波兰表达式.
printf("
Pleaseinputtheexpression:
"
);
gets(str);
//输入表达式
printf("
thechangeexprissionis"
while(*p!
\0'
)
if(*p>
0'
*p<
9'
)//如果输入的是数字
{
while(*p>
{
num=*p-'
+num*10;
//把用字符表示的数字转化为实际意义的数字,并且把一串字符数字变成有实际意义的数字,如‘1’‘2’‘3’‘4’这是一串字符,转化成1234,一千两百三十四
putchar(*p);
p++;
Push_St(num);
//把转化好的数字导入数据栈里
num=0;
putchar('
'
}
最后再比较读入符号的优先级别,进行计算,并返回计算函数的返回值,输出计算结果
\ntheresuleis%.f\n"
a);
三,程序流程图
四.程序清单:
#include<
stdio.h>
stdlib.h>
#defineNull0
/*也是用来记录栈顶的变量*/
/*同上,此栈为运算符号栈*/
voidPush_St(floate)
if(St.top!
=99)/*判断栈顶是否满了*/
{
St.top++;
/*没满的话栈顶向前进一个*/
St.a[St.top]=e;
/*在栈顶处放入一个数据*/
}
elseprintf("
StackisFull\n"
}/*把一个数据推入栈中*/
voidPop_St(floate)
if((St.top)!
=-1)/*如果栈不是空的话*/
e=St.a[St.top];
/*把栈顶数据导出来*/
St.top--;
/*栈顶向回退一个*/
elseprintf("
Stackisempty\n"
}/*从栈中取出数据*/
voidPush_Op(chare)/*此函数同上Push_St(floate),只不过因为是两个栈,所以需另编一个*/
if(Op.top!
=99)
Op.top++;
Op.b[Op.top]=e;
voidPop_Op(chare)/*此函数同上Pop_St(floate),只不过因为是两个栈,所以需另编一个*/
=-1)
*e=Op.b[Op.top];
Op.top--;
StackisEmpty\n"
charPrecede(charp)/*这里就是比较优先级了,如果运算符栈顶的符号的优先级比现在读取的符号的优先级高的话,就返回一个〉,反之返回一个〉。
*/
e='
if(Op.b[Op.top]=='
default:
printf("
Error\n"
returne;
floatOperate(floata,chare,floatb)/*运算*/
floatc;
switch(e)/*判断符号,选择相应的运算*/
c=a+b;
c=a-b;
c=a*b;
c=a/b;
error\n"
returnc;
voidtrans(charstr[])/*这里是把我们习惯的运算表达使转化成逆波兰表达式,这是本程序的核心。
char*p,x,theta;
floatnum=0,b,a,c;
St.top=-1;
Op.top=-1;
/*初始化两个栈,使两个栈为空*/
p=str;
/*输入表达式*/
)/*如果输入的是数字*/
/*把用字符表示的数字转化为实际意义的数字,并且把一串字符数字变成有实际意义的数字,如‘1’‘2’‘3’‘4’这是一串字符,转化成1234,一千两百三十四*/
}
/*把转化好的数字导入数据栈里*/
if(*p!
)/*如果输入的是运算符,这里默认输入的除了数字就是运算符*/
switch(Precede(*p))/*这里就是判断现在读入的运算符和运算符栈里的运算符的优先级*/
case'
/*如果返回的是〈着把现在读入的运算符导入栈*/
Push_Op(*p);
p++;
break;
/*如果返回的是=的话,直接把运算符栈顶的运算符扔了,就是直接导出不用任何有意义的变量去记录,这里的x变量是无意的,可以认为是垃圾桶*/
Pop_Op(&
x);
/*如果返回的是>
的话,把运算符栈顶的运算符导出来,再把另一个数据栈里面的栈顶以及后面的两个数据导出来,进行运算*/
theta);
Pop_St(&
b);
a);
if(theta=='
(b==0))/*当运算符号为/时且a-b=0这时候是错误所以c=-1;
{
c=-1;
break;
}
else/*如果正常就输出运算符和数据并进行运算,把运算结果再次推入数据栈*/
{
printf("
%c"
theta);
Push_St(Operate(a,theta,b));
default:
if(c!
=-1)/*这里如果c不等于-1那么把栈里面未输出的符号挨个导出运算*/
while(Op.top!
Pop_Op(&
printf("
%c"
Pop_St(&
if(theta=='
(b==0))/*注意,在导出栈里面未输出时可能也会出现除数为零的可能*/
printf("
\nerrorexpression\n"
/*这时c=-1*/
c=-1;
Push_St(Operate(a,theta,b));
if(c!
=-1)/*如果c还不是-1时才会输出结果*/
errorexprission"
voidmain()/*因为我们学的是数据结构,强调数据封装化,再主函数中应尽力减少对数据的处理,而对数据的处理应该用不同的函数去完成。
charstr[100]={'
};
trans(str);
五.主要问题的解决方法
1.主要问题的解决方法及技术关键
表达式向逆波兰表达式转化的问题,定义出一个函数来完成这个转化过程.
对符号优先级别的判断,由选择分支结构来完成.
栈的技术由定义结构体变量完成.
2.技术关键
函数调用,结构体变量的定义使用
六.设计结果说明:
1.设计优点:
此程序简单易懂,操作方便,并且有很强的实用性,
2.设计不足:
不能进行复杂的计算,应用不广.刻意避开了链表的使用,知识应用不全.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机技术 基础 课程设计 简单 加减乘除 运算