Bootstrap

C++ 实验 05

实验5.1

Point类运算符重载

声明Point类,有坐标x,y,为整型的私有数据成员。

声明成员函数:

Point& operator++();

Point& operator+(Point);

Point(int x = 0,int y =0);

声明友元函数:

friend Point operator--(Point&,int);

friend Point operator-(Point,Point);

friend ostream& operator<<(ostream &,Point p);

注意:若一个函数返回的是对象引用,则不返回auto型对象,需要静态存储的对象, 如static类型的对象

主函数中定义Point类的三个对象:p1、p2、p,p1、p2的初始值由键盘输入,p使用默认值。依次实现运算:p=++p1; p=p2--;  p=p1+p2;  p=p1-p2;后将结果输出。注意结果输出要求使用类似于“cout<<p1;”的形式。

样例输入输出:

10 9

4 5

p=++p1后,p的坐标为:(11,10),p1坐标为:(11,10)

p=p2--后,p的坐标为:(4,5),p2坐标为:(3,4)

p=p1+p2后,p的坐标为:(14,14)

p=p1-p2后,p的坐标为:(8,6)

1 2

3 4

p=++p1后,p的坐标为:(2,3),p1坐标为:(2,3)

p=p2--后,p的坐标为:(3,4),p2坐标为:(2,3)

p=p1+p2后,p的坐标为:(4,6)

p=p1-p2后,p的坐标为:(0,0)

5 10

2 2

p=++p1后,p的坐标为:(6,11),p1坐标为:(6,11)

p=p2--后,p的坐标为:(2,2),p2坐标为:(1,1)

p=p1+p2后,p的坐标为:(7,12)

p=p1-p2后,p的坐标为:(5,10)

#include<iostream>
using namespace std;
class Point
{
public:
	friend Point operator--(Point&,int);
	friend Point operator-(Point&,Point&);
	friend ostream& operator<<(ostream &,Point p);
	Point& operator++();
	Point& operator+(Point);
	Point(int x=0,int y=0);
private:
	int m_x;
	int m_y;
};
Point::Point(int x,int y):m_x(x),m_y(y){}
Point& Point::operator++()
{
	m_x++;
	m_y++;
	return *this;
}
Point operator--(Point& p,int)
{
	Point temp=p;
	p.m_x--;
	p.m_y--;
	return temp;
}
Point& Point::operator+(Point p)
{
	this->m_x+=p.m_x;
	this->m_y+=p.m_y;
	return *this;
}
Point operator-(Point& p1,Point& p2)
{
	Point temp;
	temp.m_x=p1.m_x-p2.m_x;
	temp.m_y=p1.m_y-p2.m_y;
	return temp;
}
ostream& operator<<(ostream& cout,Point p)
{
	cout<<"("<<p.m_x<<","<<p.m_y<<")";
	return cout;
}
int main()
{
	int x1,x2,y1,y2;
	cin>>x1>>y1;
	cin>>x2>>y2;
	Point p1(x1,y1),p2(x2,y2),p;
	p=++p1;
	cout<<"p=++p1后,p的坐标为:"<<p<<",p1坐标为:"<<p1<<endl;
	p=p2--;
    cout<<"p=p2--后,p的坐标为:"<<p<<",p2坐标为:"<<p2<<endl;
    p=p1+p2;
    cout<<"p=p1+p2后,p的坐标为:"<<p<<endl;
    p1=p1-p2;
    p=p1-p2;
    cout<<"p=p1-p2后,p的坐标为:"<<p<<endl;
	return 0;
}

实验5.2

定义一个抽象类Shape,有一个纯虚函数calArea(),返回值为double型。由Shape类派生出4种几何图形:Triangle、Rectangle、Square、Circle,各自新增的数据成员均为double型。

定义两个普通的重载函数fun():返回值均为void,形参分别是抽象类的对象指针、抽象类的对象引用,在函数中通过指针或引用调用虚函数calArea(),输出结果。

主函数中,分别定义Triangle、Rectangle、Square、Circle类的对象,各初始值由键盘输入,分别调用fun(),输出各种图形的面积。

样例输入:

5 7

4 5

6.7

3.4

样例输出:

计算三角形面积:

通过基类指针调用,面积为:17.5

通过基类对象引用调用,面积为:17.5

计算长方形面积:

通过基类指针调用,面积为:20

通过基类对象引用调用,面积为:20

计算正方形面积:

通过基类指针调用,面积为:44.89

通过基类对象引用调用,面积为:44.89

计算圆形面积:

