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