实验任务1
publisher.hpp
#pragma once #include<iostream> #include<string> using std::cout; using std::string; using std::endl; class publisher{ public: publisher(const string &s = " "); public: virtual void publish() = 0; protected : string name; }; publisher :: publisher(const string &s ) : name{s} { } class Book:public publisher{ public : Book(const string &s = " ",const string &a = " "); void publish() override; void read(); private : string author; }; Book :: Book(const string &s ,const string &a ) : publisher{s} , author{a} { } void Book :: publish() { cout << "Publishing book : " << name << " by " << author << endl; } void Book :: read() { cout << "Reading book : " << name << " by " << author << endl; } class Film : public publisher{ public : Film(const string &s = " ",const string &d = " "); public : void publish() override; void watch(); private : string director; }; Film :: Film(const string &s,const string &d) : publisher{s} , director{d} {} void Film ::publish() { cout << "Publishing film : " << name << "directed by " << director << endl; } void Film ::watch() { cout << "watching film : " << name << "directed by " << director << endl; } class Music : public publisher{ public : Music (const string &s =" ",const string &d = " " ); public : void publish() override; void listen(); private : string artist; }; Music :: Music(const string &s,const string &d) : publisher {s} , artist{d} {} void Music::publish() { cout << "Publishing music : " << name << "by " << artist << endl; } void Music::listen() { cout << "listening to music :" << name << "by " << artist << endl; }View Code
task.cpp
#include"publisher.hpp" #include"vector" #include<typeinfo> using std :: vector; void func(publisher *ptr) { cout << "Pointer type : " << typeid(ptr).name() << endl; cout << "RTTT type :" << typeid(*ptr).name() << endl; ptr->publish(); } void test() { publisher *ptr; cout << "测试 1 :\n" ; Book book {"Harry potter","J.K.Rowling" }; ptr = &book; func(ptr); book.read(); cout << "\n 测试 2 :\n" ; Film film{"The Godfather","Francis Ford Coppola"}; ptr = &film; func(ptr); film.watch(); cout << "\n 测试 3 :\n" ; Music music{" Blowing in the wind ", " Bob Dylan"}; ptr =&music; func(ptr); music.listen(); } int main() { test(); }View Code
运行结果:
实验任务2
Complex.hpp
#pragma once #include<iostream> class Complex{ public: Complex(double r = 0,double i = 0) : real {r} ,imag{i} {} Complex(const Complex &c) : real{c.real} ,imag{c.imag} {} ~Complex() = default; public: double get_real() const {return real;} double get_imag() const {return imag;} Complex & operator += ( const Complex &c); friend Complex operator +(const Complex &c1,const Complex &c2); friend bool operator == (const Complex &c1,const Complex &c2); friend std :: ostream& operator << (std:: ostream& os,const Complex &c); friend std :: istream& operator >> (std:: istream & is,Complex &c); private : double real; double imag; }; //成员函数 Complex & Complex :: operator += (const Complex &c) { real += c.real; imag += c.imag; return *this; } Complex operator+(const Complex &c1, const Complex &c2) { return Complex(c1.get_real() + c2.get_real(), c1.get_imag() + c2.get_imag()); } bool operator==(const Complex &c1, const Complex &c2) { return (c1.get_real() == c2.get_real() && c1.get_imag() == c2.get_imag()); } std::ostream& operator<<(std::ostream &os, const Complex &c) { if(c.imag >= 0) os << c.real << " + " << c.imag << "i"; else os << c.real << " - " << -c.imag << "i"; return os; } std::istream& operator>>(std::istream &is, Complex &c) { is >> c.real >> c.imag; return is; }View Code
task2.cpp
#include <iostream> #include "complex.hpp" void test() { using namespace std; Complex c1; cout << "Enter c1: "; cin >> c1; cout << "c1 = " << c1 << endl; Complex c2{1.5}, c3{1.5, 3}, c4{c3}; cout << "c2 = " << c2 << endl; cout << "c3 = " << c3 << endl; cout << "c4 = " << c4 << endl; cout << "c3 == c4: " << boolalpha << (c3 == c4) << endl; cout << "c1 + c2 = " << c1 + c2 << endl; c1 += c2; cout << "c1 = " << c1 << endl; cout << c1.get_real() << " " << c1.get_imag() << endl; } int main() { test(); }View Code
运行结果:
实验任务三
pets.hpp
#include <iostream> #include <string> #pragma once using namespace std; class MachinePets { private: string nickname; public: MachinePets(const string &s) : nickname{s} {} string get_nickname() const { return nickname; } virtual string talk() = 0; }; class PetCats : public MachinePets { public: PetCats(const string &s) : MachinePets{s} {} string talk() override { return "miao wu~"; } }; class PetDogs : public MachinePets { public: PetDogs(const string &s) : MachinePets(s) {} string talk() override { return "wang wang~"; } };View Code
task3.cpp
#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(); }View Code
运行结果:
实验任务四
person.hpp
#include <iostream> #include <string> #include <vector> #include <limits> #pragma once using namespace std; class Person { private: string name; string telephone; string email; public: Person(const string& n, const string& t, const string& e = "") : name{n}, telephone{t}, email{e} {} Person() : name(""), telephone(""), email("") {} Person(const Person& other) : name{other.name}, telephone{other.telephone}, email{other.email} {} void update_telephone() { cin.clear(); cout << "输入电话号码:"; telephone.clear(); string Newtelephone; getline(cin, Newtelephone); this->telephone=Newtelephone; cout << "电话号码已更新..." << endl; } void update_email() { cout << "输入email地址:"; email.clear(); string Newemail ; getline(cin, Newemail); this->email=Newemail; } friend ostream& operator<<(ostream& os, const Person& person) { os << "Name: " << person.name << "\nTelephone: " << person.telephone << "\nEmail: " << person.email<<endl; return os; } friend istream& operator>>(istream& is, Person& person) { getline(is, person.name); getline(is, person.telephone); getline(is, person.email); cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); return is; } friend bool operator==(const Person& P1, const Person& P2) { return (P1.name == P2.name) && (P1.telephone == P2.telephone); } };View Code
task4.cpp
#include<iostream> #include <iostream> #include <string> #include <vector> #include <limits> #include"person.hpp" using namespace std; void test() { vector<Person> phone_book; Person p; cout << "输入一组联系人的联系方式,直至按下Ctrl+Z终止\n"; while (cin >> p) { phone_book.push_back(p); } cout << "\n更新phone_book中索引为0的联系人的手机号、邮箱:\n"; phone_book.at(0).update_telephone(); phone_book.at(0).update_email(); cout << "\n测试两个联系人是否是同一个:\n"; if (phone_book.size() > 1) { cout<<phone_book[0]<<phone_book[1]; cout << boolalpha << (phone_book.at(0) == phone_book.at(1)) << endl; } } int main() { test(); return 0; }View Code
运行结果:
实验任务五
data.h
#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; } };View Code
data.cpp
#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(); }View Code
account.h
#pragma once #include"date.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; };View Code
account.cpp
#pragma once #include"date.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; };View Code
task5.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
运行结果:
标签:std,const,string,继承,double,多态,实验,date,include From: https://www.cnblogs.com/202283230013nuister/p/17872867.html