⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sao3c.cpp

📁 一个包含若干个类
💻 CPP
字号:

// Definitions of class(es) in sao3c.h

#include "sao3c.h"

// class Time

Time::Time(int hour_in, int minute_in, int second_in)
{
    setTime(hour_in, minute_in, second_in);
}

Time::Time(const Time &time_in)
{
    *this = time_in;
}

void Time::setTime(int hour_in, int minute_in, int second_in)
{
    hour = (hour_in >= 0 && hour_in < 24) ? hour_in : 0;
    minute = (minute_in >= 0 && minute_in < 60) ? minute_in : 0;
    second = (second_in >= 0 && second_in < 60) ? second_in : 0;
}

Time &Time::incHour(int num)
{
    if(num > 0)
        hour = (hour + num) % 24;
    return *this;
}

Time &Time::incMinute(int num)
{
    if(num > 0){
        incHour((minute + num) / 60);
        minute = (minute + num) % 60;
    }
    return *this;
}

Time &Time::incSecond(int num)
{
    if(num > 0){
        incMinute((second + num) / 60);
        second = (second + num) % 60;
    }
    return *this;
}

Time &Time::decHour()
{
    hour = (hour + 23) % 24;
    return *this;
}

Time &Time::decMinute()
{
    minute = (minute + 59) % 60;
    if(minute == 59)
        decHour();
    return *this;
}

Time &Time::decSecond()
{
    second = (second + 59) % 60;
    if(second == 59)
        incMinute();
    return *this;
}

int Time::Hour() const
{
    return hour;
}

int Time::Minute() const
{
    return minute;
}

int Time::Second() const
{
    return second;
}

bool Time::operator==(const Time &time) const
{
    return (hour == time.hour && minute == time.minute && second == time.second);
}

bool Time::operator!=(const Time &time) const
{
    return (hour != time.hour || minute != time.minute || second != time.second);
}

// class Time friend(s)

ostream &operator<<(ostream &cout, const Time &time)
{
    return cout << (time.hour < 10 ? "0" : "") << time.hour
        << (time.minute < 10 ? ":0" : ":") << time.minute
        << (time.second < 10 ? ":0" : ":") << time.second;
}

// class Date

const int Date::days[] = {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

Date::Date(int year_in, int month_in, int day_in)
{
    setDate(year_in, month_in, day_in);
}

Date::Date(const Date &date_in)
{
    *this = date_in;
}

void Date::setDate(int year_in, int month_in, int day_in)
{
    year = (year_in != 0) ? year_in : 1;
    month = (month_in > 0 && month_in <= 12) ? month_in : 1;
    day = (day_in > 0 && day_in <= endofmonth()) ? day_in : 1;
}

Date &Date::incYear(int num)
{
    if(num > 0){
        if(year < 0 && year + num >= 0)
            year += num + 1;
        else
            year += num;
    }
    return *this;
}

Date &Date::incMonth(int num)
{
    if(num > 0){
        incYear((month + num) / 12);
        month = (month + num) % 12;
        day = (day > endofmonth()) ? endofmonth() : day;
    }
    return *this;
}

Date &Date::incDay(int num)
{
    if(num > 0){
        num += day;
        while(num > endofmonth()){
            num -= endofmonth();
            incMonth();
        }
        day = num;
    }
    return *this;
}

inline int Date::Year() const
{
    return year;
}

inline int Date::Month() const
{
    return month;
}

inline int Date::Day() const
{
    return day;
}

bool Date::leapyear() const
{
    return (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0));
}

bool Date::leapyear(int year_in) const
{
    return (year_in % 4 == 0 && (year_in % 100 != 0 || year_in % 400 == 0));
}

int Date::endofmonth() const
{
    if(!leapyear() && month == 2)
        return 28;
    else
        return days[month];
}

bool Date::operator==(const Date &date) const
{
    return (year == date.year && month == date.month && day == date.day);
}

bool Date::operator!=(const Date &date) const
{
    return (year != date.year || month != date.month || day != date.day);
}

// class Date friend(s)

ostream &operator<<(ostream &cout, const Date &date)
{
    return cout << (date.year > 0 ? "": "B.C. ") << abs(date.year) << "-"
        << date.month << "-"
        << date.day;
}

// class Complex

Complex::Complex(double a_in, double b_in)
{
    setComplex(a_in, b_in);
}

Complex::Complex(const Complex &comp_in)
{
    *this = comp_in;
}

void Complex::setComplex(double a_in, double b_in)
{
    a = a_in;
    b = b_in;
}

double Complex::Real() const
{
    return a;
}

double Complex::Image() const
{
    return b;
}

double Complex::Modules() const
{
    return sqrt(a * a + b * b);
}

double Complex::Arg() const
{
    if(a == 0 && b == 0)
        return 0;
    else{
        return b >= 0 ? acos(a / Modules()) : 2 * PI - acos(a / Modules());
    }
}

