模拟计算器实验报告

课程设计报告

课程设计题目:模拟机算器程序       

   

           

           

                      20XX 11 27

东华理工大学

                  课程设计评分表

 学生姓名: XXX          班级:  XXX           学号:21

   课程设计题目:模拟机算器程序

目   录

一. 课程设计题目

        ..................................................................................

二. 问题分析

      1.算法分析 .....................................................................

         2.流程图 ........................................................................

三. 算法设计

    1.算法描述 .....................................................................

    2.系统类图 .....................................................................

      3.属性和方法定义 ..............................................................

四. 运行实例

          ................................................................................

五. 经验与体会

 ................................................................................

六. 参考文献

 ................................................................................

七.源代码

 ................................................................................

 一:课程设计题目

                 模拟计算器程序

    问题描述

设计一个程序来模拟一个简单的手持计算器。程序支持算术运算+、-、*、/、=、以及C(清除)、A(全清除)操作。

基本要求

程序运行时,显示一个窗口,等待用户输入,用户可以从键盘输入要计算的表达式,输入的表达式显示在窗口中,用户键入’=’ 符号后,窗口显示出结果。

测试数据

程序输入不少于5种不同的表达式进行测试。

实现提示

可定义一个计算器类,该类包括两个组件对象,一个计算引擎和一个用户接口,用户接口对象处理接受的键盘输入信息,并显示答案,计算引擎对象对给出的数据执行相应操作,并存储操作的结果。

选作内容

如果用户输入的表达式不合法,可以判别出来并给出相应的错误提示。

二.问题的分析

此程序设计主要运用了栈,利用栈后进先出的原理,建立两个栈,操作数栈和操作符栈,先将数据和运算符分别压入这两个栈,判断栈内和栈外运算符的优先级,依据运算符的优先级判断是应再次压入运算符,还是将数据和运算符弹出栈,在栈外进行运算,再将所得的结果压入栈,继续进行与计算,直至运算结束。

例如;计算5/2+1-2*3=

模拟计算器实验报告

模拟计算器实验报告

 结果分析:

设置两个栈,运算数栈和运算符栈,然后,自左向右扫描表达式,遇操作数进操作数栈,遇

操作符栈则与操作符栈顶运算符比较:若当前操作符大于操作符栈顶,则当前操作符进入操作符栈;若当前操作符小于等于运算符栈顶,次栈顶出栈,同时操作数栈顶也出栈,形成一个运算,并将运算的结果压入数字栈。

模拟计算器实验报告

三.  算法的设计

1、  创建一个calculator类,将计算器需要用到的函数都封装起来,形成一个整体。

2、  设计成员函数及数据。

首先定义两个私有的结构体save1和save2分别用来存放数字和运算符,在结构体内定义整型的栈顶元素top,和存放数据及运算符的数组double n[MAX]和char n[MAX]。

定义了一个空的构造函数calculator()。

函数bool stack1empty(save1 s),bool stack2empty(save2 s)分别判断数字栈和字符栈是否为空,若栈顶为-1则空则返回1表示真,否则返回0表示假。

函数void push1(save1 &s,double num);,void push2(save2 &s,char op);分别将数字和字符压入栈。若所存储的内容已经数组的最大限度,则显示“栈已满”,否则将数字和字符压入栈顶。

函数void pop1(save1 &s,double &num),void pop2(save2 &s,char &op)分别是将栈内的数字和字符弹栈,存储在num和op中。首先判断栈是否为空,若空则显示“栈为空”,否则将栈顶元素分别赋值给num和op。

函数int in(char op),int out(char op)分别判断栈内和栈外运算符的优先级。

   在栈内,“+”“—”返回2,“*”“/”返回4,在栈外“+”“—”返回1,“*”“/”返回3,当遇到“+” 或“—”和“*”或“/”同时存在时,“*”“/”的优先级高于“+”“—”,首选“*”“/”运算。当遇到同级运算符时在时,先进行栈内运算。通过返回值的大小选择进行在哪里的哪种运算。

函数void count(double a,char op,double b)是用来进行计算的,并将计算的结果压入栈。以便下一次的运算。

