1、 int fartocel(float x); int celtofar(float x); int sqroot(float x); 原程序对这几个函数分别做了如下定义: int oopcalc:add(float x, float y) val = x + y; return val; sub(float x,float y) val = x - y; return val;div(float x, float y) val = x / y;mult(float x, float y) val = x * y;fartocel(float x) int cel = (x - 32) * 5
2、) / 9; return cel;celtofar(float x) int f; f = x * 9 / 5 + 32; return f;sqroot(float x) int g = sqrt(x); return g; 首先要把程序改为可对实数进行操作,由于原程序中的操作数类型都就是整形,因此我所采用的办法就就是把“int”依次改成“float”。这就是最简单的修改办法,也就是最有效的修改办法。 在menu()函数中使用了 switch()语句来对功能进行选择,以便于操作。不同的数字则对应不同的功能。 下面所要进行的修改就就是添加四则运算功能。 首先在switch()语句中添加一个新
3、的选项,以用于作为进行四则运算的入口。然后设计一个简单的计算器类,增加四则运算功能。 简单的运算只要求有两个操作数,如原程序中的加、减、乘除。而所增加的四则运算则要求输入多个操作数,有计算机自己通过程序来解决多个数字的运算。这就要求设计的程序能够自动辨别“+”,“-”,“*”,“/”的优先级与结合性。在这里,我运用了栈的功能进行对程序的修改。 设有表达式: a+b*c-d/e= 为实现运算符的优先级,采用两个栈:一个数栈,一个运算符栈。数栈暂时存放操作数,运算符栈暂时存放运算符。从左向右扫描算术表达式,遇到操作数,压入数栈;遇到运算符,则与运算符栈栈顶的运算符比较优先级。若新的运算符优先级高或
4、运算符栈空,则压栈;否则,将栈顶运算符出栈,与数字栈出栈的两个数据进行运算,结果压入数栈,再将新运算符压栈。继续扫描,直到遇到=号,扫描结束。栈中数据继续按前面规则出栈。上面所列表达式运算过程如下图所示: (A) (B) (C) (D) (E) N O N O N O N O N O - - - - - - - - - - - - e - - - - - - - c - b*c-t1 d / d/e-t2 t2 - t1-t2-t3 - - a+t3-t4 - - b * t1 _ t1 _ t3 - - - a + a + a + a + - - 首先a入数栈,“+”入运算符栈,b入数栈,“
5、*”入运算符栈,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,即运算结果。增加四则混合运算的功能要解决的问题就是怎样使计算机能分辨出运算符的优先级。这里我想到了我们上课学的栈与链表的知识这题我用到了链栈。首先建立一个链栈的类模板与一个结点链表。templateclass Stack;这一行
6、就是类结点的声明。因为在类中也同样遵循“先声明后使用”的原则。 templateclass Node T info; Node*link; public: Node(T data=0,Node*next=NULL) info=data; link=next; friend class Stack;这一段就是结点模板的定义。Info就是结点,“Node*link”就是定义了一个结点指针。“friend class Stack”定义了类Node的友元函数Stack。“info=data;”设置第一个接点的值,“link=next;”把下一个指针的值赋给link指针。class Stack *top
7、; Stack()top=NULL; Stack(); void Push(const T &data); T Pop(); T GetTop(); void MakeEmpty(); bool IsEmpty()return top=NULL;这一段就是类模板的定义。其中“Node*top”就是栈顶指针的定义。“Stack()”就是类的构造函数,在构造函数中把栈顶指针指向NULL、“Stack()”就是析构函数。“void Push(const T &data)”就是用于压栈的函数。“T Pop()”就是用于将数据弹出栈的函数。“T GetTop()”就是用于取栈顶元素的函数。“void M
8、akeempty()”就是用于将栈中的元素清空的函数。void Stacklink;delete temp;这一段就是对清空链表的函数进行定义。设置了一个指针temp,当头结点不等于NULL就是进行while循环。循环就是将头结点的值赋给temp,再把头结点的指针指向下一个结点。Push(const T &data) top=new Node(data,top); 链栈向前生成,新压栈的结点在链栈头T Stackinfo; top=top- delete temp; return data;这就是对弹出函数的定义。“top=top-” 丢弃栈顶结点。“delete temp; ”释放栈顶结点。
9、“return data; ”返回栈顶数据。class Calculator Stack Nstack;char Ostack;public: Calculator(void); void Cal(void); /计算器运算程序 void GetTowNum(int &Num1,int&Num2); void Compute(char Opr); void Clear(void);这就是简单计算器的类定义。在这个类里,将链栈Nstack与Ostack都定义为了私有函数,还声明了一个构造函数“Calculator(void);”。“void Clear(void);”就是用于清空计算器数据的函数
10、,其中分别调用了“Nstack、MakeEmpty();”与“Ostack、MakeEmpty();“void GetTowNum(int &”定义了两个数字Num1与Num2,调用了函数“Nstack、Pop();“void Compute(char Opr);”则定义了各种运算符的计算,这些运算符就是“+”、“-”、“*”、“/”与“=”。“void Cal(void);”就是简易的计算器程序,定义如下:void Calculator:Cal() coutch1; if(ch1=0&ch1=0) strk+1=0 /数字串生成 Nstack、Push(atoi(str); /数字串转换为整
11、数后压栈 k=-1; switch(ch1) /用switch语句对不同的运算符进行定义casec 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; /再把新的运算符
12、压栈 b1=true; /此句保证乘除从左到右进行 Compute(ch1); if(ch1=z)b2=false; /当输入z时结束程序 在Menu函数中也用了switch函数来把所选菜单项与对应的函数联系起来。比如在操作时选了“3”,则对应的调用除法函数calcdiv() ,其她的运算符也就是一样。void main()oopcalc s;s、menu();Calculator p;主函数很简单,只定义了一个类oopcalc的对象s与类Calculator的对象p以及对象s的函数menu()、我的整个的计算器程序编辑思路就就是上面的内容,通过这次短学期的C+程序设计的学习,我对C+的理解与操作都有了比较大的进步。C+就是一门很有实用价值的科目,它就是所有程序设计语言中最有活力与应用最广泛的一种。它对我们的逻辑思维有很高的要求,很好的训练了我们的思维能力。这次的设计作业对我们来说也就是一次自我的检验与挑战。在此之前我们从来没有自己动手做过一个这么大的完整的程序,所以在这次的作业过程中我们遇到了很多的困难。但就是正就是这些困难让我们更加了解了C+的程序设计的精华,让我们对C+有了更正确的认识。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1