实验目的
1. 掌握c++中函数的声明、定义、调用和参数传递方式
2. 掌握c++中带有默认形参值的函数声明和定义方法
3. 理解函数重载,掌握c++中函数重载的实现方式
4. 理解函数模板,掌握c++中函数模板的简单使用
5. 理解面向对象的抽象和封装,掌握c++中类的定义、实现和使用方法。
实验准备
1. 函数的声明、定义、调用、参数传递方法
2. 带有默认形参值的函数
3. 函数重载
4. 函数模板(9.1.1节 + 9.3节) 其中,9.3节,理解3个常用的排序算法和两个常用的查找算法。
5. 类的定义、实现和使用方法
实验内容 &结论
1.编写重载函数add(),实现对int型,double型,Complex型数据的加法。在main()函数中定义不同类型 数据,调用测试。
1 #include<iostream> 2 using namespace std; 3 struct Complex { 4 double real; 5 double imaginary; 6 }; 7 int add(int a, int b) { 8 return a + b; 9 } 10 double add(double a, double b) { 11 return a + b; 12 } 13 Complex add(Complex a, Complex b) { 14 Complex c; 15 c.real = a.real + b.real; 16 c.imaginary = a.imaginary + b.imaginary; 17 return c; 18 } 19 int main() { 20 int i1, i2; 21 double d1, d2; 22 Complex c1, c2; 23 cout << "Please input two numbers (int): "; 24 cin >> i1 >> i2; 25 cout << add(i1, i2) << endl; 26 cout << "Please input two numbers (double): "; 27 cin >> d1 >> d2; 28 cout << add(d1, d2) << endl; 29 cout << "Please input two numbers (Complex): "; 30 cin >> c1.real >> c1.imaginary >> c2.real >> c2.imaginary; 31 cout << add(c1, c2).real << "+" << add(c1, c2).imaginary <<"i"<< endl; 32 return 0; 33 }
2.编写实现快速排序函数模板,并在main()函数中,定义不同类型数据,调用测试。
1 #ifndef _Input() 2 #define _Input() 3 #include<iostream> 4 using namespace std; 5 template<class T> 6 void input(T s[], int n) 7 { 8 int i; 9 for (i = 0; i < n; i++) 10 cin >> s[i]; 11 } 12 #endif // !_Input()
1 #ifndef _Output() 2 #define _Output() 3 #include<iostream> 4 #include<iomanip> 5 using namespace std; 6 template<class T> 7 void output(T s[], int n) 8 { 9 cout << "number after sort:"<<endl; 10 int i; 11 for (i = 0; i < n; i++) 12 cout << setw(5) << s[i]; 13 cout << endl; 14 } 15 #endif // !_Output()
1 #ifndef _Sort() 2 #define _Sort() 3 using namespace std; 4 template<class T> 5 int sort(T s[], int first, int last) 6 { 7 int i, j; 8 T x, e; 9 i = first, j = last, x = s[(first + last) / 2]; 10 while (i <= j) 11 { 12 while (i < j && s[j] > x) 13 j--; 14 while (i < j && s[i] < x) 15 i++; 16 if (i < j) 17 { 18 e = s[i]; s[i] = s[j]; s[j] = e; 19 } 20 else return j; 21 } 22 } 23 #endif // !_Quicksort()
1 #ifndef _Quicksort() 2 #define _Quicksort() 3 #include"Sort.h" 4 using namespace std; 5 template<class T> 6 void quicksort(T s[], int low, int high) 7 { 8 int p; 9 if (low < high) { 10 p = sort(s, low, high); 11 quicksort(s, low, p); 12 quicksort(s, p + 1, high); 13 } 14 else return; 15 } 16 #endif // !_Quicksort()
1 #include<iostream> 2 #include"Quicksort.h" 3 #include"Output.h" 4 #include"Input.h" 5 int main() 6 { 7 int a[50]; 8 double b[50]; 9 int n; 10 cout << "Please input numbers' quantity:"; 11 cin >> n; 12 cout << "Please input numbers (int):" << endl; 13 input(a, n); 14 cout << "Please input numbers (double):" << endl; 15 input(b, n); 16 quicksort(a, 0, n-1); 17 output(a, n); 18 cout << endl; 19 quicksort(b, 0, n-1); 20 output(b, n); 21 return 0; 22 }
3.设计并实现一个用户类User,并在主函数中使用和测试这个类。具体要求如下:
- 每一个用户有用户名(name), 密码(passwd),联系邮箱(email)三个属性。
- 支持设置用户信息setInfo()。允许设置信息时密码默认为6个1,联系邮箱默认为空串。
- 支持打印用户信息printInfo()。打印用户名、密码、联系邮箱。其中,密码以6个*方式显示。
- 支持修改密码changePasswd(),。在修改密码前,要求先输入旧密码,验证无误后,才允许修改。如果输入旧密码时,连续三次输入错误,则提示用户稍后再试,暂时退出修改密码程序。
- 在main()函数中创建User类实例,测试User类的各项操作(设置用户信息,修改密码,打印用户信息)。
1 #include <iostream> 2 #include <string> 3 using namespace std; 4 // User类的声明 5 class User { 6 public: 7 User(string yname, string ypasswd, string yemail); 8 User() { 9 name = ""; 10 passwd = "111111"; 11 email = ""; 12 } 13 void setInfo(string yname = "", string ypasswd = "111111", string yemail = "");// 声明带有默认形参值的成员函数setInfo() 14 // 密码默认值为6个1 15 // 邮箱默认值为空串 16 void changePasswd(); 17 void printInfo(); 18 private: 19 string name; 20 string passwd; 21 string email; 22 }; 23 24 // User类的实现 25 // 成员函数setInfo()的实现 26 // 功能:设置用户名(name), 密码(passwd), 联系邮箱(email) 27 // 补足代码 28 // ××× 29 void User::setInfo(string yname, string ypasswd, string yemail) { 30 cout << "Please enter your name:" << endl; 31 if (name == " ") cin >> yname; 32 name = yname; 33 cout << "Please enter your email:" << endl; 34 if (email == " ") cin >> yemail; 35 email = yemail; 36 cout << "Please enter your password:" << endl; 37 if (passwd == " ") cin >> ypasswd; 38 passwd = ypasswd; 39 } 40 41 42 43 44 // 成员函数changePasswd()的实现 45 // 功能:修改密码 46 // 要求:在修改密码前,要求先输入旧密码,验证无误后,才允许修改。 47 // 如果输入旧密码时,连续三次输入错误,则提示用户稍后再试,暂时退出修改密码程序。 48 // 补足代码 49 // ××× 50 void User::changePasswd() { 51 string P,N1,N2; 52 int i; 53 cout << "Please enter the oldpassword: "; 54 for (i = 0; i < 3; i++) { 55 cin >> P; 56 if (passwd == P) { 57 while (1) 58 { 59 cout << "Please enter the newpassword: "; 60 cin >> N1; 61 cout << "Please enter the newpassword again: "; 62 cin >> N2; 63 if (N1 == N2) { 64 passwd = P; break; 65 } 66 else { 67 cout << "Two passworld is difficult!Please try again!" << endl; continue; 68 } 69 } 70 } 71 else{ 72 cout << "Your password is wrong!" << endl; 73 cout << "Please enter the password: "; 74 continue; 75 } 76 } 77 if (i>3) 78 cout << "You have wrong 3 times!Please try again in a few minutes." << endl; 79 } 80 81 82 83 84 // 成员函数printInfo()的实现 85 // 功能:打印用户信息 86 // 要求: 密码以6个*显示 87 // 补足代码 88 // ××× 89 void User::printInfo() { 90 cout << "Name: "<< name << endl; 91 cout << "Password: "<< "******" << endl; 92 cout << "Email: "<< email << endl; 93 }
1 #include<iostream> 2 #include<iomanip> 3 #include"function.h" 4 // 在主函数中测试User类 5 // 用User类创建对象,测试类的功能 6 int main() { 7 cout << "testing 1......" << endl; 8 // 测试1 9 User user1; 10 user1.setInfo("Leonard"); 11 user1.printInfo(); 12 user1.changePasswd(); 13 user1.printInfo(); 14 15 cout << endl << "testing 2......" << endl << endl; 16 // 测试2 17 User user2; 18 user2.setInfo("Jonny", "92197", "xyz@hotmail.com"); 19 user2.printInfo(); 20 21 return 0; 22 }
实验总结与体会
1.快速排序做的很难,如果不查一些资料,自己写总是Stack overflow。
2.时间真的很重要没有大块的空闲时间,写程序断断续续的其实挺麻烦的。
3.写快速排序的时候真的崩溃了,总是有异常,真的很想把别人的复制了直接上传,当然最后还是靠百科上的模板做了出来,过程很艰难,百科上的代码不是c++的代码(估计时Java的),反正放弃和坚持就 差了那么一点。之后写的差不多了去看了下其他人的,感觉方法基本一致,可是我调试的时候就是有问题,又是一波很痛苦的挣扎,最后的结果是我直接采用了百科上的模板,稍作修改。我通过自己按语句运算大致知道是什么地方的问题但是不知道怎么解决,最后是做出来了,不知之后还会不会有问题。
评分博客
https://www.cnblogs.com/agsjg/p/10590977.html
https://www.cnblogs.com/wyf-blogs/p/10587306.html
https://www.cnblogs.com/cwj0505/p/10588248.html
大家的代码差别还是很大的,很多时候要运行了才能发现很多很难看出来的错误,我三条留言的风格也是很不同呢。
博客园的评论还是不太会用,排版上面的问题还是蛮无语的,巨丑。。。>︿<
最后不知道自己评论的对不对,还望被评哒谅解啦!