C++程序设计集中上机正式版.docx
《C++程序设计集中上机正式版.docx》由会员分享,可在线阅读,更多相关《C++程序设计集中上机正式版.docx(103页珍藏版)》请在冰豆网上搜索。
C++程序设计集中上机正式版
第一部分VisualC++实验环境介绍
一、VisualC++简介
VisualC++是Microsoft公司的VisualStudio开发工具箱中的一个C++程序开发包。
VisualStudio提供了一整套开发Internet和Windows应用程序的工具,包括VisualC++,VisualBasic,VisualFoxpro,VisualInterDev,VisualJ++以及其他辅助工具,如代码管理工具VisualSourceSafe和联机帮助系统MSDN。
VisualC++包中除包括C++编译器外,还包括所有的库、例子和为创建Windows应用程序所需要的文档。
从最早期的1.0版本,发展到最新的6.0版本,VisualC++已经有了很大的变化,在界面、功能、库支持方面都有许多的增强。
最新的6.0版本在编译器、MFC类库、编辑器以及联机帮助系统等方面都比以前的版本做了较大改进。
VisualC++一般分为三个版本:
学习版、专业版和企业版,不同的版本适合于不同类型的应用开发。
实验中可以使用这三个版本的任意一种。
VisualC++集成开发环境(IDE)
集成开发环境(IDE)是一个将程序编辑器、编译器、调试工具和其他建立应用程序的工具集成在一起的用于开发应用程序的软件系统。
VisualC++软件包中的DeveloperStudio就是一个集成开发环境,它集成了各种开发工具和VC编译器。
程序员可以在不离开该环境的情况下编辑、编译、调试和运行一个应用程序。
IDE中还提供大量在线帮助信息协助程序员做好开发工作。
DeveloperStudio中除了程序编辑器、资源编辑器、编译器、调试器外,还有各种工具和向导(如AppWizard和ClassWizard),以及MFC类库,这些都可以帮助程序员快速而正确地开发出应用程序。
向导(Wizard)
向导是一个通过一步步的帮助引导你工作的工具。
DeveloperStudio中包含三个向导,用来帮助程序员开发简单的Windows程序,它们是:
AppWizard:
用来创建一个Windows程序的基本框架结构。
AppWizard向导会一步步向程序员提出问题,询问他所创建的项目的特征,然后AppWizard会根据这些特征自动生成一个可以执行的程序框架,程序员然后可以在这个框架下进一步填充内容。
AppWizard支持三类程序:
基于视图/文档结构的单文档应用、基于视图/文档结构的多文档应用程序和基于对话框的应用程序。
也可以利用AppWizard生成最简单的控制台应用程序(类似于DOS下用字符输入输出的程序)。
ClassWizard:
用来定义AppWizard所创建的程序中的类。
可以利用ClassWizard在项目中增加类、为类增加处理消息的函数等。
ClassWizard也可以管理包含在对话框中的控件,它可以将MFC对象或者类的成员变量与对话框中的控件联系起来。
ActiveXControlWizard:
用于创建一个ActiveX控件的基本框架结构。
ActiveX控件是用户自定义的控件,它支持一系列定义的接口,可以作为一个可再利用的组件。
MFC库
库(library)是可以重复使用的源代码和目标代码的集合。
MFC(MicrosoftFundamentalCasses)是VisualC++开发环境所带的类库,在该类库中提供了大量的类,可以帮助开发人员快速建立应用程序。
这些类可以提供程序框架、进行文件和数据库操作、建立网络连接、进行绘图和打印等各种通用的应用程序操作。
使用MFC库开发应用程序可以减少很多工作量。
二、项目开发过程
在一个集成的开发环境中开发项目非常容易。
一个用C++开发的项目的通用开发过程可以用左图表示。
建立一个项目的第一步是利用编辑器建立程序代码文件,包括头文件、代码文件、资源文件等。
然后,启动编译程序,编译程序首先调用预处理程序处理程序中的预处理命令(如#include,#define等),经过预处理程序处理的代码将作为编译程序的输入。
编译对用户程序进行词法和语法分析,建立目标文件,文件中包括机器代码、连接指令、外部引用以及从该源文件中产生的函数和数据名。
此后,连接程序将所有的目标代码和用到的静态连接库的代码连接起来,为所有的外部变量和函数找到其提供地点,最后产生一个可执行文件。
一般有一个makefile文件来协调各个部分产生可执行文件。
图1-2-1项目开发过程
可执行文件分为两种版本:
Debug和Release。
Debug版本用于程序的开发过程,该版本产生的可执行程序带有大量的调试信息,可以供调试程序使用,而Release版本作为最终的发行版本,没有调试信息,并且带有某种形式的优化。
学员在上机实习过程中可以采用Debug版本,这样便于调试。
选择是产生Debug版本还是Release版本的方法是:
在DeveloperStudio中选择菜单Build|SetActiveConfiguration,在弹出的对话框中,选择所要的类型,然后选择OK关闭对话框。
VisualC++集成开发环境中集成了编辑器、编译器、连接器以及调试程序,覆盖了的开发应用程序的整个过程,程序员不需要脱离这个开发环境就可以开发出完整的应用程序。
三、集成开发环境DeveloperStudio
进入DeveloperStudio
如果你使用的是VisualC++6.0,则要进入DeveloperStudio,需要单击任务栏中“开始”后选择“程序”,找到MicrosoftVisualStudio6.0文件夹后,单击其中的MicrosoftVisualC++6.0图标,则可以启动DeveloperStudio。
DeveloperStudio的界面
DeveloperStudio用户界面是一个由窗口、工具条、菜单、工具及其他部分组成的一个集成界面。
通过这个界面,用户可以在同一环境下创建、测试、调试应用程序。
VC5和VC6的DeveloperStudio的初始化界面有一些小的差异,VC6的界面(打开一个项目TcpClient以后的界面)如下:
图1-3-1DeveloperStudio的界面
主要部分介绍如下:
✓工具条和菜单,用于提供用户操作的命令接口。
菜单以文字和层次化的方式提供命令接口,工具条由一系列按钮组成。
这些按钮用一系列小的位图标志。
工具条以图标方式提供快速的命令选择。
菜单和工具条在开发的不同进程有不同显示内容。
当第一次打开DeveloperStudio时,标准的工具条和菜单就会显示出来,随着开发的不同步骤,不同的工具条就会自动显示出来,菜单也会有所变化。
工具条有很多种,你可以显示任意多的工具条,只要屏幕空间允许。
工具条可以任意移动,也可以放大缩小。
工具条和菜单条功能基本相同,唯一的区别是:
菜单条总占据一行,并且一般不能隐藏。
✓工作区窗口,这个窗口包含关于正在开发的这个项目的有关信息。
在没有开发任何项目时,该窗口显示系统的帮助目录。
当打开一个项目以后,工作区窗口将会显示关于当前项目的文件信息和类的信息。
下图是打开一个项目TcpClient以后的工作区窗口。
✓图1-3-2工作区窗口
✓文档窗口区,这个区域可以显示各种类型的文档,如源代码文件、头文件、资源文件等。
可以同时打开多个文档。
✓输出窗口,输出窗口用来显示几种信息,可以通过选择不同的标签显示不同的信息。
这些信息包括:
编译连接结果信息(Build标签)、调试信息(Debug标签)、查找结果信息(FindinFiles标签)。
其中查找结果信息有两个标签,可以显示两次在文件中查找指定内容的结果
VC6因为在联机帮助系统上比VC5做了很大改进,所以在工作区窗口中没有VC5的InfoView,初始化界面的其他部分都与VC5相似。
DeleveloperStudio使用MicrosoftDeveloperNetwork(MSDN)库作为它的联机帮助系统。
其界面如下:
图1-3-3VC6.0MSDN联机帮助界面
总的来说,窗口和命令接口(包括工具条和菜单条)是构成界面的最主要组成部分。
通常有两种窗口:
文档窗口和可附着(docking)窗口。
文档窗口显示在文档窗口区,用于显示和编辑文档,其的大小和位置可以随其所处的DeveloperStudio窗口的改变而改变,可以最大化和最小化。
可附着窗口可以附着于应用程序窗口的边界,也可以浮在屏幕上的任何位置。
可附着窗口有:
工作区(workspace)窗口,输出(output)窗口,调试窗口(包括variable,watch,local等窗口)等。
文档窗口的位置、大小及是否可见和它所在的项目有关,docking窗口的位置、大小及是否可见则与项目进行的状态以及各种编辑和调试的操作有关。
各种窗口和各种工具条以及菜单构成了界面的布局。
一旦用户决定了一种界面布局,系统就会为一直为用户保持这种布局,直到用户下一次改变该布局为止。
获得帮助信息
大多数时候,你可以通过按F1得到上下文帮助。
如在编辑文件时按F1可以得到有关编辑的帮助,在编译连接错误信息上按F1可以得到关于该错误的帮助信息。
如果想系统地获得帮助,VC6中,可以通过选择菜单Help|Contents来启动MSDN查阅器,MSDN查阅器是一个功能强大的程序,可以方便地浏览、查找信息,要想知道具体如何使用MSDN查阅器,可以在MSDN查阅器中选菜单Help下的命令,其界面如上图所示。
VisualC++的编辑器
DeveloperStudio包含一个功能强大的编辑器,可以编辑将被编译成Windows程序的VisualC++源文件。
这个编辑器有点象字处理器,但是没有字处理器具备的复杂的排版、文本格式等功能,它注重的是如何帮助程序员快速高效地编制程序。
它具有以下特点:
✓自动语法。
用高亮度和不同颜色的字来显示不同的语法成分,如注释、关键字和一般代码用不同的颜色显示
✓自动缩进。
帮助你排列源代码,使其可读性更强
✓参数帮助。
在编辑时用到预定义的windows函数时,可以自动为你显示函数参数
✓集成的关键字帮助。
能够使你快速得到任何关键字、MFC类或Windows函数的帮助信息(按F1即可)
✓拖放编辑。
能够用鼠标选择文本并自由拖动到任意位置
✓自动错误定位。
能自动将光标移动到有编译错误的源代码处。
当你打开一个源代码文件时,就可以利用编辑器对其进行编辑。
源代码文件在文档显示区显示,每个文件有独立的显示窗口。
如果你选择用其他编辑器编辑源文件,必须将它以纯文本的方式保存。
VC的编译器不能处理其中有特别格式字符的文件。
四、常用功能键及其意义
为了使程序员能够方便快捷地完成程序开发,开发环境提供了大量快捷方式来简化一些常用操作的步骤。
键盘操作直接、简单,而且非常方便,因而程序员非常喜欢采用键盘命令来控制操作。
下面是一些最常用的功能键,希望学员在实验中逐步掌握。
表1-4-1常用功能键分配表
操作类型
功能键
对应菜单
含义
文件操作
Ctrl+N
File|New
创建新的文件、项目等
Ctrl+O
File|Open
打开项目、文件等
Ctrl+S
File|Save
保存当前文件
编辑操作
Ctrl+X
Edit|Cut
剪切
Ctrl+C
Edit|Copy
复制
Ctrl+V
Edit|Paste
粘贴
Ctrl+Z
Edit|Undo
撤消上一个操作
Ctrl+Y
Edit|Redo
重复上一个操作
Ctrl+A
Edit|SelectAll
全选
Del
Edit|Del
删除光标后面的一个字符
建立程序操作
Ctrl+F7
Build|Compilercurrentfile
编译当前源文件
Ctrl+F5
Build|Runexe
运行当前项目
F7
Build|Buildexe
建立可执行程序
F5
Build|StartDebugging
启动调试程序
调试
F5
Debug|Go
继续运行
F11
Debug|Stepinto
进入函数体内部
shift+F11
Debug|Stepout
从函数体内部运行出来
F10
Debug|Stepover
执行一行语句
F9
设置/清除断点
Ctrl+F10
Debug|Runtocursor
运行到光标所在位置
shift+F9
Debug|QuickWatch
快速查看变量或表达式的值
Shift+F5
Debug|Stopdebugging
停止调试
第二部分基础实验
注意事项:
(1)每次实验以前,需要详细阅读实验目的、实验要求和实验提示,以便能准确地理解实验要求,达到实验的目的。
有测试数据要求的,需要给出测试结果,有要求回答问题的,需要给出问题的回答。
每次实验都有几个题目,要求为每个题目创建不同的项目,以便于检查。
(2)有的实验前后有联系,需要先完成前面的实验再进行后面的实验,如类和继承的实验。
请务必按照先后顺序完成实验。
(3)辅导老师那儿有关于实验的详细解答,如果有疑问,可以请教辅导老师。
一、C++中动态内存分配与释放
实验目的
掌握指针的定义
掌握指针间接操作数据的方法
掌握C++中动态分配内存方法
掌握C++中动态内存的释放
体会C++动态操作内存作用
实验内容
1、编写如下程序,掌握C++中指针定义的方法,学会若何利用指针间接操作数据,并能够举一反三掌握多种数据类型的指针定义的方法,并能够体会指针间接操作数据的作用。
#include
voidmain()
{
intvalue1=10,value2=20,temp;
int*ptr;
ptr=&value1; //ptr指向value1
temp=*ptr; //*ptr表示ptr指向的地址空间中的数据,即value1的值
*ptr=value2; //将value2的值复制到ptr指向的地址空间,即value1中
value2=temp;
cout<cout<}
[实现要求]:
●编写该程序,分析运行结果,并解释原因?
●思考如果一个指针如果没有赋予地址(没有明确指向一个数据)可否对其进行赋值?
完成下列程序
main()
{
inta[10]={1,2,3,4,5,6,7,8,9,10};
int*p;
for(p=a;______;_______)
{
_____________
_____________
}
printf("%d\t",p);
printf("%d\n",*p);
}
运行结果:
address=-68value=1
address=-66value=2
address=-64value=3
address=-62value=4
address=-60value=5
address=-58value=6
address=-56value=7
address=-54value=8
address=-52value=9
address=-50value=10
2、编写如下程序,掌握C++中动态分配一个内存空间的方法,并能够理解这个内存空间在堆区分配,程序不能够自动释放内存空间,需要用程序语句明确释放。
//示例用new获得动态存储空间。
//example23.cpp
#include
voidmain()
{
int*a=newint;//在堆中分配int型变量所占存储空间,并将首地址赋给指针a
*a=76;
cout<<*a<deletea; //释放a指向的动态存储空间
}
[实现要求]:
●编写该程序,分析运行结果,并解释原因?
●思考如果不释放指针a指向的内存空间,会有什么后果?
3、编写如下程序,掌握C++中动态分配连续存储空间的方法,掌握C++中释放连续分配内存空间的方法。
体会动态分配连续存储空间的优点,懂得具体的应用。
//示例用new申请连续存储空间。
//example24.cpp
#include
#include
voidmain()
{
intarraysize;
int*array;
cout<<"pleaseinputanumberofarray:
";
cin>>arraysize;
if((array=newint[arraysize])==NULL)//申请一块连续的存储空间
{
cout<<"Can′tallocatememory,terminating.";//未分配到存储空间
exit
(1);//该函数在stdlib.h中定义
}
for(intcount=0;count{
array[count]=count*2;
cout<}
cout<delete[]array;//释放array指向的连续存储空间
}
[实现要求]:
●思考连续的内存空间是否一定可以分配到,分配不到会出现何种后果?
●思考如果不释放指针array指向的内存空间,会产生何种后果?
●回顾数组的定义与使用,讨论数组首地址与指针的区别与联系?
[扩展与提高]:
●在C++中动态分配内存是使用new和delete两个操作符实现,在C语言中动态内存的分配与释放是通过两个函数malloc与free实现,在网络上查找相关资料,搞清楚区别与联系?
二、结构体的定义
实验目的
掌握C++结构体数据类型的定义
掌握C++结结构体变量定义的方法
掌握C++结构体变量赋值的方法
掌握C++结构体变量数据访问方法
掌握结构体指针的定义及其使用
实验内容
1、结构体就是一个可以包含不同数据类型的一个结构,它是一种可以自己定义的数据类型,它的特点和数组主要有两点不同,首先结构体可以在一个结构中声明不同的数据类型,第二相同结构的结构体变量是可以相互赋值的,而数组是做不到的,因为数组是单一数据类型的数据集合,它本身不是数据类型(而结构体是),数组名称是常量指针,所以不可以做为左值进行运算,所以数组之间就不能通过数组名称相互复制了,即使数据类型和数组大小完全相同。
定义结构体使用struct修饰符,例如:
structtest
{
floata;
intb;
};//注意分号不能够省略
编写如下程序,理解结构体的定义及其结构体变量的定义,并掌握如何给结构体变量的每个数据成员赋值。
//结构体定义及其结构体变量定义
#include
structdate
{
intyear;
intmonth;
intday;
};
structstudent
{
char*name;
charsex;
datebrith;
char*address;
char*phone;
};
voidmain()
{
studentjimmy;
jimmy.name="Jimmy";
jimmy.brith.year=1985;
jimmy.brith.month=5;
jimmy.brith.day=16;
jimmy.address="Jimmy'shome";
jimmy.phone="1234567";
jimmy.sex=’M’;
cout<<”name”<<<”sex”<<<”brithyear”<<<”brithmonth”<<<”brithday”<<<”address”<<<”phone”<}
[实现要求]:
●编写该程序,分析运行结果,并解释原因?
2、结构体变量可以在定义的时候赋值(初始化),可以先定义后赋值,也可以从键盘中输入数据赋予值得,也可以利用已经存在的结构体变量进行赋值。
//结构体变量的赋值与访问
#include
structStudent
{
char*name;
charsex;
intage;
};
voidmain()
{
Students1={"LiMing",'M',20};
cout<<"Name:
"<<<"Sex:
"<<<"Age:
"<//////////////////////////////////////
Students2=s1;
cout<<"Name:
"<<<"Sex:
"<<<"Age:
"<////////////////////////////////////////
Students3;
s3.name="XiaoHua";
s3.sex='F';
s3.age=18;
cout<<"Name:
"<<<"Sex:
"<<<"Age:
"<//////////////////////////////////////////
Students4;
cout<<"InputName:
";
s4.name=newchar[100];
cin.getline(s4.name,100,'\n');//从输入流中获取字符串,存入到s4.name指向字符串中
cout<<"InputSex:
";
cin>>s4.sex;
cout<<"InputAge:
";
cin>>s4.age;
cout<<"Name:
"<<<"Sex:
"<<<"Age:
"<delete[]s4.name;
}
[测试数据]:
输入:
LiuXiang
M
28
程序结束
[实现要求]:
●编写该程序,掌握结构体变量赋值的几种方式?
[思考问题]
●C++中结构体与C中结构体有什么区别联系?
●如何从键盘给结构体中C串成员赋值?
●如果将结构体中的char*na