《C++程序设计》上机指导与补充习题 2.docx
《《C++程序设计》上机指导与补充习题 2.docx》由会员分享,可在线阅读,更多相关《《C++程序设计》上机指导与补充习题 2.docx(82页珍藏版)》请在冰点文库上搜索。
《C++程序设计》上机指导与补充习题2
《C++程序设计》
上机指导与补充习题
第1部分上机指导
实验一VisualC++6.0的上机操作(2学时)
一、实验目的
1.熟悉VC++6.0集成开发环境。
2.掌握在VC++集成开发环境下编辑、编译、连接和运行一个C++程序的步骤。
3.通过运行简单的C++程序,初步了解C++源程序的结构和特点。
二、实验内容
1.启动VisualC++6.0集成开发环境
VisualC++6.0是微软公司1998年推出的visualstudio系列产品之一,它提供了强大的编译能力以及良好的界面操作性。
能够对Windows下的C++程序设计提供完善的编程环境。
同时它对网络、数据库等方面的编程也提供相应的环境支持。
使用VisualC++6.0编制并运行程序也是编辑(把程序代码输入)、编译(成目标程序文件)、连接(成可执行程序文件)、运行(可执行程序文件)四个步骤,其中第一步的编辑工作是最繁杂而又必须细致地由人工在计算机上来完成,其余几个步骤则相对简单,基本上由系统自动完成。
确认你所使用的计算机是否已经安装VisualC++6.0,若已经安装,则执行“开始”→“程序”→“MicrosoftVisualStudio”→“VisualC++6.0”命令即可启动VisualC++6.0,否则,则应先安装VisualC++6.0。
启动VisualC++6.0,进入到它的集成开发环境窗口,其具体窗口式样如图2-1所示。
图1-1VisualC++6.0集成开发环境式样
图中所示VisualC++6.0的窗口从大体上可分为四部分。
上部是菜单和工具条;左边是工作区显示窗口,这里将显示处理过程中与项目相关的各种文件种类等信息;右边是视图区,这里显示和编辑程序文件的操作区;下边是输出窗口区,程序调试过程中,进行编译、链接、运行时输出的相关信息将在此处显示。
2.创建工程
使用VisualC++6.0编制并处理C++程序时要创建工程,因此必须先要了解VisualC++6.0的工程(有的资料也翻译成项目)的概念,而工程又与工程工作区相关联。
实际上,VisualC++6.0是通过工程工作区来组织工程及其各相关元素的,就好像是一个工作间,以后程序所牵扯到的所有的文件、资源等元素都将放入到这一工作间中,从而使得各个工程之间互不干扰,使编程工作更有条理。
这种思想反应到实现上就是一个工作区对应于一个独立的文件夹。
简单的情况下,一个工作区中用来存放一个工程,代表着某一个要进行处理的程序。
如果需要,一个工作区中也可以用来存放多个工程,其中可以包含该工程的子工程或者与其有依赖关系的其他工程。
创建工程工作区之后,系统将创建出一个相应的工作区文件,后缀为“.dsw”,用来存放与该工作区相关的信息;另外还将创建出的其他几个相关文件是:
工程文件(后缀是“.dsp”)以及选择信息文件(后缀是“.opt”)等。
在Windows环境下通过双击工作区文件或工程文件都可以打开相应的工程。
VisualC++6.0已经预先为用户准备好了近20种不同的工程类型以供选择,选定不同的类型意味着让VisualC++6.0系统帮着提前做某些不同的准备以及初始化工作(例如,事先为用户自动生成一个所谓的底层程序框架,并进行某些隐含设置,如隐含位置、预定义常量、输出结果类型等)。
工程类型中,其中有一个为“Win32ConsoleApplication”的类型,称之为控制台应用,它是我们首先要掌握的、用来编制运行C++程序方法中最简单的一种。
此种类型的程序运行时,将出现并使用一个类似于DOS的窗口,这个类似于DOS的窗口就是控制台,通过它提供对字符模式的各种处理与支持。
实际上,用此种类型的工程开发的应用程序是具有字符界面的应用程序。
此种类型的工程小巧而简单,并且足以解决并支持本课程中涉及到的面向对象编程内容与技术,使我们把重点放在面向对象思想的理解及程序的设计,而并非界面处理等方面,至于VisualC++6.0支持的其他工程类型,我们在今后的学习和工作中遇到再逐渐了解、掌握与使用。
创建工程的步骤为:
首先,选择“File”→“New”→“Projects”命令,会弹出如图2-2所示的对话框,从左侧选项中选择“Win32ConsoleApplication”项,在右侧“Location”文本框中填入存放与工程工作区相关的所有文件及其相关信息的文件夹的路径及名称,当然也可通过点击其右部的“…”按钮去选择并指定这一文件夹即子目录位置。
在“Projectname”文本框中填入工程名,注意,此时VisualC++6.0会自动在其下的Location文本框中用该工程名建立一个同名的子目录,随后的工程文件以及其他相关文件都将存放在这个目录下。
图1-2VisualC++6.0新建工程对话框
然后,单击OK进入下一个对话框,如图2-3所示。
图1-3新建控制台工程类型选择对话框
从图中可以看到有四种类型的控制台工程可供选择:
若选择“Anemptyproject”项将生成一个空的工程,工程内不包括任何东西。
若选择“Asimpleapplication”项将生成包含一个空的main函数和一个空的头文件的工程。
若选“A"HelloWorld!
"application”项将生成包含一个有显示出“HelloWorld!
”字符串的输出语句的main函数和一个空的头文件的工程。
若选择“AnapplicationthatsupportsMFC”项的话,可以利用VisualC++6.0所提供的基础类库来进行编程。
选择“Finish”,系统自动建立一个基于控制台的工程。
建立好工程的VisualC++6.0系统界面如图2-4所示。
图1-4建立控制台工程后的系统界面
3.编辑源程序
工程建好之后,下一步要做的工作就是在工程中建立一个源程序并编辑它。
选择时“Project”→“AddToProject”→“New”命令,打开新建对话框,在“Files”标签下选择“C++SourceFile”类型,在右边的“File”文本框中填入源程序的文件名,单击“OK”按钮完成源程序的创建。
界面如图2-5所示。
图1-5新建源程序的对话框界面
建立好源程序后会在VisualC++6.0右边的视图区打开并显示该源程序,在这里我们可以键入代码,编辑源程序,如图2-6所示。
图1-6编辑源程序的界面
4.编译、连接、运行程序
源程序编辑完成后,首先选择执行“Build”菜单中的“Compile”项,对源程序进行编译。
若编译中发现错误或警告,将在Output窗口中显示出它们具体的出错或警告信息以及所在的行,可以通过这些信息的提示来修改程序中的错误或警告。
编译通过后,可以选择菜单的第二项Build来进行链接生成可执行程序。
在链接中出现的错误也将显示到Output窗口中。
最后就可以运行程序,选择Execute项,VisualC++6.0将运行已经编好的程序,执行后将出现一个结果界面,如图2-7所示。
其中的“pressanykeytocontinue”是由系统产生的,使得用户可以浏览输出结果,直到按下了任一个键盘按键时再返回到编辑界面。
图1-7程序运行的界面
这些编译、生成、执行这些操作也可以通过单击工具条上的相应的命令按钮来快捷的完成。
另外,如果源程序编辑后没有编译就单击了“执行”按钮,系统会自动的进行编译、连接和执行操作;如果源程序已经编译过了,即上次运行后没有编辑源程序,这时单击“执行”按钮,系统就不再编译和连接而是直接执行上次生成的可执行程序了。
三、巩固练习
按照上面讲述的使用VisualC++6.0编制并运行程序的步骤,编写一个在屏幕上输出信息“WelcometoC++World!
”的程序并运行。
实验二C++对C的扩充(4学时)
一、实验目的
1.了解在面向过程程序设计中C++对C语言的扩充与增强,并善于在编写程序过程中应用这些新的功能。
2.进一步熟悉在所用的VC++集成开发环境下编辑、编译、连接和运行C++程序的方法。
3.进一步熟悉C++程序的结构和编程方法。
二、实验内容
1.请先阅读下面的2个程序,写出程序运行的结果,然后再上机运行程序,验证自己分析的结果是否正确。
程序1:
#include//包含头文件命令
usingnamespacestd;//使用名字空间std
intmain()
{
cout<<"This"<<"is";
cout<<"a"<<"C++";
cout<<"program."<return0;
}
程序运行的结果:
ThisisaC++program.
程序2:
#include//包含头文件命令
usingnamespacestd;//使用名字空间std
intmain()
{inta,b,c;//定义三个变量a、b、c
cout<<"Pleaseinputtoaandb:
"<cin>>a>>b;//等待用户从键盘输入数据
c=a+b;
cout<<"a+b=" ;
cout<cout<return0;
}
程序运行的结果:
Pleaseinputtoaandb:
12
a+b=3
ThisisaC++program.
2.输入以下程序,进行编译,观察编译结果,如果有错误,请修改程序,再进行编译,直到没有错误,然后进行连接和运行,并分析运行结果。
#include//包含头文件命令
usingnamespacestd;//使用名字空间std
intmain()
{inta,b;//定义两个变量a和b
cout<<"Pleaseinputtoaandb:
"<cin>>a>>b;//等待用户从键盘输入数据
cout<<"Max="<return0;//主函数返回0至操作系统
}
intmax(intx,inty){return(x>y) ?
x:
y;}//求两个数中的大者的函数
测试的知识点:
若函数的调用在前,定义在后,则需要在函数调用语句前对函数作原型声明
3.编写一个函数,用来求2个或3个正整数中的最大数,并在主函数中调用此函数。
(1)用不带默认参数的函数实现。
(2)用带默认参数的函数实现。
对比两种方法,分析使用带默认参数的函数的优点和应用场合。
总结如何选择默认参数的值。
请分析本题中默认参数的值应该在什么范围选取。
4.编写一个函数,用来实现对3个数按由小到大的顺序排序,并在主函数中调用此函数。
要求函数的形参用以下两种形式实现:
(1)使用指针形参
(2)使用引用形参
5.编写程序,用同一个函数名实现n个数据的升序排序,数据类型可以是整型、单精度型、字符串型。
用重载函数实现。
6.编写程序,将两个字符串连接起来,结果取代第一个字符串。
实验三、类和对象(10学时)
一、实验目的
1.掌握声明类的方法,类和类的成员的概念以及定义对象的方法。
2.初步掌握用类和对象编制基于对象的程序。
3.学习检查和调试基于对象的程序。
4.掌握类的构造函数和析构函数的概念和使用方法。
5.掌握对象数组、对象的指针及其使用方法。
6.掌握共用数据的保护方法
二、实验内容
1.检查下面的程序,找出其中的错误,并改正之。
然后上机调试,使之能正常运行。
(1)
#include
usingnamespacestd;
classClock
{voidset_clock(void);
voidshow_clock(void);
inthour;
intminute;
intsecond;
};
Clockclock;
intmain()
{
set_clock();
show_clock();
}
intset_clock(void)
{
cin>>t.hour;
cin>>t.minute;
cin>>t.second;
}
intshow_clock(void)
{
cout<"<"<}
(2)
#include
usingnamespacestd;
classA
{public:
voidA(inti=0){m=i;}
voidshow(){cout<void~A(){}
private:
intm;
};
intmain()
{Aa(5);
a.m+=10;
a.show();
return0;
}
(3)
#include
usingnamespacestd;
classX
{private:
inta=0;
int&b;
constintc;
voidsetA(inti){a=i;}
X(inti){a=i;}
public:
intX(){a=b=0;}
X(inti,intj,intk){a=i;b=j;c=k;}
setC(intk)const{c=c+k;}
};
intmain()
{
Xx1;
Xx2
(2) ;
Xx3(1,2,3) ;
x1.setA(3) ;
return0 ;
}
2.请先阅读下面的程序,写出程序运行的结果,然后再上机运行程序,验证自己分析的结果是否正确。
(1)
#include
usingnamespacestd;
classtest{
public:
test();
intgetint(){returnnum;}
floatgetfloat(){returnfl;}
~test();
private:
intnum;
floatfl;
};
test:
:
test()
{
cout<<"Initalizingdefault"<num=0;fl=0.0;
}
test:
:
~test()
{
cout<<"Destructorisactive"<}
intmain()
{
testarray[2];
cout<return0;
}
(2)
#include
usingnamespacestd;
#include
classX
{public:
X(intx1,char*x2,floatx3):
a(x1),c(x3)
{b=newchar[sizeof(x2)+1];
strcpy(b,x2);
}
X():
a(0),b("X:
:
X()"),c(10){}
X(intx1,char*x2="X:
:
X(....)",intx3=10):
a(x1),b(x2),c(x3){}
X(constX&other)
{a=other.a;
b="X:
:
X(constX&other)";
c=other.c;
}
voidprint()
{cout<<"a="<private :
inta;
char*b;
floatc;
};
intmain(){
X*A=newX(4,"X:
:
X(int,char,float)",32);
XB,C(10),D(B);
A->print();
B.print();
C.print();
D.print();
return0;
}
3.某单位的职工工资包括基本工资Wage,岗位津贴Subsidy,房租Rent,水费WaterFee,电费ElecFee。
设计实现工资管理的类Salary,该类的形式如下:
classSalary
{public:
Salary(){初始化工资数据的各分项数据为0}
Salary(……){初始化工资数据的各分项数据}
voidsetXX(doublef){XX=f;}
doublegetXX(){returnXX;}
doubleRealSalary(){……}//计算实发工资
……
Private:
BoubleWage,Subsidy,Rent,WaterFee,ElecFee;
};
其中,成员函数setXX()用于设置工资的各分项数据,成员函数getXX()用于获取工资的各分项数据,XX代表Wage、Subsidy等数据成员,如Wage对应的成员函数则为setWage()和
getWage()。
实发工资=Wage+Subsidy-Rent-WaterFee-ElecFee
编程完善该类的设计,并在主函数中测试该类的各成员函数。
4.设计一个时钟类Clock。
数据成员包括hour(小时)、minute(分钟)、second(秒)。
要求用成员函数实现以下功能:
(1)创建具有指定时钟(小时、分钟、秒)的Clock对象,默认时钟为00:
00:
00。
(2)动态地设置时、分、秒。
(3)在屏幕上按“时:
分:
秒”的格式显示时钟。
(4)在主函数中测试该类。
5.设计一个职工类Employee。
数据成员包括字符串型的name(姓名)、street(街道地址)、city(市)、province(省)、postalcode(邮政编码)。
要求用成员函数实现以下功能:
(1)创建职工对象时,可以按不同方式指定职工信息。
(2)动态地设置职工对象信息。
(3)在屏幕上打印职工信息。
(4)在主函数中测试该类。
6.需要求3个三角形的体积,请编写一个基于对象的程序。
数据成员包括三角形的三边长a、b、c。
要求用成员函数实现以下功能:
(1)定义构造函数完成三角形的初始化;
(2)求三角形的周长;
(3)求三角形的面积;
(4)输出三角形信息。
7.下面是一个整型数组类intArray的声明,请给出该类所有数据成员的类外定义。
classintArray
{public:
intArray(intsize);//构造函数
intArray(constintArray&x);//复制构造函数
~intArray();//析构函数
boolSet(inti,intelem);//设置第i个数组元素的值,设置成功返回true,失败返回false
boolGet(inti,int&elem);//获取第i个数组元素的值,获取成功返回true,失败返回false
intLength()const;//获取数组的长度
voidReSize(intsize);//重置数组
voidPrint();//输出数组
private:
int*element;//指向动态数组的指针
intarraysize;//数组的大小
};
8.下面是一个整型链表类intList的声明,请给出该类所有数据成员的类外定义。
classintList
{protected:
structNode{
Node*next;
intdata;
};
Node*pFirst;
public:
intList();//构造函数
~intList();//析构函数
//向链表的第i个位置插入一个元素,插入成功返回true,失败返回false
boolInsert(inti,intelem) ;
//删除链表的第i个位置的元素,删除成功返回true,失败返回false
boolRemove(inti,int&elem);
int*Find(intelem)const;//查找值为elem的元素,返回该元素在链表中的位置
intLength()const;//返回链表长度
voidPrintlist();//输出链表
};
9.下面是一个整型堆栈类intStack的声明,请给出该类所有数据成员的类外定义。
classintStack
{public:
intStack(intsize=10);//构造函数
~intStack();//析构函数
boolPush(intelem);//入栈操作
boolPop(int&elem);//出栈操作
intLength()const;//获取栈中元素的个数
private:
int*data;//指向动态数组的指针
inttop;//栈顶指针
intsize;//堆栈的容量
};
实验四、继承与组合(6学时)
一、实验目的
1.了解继承在面向对象程序设计中的重要作用。
2.进一步理解继承与派生的概念。
3.掌握通过继承派生出一个新的类的方法。
4.了解虚基类的作用和用法。
5.掌握类的组合
二、实验内容
1.请先阅读下面的程序,写出程序运行的结果,然后再上机运行程序,验证自己分析的结果是否正确。
(1)
#include
usingnamespacestd;
classA
{public:
A(){cout<<"A:
:
A()called.\n";}
virtual~A(){cout<<"A:
:
~A()called.\n";}
};
classB:
publicA
{public:
B(inti)
{cout<<"B:
:
B()called.\n";
buf=newchar[i];
}
virtual~B()
{delete[]buf;
cout<<"B:
:
~B()called.\n";
}
private:
char*buf;
};
voidfun(A*a)
{cout<<"Mayyousucceed!
"<deletea;
}
intmain()
{
A*a=newB(15);
fun(a);
return0;
}
(2)
#include
usingnamespacestd;
classA{
public:
A(inta,intb):
x(a),y(b){cou