———————————————————————————————————————————————————
该题之前有bug,不知道是当时复制错了还是怎么样,现已修改。如下:
mvector.h
#ifndef mVector_H_
#define mVector_H_
#include <iostream>
#include <cmath>
using namespace std;
static const double Rad_to_deg=45.0/atan(1.0);
class mVector
{
public:
enum Mode{RECT,POL};
private:
double x;
double y;
double mag;
double ang;
Mode mode;
void set_mag(){
mag=sqrt(x*x+y*y);
};
void set_ang(){
if(x==0.0&&y==0.0)
ang=0.0;
else
ang=atan2(y,x);
};
void set_x(){
x=mag*cos(ang);
};
void set_y(){
y=mag*sin(ang);
};
//from here
//static const double Rad_to_deg=45.0/atan(1.0);
public:
mVector(){
x=y=mag=ang=0.0;
mode=RECT;
};
mVector(double n1,double n2,Mode form=RECT){
mode=form;
if(form==RECT)
{
x=n1;
y=n2;
set_mag();
set_ang();
}
else if(form==POL)
{
mag=n1;
ang=n2;
set_x();
set_y();
}
else
{
cout<<"Incorrect 3rd argument to mVector()--";
cout<<"mVector set to 0\n";
x=y=mag=0.0;
mode=RECT;
}
};
~mVector(){
};
void reset(double n1,double n2,Mode form=RECT){
mode=form;
if(form==RECT)
{
x=n1;
y=n2;
set_mag();
set_ang();
}
else if(form==POL)
{
mag=n1;
ang=n2;
set_x();
set_y();
}
else
{
cout<<"Incorrect 3rd argument to mVector()--";
cout<<"mVector set to 0\n";
x=y=mag=0.0;
mode=RECT;
}
};
double xval()const{return x;};
double yval()const{return y;};
double magval()const {return mag;};
double angval()const {return ang;};
void polar_mode(){
mode=POL;
};
void rect_mode(){
mode=RECT;
};
mVector operator+(const mVector &b)const{
return mVector(x+b.x,y+b.y);
};
mVector operator-(const mVector &b)const{
return mVector(x-b.x,y-b.y);
};
mVector operator-()const{
return mVector(-x,-y);
};
mVector operator*(double n)const{
return mVector(n*x,n*y);
};
void show(ofstream &os){
//ofstream os;
if(mode==mVector::RECT)//必须用Vector::
os<<"(x,y)=("<<x<<","<<y<<")";
else if(mode==mVector::POL)
os<<"(m,a)=("<<mag<<","<<ang<<")";
}; //add it
friend mVector operator*(double n,const mVector &b){
return b*n;
};
//friend ostream & operator<<(ostream &os,const mVector &v);
friend ofstream & operator<<(ofstream &fs,const mVector &v){//写到文件
if(v.mode==mVector::RECT)//必须用Vector::
fs<<"(x,y)=("<<v.x<<","<<v.y<<")";
else if(v.mode==mVector::POL)
{
fs<<"(m,a)=("<<v.mag<<","<<v.ang*Rad_to_deg<<")";
}
else
fs<<"mVector object mode is invalid!";
return fs;
}
};
#endif
m.cpp
#include <iostream>
#include <fstream>
#include <cstdio>
#include <cstdlib>
#include <ctime>
//#include <mVector>
#include "mvector.h"
using namespace std;
int main(int argc,char **argv)
{
ofstream fin;
fin.open("111.txt");//打开文件
if(fin.fail())
cout<<"open fali!"<<endl;
//else
//cout<<"Sucess!"<<endl;
//fin<<"111";
srand(time(0));
double direction;
mVector step;
mVector result(0.0,0.0);
unsigned long steps=0;
double target;//要走的距离
double dstep;//每一步的距离
cout<<"Enter target step length:(q to quit:)";
while(cin>>target)
{
cout<<"Enter dstep length:";
if(!(cin>>dstep))
break;
int i=0; //上面的少了这个
while(result.magval()<target)
{
fin<<"\n"<<i++<<" ";
result.show(fin);//2
direction=rand()%360;
step.reset(dstep,direction,mVector::mVector::POL);
result=result+step;
steps++;
}
cout<<endl<<"After "<<steps<<" steps ,the subject "
<<" has the following location:"<<endl;
fin<<"After "<<steps<<" steps ,the subject "
<<" has the following location:"<<endl;
fin<<result;
result.polar_mode();
//cout<<" or \n"<<result<<endl;
fin<<" or \n";
fin<<result<<endl;
cout<<"Average outward distance per step="
<<result.magval()/steps<<endl;
fin<<"Average outward distance per step="
<<result.magval()/steps<<endl;
steps=0;
result.reset(0.0,0.0);
cout<<"Enter target distance (q to quit):";
}
fin<<"Bye!\n";
cin.clear();
while(cin.get()!='\n')
continue;
//cin.get();
fin.close();
}
运行结果:
111.txt的内容:
0 (x,y)=(0,0)
1 (x,y)=(4.81299,1.35467)
2 (x,y)=(1.41287,5.02063)
3 (x,y)=(-3.42338,6.28974)
4 (x,y)=(-2.09017,11.1087)
5 (x,y)=(-4.09009,6.52611)
6 (x,y)=(0.221501,3.99428)
7 (x,y)=(4.72083,6.17511)
8 (x,y)=(9.25807,8.27594)
9 (x,y)=(5.92338,12.0015)
10 (x,y)=(6.21089,7.00978)
11 (x,y)=(3.65988,11.3101)
12 (x,y)=(-0.629139,13.8799)
13 (x,y)=(-4.3101,10.4961)
14 (x,y)=(-2.6812,15.2233)
15 (x,y)=(1.81814,17.4041)
16 (x,y)=(5.75671,14.3239)
17 (x,y)=(7.59331,9.67346)
18 (x,y)=(12.5651,10.2035)
19 (x,y)=(7.6596,9.23618)
20 (x,y)=(5.03286,13.4906)
21 (x,y)=(4.30536,18.4374)
22 (x,y)=(7.47196,22.3069)After 23 steps ,the subject has the following location:
(x,y)=(12.3501,23.4041) or
(m,a)=(26.4628,62.1799)
Average outward distance per step=1.15055
Bye!
截图:
感谢网友的指出。
谢谢!
//写的错误或者不好的地方请多多指导,可以在下面留言或者点击左上方邮件地址给我发邮件,指出我的错误以及不足,以便我修改,更好的分享给大家,谢谢。
转载请注明出处:http://blog.csdn.net/qq844352155
author:天下无双
Email:coderguang@gmail.com
2014-9-22
于GDUT
——————————————————————————————————————————————————————————————————
下面的是错误的,仅做保留,请勿参考!
———————————————————————————————————————————————————
vector.h
<span style="font-size:18px;">#ifndef VECTOR_H_
#define VECTOR_H_
#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);
~Vector();
void reset(double n1,double n2,Mode form=RECT);
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 &b);
//friend ostream & operator<<(ostream &os,const Vector &v);
friend ofstream & operator<<(ofstream &fs,const Vector &v);//写到文件
};
}
#endif </span>
vector.h
<span style="font-size:18px;">/*我去啊,我不过是为了简单一点直接写在h文件里面,用不用这么多错误啊*/
#include <iostream>
#include <cmath>
#include "vector.h"
#include <fstream>
using std::cout;
using std::sin;
using std::sqrt;
using std::cos;
using std::atan;
using std::atan2;
using namespace VECTOR;
namespace VECTOR{
const double Rad_to_deg=45.0/atan(1.0);
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(form==RECT)
{
x=n1;
y=n2;
set_mag();
set_ang();
}
else if(form==POL)
{
mag=n1;
ang=n2;
set_x();
set_y();
}
else
{
cout<<"Incorrect 3rd argument to Vector()--";
cout<<"Vector set to 0\n";
x=y=mag=0.0;
mode=RECT;
}
};
Vector::~Vector(){};
void Vector::reset(double n1,double n2,Mode form)
{
mode=form;
if(form==RECT)
{
x=n1;
y=n2;
set_mag();
set_ang();
}
else if(form==POL)
{
mag=n1;
ang=n2;
set_x();
set_y();
}
else
{
cout<<"Incorrect 3rd argument to Vector()--";
cout<<"Vector set to 0\n";
x=y=mag=0.0;
mode=RECT;
}
};
/*
double Vector::xval()const{return x;};
double Vector::yval()const{return y;};
double Vector::magval()const {return mag;};
double Vector::angval()const {return ang;};
*/
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(n*x,n*y);
};
Vector operator*(double n,const Vector &b){
return b*n;
};
/*
std::ostream & operator<<(std::ostream &os,const Vector &v)
{
if(v.mode==Vector::RECT)//必须用Vector::
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;
}
*/
std::ofstream & operator<<(std::ofstream &fs,const Vector &v)
{
if(v.mode==Vector::RECT)//必须用Vector::
fs<<"(x,y)=("<<v.x<<","<<v.y<<")";
else if(v.mode==Vector::POL)
{
fs<<"(m,a)=("<<v.mag<<","<<v.ang*Rad_to_deg<<")";
}
else
fs<<"Vector object mode is invalid!";
return fs;
}<span style="font-family: Arial, Helvetica, sans-serif;"> void show(ofstream &os)</span>
<span style="white-space:pre"> </span>{
<span style="white-space:pre"> </span>//ofstream os;
<span style="white-space:pre"> </span>if(mode==Vector::RECT)//必须用Vector::
<span style="white-space:pre"> </span>os<<"(x,y)=("<<x<<","<<y<<")";
<span style="white-space:pre"> </span>else if(mode==Vector::POL)
<span style="white-space:pre"> </span>{
<span style="white-space:pre"> </span>os<<"(m,a)=("<<mag<<","<<ang<<")";
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>};</span>
}
</span>
main111.cpp
<span style="font-size:18px;">#include <iostream>
#include <fstream>
#include <cstdio>
#include <ctime>
//#include <vector>
#include "vector.h"
using namespace std;
using namespace VECTOR;
void main111()
{
ofstream fin;
fin.open("111.txt");//打开文件
if(fin.fail())
cout<<"open fali!"<<endl;
//else
//cout<<"Sucess!"<<endl;
//fin<<"111";
srand(time(0));
double direction;
Vector step;
Vector result(0.0,0.0);
unsigned long steps=0;
double target;//要走的距离
double dstep;//每一步的距离
cout<<"Enter step length:(q to quit:)";
while(cin>>target)
{
cout<<"Enter step length:";
if(!(cin>>dstep))
break;
while(result.magval()<target)
{</span>
<span style="font-size:18px;"><span style="white-space:pre"> fin<<"\n"<<i++<<" ";
<span style="white-space:pre"> </span>result.show(fin);//2</span>
direction=rand()%360;
step.reset(dstep,direction,Vector::POL);
result=result+step;
steps++;
}
cout<<"After "<<steps<<" steps ,the subject "
<<" has the following location:"<<endl;
fin<<"After "<<steps<<" steps ,the subject "
<<" has the following location:"<<endl;
fin<<result;
result.polar_mode();
//cout<<" or \n"<<result<<endl;
fin<<" or \n";
fin<<result<<endl;
cout<<"Average outward distance per step="
<<result.magval()/steps<<endl;
fin<<"Average outward distance per step="
<<result.magval()/steps<<endl;
steps=0;
result.reset(0.0,0.0);
cout<<"Enter target distance (q to quit):";
}
fin<<"Bye!\n";
cin.clear();
while(cin.get()!='\n')
continue;
//cin.get();
fin.close();
}</span>