实验2:函数重载、函数模板、简单类的定义和实现

实验目的 


 

 

1. 掌握c++中函数的声明、定义、调用和参数传递方式

2. 掌握c++中带有默认形参值的函数声明和定义方法

3. 理解函数重载,掌握c++中函数重载的实现方式

4. 理解函数模板,掌握c++中函数模板的简单使用

5. 理解面向对象的抽象和封装,掌握c++中类的定义、实现和使用方法

实验准备


 

 

1. 函数的声明、定义、调用、参数传递方法

2. 带有默认形参值的函数

3. 函数重载

4. 函数模板(9.1.1节 + 9.3节) 其中,9.3节,理解3个常用的排序算法和两个常用的查找算法

5. 类的定义、实现和使用方法

编程内容


 

函数重载编程练习

编写重载函数add(),实现对int型,double型,Complex型数据的加法。在main()函数中定义不同类型 数据,调用测试。(附程序框架,见本文档附1)

函数模板编程练习

编写实现快速排序函数模板,并在main()函数中,定义不同类型数据,调用测试。(算法可参考这里, 内有排序示意图及算法逻辑)

类的定义、实现和使用编程练习

计并实现一个用户类User,并在主函数中使用和测试这个类。具体要求如下: 每一个用户有用户名(name), 密码(passwd),联系邮箱(email)三个属性。 支持设置用户信息setInfo()。允许设置信息时密码默认为6个1,联系邮箱默认为空串。 支持打印用户信息printInfo()。打印用户名、密码、联系邮箱。其中,密码以6个*方式显示。 支持修改密码changePasswd(),。在修改密码前,要求先输入旧密码,验证无误后,才允许修改。 如果输入旧密码时,连续三次输入错误,则提示用户稍后再试,暂时退出修改密码程序。 在main()函数中创建User类实例,测试User类的各项操作(设置用户信息,修改密码,打印用户信 息)

User类功能的完善及拓展丰富(===选做===)

自行设计。在前述内容的基础上,对代码和功能做完善,使其更符合实际应用场景。比如: 支持修改邮箱;用户设置邮箱时对邮箱地址合法性的检测提示(比如是否包含@) 用户更改密码时,当用户输入旧密码和新密码时,屏幕上均以星号代替,而不会显示用户实际 输入的密码;设置密码时对密码的长度、合法性进行有效性校验,等等 。。。

实验结论

 


 

1.重载函数add()

Code:

 

 1 //Add()函数重载
 2 #include<iostream> 
 3 #include<cstdlib>
 4 using namespace std;
 5 struct Complex
 6 {
 7     double real;
 8     double imaginary;
 9 };
10 
11 int add(int, int);
12 double add(double, double);
13 Complex add(Complex, Complex);
14 int main() {
15 
16     int x, y;
17     cout << "Enter two integers:";
18     cin >> x >> y;
19     cout << "Their sum is:" << add(x, y) << endl;
20     //双精度型
21     double m, n;
22     cout << "Enter two decimals:";
23     cin >> m >> n;
24     cout << "Their sum is:" << add(m, n) << endl;
25     //复数
26     Complex k, l;;
27     cout << "Enter two plurals`real part:";
28     cin >> k.real >> l.real;
29     cout << "Enter two plurals`imaginary part:";
30     cin >> k.imaginary >> l.imaginary;
31     cout << "Their sum is:" << add(k, l).real << "+" << add(k, l).imaginary << "i" << endl;
32     system("pause");
33     return 0;
34 }
35 //整型数
36 int add(int a, int b)
37 {
38     int sum;
39     sum = a + b;
40     return sum;
41 }
42 //双精度型数
43 double add(double a, double b)
44 {
45     double sum;
46     sum = a + b;
47     return sum;
48 }
49 //复数
50 Complex add(Complex a, Complex b)
51 {
52     Complex sum;
53     sum.real = a.real + b.real;
54     sum.imaginary = a.imaginary + b.imaginary;
55     return sum;
56 }

 

Screenshot:

 

2.快速排序函数模板

main函数:

 

 1 #include<iostream>
 2 #include<cstdlib>
 3 #include<ctime>
 4 #include"quicksort.h"
 5 #include"output.h"
 6 using namespace std;
 7 int main()
 8 {
 9     //int
10     int list[50],i,a;
11     cout << "Enter the number(integer) you want to sort(1-50):";
12     cin >> i;
13     cout << "Enter the number:"<<endl;
14     for (a = 0; a <i; a++)
15     {
16         cin >>list[a];
17     }
18     cout << "The list(integer) before sort is:" << endl;
19     output(list, i);
20     cout << "The list(integer) after sorted is:" << endl;
21     quicksort(list, 0, i - 1);
22     output(list, i );
23     //double
24     double listd[50],c;
25     cout << "Enter the number(decimal) you want to sort(1-50):";
26     cin >> i;
27     cout << "Enter the number:" << endl;
28     for (a = 0; a <i; a++)
29     {
30         cin >> listd[a];
31     }
32     cout << "The list(decimal) before sort is:" << endl;
33     output(listd, i);
34     quicksort(listd, 0, i - 1);
35     cout << "The list(decimal) after sorted is:" << endl;
36     output(listd, i);
37     system("pause");
38     return 0;
39 }

 

quicksort函数:(PS:完全自己想的,比起网上的十分不精简。以后也要优化下结构)

 

 1 #ifndef QUICKSORT_H
 2 #define QUICKSORT_H
 3 template<class T>
 4 void quicksort(T list[], int lo, int hi)
 5 {
 6     if (lo < hi)
 7     {
 8         T x = list[lo];
 9         int a, b = 0, c = 0, jud = 0, k = lo;
10         for (a = 1; a <= hi - lo; a++)
11         {
12             if (jud == 0)
13             {
14                 if (list[hi - b] < x)
15                 {
16                     list[k] = list[hi - b];
17                     list[hi - b] = x;
18                     k = hi - b;
19                     b++;
20                     jud = 1;
21                     continue;
22                 }
23                 else
24                 {
25                     b++;
26                     continue;
27                 }
28             }
29             else
30             {
31                 if (list[lo + c + 1] > x)
32                 {
33                     list[k] = list[lo + c + 1];
34                     list[lo + c + 1] = x;
35                     k = lo + c + 1;
36                     c++;
37                     jud = 0;
38                     continue;
39                 }
40                 else
41                 {
42                     c++;
43                     continue;
44                 }
45             }
46         }
47         quicksort(list, lo, k-1);
48         quicksort(list, k+1, hi);
49     }
50 }
51 #endif

 

output函数:

 

 1 #ifndef OUTPUT_H
 2 #define OUTPUT_H
 3 #include<iostream>
 4 #include<iomanip>
 5 using namespace std;
 6 template<class T>
 7 void output(T list[], int hi)
 8 {
 9     int x,i=0;
10     for (x = 0; x < hi; x++)
11     {
12         i++;
13         cout <<setw(5)<< list[x] << " ";
14         if (i % 6 == 0&&x!=hi-1)
15             cout << endl;
16     }
17     cout <<endl;
18 }
19 #endif

 

Screensort;

 

3:用户类User

Code(测试):

 

  1 #include <iostream> 
  2 #include <string> 
  3 #include<cstdlib>
  4 #include<conio.h>
  5 using namespace std;
  6 // User类的声明 
  7 class User
  8 {
  9 public:
 10     void setInfo(string newn, string newp = "111111", string newe = "");
 11     void changePasswd();
 12     void printInfo();
 13     void changeemail();
 14 
 15 private:
 16     string name;
 17     string passwd;
 18     string email;
 19 };
 20 //输入字符串,显示*
 21 string enter()
 22 {
 23     char ch;
 24     string outer;
 25     while ((ch = _getch())!='\r')
 26     {
 27         outer += ch;
 28         cout << "*";
 29     }
 30     cout << endl;
 31     return outer;
 32 }
 33 //初始化信息
 34 void User::setInfo(string newn, string newp/*="111111"*/, string newe/*=""*/)
 35 {
 36     name = newn;
 37     passwd = newp;
 38     email = newe;
 39 }
 40 
 41 //修改密码
 42 void User::changePasswd()
 43 {
 44     cout << "Enter the old passwd:";
 45     string outer;
 46     int jud = 1;
 47     outer = enter();
 48     while (outer != passwd)
 49     {
 50         cout << "Passwd input error,please re-enter again:";
 51         outer = enter();
 52         jud++;
 53         if (jud == 3)
 54             break;
 55     }
 56     if (outer != passwd)
 57         cout << "Please try after a while.\n";
 58     else
 59     {
 60         cout << "Please enter the new passwd:";
 61         passwd = enter();
 62         do
 63         {
 64             cout << "Please enter the new passwd again:";
 65             outer=enter();
 66             if (outer != passwd)
 67             {
 68                 cout << "Passwd input error,please change the new passwd:";
 69                 passwd = enter();
 70             }
 71             else
 72                 break;
 73         } while (true);
 74         cout << "Finish changepasswd." << endl;
 75     }
 76 }
 77 //修改邮箱
 78 void User::changeemail()
 79 {
 80     string outer,ch;
 81     cout << "Enter the new email:";
 82     cin >> outer;
 83     int a,b,jud;
 84     do
 85     {
 86         jud = 0;
 87         b = outer.length();
 88         for (a = 0; a < b; a++)
 89             if (outer.substr(a, 1) == "@")
 90                 jud++;
 91         if (jud == 0)
 92         {
 93             cout << "Wrong format,please enter again:";
 94             cin >> outer;
 95         }
 96         else
 97             cout << "Finish change email." << endl;
 98     } while (jud == 0);
 99     email = outer;
100 }
101 //打印至屏幕
102 void User::printInfo()
103 {
104     int y,x = passwd.length();
105     string outerx;
106     for (y = 1; y <= x; y++)
107         outerx += '*';
108     cout << "name:" << name << endl;
109     cout << "passwd:" << outerx<< endl;
110     cout << "email:" << email << endl;
111 }
112 int main()
113 {
114         cout << "testing 1......" << endl;
115         // 测试1 
116         User user1;
117         user1.setInfo("Leonard");
118         user1.printInfo();
119         user1.changePasswd();
120         user1.printInfo();
121         cout << endl << "testing 2......" << endl << endl;
122         // 测试2
123         User user2;
124         user2.setInfo("Jonny", "92197", "xyz@hotmail.com");
125         user2.printInfo();
126         system("pause");
127     return 0;
128 }

 

