实验2

一、实验目的

  1. 能够使用C++语法规则正确定义、实现、测试类
  2. 能够使用C++语法规则正确创建对象,并基于对象编程
  3. 知道类的static成员用于解决什么问题场景,会正确使用c++语法规则实现和访问static成员
  4. 知道友元机制用于解决什么问题场景,会正确使用c++语法规则实现和使用友元函数、友元类
  5. 知道const限定对象、引用、类成员用于解决什么问题场景,能正确、合理使用
  6. 对于规模较大的程序,会用多文件方式组织代码
  7. 体会面向对象编程在解决问题时的思维方式

二、实验内容

实验任务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; // abs()是标准库中数学函数,对复数进行取模 

    cout << boolalpha;  // 设置bool型值以true/false方式输出
    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>
// 模板函数
// 对满足特定条件的序列类型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)
    std::cout << *p << ", ";
    std::cout << "\b\b \n";
}
int main() {
    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

程序代码

#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;
};
// Employee类的声明
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 << 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;
}
// 雇员提薪加成
// by_percent是提升比例
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";
}



#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); // 提成15%
    employee2.display_info();
    cout << endl << endl;
    Employee::display_count();
}
int main() {
    test();
}

结果截图

实验任务4

程序代码

"Complex.hpp"
#pragma once
#include<iostream>
#include<iomanip>
#include<math.h>

using std::cout;
using std::endl; 
class Complex
{
private:
    double x,y;
public:
    Complex(double x0, double y0);
    Complex(const Complex& t);
    ~Complex() = default;

    double get_real() const;
    double get_imag() const;
    void show() const;
    void add(Complex c1);

friend Complex add(Complex c1, Complex c2);
friend bool is_equal(Complex c1, Complex c2);
friend double abs(Complex c1);
};

Complex::Complex(double x0 = 0, double y0 = 0): x{x0}, y{y0}{}

Complex::Complex(const Complex& t):x{t.x}, y{t.y}{}

double Complex::get_real() const
{
    return x;
} 

double Complex::get_imag() const
{
    return y;
}

void Complex::show() const
{
    if(y > 0)
    {
        cout << x << " + " << abs(y) << "i";
    }
    else if (y < 0)
    {
        cout << x << " - " << abs(y) << "i";
    }
    else 
        cout << x;
}

void Complex::add(Complex c1)
{
    x += c1.x;
    y += c1.y;
}

Complex add(Complex c1, Complex c2)
{
    double real = c1.x + c2.x;
    double imag = c1.y + c2.y;
    return Complex(real, imag);
}

bool is_equal(Complex c1, Complex c2)
{
    if (c1.x == c2.x && c1.y == c2.y)
    {
        return true;
    }
    else
    {
        return false;
    }
    
}

double abs(Complex c1)
{
    return sqrt(c1.x * c1.x + c1.y * c1.y);
}

task2-4.cpp
#include "Complex.hpp"
#include <iostream>
// 类测试
void test() {
    using namespace std;
    Complex c1(3, -4);
    const Complex c2(4.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
#pragma once
#include<iostream>
#include<iomanip>
#include<string>

using namespace std;

class User
{
private:
    string name, passwd, email;
public:
    User(string nm, string pw, string em);
    ~User() = default;

    void set_email();
    void change_passwd();
    void print_info();
private:
    static int n;
public:
    void static print_n();
};

int User::n = 0;

User::User(string nm, string pw = "111111", string em = ""): name{nm}, passwd{pw}, email{em}
{
    n++;
}

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

void User::change_passwd()
{
    cout << "Enter old password: ";
    string s1;

    int a = 3;
    while(a)
    {
        cin >> s1;
        if(passwd == s1)
        {
            cout << "Enter new passwd: ";
            cin >> passwd;
            cout << "new passwd is set successfully..." << endl;
            break;
        }
        else
        {
            cout << "password input error. ";
            a--;
        }
        if (a)
        {
            cout << "Please re-enter again: ";
            continue;
        }
        else
        {
            cout << "Please try after a while. " << endl;
        }
        
    }
}
void User::print_info()
{
    string s2(passwd.length(), '*');
    cout << setfill(' ') << setw(8) << left << "name: " << name << endl
         << setfill(' ') << setw(8) << left << "passwd: " << s2 << endl
         << setfill(' ') << setw(8) << left << "email: " << email << endl;
}
void User::print_n()
{
    cout << "there are " << n << " users. ";
}

task5.cpp
#include "User.hpp"
#include <iostream>
// 测试User类
void test() {
    using std::cout;
    using std::endl;
    cout << "testing 1......\n";
    User user1("Jonny", "92197", "xyz@hotmail.com");
    user1.print_info();
    cout << endl
    << "testing 2......\n\n";
    User user2("Leonard");
    user2.change_passwd();
    user2.set_email();
    user2.print_info();
    cout << endl;
    User::print_n();
}
int main() {
    test();
}

结果截图

posted @ 2022-10-18 22:15  civilwen  阅读(26)  评论(0)    收藏  举报