bool Complex::operator==(const Complex &comp) const
{
    return (a == comp.a && b == comp.b);
}

bool Complex::operator!=(const Complex &comp) const
{
    return (a != comp.a || b != comp.b);
}

Complex Complex::operator+(const Complex &comp) const
{
    return Complex(a + comp.a, b + comp.b);
}

Complex Complex::operator-(const Complex &comp) const
{
    return Complex(a - comp.a, b - comp.b);
}

Complex Complex::operator*(const Complex &comp) const
{
    return Complex(a * comp.a - b * comp.b, a * comp.b + b * comp.a);
}

Complex Complex::operator/(const Complex &comp) const
{
    return Complex((a * comp.a + b * comp.b) / (comp.a * comp.a + comp.b * comp.b)
        , (b * comp.a - a * comp.b) / (comp.a * comp.a + comp.b * comp.b));
}

void Complex::operator+=(const Complex &comp)
{
    a += comp.a;
    b += comp.b;
}

void Complex::operator-=(const Complex &comp)
{
    a -= comp.a;
    b -= comp.b;
}

void Complex::operator*=(const Complex &comp)
{
    double ta = a;
    a = a * comp.a - b * comp.b;
    b = ta * comp.b + b * comp.a;
}

void Complex::operator/=(const Complex &comp)
{
    double ta = a;
    a = (a * comp.a + b * comp.b) / (comp.a * comp.a + comp.b * comp.b);
    b = (b * comp.a - ta * comp.b) / (comp.a * comp.a + comp.b * comp.b);
}

Complex Complex::operator+(double db) const
{
    return Complex(a + db, b);
}

Complex Complex::operator-(double db) const
{
    return Complex(a - db, b);
}

Complex Complex::operator*(double db) const
{
    return Complex(a * db, b * db);
}

Complex Complex::operator/(double db) const
{
    return Complex(a / db, b / db);
}

void Complex::operator+=(double db)
{
    a += db;
}

void Complex::operator-=(double db)
{
    a -= db;
}

void Complex::operator*=(double db)
{
    a *= db;
    b *= db;
}

void Complex::operator/=(double db)
{
    a /= db;
    b /= db;
}

// class Complex friend(s)

ostream &operator<<(ostream & cout, const Complex &comp)
{
    if(comp.a == 0 && comp.b == 0)
        return cout << 0;
    if(comp.a != 0) // output real part
        cout << comp.a;
    
    if(comp.b > 0 && comp.a != 0) // output '+' or '-'
        cout << "+";
    else if(comp.b < 0)
        cout << "-";
    
    if(comp.b != 0){
        if(abs(comp.b) != 1)
            cout << abs(comp.b);
        cout << "i";
    }
    
    return cout;
}

Complex operator+(double db, const Complex &comp)
{
    return Complex(db + comp.a, comp.b);
}

Complex operator-(double db, const Complex &comp)
{
    return Complex(db - comp.a, -comp.b);
}

Complex operator*(double db, const Complex &comp)
{
    return Complex(db * comp.a, db * comp.b);
}

Complex operator/(double db, const Complex &comp)
{
    return Complex((comp.a * db) / (comp.a * comp.a + comp.b * comp.b),
        - (comp.b * db) / (comp.a * comp.a + comp.b * comp.b));
}

// class Vector3D

Vector3D::Vector3D(const double x_in, const double y_in, const double z_in)
{
    setVector3D(x_in, y_in, z_in);
}

Vector3D::Vector3D(const Vector3D &vec_in)
{
    *this = vec_in;
}

void Vector3D::setVector3D(double x_in, double y_in, double z_in)
{
    x = x_in;
    y = y_in;
    z = z_in;
}

double Vector3D::X() const
{
    return x;
}

double Vector3D::Y() const
{
    return y;
}

double Vector3D::Z() const
{
    return z;
}

double Vector3D::Modules() const
{
    return sqrt(x * x + y * y + z * z);
}

bool Vector3D::operator==(const Vector3D &vec_in) const
{
    return x == vec_in.x && y == vec_in.y && z == vec_in.z;
}

bool Vector3D::operator!=(const Vector3D &vec_in) const
{
    return x != vec_in.x || y != vec_in.y || z != vec_in.z;
}

Vector3D Vector3D::operator+(const Vector3D &vec_in) const
{
    return Vector3D(x + vec_in.x, y + vec_in.y, z + vec_in.z);
}

Vector3D Vector3D::operator-(const Vector3D &vec_in) const
{
    return Vector3D(x - vec_in.x, y - vec_in.y, z - vec_in.z);
}

Vector3D Vector3D::operator*(const Vector3D &vec_in) const
{
    return Vector3D(y * vec_in.z - vec_in.y * z,
        z * vec_in.x - vec_in.z * x,
        x * vec_in.y - vec_in.x * y);
}