函数void cal ()是最主要的操作函数。首先提示输入表达式,并在表达式之后加上=,然后输入表达式。分别清空存放数字和字符的栈。总体用一个while语句,以“=”结束。由于是用char定义的表达式expression[MAX],所以要将里面的数字提取出来,转化成int或float类型,利用库函数isdigit()查找,若读入的字符为数字,则继续判断下一个字符,直到下个字符不是数字或者不是小数点,即可保证该操作数是完整的小数,然后将该数入操作数栈。库函数atof()将char类型进行转换。当栈内和栈外同时都有运算符时,利用int in(char op) 和 int out(char op)函数根据其返回值的大小判断运算符的优先级,判断是将栈外的运算符压入栈还是将站内的数据及运算符弹出栈进行运算。若为后者,运算完后再将所得的结果压入栈顶,再次进行判断,直至栈顶为空,运算结束。

主函数void main(),首先提示此程序设计者的信息。然后进行正式的计算环节,将整个主函数分为part1 和part2两部分,运用goto语句使程序在执行的流程可以跳转到part1部分,进行多次运算。定义calculator mycal,进行运算。运算结束提示是否继续进行运算,输入选择y(是)  n(否)  A(退出)

利用while语句,当输入A时结束运算。当输入“y”时,运用system("cls")对前面的运算进行全清除,然后利用goto语句跳转到part1再次进行计算。当输入“n”时停止运算,输出“谢谢使用!”程序运行结束。

模拟计算器实验报告

属性和方法定义

用户手册

程序运行时,首先显示此程序设计者的信息。

提示欢迎使用计算机请输入表达式(输完之后请加=),然后输入所要进行计算的表达式,进行计算。计算结束后提示:继续计算吗?,输入y表示同意继续计算,输入n表示结束计算,并显示谢谢使用!输入A时退出,选择你所需的形式,进行计算。

选择继续运算,跳转到part1部分。

四.   运行实例

       

五.   经验与体会

此次c++课程设计,在指导教师的精心教导下,我们学会了如何用C++编写一个简单的应用程序。首先要对程序的设计要求有一个比较明确的认识,然后系统分析与系统设计,最后是代码设计与调试。程序实现上,设计了简单的查询界面,将各个功能集中出来按照程序编写原则,便于查询。根据C++课程所学的概念、理论和方法,按照C++程序设计的基本步骤,设计出一个适当规模的程序;进一步加深对C++语言的理解和掌握。理论联系实际,加深和巩固所学的理论知识,提高实践能力和计算机的综合运用能力。我们编写程序的过程是辛苦与快乐的,程序的编写原则很重要,只要我们在编程,就必须不断改进,才能更好提高编程能力。

课程设计是培养学生综合运用所学知识、发现、提出、分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程.随着科学技术发展的日新日异,C++已经成为当今计算机应用中空前活跃的领域, 在生活和学习中可以说得是无处不在。因此作为二十一世纪的大学来说掌握C++软件开发技术是十分重要的。

六.   参考资料

[1] 郑莉 等编著《C++语言程序设计(第四版)》     北京:  清华大学出版社

[2] 李丽娟 主编《C语言程序设计教程(第二版)》   北京:  人民邮电出版社

源程序:

#include

#include

#include

 Const  MAX=1000;

class calculator

{

private:

struct save1    //存储数字

{

double n[MAX];

int top;

}

stack1;

struct save2   //存储运算符

{

char n[MAX];

int top;

}

stack2;

public:

calculator(){};  //空的构造函数

bool stack1empty(save1 s);

bool stack2empty(save2 s);

void push1(save1 &s,double num);

void push2(save2 &s,char op);

void pop1(save1 &s,double &num);

void pop2(save2 &s,char &op);

int in(char op);

int out(char op);

void count(double a,char op,double b);

void cal();

};

bool calculator::stack1empty(save1 s) //判断数字栈是否为空

{

if(s.top==-1)

return 1;

else return 0;

}

bool calculator::stack2empty(save2 s)//判断运算符栈是否为空

{

if(s.top==-1)

return 1;

else return 0;

}

void calculator::push1(save1 &s,double num)//将数据压入数字栈

{

if(s.top==MAX-1)

{cout<<"栈已满 ";

}

else

{

s.top++;

s.n[s.top]=num;

}

}

void calculator::push2(save2 &s,char op)//将运算符压入运算符栈

{

if(s.top==MAX-1)

{cout<<"栈已满";

}

else

{

s.top++;

s.n[s.top]=op;

}

}

void calculator::pop1(save1 &s,double &num)//将栈顶的数据元素取出,存放在num中

{

if(s.top==-1)

cout<<"栈为空"<

else

{

num=s.n[s.top];

s.top--;

}

}

void calculator::pop2(save2 &s,char &op)//将栈顶的运算符取出,存放在op中

{

if(s.top==-1)

cout<<"栈为空"<

else

{

op=s.n[s.top];

s.top--;

}

}

int calculator::in(char op)//在栈内优先级的判断

{

if(op=='-'||op=='+')

return 2;

else if(op=='*'||op=='/')

return 4;

else return -1;

}

int calculator::out(char op)//早栈外优先级的判断

{

if(op=='-'||op=='+')

return 1;

else if(op=='*'||op=='/')

return 3;

else return -1;

}

void calculator::count(double a,char op,double b)//进行计算并将所得的结果压入栈顶

{

double sum;

switch(op)

{

case '+':sum=a+b;break;

case '-':sum=a-b;break;

case '*':sum=a*b;break;

case '/':sum=a/b;break;

default:break;

}

push1(stack1,sum);

}

void calculator::cal(void)

{

int i=0,j;

double a,b,c;

char expression[MAX],operate,temp[20];

cout<<"请输入表达式(输完之后请加=):";

cin>>expression;

stack1.top=-1;//清空数字栈

stack2.top=-1;//清空运算符栈

while(expression[i]!='=')//以=号结尾

{

if(isdigit(expression[i]))/*若读入的字符为数字,则继续判断下一个字符,直到下个字符不是数字或者不是小数点,即可保证该操作数是完整的小数,然后将该数入操作数栈*/

{

j=0;

while(isdigit(expression[i])||expression[i]

=='.')

{

temp[j++]=expression[i];

i++;

}

temp[j]='\0';

c=atof(temp);//char类型进行转换

push1(stack1,c);

}

else

{

if(expression[i]=='-'||expression[i]

=='+'||expression[i]=='*'||expression[i]

=='/')//若读入的字符为运算符的情况

{

        

if(in(stack2.n[stack2.top])

[i])||stack2empty(stack2))//读入的运算符与运算符栈顶元素相比,并进行相应的操作

{

push2(stack2,expression[i]);

i++;

}

else

{

pop1(stack1,a);

pop1(stack1,b);

pop2(stack2,operate);

count(b,operate,a);//先进后出原则

}

         }

}

}

while(stack2.top!=-1)//读入结束后,继续进行操作,直到运算符栈为空

{

pop1(stack1,a);

pop1(stack1,b);

pop2(stack2,operate);

count(b,operate,a);

}

cout<

}

int main(){

                  part1:

                  cout<<"\t\t*******************************************"<

                  cout<<"\t\t*******************************************"<

                  cout<<"\t\t***                                     ***"<

                  cout<<"\t\t***            模拟计算器程序           ***"<

                  cout<<"\t\t***                                     ***"<

                  cout<<"\t\t***          制作人:柯尊国             ***"<

                  cout<<"\t\t***          专  业:10网络工程         ***"<

                  cout<<"\t\t***          学  号:1021130321         ***"<

                  cout<<"\t\t***          导  师:高永平             ***"<

                  cout<<"\t\t***        制作时间:2011.11.23         ***"<

                  cout<<"\t\t***                                     ***"<

                  cout<<"\t\t*******************************************"<

                  cout<<"\t\t*******************************************"<

                  cout<

                 

         cout<<"-------------欢迎使用本系统------------"<

         calculator cp;

         cp.cal();

         cout<<"继续计算吗?"<

         cout<<"Y(是),N(否),A(退出)"<

         char choice;

         cout<<"请输入你的选择:";

         cin>>choice;

         while(choice!='A'){

                  if(choice=='Y'){

                           system("cls");  //全清除

                           goto part1;

                  }

                  else

                  {

                           cout<<"---------谢谢使用!----------"<

                           break;

                  }

         }

         return 0;

}

相关推荐