通过基类指针调用,面积为:36.3168

通过基类对象引用调用,面积为:36.3168

8.5 6

1.2 3

3.6

45

计算三角形面积:

通过基类指针调用,面积为:25.5

通过基类对象引用调用,面积为:25.5

计算长方形面积:

通过基类指针调用,面积为:3.6

通过基类对象引用调用,面积为:3.6

计算正方形面积:

通过基类指针调用,面积为:12.96

通过基类对象引用调用,面积为:12.96

计算圆形面积:

通过基类指针调用,面积为:6361.73

通过基类对象引用调用,面积为:6361.73

5.5 10

4.5 8

12

8.9

计算三角形面积:

通过基类指针调用,面积为:27.5

通过基类对象引用调用,面积为:27.5

计算长方形面积:

通过基类指针调用,面积为:36

通过基类对象引用调用,面积为:36

计算正方形面积:

通过基类指针调用,面积为:144

通过基类对象引用调用,面积为:144

计算圆形面积:

通过基类指针调用,面积为:248.846

通过基类对象引用调用,面积为:248.846

#include<iostream>
using namespace std;
#define PI 3.1415926
class Shape
{
public:
	 virtual double calArea()=0;
};
class Triangle:public Shape
{
public:
	Triangle(double a,double b):m_a(a),m_b(b){}
	double calArea()
	{
        return 0.5*m_a*m_b;
	}
private:
	double m_a,m_b;
};
class Rectangle:public Shape
{
public:
	Rectangle(double width,double height):m_width(width),m_height(height){}
	double calArea()
	{
		return m_width*m_height;
	}
private:
	double m_width,m_height;
};
class Square:public Shape
{
public:
	Square(double side):m_side(side){}
	double calArea()
	{
		return m_side*m_side;
	}
private:
	double m_side;
};
class Circle:public Shape
{
public:
	Circle(double r):m_r(r){}
	double calArea()
	{
		return PI*m_r*m_r;
	}
private:
	double m_r;
};
void fun(Shape*s)
{
	cout<<"通过基类指针调用,面积为:"<<s->calArea()<<endl;
}
void fun(Shape&s)
{
	cout<<"通过基类对象引用调用,面积为:"<<s.calArea()<<endl;
}
int main()
{
	double a,b,width,height,side,r;
	cin>>a>>b;
	cin>>width>>height;
	cin>>side;
	cin>>r;
	Triangle triangle(a,b);
	cout<<"计算三角形面积:"<<endl;
	fun(&triangle);
	fun(triangle);
	Rectangle rectangle(width,height);
	cout<<"计算长方形面积:"<<endl;
	fun(&rectangle);
	fun(rectangle);
	Square square(side);
	cout<<"计算正方形面积:"<<endl;
	fun(&square);
	fun(square);
	Circle circle(r);
	cout<<"计算圆形面积:"<<endl;
	fun(&circle);
	fun(circle);
	return 0;
}

实验5.3

编程实现:本题的类间关系如图所示。

定义一个人员类Person,数据成员包括编号、姓名、性别、家庭住址、联系电话。性别用char型实现,’f’表示女性,’m’表示男性,其它用string类型。成员函数包括:(1)构造函数;(2)输出函数print(),输出一个人员的全部描述信息,并定义为虚函数。

定义一个学生类Student,为Person类的公有派生类。新增的数据成员包括数学、物理、英语、程序设计四门课成绩,各门课成绩为整型。新增的成员函数包括:(1)设置数学、物理、外语、程序设计四门课成绩,函数原型为void setScore(char tag, int score);当tag的值分别为’m’、’p’、’e’和’c’时,分别设置数学、物理、英语、程序设计四门课成绩。1)构造函数;(2) 输出函数print(),输出一个学生的全部信息,注意在此函数中调用基类中输出人员的全部描述信息的函数。

定义一个教师类Teacher,为Person类的公有派生类。新增的数据成员包括:职称、工资(职称为string类型,工资为double型)。新增的成员函数包括:(1) 构造函数;(2) 输出函数print(),输出一个教师的全部描述信息,注意在此函数中调用基类中输出人员的全部描述信息的函数。

由Student类和Teacher类公有派生子类TA(助教博士生)类,添加数据成员:专业(string类型),添加构造函数、输出函数(输出一个TA对象的全部信息)。注意虚基类的使用。

定义一个普通函数fun(),形参为Person类的指针,利用C++的多态性,调用虚函数实现输出各对象的信息。

