实验二作业
Part 2:
一、函数重载编译练习
实现对int型,double型,Complex型数据的加法,代码如下:
(只形式上测试,比较简陋并不智能)
#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 m,n; cout<<"Enter two integer: "; cin>>m>>n; cout<<"Their sum of square:"<<add(m,n)<<endl; double x,y; cout<<"Enter two integer:"; cin>>x>>y; cout<<"Their sum of square:"<<add(x,y)<<endl; Complex p,q; cout<<"Enter two integer:"; cin>>p.real>>p.imaginary; cin>>q.real>>q.imaginary; cout<<"Their sum of square:"<<(add(p,q)).real<<'+'<<(add(p,q)).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 r; r.real=a.real+b.real; r.imaginary=a.imaginary+b.imaginary; return r; }
程序结果如下:
此次进行的复数加减是根据老师提供的结构体实现的。对于复数的加减也有专门的类来实现。更多了解参考博客https://blog.csdn.net/qq_40955914/article/details/80836119
二、快速排序
简述快速排序法:快速排序算法是一种基于交换的高效的排序算法,它采用了分治法的思想:
1、从数列中取出一个数作为基准数(枢轴,pivot)。
2、将数组进行划分(partition),将比基准数大的元素都移至枢轴右边,将小于等于基准数的元素都移至枢轴左边。
3、再对左右的子区间重复第二步的划分操作,直至每个子区间只有一个元素。
(参考博客https://www.cnblogs.com/miracleswgm/p/9199124.html)
(一)我的第一次试验代码在算法上走偏,(随机选取一个数a,从又开始遇到比a大的进行一次交换,进行过一次交换后就从另一侧开始比较,左边遇到比a小的交换,直到左右前进相遇)且自己个儿能力实现不了,此处便不贴了。只贴其中一点心得:交换数组元素位置名来交换元素,如果交换次数多理不清楚此法便着实险恶。
#include<iostream> using namespace std; void exchange(int &,int &); int main() { int a[2]={1,2}; int b=0,i=1; exchange(b,i); cout<<a[b]<<a[i]; return 0; } void exchange(int &x,int &y) { int t; t=x; x=y; y=t; }
(二)第二次试验,意识到自己算法错误后的重新编写(选择基准数,进行基准数左右两边的交换)。身心俱疲,只完成一次快速排序,之后以冒泡收尾。未完待续······
#include<iostream> using namespace std; void exchange(int &,int &); void quicksort(int ,int ,int a[]); void sort(int ,int ,int b[]); int main() { int a[10]={52,45,80,36,14,75,58,96,23,61},i; quicksort(0,9,a); sort(0,4,a); sort(5,9,a); for(i=0;i<10;i++) cout<<a[i]<<endl; return 0; } void exchange(int &x,int &y) { int t; t=x; x=y; y=t; } void quicksort(int r,int l,int a[]) { int m,n,p,i=0; for(m=r+1;l>m;l--) { if(a[l]>a[r]) continue; else if(a[l]<a[r]) { while(m<l) { if(a[m]<a[r]) m++; else if(a[m]>a[r]) { exchange(a[m],a[l]); m++; break; } } } } exchange(a[r],a[m]); } void sort(int x,int y,int b[]) { int i,j,k; k=y-x+1; for(j=0;j<k-1;j++) { for(i=x;i<k-j-1+x;i++) { if(b[i]>b[i+1]) exchange(b[i],b[i+1]); } } }
程序结果如下:
(三)我的第三次试验,检验出来并纠正了第二次实验中存在的错误。仍存有难解之处——在我这种算法中函数的递归存在问题,所以此处进行了强制固定分区。以下就是这个比较牵强的代码,测试成功但仍希望给予帮助。结果如第二次实验结果。
#include<iostream> using namespace std; void exchange(int &,int &); void quicksort(int ,int ); int a[10]={52,45,80,36,14,75,58,96,23,61}; int main() { int i,n=0,p=9,q; quicksort(0,9); q=(p-n)/2;p=n+q; while((p-n)>=1) { quicksort(n,p); n=p; if(((9-p-q)==1)||((9-p-q)==0)) p=9; else p=n+q; if(p>9) { q=(p-n)/2; n=0; p=n+q; } } for(i=0;i<10;i++) cout<<a[i]<<endl; return 0; } void exchange(int &x,int &y) { int t; t=x; x=y; y=t; } void quicksort(int r,int l) { int m,i=0; for(m=r+1;l>m;l--) { if(a[l]>a[r]) continue; else { while(m<l) { if(a[m]<a[r]) m++; else { exchange(a[m],a[l]); m++; break; } } } } if(a[r]<a[m]) exchange(a[r],a[m-1]); else exchange(a[r],a[m]); }
三、用户类
实验要求:
1、每一个用户有用户名(name), 密码(passwd),联系邮箱(email)三个属性。
2、支持设置用户信息setInfo()。允许设置信息时密码默认为6个1,联系邮箱默认为空串。
3、支持打印用户信息printInfo()。打印用户名、密码、联系邮箱。其中,密码以6个*方式显示。
4、支持修改密码changePasswd(),。在修改密码前,要求先输入旧密码,验证无误后,才允许修改。 如果输入旧密码时,连续三次输入错误,则提示用户稍后再试,暂时退出修改密码程序。
5、在main()函数中创建User类实例,测试User类的各项操作(设置用户信息,修改密码,打印用户信息)
我的代码如下:
#include<iostream> #include<string> #include<windows.h> using namespace std; class User { public: void setlnfo(string n,string p="111111",string e=""); //设置用户信息 string getn();//获取用户名字 string getp();//获取用户密码 string gete();//获取用户邮箱 void printlnfo();//修改密码 void changepasswd();//打印用户信息 private: string name;//用户名字 string passwd; string email;//用户密码及邮箱 }; void User::setlnfo(string n,string p,string e) { name=n; passwd=p; email=e; }//成员函数setlnfo的实现 string User::getn(){ return name; }//成员函数getn的实现 string User::getp(){ return passwd; }//成员函数getp的实现 string User::gete(){ return email; }//成员函数gete的实现 void User::printlnfo(){ cout<<"name:"<<name<<endl; cout<<"passwd:"<<"******"<<endl; cout<<"email:"<<email<<endl; } void User::changepasswd(){ string p1,p2,p3;//定义p1为输入的原密码,p2为输入的新密码,p3为再次输入的新密码 while(true) { int i=1; cout<<"Enter the original passwd:"; cin>>p1; while(p1!=passwd) { cout<<"Passwd input error, please re-enter again:"; cin>>p1; i++; if(i==3) { cout<<"Please try after 3 seconds."<<endl; break; } } if(i==3) { Sleep(3000); continue; } if(p1==passwd) { cout<<"Please input your new passwd:"; cin>>p2; cout<<"Please comfirm your passwd:"; cin>>p3; while(p3!=p2) { cout<<"Input error,please input again:"; cin>>p3; } if(p3==p2){ cout<<"Passwd changed successfully!"<<endl; passwd==p3; } break; } } } int main() { cout<<"Test 1"<<endl;//测试一 User A; A.setlnfo("Leonard"); A.printlnfo(); A.changepasswd(); A.printlnfo();
cout << endl << "Testing 2" << endl << endl; // 测试2
User B;
B.setInfo("Jonny","92197","xyz@hotmail.com");
B.printInfo(); return 0; }
程序结果如下:
此题中出现的问题以及一些新的东西:
1、字符数组赋值'1','\0',空字符串的初始化:string e="",初始化形式错误会出现以下提示:Terminate called after throwing an instance of ‘std::logic_error’
2、时间间隔函数(“睡眠”?)头函数为#include<windows.h>函数实现Sleep(3000);
总结:
1、对于程序主架自己的算法一定要写好经得起推敲才敢下手敲代码。
2、认真浏览题目,过两天也要看题目,符合要求。
3、要有平和的心态。
针对实验一的评价网址:
https://www.cnblogs.com/csl-40/p/10541550.html
https://www.cnblogs.com/knight04/p/10541527.html
https://www.cnblogs.com/sq102217/p/10527710.html