admin管理员组

文章数量:1530847

2024年4月1日发(作者:)

C语言工程训练报告

设计题目:简单计算器

专 业:电子信息科学与技术

班 级:12

学 号:031341205

姓 名:谢亮

指导老师:杨兴忠

日 期:

2014年6月29日——2014年5月30日

成 绩:

目录

第一章 问题的描述

第二章 功能分析

第三章 设 计

第四章 源 程 序

第五章 测 试

第一章 问题的描述

计算器(calculator),该名词由日文传入中国。计算器能进行数学运算的常用工具,结

构简单,比现代电脑结构简单得多,较为方便,可广泛运用于商业交易中,是必备的办公用

品之一,能够进行加、减、乘、除四则运算,高级的计算器还具有函数计算及统计功能等,

显示计算结果。在现代社会中,计算器已经进入了每一个家庭,人们在生活和学习中经常需

要使用到计算器,它的出现大大减少了人们在计算方面的工作量,可以说它在人们生活和学

习中是不可缺少的。

计算器只是简单的计算工具,有些机型具备函数计算功能,计算器和计算机一样都能

够实现数据的录入、处理、存储和输出,区别于计算机的就是,它不能自动地实现这些操作

过程,必须由人来操作完成。

本论文主要是讨论在VC++环境下的,通过MFC来编写一个计算器,除了实现

简单的加减乘除等简单运算外,还可以添加了一些常用的功能,可以解决平时一

些简单的运算。

第二章 功能分析

能实现基本的运算加、减、乘、除四则运算,可以实现一些其他的功能,

如开方、取反等。本设计是简单计算器。日常计算机使用中,常常涉及到一

些有关计算的问题,一个小型的计算器软件变得非常有用,该校型计算器需

要空间资源较少,对电脑其他程序的应用影响较小。它的设计按软件工程的

方法进行,系统具有良好的界面、必要的交互信息和较好的健壮性;醒目美

观的软件封面。使用人员能快捷简单地进行操作。即时准确地获得需要的计

算的结果,充分降低了数字计算的难度和节约了时间,对人们的生活有一定

的帮助。

本计算器是在基于对话框的应用程序中模拟一个计算器,本计算器可以

进行十进制下的四则运算加、减、乘、除和四则混合运算,添加了一些特

殊的功能如“开方”,系统开发平台为Windows 7,程序设计设计语言采用

Visual C++6.0,程序运行平台为Windows 7/XP/8。程序通过调试运行,初

步实现了设计目标。

现在介绍一下按钮的功能:

*乘法。

+加法。

%取余数。

sqrt开方。

+/-改变显示数字的符号。

- 减法。

.插入小数点。

/除法。

0–9 将此数字置于计算器的显示区。

1/x 计算显示数字的倒数。

= 对上两个数字执行任意运算。若要重复上一次的运算,请再次单击“=”。

Backspace 删除当前显示数字的最后一位。

C清除当前的计算。

CE清除显示数字。

M+ 显示的数字与内存中已有的任何数字相加,但不显示这些数字的和。

M- 显示的数字与内存中已有的任何数字相减,但不显示这些数字的减。

MC清除内存中的所有数字。

MR重调用存内存中的数字。该数字保留在内存中。

MS将显示数字保存在内存中。

sqrt计算显示数字的平方根。

另外我增加了一个编辑框,用来显示保存的数据,个人感觉很实用,可以有

效的查看必要的数据。

第三章 设计

1.计算器界面

计算器界面包括主题“高级计算器”和背景图片,在计算区上有显示文本框

和数字按钮以及运算符按钮。在计算区上部分有运算模式选择模块和小提示

语句。

设计思路与分析:

a) 首先考虑对所有按键分为两类,数字类和符号类,

0,1,2,3,4,5,6,7,8,9为数字类,+,-,*,/,=为符号类。数字在计算的过

程中最多需要保存两个,所以定义了两个double型变量来进行存储。符号

需要一个char来存储。

b) 然后考虑在计算的过程中,一种是是程序刚开始运行还没有开始录入数

字的状态。二种是第一个数字已经录入,符号也已经录入时候直接赋值。

c) 因为数字全部使用的是double,键入的数字必须通过一定的处理达到累

加的效果,加上小数和整数的处理差异性大,所以要进行判断,分辩出来小

数和整数。

页面设计与控件部分:

首先打开VC++6.0,选择MFC AppWizard[exe],设定好路径和工程名(这

里我设置工程名为为“031341205”)。这里要注意的是在创建向导步骤1的

时候,我们选择“基本对话框”。

此时我们把当前页面上原配的控件按Delete

全部清除。

接着我们按照MFC自带的控件选项进行我们本次计算器的控件添加,我

们在原先清空的界面中依次用上图控件画出一个基本的计算器页面,当然作

为“所见即所得”的MFC控件设计,干净整齐的界面是基本要求,甚至会影

响用户的心情。我们用按钮控件添加按钮,分别是数字“ 0 ~ 9” 以及 “+

- * /”。每个控件“属性”都有属于它自己的ID,默认的按钮按键为

IDC_BUTTON0,而且Cap当然我们为了“顾名思义”,对控件ID进行修改成我

们容易辨认的(也可以不改),添加完控件并修改ID之后。这里我们把数字

按钮0 设置ID,其他的依次类推,就需给控件添加消息响应了,基本操作

可以是直接双击控件,便会有向导提示。 MFC默认下了的响应信息都为On_

开头,之后所有的依次类推,这步骤一般不对成员函数名称做任何修改,直

接点击OK即可之后就会跳转到具体的代码实现过程 这里我们依次给每一个

控件添加消息响应函数。

到此为止,我们基本上完成了计算器页面的前半部分预备工作,下来是

我们的对控件具体实现代码的添加,这里我把添加的控件消息响应函数。

2. 模块功能简介

系统分为多个模块,分别为计算模块、错误分析模块、界面显示模块和

模式选择模块。其中计算模块用来进行各种基本的加、减、乘、除的运算并

且显示运算结果;错误分析模块用来进行错误处理;界面显示模块用来美化

计算器界面;择模块用来进行运算模式的选择和切换,以实现不同的运算要

求。

3. 程序框图

4. 资源编辑

创建工程

(对话框)

添加类向导,

初始化函数

设计界面

添加事件

设置控件属性

添加成员变量

事件的实现

3、效果图

第四章 源程序

(1) 添加的头文件

#include "math.h"//对sqrt添加头文件

#include "SkinH.h"//添加皮肤的头文件

#pragma comment(lib,"")

(2) 编写的源程序

void CMy031341205Dlg::OnButton1() //数字按钮1

{

c_result+="1";

UpdateData(false);

}

void CMy031341205Dlg::OnButton2() //数字按钮2

{

c_result+="2";

UpdateData(false);

}

void CMy031341205Dlg::OnButton3()//数字按钮3

{

c_result+="3";

UpdateData(false);

}

void CMy031341205Dlg::OnButton4()//数字按钮4

{

c_result+="4";

UpdateData(false);

}

void CMy031341205Dlg::OnButton5() //数字按钮5

{

c_result+="5";

UpdateData(false);

}

void CMy031341205Dlg::OnButton6() //数字按钮6

{

c_result+="6";

UpdateData(false);

}

void CMy031341205Dlg::OnButton7() //数字按钮7

{

c_result+="7";

UpdateData(false);

}

void CMy031341205Dlg::OnButton8() //数字按钮8

{

c_result+="8";

UpdateData(false);

}

void CMy031341205Dlg::OnButton9() //数字按钮9

{

c_result+="9";

UpdateData(false);

}

void CMy031341205Dlg::OnButton10() //数字按钮0

{

c_result+="10";

UpdateData(false);

}

void CMy031341205Dlg::OnButton17() //操作符'+'

{

sign();

c_flag='+';

}

void CMy031341205Dlg::sign()//对输入的操作符进行处理

{

UpdateData(true);

d_num2=atof(c_result);

if(i_mark==1)

switch(c_flag1)

{

case 'a': d_num2=-d_num2;break;

case 's': d_num2=sqrt(d_num2);break;

case 'c': d_num2=1/d_num2;

}

else

switch(c_flag)

{

case '+': d_num1+=d_num2;break;

case '-': d_num1-=d_num2;break;

case '*': d_num1*=d_num2;break;

case '/': (double)d_num1/=d_num2;break;

case '%': d_num1=(int)d_num1%(int)d_num2;break;

case '=': d_num1=d_num2;

}

if(i_mark==1)

c_("%.2f",d_num2);

else

c_("%.2f",d_num1);

UpdateData(false);

i_mark=0;

c_result="";

}

void CMy031341205Dlg::OnButton18() //操作符'-'

{

sign();

c_flag='-';

}

void CMy031341205Dlg::OnButton19() //操作符'*'

{

sign();

c_flag='*';

}

void CMy031341205Dlg::OnButton20() //操作符'/'

{

sign();

c_flag='/';

}

void CMy031341205Dlg::OnButton21() //操作符'sqrt'

{

sign();

c_flag='s';

}

void CMy031341205Dlg::OnButton22()//操作符'%'

{

sign();

c_flag='%';

}

void CMy031341205Dlg::OnButton23() //操作符'1/x'

{

sign();

c_flag='c';

}

void CMy031341205Dlg::OnButton24() //操作符'='

{

sign();

c_flag='=';

}

void CMy031341205Dlg::OnButton16()//操作数后添加'.',重复按小数点,进行一

{

UpdateData(true);

if( i_mark==0)

{

i_mark=1;

c_result+='.';

}

UpdateData(false);

}

void CMy031341205Dlg::OnButton27() //操作符'Backspce'

{

UpdateData(true);

c_result=c_(c_gth()-1);

UpdateData(false);

}

void CMy031341205Dlg::OnButton15()//操作符'+/-'

{

sign();

c_flag='a';

}

void CMy031341205Dlg::OnButton25()//操作符'EC'

{

c_result ="";

i_mark=0;

UpdateData(false);

}

void CMy031341205Dlg::OnButton26() //操作符'C'

{

c_result="";

c_flag='=';

d_num1=0;

d_num2=0;

UpdateData(false);

}

void CMy031341205Dlg::OnButton11()//操作符'MC'

{

m_result="";

d_num3=0;

UpdateData(false);

}

void CMy031341205Dlg::OnButton14() //操作符'M+'

{

UpdateData(true);

d_num3+=atof(c_result);

c_result="";

m_("%.2f",d_num3);

UpdateData(false);

}

void CMy031341205Dlg::OnButton28()//操作符'M-'

{

UpdateData(true);

d_num3-=atof(c_result);

c_result="";

m_("%.f",d_num3);

UpdateData(false);

}

void CMy031341205Dlg::OnButton12()//操作符'MR'

{

c_result=m_result;

UpdateData(false);

}

void CMy031341205Dlg::OnButton13() //操作符'MS'

{

UpdateData(true);

m_result=c_result;

UpdateData(false);

}

void CMy031341205Dlg::OnTimer(UINT nIDEvent)//计算器上显示系统时间

{

CTime time = CTime::GetCurrentTime();

CString string = ("%Y-%m-%d--%H:%M:%S");//时间格式

SetWindowText(string);

CDialog::OnTimer(nIDEvent);

}

第五章 测 试

计算器能加减乘除四则运算等的运算,用鼠标单击一个数然后再单击相应的

运算符即能实现相应的功能。

下面对计算器的相关操作功能作测试:

(1) 四则运算(以乘法为例):

例如:“1*3=3”,用鼠标点击数字“1”,“*”,“3”再单击“=”则屏幕上就

会显示“3”,如下图:

点击1的界面

点击*的界面

点击3时的界面

点击=时的界面

小 结

本次C语言课程设计我是按照老师的要求来完成的,通过一个多星期的

折腾,总算把课程设计给完成了,这是一个坚苦而又漫长的过程。看着劳动

成果,很欣慰! 刚开始,可以说是完全没有头绪,于是上网查,找到了些

与我题目相似的源代码,然后对之进行修改,测试,最后得到我这次课程设

计所需要的代码. 通过计算器的设计这一课题的设计和实现,我对简单的C

语言编程有了进一步的认识,对Microsoft Visual C++ 6.0这个程序的操作更

加熟练了一些。 回顾此次的课程设计,我学到了很多东西不仅巩固了书本的

知识并且与实践相结合提高具体操作能力,在设计的过程中发现自己的不足,

有些知识掌握的不够牢靠,通过这次的课程设计之后我把前面所学的知识又

重新温故了一遍。 同时,在老师和同学身上我学到了很多非常实用的知识,

在此对给过我帮助的同学和老师表示由衷的感谢!

1.工作内容

这次实验报告主要研究的内容就是熟悉C++的应用领域mfc的制作过

程,并且能够在Visual C++6.0的环境下进入操作,掌握工作流程,了解C+

+的特点、功能,掌握如何用C++来编程的要点及结构,区别C与其区别

和联系,更进一步的,要求在C++的工作环境下编辑一个简单的计算器,并

且能够正常运行。

2.

工作量的大小

运行程序,在不同的运算模式下输入数据然后进行调试。在单步运算模

式下应分别测试加、减、乘、除以及除数为0和被除数小于除数这两种特殊

情况。在算式运算模式下除了要测试与单步运算相同的内容外,还应注意算

术优先级是否正确,运算结果是否正确。注意清零功能是否能够正确实现。

经测试没有发现错误,系统运开始运行计算加减运算,读入字符,计算乘除

运算,输出结果,结束,开始,读入字符,计算结果,读入运算符,读入字

符,输出结果,结束,显示界面,模式选择,程序计算,显示计算结果,输

入算式,单步运算,算式运算,输入数据,调用动态链接库,C++程序设计

设计性实验,运行正常。

3、完成情况

通过每步的设计工作、修改,网上查找答案,同学的帮助,完成程序的

设定,并经过调试、运行,能够正常运行,可以实现基本的加减乘除,能够

满足我们的需要,因此成功的完成。此次程序设计遇到了很多困难,让我认

识到了自己的太多不足,同时上网查资料的时候也让我知道了网络是个非常

大的资料库,对于编程来说学会调试则是一个非常好的编程习惯,希望自己

以后多多使用,也希望同学们多多使用。在程序设计中遇到困难遇到错误是

不可避免的,我们应该学会调试,一个会编程的人一定是会调试的人,同时

调试是个非常乏味且烦躁的工作,所以我们应该在编程前尽量做好多的准备,

尽量减少我们的调试时间。写这个程序的时候才发现,原来做一些程序的时

候,拿来就上机实现,而不做任何准备,那只能应付小程序,一旦像现在这

样写一个很大的程序时,就发现在长长的一大块里面找一个小错误是多么的

困难。如果调试很久也成功不了,就要考虑是不是自己储备的某些知识是错

的,一直在误导你,这个时候就需要去重新认真的看看书,看看资料,之后

就恍然大悟了。

4、问题与解决方法

问题一:对C++工程建立有点不熟悉。

解决方法:询问问同学,到图书馆借用相关的书籍,了解其工作环境,

对C++有初步的了解。

问题二:对C++面向对象程序设计结构和特点不熟悉,编程无从下手。

解决方法:去图书馆借有关C++语言的书籍,全面,彻底的了解C++,

了解它的函数,文件,语句,循环等等,从书本上的例题出发,搞懂每

一步程序的作用和功能。通过比较它和C语言的异同点,找到学习C++

的更好的方法,在编程过程中还参考了老师的编程。

问题三:在调试过程中,很多时候会遇到很多问题,答案是无法找出错

误,导致程序不能进行

解决方法:通过网上寻找答案,从而找出错误,修改后,继续调试,进

行后续工作,在找出其他错误,直到最后程序没有出现问题。

5、收获和体会

上学期上过c语言,书上有一个简易的编程,但是对于利用MFC这个类

库制作能进行科学运算的方法还不是很了解。感觉写得并不是很好,因为还

