OPP实验三

任务一、

    

 

问题1

自定义了两个类,分别是window和button类,引用了标准库vector和string类

window---{string,button vector}

button----{string}

问题2

 这个函数可以使用inline来修饰,它的逻辑简单,使用可以优化程序

不可以使用const,内部的button和click都不是const类型

问题3

功能是创建一个有40个‘*’的字符串

任务二、

问题1、

第一行初始化v1,第二行深拷贝,第三行,改变v1第0个元素的值

问题2、

同上,但是v2被声明成了const,经过实验,表示v2不可更改,v2中的元素不能更改

 问题3、

39-43行代码,t1深拷贝v1的0号元素,打印v1的最后一个元素,t2同理,const我不加仍然可以运行

问题4、

vector中都是深拷贝,甚至二维的都是深拷贝

at()需要一个const成员函数作为接口,可以增加接口的丰富度(其他不太明白)

任务三

问题1、 

是深拷贝、

问题2、

改成int&就没用啦,因为返回的就无法继续操作了

如果去掉了可以假设一个场景:
   我们创建了一个const的对象,调用了这个const的at函数,但是可能会返回一个非const的解引用类型回来,

这个返回值是没有const的,那么我们的const就会被小贼篡改

 问题3、

我这个assign函数的目的是重置对象的元素并返回元素的地址,

当改变返回类型情况如下,返回值是一个vector对象,这个对象在函数调用结束时内存空间就会被清除,而我们操作的则是另一个地址下的拷贝而来的对象,

会造成一些浪费,如果有ptr数组的释放机制,是可以运行的,但是不改变更加好。

 

任务四

 

  1 #include <iostream>
  2 #include <cassert>
  3 
  4 using std::cin;
  5 using std::cout;
  6 using std::endl;
  7 
  8 // 类Matrix的声明
  9 class Matrix {
 10 public:
 11      int value=0;
 12     Matrix(int n, int m):lines(n), cols(m) 
 13     {
 14       ptr = new double[1000];
 15       for(int i = 0; i <lines;i++)
 16        for(int j = 0; j <cols;j++)
 17          {
 18              ptr[i*cols+j]=value;
 19          }
 20     }          // 构造函数,构造一个n*m的矩阵, 初始值为value
 21     Matrix(int n):lines(n), cols(n)
 22     {
 23       ptr = new double[1000];
 24 
 25       for(int i = 0; i <lines;i++)
 26        for(int j = 0; j <cols;j++)
 27          {
 28              ptr[i*cols+j]=value;
 29          }
 30     }          // 构造函数,构造一个n*m的矩阵, 初始值为value
 31                      // 构造函数,构造一个n*n的矩阵, 初始值为value
 32     Matrix(const Matrix &x):lines(x.get_lines()),cols(x.get_cols()) 
 33     {
 34       ptr = new double[1000];
 35       for(int i = 0; i <lines;i++)
 36        for(int j = 0; j <cols;j++)
 37          {
 38              ptr[i*cols+j]=x.ptr[i*cols+j];
 39          }
 40     }          // 构造函数,构造一个n*m的矩阵, 初始值为value
 41            // 复制构造函数, 使用已有的矩阵X构造
 42     ~Matrix()
 43     {
 44       delete[] ptr;
 45     }
 46 
 47     void set(const double *pvalue)
 48     {
 49       int count = 0;
 50       for(int i = 0; i < lines; i++)
 51        for(int j = 0; j < cols; j++)
 52          { 
 53              ptr[i*cols+j]=pvalue[count++];
 54          }
 55     }    // 用pvalue指向的连续内存块数据按行为矩阵赋值
 56     void clear(){
 57       for(int i = 0; i < lines; i++)
 58        for(int j = 0; j < cols; j++)
 59          {
 60              ptr[i*cols+j]=0;
 61              
 62          }
 63     }                           // 把矩阵对象的值置0
 64     
 65     const double& at(int i, int j) const
 66     {
 67       assert(i >= 0 && i < lines && j >= 0 && j < cols);
 68       return ptr[i*cols+j];  // 返回矩阵对象索引(i,j)的元素值const引用
 69     }   // 返回矩阵对象索引(i,j)的元素const引用
 70     double& at(int i, int j)
 71     {
 72       assert(i >= 0 && i < lines && j >= 0 && j < cols);
 73       return ptr[i*cols+j];  // 返回矩阵对象索引(i,j)的元素引用
 74     }               // 返回矩阵对象索引(i,j)的元素引用
 75     
 76     int get_lines() const 
 77     {
 78       return lines;  
 79     }                  // 返回矩阵对象行数
 80     int get_cols() const 
 81     {
 82       return cols;   
 83     }                  // 返回矩阵对象列数
 84 
 85     void display() const 
 86     {
 87       for(int i = 0; i < lines; i++) {
 88         for(int j = 0; j < cols; j++) {
 89             cout << at(i, j) << " ";
 90         }
 91         cout << "\n";
 92       }
 93       cout << "\n";  
 94     }                   // 按行显示矩阵对象元素值
 95 
 96 private:
 97     int lines;      // 矩阵对象内元素行数
 98     int cols;       // 矩阵对象内元素列数
 99     double *ptr;
100 };
101 
102 const int N = 1000;
103 
104 // 输出矩阵对象索引为index所在行的所有元素
105 void output(const Matrix &m, int index) {
106     assert(index >= 0 && index < m.get_lines());
107 
108     for(auto j = 0; j < m.get_cols(); ++j)
109         cout << m.at(index, j) << ", ";
110     cout << "\b\b \n";
111 }
112 
113 
114 void test1() {
115     double x[1000] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
116 
117     int n, m;
118     cout << "Enter n and m: ";
119     cin >> n >> m;
120 
121     Matrix m1(n, m);    // 创建矩阵对象m1, 大小n×m
122     m1.set(x);          // 用一维数组x的值按行为矩阵m1赋值
123 
124     Matrix m2(m, n);    // 创建矩阵对象m1, 大小m×n
125     m2.set(x);          // 用一维数组x的值按行为矩阵m1赋值
126 
127     Matrix m3(2);       // 创建一个2×2矩阵对象
128     m3.set(x);          // 用一维数组x的值按行为矩阵m4赋值
129 
130     cout << "矩阵对象m1: \n";   m1.display();  cout << endl;
131     cout << "矩阵对象m2: \n";   m2.display();  cout << endl;
132     cout << "矩阵对象m3: \n";   m3.display();  cout << endl;
133 }
134 
135 void test2() {
136     Matrix m1(2, 3);
137     m1.clear();
138     
139     const Matrix m2(m1);
140     m1.at(0, 0) = -999;
141 
142     cout << "m1.at(0, 0) = " << m1.at(0, 0) << endl;
143     cout << "m2.at(0, 0) = " << m2.at(0, 0) << endl;
144     cout << "矩阵对象m1第0行: "; output(m1, 0);
145     cout << "矩阵对象m2第0行: "; output(m2, 0);
146 }
147 
148 int main() {
149     cout << "测试1: \n";
150     test1();
151 
152     cout << "测试2: \n";
153     test2();
154 }

 

任务五

 

  1 #include <iostream>
  2 #include <vector>
  3 #include <string>
  4 
  5 using std::cin;
  6 using std::cout;
  7 using std::endl;
  8 using std::vector;
  9 using std::string;
 10 
 11 class User{
 12     string name;
 13     string password;
 14     string email;
 15     public:
 16       User(string Name, string Password="123456",string Email=""):name(Name), password(Password), email(Email)
 17       {
 18          if (Email.empty())
 19          {
 20             if(!email.find("@"))
 21              {
 22                 cout << "Invalid email address." << endl;
 23                
 24              }
 25          }
 26       }
 27       void set_email()
 28       {
 29          cout<<"Setting email: ";
 30        while(1){
 31          
 32          string Email;
 33          cin>>Email;
 34          if (!Email.empty())
 35         { 
 36             if(Email.find("@")==-1)
 37              {
 38                 cout << "Invalid email address." << endl;
 39                 cout << "Please enter again: ";
 40                 continue;
 41              }
 42              else
 43              {
 44                email=Email;
 45                cout<<"successfully set email."<<endl;
 46                break;
 47              }
 48          }
 49          else{
 50             cout << "Email address is not provided." << endl;
 51             cout << "Please enter again:";
 52             continue;
 53           }
 54 
 55        }
 56       }
 57    void change_password()
 58    {
 59 
 60       int cnt=3;
 61       while(cnt--){
 62       cout << "Enter current password: ";
 63       string nowpassword;
 64       cin>>nowpassword;
 65       
 66       if(nowpassword==password)
 67       {
 68          cout << "Enter new password: ";
 69          string newPassword;
 70          cin>>newPassword;
 71          password=newPassword;
 72          cout << "Password changed successfully." << endl;
 73          return;
 74       }
 75       else
 76       {
 77          cout << "Invalid password." << endl;
 78          
 79       }
 80       }
 81 
 82       cout<<"Pleas wait sometime to enter again"<<endl;
 83    }
 84 
 85    void display()
 86    {
 87       cout << "Name: " << name << endl;
 88       string s(password.size(),'*');
 89       cout << "Password: " << s << endl;
 90       cout << "Email: " << (!email.empty()? email : "No email provided") << endl;
 91    }
 92 };
 93 
 94 void test() {
 95     vector<User> user_lst;
 96 
 97     User u1("Alice", "2024113", "Alice@hotmail.com");
 98     user_lst.push_back(u1);
 99     cout << endl;
100 
101     User u2("Bob");
102     u2.set_email();
103     u2.change_password();
104     user_lst.push_back(u2);
105     cout << endl;
106 
107     User u3("Hellen");
108     u3.set_email();
109     u3.change_password();
110     user_lst.push_back(u3);
111     cout << endl;
112 
113     cout << "There are " << user_lst.size() << " users. they are: " << endl;
114     for(auto &i: user_lst) {
115         i.display();
116         cout << endl;
117     }
118 }
119 
120 int main() {
121     test();
122 }

任务六、

改进:使用string类来存储账号信息,用数组存放账户信息,封装了一个时间类来单独存储时间信息

,增加了一些函数拓展了一些功能,deposit,withdrew,和settle函数

还缺少安全加密功能:

     1、不允许同一个id出现

     2、存取,查看等时候都要输入正确密码

   3、 在存在被盗风险时的临时冻结

  4、更改账户基本信息

其他:

  1、交易转账功能

 

posted @ 2024-11-04 17:27  Mthe  阅读(4)  评论(0编辑  收藏  举报