首页 > 其他分享 >实验五

实验五

时间:2024-12-02 22:12:04浏览次数:3  
标签:const cout int 实验 date return include

task3:

pets.hpp

#pragma once
#include<iostream>
using namespace std;


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

task.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

 

 

task4:

film.hpp

#pragma once
#include<iostream>
#include<iomanip>
using namespace std;
class Film {
public:
    Film() {
        this->name = name;
        this->director = director;
        this->country = country;
        this->year = year;
    }
    friend istream &operator>>(istream &in, Film &c) {
        cout << "录入片名:";
            in >> c.name;
            cout << "录入导演:";
                in >> c.director;    
                cout << "录入国家/地区:";
                in >> c.country;;
                cout << "录入时间:";
                in >> c.year;

        return in;
    }
    friend ostream& operator<<(ostream& out, Film& c) {
        out << c.name <<setw(20) <<c.director<< setw(20) << c.country <<setw(20)<< c.year;
        return out;
    }
    Film(const string& name, const string& director, const string& country, const string& year) {
        this->name = name;
        this->director = director;
        this->country = country;
        this->year = year;
    }
    string get_year() const{
        return year;
    }


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

task.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:

complex.hpp

#pragma once
#include<iostream>
#include<string>
using namespace std;
template<typename T>
class Complex {
public:
    Complex() :real{0},imag{0}{}
    Complex(const T &x0,const T &y0) :real{ x0 }, imag{ y0 } {}
    friend ostream& operator<<(ostream& out,const Complex &c) {
        if (c.imag > 0) {
            cout << c.real << " + " << c.imag << "i" << endl;
            return out;
        }
        else if (c.imag< 0) {
            cout << c.real << " - " << -c.imag << "i" << endl;
            return out;
        }
        else cout << c.real << endl;
        return out;
    }
    friend istream& operator>>(istream& in, Complex& c) {
        cin >> c.real >> c.imag;
        return in;
    }
    friend Complex operator+(const Complex& c1,const Complex& c2) {
        return Complex<T>(c1.real + c2.real, c1.imag + c2.imag);
    }
    void operator+=(Complex& c2) {
        real += c2.real;
        imag += c2.imag;
    }
    friend bool operator==(Complex& c1, Complex& c2) {
        if (c1.real == c2.real && c1.imag == c2.imag)return true;
        return false;
    }
    T get_real()const {
        return real;
    }
    T get_imag()const {
        return imag;
    }
private:
    T imag, real;
};
View Code

task.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

 

 

 

 

task6:

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

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

结果:

 

标签:const,cout,int,实验,date,return,include
From: https://www.cnblogs.com/bearrrr/p/18581814

相关文章

  • 软件设计:实验 22:状态模式
    实验 22:状态模式本次实验属于模仿型实验,通过本次实验学生将掌握以下内容: 1、理解状态模式的动机,掌握该模式的结构;2、能够利用状态模式解决实际问题。 [实验任务一]:银行账户用Java代码模拟实现课堂上的“银行账户”的实例,要求编写客户端测试代码模拟用户存款和取款,注意账......
  • 实验5 继承和多态
    实验任务3实验代码:1#pragmaonce2#include<iostream>3#include<string>45classMachinePets{6public:7MachinePets(conststd::string&s);8std::stringget_nickname()const;9virtualstd::stringtalk()=0;10......
  • 实验5 C++
    任务三:pets.hpp1#pragmaonce2#include<iostream>3#include<string>45usingnamespacestd;67classMachinePets{8private:9stringnickname;10public:11MachinePets(conststrings):nickname{s}{}12stringge......
  • 实验5
    task1publisher.hpp#pragmaonce#include<iostream>#include<string>usingstd::cout;usingstd::endl;usingstd::string;//发行/出版物类:Publisher(抽象类)classPublisher{public:Publisher(conststring&s="");......
  • 实验五 继承和多态
    1.实验任务三pets.hpp1#pragmaonce2#include<iostream>3#include<string>4usingnamespacestd;56classMachinePets{7public:8MachinePets(conststring&s="");9public:10virtualstringtal......
  • 实验五 C语言指针应用编程
    实验五C语言指针应用编程实验任务1——数组求最大最小值#include<stdio.h>#defineN5voidinput(intx[],intn);voidoutput(intx[],intn);voidfind_min_max(intx[],intn,int*pmin,int*pmax);intmain(){ inta[N]; intmin,max; printf("录入%d个数......
  • 实验5 继承和多态
    任务3源码:1#pragmaonce23#include<iostream>4#include<string>56usingstd::string;789classMachinePets{10public:11MachinePets(conststring&s);1213public:14virtualstringget_nickname......
  • 实验5 继承和多态
    实验任务三源码1#pragmaonce2#include<iostream>3#include<string>45usingstd::string;6usingstd::cout;7usingstd::endl;89//电子宠物类10classMachinePets{11private:12stringnickname;13public:14MachinePets(cons......
  • 实验5
    实验任务3pets.hpp代码点击查看代码#include<iostream>#include<string>usingnamespacestd;classMachinePets{public: MachinePets(conststrings); virtualstringtalk()const=0; stringget_nickname()const; private: stringnickname; };Mac......
  • 实验五 继承和多态
    实验一:代码:publisher.hpp:1#pragmaonce23#include<iostream>4#include<string>56usingstd::cout;7usingstd::endl;8usingstd::string;910classPublisher{11public:12Publisher(conststring&s="");......