double Vector3D::operator%(const Vector3D &vec_in) const
{
    return x * vec_in.x + y * vec_in.y + z * vec_in.z;
}

void Vector3D::operator+=(const Vector3D &vec_in)
{
    x += vec_in.x;
    y += vec_in.y;
    z += vec_in.z;
}

void Vector3D::operator-=(const Vector3D &vec_in)
{
    x -= vec_in.x;
    y -= vec_in.y;
    z -= vec_in.z;
}

void Vector3D::operator*=(const Vector3D &vec_in)
{
    x = y * vec_in.z - vec_in.y * z;
    y = z * vec_in.x - vec_in.z * x;
    z = x * vec_in.y - vec_in.x * y;
}

Vector3D Vector3D::operator*(double db) const
{
    return Vector3D(x * db, y * db, z * db);
}

Vector3D Vector3D::operator/(double db) const
{
    return Vector3D(x / db, y / db, z / db);
}

void Vector3D::operator*=(double db)
{
    x *= db;
    y *= db;
    z *= db;
}

void Vector3D::operator/=(double db)
{
    x /= db;
    y /= db;
    z /= db;
}

// class Vector3D friend(s)

ostream &operator<<(ostream &cout, const Vector3D &vec_in)
{
    return cout << "(" << vec_in.x << ","
        << vec_in.y << ","
        << vec_in.z << ")";
}

Vector3D operator*(double db, const Vector3D &vec_in)
{
    return Vector3D(vec_in.x * db, vec_in.y * db, vec_in.z * db);
}

double MixP(const Vector3D &a, const Vector3D &b, const Vector3D &c)
{
    return (a * b) % c;
}

double Cosine(const Vector3D &a, const Vector3D &b)
{
    return (a % b) / a.Modules() / b.Modules();
}

// class Rational

Rational::Rational(long num_in, long de_in)
{
    setRational(num_in, de_in);
}

Rational::Rational(const Rational &rat_in)
{
    *this = rat_in;
}

void Rational::setRational(long num_in, long de_in)
{
    num = num_in;
    de = de_in != 0 ? de_in : 1;
    Reduct();
}

void Rational::Reduct()
{
    long temp = hcd(num, de);
    num /= temp;
    de /= temp;
}

long Rational::Numerator() const
{
    return num;
}

long Rational::Denominator() const
{
    return de;
}

double Rational::Value() const
{
    return (double)num / de;
}

bool Rational::operator==(const Rational &rat_in)
{
    return (num == rat_in.num && de == rat_in.de) || (num == 0 && rat_in.num == 0);
}

bool Rational::operator!=(const Rational &rat_in) const
{
    return (num != rat_in.num || de != rat_in.de) && (num != 0 || rat_in.num != 0);
}

Rational Rational::operator+(const Rational &rat_in) const
{
    return Rational(num * rat_in.de + rat_in.num * de, de * rat_in.de);
}

Rational Rational::operator-(const Rational &rat_in) const
{
    return Rational(num * rat_in.de - rat_in.num * de , de * rat_in.de);
}

Rational Rational::operator*(const Rational &rat_in) const
{
    return Rational(num * rat_in.num, de * rat_in.de);
}

Rational Rational::operator/(const Rational &rat_in) const
{
    return Rational(num * rat_in.de, de * rat_in.num);
}

void Rational::operator+=(const Rational &rat_in)
{
    num = num * rat_in.de + rat_in.num * de;
    de *= rat_in.de;
    Reduct();
}

void Rational::operator-=(const Rational &rat_in)
{
    num = num * rat_in.de - rat_in.num * de;
    de *= rat_in.de;
    Reduct();
}

void Rational::operator*=(const Rational &rat_in)
{
    num *= rat_in.num;
    de *= rat_in.de;
    Reduct();
}

void Rational::operator/=(const Rational &rat_in)
{
    num *= rat_in.de;
    de *= rat_in.num;
    Reduct();
}

Rational Rational::operator+(long l) const
{
    return Rational(num + l * de, de);
}

Rational Rational::operator-(long l) const
{
    return Rational(num - l * de, de);
}

Rational Rational::operator*(long l) const
{
    return Rational(num * l, de);
}

Rational Rational::operator/(long l) const
{
    return Rational(num, de * l);
}

void Rational::operator+=(long l)
{
    num += l * de;
}

void Rational::operator-=(long l)
{
    num -= l * de;
}

void Rational::operator*=(long l)
{
    num *= l;
    Reduct();
}

void Rational::operator/=(long l)
{
    de *= l;
    Reduct();
}

// class Rational friend(s)

ostream &operator<<(ostream &cout, const Rational &rat_in)
{
    return cout << rat_in.num << " / " << rat_in.de;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -