C++ Primer Plus第十一章练习

11.9.1
类和类定义直接使用📕上的 main添加个fstream头文件让他输出进文件里就行了
vector.h

#ifndef VECTOR_H_
#define VECTOR_H_
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <cmath>
#include <fstream>
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);
		void set_ang(void);
		void set_x(void);
		void set_y(void);
	public:
		Vector(void);
		Vector(double, double, Mode form = RECT);
		void reset(double, double, Mode form = RECT);
		~Vector(void);
		double xval(void) const { return x; }
		double yval(void) const { return y; }
		double magval(void) const { return mag; }
		double angval(void) const { return ang; }
		void polar_mode(void);
		void rect_mode(void);
		Vector operator+(const Vector&) const;
		Vector operator-(const Vector&) const;
		Vector operator-(void) const;
		Vector operator*(double) const;
		friend Vector operator*(double, const Vector &);
		friend ostream & operator<<(ostream &, const Vector &);
	};
}
#endif

vector.cpp

#include "vector.h"
namespace VECTOR
{
	const double Rad_to_deg = 45.0 / atan(1.0);
	void Vector::set_mag(void)
	{
		mag = sqrt(x * x + y * y);
	}
	void Vector::set_ang(void)
	{
		if (x == 0.0 && y == 0.0)
		{
			ang = 0.0;
		}
		else
		{
			ang = atan2(y, x);
		}
	}
	void Vector::set_x(void)
	{
		x = mag * cos(ang);
	}
	void Vector::set_y(void)
	{
		y = mag * sin(ang);
	}
	Vector::Vector(void)
	{
		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 / Rad_to_deg;
			set_x();
			set_y();
		}
		else
		{
			cout << "Incorrect 3rd argument to Vector(), vector set to 0\n";
			x = y = mag = ang = 0.0;
			mode = RECT;
		}
	}
	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 / Rad_to_deg;
			set_x();
			set_y();
		}
		else
		{
			cout << "Incorrect 3rd argument to Vector(), vector set to 0\n";
			x = y = mag = ang = 0.0;
			mode = RECT;
		}
	}
	Vector::~Vector(void) {}
	void Vector::polar_mode(void)
	{
		mode = POL;
	}
	void Vector::rect_mode(void)
	{
		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-(void) 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;
	}
}

main.cpp

#include "vector.h"
int main(void)
{
    using VECTOR::Vector;
    srand(time(NULL));
    double direvtion;
    Vector step;
    Vector result(0.0, 0.0);
    unsigned long steps = 0;
    double target;
    double dstep;
    ofstream out;
    out.open("Output.txt");
    cout << "Enter target distance (q to quit): ";
    while(cin >> target)
    {
        cout << "Enter step length: ";
        if(!(cin >> dstep))
            break;
        out << "Target Distance: " << target << ", Step Size: " << dstep << endl;
        out << steps << ": (x,y) = (0, 0)" << endl;
        while(result.magval() < target)
        {
            direvtion = rand() % 360;
            step.reset(dstep, direvtion, Vector::POL);
            result = result + step;
            steps++;
            out << steps << ": " << result << endl;
        }
        cout << "After " << steps << " steps, the subject "
             << "has the following location:\n";
        out << "After " << steps << " steps, the subject "
             << "has the following location:\n";
        cout << result << endl;
        out << result << endl;
        result.polar_mode();
        cout << " or\n" << result << endl;
        out << " or\n" << result << endl;
        cout << "Average outward distance per step = "
             << result.magval() / steps << endl;
        out << "Average outward distance per step = "
             << result.magval() / steps << endl;
        steps = 0;
        result.reset(0.0, 0.0);
        cout << "Enter target distance (q to quit): ";
    }
    cout << "Bye!\n";
    out.close();
    return 0;
}

11.9.2
vector.h

#ifndef VECTOR_H_
#define VECTOR_H_
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <cmath>
using namespace std;
namespace VECTOR
{
	class Vector
	{
	public:
		enum Mode { RECT, POL };
	private:
		double x;
		double y;
		Mode mode;
		void set_x(double, double);
		void set_y(double, double);
	public:
		Vector(void);
		Vector(double, double, Mode form = RECT);
		void reset(double, double, Mode form = RECT);
		~Vector(void);
		double xval(void) const { return x; }
		double yval(void) const { return y; }
		double magval(void) const;
		double angval(void) const;
		void polar_mode(void);
		void rect_mode(void);
		Vector operator+(const Vector&) const;
		Vector operator-(const Vector&) const;
		Vector operator-(void) const;
		Vector operator*(double) const;
		friend Vector operator*(double, const Vector &);
		friend ostream & operator<<(ostream &, const Vector &);
	};
}
#endif

vector.cpp

#include "vector.h"
namespace VECTOR
{
	const double Rad_to_deg = 45.0 / atan(1.0);
    double Vector::magval(void) const
    {
        return sqrt(this->x * this->x + this->y * this->y);
    }
	double Vector::angval(void) const
    {
        double temp;
        if(this->x == 0.0 && this->y == 0.0)
            temp = 0.0;
        else
            temp = atan2(this->y, this->x);
        return temp;
    }
	void Vector::set_x(double mag, double ang)
	{
		x = mag * cos(ang);
	}
	void Vector::set_y(double mag, double ang)
	{
		y = mag * sin(ang);
	}
	Vector::Vector(void)
	{
		x = y = 0.0;
		mode = RECT;
	}
	Vector::Vector(double n1, double n2, Mode form)
	{
		mode = form;
		if (form == RECT)
		{
			x = n1;
			y = n2;
		}
		else if (form == POL)
		{
            double mag, ang;
			mag = n1;
			ang = n2 / Rad_to_deg;
			set_x(mag, ang);
			set_y(mag, ang);
		}
		else
		{
			cout << "Incorrect 3rd argument to Vector(), vector set to 0\n";
			x = y = 0.0;
			mode = RECT;
		}
	}
	void Vector::reset(double n1, double n2, Mode form)
	{
		mode = form;
		if (form == RECT)
		{
			x = n1;
			y = n2;
		}
		else if (form == POL)
		{
            double mag, ang;
			mag = n1;
			ang = n2 / Rad_to_deg;
			set_x(mag, ang);
			set_y(mag, ang);
		}
		else
		{
			cout << "Incorrect 3rd argument to Vector(), vector set to 0\n";
			x = y = 0.0;
			mode = RECT;
		}
	}
	Vector::~Vector(void) {}
	void Vector::polar_mode(void)
	{
		mode = POL;
	}
	void Vector::rect_mode(void)
	{
		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-(void) 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.magval() << ", " << v.angval() * Rad_to_deg << ")";
		}
		else
		{
			os << "Vector object mode is invalid";
		}
		return os;
	}
}

main.cpp

#include "vector.h"
int main(void)
{
    using VECTOR::Vector;
    srand(time(NULL));
    double direvtion;
    Vector step;
    Vector result(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(result.magval() < target)
        {
            direvtion = rand() % 360;
            step.reset(dstep, direvtion, Vector::POL);
            result = result + step;
            steps++;
        }
        cout << "After " << steps << " steps, the subject "
             << "has the following location:\n";
        cout << result << endl;
        result.polar_mode();
        cout << " or\n" << result << endl;
        cout << "Average outward distance per step = "
             << result.magval() / steps << endl;
        steps = 0;
        result.reset(0.0, 0.0);
        cout << "Enter target distance (q to quit): ";
    }
    cout << "Bye!\n";
    return 0;
}

11.9.3
vector类和定义和第一题一样
main.cpp

#include "vector.h"
int main(void)
{
    using VECTOR::Vector;
    srand(time(NULL));
    double direvtion;
    Vector step;
    Vector result(0.0, 0.0);
    unsigned long steps = 0;
    double target;
    double dstep;
    int count;
    cout << "You want to calculate how much of this: ";
    cin >> count;
    int arr[count];
    for(int i = 0; i < count; i++)
    {
        cout << "No." << i + 1 << " target: ";
        while(!(cin >> target))
        {
            cout << "No." << i + 1 << " target: ";
            cin.clear();
            while(cin.get() != '\n')
                continue;
        }
        cout << "No." << i + 1 << " dstep: ";
        while(!(cin >> dstep))
        {
            cout << "No." << i + 1 << " dstep: ";
            cin.clear();
            while(cin.get() != '\n')
                continue;
        }
        while(result.magval() < target)
        {
            direvtion = rand() % 360;
            step.reset(dstep, direvtion, Vector::POL);
            result = result + step;
            steps++;
        }
        arr[i] = steps;
        steps = 0;
        result.reset(0.0, 0.0);
    }
    int min = arr[0], max = arr[0], sum = 0;
    for(int i = 0; i < count; i++)
    {
        if(max < arr[i])
            max = arr[i];
        if(min > arr[i])
            min = arr[i];
        sum += arr[i];
    }
    cout << "max = " << max << endl;
    cout << "min = " << min << endl;
    cout << "average = " << sum / count << endl;
    cout << "Bye!\n";
    return 0;
}

11.9.4
偷个懒就只写声明定义了
time.h

friend Time operator+(const Time & t1, const Time & t2) const
{
	Time temp;
	temp.hour = t1.hour + t2.hour + (t1.minutes + t2.minutes) / 60;
	temp.minutes = (t1.minutes + t2.minutes) % 60;
	return temp;
}
friend Time operator-(const Time & t1, const Time & t2) const
{
	Time temp;
	int t1min = t1.hour * 60 + t1.minutes;
	int t2min = t2.hour * 60 + t2.minutes;
	temp.minutes = (t2min - t1min) % 60;
	temp.hour = (t2min - t1min) / 60;
	return temp;
}
friend Time operator*(const Time & t1, double n) const
{
	Time temp;
	long total = t1.hour * n * 60 + t1.minutes * n;
	temp.hour = total / 60;
	temp.minutes = total % 60;
	return temp;
}

11.9.5
Stortwt.h

#ifndef STONEWT_H
#define STONEWT_H
#include <iostream>
using namespace std;
class Stonewt
{
private:
    const static int ltos = 14;
    enum Mode { pstone, pint, pdouble };
    Mode mode;
    int Stone;
    double pds_left;
    double pounds;
public:
    Stonewt(double, Mode m = Stonewt::Mode::pstone);
    Stonewt(int, double, Mode m = Stonewt::Mode::pstone);
    Stonewt(void);
    void stone_m(void);
    void int_m(void);
    void double_m(void);
    Stonewt operator+(const Stonewt &);
    Stonewt operator-(const Stonewt &);
    Stonewt operator*(const Stonewt &);
    friend ostream & operator<<(ostream &, const Stonewt &);
};
#endif

Stortwt.cpp

#include "stonewt.h"
Stonewt::Stonewt(double lbs, Mode m)
{
    mode = m;
    Stone = int(lbs) / ltos;
    pds_left = int(lbs) % ltos + lbs - int(lbs);
    pounds = lbs;
}
Stonewt::Stonewt(int stn, double lbs, Mode m)
{
    mode = m;
    Stone = stn;
    pds_left = lbs;
    pounds = stn * ltos + lbs;
}
Stonewt::Stonewt(void)
{
    Stone = pounds = pds_left = 0;
    mode = pstone;
}
void Stonewt::stone_m(void)
{
    mode = pstone;
}
void Stonewt::int_m(void)
{
    mode = pint;
}
void Stonewt::double_m(void)
{
    mode = pdouble;
}
Stonewt Stonewt::operator+(const Stonewt & st)
{
    return Stonewt(this->pounds + st.pounds);
}
Stonewt Stonewt::operator-(const Stonewt & st)
{
    return Stonewt(this->pounds - st.pounds);
}
Stonewt Stonewt::operator*(const Stonewt & st)
{
    return Stonewt(this->pounds * st.pounds);
}
ostream & operator<<(ostream & out, const Stonewt & st)
{
    if(st.mode == Stonewt::Mode::pstone)
        out << "stone:" << st.Stone << ", pounds:" << st.pds_left << endl;
    else if(st.mode == Stonewt::Mode::pint)
        out << int(st.pounds) << endl;
    else
        out << st.pounds << endl;
    return out;
}

main.cpp

#include "stonewt.h"
int main(void)
{
    Stonewt a, b(5.5), c(2, 6.8);
    cout << a;
    b.double_m();
    cout << b;
    c.int_m();
    cout << c;
    cout << c + b;
    cout << c - b;
    cout << c * b;
    return 0;
}

11.9.6
stonewt.h

#ifndef STONEWT_H_
#define STONEWT_H_
#include <iostream>
using namespace std;
class Stonewt
{
private:
	enum { Lbs_per_stn = 14 };
	int stone;
	double pds_left;
	double pounds;
public:
	Stonewt(void);
	Stonewt(double);
	Stonewt(int, double);
	~Stonewt(void) {}
	void show_lbs(void) const;
	void show_stn(void) const;
	bool operator<(const Stonewt& st) const;
	bool operator<=(const Stonewt& st) const;
	bool operator>(const Stonewt& st) const;
	bool operator>=(const Stonewt& st) const;
	bool operator==(const Stonewt& st) const;
	bool operator!=(const Stonewt& st) const;
};
#endif

stonewt.cpp

#include "stonewt.h"
Stonewt::Stonewt(void)
{
	stone = pounds = pds_left = 0;
}
Stonewt::Stonewt(double lbs)
{
	stone = (int)lbs / Lbs_per_stn;
	pds_left = (int)lbs % Lbs_per_stn + lbs - (int)lbs;
	pounds = lbs;
}
Stonewt::Stonewt(int stn, double lbs)
{
	stone = stn;
	pds_left = lbs;
	pounds = (double)stn * Lbs_per_stn + lbs;
}
void Stonewt::show_stn(void) const
{
	std::cout << stone << " stone, " << pds_left << " pounds\n";
}
void Stonewt::show_lbs(void) const
{
	std::cout << pounds << " pounds\n";
}
bool Stonewt::operator<(const Stonewt& st) const
{
    return this->pounds < st.pounds;
}
bool Stonewt::operator<=(const Stonewt& st) const
{
    return this->pounds <= st.pounds;
}
bool Stonewt::operator>(const Stonewt& st) const
{
    return this->pounds > st.pounds;
}
bool Stonewt::operator>=(const Stonewt& st) const
{
    return this->pounds >= st.pounds;
}
bool Stonewt::operator==(const Stonewt& st) const
{
    return this->pounds == st.pounds;
}
bool Stonewt::operator!=(const Stonewt& st) const
{
    return this->pounds != st.pounds;
}

main.cpp

#include "stonewt.h"
int main(void)
{
    double temp;
    Stonewt st[6]{6.5, 8.2, {2, 7.5}};
    for(int i = 3; i < 6; i++)
    {
        cout << "请输入第" << i << "的数值: ";
        cin >> temp;
        st[i] = temp;
    }
    Stonewt test(11, 0), min = st[0], max = st[0];
    int count = 0;
    for(int i = 0; i < 6; i++)
    {
        if(max < st[i])
            max = st[i];
        if(min > st[i])
            min = st[i];
        if(st[i] >= test)
            count++;
    }
    cout << "max: " << endl;
    max.show_stn();
    cout << "min: " << endl;
    min.show_stn();
    cout << "大于等于11英石的有" << count << "个" << endl;
    return 0;
}

11.9.7
complex0.h

#ifndef COMPLEX_H
#define COMPLEX_H
#include <iostream>
using namespace std;
class complex
{
private:
    double realnum;
    double imaginnum;
public:
    complex(void);
    complex(double, double);
    complex operator+(const complex &);
    complex operator-(const complex &);
    complex operator*(const complex &);
    friend complex operator*(double, const complex &);
    friend ostream & operator<<(ostream &, const complex &);
    friend istream & operator>>(istream &, complex &);
    friend complex operator~(const complex &);
};
#endif

complex0.cpp

#include "complex0.h"
complex::complex(void)
{
    realnum = imaginnum = 0.0;
}
complex::complex(double n1, double n2)
{
    realnum = n1;
    imaginnum = n2;
}
complex complex::operator+(const complex & c)
{
    complex temp;
    temp.realnum = this->realnum + c.realnum;
    temp.imaginnum = this->imaginnum + c.imaginnum;
    return temp;
}
complex complex::operator-(const complex & c)
{
    complex temp;
    temp.realnum = this->realnum - c.realnum;
    temp.imaginnum = this->imaginnum - c.imaginnum;
    return temp;
}
complex complex::operator*(const complex & c)
{
    complex temp;
    temp.realnum = this->realnum * c.realnum - this->imaginnum * c.imaginnum;
    temp.imaginnum = this->realnum * c.imaginnum + this->imaginnum * c.realnum;
    return temp;
}
complex operator*(double n, const complex & c)
{
    complex temp;
    temp.realnum = n * c.realnum;
    temp.imaginnum = n * c.imaginnum;
    return temp;
}
ostream & operator<<(ostream & out, const complex & c)
{
    out << '(' << c.realnum << ", " << c.imaginnum << "i)";
    return out;
}
istream & operator>>(istream & in, complex & c)
{
    cout << "real: ";
    if(!(in >> c.realnum))
        return in;
    cout << "imaginary: ";
    in >> c.imaginnum;
    return in;
}
complex operator~(const complex & c)
{
    complex temp;
    temp.realnum = c.realnum;
    temp.imaginnum = -c.imaginnum;
    return temp;
}

main.cpp

#include "complex0.h"
int main(void)
{
    complex a(3.0, 4.0);
    complex c;
    cout << "Enter a complex number (q to quit): \n";
    while(cin >> c)
    {
        cout << "c is " << c << '\n';
        cout << "complex conjugate is " << ~c << '\n';
        cout << "a is " << a << '\n';
        cout << "a + c is " << a + c << '\n';
        cout << "a - c is " << a - c << '\n';
        cout << "a * c is " << a * c << '\n';
        cout << "2 * c is " << 2 * c << '\n';
        cout << "Enter a complex number (q to quit): \n";
    }
    cout << "Done!\n";
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值