首页 > 其他分享 >实验5

实验5

时间:2023-12-02 21:22:55浏览次数:25  
标签:const string double void Date 实验 date

3.hpp

#include<iostream>
#include<string>
using namespace std;
class MachinePets {
    public:
        MachinePets(const string s);
        MachinePets();
        string  get_nickname() const;
public:
    virtual string talk() = 0;
protected:
    string nickname;
};
MachinePets::MachinePets(const string s) {
    nickname = s;
}
MachinePets::MachinePets():nickname(nickname){

}
string MachinePets::get_nickname() const{
    return nickname;
}
class PetCats :public MachinePets {
public:
    PetCats(const string s);
public:
    string talk() override;
};
PetCats::PetCats(const string s){
    nickname = s;
}
string PetCats::talk() {
    return "miao wu~";
 }
class PetDogs :public MachinePets {
public:
    PetDogs(const string s);
public:
    string talk() override;
};
PetDogs::PetDogs(const string s){
    nickname = s;
}
string PetDogs::talk() {
    return  "wang wang~";
}

3.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();
}

 4.hpp

#include<iostream>
#include<vector>
#include<string>
using namespace std;
class Person {
public:
    Person();
    Person(string n, string t,string e=0);
    Person(const Person& p);
    void update_telephone();
    void update_email();
    friend istream& operator>>(istream& is, Person& p);
    friend ostream& operator<<(ostream& os, Person& p);
    friend bool operator==(const Person& a, const Person& b);
private:
    string name;
    string telephone;
    string email;
};
Person::Person() {}
Person::Person(string n, string t, string e) {
    name = n;
    telephone = t;
    email = e;
}
Person::Person(const Person& p) {
    this->name = p.name;
    this->telephone = p.telephone;
    this->email = p.email;
}
void Person::update_telephone() {
    string m = "19218132577";
    cin >> m;
    cout << "输入电话号码:" <<m<< endl;
    cout << "电话号码已更新" << endl;
}
void Person::update_email() {
    string n = "[email protected]";
    cin >> n;
    cout << "输入email地址:" <<n<< endl;
    cout << "email地址已更新" << endl;
}
istream& operator>>(istream& is, Person& p) {
    is >> p.name >> p.telephone >> p.email;
    return is;
}
ostream& operator<<(ostream& os, Person& p) {
    os << p.name << p.telephone << p.email;
    return os;
}
bool operator==(const Person& a, const Person& b) {
    return(a.name == b.name);
}

4.cpp

#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);
    
    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();
}

 date.h

#ifndef_ _DATE_H_ _
#define_ _DATE_H_ _
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 || yeat % 400 == 0;
    }
    void show()const;
    int operator-(const Date& date)const {
        return totalDays - date.totalDays;
    }
};
#endif//_ _DATE_H_ _

date.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();
}

accumulator.h

#ifndef_ _ACCUMULATOR_H_ _
#define_ _ACCUMULATOR_H_ _
#include"date.h"
class accumulator
{
private:
    Date lastDate;
    double value;
    double sum;
public:
    double qetSum(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 = qetSum(date);
        lastDate = date;
        this->value = value;
    }
    void reset(const Date& date, double value) {
        lastDate = date;
        this->value = value;
        sum = 0;
    }


};

account.h

#ifdef_ _ACCOUNT_H_ _
#define_ _ACCOUNT_H_ _
#include"date.h"
#include"accumulator.h"
#include<string>
#include"date.h"
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 getToal() { 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);
         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.cpp

#include"account.h"
 #include<cmath>
#include<iostream>
 using namespace std;
 double Account::total = 0;
 Account::Account(const Date & date, const std::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 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 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();
     }

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::getToal() << "\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;
         }

 

标签:const,string,double,void,Date,实验,date
From: https://www.cnblogs.com/32re/p/17872231.html

相关文章

  • C0P8000计算机组成原理实验系统24位控制位功能
    因为做到了这个课设所以存一下相关内容24位控制位XRD:外部设备读信号,当给出了外设的地址后,输出此信号,从指定外设读数据。EMWR:程序存储器EM写信号。EMRD:程序存储器EM读信号。PCOE:将程序计数器PC的值送到地址总线ABUS上。EMEN:将程序存储器EM与数据总线DBUS......
  • 实验五
    任务一publisher.hpp1#pragmaonce23#include<iostream>4#include<string>56usingstd::cout;7usingstd::endl;8usingstd::string;910//发行/出版物类:Publisher(抽象类)11classPublisher{12public:13Publisher(conststr......
  • .Net实验一 语言基础
    一、实验目的熟悉VisualStido.NET实验环境;掌握控制台程序的编写方法;掌握C#程序设计语言的语法基础;掌握控制语句和数组的使用。二、实验要求根据题目要求,编写C#程序,并将程序代码和运行结果写入实验报告。三、实验内容编写一个控制台应用程序,输入三角形或者长方形边长,计......
  • 软件设计实验 24:模板方法模式
      实验24:模板方法模式本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:1、理解模板方法模式的动机,掌握该模式的结构;2、能够利用模板方法模式解决实际问题。 [实验任务一]:数据库连接对数据库的操作一般包括连接、打开、使用、关闭等步骤,在数据库操作模板类中我......
  • 第五次实验
    任务1-1//验证性实验:指针变量作为函数参数,指针变量作为函数的返回值#include<stdio.h>#defineN5voidinput(intx[],intn);voidoutput(intx[],intn);voidfind_min_max(intx[],intn,int*pmin,int*pamx);intmain(){ inta[N]; intmin,max; printf("录入%d......
  • 实验5 继承和多态
    实验任务3pets.hpp源码1#include<iostream>2usingstd::string;3classMachinePets{4private:5stringnickname;6public:7MachinePets(conststrings);8stringget_nickname()const;9virtualstrin......
  • 实验5
    #programonce#include<iostream>#include<string>usingnamespacestd;classTextCoder{private:stringtext;voidencoder();#include"textcoder.hpp"#include<iostream>#include<string>voidtest(){us......
  • 实验四-现代C++标准库与类模板
    1#include<iostream>23usingstd::cout;4usingstd::endl;56classA{7public:8A(intx0,inty0):x{x0},y{y0}{}9voidshow()const{cout<<x<<","<<y<<endl;}10private:11......
  • 实验4
    实验任务5#include<iostream>#include<string>usingnamespacestd;classTextCoder{public:TextCoder()=default;TextCoder(stringstr);stringget_ciphertext();stringget_deciphertext();~TextCoder()=default;private:......
  • 实验四
    #programonce#include<iostream>#include<string>usingnamespacestd;classTextCoder{private:stringtext;voidencoder();voiddecoder();public:TextCoder(string&str);stringget_ciphertext();stringget_dec......