C++ PRIMER PLUS(第5版)第十一章 编程练习

#pragma once
//vector.h
#ifndef VECTOR_H_
#define VECTOR_H_
#include<iostream>

namespace VECTOR {
	class Vector {
	public:
		enum Mode{RECT,POL};
	private:
		double x;
		double y;
		double mag;
		double ang;
		Mode mode;

		void set_mag();
		void set_ang();
		void set_x();
		void set_y();

	public:
		Vector();
		Vector(double n1, double n2, Mode form = RECT);
		void reset(double n1, double n2, Mode form = RECT);

		double xval()const { return x; }
		double yval()const { return y; }
		double magval()const { return mag; }
		double angval()const { return ang; }
		void polar_mode();
		void rect_mode();

		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);
		~Vector();

	};
}

#endif

//vector.cpp
#include "stdafx.h"
#include "vector.h"
#include<cmath>
using namespace std;

namespace VECTOR {
	const double Rad_to_deg = 45.0 / atan(1.0);
	void Vector::set_mag() {
		mag = sqrt(x*x + y*y);
	}
	void Vector::set_ang() {
		if (x == 0.0&&y == 0.0)
			ang = 0.0;
		else
			ang = atan2(y, x);
	}
	void Vector::set_x() {
		x = mag*cos(ang);
	}
	void Vector::set_y() {
		y = mag*sin(ang);
	}
	Vector::Vector() {
		x = y = mag = ang = 0.0;
		mode = RECT;
	}
	Vector::Vector(double n1, double n2, Mode form) {
		mode = form;
		if (mode == RECT) {
			x = n1;
			y = n2;
			set_mag();
			set_ang();
		}
		else if (form == POL) {
			mag = n1;
			ang = n2 / Rad_to_deg;
			set_x();
			set_y();
		}
		else {
			cout << "Incorrect 3rd argument to Vector() --";
			cout << "Vector set to 0\n";
			x = y = mag = ang = 0.0;
			mode = RECT;
		}
	}
	void Vector::reset(double n1, double n2, Mode form) {
		mode = form;
		if (mode == RECT) {
			x = n1;
			y = n2;
			set_mag();
			set_ang();
		}
		else if (form == POL) {
			mag = n1;
			ang = n2 / Rad_to_deg;
			set_x();
			set_y();
		}
		else {
			cout << "Incorrect 3rd argument to Vector() --";
			cout << "Vector set to 0\n";
			x = y = mag = ang = 0.0;
			mode = RECT;
		}
	}
	void Vector::polar_mode() {
		mode = POL;
	}
	void Vector::rect_mode() {
		mode = RECT;
	}
	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(n*x, n*y);
	}
	Vector operator*(double n, const Vector& a) {
		return a*n;
	}

	std::ostream& operator<<(std::ostream& os, const Vector& v) {
		if (v.mode == Vector::RECT)
			os << "(x, y) = (" << v.x << ", " << v.y << ")";
		else if (v.mode == Vector::POL)
			os << "(m, a) = (" << v.mag << ", " << v.ang*Rad_to_deg << ")";
		else
			os << "Vector object mode is invalid";
		return os;
	}
	Vector::~Vector(){}
}
// main.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "vector.h"
#include<iostream>
#include<ctime>
#include<fstream>

int main()
{
	using namespace std;
	using VECTOR::Vector;
	srand(time(0));
	double direction;
	Vector step;
	Vector result(0.0, 0.0);
	unsigned long steps = 0;
	double target;
	double dstep;
	ofstream file;
	file.open("history.txt");

	if (!file.is_open()) {
		cout << "Coudn't open the file!";
		exit(EXIT_FAILURE);
	}

	cout << "Enter target distance (q to quit): ";
	while (cin >> target) {
		cout << "Enter step length: ";
		if (!(cin >> dstep))
			break;
		//目标距离和步长写入文件
		file << "Target Distance: " << target << ", " << "Step Size: " << dstep << endl;
		while (result.magval() < target) {
			//每步过程写入文件
			file<<steps<<": (x, y) = (" << result.xval() << ", " << result.yval() << ")\n";
			direction = rand() % 360;
			step.reset(dstep, direction, Vector::POL);
			result = result + step;
			steps++;
		}
		//最后一步结果写入文件
		file<<steps<<": (x,y) = ("<<result.xval()<<", " << result.yval() << ")\n";
		file << "After " << steps << " steps, the subject has the following location:\n";
		file << "(x, y) = (" << result.xval() << ", " << result.yval() << ")" << "\nor\n";
		file << "(m, a) = (" << result.magval() << ", " << result.angval() << ")\n";
		file << "Average outward distance per step = " << result.magval() / steps << endl << endl;
	}
	cout << "Bye!\n";
	cin.clear();
	while (cin.get() != '\n')
		continue;
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值