主函数中定义分别Student、Teacher、TA类的对象各一个,其各数据成员的初始值由键盘输入,调用fun()输出Student对象的全部信息;修改Student对象的成绩,数据由键盘输入,再调用fun()输出Student对象的全部信息。调用fun()输出Teacher、TA类的对象的全部信息。

样例输入:

1001 刘玄德 m 河北涿州 12345678999 87 90 85 88

m 92

2031001 诸葛亮 m 徐州琅琊 13344556677 副教授 5500

3045866 赵子龙 m 常山真定 12345678988 87 90 85 88 讲师 3500 计算机科技与技术

样例输出:

学生信息:

编    号:1001

姓    名:刘玄德

性    别:m

家庭住址:河北涿州

联系电话:12345678999

数    学:87

物    理:90

英    语:85

程序设计:88

编    号:1001

姓    名:刘玄德

性    别:m

家庭住址:河北涿州

联系电话:12345678999

数    学:92

物    理:90

英    语:85

程序设计:88

教师信息:

编    号:2031001

姓    名:诸葛亮

性    别:m

家庭住址:徐州琅琊

联系电话:13344556677

职    称:副教授

工    资:5500

TA信息:

编    号:3045866

姓    名:赵子龙

性    别:m

家庭住址:常山真定

联系电话:12345678988

数    学:87

物    理:90

英    语:85

程序设计:88

职    称:讲师

工    资:3500

专    业:计算机科技与技术

1001 魏建华 m 河北涿州 11111111111 84 88 82 88

p 92

5049666 诸葛亮 m 徐州琅琊 13398768555 教授 7500

1025633 赵子龙 m 常山真定 12366666666 87 76 85 88 助教 3500 软件工程

学生信息:

编    号:1001

姓    名:魏建华

性    别:m

家庭住址:河北涿州

联系电话:11111111111

数    学:84

物    理:88

英    语:82

程序设计:88

编    号:1001

姓    名:魏建华

性    别:m

家庭住址:河北涿州

联系电话:11111111111

数    学:84

物    理:92

英    语:82

程序设计:88

教师信息:

编    号:5049666

姓    名:诸葛亮

性    别:m

家庭住址:徐州琅琊

联系电话:13398768555

职    称:教授

工    资:7500

TA信息:

编    号:1025633

姓    名:赵子龙

性    别:m

家庭住址:常山真定

联系电话:12366666666

数    学:87

物    理:76

英    语:85

程序设计:88

职    称:助教

工    资:3500

专    业:软件工程

2059 何长军 f 河北涿州 3467123455 78 65 67 88

c 92

5049607 黄宏 m 贵州遵义 13355669900 教授 7800

1025305 马云 m 浙江杭州 12388998888 87 76 57 88 助教 3800 电子信息工程

学生信息:

编    号:2059

姓    名:何长军

性    别:f

家庭住址:河北涿州

联系电话:3467123455

数    学:78

物    理:65

英    语:67

程序设计:88

编    号:2059

姓    名:何长军

性    别:f

家庭住址:河北涿州

联系电话:3467123455

数    学:78

物    理:65

英    语:67

程序设计:92

教师信息:

编    号:5049607

姓    名:黄宏

性    别:m

家庭住址:贵州遵义

联系电话:13355669900

职    称:教授

工    资:7800

TA信息:

编    号:1025305

姓    名:马云

性    别:m

家庭住址:浙江杭州

联系电话:12388998888

数    学:87

物    理:76

英    语:57

程序设计:88

职    称:助教

工    资:3800

专    业:电子信息工程

2059 何长军 f 河北涿州 3467123455 78 65 67 88

e 92

5049304 黄宏 m 贵州遵义 13355669900 讲师 6800

1025305 马云 m 浙江杭州 12388998888 87 76 57 88 助教 3800 电子信息工程

学生信息:

编    号:2059

姓    名:何长军

性    别:f

家庭住址:河北涿州

联系电话:3467123455

数    学:78

物    理:65

英    语:67

程序设计:88

编    号:2059

姓    名:何长军

性    别:f

家庭住址:河北涿州

联系电话:3467123455

数    学:78

物    理:65

英    语:92

程序设计:88

教师信息:

编    号:5049304

姓    名:黄宏

性    别:m

家庭住址:贵州遵义

联系电话:13355669900

职    称:讲师

工    资:6800

TA信息:

编    号:1025305

姓    名:马云

性    别:m

家庭住址:浙江杭州

联系电话:12388998888

数    学:87

物    理:76

英    语:57

程序设计:88

职    称:助教

