【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

相关推荐
Dream_Snowar32 分钟前
速通Python 第三节
开发语言·python
唐诺42 分钟前
几种广泛使用的 C++ 编译器
c++·编译器
南宫生1 小时前
力扣-图论-17【算法学习day.67】
java·学习·算法·leetcode·图论
高山我梦口香糖1 小时前
[react]searchParams转普通对象
开发语言·前端·javascript
sanguine__1 小时前
Web APIs学习 (操作DOM BOM)
学习
冷眼看人间恩怨2 小时前
【Qt笔记】QDockWidget控件详解
c++·笔记·qt·qdockwidget
信号处理学渣2 小时前
matlab画图,选择性显示legend标签
开发语言·matlab
红龙创客2 小时前
某狐畅游24校招-C++开发岗笔试(单选题)
开发语言·c++
Lenyiin2 小时前
第146场双周赛:统计符合条件长度为3的子数组数目、统计异或值为给定值的路径数目、判断网格图能否被切割成块、唯一中间众数子序列 Ⅰ
c++·算法·leetcode·周赛·lenyiin
jasmine s2 小时前
Pandas
开发语言·python