实验二
1.编写重载函数add(),实现对int型,double型,Complex型数据的加法。在main()函数中定义不同类型 数据,调用测试。
代码如下:
#include<iostream> using namespace std; struct Complex{ double real; double imaginary; }; int add(int , int ); double add(double , double); Complex add(Complex , Complex); int main(){ int a,b; cin >> a >> b; cout << "The result is:" << add(a,b) << endl; double c,d; cin >> c >> d; cout << "The result is:" << add(c,d) << endl; struct Complex m,n,p; cin >> m.real >> m.imaginary; cin >> n.real >> n.imaginary; p=add(m,n); cout << "The result is:" << p.real << "+" << p.imaginary << "i" <<endl; return 0; } int add(int a,int b){ return a+b; } double add(double a,double b){ return a+b; } Complex add(Complex a,Complex b){ Complex i; i.real=a.real+b.real; i.imaginary=a.imaginary+b.imaginary; return i; }
运行结果如下:
刚开始写的时候complex这部分的重载不会写,后来明白了可以定义一个结构体,返回这个整体的结构。这题没有什么难度,只要注意complex这部分的重载。
2.编写实现快速排序函数模板,并在main()函数中,定义不同类型数据,调用测试。
代码如下:
#include<iostream> using namespace std; void quicksort( double a[], int left, int right); int main(){ int n=0; const int N=100; double a[N],p; cout << "输入数字且-1表示结束: " << endl; while(1){ cin >> p; if( p==-1 ) break; a[n]=p; n++; } cout << "the arranged array is: " << endl; quicksort( a, 0, n-1); for(int t=0; t<n; t++) cout << a[t] << " " ; return 0; } //快速排序法 void quicksort( double a[], int left, int right){ int i=left, j=right; double x; x=a[i]; //选定一个数 while(i<j){ while( i<j && x<a[j] ){ //从后往前 j--; } if( i<j){ a[i]=a[j]; //比选定的数小就到它的位置 i++; } while( i<j && x>a[i]){ //再从前往后 i++; } if( i<j){ a[j]=a[i]; //比选定的数大就到它的位置 j--; } a[i]=x; quicksort( a, left, i-1); //分为两半快速排 quicksort( a, i+1, right); } }
运行结果如下:
首先我理解快速排序法就用了很长的时间。它是选择一个数,然后其余的数和它比较。如果是从小到大排的话,比这个数小的就要放到左边,比这个数大的就要放到右边,
刚开始我想用#ifndef #define #endif写的,可是总显示没有输出文件。我就把它弄成一个函数,调用。这题刚接触的时候是十分困难的,要充分消化的话还需要时间。
3.设计并实现一个用户类User,并在主函数中使用和测试这个类。具体要求如下: 每一个用户有用户名(name), 密码(passwd),联系邮箱(email)三个属性。 支持设置用户信息setInfo()。允许设置信息时密码默认为6个1,联系邮箱默认为空串。 支持打印用户信息printInfo()。打印用户名、密码、联系邮箱。其中,密码以6个*方式显示。 支持修改密码changePasswd(),。在修改密码前,要求先输入旧密码,验证无误后,才允许修改。 如果输入旧密码时,连续三次输入错误,则提示用户稍后再试,暂时退出修改密码程序。 在main()函数中创建User类实例,测试User类的各项操作(设置用户信息,修改密码,打印用户信 息)
代码如下:
#include<iostream> #include<string> #include<conio.h> #include<cstring> using namespace std; class user{ public: user(); void setlnfo(); //设置用户信息 void printlnfo(); //打印用户信息 void changepasswd(); //修改密码 string xinhao(); //用来存放输入的密码 private: string name; string passwd; string mail; }; user::user(){ passwd="111111"; //密码默认6个1 mail=" "; //邮箱为空 } //用setlnfo设置用户名和邮箱 void user::setlnfo(){ cout << "请输入用户名: " ; cin >>name; cout << endl <<"请输入邮箱: "; cin >>mail; } //用printlnfo打印用户名密码和邮箱 void user::printlnfo(){ cout << "用户名: " << name<< endl; cout << "密码: " << "******" <<endl; cout << "邮箱: " << mail << endl; } //用changepasswd修改密码 void user::changepasswd(){ string oldpasswd, newpasswd; int chance=1; while(oldpasswd!=passwd){ cout << "请输入旧密码: "; oldpasswd=xinhao(); if(oldpasswd==passwd) break; if(chance==3) break; else{ cout << "输入错误,你还有" << 3-chance << "次机会!" <<endl; //三次输入密码的机会 } chance++; } if(chance==3) cout << "连续三次输入错误,请稍后再试!"<< endl; else{ while(1){ cout << "请输入六位新密码: "; newpasswd=xinhao(); if(newpasswd.size()!=6){ cout << "密码长度不对,请重新输入: " << endl; continue; } cout << "设置密码成功!" << endl; break; } } } string user::xinhao(){ string passwd; string p; int i=0; while(i<6){ p=getch(); cout << "*"; passwd+=p; i++; } cout << endl; return passwd; } //main函数 int main(){ int number=1; user myuser; string judge; while(1){ cout << "用户" << number << ":" <<endl; myuser.setlnfo(); myuser.printlnfo(); myuser.changepasswd(); myuser.printlnfo(); cout << "是否继续?请输入yes或no:"; cin >> judge; if(judge=="no") break; } return 0; }
运行结果如下:
这题写的头的昏了,看了很多遍书,运行的时候很多的bug,一步一步的调试,终于弄出来了。这题给我的感觉是逻辑非常重要。main函数只有一点,都是前面的类,所以逻辑一定要清晰。
总结:1.对于复数的重载函数可以定义一个结构,直接返回它的整个结构。
2.快速排序法是排序里面效率最高的,它是找一个数按照从前往后和从后往前的顺序找,根据自己的需要从小到大或者从大到小排序。
3.类是把一件事抽象化,需要想象力和清晰的逻辑。需要注意 返回值类型 类名::函数成员名,而构造函数的话是 类名::函数名(函数名要和类名相同)。