C O N T E N T S
程序设计内容与要求……… ………………… ……………………………1
程序设计环节…… ………………………………………………………… 1
程
序
介 ………………………………………………………………1
程
序
基
本
实
现
路…………… ………………………… ……………2
简
思
程序主要代码…………………………………… ………… …………2
变
量
初
值… …………………………………………………………2
主
要
实
现
始
代
码……………………………………… …………………3
心
得
会……………………………………………… ……………………17
参
考
料…………………………………………………………… ………18
程
序
界
图…………………………………………………… ……………19
W i n d o w s 程 序 课 程 设 计
课程设计题目:
设计一个简单的计算器应用程序
一、设计目标与内容:
1. 了解 Windows 编程的基础知识,掌握 MFC 应用程序的基本知识;
体
资
面
1
2. 基本掌握面向对象程序设计的基本思路和方法;
3. 掌握用 VC++开发应用程序的的一般步骤和方法;
4. 能够利用所学的基本知识,设计一个简单的计算器应用程序,实现基本的加、减、乘、除、求平方根等基本运算(必须实现
的功能),实现求角度的正弦、余弦、正切,实现求指数、自然对数、常用对数等基本运算(这部分功能选做)。
5. 在程序中注意处理数据和运算符的输入,计算结果的显示。
二,设计要求:
1. 用 VC++进行编码,实现应用程序的功能。注重编码质量,代码要有适当的注释;
2. 提交设计报告一份(课程设计任务书、目录、设计的基本思路、设计的步骤及主要代码、心得体会、参考文献)。
三.程序设计环节:
1. 程序简介:
本程序在 VS.NET2005 的 c++语言中的 MFC 开发制作,经测试(使用动态 dll 库)在同等环境(VS.NET2005)下可以正常运
行执行文件完成计算器功能。使用静态 dll 库时候,不改变执行程序路径可以正常运行,但移动到其他位置的执行文件运行会缺
少 3D 按钮效果,其他功能不变。
但在 VC6.0 和.NET2003 环境下不能直接使用(提示缺少库文件)。解决办法是使用 installshield 制作软件安装包。在没有装
有 VS.NET2005 的机器上可以用安装包安装该计算器,该安装包会在桌面放置一程序快捷方式和卸载图标。本软件不写注册表。
2. 程序基本实现思路:
1 当前输入的数据,和数据处理过程均由变量 n 完成。因为最多是 2 元运算,另设一变量 n_2 表示第 2 个数,需要时
由 n_2=n 赋值。
2 数字录入部内容相似,首先建立一个函数 inum(),负责处理所输入的数字,按下相应数字键时候,调用 inum()完成
数字的输入和显示。
3 数据计算部分.由函数 operation(char ope),通过选择所按下的运算符(该函数的变量)来完成相应的计算并显示。
由于运算符分为单元运算和双元 所以具有类似性,分开处理。
4 小数输入。按下小数点后,变量 setxiaoshu=true,激活小数输入功能。inum()做出输入小数的判断并输出预期数。
5 正负号的改变可以通过每按下该键后执行 n=-n 来执行。对于负数的录入功能,也由 inum()做出判断,完成正确的负
数录入过程。
2
6 等号的实现调用 operation(operate),完成相应运算。
7 删除一个字符,用 n=long(n/10)的思路来完成,由于 long 的范围,所以删除只能实现 10 位以内的删除。
8CE 和 C 键。CE 负责清楚欲输入的第 2 个数据的相关变量,C 清空所有变量,重置计算器。
3. 根据上述设想编写程序,主要代码如下:
变量初始值(dlg.cpp 文件):
#include "stdafx.h"
#include "计算器.h"
#include "计算器 Dlg.h"
#include "math.h"
#include "time.h"
#include "stdlib.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
C 计算器 Dlg::C 计算器 Dlg(CWnd* pParent /*=NULL*/)
//可以不用 ,屏蔽srand()
: CDialog(C 计算器 Dlg::IDD, pParent)
, n(0)
, setxiaoshu(false)
, xiaoshui(0)
, innum(0)
, n_2(0)
, operate(0)
, setnew(false)
BEGIN_MESSAGE_MAP(C 计算器 Dlg, CDialog)
3
……. //系统消息和控件的函数
主要实现代码:(dlg.cpp 文件)://注:下面所有控件名称使用加粗字体和下划线表示该按键
void C 计算器 Dlg::OnPaint()
{
//重写OnPaint(),实现,界面颜色的改变
//
//控制随机函数rand()的取值时间(间隔1s 左右更新值),后来为实现每次按键都变色把这句去掉了
int c_r,c_g,c_b,c;
srand(time(0));
c_r=rand()%256;
c_g=rand()%256;
c_b=rand()%256;
c=rand()%4;
if (IsIconic())
{
//3 个变量分别代表R/G/B
// rand()%256 代表变量取值为0-255 之间的整数,下同
//c=0-3,即分为4 种情况,分别绘制不同的颜色方案.实现更多色彩.
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
4
{
//蓝色渐变,其他两种颜色随机
if (c==0)
{
CPaintDC dc(this);
CRect rc;
GetClientRect(&rc);
int nHeight=rc.Height();
for(int i=0;nHeight>=0;nHeight--,i++)
{
CPen pen;
pen.CreatePen(PS_SOLID,1,RGB(c_r,c_g,i));
CPen *pOldPen=dc.SelectObject(&pen);
dc.MoveTo(rc.left,i);
dc.LineTo(rc.right,i);
dc.SelectObject(pOldPen);
pen.DeleteObject();
//绿色渐变, 其他两种颜色随机
}
}
else if(c==1)
{
CPaintDC dc(this);
CRect rc;
GetClientRect(&rc);
int nHeight=rc.Height();
for(int i=0;nHeight>=0;nHeight--,i++)
{
CPen pen;
pen.CreatePen(PS_SOLID,1,RGB(c_r,i,c_b));
5
CPen *pOldPen=dc.SelectObject(&pen);
dc.MoveTo(rc.left,i);
dc.LineTo(rc.right,i);
dc.SelectObject(pOldPen);
pen.DeleteObject();
//红色渐变, 其他两种颜色随机
}
}
else if(c==2)
{
CPaintDC dc(this);
CRect rc;
GetClientRect(&rc);
int nHeight=rc.Height();
for(int i=0;nHeight>=0;nHeight--,i++)
{
CPen pen;
pen.CreatePen(PS_SOLID,1,RGB(i,c_g,c_r));
CPen *pOldPen=dc.SelectObject(&pen);
dc.MoveTo(rc.left,i);
dc.LineTo(rc.right,i);
dc.SelectObject(pOldPen);
pen.DeleteObject();
//都不渐变,所有随机
}
}
else
{
CPaintDC dc(this);
CRect rc;
6
GetClientRect(&rc);
int nHeight=rc.Height();
for(int i=0;nHeight>=0;nHeight--,i++)
{
CPen pen;
pen.CreatePen(PS_SOLID,1,RGB(c_r,c_g,c_r));
CPen *pOldPen=dc.SelectObject(&pen);
dc.MoveTo(rc.left,i);
dc.LineTo(rc.right,i);
dc.SelectObject(pOldPen);
pen.DeleteObject();
}
}
}
}
void C 计算器 Dlg::OnBnClickedButton31()
// 控件pi 对应的函数
按键pi 的处理
n=3.14159265358979;
UpdateData(false);
Invalidate();
// 把pi 值3.14159265358979 赋给n
//重新执行OnPaint()函数实现每一次按键,界面自动变色.下面各控件对应函数也调用这函数,如控件对应函数
//没有直接显示,就是在被调用的函数中有该函数
}
////////////////////////////////////////以下部分处理方式相似(数字录入)//////////////////
void C 计算器 Dlg::OnBnClickedButton0()
{
//控件0 对应的函数.调用inum()产生预期的数.包括整数/小数/正数/负数.下面1 - 9 同
按键0 的处理
if (setnew) C 计算器 Dlg::OnBnClickedButton23(); else Invalidate(); // setnew 为true,清除所有控制变量, 在上次计算出结果后
innum=0;
// 把0 赋给变量inum,执行相应的+++-
//可以不用按C 键清除直接按数字键开始下一个运
7