首页 > 编程语言 >实验2 类和对象_基础编程2

实验2 类和对象_基础编程2

时间:2023-10-23 10:15:41浏览次数:42  
标签:const string 对象 double void 编程 int Complex 实验

实验任务1

方式1

main.cpp

 1 #include "t.h"
 2 
 3 // 测试
 4 void test() {
 5     cout << "T class info: " << T::doc << endl;
 6     cout << "T objects max_count: " << T::max_count << endl;
 7     T::disply_count();
 8     
 9     T t1;
10     t1.display();
11     t1.set_m1(42);
12     
13     T t2(t1);
14     t2.display();
15     
16     T t3{std::move(t1)};
17     t3.display();
18     t1.display();
19     
20     T::disply_count();
21 }
22  
23 // 主函数
24 int main() {
25     cout << "============测试类T============" << endl;
26     test();
27     cout << endl;
28     
29     cout << "============测试友元函数func()============" << endl;
30     func();
31 }
View Code

 t.cpp

 1 #include "t.h"
 2 
 3 // 类的static数据成员:类外初始化
 4 const string T::doc{"a simple class"};
 5 const int T::max_count = 99;
 6 int T::count = 0;
 7 
 8 // 类T的实现
 9 T::T(int x, int y): m1{x}, m2{y} {
10     ++count;
11     cout << "constructor called.\n";
12 } 
13 
14 T::T(const T &t): m1{t.m1}, m2{t.m2} {
15     ++count;
16     cout << "copy constructor called.\n";
17 } 
18 
19 T::T(T &&t): m1{t.m1}, m2{t.m2} {
20     ++count;
21     cout << "move constructor called.\n";
22 } 
23 
24 T::~T() {
25     --count;
26     cout << "destructor called.\n";
27 } 
28 
29 void T::set_m1(int x) {
30     m1 = x;
31 }
32  
33 int T::get_m1() const {
34     return m1;
35 } 
36 
37 int T::get_m2() const {
38     return m2;
39 } 
40 
41 void T::display() const {
42     cout << m1 << ", " << m2 << endl;
43 } 
44 
45 // 类方法
46 void T::disply_count() {
47     cout << "T objects: " << count << endl;
48 }
49 
50 // 函数func():实现
51 void func() {
52     T t1;
53     t1.set_m1(55);
54     t1.m2 = 77; // 虽然m2是私有成员,依然可以直接访问
55     t1.display();
56 }
View Code

 t.h

 1 #ifndef T_H
 2 #define T_H
 3 
 4 #include <iostream>
 5 #include <string>
 6 
 7 using namespace std;
 8 
 9 // 类T的声明
10 class T {
11 public:
12     T(int x = 0, int y = 0);         // 带有默认形值的构造函数
13     T(const T &t);                     // 复制构造函数
14     T(T &&t);                         // 移动构造函数
15     ~T();                             // 析构函数
16     
17     void set_m1(int x);             // 设置T类对象的数据成员m1
18     int get_m1() const;             // 获取T类对象的数据成员m1
19     int get_m2() const;             // 获取T类对象的数据成员m2
20     void display() const;             // 显示T类对象的信息
21     
22     friend void func();             // 声明func()为T类友元函数
23     
24 private:
25     int m1, m2;
26     
27 public:
28     static void disply_count();     // 类方法,显示当前T类对象数目
29     
30 public:
31     static const string doc;         // 类属性,用于描述T类
32     static const int max_count;     // 类属性,用于描述T类对象的上限
33     
34 private:
35     static int count;                 // 类属性,用于描述当前T类对象数目
36 };
37 
38 void func();                         // 普通函数声明
39 
40 #endif
View Code

运行测试结果

 方式2

t.hpp

 1 #pragma once
 2 
 3 #include <iostream>
 4 #include <string>
 5 
 6 using namespace std;
 7 
 8 // 类T的声明
 9 class T {
10 public:
11     T(int x = 0, int y = 0);     // 带有默认形值的构造函数
12     T(const T &t);                // 复制构造函数
13     T(T &&t);                     // 移动构造函数
14     ~T();                         // 析构函数
15     
16     void set_m1(int x);         // 设置T类对象的数据成员m1
17     int get_m1() const;            // 获取T类对象的数据成员m1
18     int get_m2() const;         // 获取T类对象的数据成员m2
19     void display() const;         // 显示T类对象的信息
20     
21     friend void func();         // 声明func()为T类友元函数
22     
23 private:
24     int m1, m2;
25     
26 public:
27     static void disply_count(); // 类方法,显示当前T类对象数目
28     
29 public:
30     static const string doc;     // 类属性,用于描述T类
31     static const int max_count; // 类属性,用于描述T类对象的上限
32 
33 private:
34     static int count;             // 类属性,用于描述当前T类对象数目
35 };
36 
37 // 类的static数据成员:类外初始化
38 const string T::doc{"a simple class"};
39 const int T::max_count = 99;
40 int T::count = 0;
41 
42 // 类T的实现
43 T::T(int x, int y): m1{x}, m2{y} {
44     ++count;
45     cout << "constructor called.\n";
46 } 
47 
48 T::T(const T &t): m1{t.m1}, m2{t.m2} {
49     ++count;
50     cout << "copy constructor called.\n";
51 } 
52 
53 T::T(T &&t): m1{t.m1}, m2{t.m2} {
54     ++count;
55     cout << "move constructor called.\n";
56 } 
57 
58 T::~T() {
59     --count;
60     cout << "destructor called.\n";
61 } 
62 
63 void T::set_m1(int x) {
64     m1 = x;
65 } 
66 
67 int T::get_m1() const {
68     return m1;
69 } 
70 
71 int T::get_m2() const {
72     return m2;
73 } 
74 
75 void T::display() const {
76     cout << m1 << ", " << m2 << endl;
77 } 
78 
79 // 类方法
80 void T::disply_count() {
81     cout << "T objects: " << count << endl;
82 }
83 
84 // 函数func():实现
85 void func() {
86     T t1;
87     t1.set_m1(55);
88     t1.m2 = 77;             // 虽然m2是私有成员,依然可以直接访问
89     t1.display();
90 }
View Code

main.cpp

 1 #include "t.hpp"
 2 
 3 // 测试
 4 void test() {
 5     cout << "T class info: " << T::doc << endl;
 6     cout << "T objects max_count: " << T::max_count << endl;
 7     T::disply_count();
 8     
 9     T t1;
10     t1.display();
11     t1.set_m1(42);
12     
13     T t2{t1};
14     t2.display();
15     
16     T t3{std::move(t1)};
17     t3.display();
18     t1.display();
19     
20     T::disply_count();
21 } 
22 
23 // 主函数
24 int main() {
25     cout << "============测试类T============" << endl;
26     test();
27     cout << endl;
28     
29     cout << "============测试友元函数func()============" << endl;
30     func();
31 }
View Code

运行测试结果

 实验任务2

employee.hpp

  1 #pragma once
  2 
  3 // Employee类的定义
  4 #include <iostream>
  5 #include <string>
  6 #include <iomanip>
  7 
  8 using std::string;
  9 using std::cout;
 10 using std::endl;
 11 using std::setfill;
 12 using std::setw;
 13 using std::left;
 14 using std::right;
 15 using std::to_string;
 16 
 17 struct Date {
 18     int year;
 19     int month;
 20     int day;
 21 };
 22 
 23 // Employee类的声明
 24 class Employee
 25 { 
 26 public:
 27     Employee();
 28     Employee(string name0, double salary0, int y, int m, int d = 1);
 29     void set_info(string name0, double salary0, int y, int m, int d = 1);
 30 // 设置雇员信息
 31     string get_name() const;                 // 获取雇员姓名
 32     double get_salary() const;                 // 获取雇员薪水
 33     void display_info() const;                 // 显示雇员信息
 34     void update_salary(double s);             // 更新雇员薪水
 35     void update_hire_date(int y, int m, int d); // 更新雇佣日期
 36     void raise_salary(double by_percent);     // 计算提薪加成
 37 
 38 public:
 39     static void display_count();             // 类方法,显示雇员总数
 40     
 41 private:
 42     string id;                                 // 雇员工号
 43     string name;                             // 雇员姓名
 44     double salary;                             // 雇员薪水
 45     Date hire_date;                         // 雇员雇佣日期
 46     
 47 public:
 48     static const string doc;                 // 类属性,用于描述类
 49     
 50 private:
 51     static int count;                         // 类属性,用于记录雇员总人数
 52     
 53 };
 54 const string Employee::doc {"a simple Employee class"};
 55 int Employee::count = 0;
 56 
 57 // 默认构造函数
 58 Employee::Employee(): id{ to_string(count+1) } {
 59     ++count;
 60 } 
 61 
 62 // 带参数的构造函数
 63 Employee::Employee(string name0, double salary0, int y, int m, int d):
 64         id{to_string(count+1)}, name{name0}, salary{salary0},
 65 hire_date{y, m, d} {
 66     ++count;
 67 } 
 68 
 69 // 设置员工信息
 70 void Employee::set_info(string name0, double salary0, int y, int m, int d)
 71 {
 72     name = name0;
 73     salary = salary0;
 74     hire_date.year = y;
 75     hire_date.month = m;
 76     hire_date.day = d;
 77 } 
 78 
 79 // 获取员工姓名
 80 string Employee::get_name() const {
 81     return name;
 82 } 
 83 
 84 // 获取员工薪水
 85 double Employee::get_salary() const {
 86     return salary;
 87 } 
 88 
 89 // 显示雇员信息
 90 void Employee::display_info() const {
 91     cout << left << setw(15) << "id: " << id << endl;
 92     cout << setw(15) << "name: " << name << endl;
 93     cout << setw(15) << "salary: " << salary << endl;
 94     cout << setw(15) << "hire_date: " << hire_date.year << "-";
 95     cout << std::right << setfill('0') << setw(2) << hire_date.month << "-"<< setw(2) << hire_date.day;
 96     
 97     cout << setfill(' '); // 恢复到默认空格填充
 98 } 
 99 
100 // 更新薪水
101 void Employee::update_salary(double s) {
102     salary = s;
103 } 
104 
105 // 更新雇佣日期
106 void Employee::update_hire_date(int y, int m, int d) {
107     hire_date.year = y;
108     hire_date.month = m;
109     hire_date.day = d;
110 } 
111 
112 // 雇员提薪加成
113 // by_percent是提升比例
114 void Employee::raise_salary(double by_percent) {
115     double raise = salary * by_percent / 100;
116     salary += raise;
117 } 
118 
119 // 类方法
120 // 显示雇员总数
121 void Employee::display_count() {
122     cout << "there are " << count << " employees\n";
123 }
View Code

 main.cpp

 1 #include "Employee.hpp"
 2 #include <iostream>
 3 
 4 // 测试:Employee类
 5 void test() {
 6     using std::cout;
 7     using std::endl;
 8     
 9     cout << Employee::doc << endl << endl;
10     
11     Employee employee1;
12     employee1.set_info("Sam", 30000, 2015, 1, 6);
13     employee1.update_hire_date(2019, 6, 30);
14     employee1.update_salary(35000);
15     employee1.display_info();
16     cout << endl << endl;
17     
18     Employee employee2{"Tony", 20000, 2023, 3, 16};
19     employee2.raise_salary(15); // 提成15%
20     employee2.display_info();
21     cout << endl << endl;
22     
23     Employee::display_count();
24     
25 } 
26 
27 int main() {
28     test();
29 }
View Code

 运行测试结果

实验任务3

t.hpp

 1 #pragma once
 2 
 3 #include <iostream>
 4 #include <cmath>
 5 
 6 using namespace std; 
 7 // 复数类Complex:定义
 8 // 待补足
 9 // ×××
10 class Complex{
11 private:
12     double real, imag;
13 public:
14     Complex(double real = 0, double imag = 0);
15     Complex(const Complex &c);
16     ~Complex();
17     
18     double get_real() const;
19     double get_imag() const;
20     void show() const;
21     void add(const Complex &c);
22     
23     friend Complex add(const Complex &c1, const Complex &c2);
24     friend bool is_equal(const Complex &c1, const Complex &c2);
25     friend double abs(const Complex &c);
26 };
27 
28 Complex::Complex(double real, double imag): real{real}, imag{imag} {
29 }
30 
31 Complex::Complex(const Complex &c): real{c.real}, imag{c.imag} {
32 }
33 
34 Complex::~Complex() {
35 }
36 
37 double Complex::get_real() const {
38     return real;
39 }
40 
41 double Complex::get_imag() const {
42     return imag;
43 }
44 
45 void Complex::show() const {
46     if(imag > 0)
47     cout << real << "+" << imag << "i" << endl;
48     if(imag < 0)
49     cout << real << imag << "i" << endl;
50     if(imag == 0)
51     cout << real << endl;
52 }
53 
54 void Complex::add(const Complex &c) {
55     real += c.real;
56     imag += c.imag;
57 }
58 
59 Complex add(const Complex &c1, const Complex &c2) {
60     Complex c;
61     c.real = c1.real + c2.real;
62     c.imag = c1.imag + c2.imag;
63     return c;
64 }
65 
66 bool is_equal(const Complex &c1, const Complex &c2) {
67     if(c1.real == c2.real && c1.imag == c2.imag)
68         return true;
69     else
70         return false;
71 }
72 
73 double abs(const Complex &c) {
74     return sqrt(c.real * c.real + c.imag * c.imag);
75 }
View Code

main.cpp

 1 #include "t.hpp"
 2 
 3 // 复数类Complex: 测试
 4 void test() {
 5     using namespace std;
 6     
 7     Complex c1(3, -4);
 8     const Complex c2(4.5);
 9     Complex c3(c1);
10     
11     cout << "c1 = ";
12     c1.show();
13     cout << endl;
14     
15     cout << "c2 = ";
16     c2.show();
17     cout << endl;
18     cout << "c2.imag = " << c2.get_imag() << endl;
19     
20     cout << "c3 = ";
21     c3.show();
22     cout << endl;
23     
24     cout << "abs(c1) = ";
25     cout << abs(c1) << endl;
26     
27     cout << boolalpha;
28     cout << "c1 == c3 : " << is_equal(c1, c3) << endl;
29     cout << "c1 == c2 : " << is_equal(c1, c2) << endl;
30     
31     Complex c4;
32     c4 = add(c1, c2);
33     cout << "c4 = c1 + c2 = ";
34     c4.show();
35     cout << endl;
36     
37     c1.add(c2);
38     cout << "c1 += c2, " << "c1 = ";
39     c1.show();
40     cout << endl;
41 }
42 
43 int main() {
44     test();
45 }
View Code

运行测试结果

实验任务4

user.hpp

 1 #pragma once
 2 
 3 #include <iostream>
 4 #include <string>
 5 #include <vector>
 6 
 7 using namespace std;
 8 
 9 class User
10 {
11 public:
12     User(string name, string password = "111111", string email = "        ");
13     ~User();
14 
15     void set_email(); 
16     void change_passwd();
17     void print_info();
18 
19 
20 private:
21     string name;
22     string password; 
23     string email; 
24 
25 private:
26     static int n; 
27     
28 public:
29     static void print_n();
30 };
31 
32 User::User(string name, string password, string email): name{name}, password{password}, email{email} {
33     ++n;
34 }
35 
36 User::~User() {
37     --n;
38 }
39 
40 void User::set_email() {
41     string email1;
42     cout << "Enter email address: ";
43     cin >> email1;
44     email = email1;
45     cout << "email is set successfully..." << endl;
46 }
47 
48 void User::change_passwd() {
49     string password1, password2;
50     int count = 0;
51     cout << "Enter old password: ";
52     cin >> password1;
53     while(password1 != password)
54     {
55         count++;
56         cout << "password input error. Please re-enter again: ";
57         cin >> password1;
58         if(count >= 2)
59         {
60             cout << "password input error. Please try after a while." << endl;
61             break;
62         }
63     }
64     if(password1 == password)
65     {
66         cout << "Enter new password: ";
67         cin >> password2;
68         password = password2;
69         cout << "new password is set successfully..." << endl;
70     }
71 }
72 
73 void User::print_info() {
74     string s (password.size(), '*');
75     cout << "name:    " << name << endl;
76     cout << "passwd:    " << s << endl;
77     cout << "email:    " << email << endl;
78 }
79 
80 int User::n = 0;
81 
82 void User::print_n() {
83     cout << "there are " << n << " users " << endl;
84 }
View Code

task4.cpp

 1 #include "User.hpp"
 2 #include <iostream>
 3 
 4 // 测试User类
 5 void test() {
 6     using std::cout;
 7     using std::endl;
 8     
 9     cout << "testing 1......\n";
10     User user1("Jonny", "92197", "[email protected]");
11     user1.print_info();
12     
13     cout << endl << "testing 2......\n\n";
14         
15     User user2("Leonard");
16     user2.print_info();
17     user2.change_passwd();
18     user2.set_email();
19     user2.print_info();
20     cout << endl;
21     User::print_n();
22 }
23 
24 int main(){
25     test();
26 }
View Code

运行测试结果

测试1

 测试2

实验任务5

 5_11.cpp

 1 #include "account.h"
 2 #include <iostream>
 3 
 4 using namespace std;
 5 
 6 int main() {
 7     SavingsAccount sa0(1, 21325302, 0.015);
 8     SavingsAccount sa1(1, 58320212, 0.015);
 9     
10     sa0.deposit(5, 5000);
11     sa1.deposit(25, 10000);
12     sa0.deposit(45, 5500);
13     sa1.withdraw(60, 4000);
14     sa0.settle(90);
15     sa1.settle(90);
16     sa0.show(); cout << endl;
17     sa1.show(); cout << endl;
18     cout << "Total: " << SavingsAccount::getTotal() << endl;
19     return 0;
20 
21 }
View Code

account.h

 1 #ifndef __ACCOUNT_H__
 2 #define __ACCOUNT_H__            
 3 
 4 class SavingsAccount {
 5 private:
 6     int id;
 7     double balance;
 8     double rate;
 9     int lastDate;
10     double accumulation;
11     static double total;
12     
13     void record(int date, double amount);
14     
15     double accumulate(int data) const {
16         return accumulation + balance * (data - lastDate);
17     }
18     
19 public:
20     SavingsAccount(int date, int id, double rate);
21     int getId() const {return id;}
22     double getBalance() const {return balance;}
23     double getRate() const {return rate;}
24     static double getTotal() {return total;}
25     void deposit(int date, double amount);
26     void withdraw(int date, double amount);
27     void settle(int date);
28     void show() const;
29 };
30 
31 #endif
View Code

account.cpp

 1 #include"account.h"
 2 #include<cmath>
 3 #include<iostream>
 4 
 5 using namespace std;
 6 
 7 double SavingsAccount::total = 0;
 8 SavingsAccount::SavingsAccount(int date, int id, double rate): id(id), balance(0), rate(rate), lastDate(date), accumulation(0) {
 9     cout << date << "\t#" << id << "is created" << endl;
10 }
11 
12 void SavingsAccount::record(int date, double amount) {
13     accumulation = accumulate(date);
14     lastDate = date;
15     amount = floor(amount * 100 + 0.5) / 100;
16     balance += amount;
17     total += amount;
18     cout << date << "\t#" << id << "\t" << amount << "\t" << balance << endl;
19 }
20 
21 void SavingsAccount::deposit(int date, double amount) {
22     record(date, amount);
23 }
24 
25 void SavingsAccount::withdraw(int date, double amount) {
26     if(amount > getBalance())
27         cout << "Error: not enough money" << endl;
28     else 
29         record(date, -amount); 
30 }
31 
32 void SavingsAccount::settle(int date) {
33     double interest = accumulate(date) * rate / 365;
34     if(interest != 0)
35         record(date, interest);
36     accumulation = 0; 
37 }
38 
39 void SavingsAccount::show() const {
40     cout << "#" << id << "\tBalance: " << balance;
41 }
View Code

