【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

相关推荐
阿钱真强道7 分钟前
24 嵌入式操作系统 | 项目启动与环境准备(PyQt5 / Flask 两个“最小可跑“)
开发语言·qt·flask·架构设计·协议契约
霸道流氓气质10 分钟前
AI模型幻觉检测与抑制完全指南:从规则引擎到RAG对比的Java生产级实战
java·开发语言·人工智能
前端 贾公子14 分钟前
LangChain核心组件 == 提示词(Prompts)
开发语言·c#
niucloud-admin21 分钟前
JAVA V6 多商户商城 开发文档——手机端前端
java·开发语言·前端
茉莉玫瑰花茶25 分钟前
GO [ 并发 ]
开发语言·后端·golang
霸道流氓气质36 分钟前
Dify 可视化 LLM 应用开发平台完全指南:从Workflow编排到Java生产级集成实战
java·开发语言
垆边人似月.39 分钟前
华为机考题:二叉树的最大路径和
c语言·c++
辣知1 小时前
辣知·化智68 半仙隐士渭水钓的不是鱼
学习
2601_962218611 小时前
深入理解C++中的thread_local线程局部变量的应用
开发语言·c++
外收内放1 小时前
Python基础语法练习题(31-33)
开发语言·python