第三次上机题目,主要是类和函数的应用

  • Post author:
  • Post category:其他


1,、类的定义与基本操作

说明执行下列语句后,分别执行的什么操作,会输出什么?

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 {
private:                                //数据成员,访问控制属性默认是私有
	int m_numerator = 0;            // 分子默认为0; C++11
	int m_denominator = 1;      //分母默认为1;
	int gcd(int x, int y);
public:                         //公有成员函数
	int getnumerator()const{ return m_numerator; }
	int getdenominator()const { return m_denominator; }
	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);
	void  reduce() {
		int n = gcd(m_numerator, m_denominator);        //求最大公约数
		m_denominator /= n; m_numerator /= n;
	}
	~Fraction() { 
		cout << "Destructor of Fraction" << endl; 
	}
		
};
int Fraction::gcd(int x, int y) {        //gcd的函数定义,用辗转相除法求两个整数的最大公约数
	if (y != 0) gcd(y, x % y);
	else return x;
}
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;
}
void Fraction::makeCommon(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;
}
Fraction operator/(const Fraction& left, const Fraction& right) {      //实现分数的除法运算
	Fraction result(left.getnumerator() * right.getdenominator(), 
		left.getdenominator() * right.getnumerator());
	return result;
}
int main() {
	Fraction a;    //默认构造值
	Fraction b(a);   //复制a的值
	Fraction c = Fraction(3, 2);     //构建一个值(3,2)
	Fraction d1(2, 3), d2(4, 5);
	Fraction e1 = divide1(d1, d2);
	Fraction e2 = divide2(d1, d2);
	return 0;
}

Constructor called

Copy constructor called

Constructor called

Constructor called

Constructor called

Constructor called

Copy constructor called

Copy constructor called

Constructor called

Copy constructor called

Destructor of Fraction

Destructor of Fraction

Destructor of Fraction

Destructor of Fraction

Destructor of Fraction

Destructor of Fraction

Destructor of Fraction

Destructor of Fraction

Destructor of Fraction

Destructor of Fraction

注:此题主要是类的定义和一些基本操作,刚开始看起来有点眼乱,脑子有点乱,要静下来慢慢想,慢慢看。

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>
#include<cmath>
using namespace std;
int a[5] = { 19,67,24,11,17 }, b[5] = { 2,3,9,17,59 };

//顺序查找法
int funa(int i) {                    
	for (int j = 0; j < 5; j++) {
		if (a[j] == i) {
			return j;
			cout << endl;
		}
	}
}  
//折半查找法
int halfb(int i) {
	int h = size(b);
	int left = 0, right = h - 1;
	while (left <= right) {
		int middle = (left + right) / 2;        //开始折半
		if (b[middle] == i)return middle;
		else if (b[middle] > i)right = middle - 1;      //改变折半的范围
		else left = middle + 1;
	}
	return -1;            //查找失败返回-1

	
}
//判断素数
int sushu(int j) {
	int k = sqrt(j);
	for (int i = 2; i <= k; i++) {
			if (j % i == 0)break;
			else {
				if (i == k)return j;
			}
	}
	if (k <= 2)return j;          //考虑到数组元素中的2,3
}
//交换函数
void swap(int& x, int& y) {       //引用传递
	if (x == y)return;
	int z(x);
	x = y;
	y = z;
}

int main() {
	int s;
	cout<< "请输入要查找的数=";
	cin >> s;
	cout <<'\n'<<"a数组中要查找的下标为"<< funa(s) << endl;
	cout <<"b数组中要查找的下标为"<< halfb(s) << endl;
	vector<int> vi;
	for (auto i : a) {                        //阅览a数组中的元素,找到素数后,将其添加入容器中
		if (sushu(i) == i)vi.push_back(i);
	}
	for (auto i : b) {                       // 阅览b数组中的元素,找到素数后,将其添加入容器中
		if (sushu(i) == i)vi.push_back(i);
	}
	for (int i = vi.size() - 1; i >= 0; --i) {         //采用冒泡排序法
		for (int j = 0; j <= i - 1; ++j) {
			if (vi.at(j) > vi.at(j + 1))
			swap(vi.at(j), vi.at(j + 1));          //注:此处不能写swap(j,j+1),参数列表不对,同时编译器会报错
		}
	}
	for (auto it = vi.begin(); it != vi.end(); ++it) {    //此处运用迭代来阅览容器中的元素,注意此处要用!=
		cout << *it << endl;
	}

	return 0;
}

注意:此题主要考察函数和数组的运用,其中有折半查找函数,排序函数(代码中采用冒泡排序),题中所示的几类函数比较重要,要深度理解和掌握。

3.类的定义与基本操作

  1. 说明上述程序执行流程和输出结果; 2) 在Point类中完善获取点的横坐标、获取点的纵坐标成员函数,并在主函数中测试; 3) 通过友元函数实现平面上任意两个点的距离计算辅助函数; 4) 在Circle类中完善圆的面积计算与圆的周长计算成员函数,并在主函数中测试;
#include<iostream>
#include<cmath>
using namespace std;
class Point {
	double m_x = 0, m_y = 0;
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;
	}
	int getm_x() const{ return m_x; }          //获取横坐标
	int getm_y() const{ return m_y; }          //获取纵坐标
	double juli(double x, double y);
	~Point() {
		cout << "Destructor of Point" << endl;
	}
}; 
double Point::juli(double x, double y){           //计算距离函数
	double t = sqrt((x - m_x) * (x - m_x) + (y - m_y) * (y - m_y));
	return t;
}
class Circle {
	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;
	}
	double mianji() {                             //计算面积函数
		double i = 3.14 * m_radius * m_radius;
		return i; } 
	double zhouchang() {                            //计算周长函数
		double j = 3.14 * 2 * m_radius;
		return j; }
	~Circle() {
		cout << "Destructor of Circle" << endl;
	}
};

int main()
{
	Circle a(2, Point(1, 1));
	cout << Point(1,1).getm_x()<<'\t'<< Point(1, 1).getm_y() << endl;
	cout << a.mianji() << '\t' << a.zhouchang() << endl;
	cout << "end" << endl;
	double x, y;
	cin >> x >> y;
	cout <<'\t'<< Point(1,1).juli(x,y)<<endl;      //计算两点距离,point中的点可以改变,此处以(1,1)为例
	return 0;
}

注:此题和第一题类似,主要考察辅助类,同时此题中直接在类中定义一个距离函数,没有采用友元函数,友元会下去试的。

小结:对于刚刚学习类的我来说,确实刚开始,一大段的代码给我看的有点懵,但还是要有一段时间来慢慢习惯和理解,在学习的路上要仔细地研究所学内容,尤其是这种专业性的知识万万不可心急。



版权声明:本文为qq_52086992原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。