工    资:3800

专    业:电子信息工程

#include<iostream>
using namespace std;
#include<string>
class Person
{
public:
	Person(string name,string number,char sex,string address,string phonenumber):m_name(name),m_number(number),
		m_sex(sex),m_address(address),m_phonenumber(phonenumber){}
	virtual void print()
	{
		  cout<<"编    号:"<<m_number<<endl;
		  cout<<"姓    名:"<<m_name<<endl;
		  cout<<"性    别:"<<m_sex<<endl;
		  cout<<"家庭住址:"<<m_address<<endl;
		  cout<<"联系电话:"<<m_phonenumber<<endl;
	}
protected:
	string m_name;
	string m_number;
	char m_sex;
	string m_address;
	string m_phonenumber;
};
class Student:virtual public Person
{
public:
	Student(int math,int physics,int English,int course,string name,string number,char sex,string address,string phonenumber):
	  Person(name,number,sex,address,phonenumber),m_math(math),m_physics(physics),m_English(English),m_course(course){}
	  void setScore(char tag, int score)
	  {
		  switch(tag)
		  {
			case 'm':m_math=score;break;
			case 'p':m_physics=score;break;
			case 'e':m_English=score;break;
			case 'c':m_course=score;break;
		  }
	  }
	  void print()
	  {
		  Person::print();
		  cout<<"数    学:"<<m_math<<endl;
		  cout<<"物    理:"<<m_physics<<endl;
		  cout<<"英    语:"<<m_English<<endl;
		  cout<<"程序设计:"<<m_course<<endl;
	  }
private:
	int m_math;
	int m_physics;
	int m_English;
	int m_course;
};
class Teacher:virtual public Person
{
public:
	Teacher(string title,double wages,string name,string number,char sex,string address,string phonenumber):
	  Person(name,number,sex,address,phonenumber),m_title(title),m_wages(wages){}
	  void print()
	  {
		  static bool flag=true;
		  if(flag)
		  {
			Person::print();
			flag=false;
		  }
		  cout<<"职    称:"<<m_title<<endl;
		  cout<<"工    资:"<<m_wages<<endl;
	  }
private:
	string m_title;
	double m_wages;
};
class TA:public Student,public Teacher
{
public:
	TA(string number,string name,char sex,string address,string phonenumber,int math,int physics,int English,
		int course,string title,double wages,string major):Person(name,number,sex,address,phonenumber),
		Student(math,physics,English,course,name,number,sex,address,phonenumber),Teacher(title,wages,name,number,sex,address,phonenumber),m_major(major){}
	void print()
	{
		Student::print();
		Teacher::print();
		cout<<"专    业:"<<m_major<<endl;
	}
private:
	string m_major;
};
void fun(Person* p)
{
	p->print();
	cout<<endl;
}
int main()
{
	char sex,tag;
	double wages;
	int math,physics,English,course,score;
	string number,name,address,phonenumber,title,major;
	cin>>number>>name>>sex>>address>>phonenumber>>math>>physics>>English>>course;
	cin>>tag>>score;
	Student s(math,physics,English,course,name,number,sex,address,phonenumber);
	cin>>number>>name>>sex>>address>>phonenumber>>title>>wages;
	Teacher t(title,wages,name,number,sex,address,phonenumber);
	cin>>number>>name>>sex>>address>>phonenumber>>math>>physics>>English>>course>>title>>wages>>major;
	TA p(number,name,sex,address,phonenumber,math,physics,English,course,title,wages,major);
	cout<<"学生信息:"<<endl;
	fun(&s);
	s.setScore(tag,score);
	fun(&s);
	cout<<"教师信息:"<<endl;
	fun(&t);
	cout<<"TA信息:"<<endl;
	fun(&p);
	return 0;
}

实验5.4

编写一个使用类模板对数组进行排序、查找和显示所有元素的程序,数组中元素个数3≤n≤15

说明:设计一个类模板

template<class T>

class Array,用于对T类型的数组进行排序、查找、显示所有元素,构造函数有两个参数:传递数组首地址和数组元素个数。

主函数中实例化Array<t>产生模板类Array<int>Array<double>,输入两个数组的长度,再依次输入各元素的值,调用相应的成员函数完成:输出数组的原序列、从键盘输入需要查找的元素值,完成查找(如有相同的元素,则返回找到的第一个数位置)、对数组进行由小到大排序,输出排序后的结果。

样例输入:

9

6 3 8 1 9 4 7 5 2

6

2.3 6.1 1.5 8.4 6.7 3.8

9

8.5

样例输出:

array1:

 原序列:6 3 8 1 9 4 7 5 2

9array1中的位置:5

 排序后:1 2 3 4 5 6 7 8 9

array2:

 原序列:2.3 6.1 1.5 8.4 6.7 3.8

8.5 array2中不存在

 排序后:1.5 2.3 3.8 6.1 6.7 8.4

12

6 3 8 1 9 4 7 5 2 89 43 12

6

12.5 6.3 8.5 90.5 78.6 63.1

10

90.5

array1:

原序列:6 3 8 1 9 4 7 5 2 89 43 12

10array1中不存在

排序后:1 2 3 4 5 6 7 8 9 12 43 89

array2:

原序列:12.5 6.3 8.5 90.5 78.6 63.1

90.5 array2中的位置:4

排序后:6.3 8.5 12.5 63.1 78.6 90.5

15

6 3 8 1 9 4 7 5 2 89 43 12 89 74 56

8

12.5 6.3 8.5 90.5 78.6 63.1 84.3 95.2

89

95.2

array1:

 原序列:6 3 8 1 9 4 7 5 2 89 43 12 89 74 56

89array1中的位置:10

 排序后:1 2 3 4 5 6 7 8 9 12 43 56 74 89 89

array2:

 原序列:12.5 6.3 8.5 90.5 78.6 63.1 84.3 95.2

95.2 array2中的位置:8

 排序后:6.3 8.5 12.5 63.1 78.6 84.3 90.5 95.2

8

45 71 34 26 89 678 65 45

6

12.3 56. 42.3 6.3 4.6 78.3

56

4.5

array1:

 原序列:45 71 34 26 89 678 65 45

56array1中不存在

 排序后:26 34 45 45 65 71 89 678

array2:

 原序列:12.3 56 42.3 6.3 4.6 78.3

4.5 array2中不存在

 排序后:4.6 6.3 12.3 42.3 56 78.3

6

34 12 76 43 890 65

5

12.3 96.3 45.2 45.8 53.6

12

12.3

array1:

 原序列:34 12 76 43 890 65

12在array1中的位置:2

 排序后:12 34 43 65 76 890

array2:

 原序列:12.3 96.3 45.2 45.8 53.6

12.3 在array2中的位置:1

 排序后:12.3 45.2 45.8 53.6 96.3

#include <iostream>
using namespace std;
template <class T>
class Array
{
public:
    Array(T* arr,int n):m_arr(arr),m_n(n){}
    void print()
	{
        for(int i=0;i<m_n;i++)
		{
            cout<<m_arr[i]<<" ";
        }
        cout<<endl;
    }
    int find(T value)
	{
        for(int i=0;i<m_n;i++)
		{
            if(m_arr[i]==value)
			{
                return i+1;
            }
        }
        return -1;
    }
    void sort()
	{
        for(int i=0;i<m_n-1;i++)
		{
            for(int j=0;j<m_n-1-i;j++)
			{
                if(m_arr[j]>m_arr[j+1])
				{
                    swap(m_arr[j],m_arr[j+1]);
                }
            }
        }
    }
private:
    T* m_arr;
    int m_n;
};
int main()
{
    int n1,n2,i;
	int value1;
	double value2;
    cin>>n1;
	int* arr1=new int[n1];
    for(i=0;i<n1;i++)
	{
        cin>>arr1[i];
    }
	cin>>n2;
	double* arr2=new double[n2];
	for(i=0;i<n2;i++)
	{
        cin>>arr2[i];
    }
	cin>>value1;
	cin>>value2;
    Array<int> array1(arr1,n1);
	cout<<"array1:"<<endl<<" 原序列:";
    array1.print();
    int pos=array1.find(value1);
    if(pos!=-1)
	{
		cout<<value1<<"在array1中的位置:"<<pos<<endl;
    }
	else
	{
        cout<<value1<<"在array1中不存在"<<endl;
    }
    array1.sort();
	cout<<" 排序后:";
    array1.print();
    Array<double> array2(arr2, n2);
	cout<<"array2:"<<endl<<" 原序列:";
    array2.print();
    int pos2=array2.find(value2);
    if(pos2!=-1)
	{
        cout<<value2<<"在array2中的位置:"<<pos2<<endl;
    }
	else
	{
        cout<<value2<<"在array2中不存在"<<endl;
    }
    array2.sort();
	cout<<" 排序后:";
    array2.print();
	delete []arr1;
	delete []arr2;
    return 0;
}

;