主题:C++单元测试工具CppUnit使用简介编程技术
1. 到 http://sourceforge.net/projects/cppunit/下载CppUnit测试框架的源代码
2. 解压文件,进入src文件夹,打开CppUnitLibraries.dsw.分别编译这两个project,输出位置均为lib文件夹。
3.在VC的tools/options/directories/include files和library files中设置include路径和lib路径。
4.右键我的电脑设定->高级->环境变量->系统变量->Path中,将Cppuint的目录的lib路径设置为系统搜索路径
创建测试工程:
1.打开VC新建基于MFC对话框的Project,在stdafx.h中添
#include
#include
#include
#ifdef _DEBUG
#pragma comment( lib, "testrunnerd.lib" )
#pragma comment( lib, "CppUnitd.lib" )
#else
#pragma comment( lib, "testrunner.lib" )
#pragma comment( lib, "CppUnit.lib" )
#endif
using namespace CppUnit;
2.修改对话框初始化函数
CUnitTestApp::InitInstance()
{
MfcUi::TestRunner runner;
runner.addTest( TestFactoryRegistry::getRegistry("SamepleUnitTest").makeTest() );
runner.run(); //show UI
/*
CUnitTestDlg dlg;
m_pMainWnd = &dlg;
INT_PTR nResponse = dlg.DoModal();
if (nResponse == IDOK)
{......}
*/
}
3.将要测试的project加入到本project中,实现测试用例类
class CSamepleTestCase : public TestCase
{
public:
CSamepleTestCase(void);
virtual ~CSamepleTestCase(void);
CPPUNIT_TEST_SUITE(CSamepleTestCase);
CPPUNIT_TEST( TestAdd );
CPPUNIT_TEST_SUITE_END();
VOID TestAdd( );
};
在CPP文件中
CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( CSamepleTestCase,"SamepleUnitTest" );
#include <另一个工程中的头文件>
void CSamepleTestCase::TestAdd( void )
{
//在这里写测试用例
CPPUNIT_ASSERT_EQUAL( 1, 1);
}
基于VC++中ATL创建ActiveX控件的探讨编程技术
ActiveX控件是微软公司提供的功能强大的程序设计和开发技术,是COM组件开发技术的重要组成部分。它是OLE的第三个版本,对原先OLE控件的最大扩展是增加了Internet功能,它不仅可以在支持OLE控件的容器中使用,更可以作为一个Internet控件,直接成为网页的一部分。另外,ActiveX控件作为一种可重用的组件,相当于一个封装好的代码模块,它是通过其方法、属性、事件来与应用程序进行通信的,此外,ActiveX控件是与开发语言无关的。用户在使用控件时不必考虑它是VC还是用VB等其它语言开发的,应用程序都是通过COM与控件进行通信的。可见,任何支持ActiveX控件的软件平台上都可以使用ActiveX控件,它使得不同厂商所开发的控件可以真正地组装在一起,从而令软件的生产过程类似于硬件业的各个插件的装配过程一样,实现了软件的工业化,大大降低了软件的开发成本,极大地提高了软件的生产效率,实现了软件资源的共享。
ATL技术
1)ATL
ATL是ActiveX Template Library 的缩写,它是一套C++模板库。使用ATL能够快速地开发出高效、简洁的代码(Effective and Slim code),同时对COM组件的开发提供最大限度的代码自动生成以及可视化支持。从Microsoft Visual C++ 5.0版本开始,Microsoft把ATL集成到Visual C++开发环境中。目前,ATL已经成为Microsoft标准开发工具中的一个重要成员,日益受到C++开发人员的重视。
在ATL产生以前,开发COM组件的方法主要有两种:一是使用COM SDK直接开发COM组件,另一种方式是通过MFC提供的COM支持来实现。
直接使用COM SDK开发COM组件是最基本也是最灵活的方式。但是,这种开发方式的难度和工作量都很大,一方面,要求开发者对于COM的技术原理具有比较深入的了解,另一方面,直接使用COM SDK要求开发人员自己去实现COM应用的每一个细节,完成大量的重复性工作。
使用MFC提供的COM支持开发COM应用可以说在使用COM SDK基础上提高了自动化程度,缩短了开发时间。MFC采用面向对象的方式将COM的基本功能封装在若干MFC的C++类中,开发者通过继承这些类得到COM支持功能。但使用MFC开发的COM组件,尤其是ActiveX控件的开发,会产生相当大的代码冗余,而且必须要依赖于MFC的运行时刻库才能正确地运行。
ATL技术是目前开发COM组件的一种比较理想的技术。ATL中所使用的基本技术包括COM技术、C++模板类技术(Template)以及C++多继承技术(Multi-Inheritance) .
2) ATL的基本使用
使用ATL开发一个COM应用基本可以分为以下几个步骤:
(1)创建一个新的ATL工程,并对工程的选项进行适当的配置。
(2)向新创建的工程添加新的ATL类,并对该类进行一些初始配置工作。
(3)根据COM应用的基本要求向新的ATL类加入新的接口定义,并实现相应的接口成员函数。
(4)编译连接工程,注册COM应用。
利用ATL技术创建ActiveX控件CircleCtl
1) 创建ATL项目
使用ATL COM AppWizard 创建ATL框架为该项目命名为Circle,按照向导提示向下做,采用默认设置,即Server Type类型为Dynamic Link Library(DLL)。
2) 向ATL项目添加ActiveX控件
首先从Insert菜单项中选择New ATL Object…调出 ATL Object Wizard对话框,然后左边Category列表选择Object,右边相应地选择Full Control,如图(1)所示。按Next继续,出现 ATL Object Wizard属性对话框,如图(2),在Names选项卡中,我们只需要在Short Name 编辑框输入CircleCtl即可,其它系统就会自动给定,也可以修改,我们这里保持系统给定状态;在Attributes 选项卡中,选择 Support ISupportErrorInfo 和 Support Connection Points 两个复选框,这两项分别支持出错信息和连接点;Miscellaneous选项卡保持默认设置;Stock Properties中我们把FillColor添加到支栏中,确定之后就把该控件加到项目中了。
3)为ActiveX控件添加自定义属性
现在来添加Circle控件的一个基本属性——Radius.
在Workspace Windows中Class View状态下,右击 ICircleCtl接口,选择Add Property,属性类型为short,名为Radius,参数为空。系统会自动生成get_Radius和put_Radius两个成员函数。在CCircleCtl中添加m_radius变量,用来存储半径。在CCircleCtl的构造函数中将其初始化为50,并在get_Radius函数中添加*pVal=m_radius; 在put_Radius函数中添加m_radius=newVal; FireViewChange();用来及时更新视图。对于Radius的属性,我们通过修改控件的绘制代码来使它起作用。
4) 修改ActiveX控件的绘制代码实现属性交换
首先,在CCircleCtl的构造函数中对绘制圆的填充色进行初始化,将它的初始值设为红色,即m_clrFillColor=RGB(255,0, 0)。
接下来,我们需要几个全局变量来保存控件区域的信息,在CircleCtl.h中添加如下变量:
static POINT CenterPt;
static long RectHt = 0;
static long RectWd = 0;
然后修改OnDraw函数,在该绘制函数中,使用 Windows API中标准的HDC、HPEN、HBRUSH以及SelectObject、Ellipse等结构和函数来实现绘制的。例如:
// 创建画笔和画刷并选中颜色画圆
hPen = (HPEN)GetStockObject(BLACK_PEN);
hOldPen = (HPEN)SelectObject(hdc, hPen);
hBrush = (HBRUSH)GetStockObject(WHITE_BRUSH);
hOldBrush = (HBRUSH)SelectObject(hdc, hBrush);
hBrush = CreateSolidBrush(colFore);
SelectObject(hdc, hBrush);
Ellipse (hdc, (CenterPt.x - m_radius), (CenterPt.y - m_radius), (CenterPt.x +m_radius),(CenterPt.y+ m_radius));
5) 为ActiveX控件添加事件
现在将向ATL控件中添加Click和RClick事件。如果用户在矩形区内点击,则会激发相应事件。现在要向ICircleCtlEvents接口添加Click方法,首先在“ClassView”中选中“ICircleCtlEvents”右击,选择Add Method,出现如下对话框,并按下图设置,最后点“OK”按钮就可以添加Click事件的实现方法。用同样的方法添加RClick事件,参数与Click事件一致。接下来我们要为控件实现连接点接口IConnectionPoint和连接点容器接口IConnectionPointContainer.编译好Circle.idl文件,生成对应的Circle.tlb,在“ClassView”中选中“CCircleCtl”,右击,在Popup菜单中选择“Implement Connection Point”命令,在弹出的对话框中选中“_ICircleCtlEvents”接口。在类中定义了以两个坐标为参数的Fire_Click和Fire_RClick方法,调用这两个方法就可以在控件中激发响应的事件。
最后,添加激发事件的代码,我们分别在鼠标左键和右键按下的消息响应中进行处理,激发响应的事件,例如OnLButtonDown函数部分代码如下:
WORD xPos = LOWORD(lParam); //鼠标水平坐标
WORD yPos = HIWORD(lParam); // 鼠标垂直坐标
Fire_Click (xPos, yPos); //执行触发函数
至此,可以在ActiveX Control Test Container中测试该控件。
网页中使用ActiveX控件
在控件生成时,系统同时生成了一个CircleCtl.htm文件,在VC编辑环境下打开该文件,在和之间加上如下的VBScript:
注意保存。然后在“我的电脑”中打开该htm文件,用鼠标单击圆,半径变大,右击圆半径变小。
结束语
本文介绍了基于ATL技术以及使用该技术实现了一个简单的圆的控件CircleCtl并且介绍了其在网页中的使用。ActiveX控件作为可重用的代码组件,不仅应用广泛,还可节约开发时间。它将大量的实现细节隐藏起来,以简明的接口与用户名交互,易于使用。对ActiveX技术的研究已经成为当今软件业的热点和潮流。
C语言中使用穷举法的一些算法编程技术
★最大公约数和最小公倍数
用穷举法求最大公约数iloop的思路:
1、穷举的范围是1到两个整数中的最小数;
2、可能的解是两个数分别除以iloop时都能整除,余数为0的那个iloop.
而最小公倍数等于两个数的积除以最大公约数。
#include
int max(int first,int second);
int min(int first,int second);
void main()
{
int n1=0,n2=0,imax=0,imin=0;
printf("please input two number:\n");
scanf("%d%d",&n1,&n2);
imax=max(n1,n2);
imin=min(n1,n2);
printf("max number is: %d\n",imax);
printf("min number is: %d\n",imin);
}
int max(int first,int second)
{
int itmp=0,iloop=1;
if(first>second)
{
itmp=first;
first=second;
second=itmp;
}
while(iloop<=first)
{
if(((first%iloop)==0)&&((second%iloop)==0))
itmp=iloop;
iloop=iloop+1;
}
return itmp;
}
int min(int first,int second)
{
int itmp=0;
itmp=first*second/max(first,second);
return itmp;
}
★数字分解算法
试想想十进制数123,要怎样才能分解出1、2和3呢?
个位3当然是:123%10=3;十位2有点难度,不过想想就出来啦:12%10=2嘛,那12怎么来呢?123/10就等于12了嘛~~~至于1,用123除以100就出来啦~程序如下:
#include
void main()
{
int no=0,itmp=0;
scanf("%d",&no);
while(no>0)
{
itmp=no%10;
printf("%d\n",itmp);
no=no/10;
}
}
★水仙花数
所谓水仙花数,是指一个3位的十进制数,该数各位数字的立方和等于该数本身。例如153是一个水仙花数,因为13+53+33=153.100到1000里当然还有几个水仙数,我们就交给电脑算吧~
#include
void main()
{
int ge=0,shi=0,bai=0,itmp=0,ino=0;
for(ino=100;ino<1000;ino++)
{
ge=ino%10;
shi=(ino/10)%10;
bai=(ino/100)%10;
itmp=ge*ge*ge+shi*shi*shi+bai*bai*bai;
if(itmp==ino)
printf("no is: %d\n",ino);
}
}
文章来源博彩网:http://bocaitong2013.com