计算器 c语言课程设计报告.docx

上传人:b****2 文档编号:1961052 上传时间:2022-10-25 格式:DOCX 页数:8 大小:18.31KB
下载 相关 举报
计算器 c语言课程设计报告.docx_第1页
第1页 / 共8页
计算器 c语言课程设计报告.docx_第2页
第2页 / 共8页
计算器 c语言课程设计报告.docx_第3页
第3页 / 共8页
计算器 c语言课程设计报告.docx_第4页
第4页 / 共8页
计算器 c语言课程设计报告.docx_第5页
第5页 / 共8页
点击查看更多>>
下载资源
资源描述

计算器 c语言课程设计报告.docx

《计算器 c语言课程设计报告.docx》由会员分享,可在线阅读,更多相关《计算器 c语言课程设计报告.docx(8页珍藏版)》请在冰豆网上搜索。

计算器 c语言课程设计报告.docx

计算器c语言课程设计报告

设计分析:

我做的是一个计算器程序,属于B级。

题目要求如下:

1、完善计算器程序,改为可对实数操作。

2、完善程序,改为多个操作数根本四那么运算,遇到z为止。

3、增加函数,完成四那么混合运算,增加相应的主菜单项选择项

4、添加语句,使四那么运算具有测试功能。

5、可扩大其功能。

所给的计算器源程序中已有根本的加、减、乘、除和开方运算,我所要做的就是添加一个可以进展四那么混合运算功能的类。

本程序所要用到的头文件有如下几种:

process,iostream,conio,stdlib,math和assert.

原程序中已经定义了加、减、乘、除和开方的运算,它用了类oopcalc将这几个根本运算进展封装。

类中包含以下几个函数:

voidcalcadd();

voidcalcsub();

voidcalcdiv();

voidcalcmult();

voidcalcfartocel();

voidcalcceltofar();

voidcalcsroot();

voidexitprog();

voidmenu();

voidbadinput();

每个函数的参数形式如下:

intadd(floatx,floaty);

intsub(floatx,floaty);

intdiv(floatx,floaty);

intmult(floatx,floaty);

intfartocel(floatx);

intceltofar(floatx);

intsqroot(floatx);

原程序对这几个函数分别做了如下定义:

intoopcalc:

:

add(floatx,floaty)

{

val=x+y;

returnval;

}

intoopcalc:

:

sub(floatx,floaty)

{

val=x-y;

returnval;

}

intoopcalc:

:

div(floatx,floaty)

{

val=x/y;

returnval;

}

intoopcalc:

:

mult(floatx,floaty)

{

val=x*y;

returnval;

}

intoopcalc:

:

fartocel(floatx)

{

intcel=((x-32)*5)/9;

returncel;

}

intoopcalc:

:

celtofar(floatx)

{

intf;

f=x*9/5+32;

returnf;

}

intoopcalc:

:

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,即运算结果。

增加四那么混合运算的功能要解决的问题是怎样使计算机能分辨出运算符的优先级。

这里我想到了我们上课学的栈和链表的知识这题我用到了链栈。

首先建立一个链栈的类模板和一个结点链表。

templateclassStack;

这一行是类结点的声明。

因为在类中也同样遵循“先声明后使用〞的原那么。

templateclassNode{

Tinfo;

Node*link;

public:

Node(Tdata=0,Node*next=NULL)

{

info=data;

link=next;

}

friendclassStack;

};

这一段是结点模板的定义。

Info是结点,“Node*link〞是定义了一个结点指针。

“friendclassStack;〞定义了类Node的友元函数Stack。

“info=data;〞设置第一个接点的值,“link=next;〞把下一个指针的值赋给link指针。

templateclassStack{

Node*top;

public:

Stack(){top=NULL;}

~Stack();

voidPush(constT&data);

TPop();

TGetTop();

voidMakeEmpty();

boolIsEmpty(){returntop==NULL;}

};

这一段是类模板的定义。

其中“Node*top〞是栈顶指针的定义。

“Stack()〞是类的构造函数,在构造函数中把栈顶指针指向NULL.“~Stack()〞是析构函数。

“voidPush(constT&data)〞是用于压栈的函数。

“TPop〔〕〞是用于将数据弹出栈的函数。

“TGetTop()〞是用于取栈顶元素的函数。

“voidMakeempty()〞是用于将栈中的元素清空的函数。

templatevoidStack:

:

MakeEmpty(){

Node*temp;

while(top!

=NULL){temp=top;top=top->link;deletetemp;}

}

这一段是对清空链表的函数进展定义。

设置了一个指针temp,当头结点不等于NULL是进展while循环。

循环是将头结点的值赋给temp,再把头结点的指针指向下一个结点。

templatevoidStack:

:

Push(constT&data){

top=newNode(data,top);

}

链栈向前生成,新压栈的结点在链栈头

templateTStack:

:

Pop(){

assert(!

IsEmpty());

Node*temp=top;

Tdata=temp->info;

top=top->link;

deletetemp;

returndata;

}

这是对弹出函数的定义。

“top=top->link;〞丢弃栈顶结点。

“deletetemp;〞释放栈顶结点。

“returndata;〞返回栈顶数据。

classCalculator{

StackNstack;

StackOstack;

public:

Calculator(void){};

voidCal(void);//计算器运算程序

voidGetTowNum(int&Num1,int&Num2);

voidpute(charOpr);

voidClear(void);

};

这是简单计算器的类定义。

在这个类里,将链栈Nstack和Ostack都定义为了私有函数,还声明了一个构造函数“Calculator(void){};〞。

“voidClear(void);〞是用于清空计算器数据的函数,其中分别调用了“Nstack.MakeEmpty();〞和“Ostack.MakeEmpty();〞。

“voidGetTowNum(int&Num1,int&Num2);〞定义了两个数字Num1和Num2,调用了函数“Nstack.Pop();〞。

“voidpute(charOpr);〞那么定义了各种运算符的计算,这些运算符是“+〞、“-〞、“*〞、“/〞和“=〞。

“voidCal(void);〞是简易的计算器程序,定义如下:

voidCalculator:

:

Cal(){

cout<<"进展四那么运算:

"<

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;

case'+':

case'-':

while(!

Ostack.IsEmpty()){

ch2=Ostack.Pop();//不会有比+、-优先级低的

pute(ch2);

}

Ostack.Push(ch1);

break;

case'*':

case'/':

while(!

Ostack.IsEmpty()&&b1){

ch2=Osta

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 农林牧渔 > 林学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1