实验五

任务三

pets.hpp

#pragma once

#include <iostream>
#include <string>
 
using namespace std;

class MachinePets{
public:
    MachinePets(const string &m):nickname{m}{}
    string get_nickname() const {return nickname;}
    virtual string talk() = 0;
private:
    string nickname;
};
class PetCats:public MachinePets{
public:    
    PetCats(const string &m):MachinePets{m}{};
    string talk(){
        return "miao wu~";
    }
};
class PetDogs:public MachinePets{
public:
    public:    
    PetDogs(const string &m):MachinePets{m}{};
    string talk(){
        return "wang wang~";
    }
};
View Code

task3.cpp

#include <iostream>
#include <vector>
#include "pets.hpp"

void test() {
    using namespace std;

    vector<MachinePets *> pets;

    pets.push_back(new PetCats("miku"));
    pets.push_back(new PetDogs("da huang"));

    for(auto &ptr: pets)
        cout <<ptr->get_nickname() << " says " << ptr->talk() << endl;
}

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

实验结果

任务四

film.hpp

#pragma once

#include <iostream> 
#include <iomanip>
#include <string>

using namespace std;
class Film{
public:
    string get_year() const;
    friend istream& operator>>(istream &in,Film &f){
        cout << "录入片名:";
        in>>f.name;
        cout << "录入导演:";
        in >> f.author;
        cout << "录入制片国家/地区:";
        in >> f.country;
        cout << "录入上映年份:";
        in >> f.year;
        return in; 
    }
    friend ostream& operator<<(ostream &out,Film &f){
        out << left;
        out << setw(15) << f.name
            << setw(15) << f.author
            << setw(15) << f.country
            << setw(15) << f.year;
            return out; 
    }


private:
    string name;
    string author;
    string country;
    string year;
};

string Film::get_year() const {
        return year;
}
bool compare_by_year(Film& c1, Film& c2) {
    if (c1.get_year() < c2.get_year()) return true;
    return false;
}
View Code

task4.cpp

#include "film.hpp"
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>

void test() {
    using namespace std;

    int n;
    cout << "输入电影数目: ";
    cin >> n;

    cout << "录入" << n << "部影片信息" << endl;
    vector<Film> film_lst;
    for(int i = 0; i < n; ++i) {
        Film f;
        cout << string(20, '-') << "" << i+1 << "部影片录入" << string(20, '-') << endl;
        cin >> f;
        film_lst.push_back(f);
    }

    sort(film_lst.begin(), film_lst.end(), compare_by_year);

    cout << string(20, '=') + "电影信息(按发行年份)" +  string(20, '=')<< endl;
    for(auto &f: film_lst)
        cout << f << endl;
}

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

实验结果

任务五

task5.cpp

#include "Complex.hpp"
#include <iostream>

using std::cin;
using std::cout;
using std::endl;
using std::boolalpha;

void test1() {
    Complex<int> c1(2, -5), c2(c1);

    cout << "c1 = " << c1 << endl;
    cout << "c2 = " << c2 << endl;
    cout << "c1 + c2 = " << c1 + c2 << endl;
    
    c1 += c2;
    cout << "c1 = " << c1 << endl;
    cout << boolalpha << (c1 == c2) << endl;
}

void test2() {
    Complex<double> c1, c2;
    cout << "Enter c1 and c2: ";
    cin >> c1 >> c2;
    cout << "c1 = " << c1 << endl;
    cout << "c2 = " << c2 << endl;

    cout << "c1.real = " << c1.get_real() << endl;
    cout << "c1.imag = " << c1.get_imag() << endl;
}

int main() {
    cout << "自定义类模板Complex测试1: " << endl;
    test1();

    cout << endl;

    cout << "自定义类模板Complex测试2: " << endl;
    test2();
}
View Code

Complex.hpp

#pragma once

#include <iostream> 
#include <iomanip>
#include <string>

using namespace std;

template<typename T>
class Complex{
private:
    T real,imag;
public:
    Complex(){
        real=0;
        imag=0;
    }
    Complex(T r,T i):real{r},imag{i}{}
    Complex(const Complex &c){
        real=c.real;
        imag=c.imag;
    }
    friend istream& operator >>(istream &in, Complex &c){
        in >> c.real >> c.imag ;
        return in;
    }
    friend ostream& operator<<(ostream &out,Complex &c){
        if(c.imag >= 0)
        {
            out << c.real << "+" << c.imag << "i" << endl;
        }
        else
            out << c.real << "-" << c.imag << "i" << endl;
            return out; 
    }
    T get_real () const{
        return real;
    }
    T get_imag () const{
        return imag;
    }
    friend Complex operator+(Complex c1,Complex c2){
        Complex c;
        c.real=c1.real+c2.real;
        c.imag=c1.imag+c2.imag;
        return c;
    }
    friend void operator+=(Complex c1,Complex c2){
        c1.real=c1.real+c2.real;
        c1.imag=c1.imag+c2.imag;
        return c1;
    }
    friend bool operator==(Complex c1,Complex c2){
        if(c1.real==c2.real&&c1.imag==c2.imag)
        return true;
        else 
        return false;
    }
    
};
View Code

实验结果

实验六

date.h

#pragma once

class Date {
private:
    int year, month, day, totalDays;
public:
    Date(int year, int month, int day);
    int getYear()const {
        return year;
    }
    int getMonth()const {
        return month;
    }
    int getDay()const
    {
        return day;
    }
    int getMaxDay()const;
    bool isLeapYear()const {
        return year % 4 == 0 && year % 100 != 0 || year % 400 == 0;
    }
    void show()const;
    int operator-(const Date& date)const {
        return totalDays - date.totalDays;
    }
};
View Code

date.cpp

#include"date.h"
 #include<iostream>
 #include<cstdlib>
 using namespace std;
 namespace {
         const int DAYS_BEFIRE_MONTH[] = { 0,31,59,90,120,151,181,212,243,273,304 ,334,365 };
    
}
 Date::Date(int year, int month, int day) :year(year), month(month), day(day) {
         if (day <= 0 || day > getMaxDay()) {
                 cout << "Invalid date: ";
                 show();
                 cout << endl;
                 exit(1);
        
    }
         int years = year - 1;
         totalDays = years * 365 + years / 4 - years / 100 + years / 400 + DAYS_BEFIRE_MONTH[month - 1] + day;
         if (isLeapYear() && month > 2) totalDays++;
    
}
 int Date::getMaxDay()const {
         if (isLeapYear() && month == 2)
                 return 29;
         else return DAYS_BEFIRE_MONTH[month] - DAYS_BEFIRE_MONTH[month - 1];
    
}
 void Date::show()const {
         cout << getYear() << "-" << getMonth() << "-" << getDay();
    
}
View Code

account.h

#include"date.h"
 #include<iostream>
 #include<cstdlib>
 using namespace std;
 namespace {
         const int DAYS_BEFIRE_MONTH[] = { 0,31,59,90,120,151,181,212,243,273,304 ,334,365 };
    
}
 Date::Date(int year, int month, int day) :year(year), month(month), day(day) {
         if (day <= 0 || day > getMaxDay()) {
                 cout << "Invalid date: ";
                 show();
                 cout << endl;
                 exit(1);
        
    }
         int years = year - 1;
         totalDays = years * 365 + years / 4 - years / 100 + years / 400 + DAYS_BEFIRE_MONTH[month - 1] + day;
         if (isLeapYear() && month > 2) totalDays++;
    
}
 int Date::getMaxDay()const {
         if (isLeapYear() && month == 2)
                 return 29;
         else return DAYS_BEFIRE_MONTH[month] - DAYS_BEFIRE_MONTH[month - 1];
    
}
 void Date::show()const {
         cout << getYear() << "-" << getMonth() << "-" << getDay();
    
}

account.cpp

#include "account.h"
 #include <cmath>
 #include<iostream>
 using namespace std;
 double Account::total = 0;
 Account::Account(const Date & date, const string & id) :id(id), balance(0) {
         date.show();
         cout << "\t#" << id << "created" << endl;
    
}
 void Account::record(const Date & date, double amount, const string & desc) {
         amount = floor(amount * 100 + 0.5) / 100;
         balance += amount;
         total += amount;
         date.show();
         cout << "\t#" << id << "\t" << amount << "\t" << balance << "\t" << desc << endl;
    
}
 void Account::show()const { cout << id << "\tBalance:" << balance; }
 void Account::error(const string & msg)const {
         cout << "Error(#" << id << "):" << msg << endl;
    
}
 SavingsAccount::SavingsAccount(const Date & date, const string & id, double rate) :Account(date, id), rate(rate), acc(date, 0) {}
 void SavingsAccount::deposit(const Date & date, double amount, const string & desc) {
         record(date, amount, desc);
         acc.change(date, getBalance());
    
}
 void SavingsAccount::withdraw(const Date & date, double amount, const string & desc) {
         if (amount > getBalance()) {
                 error("not enough money");
        
    }
         else {
                 record(date, -amount, desc);
                 acc.change(date, getBalance());
        
    }
    
}
 void SavingsAccount::settle(const Date & date) {
         double interest = acc.getSum(date) * rate / (date - Date(date.getYear() - 1, 1, 1));
         if (interest != 0)record(date, interest, "interest");
         acc.reset(date, getBalance());
    
}
 CreditAccount::CreditAccount(const Date & date, const string & id, double credit, double rate, double fee) :Account(date, id), credit(credit), rate(rate), fee(fee), acc(date, 0) {}
