资源描述
C+程序设计上机指导与补充习题 第1部分 上机指导实验一 Visual C+6.0 的上机操作(2学时)一、 实验目的1熟悉VC+6.0集成开发环境。2掌握在VC+集成开发环境下编辑、编译、连接和运行一个C+程序的步骤。3通过运行简单的C+程序,初步了解C+源程序的结构和特点。二、实验内容1. 启动VisualC+6.0集成开发环境 Visual C+ 6.0是微软公司1998年推出的visual studio系列产品之一,它提供了强大的编译能力以及良好的界面操作性。能够对Windows下的C+程序设计提供完善的编程环境。同时它对网络、数据库等方面的编程也提供相应的环境支持。使用Visual 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-1 VisualC+ 6.0集成开发环境式样图中所示Visual C+ 6.0的窗口从大体上可分为四部分。上部是菜单和工具条;左边是工作区显示窗口,这里将显示处理过程中与项目相关的各种文件种类等信息;右边是视图区,这里显示和编辑程序文件的操作区;下边是输出窗口区,程序调试过程中,进行编译、链接、运行时输出的相关信息将在此处显示。2创建工程使用Visual C+ 6.0编制并处理C+程序时要创建工程,因此必须先要了解Visual C+6.0的工程(有的资料也翻译成项目)的概念,而工程又与工程工作区相关联。实际上,VisualC+ 6.0 是通过工程工作区来组织工程及其各相关元素的,就好像是一个工作间,以后程序所牵扯到的所有的文件、资源等元素都将放入到这一工作间中,从而使得各个工程之间互不干扰,使编程工作更有条理。这种思想反应到实现上就是一个工作区对应于一个独立的文件 夹。简单的情况下,一个工作区中用来存放一个工程,代表着某一个要进行处理的程序。如果需要,一个工作区中也可以用来存放多个工程,其中可以包含该工程的子工程或者与其有依赖关系的其他工程。创建工程工作区之后,系统将创建出一个相应的工作区文件,后缀为“.dsw”,用来存放与该工作区相关的信息;另外还将创建出的其他几个相关文件是:工程文件(后缀是“.dsp”)以及选择信息文件(后缀是“.opt”)等。在Windows环境下通过双击工作区文件或工程文件都可以打开相应的工程。Visual C+ 6.0 已经预先为用户准备好了近种不同的工程类型以供选择,选定不同的类型意味着让Visual C+ 6.0系统帮着提前做某些不同的准备以及初始化工作(例如,事先为用户自动生成一个所谓的底层程序框架,并进行某些隐含设置,如隐含位置、预定义常量、输出结果类型等)。工程类型中,其中有一个为“Win32 Console Application”的类型,称之为控制台应用,它是我们首先要掌握的、用来编制运行C+程序方法中最简单的一种。此种类型的程序运行 时,将出现并使用一个类似于DOS的窗口,这个类似于DOS的窗口就是控制台,通过它提供对字符模式的各种处理与支持。实际上,用此种类型的工程开发的应用程序是具有字符界面的应用程序。此种类型的工程小巧而简单,并且足以解决并支持本课程中涉及到的面向对象编程内容与技术,使我们把重点放在面向对象思想的理解及程序的设计,而并非界面处理等方面,至于Visual C+ 6.0支持的其他工程类型,我们在今后的学习和工作中遇到再逐渐了解、掌握与使用。创建工程的步骤为:首先,选择“File”“New”“Projects”命令,会弹出如图2-2所示的对话框,从左侧选项中选择“Win32 Console Application”项,在右侧“Location”文本框中填入存放与工程工作区相关的所有文件及其相关信息的文件夹的路径及名称,当然也可通过点击其右部的“”按钮去选择并指定这一文件夹即子目录位置。在“Project name”文本框中填入工程名,注意,此时Visual C+ 6.0会自动在其下的Location文本框中用该工程名建立一个同名的子目录,随后的工程文件以及其他相关文件都将存放在这个目录下。 图1-2 VisualC+ 6.0新建工程对话框然后,单击OK进入下一个对话框,如图2-3所示。 图1-3新建控制台工程类型选择对话框从图中可以看到有四种类型的控制台工程可供选择:若选择“An empty project”项将生成一个空的工程,工程内不包括任何东西。若选择“A simple application”项将生成包含一个空的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. 编辑源程序工程建好之后,下一步要做的工作就是在工程中建立一个源程序并编辑它。选择时“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”项,对源程序进行编译。若编译中发现错误或警告,将在Output窗口中显示出它们具体的出错或警告信息以及所在的行,可以通过这些信息的提示来修改程序中的错误或警告。编译通过后,可以选择菜单的第二项Build 来进行链接生成可执行程序。在链接中出现的错误也将显示到Output窗口中。最后就可以运行程序,选择Execute项,Visual C+ 6.0将运行已经编好的程序,执行后将出现一个结果界面,如图2-7所示。其中的“press any key to continue”是由系统产生的,使得用户可以浏览输出结果,直到按下了任一个键盘按键时再返回到编辑界面。 图1-7程序运行的界面这些编译、生成、执行这些操作也可以通过单击工具条上的相应的命令按钮来快捷的完成。另外,如果源程序编辑后没有编译就单击了“执行”按钮,系统会自动的进行编译、连接和执行操作;如果源程序已经编译过了,即上次运行后没有编辑源程序,这时单击“执行”按钮,系统就不再编译和连接而是直接执行上次生成的可执行程序了。三、巩固练习按照上面讲述的使用Visual C+ 6.0编制并运行程序的步骤,编写一个在屏幕上输出信息“Welcome to C+ World!”的程序并运行。实验二 C+对C的扩充(4学时)一、实验目的 1了解在面向过程程序设计中C+对C语言的扩充与增强,并善于在编写程序过程中应用这些新的功能。2进一步熟悉在所用的VC+集成开发环境下编辑、编译、连接和运行C+程序的方法。 3进一步熟悉C+程序的结构和编程方法。二、实验内容1请先阅读下面的2个程序,写出程序运行的结果,然后再上机运行程序,验证自己分析的结果是否正确。程序1:#include /包含头文件命令using namespace std; /使用名字空间stdint main() coutThis is ; couta C+ ;cout program.endl;return 0;程序2:#include /包含头文件命令using namespace std; /使用名字空间stdint main() int a,b,c; /定义三个变量a、b、ccoutPlease input to a and b:ab; / 等待用户从键盘输入数据c=a+b;cout a+b= ;coutc;coutendl;return 0;2输入以下程序,进行编译,观察编译结果,如果有错误,请修改程序,再进行编译,直到没有错误,然后进行连接和运行,并分析运行结果。#include /包含头文件命令using namespace std; / 使用名字空间stdint main() int a,b; /定义两个变量a和bcoutPlease input to a and b: ab; /等待用户从键盘输入数据cout Max= max(a,b) 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 using namespace 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.month;cint.second;int show_clock(void) coutt.hour:t.minute:t.secondendl;(2)#include using namespace std;class A public:void A(int i=0)m=i;void show()coutm;void A()private:int m;int main() A a(5);a.m+=10;a.show();return 0;(3) class X private:int a=0;int 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; setC(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 test public:test( ); int getint( )return num;float getfloat( )return fl;test( );private:int num;float fl;test:test( ) cout Initalizing default 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) X(int x1,char *x2=X:X(.),int x3=10):a(x1),b(x2),c(x3)X(const Xb=X:X(const X 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:Salary()初始化工资数据的各分项数据为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+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的声明,请给出该类所有数据成员的类外定义。 class intArraypublic:intArray(int size);/构造函数intArray(const intArray /复制构造函数intArray();/析构函数bool Set(int i, int elem);/设置第i个数组元素的值,设置成功返回true,失败返回falsebool Get(int i, int /获取第i个数组元素的值,获取成功返回true,失败返回falseint Length( ) const;/获取数组的长度void ReSize ( int size ); /重置数组void Print();/输出数组private:int *element; /指向动态数组的指针int arraysize; /数组的当前长度 ;8下面是一个整型链表类intList的声明,请给出该类所有数据成员的类外定义。class intListprotected:struct NodeNode * next;int data;Node * pFirst;public:intList();/构造函数intList(); /析构函数/向链表的第i个位置插入一个元素,插入成功返回true,失败返回false bool Insert(int i, int elem) ;/删除链表的第i个位置的元素,删除成功返回true,失败返回falsebool Remove(int i, int int * Find(int elem)const; /查找值为elem的元素,返回指向该元素的指针int Length( ) const;/返回链表长度 void Printlist();/输出链表;9下面是一个整型堆栈类intStack的声明,请给出该类所有数据成员的类外定义。class intStackpublic:intStack (int size=10);/构造函数intStack ();/析构函数bool Push(int elem);/入栈操作bool Pop(int /出栈操作int Length( ) const; /获取栈中元素的个数private:int *data; /指向动态数组的指针int top; /栈顶指针 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) 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!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(int 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;AAobj;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();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:int y; AAobj;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 Apublic: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 Base1 public:Base1() coutclass Base1!endl;class Base2 public:Base2() coutclass Base2!endl; ;class Level1:public Base2,virtual public Base1public: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存储出版物的标题title、出版物名称name、单价price及出版日期date。用Book类和Tape类分别管理图书和磁带,它们都从Publication类派生。Book类具有保存图书页数的数据成员page,Tape类具有保存播放时间的数据成员playtime。每个类都有构造函数、析构函数,且都有用于从键盘获取数据的成员函数inputData(),用于显示数据的成员函数display()。3分别定义教师类Teacher和干部类Cadre,采用多重继承的方式由这两个类派生出新类Teacher_Cadre(教师兼干部类)。要求:(1)在两个基类中都包含姓名、年龄、性别、地址、电话数据成员。(2)在Teacher类中还包含数据成员职称title,在Cadre类中还包含数据成员职务post,在Teacher_Cadre类中还包含数据成员工资wage。(3)对两个基类中的姓名、年龄、性别、地址、电话数据成员用相同的名字,在访问这类数据成员时,指定作用域。 (4)在类体中声明成员函数,在类外定义成员函数。(5)在派生类Teacher_Cadre的成员函数show中调用Teacher类中的display函数,输出姓名、年龄、性别、地址、电话,然后再用cout语句输出职务和工资。4按下列要求编写程序。(1)定义一个分数类Score。它有3个数据成员:Chinese /语文课成绩English /英语课成绩Mathematics /数学课成绩2个构造函数:无参的和带参数的3个成员函数:是否带参数根据需要自定sum() /计算三门课总成绩print() /输出三门课成绩和总成绩 modify() /修改三门课成绩(2)定义一个学生类Student。它有3个数据成员:Num /学号 Name /姓名MyScore /成绩2个构造函数:无参的和带参数的3个成员函数:是否带参数根据需要自定sum() /计算某学生三门课总成绩print() /输出某学生学号、姓名和成绩modify() /修改某学生学号、姓名和成绩(3)在主函数中,先定义一个学生类对象数组,再通过for循环给对象数组赋上实际值,最后输出对象数组个元素的值。5编写一个程序实现小型公司的人员信息管理系统。该公司雇员(employee)包括经理(manager),技术人员(technician)、销售员(salesman)和销售部经理(salesmanager)。要求存储这些人员的姓名、编号、级别、当月薪水,计算月薪并显示全部信息。程序要对所有人员有提升级别的功能。为简单起见,所有人员的初始级别均为1,然后 进行升级,经理升为4级,技术人员和销售部经理升为3级,销售员仍为1级。月薪计算办法是:经理拿固定月薪8000元,技术人员按每小时100元领取月薪,销售员按该当月销售额4%提成,销售经理既拿固定月工资也领取销售提成,固定月工资为5000元,销售提成为所管辖部门当月销售额的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();void 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.g1();cout-endl;Dobj.g1();return 0;2先建立一个点类Point,包含数据成员x,y(坐标点)。以它为基类,派生出圆类Circle,增加数据成员radius(半径),再以Cirlcle类为直接基类,派生出圆柱体类Cylinder,再增加数据成员height(高)。要求:(1)每个类都有构造函数、用于从键盘获取数据的成员函数set(),用于显示数据的成员函 数display()。(2)用虚函数输出各类对象信息。3先建立一个职工类Employee,包含数据成员name(职工姓名),ID(职工编号)。以它为基类,派生出经理类Manager和技术人员类Technician,在经理类中增加数据成员salary(代表经理的月工资),在技术人员类中增加数据成员wage(代表每小时的工资数)和hours(月工作时数)。在定义类时,所有类中必须包含有构造函数、析构函数、修改和获取所有数据成员的函数,以及纯函数计算职工的工资,输出职工的信息。4下列shape类是一个表示形状的抽象类,area( )为求图形面积的函数,total( )则是一个通用的用以求不同形状的图形面积总和的函数。请从shape类派生三角形类(triangle)、矩形类(rectangle),并给出具体的求面积函数。实验六、面向对象的妥协(2学时)一、实验目的 1掌握友元的概念、友元函数的定义与使用方法。2掌握静态数据成员与静态成员函数的定义与使用方法。 二、实验内容1设计并测试点类Point,其数据成员是直角坐标系的点坐标,友元函数distance用来计算两点间的距离。2设计一个书类Book,能够保存书名、定价,所有书的本数和总价。实验七、运算符重载(2学时)一、实验目的1掌握运算符重载的规则。 2掌握几种常用的运算符重载的方法。3了解转换构造函数的使用方法。4了解在Visual C+6.0环境下进行运算符重载要注意的问题。二、实验内容1阅读下面的程序,写出程序运行的结果。(1)#includeclass ABCint a,b,c;public: ABC(int x,int y,int z):a(x),b(y),c(z)friend ostream ;ostream return out;int main()ABC obj(10,20,30);coutobj;return 0; (2)#includeclass Numberint n;public: Number(int x):n(x)Number return *this; Number return *this;friend Number friend Number void display()coutThis Number is: nendl;Number return o; Number return o; int main()Number N1(10);+ + +N1;N1.display(); N1+;N1.display();-N1;N1.display();N1- - -;N1.display();return 0;2设计并实现一个日期类Date,要求:(1)可以建立具有指定日期(年、月、日)的Date对象,默认日期是2009.1.1。(2)可以从输出流输出一个格式为“年-月-日”的日期,其中年是四位数据,月、日可以是一位也可以是两位数据。(3)可以动态地设置年、月、日。 (4)可以用运算符= =、!=、对两个日期进行比较。(5)可以用运算符+、-、+=、-=等完成天数的加减一天或若干天的操作(6)Date类必须能够正确表达日期,不会出现类似于13月,32日一类的情况。Date类还必须处理闰年的问题,闰年包括:所有能被400整除的年份,以及能被4整除同时又不能被100整除的年份。(7)写出主函数对该类进行测试。3下面是一个数组类CArray的定义。要求:(1)在此基础上增加print()成员函数打印数组,(2)重载“=”、“+”、“-” 运算符使之能对该数组类对象进行赋值、加减运算。(3)写出主函数对该类进行测试。class CArrayprivate:int* p_arr; int size;public:CArray(); /缺省构造函数CArray(int* p_a,int s); /构造函数CArray(const CArray /复制构造函数 CArray();/析构函数int operator(int pos) const; /访问数组元素值的下标运算符重载函数int /设置数组元素值的下标运算符重载函数Carray ;CArray: CArray() p_arr=NULL; size=0;CArray: CArray(int* p_a,int s) if(s0) size=s; p_arr=new intsize; for(int i=0;isize;i+) p_arri=p_ai;Else p_arr=NULL; size=0; CArray:CArray(const CArray if(size) p_arr=new intsize;for(int i=0;i=size) return p_arrsize-1;if(pos=size) return p_arrsize-1;if(pos0) return p_arr0; return p_arrpos;4下面是一个自定义字符串类的声明。请写出该类所有成员函数的类外定义代码。class string private:unsigned buflen;char * buffer;public:string();/构造函数string(unsigned);string(char);string(const char*);string(const string /复制构造函数string();/析构函数/重载赋值运算符stringstring char *operator+=(const char *right);friend string operator+(const string /字符串连接string operator()(unsigned start,unsigned len); /取子串unsigned length()const; /求字符串长度char /访问单个字符int compare(const string /字符串比较operator const char *()const; /到普通c字符串的转换friend ostream /字符串的输出;实验八、模板(2学时)一、实验目的 1函数模板的定义与调用。2掌握类模板的声明与使用方法。二、实验内容1设计一个函数模板,实现两数的交换,并用int、float、double、char类型的数据进行测试。2设计一个函数模板,实现从int、float、double、char类型的数组找出最大值元素。提示:可用类型参数传递数组、用非类型参数传递数组大小,为了找出char*类型数组中的最大值元素,需要对该类型进行重载或特化。3编写一个顺序表类模板。 4建立两个int类型的向量vector,利用merge算法将其合并,然后用sort算法对合并后的向量进行排序,最后输出排序结果。 实验九、输入输出流(自学)一、实验目的1深入理解C+的输入输出的含义与其实现方法。2掌握标准输入输出流的应用,包括格式输入输出。3掌握对文件的输入输出操作。二、实验内容1阅读下面的程序,写出程序运行的结果。 (1)#include#includeusing namespace std;int main()fstream out,in;out.open(a.dat,ios:out);outon factn;outoperating file n;outis the same as inputing/outputing data on screen.n;out.close();char buffer80;in.open(a.dat,ios:in); while(!in.eof() in.getline(buffer,80);coutbufferendl;return 0;(2)#include#include#includeusing namespace std;class Worker private:int number ,age;char name20;double sal;public: Worker()Worker(int num,char* Name,int Age, double Salary):number(num),age(Age),sal(Salary)strcpy(name,Name); void display() coutnumbertnametagetsalendl; ;int main()ofstream out(Worker.dat,ios:out|ios:binary);Worker man=Worker(1,张三,23,2320),Worker(2,李四,32,2321),Worker(3,王五,34,2322),Worker(4,刘六,27,2324),Worker(5,晓红,23,2325),Worker(6,黄明,50,2326);for(int i=0;i6;i+) out.write(char*)out.close();Worker s1; ifstream in(Employee.dat,ios:in|ios:binary);in.seekg(2*(sizeof(s1),ios:beg);in.read(char*)s1.display();in.seekg(0,ios:beg);in.read(char*)s1.display();in.close();return 0;2已知数据文件IN.DAT中存有20个整数,每个整数间用空格分隔。有一类Array的结构如下:class Array int A20;public:Array()for(int i=0;i20;i+) Ai=0;int getNumberA(Array void getdata();/读数据函数void max_min(int /排序函数void putdata(int /写结果数据函数;其中:成员函数getdata()的功能为:从数据文件IN.DAT中把20个数据读出来存入数据成员A中。成员函数max_min(int int main() int a=8,5,5,0,6,0,8,5,5,0,7,8;for(int i=0;i5;i+)try coutin for loop.it;if(ai+1=0) throw 1;coutai/ai+1=ai/ai+1endl; catch (int) coutendendl; return 0;(2)#includeusing namespace std;void err(int t) try if(t100) throw biger than 100;else if(t-100) throw t;else coutt in right range.endl; catch(int x) couterror-xendl;catch(char *s) couterror-sendl;catch(float f) couterror-fendl; int main()err(200);err(99);err(-1210);return 0;(3)#includeusing namespace std;class excepprivate:char *ch;public: excep(char *m=exception class.)ch=m;void print()cerrchendl;void err1()coutenter err1n;throw excep(exception);void err2()trycoutenter err2n; err1(); catch(int)cerrerr2:catchn; throw; void err3()try coutenter err3n; err2(); catch(.)cerrerr3:chtchn; throw; int main()try err3(); catch(.) cerrmain:catchn; return 0;2设计日期类Date,该类具有三个整型数据成员year,month,day,具有多个重载的构造函数,修改日期的函数,分别获取年、月、日的函数,输出日期的函数。要求该类实现如下的异常处理功能:InvalidDay:对于日期day成员,不能接受大于31或小于1的值,当传递给类的日期大于31或小于1时,抛出这种类型的异常。InvalidMonth:对于月month,不能接受大于12或小于1的值,当传递给类的日期大于12 或小于1时,抛出这种类型的异常。 第2部分 补充习题第1章 面向对象程序设计概述一、选择题1、C+是( )。A 面向对象的程序设计语言B 结构化程序设计语言C 既是面向对象的程序设计语言又是结构化的程序设计语言D 非结构化的程序设计语言2、C+语言属于( )。 A 机器语言 B 低级语言 C 中级语言 D 高级语言3、下面关于对象概念的描述中,错误的是( )。A 对象就是C语言中的结构变量B 对象代表着正在创建的系统中的一个实体C 对象是一个属性和操作(或方法)的封装体D 对象之间的信息传递是通过消息进行的4、下面关于类概念的描述中,错误的是( )。A 类是抽象数据类型的实现B 类是具有共同行为的若干对象的统一描述体C 类是创建对象的样板D 类就是C语言中的结构体类型5、下列关于C+类的描述中错误的是( )。A 类与类之间可以通过一些手段进行通信和联络 B 类用于描述事物的属性和对事物的操作C 类与类之间必须是平等的关系,而不能组成层次关系D 类与类之间可以通过封装而具有明确的独立性6、面向对象程序设计思想的主要特征中不包括( )。A 封装性 B 多态性 C 继承性 D 功能分解,逐步求精二、填空题1、构成对象的两个主要因素是 和 ,其中 用于描述对象的静态特征,用于描述对象的动态特征。2、类和对象的关系可表述为:类是对象的 ,而对象则是类的 。3、封装包含两方面含义,一是用 把 包装起来,二将对象中某些部分 。4、 是指特殊类自动地拥有或隐含地复制其一般类的全部属性与操作。5、面向对象的软件工程包括的五个阶段为: , , , , 。 第2章 C+基础知识一、选择题1、下列关于C+语言的发展说法错误的是( )。A C+语言起源于C语言 B C+语言最初被称为“带类的C”C 在1980年C+被命名 D 在1983年C+被命名2、C+语言是以 语言为基础逐渐发展而演变而成的一种程序设计语言。( )A Pascal B C C Basic D Simula673、下列关于C+与C语言关系的描述中错误的是( )。A C+是C语言的超集B C+是C语言进行了扩充C C+和C语言都是面向对象的程序设计语言 D C+包含C语言的全部语法特征4、下列C+标点符号中表示行注释开始的是( )。A # B ; C / D 5、每个C+程序都必须有且仅有一个( )。A 预处理命令 B 主函数 C 函数 D 语句6、C+对C语言做了很多改进,下列描述中哪一项使得C语言发生了质变,即从面向过程变成面向对象( )。A 增加了一些新的运算符 B 允许函数重载,并允许设置默认参数C 规定函数说明必须用原型 D 引进类和对象的概念7、对定义重载函数的下列要求中,错误的是( )。A 要求参数的个数不同 B 要求参数中至少有一个类型不同C 要求参数个数相同时,参数类型不同 D 要求函数的返回值不同8、在函数的返回值类型与返回值表达式的类型的描述中,错误的是( )。 A 函数返回值的类型是在定义函数时确定,在函数调用时是不能改变的B 函数返回值的类型就是返回值表达式的类型C 函数返回值表达式类型与返回值类型不同时,函数表达式类型应转换成返回值类型D 函数返回值类型确定了返回值表达式的类型9、下列不正确的选项是( )。A C+语言是一种既支持面向过程程序设计,又支持面向对象程序设计的混合型语言B 标点符号是在程序中起分割内容和界定范围作用的一类单词C iostream是一个标准的头文件,定义了一些输入输出流对象D 类与类之间不可以进行通信和联络10、下列表示引用的方法中,正确的是( )。已知:int k=1000;A int B char C int D float 二、填空题 1、C+既可以用来进行面向 程序设计,又可以进行面向 程序设计。2、常量分成两种,一种是 常量,另一种是 常量。3、 就是某一变量的别名,对其操作与对变量直接操作完全一样。4、按函数在语句中的地位分类,可以有以下3种函数调用方式: , 。 5、函数与引用联合使用主要有两种方式:一是 ;二是 。6、头文件由三部分内容组成: , , 。三、程序阅读题1、分析下面的执行结果#includeusing namespace std;int main() int a,b,sum; / 定义a,b,sum三个整型变量a=43; / 把整数常量赋给变量ab=37;sum=a+b; / a与b相加的和赋给变量sumcoutThe sum issum;coutendl; / endl 是回车换行的作用return 0;2、分析以下程序的执行结果#includeusing namespace std;int main() int a;int / 变量引用b=10;couta=aendl;return 0;3、下列程序的执行结果为#includeusing namespace std;void mian() int n=10;int* pn=int* (*pn)+;coutn=nendl;(*rn)+;cout”n=”nendl;4、下面程序的运行结果是#includeusing namespace std;void fun(int p=a; a=b; b=p;void exchange(int if(ac)fun(a,c);if(bc)fun(b,c);int main() int a,b,c;a=12; b=639;c=78;exchange(a,b,c);couta=a,b=b,c=cendl;return 0;5、下面的程序输出结果为#includeusing namespace std;int main()int *ir; int i;ir=i=17;coutint i=iendl;coutint
展开阅读全文