您的位置:首页 > 编程语言 > C语言/C++

C++primer plus第六版课后编程练习答案11.1

2015-11-30 16:28 477 查看
头文件
#ifndef VECTOR_H_//避免头文件的重定义,如果XX没有被定义
#define VECTOR_H_//就定义XX,删除可使#ifndef与#endif之间的代码不执行

#include<iostream>

namespace VECTOR//用来区分名字相同的变量和函数
{
class Vector
{
public:
enum Mode{RECT,POL};//Mode枚举名,RECT=0,POL=1
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 form=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 std::ostream &operator<<(std::ostream &os,const Vector & v);
};
}

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

using namespace std;

namespace VECTOR
{
const double Rad_to_deg=45.0/atan(1.0);//atan(1)=45度,求1弧度等于多少度
void Vector::set_mag()
{
mag=sqrt(x*x+y*y);
}

void Vector::set_ang()
{
if(0==x&&y==0)
ang=0;
else
ang=atan2(y,x);
}

void Vector::set_x()
{
x=mag*sin(ang);
}

void Vector::set_y()
{
y=mag*cos(ang);
}

Vector::Vector()
{
x=y=mag=ang=0;
}

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<<"Incorrect 3rd arguement to Vector() --";
cout<<"vector set to 0\n";
x=y=mag=ang=0;
mode=RECT;
}
}

void Vector::reset(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<<"Incorrect 3rd arguement to Vector() --";
cout<<"vector set to 0\n";
x=y=mag=ang=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(n*x,n*y);
}

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;
}

}

#include<iostream>
#include<cstdlib>
#include<ctime>
#include "vector.h"
#include<fstream>
#include<windows.h>

using namespace std;

void main()
{
using VECTOR::Vector;
srand(time(0));
double direction;
Vector step;
Vector result(0,0);
unsigned long steps=0;
double target;
double dstep;
ofstream outfile;
outfile.open("1.txt");
cout<<"Enter target distance (q to quit):";
while(cin>>target)
{
cout<<"Enter step length:";
if(!(cin>>dstep))
break;

outfile<<"Target distance:"<<target<<" ,step size: "<<dstep<<endl;

outfile<<steps<<": "<<result<<endl;
while(result.magval()<target)
{
direction=rand()%360;
step.reset(dstep,direction,Vector::POL);
result=result+step;

steps++;
outfile<<steps<<": "<<result<<endl;
}
outfile<<"After "<<steps<<" steps,the subject has the following location:\n";
outfile<<result<<endl;
result.polar_mode();
outfile<<" or\n"<<result<<endl;
outfile<<"Average outward distance per step="<<result.magval()/steps<<endl;
steps=0;
result.reset(0,0);
cout<<"Enter target distance (q to quit):";
}

cout<<"Bye!\n";
WinExec( "notepad.exe 1.txt", SW_SHOW );//在c++代码中打开文件

cin.clear();
while(cin.get()!='\n')
continue;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: