实验2 类和对象(2)

实验任务1

程序源码

#include <iostream>
#include <complex>

int main(){
    using namespace std;

    complex<double> c1{3, 4}, c2{4.5};
    const complex<double> c3{c2};

    cout << "c1 = " << c1 << endl;
    cout << "c2 = " << c2 << endl;
    cout << "c3 = " << c3 << endl;
    cout << "c3.real = " << c3.real() << endl;
    cout << "c3.imag = " << c3.imag() << endl;

    cout << "c1 + c2 = " << c1 + c2 << endl;
    cout << "c1 - c2 = " << c1 - c2 << endl;
    cout << "abs(c1) = " << abs(c1) << endl;

    cout << boolalpha; 
    cout << "c1 == c2 : " << (c1 == c2) << endl;
    cout << "c3 == c2 : " << (c3 == c2) << endl;
    
    complex<double> c4 = 2;
    cout << "c4 = " << c4 << endl;
    c4 += c1;
    cout << "c4 = " << c4 << endl;

}

测试结果

 

实验任务2

程序源码

#include <iostream>
#include <array>
#include <string>

// 模板函数
// 对满足特定条件的序列类型T,使用范围for输出
template<typename T>
void output1(const T &obj) {
    for(auto i: obj)
        std::cout << i << ", ";
    std::cout << "\b\b \n";
}

// 模板函数
// 对满足特定条件的序列类型T,使用迭代器输出
template<typename T>
void output2(const T &obj) {
    for(auto p = obj.cbegin(); p != obj.cend(); ++p) //使用const迭代器
        std::cout << *p << ", ";
    std::cout << "\b\b \n";
}

int main(int argc, char const *argv[]) {
    using namespace std;

    array<int, 5> x1; // 创建一个array对象,包含5个int类型元素,未初始化
    cout << "x1.size() = " << x1.size() << endl; // 输出元素个数
    x1.fill(42); // 将x1的所有元素值都赋值为42
    x1.at(0) = 999;  // 把下标为0的元素修改为999
    x1.at(4) = -999; // 把下标为4的元素修改为-999
    x1[1] = 777; // 把下标为1的元素修改为777
    cout << "x1: ";
    output1(x1);
    cout << "x1: ";
    output2(x1);

    array<double, 10> x2{1.5, 2.2}; // 创建要给array对象,包含10个double类型元素,初始化部分元素
    cout << "x2.size() = " << x2.size() << endl;
    cout << "x2: ";
    output1(x2);

    array<int,5> x3(x1);
    cout << boolalpha << (x1 == x3) << endl;
    x3.fill(22);
    cout << "x3: ";
    output1(x3);

    swap(x1, x3); // 交换x1和x3的数据
    cout << "x1: ";
    output1(x1);
    cout << "x3: ";
    output1(x3);
    
}

测试结果

 

实验任务3

程序源码

  • employee.hpp
#pragma once

// Employee绫荤殑瀹氫箟
#include <iostream>
#include <string>
#include <iomanip>


using std::string;
using std::cout;
using std::endl;
using std::setfill;
using std::setw;
using std::left;
using std::right;
using std::to_string;

struct Date {
    int year;
    int month;
    int day;
};

class Employee
{
public:
    Employee();
    Employee(string name0, double salary0, int y, int m, int d = 1);
    void set_info(string name0, double salary0, int y, int m, int d = 1);
    string get_name() const;      
    double get_salary() const;  
    void display_info() const;   
    void update_salary(double s); 
    void update_hire_date(int y, int m, int d); 
    void raise_salary(double by_percent);  

public:
    static void display_count();    

private:
    string id;     
    string name;   
    double salary; 
    Date hire_date;  

public:
    static const string doc;  

private:
    static int count;  

};

const string Employee::doc {"a simple Employee class"};
int Employee::count = 0;

Employee::Employee(): id{ to_string(count+1) } {
    ++count;
}

Employee::Employee(string name0, double salary0, int y, int m, int d): 
          id{to_string(count+1)}, name{name0}, salary{salary0}, hire_date{y, m, d} {
    ++count;
}



void Employee::set_info(string name0, double salary0, int y, int m, int d) {
    name = name0;
    salary = salary0;
    hire_date.year = y;
    hire_date.month = m;
    hire_date.day = d;
}


string Employee::get_name() const {
    return name;
}


double Employee::get_salary() const {
    return salary;
}


void Employee::display_info() const {
    cout << left << setw(15) << "id: " << id << endl;
    cout << setw(15) << "name: " << name << endl;
    cout << setw(15) << "salary: " << salary << endl;
    cout << setw(15) << "hire_date: " << hire_date.year << "-";
    cout << std::right << setfill('0') << setw(2) << hire_date.month << "-"  << setw(2) << hire_date.day;
    
    cout << setfill(' ');  
}


void Employee::update_salary(double s) {
    salary = s;
}


void Employee::update_hire_date(int y, int m, int d) {
    hire_date.year = y;
    hire_date.month = m;
    hire_date.day = d;
}


void Employee::raise_salary(double by_percent) {
    double raise = salary * by_percent / 100;
    salary += raise;
}


void Employee::display_count() {
    cout << "there are " << count << " employees\n";
}
  • task3.cpp
#include "Employee.hpp"
#include <iostream>

void test() {
    using std::cout;
    using std::endl;

    cout << Employee::doc << endl << endl;

    Employee employee1;
    employee1.set_info("Sam", 30000, 2015, 1, 6);
    employee1.update_hire_date(2017, 6, 30);
    employee1.update_salary(35000);
    employee1.display_info();
    cout << endl << endl;

    Employee employee2{"Tony", 20000, 2020, 3, 16};
    employee2.raise_salary(15); 
    employee2.display_info();
    cout << endl << endl;

    Employee::display_count();
}

int main() {
    test();
}

测试结果

 

实验任务4

程序源码(已更换测试数据)

  • Complex.hpp文件源码
#include<iostream>
#include<cmath>

using std::cout;
using std::endl;

class Complex
{
public:
    Complex ();
    
    Complex (double x,double y=0);
    Complex (const Complex& x);
    ~Complex()=default;
    
    double get_real()const{return real;}
    double get_imag()const{return imag;}
    void show() const;
    void add(Complex const& c1);
    
    friend Complex add(Complex const& c1,Complex const& c2);
    friend bool is_equal(Complex const& c1,Complex const& c2);
    friend double abs(Complex const& c1);
     
private:
    double real;
    double imag;
};

Complex::Complex():real{0},imag{0}{}

Complex::Complex(double x,double y):real{x},imag{y}{}
Complex::Complex(const Complex& x):real{x.real},imag{x.imag}{}

void Complex::show()const{
    if(imag>0)
    cout<<real<<"+"<<imag<<"i";
    else if(imag<0)
    cout<<real<<imag<<"i";
    else
    cout<<real;
}

void Complex::add(Complex const& c1){
    real+=c1.real;
    imag+=c1.imag;
}

Complex add(Complex const& c1,Complex const& c2){
    Complex c3;
    c3.real=c1.real +c2.real;
    c3.imag=c1.imag +c2.imag;
    return c3; 
} 

bool is_equal(Complex const& c1,Complex const& c2){
    if(c1.real==c2.real&&c1.imag==c2.imag)
    return true;
    else
    return false;
}

double abs(Complex const& c1){
    return sqrt(c1.real*c1.real+c1.imag*c1.imag);
}
  • task4.cpp源码
#include "Complex.hpp"
#include <iostream>

void test() {
    using namespace std;

    Complex c1(7, -24);
    const Complex c2(2.5);
    Complex c3(c1);

    cout << "c1 = ";
    c1.show();
    cout << endl;

    cout << "c2 = ";
    c2.show();
    cout << endl;
    cout << "c2.imag = " << c2.get_imag() << endl;

    cout << "c3 = ";
    c3.show();
    cout << endl;

    cout << "abs(c1) = ";
    cout << abs(c1) << endl;

    cout << boolalpha;
    cout << "c1 == c3 : " << is_equal(c1, c3) << endl;
    cout << "c1 == c2 : " << is_equal(c1, c2) << endl;

    Complex c4;
    c4 = add(c1, c2);
    cout << "c4 = c1 + c2 = ";
    c4.show();
    cout << endl;

    c1.add(c2);
    cout << "c1 += c2, " << "c1 = ";
    c1.show();
    cout << endl;
}

int main() {
    test();
}

测试结果(已更换测试数据)

实验任务5

程序源码(已更换测试数据)

  • User.hpp文件源码
#include<iostream>
#include<string> 
#include<iomanip>

using namespace std;

class User{
public:
    User(string name,string passwd="111111",string email="");
    ~User()=default;
    
    void set_email();
    void change_passwd();
    void print_info();
    static void print_n();
    
private:
    string name;
    string passwd;
    string email;
    static int n;
};

User::User(string name,string passwd,string email) :name{name},passwd{passwd},email{email}{n++;}

int User::n=0;

void User::set_email(){
    cout<<"Enter email address:";
    cin>>email;
    cout<<"email is set successfully..."<<endl;
}

void User::change_passwd(){
    string t;
    int i;
    cout << "Enter old password: ";
    cin >> t;
    while (i <2 )
    {
        if (passwd == t)
        {
            cout << "Enter new password: ";
            cin >> passwd;
            cout << "new passwd is set successfully..." << endl;
            break;
        }
        else
        {
            i++;
            cout << "password input error. Please re-enter again: ";
            cin >> t;
        }
    }
    if (i ==2 )
    {
        cout << "password input error. Please try after a while." << endl;
    }
}
void User::print_info()
{
    string starPasswd(passwd.length(), '*');
    cout << setfill(' ') << setw(8) << left <<"name:"<< name << endl
         << setfill(' ') << setw(8) << left <<"passwd:"<< starPasswd << endl
         << setfill(' ') << setw(8) << left <<"email:"<< email << endl;
}

void User::print_n(){
    if(n==1)
    cout<<"there is 1 user."<<endl;
    else
    cout<<"there are "<<n<<" users."<<endl;
}
  • task5.cpp源码
#include "User.hpp"
#include <iostream>

void test() {
    using std::cout;
    using std::endl;

    cout << "testing 1......\n";
    User user1("Eliwa", "9251995", "xy@hotmail.com");
    user1.print_info();

    cout << endl
         << "testing 2......\n\n";
         
    User user2("Kim");
    user2.change_passwd();
    user2.set_email();
    user2.print_info();

    cout << endl;
    User::print_n();
}

int main() {
    test();
}

测试结果(已更换测试数据)

 

posted @ 2022-10-14 14:38  阑夜风华  阅读(17)  评论(0编辑  收藏  举报