实验二_OOP_张文瑞_202213260018

发布时间 2023-10-23 08:45:21作者: 张文瑞

1、实验一

 程序源码:

#include <iostream>
#include<cmath>

class Complex {
    private:
        double real, imag;
    public:
        Complex(double r = 0, double i = 0) : real{r}, imag{i} {};
        Complex(const Complex &c) : real{c.real}, imag{c.imag} {};
        double get_real() const {return real;}
        double get_imag() const {return imag;}
        void add(const Complex &c) {
            real += c.get_real();
            imag += c.get_imag();
        }
        void show() {
            std::cout << real;
            if (imag > 0) std::cout << " + " << abs(imag) << 'i';
            if (imag < 0) std::cout << " - " << fabs(imag) << 'i';
        }
        void show() const {
            std::cout << real;
            if (imag > 0) std::cout << " + " << abs(imag) << 'i';
            if (imag < 0) std::cout << " - " << fabs(imag) << 'i';
        }
    public:
        friend Complex add(const Complex&, const Complex&);
        friend bool is_equal(const Complex&, const Complex&);
        friend double abs(const Complex&);
};
Complex add(const Complex &c1, const Complex &c2) {
    double r, i;
    r = c1.get_real() + c2.get_real();
    i = c1.get_imag() + c2.get_imag();
    Complex c(r, i);
    return c;
}
bool is_equal(const Complex &c1, const Complex &c2) {
    bool r, i;
    r = c1.get_real() == c2.get_real();
    i = c1.get_imag() == c2.get_imag();
    return r && i;
}
double abs(const Complex &c) {
    return sqrt(pow(c.get_real(), 2) + pow(c.get_imag(), 2));
}
View Code
#include <iostream>
#include <cmath>
#include "Complex.hpp"

// 复数类Complex: 测试
void test() {
    using namespace std;
    Complex c1(3, -4);
    const Complex c2(4.5);
    Complex c3(c1);
    cout << "c1 = ";
    c1.show();
    cout << endl;
    cout << "c2 = ";
    c2.show();
    cout << endl;
    cout << "c2.imag = " << c2.get_imag() << endl;
    cout << "c3 = ";
    c3.show();
    cout << endl;
    cout << "abs(c1) = ";
    cout << abs(c1) << endl;
    cout << boolalpha;
    cout << "c1 == c3 : " << is_equal(c1, c3) << endl;
    cout << "c1 == c2 : " << is_equal(c1, c2) << endl;
    Complex c4;
    c4 = add(c1, c2);
    cout << "c4 = c1 + c2 = ";
    c4.show();
    cout << endl;
    c1.add(c2);
    cout << "c1 += c2, " << "c1 = ";
    c1.show();
    cout << endl;
}

int main() {
    test();
}
View Code

运行截图:

 

 

1、实验二

 程序源码:

#include <iostream>
#include <string>
#include <limits>
class User {
    private:
        static int n;
    public:
        static void print_n();
    private:
        std::string name, password, email;
    public:
        User(
            std::string nm,
            std::string p = "111111",
            std::string e = "")
            : name{nm}, password{p}, email{e}
            {n += 1;};
        void set_email();
        void change_passwd();
        void print_info();
};
int User::n = 0;

void User::print_n() {
    std::cout << "there are " << n << " users.\n";
};

void User::set_email() {
    using namespace std;
    cout << "Enter emaill address: ";
    string e;
    cin >> e;
    cin.ignore((std::numeric_limits<streamsize>::max)(),'\n');
    cout << "emaill is set successfully...\n";
    email = e;
};

void User::change_passwd() {
    using namespace std;
    string o, n;
    for (int i = 0; i <= 3; i++) {
        if (i == 3) {
            cout << "Please try after a while. \n";
            break;
        }
        if (i == 0)
            cout << "Enter old password: ";
        else
            cout << "Please re-enter again: ";
        cin >> o;
        cin.ignore((std::numeric_limits<streamsize>::max)(),'\n');
        if (o != password) {
            cout << "password input error. ";
            continue;
        } else {
            cout << "Enter new passwd: ";
            cin >> n;
            cin.ignore((std::numeric_limits<streamsize>::max)(),'\n');
            password = n;
            cout << "new passwd is set successfully...\n";
            break;
        };
    };
};

