
C++程序设计(第3版)(面向对象OOP的内容)谭浩强 著
C++程序设计面向对象章节的内容,本专栏所有源代码全部在DEV-C++5.11和VS2019这两个IDE(集成开发环境)下编译通过,没有任何错误和任何警告。
AKK188888881
这个作者很懒,什么都没留下…
展开
-
学校的人事部门保存了有关学生的部分数据(学号、姓名、年龄、住址),教务部门也保存了学生的另外一些数据(学号、姓名、年龄、成绩),两个部门分别编写了本部门的学生数据管理程序,其中都用了Student作为
学校的人事部门保存了有关学生的部分数据(学号、姓名、年龄、住址),教务部门也保存了学生的另外一些数据(学号、姓名、年龄、成绩),两个部门分别编写了本部门的学生数据管理程序,其中都用了Student作为类名。现在要求在全校的学生数据管理程序中调用这两个部门的学生数据,分别输出两种内容的学生数据。要求用C++编程,使用命名空间。方法一:两个头文件,一个源文件(1)头文件header1:#include<iostream>#include<string>using namespa原创 2020-06-30 05:27:19 · 1755 阅读 · 0 评论 -
在例13.14的基础上,修改程序,将存放在c数组中的数据读入并显示出来。
在例13.14的基础上,修改程序,将存放在c数组中的数据读入并显示出来。方法一:#include<iostream>#include<sstream>//这是最新的头文件 #include<cstring>using namespace std;struct student{ int num; char name[20]; double score;};int main(){ student stud[3]= { 1001,"Li",转载 2020-06-28 23:09:16 · 528 阅读 · 0 评论 -
编写程序实现以下功能: (1)按职工号由小到大的顺序将5个员工的数据(包括号码、姓名、年龄、工资)输出到磁盘文件中保存。 (2)从键盘输入两个员工的数据(职工号大于已有的职工号),增加到文件的末尾。
编写程序实现以下功能:(1)按职工号由小到大的顺序将5个员工的数据(包括号码、姓名、年龄、工资)输出到磁盘文件中保存。(2)从键盘输入两个员工的数据(职工号大于已有的职工号),增加到文件的末尾。(3)输出文件中全部职工的数据。(4)从键盘输入一个号码,在文件中查找有无此职工号,如有则显示此职工是第几个职工,以及此职工的全部数据。如没有,就输出“无此人”。可以反复多次查询,如果输入查找的职工号为0,就结束查询。#include<iostream>#include<fstream&转载 2020-06-28 23:04:45 · 9337 阅读 · 6 评论 -
建立两个磁盘文件f1.dat和f2.dat,编写程序实现以下工作: (1)从键盘输入20个整数,分别存放在两个磁盘文件中(每个文件中放10个整数); (2)从f1.dat读入10个数,然后存放到f2.
建立两个磁盘文件f1.dat和f2.dat,编写程序实现以下工作:(1)从键盘输入20个整数,分别存放在两个磁盘文件中(每个文件中放10个整数);(2)从f1.dat读入10个数,然后存放到f2.dat文件原有数据的后面。(3)从f2.dat中读入20个整数,将它们按从小到大的顺序存放到f2.dat中(不保留原来的数据)。#include<iostream>#include<fstream>using namespace std;void fun1(){ int转载 2020-06-28 23:00:30 · 7253 阅读 · 0 评论 -
编写程序,在显示屏上显示一个由字母B组成的三角形。
编写程序,在显示屏上显示一个由字母B组成的三角形。方法一:用控制符输出格式#include<iostream>#include<iomanip> using namespace std;int main(){ for(int n=1;n<8;n++) { cout<<setw(20-n)<<setfill(' ')<<" "<<setw(2*n-1)<<setfill('B')<<"原创 2020-06-28 22:55:23 · 2816 阅读 · 0 评论 -
从键盘输入一批数值,要求保留3位小数,在输出时上下行小数点对齐。
从键盘输入一批数值,要求保留3位小数,在输出时上下行小数点对齐。方法一:用控制符控制输出格式#include<iostream>#include<iomanip>using namespace std;int main(){ float a[5]; cout<<"input data:"; for(int i=0;i<5;i++) { cin>>a[i]; } cout<<setiosflags(ios::f转载 2020-06-28 22:46:54 · 4404 阅读 · 0 评论 -
例13.15 在一个字符数组c中存放了10个整数,以空格相间隔,要求将它们放到整型数组中,再按大小排序,然后再存放回字符数组c中。
例13.15 在一个字符数组c中存放了10个整数,以空格相间隔,要求将它们放到整型数组中,再按大小排序,然后再存放回字符数组c中。法一:#include<iostream>#include<sstream>#include<cstring>using namespace std;int main(){ char c[50]="12 34 65 -23 -32 33 61 99 321 32"; int a[10],i,j,t; cout<&原创 2020-06-26 14:41:32 · 488 阅读 · 0 评论 -
例13.14 将一组数据保存在字符数组中。
例13.14 将一组数据保存在字符数组中。法一:#include<iostream>#include<sstream>//这是最新的头文件 #include<cstring>using namespace std;struct student{ int num; char name[20]; float score;};int main(){ student stud[3]= { 1001,"Li",78, 1002,"Wang"原创 2020-06-26 14:38:12 · 835 阅读 · 0 评论 -
例13.13 有5个学生的数据,要求: (1)把它们存到磁盘文件中。 (2)将磁盘文件中的第1,3,5个学生数据读入程序,并显示出来。 (3)将第3个学生的数据修改后存回磁盘文件中的原有位置。 (4)
例13.13 有5个学生的数据,要求:(1)把它们存到磁盘文件中。(2)将磁盘文件中的第1,3,5个学生数据读入程序,并显示出来。(3)将第3个学生的数据修改后存回磁盘文件中的原有位置。(4)从磁盘文件读入修改后的5个学生的数据并显示出来。#include<iostream>#include<cstring>#include<fstream>using namespace std;struct student{ int num; char nam转载 2020-06-26 14:29:06 · 1381 阅读 · 0 评论 -
例13.12 将执行例13.11程序时存放在磁盘文件中的二进制形式的数据读入内存并在显示器上显示。
例13.12 将执行例13.11程序时存放在磁盘文件中的二进制形式的数据读入内存并在显示器上显示。法一:#include<iostream>#include<fstream>using namespace std; struct student{ char name[20];//string name只是浅拷贝,只有指针的值,没有指针指向的值;char name[20]指针的值和指针指向的值都有 int num; int age; char sex;};转载 2020-06-26 14:24:55 · 495 阅读 · 0 评论 -
例13.11 将一批数据以二进制形式存放在磁盘文件中。
例13.11 将一批数据以二进制形式存放在磁盘文件中。法一:#include<iostream>#include<fstream>using namespace std; struct student{ char name[20]; int num; int age; char sex;};int main(){ student stud[3]= { "Li",1001,18,'f', "Fang",1002,19,'m', "Wang"转载 2020-06-26 14:18:28 · 651 阅读 · 0 评论 -
例13.10 从键盘读入一行字符,把其中的字母字符依次存放在磁盘文件f2.dat中。
例13.10 从键盘读入一行字符,把其中的字母字符依次存放在磁盘文件f2.dat中。#include<iostream>#include<fstream>using namespace std;void save_to_file(){ ofstream outfile("f2.dat"); if(!outfile) { cerr<<"open f2.dat error!"<<endl; exit(1); } char c[80];转载 2020-06-26 14:13:06 · 771 阅读 · 0 评论 -
例13.9 从例13.8建立的数据文件f1.dat中读入10个整数放在数组中,找出并输出10个数中的最大者和它在数组中的序号。
例13.9 从例13.8建立的数据文件f1.dat中读入10个整数放在数组中,找出并输出10个数中的最大者和它在数组中的序号。#include<iostream>#include<fstream>using namespace std;int main(){ int a[10],max,i,order; ifstream infile("f1.dat",ios::in);//ios::nocreate是在C++标准制定之前在<fstream.h>中有定义的转载 2020-06-26 14:03:36 · 1364 阅读 · 1 评论 -
例13.8 有一个整型数组,含10个元素,从磁盘输入10个整数给数组,将此数组送到磁盘文件中存放。
例13.8 有一个整型数组,含10个元素,从磁盘输入10个整数给数组,将此数组送到磁盘文件中存放。#include<iostream>#include<fstream>using namespace std;int main(){ int a[10]; ofstream outfile("f1.dat",ios::out);//或ofstream outfile("f1.dat"); if(!outfile) { cerr<<"open error转载 2020-06-26 14:01:41 · 1231 阅读 · 0 评论 -
编写一个程序,定义抽象基类Shape,由它派生出5个派生类:Circle(圆形)、Square(正方形)、Rectangle(矩形)、Trapezoid(梯形)、Triangle(三角形)。用虚函数分
编写一个程序,定义抽象基类Shape,由它派生出5个派生类:Circle(圆形)、Square(正方形)、Rectangle(矩形)、Trapezoid(梯形)、Triangle(三角形)。用虚函数分别计算几种图形面积,并求它们的和。要求用基类指针数组,使它每一个元素指向一个派生类对象。#include<iostream>using namespace std;class Shape{ public: virtual double area() const=0;};clas转载 2020-06-19 22:44:02 · 23123 阅读 · 0 评论 -
编写一个程序,声明抽象基类Shape,由它派生出3个派生类:Circle(圆形)、Rectangle(矩形)、Triangle(三角形),用一个函数printArea分别输出以上三者的面积,3个图形的
编写一个程序,声明抽象基类Shape,由它派生出3个派生类:Circle(圆形)、Rectangle(矩形)、Triangle(三角形),用一个函数printArea分别输出以上三者的面积,3个图形的数据在定义对象时给定。#include<iostream>using namespace std;class Shape{ public: virtual double area() const=0;};class Circle:public Shape{ public转载 2020-06-19 22:42:39 · 13747 阅读 · 1 评论 -
假如增加一个Globe(圆球)类,写出完整的程序。
假如增加一个Globe(圆球)类,写出完整的程序。#include<iostream>using namespace std; class Shape{ public: virtual float area() const { return 0.0; } virtual float volume() const { return 0.0; } virtual void shapeName() const=0; };c原创 2020-06-19 22:41:12 · 341 阅读 · 0 评论 -
假如把Circle类更换成Globe(圆球)类,要求得到圆球的面积和体积,写出完整的程序。
假如把Circle类更换成Globe(圆球)类,要求得到圆球的面积和体积,写出完整的程序。#include<iostream>using namespace std; class Shape{ public: virtual float area() const { return 0.0; } virtual float volume() const { return 0.0; } virtual void shapeName()原创 2020-06-19 22:40:21 · 370 阅读 · 0 评论 -
虚函数和抽象基类的应用。在上一题中介绍了以Point为基类的“点-圆-圆柱体”类的层次结构。现在要对它进行改写,在程序中使用虚函数和抽象基类。类的层次结构的顶层是抽象基类Shape(形状)。Point
虚函数和抽象基类的应用。在上一题中介绍了以Point为基类的“点-圆-圆柱体”类的层次结构。现在要对它进行改写,在程序中使用虚函数和抽象基类。类的层次结构的顶层是抽象基类Shape(形状)。Point(点),Circle(圆,Cylinder(圆柱体)都是Shape类的直接派生类和间接派生类。#include<iostream>using namespace std; class Shape{ public: virtual float area() const { r转载 2020-06-19 22:39:22 · 677 阅读 · 0 评论 -
先建立一个Point(点)类,包含数据成员x,y(坐标点)。以它为基类,派生出一个Circle(圆)类,增加数据成员r(半径),再以Circle类为直接基类,派生出一个Cylinder(圆柱体)类,再
先建立一个Point(点)类,包含数据成员x,y(坐标点)。以它为基类,派生出一个Circle(圆)类,增加数据成员r(半径),再以Circle类为直接基类,派生出一个Cylinder(圆柱体)类,再增加数据成员h(高)。要求编写程序,重载运算符“<<”和“>>”,使之能用于输出以上类对象。#include<iostream>using namespace std; class Point{ public: Point(float x=0,float y=转载 2020-06-19 22:34:41 · 14524 阅读 · 0 评论 -
将第11.8节中的程序段加以补充完善,使之成为一个完整的程序。在程序中使用继承和组合。在定义Professor类对象prof1时给出所有数据的初值,然后修改prof1的生日数据,最后输出prof1的全
将第11.8节中的程序段加以补充完善,使之成为一个完整的程序。在程序中使用继承和组合。在定义Professor类对象prof1时给出所有数据的初值,然后修改prof1的生日数据,最后输出prof1的全部最新数据。#include<iostream>#include<cstring>using namespace std;class Teacher{ public: Teacher(int,const char[],char); void display();转载 2020-06-19 22:30:27 · 1300 阅读 · 0 评论 -
分别声明Teacher(教师)类和Cadre(干部)类,采用多重继承方式由这两个类派生出新类Teacher_Cadre(教师兼干部)类。要求: (1)在两个基类中都包含姓名、年龄、性别、地址、电话等数
分别声明Teacher(教师)类和Cadre(干部)类,采用多重继承方式由这两个类派生出新类Teacher_Cadre(教师兼干部)类。要求:(1)在两个基类中都包含姓名、年龄、性别、地址、电话等数据成员。(2)在Teacher类中还包含数据成员title(职称),在Cadre类中还包含数据成员post(职务)。在Tearcher_Cadre类中还包含数据成员wages(工资)。(3)对两个基类中的姓名、年龄、性别、地址、电话等数据成员用相同的名字,在引用这些数据成员时,指定作用域。(4)在类体中声转载 2020-06-19 22:28:42 · 6307 阅读 · 0 评论 -
如果类A和类B是从同一个基类N派生的,且类D是类A和类B的多重继承派生类,要求在程序中通过类A和类B的构造函数去调用基类N的构造函数,分别对类A和类B的数据成员a初始化。
如果类A和类B是从同一个基类N派生的,且类D是类A和类B的多重继承派生类,要求在程序中通过类A和类B的构造函数去调用基类N的构造函数,分别对类A和类B的数据成员a初始化。#include<iostream>using namespace std;class N{ public: N(int aN) { a=aN; } int a; void display() { cout<<"a="<<a<<endl; }原创 2020-05-27 22:57:18 · 1003 阅读 · 0 评论 -
对下面的程序改用protected继承方式,其他不改。程序能否正常运行?请修改程序,使之能正常运行。
对下面的程序改用protected继承方式,其他不改。程序能否正常运行?请修改程序,使之能正常运行。#include<iostream>using namespace std;class Student{ public: void get_value() { cin>>num>>name>>sex; } void display() { cout<<"num:"<<num<<原创 2020-05-21 20:36:41 · 249 阅读 · 0 评论 -
在派生类中引用保护成员。如果改用public继承方式,程序能否通过编译和正确运行?请对这两种继承方式作比较分析,考虑在什么情况下二者不能互相代替。
在派生类中引用保护成员。如果改用public继承方式,程序能否通过编译和正确运行?请对这两种继承方式作比较分析,考虑在什么情况下二者不能互相代替。答:可以。二者在以下情况下不能互相代替:如果pubic有成员,protected继承后得到的派生类,类外不可以访问基类成员,类内可以访问基类成员。而public继承后得到的派生类,类内、类外都可以访问基类成员。#include<iostream>#include<string>using namespace std;class原创 2020-05-21 20:30:54 · 609 阅读 · 0 评论 -
定义一个Teacher(教师)类和一个Student(学生)类,二者有一部分数据成员是相同的,例如num(号码),name(姓名),sex(性别)。编写程序,将一个Student对象(学生)转换为Te
定义一个Teacher(教师)类和一个Student(学生)类,二者有一部分数据成员是相同的,例如num(号码),name(姓名),sex(性别)。编写程序,将一个Student对象(学生)转换为Teacher(教师)类,只将以上3个相同的数据成员移植过去。可以设想为:一位学生大学毕业了,留校担任教师,他原有的部分数据对现在的教师身份来说仍然是有用的,应当保留并成为其教师数据的一部分。#include<iostream>#include<cstring>using namesp原创 2020-05-19 20:40:59 · 8062 阅读 · 0 评论 -
如果一定要将运算符函数重载为成员函数,而第1个操作数又不是类对象时,只有一个办法能够解决,再重载一个运算符“+”函数,其第1个参数为double型。当然此函数只能是友元函数,函数原型为friend o
如果一定要将运算符函数重载为成员函数,而第1个操作数又不是类对象时,只有一个办法能够解决,再重载一个运算符"+"函数,其第1个参数为double型。当然此函数只能是友元函数,函数原型为friend operator+(double,Complex &);。#include<iostream>using namespace std;class Complex{ public: Complex()//定义无参构造函数 { real=0; imag=0;原创 2020-05-19 20:39:44 · 500 阅读 · 0 评论 -
包含转换构造函数、运算符重载函数和类型转换函数的程序。(类型转换函数和运算符“+”重载函数不能同时出现,不然如处理c1+2.5或2.5+c1时就出现二义性,系统无法判定)
包含转换构造函数、运算符重载函数和类型转换函数的程序。(在这个程序中只包含转换构造函数和运算符重载函数)(类型转换函数和运算符“+”重载函数不能同时出现,不然处理c1+2.5时就出现二义性,系统无法判定)#include<iostream>using namespace std;class Complex{ public: Complex() { real=0; imag=0; } Complex(double r) { real=r;原创 2020-05-19 18:52:22 · 399 阅读 · 0 评论 -
转换构造函数之将另一个类的对象转换成转换构造函数所在的类对象。
转换构造函数之将另一个类的对象转换成转换构造函数所在的类对象。#include<iostream>#include<cstring>using namespace std;class Student{ public: Student(int n,const char nam[],char s) { num=n; strcpy(name,nam); sex=s; } void display() { cout<&l原创 2020-05-19 18:44:52 · 791 阅读 · 0 评论 -
转换构造函数之将标准类型数据转换成类对象。
转换构造函数之将标准类型数据转换成类对象。#include<iostream>using namespace std;class Complex{ public: Complex()//定义无参的默认构造函数 { real=0; imag=0; } Complex(double r,double i)//定义有参的默认构造函数 { real=r; imag=i; } Complex operator+(const Complex原创 2020-05-19 18:43:48 · 648 阅读 · 0 评论 -
声明一个字符串类String,用来存放不定长的字符串,重载运算符“等于”,“小于”和“大于”,用于两个字符串的等于、小于和大于的比较运算。
声明一个字符串类String,用来存放不定长的字符串,重载运算符“==”,“<”和“>”,用于两个字符串的等于、小于和大于的比较运算。方法一:#include<iostream>#include<cstring>using namespace std;class String{ public: String()//定义默认构造函数 { p=NULL; } String(const char *str);//声明构造函数 voi原创 2020-05-19 18:39:04 · 4796 阅读 · 0 评论 -
将运算符+重载为适用于复数加法,重载函数作为成员函数和不作为成员函数而放在类外作为Complex类的友元函数的混合使用。
将运算符+重载为适用于复数加法,重载函数作为成员函数和不作为成员函数而放在类外作为Complex类的友元函数的混合使用。#include<iostream>using namespace std;class Complex{ public: Complex() { real=0; imag=0; } Complex(double r,double i) { real=r; imag=i; } Complex operator+(Co原创 2020-05-19 18:35:07 · 724 阅读 · 0 评论 -
商店销售某一商品,每天公布统一的折扣(discount)。同时允许销售人员在销售时灵活掌握售价(price),在此基础上,一次购10件以上者,还可以享受9.8折优惠。现已知当天3个销货员的销售情况为
商店销售某一商品,每天公布统一的折扣(discount)。同时允许销售人员在销售时灵活掌握售价(price),在此基础上,一次购10件以上者,还可以享受9.8折优惠。现已知当天3个销货员的销售情况为销售员号(num) 销售件数(quantity) 销售单价(price)101 5 23.5102 12 24.56103 100 21.5请编写程序,计算出当日此商品的总销售款sum以及每件商品的平均售价。要求用静态数据成员和静转载 2020-05-18 12:22:30 · 5450 阅读 · 3 评论 -
声明一个类模板,利用它分别实现两个整数、浮点数和字符的比较,求出大数和小数。(在类模板外定义各成员函数)
声明一个类模板,利用它分别实现两个整数、浮点数和字符的比较,求出大数和小数。(在类模板外定义各成员函数)#include<iostream>using namespace std;template <class numtype>//声明类模板,虚拟类型名为numtype class Compare//定义构造函数 { public: Compare(numtype a,numtype b) { x=a; y=b; } numtype m原创 2020-05-18 12:20:57 · 2281 阅读 · 0 评论 -
声明一个类模板,利用它分别实现两个整数、浮点数和字符的比较,求出大数和小数。
声明一个类模板,利用它分别实现两个整数、浮点数和字符的比较,求出大数和小数。#include<iostream>using namespace std;template <class numtype>//声明类模板,虚拟类型名为numtype class Compare//定义构造函数 { public: Compare(numtype a,numtype b) { x=a; y=b; } numtype max()//定义函数max,转载 2020-05-18 12:20:14 · 2340 阅读 · 0 评论 -
有一个日期(Date)类的对象和一个时间(Time)类的对象,均已指定了内容,要求一次输出其中的日期和时间。将Time类声明为Date类的友元类,这样Time中的所有函数都可以访问Date类中的所有成
有一个日期(Date)类的对象和一个时间(Time)类的对象,均已指定了内容,要求一次输出其中的日期和时间。将Time类声明为Date类的友元类,这样Time中的所有函数都可以访问Date类中的所有成员。#include<iostream>using namespace std;class Time;//对Time类的提前引用声明 class Date//声明Date类 { public: Date(int,int,int);//声明构造函数 void display(原创 2020-05-18 12:19:12 · 1992 阅读 · 0 评论 -
有一个日期(Date)类的对象和一个时间(Time)类的对象,均已指定了内容,要求一次输出其中的日期和时间。
有一个日期(Date)类的对象和一个时间(Time)类的对象,均已指定了内容,要求一次输出其中的日期和时间。方法一:#include<iostream>using namespace std;class Date;//对Date类的提前引用声明 class Time//声明Time类 { public: Time(int,int,int);//声明构造函数 void display(Date &);//display是成员函数,形参是Date类对象的引用转载 2020-05-18 12:10:54 · 2439 阅读 · 1 评论 -
统计学生平均成绩。使用静态成员函数。如果想在average函数中引用stud[1]的非静态数据成员score,应该怎样处理?
统计学生平均成绩。使用静态成员函数。如果想在average函数中引用stud[1]的非静态数据成员score,应该怎样处理?方法一:#include<iostream>using namespace std;class Student{ public: Student(int n,int a,float s):num(n),age(a),score(s) { } void total(); static float average(); private原创 2020-05-18 12:08:43 · 891 阅读 · 0 评论 -
统计学生平均成绩。使用静态成员函数。如果不将average函数定义为静态成员函数行不行?程序能否通过编译?需要作什么修改?为什么要用静态成员函数?请分析其理由。
统计学生平均成绩。使用静态成员函数。如果不将average函数定义为静态成员函数行不行?程序能否通过编译?需要作什么修改?为什么要用静态成员函数?请分析其理由。答:不将average函数定义为静态成员函数是行的。程序能通过编译。修改的代码如下。之所以用静态成员函数是因为,引用静态成员函数average函数可以用类名或者对象名,而如果是非静态成员函数average只能实例化对象调用函数average,如果没有定义类的对象,那么可以用类名调用静态成员函数average函数,而对象名因为没有建立所以不能调用,尽原创 2020-05-18 12:04:18 · 1121 阅读 · 1 评论 -
统计学生平均成绩。使用静态成员函数。
统计学生平均成绩。使用静态成员函数。#include<iostream>using namespace std;class Student//定义Student类 { public: Student(int n,int a,float s):num(n),age(a),score(s)//定义构造函数 { } void total();//声明成员函数 static float average();//声明静态成员函数 private: int转载 2020-05-18 12:03:02 · 2294 阅读 · 0 评论