有一些问题没有得到完全的解决,只能以后有空再好好想想了!本来还想上

网学一下MFC的美化,把这个页面做得好看一些的,所以只是在同学的指点

下添加了计算器的背景图。总的来说,这次的课程设计,还是让自己学到不

少东西。本次MFC计算器的制作,学习到了MFC基本的编程方法,增加了小

组开发的团结协作能力。对mfc编程的理解进一步加深。但是程序仍然没存

在一定的问题,比如除数不能为0这个漏洞没有考虑,符号键多次点击结果

混乱。如果有更多的时间,必定这些问题会更加深入讨论。通过这次课程设

计,以后Windows 应用程序势必会轻车熟路。

对自己的要求:

1、需要有好的C/C++基础。正所谓“磨刀不误砍柴工”,最开始接触

VC++6.0时不要急于开始Windows程序开发,而是应该进行一些字符界

面程序的编写。这样做的目的主要是增加对语言的熟悉程度,同时也训

练自己的思维和熟悉一些在编程中常犯的错误。更重要的是理解并能运

用C++的各种特性,这些在以后的开发中都会有很大的帮助,特别是利

用MFC进行开发的对C++一定要能熟练运用。

2、理解Windows的消息机制,窗口句柄和其他GUI句柄的含义和用途。

了解和MFC各个类功能相近的API函数。

3、一定要理解MFC中消息映射的作用。

4、训练自己在编写代码时不使用参考书而是使用Help Online。

5、记住一些常用的消息名称和参数的意义。

6、学会看别人的代码。

7、多看书,少买书,买书前一定要慎重。

8、闲下来的时候就看参考书。

6、改进方向

在程序设计中,通过设计、编制、调试一个模拟计算器的程序,加

深对语法及语义分析原理的理解,并实现对命令语句的灵活应用。在程

序设计中,可以用两种方法解决问题:一是传统的结构化程序设计方法,

二是更先进的面向对象程序设计方法。 由于多个函数均需要访问某些数

据,这些数据常被设计为全局变量。 而在面向对象程序设计中关键是如

何将问题域中的实体(即日常所见的概念)抽取出来,作为C++程序中

的类,而属性与行为作为类的两类要素通常是必不可少的,甚至还应考

虑类必须满足的约束。感觉到自己现在的不足——基础不够扎实,很多

东西都是一知半解,真的要好好加强对基础知识的学习了!很多问题,

不仅仅只是把功能实现就行了,还要注意代码的优化,把结果做得更好!

系统使用说明书:

首先进行模式选择,在单步运算时,先点击下一个数字,再点击运算符,

再点击下一个数字,然后点击等于号显示结果,如果被除数为零,则提示错

误,按清零键后重新输入。 在算式运算时,随便输入一个算式,计算器可

识别算式错误不显示,显示的就是输入的算式,点等于号后显示结果,如果

被除数为零,则提示错误,按清零键后重新输入,如果输入一个运算符后,

只能输入数字不能再输入运算符,如果此时点击运算符,则不会显示在算式

中。

致 谢

这次C语言工程设计让我学到了很多,从编程中可以看出编写一个程

序的是一件很难的事。要想成为一名优秀的程序员,需要持久的耐心和深厚

的专业知识。虽然这次我这组的课程设计题目不是很难,但要做好也不是一

件很容易的事情。我努力使我的设计更加完美,我也有幸得到杨兴忠老师的

指导,使我能够顺利完成我的课程设计,我同时也要感谢其他同学给予我帮

助的同学,他们使我认识到团队的力量。再一次感谢所有帮助我完成这次课

程设计的人。

参考文献

1.谭浩强编著《C程序设计(第三版)》北京清华大学出版社2005

2.谭浩强编著《C程序设计题解与上机指导》北京清华大学出版社2005

3. Decoder编著《C/C++程序设计》北京中国铁路出版社2002

4. 朱站立编著《数据结构(C语言版)》西安西安交通大学出版社2006

所有工程链接:

/s/1nt5mpfV

本文标签: 计算器数字显示进行计算