C++ Primer第五版 第十一章编程练习节选(构造函数、友元函数、操作符重载)

//vect.h
#ifndef VECT_H_
#define VECT_H_

#include<cmath>
#include<iostream>

namespace VECTOR
{
	class Vector
	{
	private:
		double x;
		double y;
		char mode;
		void set_x(double r, double theta);
		void set_y(double r, double theta);
	public:
		Vector();
		Vector(double x1, double y1, char form = 'r');
		void reset(double x1, double y1, char form = 'r');
		~Vector();
		
		void polar();
		void rect();
		
		double x_val()const {return x;}
		double y_val()const {return y;}
		double r_val()const {return sqrt(x * x + y * y);}
		double theta_val()const 
		{
			if(x == 0.0 && y == 0.0)
			{
				return 0.0;
			}
			else
			{
				return atan2(y,x);
			}
		}
			
		Vector operator+(const Vector &v)const;
		Vector operator-(const Vector &v)const;
		Vector operator-()const;
		Vector operator*(double n)const;
			
		friend Vector operator*(double n, const Vector &v);
		friend std::ostream & operator<<(std::ostream &os, const Vector &v);
	};
}

#endif

//vect.cpp
#include<cmath>
#include"vect.h"
using namespace std;
namespace VECTOR
{
	const double unit_rad = 45.0 / atan(1.0);
		
	void Vector::set_x(double r, double theta)
	{
		x = r*cos(theta);
	}
		
	void Vector::set_y(double r, double theta)
	{
		y = r*sin(theta);
	}
	
	Vector::Vector()
	{
		x = y =  0;
		mode = 'r';
	}

	Vector::Vector(double x1, double y1, char form)
	{
		mode = form;
		if(mode == 'r')
		{
			x = x1;
			y = y1; 
		}
		else if(mode == 'p')
		{
			set_x(x1, y1);
			set_y(x1, y1);
		}
		else
		{
			cout << "Wrong type mode. Set vector = 0" << endl;
			x = y = 0;
			mode = 'r';
		}
	}
		
	void Vector::reset(double x1, double y1, char form)
	{
		mode = form;
		if(mode == 'r')
		{
			x = x1;
			y = y1; 
		}
		else if(mode == 'p')
		{
			set_x(x1, y1);
			set_y(x1, y1);
		}
		else
		{
			cout << "Wrong type mode. Set vector = 0" << endl;
			x = y = 0;
			mode = 'r';
		}
	}
	Vector::~Vector()
	{
	
	}

	void Vector::polar()
	{
		mode = 'p';
	}
	
	void Vector::rect()
	{
		mode = 'r';
	}
		
	Vector Vector::operator+(const Vector &v)const
	{
		return Vector(x + v.x, y + v.y);
	}
	
	Vector Vector::operator-(const Vector &v)const
	{
		return Vector(x - v.x, y - v.y);
	}
		
	Vector Vector::operator-()const
	{
		return Vector(-x, -y);
	}	
	
	Vector Vector::operator*(double n)const
	{
		return Vector(x*n, y*n);
	}
		
	Vector operator*(double n, const Vector &v)
	{
		return Vector(n*v);
	}

	std::ostream & operator<<(std::ostream &os, const Vector &v)
	{	
		if(v.mode == 'r')
		{
			os << "Rectangle System : (x, y) = " << "( " <<  v.x << " , " << v.y <<" )";
		}
		else if(v.mode == 'p')
		{
			os << "Polar System : (r, theta) = " << "(" << v.r_val() << " , " << v.theta_val()*unit_rad << " )";
		}
		else
		{
			os << "I can't recognize the system, Please check your system mode . ";
		}
		return os;
	}
}
//main.cpp
#include<iostream>
#include<fstream>
#include<cstdlib>			//include rand() / srand() prototype 
#include<ctime>				//include time() prototype
#include"vect.h"

int main()
{
	using namespace std;
	using VECTOR::Vector;
	ofstream fout;
	fout.open("record.txt");
	Vector result(0.0, 0.0);
	Vector step;
	unsigned long steps = 0;
	double direction;
	double target;
	double dstep;
	int N;
	unsigned long max = 0;
	unsigned long min = 100;
	double avg;
	srand(time(0));
	
	cout << "Enter N times to test:";
	cin >> N;
	for(int i = 0; i < N; ++i)
	{
		cout << "Enter the target diatance (q or Q to quit) : ";
		cin >> target;
		cout << "Enter the step length: ";
		if(!(cin >> dstep))
		{
			break;
		}
		fout << "Target distance : " << target << " , and step length : " << dstep << endl;
		while(result.r_val() < target)
		{
			direction = rand() % 360;
			step.reset(dstep, direction, 'p');
			result = result + step;
			fout << steps << "# location :"  << result << endl;
			steps++;
		}
		max = (max < steps) ? steps : max;
		min = (min > steps) ? steps : min;
		avg += steps;
		result.polar();
		steps = 0;
		result.reset(0.0, 0.0);
	}
	avg /= N;
	cout << "max = " << max << " , min = " << min << " , avg = " << avg << endl;
	cout << "Bye ." << endl;
	cout << "max = " << max << " , min = " << min << " , avg = " << avg << endl;
	cout << "Bye ." << endl;
	fout.close();
	cin.clear();
	while(cin.get() != '\n')
	{
		continue;
	}
	return 0;
}

//compx.h
#ifndef COMPX_H_
#define COMPX_H_

#include<iostream>
using namespace std;
class Compx
{
private:
	double real;
	double image;
public:
	Compx();
	Compx(double r, double i);
	~Compx();
	
	Compx operator+(const Compx &c);
	Compx operator-(const Compx &c);
	Compx operator*(const Compx &c);
 	Compx operator~()const;
	friend ostream & operator<<(ostream &os, const Compx &c);
	friend istream & operator>>(istream &is, Compx &c);
};

#endif
//compx.cpp
#include<iostream>
#include"compx.h"


Compx::Compx()
{
	real = image = 0;
}

Compx::Compx(double r, double i)
{
	real = r;
	image = i;
}

Compx::~Compx()
{
	
}

Compx Compx::operator+(const Compx &c)
{
	return Compx(real + c.real, image + c.image);
}

Compx Compx::operator-(const Compx &c)
{
	return Compx(real - c.real, image - c.image);
}


Compx Compx::operator*(const Compx &c)
{
	return Compx(real*c.real - image*c.image, real*c.image + image*c.real);
}

Compx Compx::operator ~()const
{
	
	return Compx(real, -image);
}

ostream & operator<<(ostream &os, const Compx &c)
{
	os << "(" << c.real << " , " <<  c.image << "i )";
	return os;
}

istream & operator>>(istream &is, Compx &c)
{
	std::cout << "\nReal : ";
	if(is >> c.real)
	{
		std::cout << "Image : ";
		is >> c.image;
	}
	return is;
}

//main.cpp
#include<iostream>
#include"compx.h"

using namespace std;

int main()
{
	Compx a(3.0, 4.0);
	Compx c;
	cout << "Enter a complex number :(q or Q to quit): ";
	while(cin >> c)
	{
		cout << "c is : " << c << endl;
		cout << "c's comjudate is : " << ~c << endl;
		cout << "a + c is : " << a + c << endl;
		cout << "a - c is : " << a - c << endl;
		cout << "a * c is : " << a*c << endl;
		a = Compx(2.0, 0.0);
		cout << "2 * c is : " << a*c << endl;
		cout << "ente a new complex number(q/Q to quit):";
	} 
	return 0;
}

Practice makes perfect!

猜你喜欢

转载自blog.csdn.net/qq_37172182/article/details/84393125