c++第二次作业
1.函数重载编程练习
编写重载函数add(),实现对int型,double型,Complex型数据的加法。在main()函数中定义不同类型
数据,调用测试。
1 #include<iostream> 2 using namespace std; 3 struct Complex 4 { 5 double real; 6 double imag; 7 }; 8 void add(int x,int y) 9 { 10 cout<<"和 为:"<<x+y<<endl; 11 cout<<endl; 12 } 13 void add(double x,double y) 14 { 15 cout<<"和 为:"<<x+y<<endl; 16 cout<<endl; 17 } 18 void add(Complex x,Complex y) 19 { 20 Complex h; 21 h.real=x.real+y.real; 22 h.imag=x.imag+y.imag; 23 if(h.imag>=0) cout<<"和 为:"<<h.real<<"+"<<h.imag<<"i"<<endl; 24 else cout<<"和 为:"<<h.real<<h.imag<<"i"<<endl; 25 cout<<endl; 26 } 27 int main() 28 { 29 int x1,y1; 30 double x2,y2,x31,x32,y31,y32; 31 32 cout<<"请 输入两个int类型的数:"; 33 cin>>x1>>y1; 34 add(x1,y1); 35 36 cout<<"请 输入两个double类型数:"; 37 cin>>x2>>y2; 38 add(x2,y2); 39 40 cout<<"请 输入两个complex类型数: "<<endl; 41 cout<<"请 输入第一个数的实部:"; 42 cin>>x31; 43 cout<<"请 输入第一个数的虚部:"; 44 cin>>x32; 45 cout<<"请 输入第二个数的实部:"; 46 cin>>y31; 47 cout<<"请 输入第二个数的虚部:"; 48 cin>>y32; 49 add({x31,x32},{y31,y32}); 50 return 0; 51 }
2.函数模板编程练习
编写实现快速排序函数模板,并在main()函数中,定义不同类型数据,调用测试。
头文件quick.h
1 #ifndef QUICK_H 2 #define QUICK_H 3 #include<iostream> 4 using namespace std; 5 void PaiXu(double a[],int low,int high) 6 { 7 int x=low,y=high,i;double t=a[x]; 8 if(low<high) 9 { 10 while(x<y) 11 { 12 while(a[y]>t&&x<y) 13 y--; 14 if(x<y){a[x]=a[y];x++;} 15 while(a[x]<t&&x<y) 16 x++; 17 if(x<y){a[y]=a[x];y--;} 18 } 19 a[x]=t; 20 PaiXu(a,x+1,high);PaiXu(a,low,x-1); 21 } 22 } 23 void QuickPai(double a[],int n) 24 { 25 int i; 26 PaiXu(a,0,n-1); 27 cout<<"排 序后为:"; 28 for(i=0;i<n;i++) 29 cout<<a[i]<<" "; 30 } 31 #endif
主程序
1 #include<iostream> 2 #include"quick.h"" 3 using namespace std; 4 int main() 5 { 6 int n=0,n1,i; 7 double a[100],t; 8 cout<<"请 输入数组并以 -1 结束:"; 9 while(1) 10 { 11 cin>>t; 12 if(t==-1) break; 13 a[n]=t; 14 n++; 15 } 16 cout<<"请 输入你想要排序的数组长度:"; 17 while(1) 18 { 19 cin>>n1; 20 if(n1<=n) break; 21 cout<<"长 度过长,请重新输入:"; 22 } 23 QuickPai(a,n1); 24 return 0; 25 }
3.设计并实现一个用户类User,并在主函数中使用和测试这个类。具体要求如下:
每一个用户有用户名(name), 密码(passwd),联系邮箱(email)三个属性。
支持设置用户信息setInfo()。允许设置信息时密码默认为6个1,联系邮箱默认为空串。
支持打印用户信息printInfo()。打印用户名、密码、联系邮箱。其中,密码以6个*方式显示。
支持修改密码changePasswd(),。在修改密码前,要求先输入旧密码,验证无误后,才允许修改。
如果输入旧密码时,连续三次输入错误,则提示用户稍后再试,暂时退出修改密码程序。
在main()函数中创建User类实例,测试User类的各项操作(设置用户信息,修改密码,打印用户信
息)
1 #include<iostream> 2 #include<string.h> 3 using namespace std; 4 class user 5 { 6 public: 7 void setInfo(); 8 void printInfo(); 9 void changePasswd(); 10 private: 11 string name="bot"; 12 string passwd="111111"; 13 string email=""; 14 } ; 15 void user::setInfo() 16 { 17 string x; 18 cout<<"请 输入用户名:"; 19 cin>>name; 20 cout<<"请 输入密码:"; 21 cin>>passwd; 22 cout<<"请 输入邮箱地址:"; 23 cin>>email; 24 cout<<"修 改成功!"<<endl; 25 } 26 void user::printInfo() 27 { 28 cout<<"用 户名:"<<name<<endl; 29 cout<<"密 码:******"<<endl; 30 cout<<"邮 箱地址:"<<email; 31 } 32 void user::changePasswd() 33 { 34 string t; 35 int n=3; 36 do 37 { 38 cout<<"请 输入旧密码,默认密码为111111:"; 39 cin>>t; 40 if(t.compare(passwd)==0) break; 41 else{n--;cout<<"请 重新输入,剩余次数为: "<<n<<endl;} 42 }while(n!=0); 43 44 if(n!=0) {cout<<"请 输入新密码:";cin>>passwd;cout<<"修 改成功!"<<endl;} 45 else cout<<"请 稍后重试,暂时退出修改密码!"<<endl; 46 } 47 int main() 48 { 49 user us; 50 int x,k=0; 51 cout<<"1 为设置用户信息,2为打印用户信息,3为修改密码,4为退出菜单:"<<endl; 52 while(1) 53 { 54 cout<<endl; 55 cout<<"请 输入指令:"; 56 cin>>x; 57 switch(x) 58 { 59 case 1:if(k==0) 60 { 61 us.setInfo(); 62 k=1; 63 break; 64 } 65 else 66 { 67 cout<<"请 勿重复设置用户信息!"<<endl; 68 break; 69 } 70 case 2:us.printInfo();cout<<endl;break; 71 case 3:if(k==1) 72 { 73 us.changePasswd();break; 74 break; 75 } 76 else 77 { 78 cout<<"尚 未设置用户信息!"<<endl; 79 break; 80 } 81 case 4:cout<<"谢 谢使用!"<<endl;return 0;break; 82 default:cout<<"无 效的指令,请重新输入:"<<endl; 83 } 84 } 85 return 0; 86 }
实验总结与体会:
1、感谢大佬的代码给了我思路;
2、递归问题要多加练习;
3、上学期要求做的oj的题目大多没什么思想内涵;
4、写了个好玩的程序,c环境的,可以输出253!的结果。
1 /*运用列竖式做乘法的方法计算大数位数, 2 cheng用于大数位乘法,jinwei用于十进制进位,qu将被乘数转化为数组, 3 a[]存储原本数,b[]用于计算,c[]存储乘数*/ 4 5 #include<stdio.h> 6 #define N 500 7 int cheng(int [],int [],int,int); 8 void jinwei(int [],int); 9 10 /*做乘法*/ 11 int cheng(int a[],int c[],int n,int w) 12 { 13 int b[N][N]={0},i,j,i1,j1; 14 for (i=0;i<w;i++) 15 for (j=0;j<n;j++) 16 b[i][i+j]=a[j]; 17 for (i=0;i<w;i++) 18 { 19 for (j=0;j<n;j++) 20 b[i][i+j]*=c[i]; 21 jinwei(b[i],i+j); 22 } 23 if (b[i-1][i+j-1]!=0) j++; 24 for (j1=0;j1<i+j-1;j1++) 25 { 26 for (i1=1;i1<w;i1++) 27 b[0][j1]+=b[i1][j1]; 28 } 29 jinwei(b[0],j1); 30 if (b[0][j1]!=0) j1++; 31 for (i=0;i<j1;i++) 32 a[i]=b[0][i]; 33 return j1; 34 } 35 36 /*十进制进位*/ 37 void jinwei(int b[],int j) 38 { 39 int i1; 40 for (i1=0;i1<=j||b[i1]!=0;i1++) 41 if (b[i1]>9) 42 { 43 b[i1+1]+=(b[i1]/10); 44 b[i1]%=10; 45 } 46 } 47 48 /*把数转换为数组*/ 49 int qu(int *p,int x) 50 { 51 int n=0; 52 while(x) 53 { 54 *(p+n)=x%10; 55 x/=10; 56 n++; 57 } 58 return n; 59 } 60 61 /*做阶乘*/ 62 int jiecheng(int x) 63 { 64 int a[N]={0},c[N]={0},n=0,w=0,i,j=1; 65 n=qu(a,1); 66 for (i=1;i<=x;i++) 67 { 68 w=qu(c,i); 69 j=cheng(a,c,j,w); 70 } 71 printf("%d!的结果是:",x); 72 for (i=j-1;i>=0;i--) 73 printf("%d",a[i]); 74 printf("\n"); 75 return j; 76 } 77 78 int main() 79 { 80 int w,n; 81 while (scanf("%ld",&n)!=EOF) 82 { 83 w=jiecheng(n); 84 printf("位数为:%d\n",w); 85 } 86 return 0; 87 }