实验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
9在array1中的位置: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
10在array1中不存在
排序后: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
89在array1中的位置: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
56在array1中不存在
排序后: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;
}