1、C+程序设计上机指导与补充习题第1部分 上机指导实验一 Visual C+6.0 的上机操作(2学时)一、 实验目的1熟悉VC+6.0集成开发环境。2掌握在VC+集成开发环境下编辑、编译、连接和运行一个C+程序的步骤。3通过运行简单的C+程序,初步了解C+源程序的结构和特点。二、实验内容1. 启动Visual C+ 6.0集成开发环境Visual C+ 6.0是微软公司1998年推出的visual studio系列产品之一,它提供了强大的编译能力以及良好的界面操作性。能够对Windows下的C+程序设计提供完善的编程环境。同时它对网络、数据库等方面的编程也提供相应的环境支持。使用Visual
2、C+ 6.0编制并运行程序也是编辑(把程序代码输入)、编译(成目标程序文件)、连接(成可执行程序文件)、运行(可执行程序文件)四个步骤,其中第一步的编辑工作是最繁杂而又必须细致地由人工在计算机上来完成,其余几个步骤则相对简单,基本上由系统自动完成。确认你所使用的计算机是否已经安装Visual C+6.0,若已经安装,则执行“开始”“程序”“Microsoft Visual Studio” “Visual C+6.0”命令即可启动Visual C+ 6.0,否则,则应先安装Visual C+ 6.0。启动Visual C+ 6.0,进入到它的集成开发环境窗口,其具体窗口式样如图2-1 所示。图1
3、-1 Visual C+ 6.0集成开发环境式样图中所示Visual C+ 6.0的窗口从大体上可分为四部分。上部是菜单和工具条;左边是工作区显示窗口,这里将显示处理过程中与项目相关的各种文件种类等信息;右边是视图区,这里显示和编辑程序文件的操作区;下边是输出窗口区,程序调试过程中,进行编译、链接、运行时输出的相关信息将在此处显示。2创建工程使用Visual C+ 6.0编制并处理C+程序时要创建工程,因此必须先要了解Visual C+ 6.0的工程(有的资料也翻译成项目)的概念,而工程又与工程工作区相关联。实际上,Visual C+ 6.0 是通过工程工作区来组织工程及其各相关元素的,就好像
4、是一个工作间,以后程序所牵扯到的所有的文件、资源等元素都将放入到这一工作间中,从而使得各个工程之间互不干扰,使编程工作更有条理。这种思想反应到实现上就是一个工作区对应于一个独立的文件夹。简单的情况下,一个工作区中用来存放一个工程,代表着某一个要进行处理的程序。如果需要,一个工作区中也可以用来存放多个工程,其中可以包含该工程的子工程或者与其有依赖关系的其他工程。创建工程工作区之后,系统将创建出一个相应的工作区文件,后缀为“.dsw”,用来存放与该工作区相关的信息;另外还将创建出的其他几个相关文件是:工程文件(后缀是“.dsp”)以及选择信息文件(后缀是“.opt”)等。在Windows环境下通过
5、双击工作区文件或工程文件都可以打开相应的工程。Visual C+ 6.0 已经预先为用户准备好了近种不同的工程类型以供选择,选定不同的类型意味着让Visual C+ 6.0系统帮着提前做某些不同的准备以及初始化工作(例如,事先为用户自动生成一个所谓的底层程序框架,并进行某些隐含设置,如隐含位置、预定义常量、输出结果类型等)。工程类型中,其中有一个为“Win32 Console Application”的类型,称之为控制台应用,它是我们首先要掌握的、用来编制运行C+程序方法中最简单的一种。此种类型的程序运行时,将出现并使用一个类似于DOS的窗口,这个类似于DOS的窗口就是控制台,通过它提供对字符
6、模式的各种处理与支持。实际上,用此种类型的工程开发的应用程序是具有字符界面的应用程序。此种类型的工程小巧而简单,并且足以解决并支持本课程中涉及到的面向对象编程内容与技术,使我们把重点放在面向对象思想的理解及程序的设计,而并非界面处理等方面,至于Visual C+ 6.0支持的其他工程类型,我们在今后的学习和工作中遇到再逐渐了解、掌握与使用。创建工程的步骤为:首先,选择“File”“New”“Projects”命令,会弹出如图2-2所示的对话框,从左侧选项中选择“Win32 Console Application”项,在右侧“Location”文本框中填入存放与工程工作区相关的所有文件及其相关信
7、息的文件夹的路径及名称,当然也可通过点击其右部的“”按钮去选择并指定这一文件夹即子目录位置。在 “Project name”文本框中填入工程名,注意,此时Visual C+ 6.0会自动在其下的Location文本框中用该工程名建立一个同名的子目录,随后的工程文件以及其他相关文件都将存放在这个目录下。图1-2 Visual C+ 6.0新建工程对话框然后,单击OK进入下一个对话框,如图2-3所示。图1-3新建控制台工程类型选择对话框从图中可以看到有四种类型的控制台工程可供选择:若选择“An empty project”项将生成一个空的工程,工程内不包括任何东西。若选择“A simple app
8、lication”项将生成包含一个空的main 函数和一个空的头文件的工程。若选“A Hello World! application”项将生成包含一个有显示出“Hello World!”字符串的输出语句的main 函数和一个空的头文件的工程。若选择“An application that supports MFC”项的话,可以利用Visual C+ 6.0所提供的基础类库来进行编程。选择“Finish”,系统自动建立一个基于控制台的工程。建立好工程的Visual C+ 6.0系统界面如图2-4所示。图1-4建立控制台工程后的系统界面3. 编辑源程序工程建好之后,下一步要做的工作就是在工程中建
9、立一个源程序并编辑它。选择时“Project”“Add To Project”“New”命令,打开新建对话框,在“Files”标签下选择“C+ Source File”类型,在右边的“File”文本框中填入源程序的文件名,单击“OK”按钮完成源程序的创建。界面如图2-5所示。图1-5新建源程序的对话框界面建立好源程序后会在Visual C+ 6.0右边的视图区打开并显示该源程序,在这里我们可以键入代码,编辑源程序,如图2-6所示。图1-6编辑源程序的界面4. 编译、连接、运行程序源程序编辑完成后,首先选择执行“Build”菜单中的“Compile”项,对源程序进行编译。若编译中发现错误或警告,
10、将在Output窗口中显示出它们具体的出错或警告信息以及所在的行,可以通过这些信息的提示来修改程序中的错误或警告。编译通过后,可以选择菜单的第二项Build 来进行链接生成可执行程序。在链接中出现的错误也将显示到Output窗口中。最后就可以运行程序,选择Execute项,Visual C+ 6.0将运行已经编好的程序,执行后将出现一个结果界面,如图2-7所示。其中的“press any key to continue”是由系统产生的,使得用户可以浏览输出结果,直到按下了任一个键盘按键时再返回到编辑界面。图1-7程序运行的界面这些编译、生成、执行这些操作也可以通过单击工具条上的相应的命令按钮来
11、快捷的完成。另外,如果源程序编辑后没有编译就单击了“执行”按钮,系统会自动的进行编译、连接和执行操作;如果源程序已经编译过了,即上次运行后没有编辑源程序,这时单击“执行”按钮,系统就不再编译和连接而是直接执行上次生成的可执行程序了。三、巩固练习按照上面讲述的使用Visual C+ 6.0编制并运行程序的步骤,编写一个在屏幕上输出信息“Welcome to C+ World!”的程序并运行。实验二 C+对C的扩充(4学时)一、实验目的1了解在面向过程程序设计中C+对C语言的扩充与增强,并善于在编写程序过程中应用这些新的功能。2进一步熟悉在所用的VC+集成开发环境下编辑、编译、连接和运行C+程序的
12、方法。3进一步熟悉C+程序的结构和编程方法。二、实验内容1请先阅读下面的2个程序,写出程序运行的结果,然后再上机运行程序,验证自己分析的结果是否正确。 程序1:#include /包含头文件命令using namespace std;/使用名字空间stdint main()coutThis is ;couta C+ ;cout program.endl;return 0;程序运行的结果:This is a C+ program.程序2:#include /包含头文件命令using namespace std;/使用名字空间stdint main()int a,b,c; /定义三个变量a、b、c
13、coutPlease input to a and b:ab;/等待用户从键盘输入数据 c=a+b;cout a+b=;coutc;coutendl;return 0;程序运行的结果:Please input to a and b:1 2 a+b=3This is a C+ program.2输入以下程序,进行编译,观察编译结果,如果有错误,请修改程序,再进行编译,直到没有错误,然后进行连接和运行,并分析运行结果。#include /包含头文件命令using namespace std;/使用名字空间stdint main()int a,b; /定义两个变量a和b coutPlease inp
14、ut to a and b: ab;/等待用户从键盘输入数据cout Max= max(a,b) y)?x:y; /求两个数中的大者的函数测试的知识点:若函数的调用在前,定义在后,则需要在函数调用语句前对函数作原型声明3编写一个函数,用来求2个或3个正整数中的最大数,并在主函数中调用此函数。(1) 用不带默认参数的函数实现。(2) 用带默认参数的函数实现。对比两种方法,分析使用带默认参数的函数的优点和应用场合。总结如何选择默认参数的值。请分析本题中默认参数的值应该在什么范围选取。4编写一个函数,用来实现对3个数按由小到大的顺序排序,并在主函数中调用此函数。要求函数的形参用以下两种形式实现:(1
15、)使用指针形参(2)使用引用形参5编写程序,用同一个函数名实现n个数据的升序排序,数据类型可以是整型、单精度型、字符串型。用重载函数实现。6编写程序,将两个字符串连接起来,结果取代第一个字符串。实验三、类和对象(10学时)一、实验目的1掌握声明类的方法,类和类的成员的概念以及定义对象的方法。2初步掌握用类和对象编制基于对象的程序。3学习检查和调试基于对象的程序。4掌握类的构造函数和析构函数的概念和使用方法。5掌握对象数组、对象的指针及其使用方法。6掌握共用数据的保护方法二、实验内容1检查下面的程序,找出其中的错误,并改正之。然后上机调试,使之能正常运行。(1)#include using na
16、mespace std; class Clock void set_clock(void); void show_clock(void); int hour; int minute; int second;Clock clock; int main() set_clock(); show_clock (); int set_clock(void) cint.hour; cint.minute; cint.second; int show_clock(void) coutt.hour:t.minute:t.secondendl; (2)#include using namespace std;c
17、lass Apublic: void A(int i=0)m=i; void show()coutmendl; void A()private: int m;int main() A a(5);a.m+=10;a.show();return 0;(3) #include using namespace std;class X private: int a=0; int &b; const int c; void setA(int i)a=i; X(int i) a=i;public: int X() a=b=0; X(int i, int j, int k) a=i; b=j; c=k; se
18、tC(int k) const c=c+k;int main() X x1; X x2(2); X x3(1,2,3); x1.setA(3); return 0;2请先阅读下面的程序,写出程序运行的结果,然后再上机运行程序,验证自己分析的结果是否正确。(1)#include using namespace std;class testpublic:test();int getint( )return num;float getfloat( )return fl;test( );private:int num;float fl; test:test( )cout Initalizing def
19、ault endl;num=0;fl=0.0; test:test( )cout Destructor is active endl;int main( ) test array2;cout array1.getint( ) array1.getfloat( ) endl;return 0;(2)#includeusing namespace std;#includeclass Xpublic: X(int x1,char *x2,float x3):a(x1),c(x3) b=new charsizeof(x2)+1; strcpy(b,x2); X():a(0),b(X:X(),c(10)
20、 X(int x1,char *x2=X:X(.),int x3=10):a(x1),b(x2),c(x3) X(const X&other) a=other.a; b=X:X(const X &other); c=other.c; void print() couta=atb=btc=cprint(); B.print();C.print();D.print(); return 0;3某单位的职工工资包括基本工资Wage,岗位津贴Subsidy,房租Rent,水费WaterFee,电费ElecFee。设计实现工资管理的类Salary,该类的形式如下:class Salarypublic:Sa
21、lary()初始化工资数据的各分项数据为0Salary() 初始化工资数据的各分项数据void setXX(double f) XX=f; double getXX() return XX; double RealSalary() /计算实发工资Private: Bouble Wage, Subsidy, Rent, WaterFee, ElecFee;其中,成员函数setXX()用于设置工资的各分项数据,成员函数getXX()用于获取工资的各分项数据,XX代表Wage、Subsidy等数据成员,如Wage对应的成员函数则为setWage()和getWage()。 实发工资=Wage+Subs
22、idy-Rent-WaterFee-ElecFee编程完善该类的设计,并在主函数中测试该类的各成员函数。4设计一个时钟类Clock。数据成员包括hour(小时)、minute(分钟)、second(秒)。要求用成员函数实现以下功能:(1)创建具有指定时钟(小时、分钟、秒)的Clock对象,默认时钟为00:00:00。(2)动态地设置时、分、秒。(3)在屏幕上按“时:分:秒”的格式显示时钟。(4)在主函数中测试该类。5设计一个职工类Employee。数据成员包括字符串型的name(姓名)、street(街道地址)、city(市)、province(省)、postalcode(邮政编码)。要求用成
23、员函数实现以下功能:(1)创建职工对象时,可以按不同方式指定职工信息。(2)动态地设置职工对象信息。(3)在屏幕上打印职工信息。(4)在主函数中测试该类。6需要求3个三角形的体积,请编写一个基于对象的程序。数据成员包括三角形的三边长a、b、 c。要求用成员函数实现以下功能: (1) 定义构造函数完成三角形的初始化;(2) 求三角形的周长;(3) 求三角形的面积;(4) 输出三角形信息。7下面是一个整型数组类intArray的声明,请给出该类所有数据成员的类外定义。class intArraypublic:intArray(int size);/构造函数intArray(const intArr
24、ay &x);/复制构造函数intArray();/析构函数bool Set(int i, int elem);/设置第i个数组元素的值,设置成功返回true,失败返回falsebool Get(int i, int &elem); /获取第i个数组元素的值,获取成功返回true,失败返回falseint Length( ) const;/获取数组的长度void ReSize ( int size ); /重置数组void Print();/输出数组private:int *element; /指向动态数组的指针int arraysize; /数组的大小;8下面是一个整型链表类intList的
25、声明,请给出该类所有数据成员的类外定义。class intListprotected: struct Node Node * next; int data; ; Node * pFirst;public: intList();/构造函数intList(); /析构函数/向链表的第i个位置插入一个元素,插入成功返回true,失败返回falsebool Insert(int i, int elem); /删除链表的第i个位置的元素,删除成功返回true,失败返回false bool Remove(int i, int &elem) ;int * Find(int elem)const; /查找值为
26、elem的元素,返回该元素在链表中的位置int Length( ) const;/返回链表长度 void Printlist();/输出链表;9下面是一个整型堆栈类intStack的声明,请给出该类所有数据成员的类外定义。class intStackpublic:intStack (int size=10);/构造函数intStack ();/析构函数bool Push(int elem);/入栈操作bool Pop(int &elem); /出栈操作int Length( ) const; /获取栈中元素的个数private:int *data; /指向动态数组的指针int top; /栈顶
27、指针int size; /堆栈的容量;实验四、继承与组合(6学时)一、实验目的1了解继承在面向对象程序设计中的重要作用。2进一步理解继承与派生的概念。3掌握通过继承派生出一个新的类的方法。4了解虚基类的作用和用法。5掌握类的组合二、实验内容1请先阅读下面的程序,写出程序运行的结果,然后再上机运行程序,验证自己分析的结果是否正确。(1)#include using namespace std;class Apublic: A()coutA:A() called.n; virtual A()coutA:A() called.n; class B:public A public: B(int i)
28、coutB:B() called.n; buf=new chari; virtual B() delete buf; coutB:B() called.n; private: char *buf; ; void fun(A *a) coutMay you succeed!endl; delete a; int main() A *a=new B(15); fun(a); return 0;(2)#includeusing namespace std;class Apublic:A(int a,int b):x(a),y(b) coutA constructor.endl;void Add(in
29、t a,int b) x+=a;y+=b;void display() cout(x,y);A()coutdestructor A.endl;private:int x,y;class B:private Aprivate:int i,j;A Aobj;public:B(int a,int b,int c,int d):A(a,b),i(c),j(d),Aobj(1,1) coutB constructor.endl;void Add(int x1,int y1,int x2,int y2)A:Add(x1,y1);i+=x2; j+=y2;void display()A:display();
30、Aobj.display();cout(i,j)endl;B()coutdestructor B.endl; ;int main()B b(1,2,3,4);b.display();b.Add(1,3,5,7);b.display(); return 0;(3)#includeusing namespace std;class Apublic:A(int a):x(a) coutA constructor.xendl;int f()return +x;A()coutdestructor A.endl;private:int x;class B:public virtual Aprivate:i
31、nt y;A Aobj;public:B(int a,int b,int c):A(a),y(c),Aobj(c) coutB constructor.yendl;int f()A:f();Aobj.f();return +y;void display()coutA:f()tAobj.f()tf()endl;B()coutdestructor B.endl; ;class C:public Bpublic:C(int a,int b,int c):B(a,b,c),A(0) coutC constructor.endl;class D:public C,public virtual Apubl
32、ic:D(int a,int b,int c):C(a,b,c),A(c) coutD constructor.endl;D()coutdestructor D.endl;int main()D d(7,8,9);d.f();d.display();return 0;(4)#include using namespace std;class Base1public:Base1()coutclass Base1!endl;class Base2public:Base2()coutclass Base2!endl;class Level1:public Base2,virtual public B
33、ase1public:Level1()coutclass Level1!endl;class Level2: public Base2,virtual public Base1public:Level2()coutclass Level2!endl;class TopLevel:public Level1,virtual public Level2public:TopLevel()coutclass TopLevel!endl;int main()TopLevel obj;return 0;2某出版系统发行图书和磁带,利用继承设计管理出版物的类。要求如下:建立一个基类Publication存储
34、出版物的标题title、出版物名称name、单价price及出版日期date。用Book类和Tape类分别管理图书和磁带,它们都从Publication类派生。Book类具有保存图书页数的数据成员page,Tape类具有保存播放时间的数据成员playtime。每个类都有构造函数、析构函数,且都有用于从键盘获取数据的成员函数inputData(),用于显示数据的成员函数display()。3分别定义教师类Teacher和干部类Cadre,采用多重继承的方式由这两个类派生出新类Teacher_Cadre(教师兼干部类)。要求:(1)在两个基类中都包含姓名、年龄、性别、地址、电话数据成员。(2)在T
35、eacher类中还包含数据成员职称title,在Cadre类中还包含数据成员职务post,在Teacher_Cadre类中还包含数据成员工资wage。(3)对两个基类中的姓名、年龄、性别、地址、电话数据成员用相同的名字,在访问这类数据成员时,指定作用域。(4)在类体中声明成员函数,在类外定义成员函数。(5)在派生类Teacher_Cadre的成员函数show中调用Teacher类中的display函数,输出姓名、年龄、性别、地址、电话,然后再用cout语句输出职务和工资。4按下列要求编写程序。(1)定义一个分数类Score。它有3个数据成员:Chinese /语文课成绩English /英语课
36、成绩Mathematics /数学课成绩2个构造函数:无参的和带参数的3个成员函数:是否带参数根据需要自定sum() /计算三门课总成绩print() /输出三门课成绩和总成绩modify() /修改三门课成绩(2)定义一个学生类Student。它有3个数据成员:Num /学号Name /姓名MyScore /成绩2个构造函数:无参的和带参数的3个成员函数:是否带参数根据需要自定sum() /计算某学生三门课总成绩print() /输出某学生学号、姓名和成绩modify() /修改某学生学号、姓名和成绩(3)在主函数中,先定义一个学生类对象数组,再通过for循环给对象数组赋上实际值,最后输出对
37、象数组个元素的值。5编写一个程序实现小型公司的人员信息管理系统。该公司雇员(employee)包括经理(manager),技术人员(technician)、销售员(salesman)和销售部经理(salesmanager)。要求存储这些人员的姓名、编号、级别、当月薪水,计算月薪并显示全部信息。程序要对所有人员有提升级别的功能。为简单起见,所有人员的初始级别均为1,然后进行升级,经理升为4级,技术人员和销售部经理升为3级,销售员仍为1级。月薪计算办法是:经理拿固定月薪8000元,技术人员按每小时100元领取月薪,销售员按该当月销售额4%提成,销售经理既拿固定月工资也领取销售提成,固定月工资为50
38、00元,销售提成为所管辖部门当月销售额的5。实验五、多态性与虚函数(4学时)一、实验目的1了解多态性的概念。2了解虚函数的作用及使用方法。3了解静态关联和动态关联的概念和用法。4了解纯虚函数和抽象类的概念和用法。二、实验内容1阅读下面的程序,写出程序运行的结果。#include using namespace std;class Baseprotected:int n;public:Base (int m)n=m+; virtual void g1()coutBase:g1().nendl; g4();virtual void g2()coutBase:g2().+nendl;g3();voi
39、d g3()coutBase:g3().+nendl; g4();void g4()coutBase:g4().+nendl;class Derive:public Baseint j;public:Derive(int n1,int n2):Base(n1) j=n2;void g1()coutDeri:g1().+nendl;g2();void g3()coutDeri:g2().+nendl;g4();int main()Derive Dobj(1,0);Base Bobj=Dobj;Bobj.g1();cout-g1();cout-endl;Base &bobj2=Dobj;bobj2.g1();cout-endl;Dobj.g1(); return 0;2先建立一个点类Point,包含数据成员x,y(坐标点)。以它为基类,派生出圆类Circle,增加数据成员radius(半径),