问题:
解答:
main.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
#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
#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