//vect.h
#ifndef VECT_H_
#define VECT_H_
#include<cmath>
#include<iostream>
namespace VECTOR
{
class Vector
{
private:
double x;
double y;
char mode;
void set_x(double r, double theta);
void set_y(double r, double theta);
public:
Vector();
Vector(double x1, double y1, char form = 'r');
void reset(double x1, double y1, char form = 'r');
~Vector();
void polar();
void rect();
double x_val()const {return x;}
double y_val()const {return y;}
double r_val()const {return sqrt(x * x + y * y);}
double theta_val()const
{
if(x == 0.0 && y == 0.0)
{
return 0.0;
}
else
{
return atan2(y,x);
}
}
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);
};
}
#endif
//vect.cpp
#include<cmath>
#include"vect.h"
using namespace std;
namespace VECTOR
{
const double unit_rad = 45.0 / atan(1.0);
void Vector::set_x(double r, double theta)
{
x = r*cos(theta);
}
void Vector::set_y(double r, double theta)
{
y = r*sin(theta);
}
Vector::Vector()
{
x = y = 0;
mode = 'r';
}
Vector::Vector(double x1, double y1, char form)
{
mode = form;
if(mode == 'r')
{
x = x1;
y = y1;
}
else if(mode == 'p')
{
set_x(x1, y1);
set_y(x1, y1);
}
else
{
cout << "Wrong type mode. Set vector = 0" << endl;
x = y = 0;
mode = 'r';
}
}
void Vector::reset(double x1, double y1, char form)
{
mode = form;
if(mode == 'r')
{
x = x1;
y = y1;
}
else if(mode == 'p')
{
set_x(x1, y1);
set_y(x1, y1);
}
else
{
cout << "Wrong type mode. Set vector = 0" << endl;
x = y = 0;
mode = 'r';
}
}
Vector::~Vector()
{
}
void Vector::polar()
{
mode = 'p';
}
void Vector::rect()
{
mode = 'r';
}
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(x*n, y*n);
}
Vector operator*(double n, const Vector &v)
{
return Vector(n*v);
}
std::ostream & operator<<(std::ostream &os, const Vector &v)
{
if(v.mode == 'r')
{
os << "Rectangle System : (x, y) = " << "( " << v.x << " , " << v.y <<" )";
}
else if(v.mode == 'p')
{
os << "Polar System : (r, theta) = " << "(" << v.r_val() << " , " << v.theta_val()*unit_rad << " )";
}
else
{
os << "I can't recognize the system, Please check your system mode . ";
}
return os;
}
}
//main.cpp
#include<iostream>
#include<fstream>
#include<cstdlib> //include rand() / srand() prototype
#include<ctime> //include time() prototype
#include"vect.h"
int main()
{
using namespace std;
using VECTOR::Vector;
ofstream fout;
fout.open("record.txt");
Vector result(0.0, 0.0);
Vector step;
unsigned long steps = 0;
double direction;
double target;
double dstep;
int N;
unsigned long max = 0;
unsigned long min = 100;
double avg;
srand(time(0));
cout << "Enter N times to test:";
cin >> N;
for(int i = 0; i < N; ++i)
{
cout << "Enter the target diatance (q or Q to quit) : ";
cin >> target;
cout << "Enter the step length: ";
if(!(cin >> dstep))
{
break;
}
fout << "Target distance : " << target << " , and step length : " << dstep << endl;
while(result.r_val() < target)
{
direction = rand() % 360;
step.reset(dstep, direction, 'p');
result = result + step;
fout << steps << "# location :" << result << endl;
steps++;
}
max = (max < steps) ? steps : max;
min = (min > steps) ? steps : min;
avg += steps;
result.polar();
steps = 0;
result.reset(0.0, 0.0);
}
avg /= N;
cout << "max = " << max << " , min = " << min << " , avg = " << avg << endl;
cout << "Bye ." << endl;
cout << "max = " << max << " , min = " << min << " , avg = " << avg << endl;
cout << "Bye ." << endl;
fout.close();
cin.clear();
while(cin.get() != '\n')
{
continue;
}
return 0;
}
//compx.h
#ifndef COMPX_H_
#define COMPX_H_
#include<iostream>
using namespace std;
class Compx
{
private:
double real;
double image;
public:
Compx();
Compx(double r, double i);
~Compx();
Compx operator+(const Compx &c);
Compx operator-(const Compx &c);
Compx operator*(const Compx &c);
Compx operator~()const;
friend ostream & operator<<(ostream &os, const Compx &c);
friend istream & operator>>(istream &is, Compx &c);
};
#endif
//compx.cpp
#include<iostream>
#include"compx.h"
Compx::Compx()
{
real = image = 0;
}
Compx::Compx(double r, double i)
{
real = r;
image = i;
}
Compx::~Compx()
{
}
Compx Compx::operator+(const Compx &c)
{
return Compx(real + c.real, image + c.image);
}
Compx Compx::operator-(const Compx &c)
{
return Compx(real - c.real, image - c.image);
}
Compx Compx::operator*(const Compx &c)
{
return Compx(real*c.real - image*c.image, real*c.image + image*c.real);
}
Compx Compx::operator ~()const
{
return Compx(real, -image);
}
ostream & operator<<(ostream &os, const Compx &c)
{
os << "(" << c.real << " , " << c.image << "i )";
return os;
}
istream & operator>>(istream &is, Compx &c)
{
std::cout << "\nReal : ";
if(is >> c.real)
{
std::cout << "Image : ";
is >> c.image;
}
return is;
}
//main.cpp
#include<iostream>
#include"compx.h"
using namespace std;
int main()
{
Compx a(3.0, 4.0);
Compx c;
cout << "Enter a complex number :(q or Q to quit): ";
while(cin >> c)
{
cout << "c is : " << c << endl;
cout << "c's comjudate is : " << ~c << endl;
cout << "a + c is : " << a + c << endl;
cout << "a - c is : " << a - c << endl;
cout << "a * c is : " << a*c << endl;
a = Compx(2.0, 0.0);
cout << "2 * c is : " << a*c << endl;
cout << "ente a new complex number(q/Q to quit):";
}
return 0;
}
Practice makes perfect!