void CreditAccount::deposit(const Date & date, double amount, const string & desc) {
         record(date, amount, desc);
         acc.change(date, getDebt());
    
}
 void CreditAccount::withdraw(const Date & date, double amount, const string & desc) {
         if (amount - getBalance() > credit) {
                error("not enouogh credit");
        
    }
         else {
                 record(date, -amount, desc);
                 acc.change(date, getDebt());
        
    }
    
}
 void CreditAccount::settle(const Date & date) {
         double interest = acc.getSum(date) * rate;
         if (interest != 0) record(date, interest, "interest");
         if (date.getMonth() == 1)record(date, -fee, "annual fee");
         acc.reset(date, getDebt());
    
}
 void CreditAccount::show()const {
        Account::show();
     cout << "\tAvailable credit:" << getAvailableCredit();
    
}
View Code

accumulator.h

#include"date.h"
 class Accumulator {
 private:
     Date lastDate;
         double value;
         double sum;
public:
         Accumulator(const Date & date, double value) :lastDate(date), value(value), sum{ 0 } {}
         double getSum(const Date & date) const {
                 return sum + value * (date - lastDate);
        
    }
         void change(const Date & date, double value) {
                 sum = getSum(date);
                 lastDate = date;
                 this->value = value;
        
    }
         void reset(const Date & date, double value) {
                 lastDate = date;
                 this->value;
                 sum = 0;
        
    }
    
};
View Code

main.cpp

#include"account.h"
 #include<iostream>
 using namespace std;
 int main() {
         Date date(2008, 11, 1);
         SavingsAccount sa1(date, "S3755217", 0.015);
         SavingsAccount sa2(date, "02342342", 0.015);
         CreditAccount ca(date, "C5392394", 10000, 0.0005, 50);
         Account * accounts[] = { &sa1,&sa2,&ca };
         const int n = sizeof(accounts) / sizeof(Account*);
         cout << "(d)deposit (w)withdraw (s)show (c)change day (n)next month (e)exit" << endl;
         char cmd;
         do {
                 date.show();
                 cout << "\tTotal:" << Account::getTotal() << "\tcommand>";
                 int index, day;
                 double amount;
                 string desc;
                 cin >> cmd;
                 switch (cmd) {
                 case 'd':
                         cin >> index >> amount;
                         getline(cin, desc);
                         accounts[index]->deposit(date, amount, desc);
                         break;
            
                 case 'w':
                         cin >> index >> amount;
                         getline(cin, desc);
                         accounts[index]->withdraw(date, amount, desc);
                         break;
                 case 's':
                         for (int i = 0; i < n; i++) {
                                 cout << "[" << i << "]";
                                 accounts[i]->show();
                                 cout << endl;
                
            }
                         break;
            
                case 'c':
                         cin >> day;
                         if (day < date.getDay()) {
                                 cout << "You cannot specify a previous day";
                
            }
                         else if (day > date.getMaxDay())
                                 cout << "Invalid day";
                         else date = Date(date.getYear(), date.getMonth(), day);
                         break;
                 case 'n':
                         if (date.getMonth() == 12)
                                 date = Date(date.getYear() + 1, 1, 1);
                         else date = Date(date.getYear(), date.getMonth() + 1, 1);
                         for (int i = 0; i < n; i++) {
                                 accounts[i]->settle(date);
                
            }
                         break;
            
        }
        
    } while (cmd != 'e');
         return 0;
    
}
View Code

 

posted @ 2024-12-03 21:34  孟潇辉  阅读(4)  评论(0编辑  收藏  举报