随笔 - 6  文章 - 0  评论 - 0  阅读 - 54 

任务1: 

t.h

复制代码
#pragma once
#include <string>

class T {
public:
  T(int x = 0, int y = 0);  
  T(const T &t);  
  T(T &&t);   
  ~T();     
  void adjust(int ratio);   
  void display() const;   
   
private:
  int m1, m2;

public:
  static int get_cnt();  
   
public:
  static const std::string doc;   
  static const int max_cnt;   
  
private:
  static int cnt;     
  friend void func();
};

void func();
复制代码

t.cpp

复制代码
#include "t.h"
#include <iostream>
#include <string>
using std::cout;
using std::endl;
using std::string;

const std::string T::doc{"a simple class sample"};
const int T::max_cnt = 999;
int T::cnt = 0;

T::T(int x, int y): m1{x}, m2{y} {
  ++cnt;
  cout << "T constructor called.\n";
}

T::T(const T &t): m1{t.m1}, m2{t.m2} {
  ++cnt;
  cout << "T copy constructor called.\n";
}

T::T(T &&t): m1{t.m1}, m2{t.m2} {
  ++cnt;
  cout << "T move constructor called.\n";
}  

T::~T() {
  --cnt;
  cout << "T destructor called.\n";
}     

void T::adjust(int ratio) {
  m1 *= ratio;
  m2 *= ratio;
}  

void T::display() const {
  cout << "(" << m1 << ", " << m2 << ")" ;
}  

int T::get_cnt() {
 return cnt;
}

void func() {
  T t5(42);
  t5.m2 = 2049;
  cout << "t5 = "; t5.display(); cout << endl;
}
复制代码

task1.cpp

复制代码
#include "t.h"
#include <iostream>

using std::cout;
using std::endl;

void test();

int main() {
  test();
  cout << "\nmain: \n";
  cout << "T objects'current count: " << T::get_cnt() << endl;
}

void test() {
  cout << "test class T: \n";
  cout << "T info: " << T::doc << endl;
  cout << "T objects'max count: " << T::max_cnt << endl;
  cout << "T objects'current count: " << T::get_cnt() << endl << endl;
  T t1;
  cout << "t1 = "; t1.display(); cout << endl;
  T t2(3, 4);
  cout << "t2 = "; t2.display(); cout << endl;
  T t3(t2);
  t3.adjust(2);
  cout << "t3 = "; t3.display(); cout << endl;
  T t4(std::move(t2));
  cout << "t3 = "; t4.display(); cout << endl;
  cout << "T objects'current count: " << T::get_cnt() << endl;
  func();
}
复制代码

问题1:不能

问题2:

 默认构造函数:初始化对象的成员变量到默认状态。当创建对象没有提供任何初始化对象时被调用。

参数化构造函数:初始化对象的成员变量到特定状态。当创建对象提供特定参数时被调用。

拷贝构造函数:可以进行拷贝。当使用一个已存在的对象来初始化新对象时被调用。

移动构造函数:用于资源的转移,避免不必要的拷贝。当使用一个右值引用来初始化新对象时被调用。

析构函数:在对象的生命周期结束时被调用,释放对象占用的内存。

问题3:不能
任务2:

 Complex.h:

复制代码
#include <iostream>
#include <string>

class Complex {
public:
    static const std::string doc; 
    Complex(double real = 0.0, double imag = 0.0);
    Complex(const Complex& other);
    double get_real() const;
    double get_imag() const;
    void add(const Complex& other);
    friend Complex add(const Complex& c1, const Complex& c2);
    friend bool is_equal(const Complex& c1, const Complex& c2);
    friend bool is_not_equal(const Complex& c1, const Complex& c2);
    friend void output(const Complex& c);
    friend double abs(const Complex& c);
private:
    double real; 
    double imag; 
};
复制代码

Complex.cpp:

复制代码
#include "Complex.h"
#include <iostream>
#include <cmath>

const std::string Complex::doc = "a simplified complex class";

Complex::Complex(double real, double imag) : real(real), imag(imag) {}

Complex::Complex(const Complex& other) : real(other.real), imag(other.imag) {}

double Complex::get_real() const {
    return real;
}

double Complex::get_imag() const {
    return imag;
}

void Complex::add(const Complex& other) {
    real += other.real;
    imag += other.imag;
}

Complex add(const Complex& c1, const Complex& c2) {
    return Complex(c1.real + c2.real, c1.imag + c2.imag);
}

bool is_equal(const Complex& c1, const Complex& c2) {
    return (c1.real == c2.real) && (c1.imag == c2.imag);
}

bool is_not_equal(const Complex& c1, const Complex& c2) {
    return !is_equal(c1, c2);
}

void output(const Complex& c) {
    if(c.imag>=0){
        std::cout << c.real << "+" << c.imag << "i";
    }
    else{
        std::cout <<c.real << c.imag << "i";
    }
}

double abs(const Complex& c) {
    return std::sqrt(c.real * c.real + c.imag * c.imag);
}
复制代码

main.cpp:

复制代码
#include "Complex.h"
#include <iostream>
using std::cout;
using std::endl;
using std::boolalpha;

void output(const Complex& c);

void test() {
    cout << "类成员测试: " << endl;
    cout << Complex::doc << endl;
    cout << endl;
    cout << "Complex对象测试: " << endl;
    Complex c1;
    Complex c2(3, -4);
    const Complex c3(3.5);
    Complex c4(c3);
    cout << "c1 = "; output(c1); cout << endl;
    cout << "c2 = "; output(c2); cout << endl;
    cout << "c3 = "; output(c3); cout << endl;
    cout << "c4 = "; output(c4); cout << endl;
    cout << "c4.real = " << c4.get_real() << ", c4.imag = " << c4.get_imag() 
    << endl;
    cout << endl;
    cout << "复数运算测试: " << endl;
    cout << "abs(c2) = " << abs(c2) << endl;
    c1.add(c2);
    cout << "c1 += c2, c1 = "; output(c1); cout << endl;
    cout << boolalpha;
    cout << "c1 == c2 : " << is_equal(c1, c2) << endl;
    cout << "c1 != c3 : " << is_not_equal(c1, c3) << endl;
    c4 = add(c2, c3);
    cout << "c4 = c2 + c3, c4 = "; output(c4); cout << endl;
}

int main() {
    test();
    return 0;
}
复制代码

任务3:

复制代码
#include <iostream>
#include <complex>

using std::cout;
using std::endl;
using std::boolalpha;
using std::complex;

void test() {
  cout << "标准库模板类comple测试: " << endl;
  complex<double> c1;
  complex<double> c2(3, -4);
  const complex<double> c3(3.5);
  complex<double> c4(c3);

  cout << "c1 = " << c1 << endl;
  cout << "c2 = " << c2 << endl;
  cout << "c3 = " << c3 << endl;
  cout << "c4 = " << c4 << endl;
  cout << "c4.real = " << c4.real() << ", c4.imag = " << c4.imag() <<
endl;
  cout << endl;

  cout << "复数运算测试: " << endl;
  cout << "abs(c2) = " << abs(c2) << endl;
  c1 += c2;
  cout << "c1 += c2, c1 = " << c1 << endl;
  cout << boolalpha;
  cout << "c1 == c2 : " << (c1 == c2) << endl;
  cout << "c1 != c3 : " << (c1 != c3) << endl;
  c4 = c2 + c3;
  cout << "c4 = c2 + c3, c4 = " << c4 << endl;
  }

int main() {
  test();
}
复制代码

任务4:

Fraction.h

 

 

复制代码
#pragma once
#include <iostream>
class Fraction
{
private:
    int up, down;
public:
    Fraction(int x = 0, int y = 1);
    Fraction(const Fraction &p);
    ~Fraction();
    friend void output(const Fraction &p);
    friend Fraction add( Fraction p1,   Fraction p2);
    friend Fraction sub( Fraction p1,  Fraction p2);
    friend Fraction mul(const Fraction &p1, const Fraction &p2);
    friend Fraction div(const Fraction &p1, const Fraction &p2);
    int get_up();
    int get_down();
    Fraction negative();
    static std::string doc;
};
复制代码

Fraction.cpp:

复制代码
#include "Fraction.h"
#include <iostream>
#include <algorithm>
using namespace std;

int ogcd(int a, int b)
{
    if (a < b)
    {
        int c = b;
        b = a;
        a = c;
    }
    int r = a % b;
    while (r != 0)
    {
        a = b;
        b = r;
        r = a % b;
    }
    return b;
}
int igcd(int a, int b)
{
    int sum1 = ogcd(a, b);
    return (a / sum1) * (b / sum1) * sum1;
}
std::string Fraction::doc = "Fraction类 v 0.01版.\n目前仅支持分数对象的构造、输出、加/减/乘/除运算.";
Fraction::Fraction(int x, int y)  {
    up = x;
    down = y;
}
Fraction::Fraction(const Fraction& p) :up{ p.up }, down{ p.down } {}
Fraction::~Fraction() {}
void output(const Fraction& p)
{
    if (p.down == 0)
    {
        cout << "分母不能为0";
        return;
    }
    if (p.up == 0)
    {
        cout << "0";
        return;
    }
    if (p.down == 1)
    {
        cout << p.up;
        return;
    }
    int sum;
    if (p.up < 0)
    {
        sum = ogcd(-p.up, p.down);
        cout << "-" << -p.up / sum << "/" << p.down / sum;
        return;
    }
    else if (p.down < 0)
    {
        sum = ogcd(p.up, -p.down);
        cout << "-" << p.up / sum << "/" << -p.down / sum;
        return;
    }
    else
    {
        sum = ogcd(p.up, p.down);
        cout << p.up / sum << "/" << p.down / sum;
        return;
    }
}
Fraction add(Fraction p1, Fraction p2)
{
    if (p1.down < 0)
    {
        p1.up = -p1.up;
        p1.down = -p1.down;
    }
    if (p2.down < 0)
    {
        p2.up = -p2.up;
        p2.down = -p2.down;
    }
    int sum2 = igcd(p1.down, p2.down);
    return Fraction(p1.up * (sum2 / p1.down) + p2.up * (sum2 / p2.down), sum2);
}
Fraction sub( Fraction p1,  Fraction p2)
{
    if (p1.down < 0)
    {
        p1.up = -p1.up;
        p1.down = -p1.down;
    }
    if (p2.down < 0)
    {
        p2.up = -p2.up;
        p2.down = -p2.down;
    }
    int sum2 = igcd(p1.down, p2.down);
    return Fraction(p1.up * (sum2 / p1.down) - p2.up * (sum2 / p2.down), sum2);
}
Fraction mul(const Fraction& p1, const Fraction& p2)
{
    return Fraction(p1.up * p2.up, p1.down * p2.down);
}
Fraction div(const Fraction& p1, const Fraction& p2)
{
    return Fraction(p1.up * p2.down, p1.down * p2.up);
}