Screensort:

 

功能完善

Code:

 

  1 #include <iostream> 
  2 #include <string> 
  3 #include<cstdlib>
  4 #include<conio.h>
  5 using namespace std;
  6 // User类的声明 
  7 class User
  8 {
  9 public:
 10     void setInfo(string newn, string newp = "111111", string newe = "");
 11     void changePasswd();
 12     void printInfo();
 13     void changeemail();
 14 
 15 private:
 16     string name;
 17     string passwd;
 18     string email;
 19 };
 20 //输入字符串,显示*
 21 string enter()
 22 {
 23     char ch;
 24     string outer;
 25     while ((ch = _getch())!='\r')
 26     {
 27         outer += ch;
 28         cout << "*";
 29     }
 30     cout << endl;
 31     return outer;
 32 }
 33 //初始化信息
 34 void User::setInfo(string newn, string newp/*="111111"*/, string newe/*=""*/)
 35 {
 36     name = newn;
 37     passwd = newp;
 38     email = newe;
 39 }
 40 
 41 //修改密码
 42 void User::changePasswd()
 43 {
 44     cout << "Enter the old passwd:";
 45     string outer;
 46     int jud = 1;
 47     outer = enter();
 48     while (outer != passwd)
 49     {
 50         cout << "Passwd input error,please re-enter again:";
 51         outer = enter();
 52         jud++;
 53         if (jud == 3)
 54             break;
 55     }
 56     if (outer != passwd)
 57         cout << "Please try after a while.\n";
 58     else
 59     {
 60         cout << "Please enter the new passwd:";
 61         passwd = enter();
 62         do
 63         {
 64             cout << "Please enter the new passwd again:";
 65             outer=enter();
 66             if (outer != passwd)
 67             {
 68                 cout << "Passwd input error,please change the new passwd:";
 69                 passwd = enter();
 70             }
 71             else
 72                 break;
 73         } while (true);
 74         cout << "Finish changepasswd." << endl;
 75     }
 76 }
 77 //修改邮箱
 78 void User::changeemail()
 79 {
 80     string outer,ch;
 81     cout << "Enter the new email:";
 82     cin >> outer;
 83     int a,b,jud;
 84     do
 85     {
 86         jud = 0;
 87         b = outer.length();
 88         for (a = 0; a < b; a++)
 89             if (outer.substr(a, 1) == "@")
 90                 jud++;
 91         if (jud == 0)
 92         {
 93             cout << "Wrong format,please enter again:";
 94             cin >> outer;
 95         }
 96         else
 97             cout << "Finish change email." << endl;
 98     } while (jud == 0);
 99     email = outer;
100 }
101 //打印至屏幕
102 void User::printInfo()
103 {
104     int y,x = passwd.length();
105     string outerx;
106     for (y = 1; y <= x; y++)
107         outerx += '*';
108     cout << "name:" << name << endl;
109     cout << "passwd:" << outerx<< endl;
110     cout << "email:" << email << endl;
111 }
112 int main()
113 {
114     User you;
115     //输入用户名
116     string name;
117     cout << "Enter your name(password:111111):";
118     cin >> name;
119     you.setInfo(name);
120     //操作列表
121     cout << "Choose your operation" << endl;
122     cout << "1--change password"<<endl;
123     cout << "2-change email"<<endl;
124     cout << "3-print on the screen" << endl;
125     cout << "0-EXIT" << endl;
126     int x=1;
127     while (x!=0)
128     {
129         cout << "Your operation is:";
130         cin >> x;
131         switch (x)
132         {
133         case 1:
134             you.changePasswd();
135             continue;
136         case 2:
137             you.changeemail();
138             continue;
139         case 3:
140             you.printInfo();
141             continue;
142         default:
143             cout<<"Wrong operation,please enter again."<<endl;
144         }
145     }
146     system("pause");
147     return 0;
148 }

 

 

Screensort:

 

 

实验总结与体会

 


 

1.写预处理命令时记得大写

2.写快速排序时注意数组从零开始

3.实验一中单独建立一个复数类会更方便计算

4.在一定限度内,快速排序速度最快,但当数据过大时,就会占用过多内存,这时用其他的排序法会更好

5.实验三中单独建立一个声明User类的头文件会使代码可读性更高,更加方便查找bug并修改

6.函数重载减少了函数名的数量,使程序更加面向对象化

评论地址:

https://www.cnblogs.com/laboratory-X/p/10590562.html

https://www.cnblogs.com/elise00/p/10589654.html

https://www.cnblogs.com/linjiahao1035/p/10585993.html

posted @ 2019-03-24 13:13  无名的路人  阅读(438)  评论(3编辑  收藏  举报