运行测试结果

 

 

标签:const,string,对象,double,void,编程,int,Complex,实验
From: https://www.cnblogs.com/rssn/p/17767015.html

相关文章

  • 《安富莱嵌入式周报》第325期:开源可编程精密电阻仪,开源入耳式无线耳机,蓝牙Mesh固件更
    周报汇总地址:http://www.armbbs.cn/forum.php?mod=forumdisplay&fid=12&filter=typeid&typeid=104 更新一期视频,趁热打铁,下期CANopen专题视频将在下周发布BSP视频教程第27期:CANopen协议栈专题,实战方式系统了解NMT,PDO,SDO,时间戳,同步报文,紧急报文等(2023-10-17)https://www.armbb......
  • 实验二_OOP_张文瑞_202213260018
    1、实验一 程序源码:#include<iostream>#include<cmath>classComplex{private:doublereal,imag;public:Complex(doubler=0,doublei=0):real{r},imag{i}{};Complex(constComplex&c):real{c.real},im......
  • 实验2
    实验1源代码#include<stdio.h>#include<stdlib.h>#include<time.h>#defineN5#defineN1374#defineN2465intmain(){intnumber;inti;srand(time(0));//以当前系统时间作为随机种子for(i=0;i<N;++i){number=ran......
  • 实验2
    任务1#ifndefT_H#defineT_H#include<iostream>#include<string>usingnamespacestd;classT{public:T(intx=0,inty=0);T(constT&t);T(T&&t);~T();voidset_m1(intx);intget_m1()const;intget_m2()co......
  • 编程导航算法通关村第 1 关 | 链表
    1.前置知识补充内容引用:https://www.hello-algo.com/数据结构数据结构如同一副稳固而多样的框架。它为数据的有序组织提供了蓝图,使算法得以在此基础上生动起来。分类1.根据逻辑类型分类逻辑结构揭示了数据元素之间的逻辑关系。在数组和链表中,数据按照顺序依次排列,体现......
  • 实验2
    3.c.hpp#include<iostream>#include<cmath>classComplex{public:Complex(doubler=0,doublei=0);Complex(constComplex&c);doubleget_real()const;doubleget_imag()const;voidshow()const;voidadd(const......
  • 实验二 类和对象
    实验任务三1#include<iostream>2#include<cmath>34classComplex{56private:7doublereal;8doubleimag;910public:11Complex(doubler=0,doublei=0){12real=r;13imag=i;14}15......
  • 编程探索队团队介绍
    编程探索队队员介绍20211310何威烨(组长):我是个有条理、注重细节的人,具有创造性思维。我兴趣广泛,对软件开发、网络安全和前端或后端开发等方面都有粗略的了解。希望在接下来的合作中,我能不断解决复杂问题或挑战,不断学习并探索新的编程技术和工具。在项目中,在项目中,我希望参与需......
  • 实验二
    任务三:complex.hpp代码:#include<iostream>#include<cmath>classComplex{public:Complex(doubler=0,doublei=0){real=r;imag=i;};Complex(constComplex&c){real=c.real;imag=c.imag;};~Complex(){};doubleget_real()const{returnreal......
  • 实验2 类和对象
    实验任务3t.hpp#pragmaonce#include<iostream>#include<cmath>usingnamespacestd;classComplex{public:Complex();Complex(doublereal0);Complex(doublereal0,doubleimag0);Complex(constComplex&x);doub......