实验任务3
#pragma once #include<iostream> #include<string> using namespace std; class MachinePets { public: MachinePets(const string s); string get_nickname() const; virtual string talk() = 0; private: string nickname; }; MachinePets::MachinePets(const string s): nickname{s} {} string MachinePets::get_nickname() const{ return nickname; } class PetCats: public MachinePets { public: PetCats(const string s); string talk() override; }; PetCats::PetCats(const string s): MachinePets{s} {} string PetCats::talk() { return "miao wu~"; } class PetDogs: public MachinePets { public: PetDogs(const string s); string talk() override; }; PetDogs::PetDogs(const string s): MachinePets{s} {} string PetDogs::talk() { return "wang wang~"; }pets.hpp
#include <iostream> #include "pets.hpp" void play(MachinePets &obj) { std::cout << obj.get_nickname() << " says " << obj.talk() << std::endl; } void test() { PetCats cat("miku"); PetDogs dog("da huang"); play( cat ); play( dog ); } int main() { test(); }task3.cpp
实验任务4
#pragma once #include<iostream> #include<string> using namespace std; class Person { public: Person() = default; Person(const string& n, const string& t, const string& e): name{n}, telephone{t}, email{e} {} Person(const Person& p): name{p.name}, telephone{p.telephone}, email{p.email} {} void update_telephone(); void update_email(); friend bool operator==(const Person &p1, const Person &p2); friend ostream& operator<<(ostream &os, const Person &p); friend istream& operator>>(istream &is, Person &p); private: string name, telephone, email; }; void Person::update_telephone() { cout << "输入电话号码:"; getline(cin, telephone); cout << "电话号码已更新..." << endl; } void Person::update_email() { cout << "输入email地址:"; getline(cin, email); cout << "email地址已更新..." << endl; } bool operator==(const Person &p1, const Person &p2) { return (p1.name == p2.name && p1.telephone == p2.telephone); } ostream& operator<<(ostream &os, const Person &p) { os << "姓名:" << p.name << ",手机号码:" << p.telephone << ",邮箱:" << p.email; return os; } istream& operator>>(istream &is, Person &p) { getline(is, p.name); getline(is, p.telephone); getline(is, p.email); return is; }Person.hpp
#include <iostream> #include <vector> #include "Person.hpp" void test() { using namespace std; vector<Person> phone_book; Person p; cout << "输入一组联系人的联系方式,E直至按下Ctrl+Z终止\n"; while(cin >> p) phone_book.push_back(p); cin.clear(); cout << "\n更新phone_book中索引为0的联系人的手机号、邮箱:\n"; phone_book.at(0).update_telephone(); phone_book.at(0).update_email(); cout << "\n测试两个联系人是否是同一个:\n"; cout << boolalpha << (phone_book.at(0) == phone_book.at(1)) << endl; } int main() { test(); }task4.cpp
实验任务5
#pragma once class Date { private: int year; int month; int day; int 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; } };date.h
#include "date.h" #include <iostream> #include <cstdlib> using namespace std; namespace { const int DAYS_BEFORE_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_BEFORE_MONTH[month-1]+day; if(isLeapYear() && month > 2) totalDays++; } int Date::getMaxDay() const { if(isLeapYear() && month == 2) return 29; else return DAYS_BEFORE_MONTH[month]-DAYS_BEFORE_MONTH[month-1]; } void Date::show() const { cout << getYear() << "-" << getMonth() << "-" << getDay(); }date.cpp
#pragma once #include "date.h" class Accumulator { private: Date lastDate; double value; double sum; public: double getSum(const Date &date) const { return sum+value*(date-lastDate); } Accumulator(const Date &date, double value): lastDate(date), value(value), sum(0) { } 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=value; sum = 0; } };accumulator.h
#include "accumulator.h" #include <string> class Account { private: std::string id; double balance; static double total; protected: Account(const Date &date, const std::string &id); void record(const Date &date, double amount, const std::string &desc); void error(const std::string &msg) const; public: const std::string &getId() const {return id;} double getBalance() const {return balance;} static double getTotal() {return total;} virtual void deposit(const Date &date, double amount, const std::string &desc) = 0; virtual void withdraw(const Date &date, double amount, const std::string &desc) = 0; virtual void settle(const Date &date) = 0; virtual void show() const; }; class SavingsAccount: public Account { private: Accumulator acc; double rate; public: SavingsAccount(const Date &date, const std::string &id, double rate); double getRate() const {return rate;} void deposit(const Date &date, double amount, const std::string &desc); void withdraw(const Date &date, double amount, const std::string &desc); void settle(const Date &date); }; class CreditAccount: public Account { private: Accumulator acc; double credit; double rate; double fee; double getDebt() const { double balance = getBalance(); return (balance < 0 ? balance : 0); } public: CreditAccount(const Date &date, const std::string &id, double credit, double rate, double fee); double getCredit() const {return credit;} double getRate() const {return rate;} double getFee() const {return fee;} double getAvailableCredit() const { if(getBalance() < 0) return credit+getBalance(); else return credit; } void deposit(const Date &date, double amount, const std::string &desc); void withdraw(const Date &date, double amount, const std::string &desc); void settle(const Date &date); void show() const; };account.h
#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) { if(date.getMonth()==1) { 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 std::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 std::string &desc) { record(date, amount, desc); acc.change(date, getDebt()); } void CreditAccount::withdraw(const Date &date, double amount, const std::string &desc) { if(amount-getBalance()>credit) { error("not enough 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(); }account.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; }8_8.cpp
标签:const,string,继承,double,void,多态,Date,实验,date From: https://www.cnblogs.com/Lucky-19/p/17858865.html