C++技能训练.docx
《C++技能训练.docx》由会员分享,可在线阅读,更多相关《C++技能训练.docx(15页珍藏版)》请在冰点文库上搜索。
![C++技能训练.docx](https://file1.bingdoc.com/fileroot1/2023-5/27/7e1f016f-67a9-4a82-9bb5-1afe5080b6ae/7e1f016f-67a9-4a82-9bb5-1afe5080b6ae1.gif)
C++技能训练
附录二VisualC++技能训练题目
技能训练1:
VC工程管理
【讲解资料】
要拷贝一个完整的工程文件,一般来说只需要拷贝*.cpp、*.h、*.rc、*.dsp、*.dsw文件及RES文件夹,其它文件是中间文件和附件,可以不要。
要重新打开工程,只需双击*.dsw文件或通过菜单“File|OpenWorkspace...”打开该*.dsw。
DEBUG文件夹:
存放测试版的目标文件、可执行文件等
RELEASE文件夹:
存放发行版的目标文件、可执行文件等
RES文件夹:
存放图标(Icon)、光标(Cursor)、位图(Bitmap)等资源
VC默认的版本是DEBUG测试版,要改变版本,通过菜单“Build|SetActiveConfiguration…”
在包含多个工程的情况下,要选择当前操作的工程,通过菜单“Project|SetActiveProject”
【必做题目】《工作区、多工程管理》
1、在一个含两个工程P1、P2的工作区MyWorkspace中加上一个你自己的工程,再删除工程P1。
分别编译、连接、运行各工程。
2、将你的实验工程集中到一个工作区。
3、转移工程,从一个目录(盘)到另一个目录(盘)。
【选做题目】《改变对话框的背景色》
改变对话框的背景色,要做到使上面的静态文本框也以该色为背景。
提示:
可以利用CDialog类的WM_CTLCOLOR消息。
技能训练2:
编译连接错误信息
【讲解资料】
一、C++英语词汇
identifier标识符
formalparameter形式参数
instance实例
instantiate实例化
l-value左值
class类
object对象
abstract抽象
inline[function]内联[函数]
reference引用
declare声明
implementation实现
override重载,过载
default[parameter,constructionfunction]缺省[参数,构造函数]
encapsulation封装
public公有的
private私有的
protected保护的
access访问,存取
inaccessible不可访问的
constructfunction,constructor构造函数
destructfunction,destructor析构函数
duplicate复制
base[class]基[类]
inherit继承
derive派生(类),导出(类)
ambiguous二义性,两义性
virtual[baseclass,function]虚[基类,函数]
operator运算符
friend友元
polymorphism多态性
latebinding迟联编,迟绑定
dynamicbinding动态联编,动态绑定
static静态的
constant[function,object]常量[函数,对象]
volatile易变的
stream流
二、VisualC++6.0英语词汇
visual可视的
resource资源
project工程,项目
workspace工程工作区
debug调试(版)
release发行(版)
Microsoftfoundationclass微软基础类(库)(MFC)
applicationprograminterface应用程序接口(API)
message消息
messagemap消息映像
thread线程
multi-thread多线程
dynamic-linklibrary动态链接库(DLL)
componentobjectmodal组件对象模型(COM)
deviceconnection设备连接,设备描述表(DC)
dialogbox对话框
control控件
clientarea客户区
nonclientarea非客户区
document文档
view视图
serialize序列化
三、常见编译连接错误信息
1、fatalerrorC1010:
unexpectedendoffilewhilelookingforprecompiledheaderdirective
寻找预编译头文件路径时遇到了不该遇到的文件尾。
(一般是没有#include"stdafx.h")
2、fatalerrorC1083:
Cannotopenincludefile:
'R…….h':
Nosuchfileordirectory
不能打开包含文件“R…….h”:
没有这样的文件或目录。
3、errorC2011:
'C……':
'class'typeredefinition
类“C……”重定义。
4、errorC2018:
unknowncharacter'0xa3'
不认识的字符'0xa3'。
(一般是汉字或中文标点符号)
5、errorC2057:
expectedconstantexpression
希望是常量表达式。
(一般出现在switch语句的case分支中)
6、errorC2065:
'IDD_MYDIALOG':
undeclaredidentifier
“IDD_MYDIALOG”:
未声明过的标识符。
7、errorC2082:
redefinitionofformalparameter'bReset'
形式参数“bReset”在函数体中重复定义。
8、errorC2143:
syntaxerror:
missing':
'before'{'
句法错误:
“{”前缺少“;”。
9、errorC2146:
syntaxerror:
missing';'beforeidentifier'dc'
句法错误:
在“dc”前丢了“;”。
10、errorC2196:
casevalue'69'alreadyused
值69已经用过。
(一般出现在switch语句的case分支中)
11、errorC2509:
'OnTimer':
memberfunctionnotdeclaredin'CHelloView'
成员函数“OnTimer”没有在“CHelloView”中声明。
12、errorC2511:
'reset':
overloadedmemberfunction'void(int)'notfoundin'B'
重载的函数“voidreset(int)”在类“B”中找不到。
13、errorC2555:
'B:
:
f1':
overridingvirtualfunctiondiffersfrom'A:
:
f1'onlybyreturntypeorcallingconvention
类B对类A中同名函数f1的重载仅根据返回值或调用约定上的区别。
14、errorC2660:
'SetTimer':
functiondoesnottake2parameters
“SetTimer”函数不传递2个参数。
15、warningC4035:
'f……':
noreturnvalue
“f……”的return语句没有返回值。
16、warningC4553:
'==':
operatorhasnoeffect;didyouintend'='?
没有效果的运算符“==”;是否改为“=”?
17、warningC4700:
localvariable'bReset'usedwithouthavingbeeninitialized
局部变量“bReset”没有初始化就使用。
18、errorC4716:
'CMyApp:
:
InitInstance':
mustreturnavalue
“CMyApp:
:
InitInstance”函数必须返回一个值。
19、LINK:
fatalerrorLNK1168:
cannotopenDebug/P1.exeforwriting
连接错误:
不能打开P1.exe文件,以改写内容。
(一般是P1.Exe还在运行,未关闭)
20、errorLNK2001:
unresolvedexternalsymbol"public:
virtual__thiscallC……:
:
~C……(void)"
连接时发现没有实现的外部符号(变量、函数等)。
【必做题目】《编译连接错误信息》
看懂VC的编译、连接错误信息,
【选做题目】《控件间的非Tab键移动问题》
在对话框中有若干个编辑框和组合框等控件,在默认的情况下,用Tab键和Shift+Tab键可以在各控件间移动,能否改用↓、↑两个上下箭头键实现移动?
技能训练3:
DEBUG调试与跟踪
【讲解资料】
DEBUG使用:
使用前提:
一、编译、连接无严重错误,二、生成版本是调试版。
设置/取消断点:
Insert/Removebreakpoint(F9)
跟踪到断点:
Go(F5)
跟踪一行代码,遇函数越过:
Stepover(F10)
跟踪一行代码,遇函数进入:
Stepinto(F11)
跳出函数:
Stepout(Shift+F11)
跟踪到光标所在处:
Runtocursor(Ctrl+F10)
查看变量或对象:
Watch
变量或对象的快速查看:
QuickWatch(Shift+F9)
看函数调用:
Callstack
停止跟踪:
Stopdebugging(Shift+F5)
【必做题目】《DEBUG使用》
DEBUG的程序调试跟踪练习
1、设断点
2、开始跟踪
3、单步跟踪
4、越过函数、进入函数
5、变量、对象、函数调用层次查看
6、结束跟踪
【选做题目】无
技能训练4:
查找MFC源代码
【讲解资料】
如何查找MFC类的源代码
有关Windows定义的宏位于
\ProgramFiles\MicrosoftVisualStudio\VC98\Include目录
有关MFC的类声明和宏位于
\ProgramFiles\MicrosoftVisualStudio\VC98\MFC\Include目录
有关MFC的类实现代码位于
\ProgramFiles\MicrosoftVisualStudio\VC98\MFC\SRC目录
通过VC的菜单“Edit|FindinFiles…”,输入适当的查找串和查找范围,进行查找。
【必做题目】《查找MFC类》
1、某个宏名及其相关宏的查找
2、某个MFC类的声明
3、某个成员函数的实现代码
【选做题目】《DLL的编制和调用》
1、做一个DLL,导出若干函数,这些函数至少有两个不同类型的参数并有返回值。
2、调用该DLL。
用LoadLibrary()函数装入DLL,用GetProcAddress()得到DLL中具体函数的入口地址。
技能训练5:
控件
【讲解资料】
操纵控件,有一个非常重要的函数:
GetDlgItem(),它以控件ID号为参数,获得控件指针。
例如:
CEdit*pEdit;
pEdit=(CEdit*)GetDlgItem(IDC_EDIT1);
pEdit->SetWindowText("……");
也可给各控件添加相应的Control型对话框成员对象(通过ClassWizard),这样不必用GetDlgItem了获得控件指针,而是通过控件对象。
例如:
m_edit1.SetWindowText("……");//假设m_edit1为编辑框控件对象
还可直接给各控件添加相应的Value型对话框成员对象(通过ClassWizard),然后用UpdateData()函数实现数据交换,参数填true为交换方向为控件到成员,填false为成员到控件。
例如:
UpdateData(true);
m_strEdit1+="……";//假设m_strEdit1为编辑框的Value型成员
UpdateData(false);
用ShowWindow()使之可见或不可见,用EnableWindow()使之可用或不可用。
【必做题目】《控件》
1、按钮、复选钮、单选钮、列表框、组合框、编辑框、列表控件、进度条
2、获取内容、设置内容、清空
【选做题目】《E-mail的VC实现》
利用MAPI或其它手段,只要输入某数据文件的路径名和对方E-mail地址,然后按一下"发E-mail"按钮,就使该数据文件作为E-mail的附件发给对方。
要发送的数据文件可能是普通文本文件,也可能是数据库文件或图片,甚至是一个*.exe可执行文件。
技能训练6:
EXE软件集成
【讲解资料】
如何运用System、ShellExecute和Navigate三个函数是计算器、QQ、浏览器三个不相关的应用软件集成到一个界面?
用system()进入计算器,用ShellExecute()函数进入QQ,用WebBrowser控件的Navigate()函数进入浏览器。
WebBrowser控件的用法:
先通过菜单“Project|AddToProject|ComponentsandControls...|RegisteredActiveXControls|Insert|MicrosoftWeb浏览器|Insert”,确定,OK。
此时对话框的控件板上多了一个浏览器控件。
然后画上浏览器控件,指定它的对话框成员,写消息响应代码。
这三个函数的用法是(摘自MSDN)
1、system
Executeacommand.
intsystem(constchar*command);
ReturnValue:
IfcommandisNULLandthecommandinterpreterisfound,thefunctionreturnsanonzerovalue.Ifthecommandinterpreterisnotfound,itreturns0andsetserrnotoENOENT.IfcommandisnotNULL,systemreturnsthevaluethatisreturnedbythecommandinterpreter.
Remarks:
Thesystemfunctionpassescommandtothecommandinterpreter,whichexecutesthestringasanoperating-systemcommand.systemreferstotheCOMSPECandPATHenvironmentvariablesthatlocatethecommand-interpreterfile(thefilenamedCMD.EXEinWindowsNT).IfcommandisNULL,thefunctionsimplycheckstoseewhetherthecommandinterpreterexists.
(AbstractfromMSDN)
2、ShellExecute
HINSTANCEShellExecute(
HWNDhwnd,
LPCTSTRlpOperation,
LPCTSTRlpFile,
LPCTSTRlpParameters,
LPCTSTRlpDirectory,
INTnShowCmd
);
hwnd:
Windowhandletoaparentwindow.
lpOperation:
Addressofanull-terminatedstringthatspecifiestheoperationtoperform."open"、"print"or"explore",ThisparametercanbeNULL.Inthatcase,thefunctionopensthefilespecifiedbylpFile.
lpFile:
Addressofanull-terminatedstringthatspecifiesthefiletoopenorprintorthefoldertoopenorexplore.
lpParameters:
Parameterstobepassedtotheapplication.
lpDirectory:
Addressofanull-terminatedstringthatspecifiesthedefaultdirectory.
nShowCmd:
IflpFilespecifiesanexecutablefile,nShowCmdspecifieshowtheapplicationistobeshownwhenitisopened.Thisparametercanbeoneofthefollowingvalues:
SW_SHOWDEFAULT、SW_SHOWMAXIMIZED、SW_SHOWMINIMIZED,etc.
(AbstractfromMSDN)
3、CWebBrowser2:
:
Navigate
voidNavigate(LPCTSTRURL,VARIANT*Flags,
VARIANT*TargetFrameName,VARIANT*PostData,VARIANT*Headers);
URL:
Addressofanull-terminatedstringthatspecifiestheuniversalresourcelocator(URL).
Flags:
TargetFrameName:
PostData:
Headers:
OtherWebBrowserparametersoftenbepassedwithNULL.
Example:
1、:
:
system("C:
\\WINDOWS\\SOL.EXE");
2、:
:
ShellExecute(0,NULL,
"C:
\\WINDOWS\\WINWORD.EXE",NULL,NULL,SW_SHOWMAXIMIZED);
3、m_MyBrowser.Navigate("",NULL,NULL,NULL,NULL);
【必做题目】《扫雷(或计算器)、QQ、浏览器三合一》
在对话框中加三个按钮:
“扫雷(或计算器)”、“QQ”和“IE浏览器”
1、点击“扫雷(或计算器)”,用system()函数进入扫雷游戏(或计算器),点击“QQ”,用ShellExecute()函数进入QQ。
2、点击“IE浏览器”,用WebBrowser控件的Navigate()函数进入浏览器。
【选做题目】《打印和打印预览问题》
在文档/视图模型中,打印和打印预览问题得到很好地解决,解放了编写大量打印代码的劳动。
在一个非文档/视图体系结构的应用软件中,如何将文档/视图模型中的打印代码分离出来,服务于此应用软件,使之也能实现打印和打印预览。
技能训练7:
文件操作
【讲解资料】
方法一:
用CFile、CStdioFile类
CFile成员函数有Open,Close,Read,Write等。
CFile的构造函数也可打开文件。
例子:
CFilefile;
charbuffer[1000];
file.Open("c.txt",CFile:
:
modeRead);
file.Read(buffer,80);
file.Close();
CStdioFile成员函数还有ReadString,WriteString。
方法二:
用文件输入输出流类ifstream和ofstream
要实现文件1到文件2的复制,先创建文件1的输入流对象和文件2的输出流对象,创建方法有两种:
open函数或构造函数。
然后分别使用输入流对象的get、getline或read函数、输出流的put或write函数。
例子:
#include
ifstreamfin;
charbuffer[100];
fin.open("t.txt",ios:
in);
do{
fin.getline(buffer,100);
}while(!
fin.eof());
flil.close();
【必做题目】《文件操作》
1、将文本文件Area.TXT拷贝到另一个文件NewArea.TXT中,并在每行前加上行号和冒号,两个文件名通过编辑框控件输入。
2、将二进制数据文件SimLi.FNT分割成若干个小文件,小文件的尺寸通过编辑框控件输入,小文件的名字分别取SimLi1.FNT,SimLi2.FNT,SimLi3.FNT,……。
上述两题要求一题用CFile类实现,另一题用流类实现。
【选做题目】《文件浏览》
类似于文件打开公用对话框的文件浏览器。
技能训练8:
数据库访问
【讲解资料】
数据库应用编程
【必做题目】《单文档视图的数据库应用程序》
用单文档/视图框架做一个数据库访问应用程序,具有记录的添加、删除、修改功能,界面上有添加、删除、修改、保存、返回等按钮或菜单项。
上述基本功能完成的基础上还可加索引、浏览等功能。
原始数据库的例子可以用Access数据库SampleDB.mdb。
【选做题目】《Access数据库的访问与DLL的结合》
做一个DLL,访问人力资源的Access数据库,其中的函数比如GetName(),GetBirthday(),MoveFirst(),MoveNext()以DLL导出函数的形式提供给访问者。
在DLL内部进行数据库和表的连接和断开,使访问者无须关心具体数据的存储名称、位置和格式。
技能训练9:
Web浏览器
【讲解资料】
编写一个简单的Web浏览器,除了利用“MicrosoftWeb浏览器”ActiveX控件外,还有基于CHtmlView的Doc/View框架的办法。
操作步骤是:
第一步:
在向导的第4步选“InternetExplorerReBars”,第6步的View的基类选CHtmlView。
第二步:
在视图类(CHtmlView的子类)的OnInitialUpdate()加
Navigate2(_T(""),NULL,NULL);
这样就能浏览新浪主页了,如果允许指定任意网页,继续下列