void User::print_info() {
    using namespace std;
    cout << "name: \t" << name << endl;
    string s(password.size(),'*');
    cout << "password: \t" << s << endl;
    cout << "email: \t" << email << endl;
};
View Code
#include "User.hpp"
#include <iostream>
// 测试User类
void test() {
    using std::cout;
    using std::endl;
    cout << "testing 1......\n";
    User user1("Alice", "pw123456", "abc@gmail.com");
    user1.print_info();
    cout << endl
         << "testing 2......\n\n";
    User user2("Bob");
    user2.change_passwd();
    user2.set_email();
    user2.print_info();
    cout << endl;
    User::print_n();
}
int main() {
    test();
}
View Code

运行截图:

1、实验三

 程序源码:

 

//account.h
#ifndef __ACCOUNT_H__
#define __ACCOUNT_H__
class SavingsAccount {            //储蓄账户类
    private:
        int id;                    //帐号
        double balance;            //余额
        double rate;            //存款的年利率
        int lastDate;            //上次变更余额的时期
        double accumulation;    //余额按日累加之和
        static double total;    //所有帐户的总金额
        //记录一笔账,date为日期,amount为金额,desc为说明
        void record(int date, double amount);
        //获得到指定日期为止的存款金额按日累积值
        double accumulate(int date) const {
            return accumulation + balance * (date - lastDate);
        }
    public:
        //构造函数
        SavingsAccount(int date, int id, double rate);
        int getId() const {return id;}
        double getBalance() const {return balance;}
        double getRate() const {return rate;}
        static double getTotal() {return total;}
        void deposit(int date, double amount);        //存入现金
        void withdraw(int date, double amount);        //取出现金
        //结算利息,每年1月1日调用一次该函数
        void settle(int date);
        //显示账户信息
        void show() const;
};
#endif //__ACCOUNT _H__
View Code
//account.cpp
#include "account.h"
#include <cmath>
#include <iostream>
using namespace std;

double SavingsAccount::total = 0;
//SavingsAccount类相关成员函数的实现
SavingsAccount::SavingsAccount(int date, int id, double rate)
    : id(id), balance(0), rate(rate), lastDate (date), accumulation(0) {
    cout << date << "\t#" << id << " is created" << endl;
}
void SavingsAccount::record(int date, double amount) {
    accumulation = accumulate(date);
    lastDate = date;
    amount = floor(amount * 100 + 0.5) / 100;        //保留小数点后两位
    balance += amount;
    total += amount;
    cout << date << "\t#" << id << "\t" << amount << "\t" << balance << endl;
}
void SavingsAccount::deposit(int date, double amount) {
    record(date, amount);
}
void SavingsAccount::withdraw(int date, double amount) {
    if ( amount > getBalance())
        cout << "Error: not enough money" << endl;
    else
        record(date, - amount);
}
void SavingsAccount::settle(int date) {
    double interest = accumulate(date) * rate / 365;
//计算年息
    if (interest != 0)
        record(date, interest);
    accumulation = 0;
}
void SavingsAccount::show() const {
    cout << "#" << id << "\tBalance: " << balance;
}
View Code
//5_11.cpp
#include "account.h"
#include <iostream>
using namespace std;
int main() {
    //建立几个帐户
    SavingsAccount sa0(1, 21325302, 0.015);
    SavingsAccount sa1(1, 58320212, 0.015);
    //几笔账目
    sa0.deposit(5, 5000) ;
    sa1.deposit(25, 10000);
    sa0.deposit(45, 5500);
    sa1.withdraw(60, 4000);
    //开户后第90天到了银行的计息日,结算所有账户的年息
    sa0.settle(90);
    sa1.settle(90);
    //输出各个帐户信息
    sa0.show();cout << endl;
    sa1.show();cout << endl;
    cout << "Total:" << SavingsAccount::getTotal() << endl;
    return 0;
}
View Code

 

运行截图: