C++实验03_类
实验03(01)Location类
题目描述
设计一个用来表示直角坐标系的Location类,有两个double型私有数据成员x,y;主程序中,输入相应的值,创建类Location的两个对象a和b,要求a的坐标点在第3 象限,b的坐标点在第2象限;分别采用成员函数和友元函数计算给定两个坐标点之间的距离。
【提示】类Location的参考框架如下:
class Location
{
public:
Location(double a,double b);//构造函数
double getX(); //成员函数,取x坐标的值
double getY(); //成员函数,取y坐标的值
double distance1(Location &);//成员函数,求给定两点之间的距离
//友元函数,求给定两点之间的距离
friend double distance1(Location &,Location&);
private:
double x,y;
};
输入描述
二行,每行分别为一个点的坐标
输出描述
四行:
第一、二行分别为第一个点、第二个点的坐标
第三行为调用成员函数求出的点之间的距离
第四行为调用友元函数求出的点之间的距离
输入样例
1 2
6 7
输出样例
第一个点:A(1,2)
第二个点:B(6,7)
调用成员函数,Distance=7.07107
调用友元函数,Distance=7.07107
#include <iostream>
#include <cmath>
using namespace std;
class Location
{
public:
Location(double a, double b); //构造函数
double getX(); //成员函数,取x坐标的值
double getY(); //成员函数,取y坐标的值
double distance1(Location &); //成员函数,求给定两点之间的距离
friend double distance1(Location &, Location &); //友元函数,求给定两点之间的距离
private:
double x, y;
};
Location::Location(double a, double b)
{
x = a;
y = b;
}
double Location::getX()
{
return x;
}
double Location::getY()
{
return y;
}
double distance1(Location &a, Location &b)
{
double dx = a.getX() - b.getX();
double dy = a.getY() - b.getY();
return sqrt(dx * dx + dy * dy);
}
double Location::distance1(Location &b)
{
double dx = x - b.getX();
double dy = y - b.getY();
return sqrt(dx * dx + dy * dy);
}
int main()
{
double x1, x2, y1, y2;
cin >> x1 >> y1;
cin >> x2 >> y2;
Location a(x1, y1);
Location b(x2, y2);
cout << "第一个点:"
<< "A(" << x1 << "," << y1 << ")" << endl;
cout << "第二个点:"
<< "B(" << x2 << "," << y2 << ")" << endl;
cout << "调用成员函数,Distance=" << a.distance1(b) << endl;
cout << "调用友元函数,Distance=" << distance1(a, b) << endl;
return 0;
}
成员函数与友元函数
成员函数
double Location::distance1(Location &b)
{
double dx = x - b.getX();
double dy = y - b.getY();
return sqrt(dx*dx + dy * dy);
}
使用
a.distance1(b)
友元函数
友元函数不用写作用域范围
double distance1(Location &a, Location&b)
{
double dx = a.getX() - b.getX();
double dy = a.getY() - b.getY();
return sqrt(dx*dx + dy * dy);
}
使用
distance1(a, b)
实验03(02)Payroll类
题目描述
设计一个计算薪水的类Payroll,数据成员包括:单位小时工资、周工作小时、每周应付工资,其中每周应付工资=单位小时工资* 周工作小时。要求:定义构造函数、析构函数、拷贝构造函数,常成员函数output()用来输出对象的数据成员值。主函数中定义两个对象:第一个对象的单位小时工资、周工作小时由键盘输入,第二个对象定义为常对象,他的单位小时工资为第一个对象的1.5倍,周工作小时相同,输出每个对象的信息。
输入描述
一行:第一个对象的单位小时工资、周工作小时
输出描述
两个对象的小时工资、周工作时数、周应付工资
函数调用的相关信息
输入样例
25 38
输出样例
Constructor is called!
小时工资:25 周工作时数:38 周应付工资:950
Copy constructor is called!
小时工资:37.5 周工作时数:38 周应付工资:1425
Destructor is called!
#include <iostream>
using namespace std;
class Payroll
{
public:
Payroll(double a, int b)
{
cout << "Constructor is called!" << endl;
SalaryPurHour = a;
WorkTime = b;
}
double GetTotalSalary()
{
TotalSalary = WorkTime * SalaryPurHour;
return TotalSalary;
}
Payroll(const Payroll &a);
void output()
{
cout << "小时工资:" << SalaryPurHour << " 周工作时数:" << WorkTime << " 周应付工资:" << GetTotalSalary() << endl;
}
~Payroll()
{
cout << "Destructor is called!" << endl;
}
private:
int WorkTime;
double SalaryPurHour;
double TotalSalary;
};
Payroll::Payroll(const Payroll &x)
{
cout << "Copy constructor is called!" << endl;
SalaryPurHour = 1.5 * x.SalaryPurHour;
WorkTime = x.WorkTime;
TotalSalary = SalaryPurHour * WorkTime;
}
int main()
{
int WorkTime;
double SalaryPurHour;
cin >> SalaryPurHour;
cin >> WorkTime;
Payroll A(SalaryPurHour, WorkTime);
A.output();
Payroll B(A);
B.output();
return 0;
}
拷贝构造函数
Payroll::Payroll(const Payroll &x)
{
cout << "Copy constructor is called!" << endl;
SalaryPurHour = 1.5 * x.SalaryPurHour;
WorkTime = x.WorkTime;
TotalSalary = SalaryPurHour * WorkTime;
}
实验03(03)组合类:Triangle类与Point类
题目描述
定义一个平面坐标系下的点类Point,有整型数据成员x,y坐标值。成员函数包括:(1)带默认值的构造函数,默认值均为0;(2)拷贝构造函数;(3)置x,y坐标值;(4)取x,y的坐标值,参数为两个整型量的引用,分别用于获取x,y坐标值。(5)输出函数,用于输出x,y坐标值。(6)求两个点之间距离的函数,参数是Point类的对象引用。
定义一个平面坐标系下的三角形类Triangle,数据成员为三个Point类的对象p1、p2、p3。成员函数包括:(1)带参数的构造函数,参数为整型量x1,y1,x2,y2,x3,y3,分别是三角形三个顶点的坐标。(2)带参数的构造函数,参数是三个Point类对象的引用。(3)求三角形周长。(4)求三角形面积。(5)输出三角形的三个顶点坐标、周长和面积。
定义一个普通函数:判断三个顶点坐标能否构成三角形。
main()中,从键盘输入三个点坐标,判断这三个点能否构成三角形,不能,则提示重新输入,并重新输入点坐标;能,则输出三个顶点坐标、周长和面积。
输入描述
三个点的坐标,如果不能构成三角形,再重新输入三个点的坐标
输出描述
三个顶点坐标
三角形周长、三角形面积
输入样例
0 0
1 1
2 2
0 0
5 6
3 0
输出样例
顶点坐标不正确,不能构成三角形!请重新输入坐标!
三角形三个顶点坐标为:
(0,0) (5,6) (3,0)
三角形周长为:17.1348,面积为:9
#include <iostream>
#include <cmath>
using namespace std;
class Point
{
public:
Point(int a = 0, int b = 0)
{
x = a;
y = b;
}
Point(const Point &a) //拷贝构造函数
{
x = a.x;
y = a.y;
}
void input()
{
cin >> x >> y;
}
int getx(int &x)
{
return x;
}
int gety(int &y)
{
return y;
}
void output()
{
cout << "(" << x << "," << y << ")";
}
double distance(Point &a)
{
double dx = x - a.x, dy = y - a.y;
return sqrt(dx * dx + dy * dy);
}
private:
int x, y;
};
class Triangle
{
public:
Triangle(int x1, int y1, int x2, int y2, int x3, int y3)
{
A = (x1, y1);
B = (x2, y2);
C = (x3, y3);
}
Triangle(Point &a, Point &b, Point &c)
{
A = a;
B = b;
C = c;
}
double Len()
{
return A.distance(B) + B.distance(C) + C.distance(A);
}
double Area()
{
double s = Len() / 2.0;
return sqrt(s * (s - A.distance(B)) * (s - B.distance(C)) * (s - C.distance(A)));
}
void output()
{
cout << endl
<< "三角形周长为:" << Len() << ",面积为:" << Area();
}
private:
Point A, B, C;
};
bool ifTriangle(Point &p1, Point &p2, Point &p3)
{
here:
if ((p1.distance(p2) + p2.distance(p3) > p3.distance(p1)) && (p1.distance(p2) + p3.distance(p1) > p2.distance(p3)) && (p2.distance(p3) + p3.distance(p1) > p1.distance(p2)))
{
cout << "三角形三个顶点坐标为:" << endl;
p1.output();
p2.output();
p3.output();
Triangle T(p1, p2, p3);
T.output();
}
else
{
cout << "顶点坐标不正确,不能构成三角形!请重新输入坐标!" << endl;
return false;
}
}
int main()
{
Point A, B, C;
here:
A.input();
B.input();
C.input();
if (ifTriangle(A, B, C) == false)
{
goto here;
}
return 0;
}
判断是否是三角形
两边之和大于第三边
或者(两边之差小于第三边)
但是要列出3个
比如
a+b>c&&a+c>b&&b+c>a
if ((p1.distance(p2) + p2.distance(p3) > p3.distance(p1)) && (p1.distance(p2) + p3.distance(p1) > p2.distance(p3)) && (p2.distance(p3) + p3.distance(p1) > p1.distance(p2)))
实验03(04)标准类string的使用
题目描述
使用C++中的string标准类,将5个字符串按由小到大顺序输出(注意:使用string类中封装的成员函数)。
说明:查阅C++类库中的string类,了解类中的成员函数和运算符。
输入描述
五个字符串
输出描述
按由小到大排列的5个字符串
输入样例
string month attack price hello
输出样例
排序后的结果为:
attack hello month price string
#include <iostream>
#include <string>
using namespace std;
int main()
{
int i;
string str[5];
void sort(string s[]);
for (i = 0; i < 5; i++)
cin >> str[i];
sort(str);
cout << "排序后的结果为:" << endl;
for (int i = 0; i < 5; i++)
cout << str[i] << endl;
return 0;
}
void sort(string s[])
{
string temp;
for (int i = 0; i < 4; i++) //使用冒泡法排序
{
for (int j = 0; j < 4 - i; j++)
{
if (s[j] > s[j + 1])
{
temp = s[j];
s[j] = s[j + 1];
s[j + 1] = temp;
}
}
}
}