C++primer plus第六版课后编程题答案11.2 绝世大坑

调了两小时友元函数过不了,重新建一个项目马上就行了

VS真坑!

vector112.h

#ifndef VECTOR112_H_
#define VECTOR112_H_
#include <iostream>
namespace VECTOR112
{
	//class Vector112;
	//std::ostream&operator<<(std::ostream &os,const Vector112 &v);

	class Vector112{
	public:
		enum Mode{RECT,POL};
	private:
		double x;
		double y;
		Mode mode;

		//void set_mag();
		//void set_ang();
		void set_x(double mag,double ang);//改成接收一个mag,然后设置x
		void set_y(double mag,double ang);
	public:
		Vector112();
		Vector112(double n1,double n2,Mode form=RECT);
		void reset(double n1,double n2,Mode form=RECT);
		~Vector112();
		double xval()const {return x;};
		double yval()const{return y;};
		double magval()const;//这里开始改了
		double angval()const;//必须用const限定,否则重载<<会出错
		void polar_mode();
		void rect_mode();

		Vector112 operator+(const Vector112 &b)const;
		Vector112 operator-(const Vector112 &b)const;
		Vector112 operator-()const;
		Vector112 operator*(double n)const;

		friend Vector112 operator*(double n,const Vector112 &v);
		//friend std::ostream&operator<<(std::ostream &os,const Vector112 &v);
		friend std::ostream & operator<<(std::ostream &os,const Vector112 &v);
	};
};
#endif

vector112.cpp

#include "vector112.h"
#include <cmath>
//using namespace std;
//using namespace VECTOR112;
using std::sqrt;
using std::sin;
using std::cos;
using std::atan;
using std::atan2;
using std::cout;

namespace VECTOR112{
	const double Rad_to_deg=45.0/atan(1.0);
	
	void Vector112::set_x(double mag,double ang)//改成接收mag,ang
	{
		x=mag*cos(ang);//设置x
	}
	void Vector112::set_y(double mag,double ang)
	{
		y=mag*sin(ang);
	}

	Vector112::Vector112()
	{
		x=y=0.0;
		mode=RECT;
	}
	Vector112::Vector112(double n1,double n2,Mode form)
	{
		mode=form;
		if(form==RECT)
		{
			x=n1;
			y=n2;
		}
		else if(form==POL)
		{
			set_x(n1,n2);
			set_y(n1,n2);
		}
		else
		{
			cout<<"Incorrect 3rd argument to Vector()--";
			cout<<"vector set to 0\n";
			x=y=0.0;
			mode=RECT;
		}
	
	}

	void Vector112::reset(double n1,double n2,Mode form)//重置值
	{
		mode=form;
		if(form==RECT)
		{
			x=n1;
			y=n2;
		}
		else if(form==POL)
		{
			set_x(n1,n2);
			set_y(n1,n2);
		}
		else
		{
			cout<<"Incorrect 3rd argument to Vector()--";
			cout<<"vector set to 0\n";
			x=y=0.0;
			mode=RECT;
		}
	
	}

	double Vector112::magval()const
	{
		return sqrt(x*x+y*y);//计算公式看书本的set_mag
	}
	double Vector112::angval()const//计算公式看书本的set_ang
	{
		if(x==0.0&&y==0.0)
			return 0.0;
		else
			return atan2(y,x);
	}

	void Vector112::polar_mode()
	{
		mode=POL;//直接将状态改了???
	}

	void Vector112::rect_mode()
	{
		mode=RECT;//x,y不变的啊!
	}
	
	Vector112::~Vector112()
	{};

	Vector112  Vector112::operator+(const Vector112 &v)const
	{
		return Vector112(x+v.x,y+v.y);	
	}
	Vector112  Vector112::operator-(const Vector112 &v)const
	{
		return Vector112(x-v.x,y-v.y);
	}

	Vector112  Vector112::operator-()const
	{
		return Vector112(-x,-y);
	}

	Vector112  Vector112::operator*(double n)const
	{
		return Vector112(x*n,y*n);
	}
	//friend methods

	Vector112 operator*(double n,const Vector112 &v)
	{
		return v*n;
	}
	//不知为何,在上一个项目里面编译这个友元函数总是报错
	//说无法访问v.mode中的mode,以及v.x中的x
	//可能是上个项目太多东西了,obj有点混
	std::ostream & operator<<(std::ostream &os,const Vector112 &v)
		{
			if(v.mode==Vector112::RECT)//必须用Vector::
				os<<"(x,y)=("<<v.x<<","<<v.y<<")";
			else if(v.mode==Vector112::POL)
			{
				os<<"(m,a)=("<<v.magval()<<","<<v.angval()*Rad_to_deg<<")";
			}
			else
				os<<"Vector object mode is invalid!";
			return os;
		}
};

main.cpp

#include <iostream>
#include <fstream>
#include <cstdio>
#include <ctime>
//#include <vector>
#include "vector112.h"
using namespace std;
using  namespace VECTOR112;
int main()
{
	ofstream fin;
	//fin.open("111.txt");//打开文件
	//if(fin.fail())
		//cout<<"open fali!"<<endl;
	//else 
		//cout<<"Sucess!"<<endl;
	//fin<<"111";
	srand(time(0));
	double direction;
	Vector112 step;
	Vector112 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;
		int i=0;
		while(result.magval()<target)
		{
			//fin<<i<<" (x,y)= "<<"(";//1
			//fin<<"the "<<i++<<" input is"<<endl;//test
			//fin<<"\n"<<i++<<"  ";
			//result.show(fin);//2
			//fin<<" "<<endl;//1+2+3
			direction=rand()%360;
			step.reset(dstep,direction,Vector112::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();
	cin.get();
	return 0;

}

不要喋喋不休地问为什么,因为有时候并不是弄错了,编译器也是个坑!


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值