课程设计报告
课程设计题目:模拟机算器程序
学生姓名 :
专 业: 网络工程
班 级 :
指导教师:
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;
}
实验4计数器及其应用一实验目的1学习用集成触发器构成计数器的方法2掌握中规模集成计数器的使用及功能测试方法二实验原理计数器是一个用…
HUNANUNIVERSITY程序设计训练简单的计算器报告学生姓名田博鑫学生学号专业班级指导老师20xx年6月16日至20xx年7…
HTML网页实验报告院系计算机控制与工程学院班级计1241学号姓名完成日期1一实验名称设计一个网页计算器二需求分析计算器是日常生活…
目录一系统开发的背景1二系统分析与设计1一二计算器的主要功能1系统模块结构设计1三系统的设计与实现2一二计算器的初始界面2一般计算…
C计算器实验报告班级学号20xx13432姓名蔡启林一实验目的和要求设计一个简单计算器具有一般计算功能能进行基本的加减乘除运算还具…
课程名称电工电子学实验指导老师实验名称集成运算放大器及应用一模拟信号运算电路实验报告一实验目的1了解集成运算放大器的基本使用方法和…
模拟电路实验报告实验一模拟运算放大电路一日期电气工程学院学号16012616姓名黄博然任课教师团雷鸣20xx102320xx102…
课程名称指导老师实验名称集成运算放大器及应用一实验报告一实验目的1了解集成运算放大器的基本使用方法和三种输入方式2掌握集成运算放大…
东南大学电工电子实验中心实验报告课程名称模拟电路实验第一次实验实验名称模拟运算放大电路一院系姓名专业学号实验室实验组别同组人员实验…
实验八集成运放基本应用之一模拟运算电路班级姓名学号20xx1230一实验目的1研究由集成运算放大电路组成的比例加法减法和积分等基本…
《计算机组成原理》实验报告学院:专业:班级学号:AP0804114学生姓名:实验日期:指导老师:成绩评定:五邑大学信息学院计算机组…