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、交易转账功能