说明执行下列语句后,分别执行的什么操作,会输出什么?
Fraction a;
Fraction b(a);
Fraction c = Fraction(3, 2); Fraction d1(2, 3), d2(4, 5); Fraction e1 = divide1(d1, d2); Fraction e2 = divide2(d1, d2);
在上述类的定义基础上,完善下列操作:
1)显示定义析构函数;
2)获取分数的分子;
3)获取分数的分母;
4)实现分数的约分;
5)实现对两个分数对象进行通分;
6)使用operator/操作符重载实现两个分数的除法运算。
#include <iostream>
using namespace std;
class Fraction{
//数据成员,访问控制属性默认是私有
int m_numerator = 0; // 分子默认为0; C++11
int m_denominator = 1; //分母默认为1;
int gcd(int x, int y);
public://公有成员函数
int numerator()const { return m_numerator; }
int denominator()const { return m_denominator; }
int getnumerator()const { return m_numerator; }
int getdenominator()const { return m_denominator; }
double value()const;
Fraction(int above = 0, int below = 1) : m_numerator(above), m_denominator(below) {
cout << "Constructor called" << endl;//构造函数
}
Fraction(const Fraction& rhs) : m_numerator(rhs.m_numerator), m_denominator(rhs.m_denominator) {
cout << "Copy constructor called" << endl;//复制构造函数,复制优化
}
void makeCommon(Fraction& a, Fraction& b)
;~Faction() {
cout << "Destory"<<endl;
}
};
//声明,定义makeCommon函数
void makeCommom(Fraction& a, Fraction& b) {
a.m_numerator *= b.m_denominator;
b.m_numerator *= a.m_denominator;
b.m_denominator = a.m_denominator *= b.m_denominator;
}
//定义gcd 函数
int Fraction::gcd(int x, int y) {
if (y != 0)
gcd(y, x % y);
else
return x;
}
//定义value函数
double Fraction::value()const {
return static_cast<double>(m_numerator) / m_denominator;
}
//定义divide函数
Fraction divide1(const Fraction& divident, const Fraction& divisor) {
return Fraction(divident.getnumerator() * divisor.getdenominator(),
divident.getdenominator() * divisor.getnumerator());
}//两分数相除;
Fraction divide2(Fraction divident, Fraction divisor) {
Fraction result(divident.getnumerator() * divisor.getdenominator(),
divident.getdenominator() * divisor.getnumerator());
return result;
}//两分数相除;
//声明定义重载函数,实现两个分数的除法运算
Fraction operator/(const Fraction& left, const Fraction& right) {
Fraction result(left.numerator() *= right.denominator(),
left.denominator() *= right.numerator());
return result;
}
int main() {
Fraction a;
Fraction b(a);
Fraction c = Fraction(3, 2);
Fraction d1(2, 3), d2(4, 5);
Fraction e1 = divide1(d1, d2);
Fraction e2 = divide2(d1, d2);
return 0;
}
题目 2、数组与函数的综合应用
已知:int a[5] = { 19,67,24,11,17 }, b[5] = { 2,3,9,17,59 };
编写程序查找数组中是否存在某个指定元素;将数组a和数组b中的素数不重不漏地合并到一个vector容器c中,然后按照下标访问的方式手动对容器c中的数据,按从小到大顺序重新排序。要求依次实现:
1)编写顺序查找法函数和折半查找法函数,分别在数组a和数组b中查找元素17所在的下标并输出。
2)编写判断素数函数和排序函数,并对容器c中的结果进行输出。
#include <iostream>
#include <vector>
using namespace std;
//定义顺序查找函数
int shunxu(int a[], int high, int key) {
for (int i = 0; i < high; i++)
if (a[i] == key)
cout << i << endl;
else
cout << "数组中无此数;" << endl;
return 0;
}
//定义折半查找函数low,high,middle
int zheban(int a[], int number, int key) {
int low = 0;
int middle = 0;
int high = number - 1;
//在low<=high的时候才可以查找
while (low <= high)
{
middle = (low + high) / 2;
if (a[middle] == key)
cout << middle << endl;
if (a[middle] < key)
{
low = middle + 1;
//更改搜素的范围,中间值小于目标值,目标值在中间的下一位到末尾;
}
else
{
//中间值大于目标值,则目标值在中间的上一位到最前;
high = middle - 1;
}
cout << "无此数:";
}
return 0;
}
//定义判断素数的函数
bool is_sushu(int shuzi) {
for (int i = 2; i < shuzi; i++)
{
if ((shuzi % i) != 0)
{
if (i == shuzi - 1)
return true;
}
else
{
return false;
}
}
}
//定义新增素数vector容器,并将重复的素数删除
vector <int> xinzeng(int *a,int a_number,int* b,int b_number)
{
vector <int> add;
for (int i = 0; i < a_number; i++)
{
if (is_sushu(a[i]))
{
add.push_back(a[i]);
}
}
//将数组a中的素数从尾部输入到vector add中
for (int i = 0; i < b_number; i++)
{
if (is_sushu(b[i]))
{
add.push_back(b[i]);
}
//将数组b中的素数从尾部输入到vector add 中;
for (int j = 0; j < add.size(); j++)
{
if (add[j] == b[i])
{
add.pop_back();
}
//b是从尾部输入的,可以从尾部开始删除与a输入到vector add中的重复的;
}
}
return add;
}
vector<int>change(vector<int>& add)
{
int high = add.size();
for (int i = 0; i < high; i++)
{
for (int j = 1; j < high; j++)
{
if (add[i] > add[j])
{
int x = add[i];
add[i] = add[j];
add[j] = x;
}
}
}
return add;
}
int main()
{
int a[5] = { 19,67,24,11,17 };
int b[5] = { 2,3,9,17,59 };
vector<int> add;
add = xinzeng(a, 5, b, 5);
//调用新增函数
add = change(add);
for (int i = 0; i < add.size(); i++)
{
cout << add[i] << endl;
}
}
题目 3、类的定义与基本操作
1)说明上述程序执行流程和输出结果;
2)在Point类中完善获取点的横坐标、获取点的纵坐标成员函数,并在主函数中测试;
3)通过友元函数实现平面上任意两个点的距离计算辅助函数;
4)在Circle类中完善圆的面积计算与圆的周长计算成员函数,并在主函数中测试;
#include<iostream>
using namespace std;
class Point {
private:
double m_x = 0, m_y = 0;
friend double distance(Point& A, Point& B);//友元函数,声明求距离的函数;
public:
Point(double x = 0, double y = 0) : m_x(x), m_y(y) {
cout << "Constructor of Point" << endl;
}
Point(const Point& p) :m_x(p.m_x), m_y(p.m_y) {
cout << "Copy constructor of Point" << endl;
}
~Point() {
cout << "Destructor of Point" << endl;
}
double get_x()const { return m_x; }//声明得到横坐标函数
double get_y()const { return m_y; }//声明获取纵坐标函数
};
double distance(Point& A, Point& B)
{
double x1 = A.m_x, y1 = A.m_y;
double x2 = B.m_x, y2 = B.m_y;
return sqrt(pow(x1 - x2, 2) + pow(y1 - y2, 2));
}//定义求距离函数
class Circle {
private:
Point m_center; double m_radius = 1.0;
public:
Circle(double r = 1, const Point& p = Point()) :m_center(p), m_radius(r) {
cout << "Constructor of Circle" << endl;
}
~Circle() {
cout << "Destructor of Circle" << endl;
}
double S();//声明面积函数
double L();//声明周长函数
};
double Circle::S()
{
return m_radius * m_radius * 3.1415;
}//定义面积函数;
double Circle::L()
{
return 2 * 3.1415 * m_radius;
}//定义周长函数;
int main()
{
Circle a(2, Point(1, 1));
cout << a.S() << endl;//.访问和调用面积函数
cout << a.L() << endl;//.访问和调用面积函数
cout << "end" << endl;
Point A(2, 2);
Point B(1, 1);
cout << distance(A, B) << endl;
return 0;
}