计算器 c语言课程设计Word文档下载推荐.docx
《计算器 c语言课程设计Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《计算器 c语言课程设计Word文档下载推荐.docx(8页珍藏版)》请在冰豆网上搜索。
![计算器 c语言课程设计Word文档下载推荐.docx](https://file1.bdocx.com/fileroot1/2022-11/27/c6efe110-dc0d-40da-be57-d3fe1d99a360/c6efe110-dc0d-40da-be57-d3fe1d99a3601.gif)
intfartocel(floatx);
intceltofar(floatx);
intsqroot(floatx);
原程序对这几个函数分别做了如下定义:
intoopcalc:
:
add(floatx,floaty)
{
val=x+y;
returnval;
}
sub(floatx,floaty)
val=x-y;
returnval;
div(floatx,floaty)
val=x/y;
mult(floatx,floaty)
val=x*y;
fartocel(floatx)
intcel=((x-32)*5)/9;
returncel;
celtofar(floatx)
intf;
f=x*9/5+32;
returnf;
sqroot(floatx)
intg=sqrt(x);
returng;
首先要把程序改为可对实数进行操作,由于原程序中的操作数类型都就是整形,因此我所采用的办法就就是把“int”依次改成“float”。
这就是最简单的修改办法,也就是最有效的修改办法。
在menu()函数中使用了switch()语句来对功能进行选择,以便于操作。
不同的数字则对应不同的功能。
下面所要进行的修改就就是添加四则运算功能。
首先在switch()语句中添加一个新的选项,以用于作为进行四则运算的入口。
然后设计一个简单的计算器类,增加四则运算功能。
简单的运算只要求有两个操作数,如原程序中的加、减、乘除。
而所增加的四则运算则要求输入多个操作数,有计算机自己通过程序来解决多个数字的运算。
这就要求设计的程序能够自动辨别“+”,“-”,“*”,“/”的优先级与结合性。
在这里,我运用了栈的功能进行对程序的修改。
设有表达式:
a+b*c-d/e=
为实现运算符的优先级,采用两个栈:
一个数栈,一个运算符栈。
数栈暂时存放操作数,运算符栈暂时存放运算符。
从左向右扫描算术表达式,遇到操作数,压入数栈;
遇到运算符,则与运算符栈栈顶的运算符比较优先级。
若新的运算符优先级高或运算符栈空,则压栈;
否则,将栈顶运算符出栈,与数字栈出栈的两个数据进行运算,结果压入数栈,再将新运算符压栈。
继续扫描,直到遇到=号,扫描结束。
栈中数据继续按前面规则出栈。
上面所列表达式运算过程如下图所示:
(A)(B)(C)(D)(E)
NONONONONO
----------
--—>
e--->
---->
--
c-b*c->
t1d/d/e->
t2t2-t1-t2->
t3--a+t3->
t4--
b*t1_t1_t3---
a+a+a+a+--
首先a入数栈,“+”入运算符栈,b入数栈,“*”入运算符栈,c入数栈,见图(A);
再扫描到“-”号,则“*”与c、b出栈,b*c得t1压入数栈,“-”号压入运算符栈,“/’号压入运算符栈,e压入数栈,遇到=,扫描结束,见图(B);
”/“号弹出运算符栈,e、d弹出数栈,d/e得t2压数栈,见图C;
”-“号出栈,t2、t1出栈,t1-t2得t3、t4压栈,见图(D);
”+“号出栈,t3、a出栈,栈全空,a+t3得t4,即运算结果。
增加四则混合运算的功能要解决的问题就是怎样使计算机能分辨出运算符的优先级。
这里我想到了我们上课学的栈与链表的知识这题我用到了链栈。
首先建立一个链栈的类模板与一个结点链表。
template<
typenameT>
classStack;
这一行就是类结点的声明。
因为在类中也同样遵循“先声明后使用”的原则。
template<
classNode{
Tinfo;
Node<
T>
*link;
public:
Node(Tdata=0,Node<
*next=NULL)
{
info=data;
link=next;
}
friendclassStack<
;
};
这一段就是结点模板的定义。
Info就是结点,“Node<
*link”就是定义了一个结点指针。
“friendclassStack<
”定义了类Node的友元函数Stack。
“info=data;
”设置第一个接点的值,“link=next;
”把下一个指针的值赋给link指针。
classStack{
*top;
Stack(){top=NULL;
}
~Stack();
voidPush(constT&
data);
TPop();
TGetTop();
voidMakeEmpty();
boolIsEmpty(){returntop==NULL;
这一段就是类模板的定义。
其中“Node<
t>
*top”就是栈顶指针的定义。
“Stack()”就是类的构造函数,在构造函数中把栈顶指针指向NULL、“~Stack()”就是析构函数。
“voidPush(constT&
data)”就是用于压栈的函数。
“TPop()”就是用于将数据弹出栈的函数。
“TGetTop()”就是用于取栈顶元素的函数。
“voidMakeempty()”就是用于将栈中的元素清空的函数。
voidStack<
MakeEmpty(){
*temp;
while(top!
=NULL){temp=top;
top=top->
link;
deletetemp;
这一段就是对清空链表的函数进行定义。
设置了一个指针temp,当头结点不等于NULL就是进行while循环。
循环就是将头结点的值赋给temp,再把头结点的指针指向下一个结点。
Push(constT&
data){
top=newNode<
(data,top);
}
链栈向前生成,新压栈的结点在链栈头
TStack<
Pop(){
assert(!
IsEmpty());
*temp=top;
Tdata=temp->
info;
top=top->
deletetemp;
returndata;
这就是对弹出函数的定义。
“top=top->
”丢弃栈顶结点。
“deletetemp;
”释放栈顶结点。
“returndata;
”返回栈顶数据。
classCalculator{
Stack<
int>
Nstack;
char>
Ostack;
public:
Calculator(void){};
voidCal(void);
//计算器运算程序
voidGetTowNum(int&
Num1,int&
Num2);
voidCompute(charOpr);
voidClear(void);
这就是简单计算器的类定义。
在这个类里,将链栈Nstack与Ostack都定义为了私有函数,还声明了一个构造函数“Calculator(void){};
”。
“voidClear(void);
”就是用于清空计算器数据的函数,其中分别调用了“Nstack、MakeEmpty();
”与“Ostack、MakeEmpty();
“voidGetTowNum(int&
”定义了两个数字Num1与Num2,调用了函数“Nstack、Pop();
“voidCompute(charOpr);
”则定义了各种运算符的计算,这些运算符就是“+”、“-”、“*”、“/”与“=”。
“voidCal(void);
”就是简易的计算器程序,定义如下:
voidCalculator:
Cal(){
cout<
<
"
进行四则运算:
endl;
boolb1=true,b2=true;
//用布尔型定义两个变量
charch1,ch2,str[50];
//定义了三个字符型变量
intk=-1;
while(b2){//while循环
cin>
>
ch1;
if(ch1>
='
0'
&
ch1<
9'
){//判断ch1就是否满足条件
k++;
//k自增
str[k]=ch1;
//数字字符添入串中
else{
if(k>
=0){
str[k+1]='
\0'
//数字串生成
Nstack、Push(atoi(str));
//数字串转换为整数后压栈
k=-1;
}
switch(ch1){//用switch语句对不同的运算符进行定义
case'
c'
Clear();
//清空栈
break;
+'
-'
while(!
Ostack、IsEmpty()){
ch2=Ostack、Pop();
//不会有比+、-优先级低的
Compute(ch2);
Ostack、Push(ch1);
*'
/'
Ostack、IsEmpty()&
b1){
//弹出栈顶运算符
if(ch2=='
||ch2=='
)//比较优先级
Compute(ch2);
//新的优先级并不高
else{//新的优先级高
Ostack、Push(ch2);
//先把原栈中的运算符压回去
b1=false;
//再把新的运算符压栈
b1=true;
//此句保证乘除从左到右进行
Compute(ch1);
if(ch1=='
z'
)b2=false;
//当输入z时结束程序
}
在Menu函数中也用了switch函数来把所选菜单项与对应的函数联系起来。
比如在操作时选了“3”,则对应的调用除法函数calcdiv(),其她的运算符也就是一样。
voidmain()
oopcalcs;
s、menu();
Calculatorp;
主函数很简单,只定义了一个类oopcalc的对象s与类Calculator的对象p以及对象s的函数menu()、
我的整个的计算器程序编辑思路就就是上面的内容,通过这次短学期的C++程序设计的学习,我对C++的理解与操作都有了比较大的进步。
C++就是一门很有实用价值的科目,它就是所有程序设计语言中最有活力与应用最广泛的一种。
它对我们的逻辑思维有很高的要求,很好的训练了我们的思维能力。
这次的设计作业对我们来说也就是一次自我的检验与挑战。
在此之前我们从来没有自己动手做过一个这么大的完整的程序,所以在这次的作业过程中我们遇到了很多的困难。
但就是正就是这些困难让我们更加了解了C++的程序设计的精华,让我们对C++有了更正确的认识。