int Fraction::get_up()
{
        return up/ogcd(abs(up),abs(down));
    
 
}
int Fraction::get_down()
{
        return down/ ogcd(abs(up), abs(down));
  
}
Fraction Fraction::negative()
{
    return Fraction(-up,down);
}
复制代码

task4.cpp:

复制代码
#include "Fraction.h"
#include <iostream>
using std::cout;
using std::endl;


void test1() {
    cout << "Fraction类测试: " << endl;
    cout << Fraction::doc << endl << endl;

    Fraction f1(5);
    Fraction f2(3, -4), f3(-18, 12);
    Fraction f4(f3);
    cout << "f1 = "; output(f1); cout << endl;
    cout << "f2 = "; output(f2); cout << endl;
    cout << "f3 = "; output(f3); cout << endl;
    cout << "f4 = "; output(f4); cout << endl;

    Fraction f5(f4.negative());
    cout << "f5 = "; output(f5); cout << endl;
    cout << "f5.get_up() = " << f5.get_up() << ", f5.get_down() = " << f5.get_down() << endl;

    cout << "f1 + f2 = "; output(add(f1, f2)); cout << endl;
    cout << "f1 - f2 = "; output(sub(f1, f2)); cout << endl;
    cout << "f1 * f2 = "; output(mul(f1, f2)); cout << endl;
    cout << "f1 / f2 = "; output(div(f1, f2)); cout << endl;
    cout << "f4 + f5 = "; output(add(f4, f5)); cout << endl;
}

void test2() {
    Fraction f6(42, 55), f7(0, 3);
    cout << "f6 = "; output(f6); cout << endl;
    cout << "f7 = "; output(f7); cout << endl;
    cout << "f6 / f7 = "; output(div(f6, f7)); cout << endl;
}

int main() {
    cout << "测试1: Fraction类基础功能测试\n";
    test1();

    cout << "\n测试2: 分母为0测试: \n";
    test2();
}
复制代码

任务5:

account.h:

复制代码
#ifndef __ACCOUNT_H__
#define __ACCOUNT_H__
class SavingAccount
{
private:
    int id;
    double balance;
    double rate;
    int lastDate;
    double accumulation;
    static double total;
    void record(int date, double amount);
    double accumulate(int date) const {
        return accumulation + balance * (date - lastDate);
    }
public:
    SavingAccount(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);
    void settle(int date);
    void show() const;
};



#endif
复制代码

account.cpp:

复制代码
#include "account.h"
#include <cmath>
#include <iostream>
using namespace std;
double SavingAccount::total = 0;
SavingAccount::SavingAccount(int date, int id, double rate) :id(id), balance(0), rate(rate), lastDate(date), accumulation(0)
{
    cout << date << "\t#" << id << "is created" << endl;
}
void SavingAccount::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 SavingAccount::deposit(int date, double amount)
{
    record(date, amount);
}
void SavingAccount::withdraw(int date, double amount)
{
    if (amount > getBalance())
    {
        cout << "Error: not enough money" << endl;
    }
    else
    {
        record(date, -amount);
    }
}
void  SavingAccount::settle(int date)
{
    double interest = accumulate(date) * rate / 365;
    if (interest != 0)
    {
        record(date, interest);
    }
    accumulation = 0;
}
void SavingAccount::show() const 
{
    cout << "#" << id << "\tBalance: " << balance;
}
复制代码

5.cpp:

复制代码
#include "account.h"
#include <iostream>
using namespace std;
int main()
{
    SavingAccount sa0(1, 21325302, 0.015);
    SavingAccount sa1(1, 58320212, 0.015);
    sa0.deposit(5, 5000);
    sa1.deposit(25, 10000);
    sa0.deposit(45, 5500);
    sa1.withdraw(60, 4000);
    sa0.settle(90);
    sa1.settle(90);
    sa0.show(); cout << endl;
    sa1.show(); cout << endl;
    cout << "Tatal: " << SavingAccount::getTotal() << endl;
    return 0;
}
复制代码

 

posted on   陆一鸣·  阅读(7)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
点击右上角即可分享
微信分享提示