【C++ Primer Plus习题】11.3

问题:

解答:

main.cpp

cpp 复制代码
#include <iostream>
#include <cstdlib>
#include <ctime>
#include "vect.h"

using namespace std;
using namespace VECTOR;


int main()
{
	srand(time(0));
	double direction;
	Vector step;
	Vector result(0.0, 0.0);
	unsigned long steps = 0;
	double target;
	double dstep;
	int max = 0;
	int min = INT_MAX;
	int sum = 0;
	int count = 0;
	cout << "请输入实验次数:";
	cin >> count;
	for (int i = 0; i < count; i++)
	{
		cout << "请输入第"<<i+1<<"次实验目标距离(按q结束) :";
		cin >> target;
		cout << "请输入第" << i + 1 << "次实验步长: ";
		if (!(cin >> dstep))break;
		while (result.magval() < target)
		{
			direction = rand() % 360;
			step.reset(dstep, direction, Vector::POL);
			result = result + step;
			steps++;
		}
		sum += steps;
		if (max < steps)
		{
			max = steps;
		}
		if (min > steps)
		{
			min = steps;
		}
		cout << "经过 " << steps << " 步,这实验对象位置如下:" << endl;
		cout << result << endl;
		result.polar_mode();
		cout << " 或者\n" << result << endl;
		cout << "平均每外出一步的距离为:" << result.magval() / steps << endl;
		
		steps = 0;
		result.reset(0.0, 0.0);
	}

	cout << count << "次实验的平均步数为:" << sum / count << endl;
	cout << count << "次实验的最高步数为:" << max << endl;
	cout << count << "次实验的最低步数为:" << min << endl;
	cout << "Bye!" << endl;

	return 0;
}

vect.h

cpp 复制代码
#pragma once
#include <iostream>
using namespace std;

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 from = RECT);
		~Vector();
		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& b)const;
		Vector operator-(const Vector& b)const;
		Vector operator-()const;
		Vector operator*(double n)const;

		friend Vector operator*(double n, const Vector& a);
		friend ostream& operator<<(ostream& os, const Vector& v);
	};

}

vect.cpp

cpp 复制代码
#include "vect.h"
#include <cmath>

namespace VECTOR
{
	const double Rad_to_deg = 45.0 / atan(1.0);//45/(π/4)

	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 (mode == POL)
		{
			mag = n1;
			ang = n2 / Rad_to_deg;
			set_x();
			set_y();
		}
		else
		{
			cout << "错误!" << endl;
			x = y = mag = ang = 0.0;
			mode = RECT;
		}
	}
	void Vector::reset(double n1, double n2, Mode from)
	{
		mode = from;
		if (mode == RECT)
		{
			x = n1;
			y = n2;
			set_mag();
			set_ang();
		}
		else if (mode == POL)
		{
			mag = n1;
			ang = n2 / Rad_to_deg;
			set_x();
			set_y();
		}
		else
		{
			cout << "错误!" << endl;
			x = y = mag = ang = 0.0;
			mode = RECT;
		}
	}
	Vector::~Vector()
	{

	}

	void Vector::polar_mode()
	{
		mode = POL;
	}
	void Vector::rect_mode()
	{
		mode = RECT;
	}

	Vector Vector::operator+(const Vector& b)const
	{
		return Vector(x + b.x, y + b.y);
	}
	Vector Vector::operator-(const Vector& b)const
	{
		return Vector(x - b.x, y - b.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& a)
	{
		return a * n;
	}
	ostream& operator<<(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;
	}

}

运行结果:

考查点:

  • 最大最小平均值!

注意:

  • 当在循环中,不好赋值时

2024年9月5日16:11:53

相关推荐
EllinY3 分钟前
CF 231 E Cactus 题解(仙人掌图上找环)
c++·笔记·算法·深度优先·图论
爆炒的番茄4 分钟前
初识C++(二)
开发语言·c++·算法
probably1216 分钟前
软件测试中的白盒测试方法,包括其定义、主要技术、应用场景及优缺点。
笔记·学习
黄卷青灯777 分钟前
c++ vector类 和 eigen库 处理向量的区别 列出代码举例
开发语言·c++·vector·eigen
闲人编程11 分钟前
Python 实现 LM 算法(Levenberg-Marquardt)
开发语言·python·算法·优化·梯度下降·拟合·lm
深夜吞食12 分钟前
项目实现:云备份③(配置文件加载模块、数据管理模块的实现)
linux·c语言·c++·json
cwywsx13 分钟前
C++:二叉搜索树
开发语言·c++·算法
神奇夜光杯21 分钟前
Python酷库之旅-第三方库Pandas(117)
开发语言·人工智能·python·excel·pandas·标准库及第三方库·学习与成长
小米里的大麦26 分钟前
【C++】深入理解作用域和命名空间:从基础到进阶详解
c++·笔记·作用域·命名空间
Lenyiin29 分钟前
3286、穿越网格图的安全路径
c++·算法·leetcode