矢量类例子

//*如果方法得到一个新的对象 考虑用构造函数去完成
ep:
vector Vector::operator + (const Vector & b) const
{
 return Vector(x+b.x,y+b.y); //返回一个构造函数实例
}


//*ctime
包含time()原型 time(0)当前时间


//*rand()通过初始种子活的随机数         srand()可以覆盖默认种子

///////////////////////////////////////
///////////////////mian.cpp////////////
#include <iostream>
#include <cstdlib>  //rand()  stand()
#include <ctime>
#include "vector.h"


int main(void)
{
 using namespace std;
 using VECTOR::Vector;
        srand(int(time(0)));  //seed random-num
 double direction;
 Vector step;
 Vector resault(0.0,0.0);
 unsigned long steps=0;
 double target;
 double dstep;
 cout<<"enter target distance(q to quit):";
 while(cin>>target)
 {
  cout<<"enter step length: ";
  if (!(cin>>dstep))
   break;
  while(resault.magval()<target)
  {
   direction=rand()%360;
   step.set(dstep,direction,'p');
   resault=resault+step;
   steps++;
  }
  cout<<"after "<<steps<<" steps, the subject "
   "has the following location: \n";
  cout<<resault<<endl;
  resault.polar_mode();
  cout<<"or\n"<<resault<<endl;
  cout<<"average outward distance per step= "
   <<resault.magval()/steps<<endl;
  steps=0;
  resault.set(0.0,0.0);
  cout<<"enter target distance (q to quit): ";
 }
 cout<<"bye!\n";
 
 return 0;

}
///////////////////////////////////////////
///////////////vector.h/////////////////////
#ifndef VECTOR_H_
#define VECTOR_H_

#include <iostream>

namespace VECTOR
{
 class Vector
 {
 private:
  double x;
  double y;
  double mag;
  double ang;
  char mode;
  //for seting val
  void set_mag();
  void set_ang();
  void set_x();
  void set_y();
 public:
  Vector();
                Vector(double n1,double n2,char form='r');
  void set(double n1,double n2,char form='r');
  ~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();
  //operatir
  Vector operator+(const Vector & b) const;
        Vector operator-(const Vector & b) const;
  Vector operator-() const;
  Vector operator*(double n) const;
  //friend
  friend Vector operator * (double n,const Vector & a);
                friend std::ostream & operator << (std::ostream & os,const Vector & v);
 };
}

#endif
///////////////////////////////////////////////////
////////////////////vector.cpp/////////////////////
#include <cmath>
#include "vector.h"

#define Rad_to_deg 2.36


namespace VECTOR
{
 

//for seting val
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='r';
}

Vector::Vector(double n1,double n2,char form)
{
 mode=form;
 if (form=='r')
 {
  x=n1;
  y=n2;
  set_mag();
  set_ang();
 }
 else if (form=='p')
 {
        mag=n1;
  ang=n2/Rad_to_deg;
  set_x();
  set_y();
 }
 else
 {
  std::cout<<"incorrect 3rd argument to Vector()--";
  std::cout<<"Vector set to 0\n";
  x=y=mag=ang=0.0;
  mode='r';
 }

}

void Vector::set(double n1,double n2,char form)
{
 mode=form;
 if (form=='r')
 {
  x=n1;
  y=n2;
  set_mag();
  set_ang();
 }
 else if (form=='p')
 {
  mag=n1;
  ang=n2/Rad_to_deg;
  set_x();
  set_y();
 }
 else
 {
  std::cout<<"incorrect 3rd argument to Vector()--";
  std::cout<<"Vector set to 0\n";
  x=y=mag=ang=0.0;
  mode='r';
 }
}

Vector::~Vector()
{

}

void Vector::polar_mode()
{
 mode='p';
}

void Vector::rect_mode()
{
 mode='r';
}

//operatir
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(n*x,n*y);
}
  //friend
Vector operator * (double n,const Vector & a)
{
 return a*n;
}

std::ostream & operator << (std::ostream & os,const Vector & v)
{
 if (v.mode=='r')
  os<<"(x,y)=("<<v.x<<","<<v.y<<")";
 else if (v.mode=='p')
 {
  os<<"(m,a)=("<<v.mag<<","<<v.ang*Rad_to_deg<<")";
 }
 else
  os<<"Vector object mode is invalid";
 return os;
}
 
}

posted @ 2007-02-18 21:23  Edward Xie  阅读(425)  评论(0编辑  收藏  举报