实验二报告
Posted 21savage-code
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实验二报告相关的知识,希望对你有一定的参考价值。
第一部分:代码&运行结果
第一题:设置一个重载函数,分别用整数、实数、复数求和
代码如下:
1 #include<iostream> 2 using namespace std; 3 int add(int,int); 4 double add(double,double); 5 struct complex{ 6 double real; 7 double imaginary; 8 }; 9 complex add(complex,complex); 10 int main() 11 { 12 while(true){ 13 int a,b; 14 double c,d; 15 complex e,f; 16 cout<<"请输入两个整数"<<endl; 17 cin>>a>>b; 18 cout<<"请输入两个实数"<<endl; 19 cin>>c>>d; 20 cout<<"请输入两个复数"<<endl; 21 cin>>e.real>>e.imaginary>>f.real>>f.imaginary; 22 cout<<"整数的和为"<<add(a,b)<<endl; 23 cout<<"实数的和为"<<add(c,d)<<endl; 24 complex t=add(e,f); 25 cout<<"复数的和为"<<t.real<<‘+‘<<t.imaginary<<‘i‘<<endl; 26 return 0; 27 } 28 } 29 int add(int a,int b) 30 { 31 int o; 32 o=a+b; 33 return o; 34 } 35 double add(double c,double d) 36 { 37 double p; 38 p=c+d; 39 return p; 40 } 41 complex add(complex m,complex n) 42 { 43 complex g; 44 g.real=m.real+n.real; 45 g.imaginary=m.imaginary+n.imaginary; 46 return g; 47 }
运行结果:
第二题:写一个快速排序的函数模板
代码如下:
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 template <class T> 6 T find_mid(T a[],int low,int high) 7 { 8 a[0]=a[low]; 9 T mid=a[low]; 10 while(low<high) 11 { 12 while(low<high&&a[high]>=mid) 13 high--; 14 a[low]=a[high]; 15 while(low<high&&a[low]<=mid) 16 low++; 17 a[high]=a[low]; 18 } 19 a[low]=a[0]; 20 return low; 21 } 22 template <class T> 23 void very_quick(T a[],int low, int high) 24 { 25 if(low<high) 26 { 27 int mid=find_mid(a,low,high); 28 very_quick(a,low,mid-1); 29 very_quick(a,mid+1,high); 30 } 31 } 32 int main() 33 { 34 int a[50]; 35 int m; 36 while (cin>>m) 37 { 38 cout<<"整数排序前:"; 39 for (int j=1;j<=m;j++) 40 cin>>a[j]; 41 very_quick(a,1,m); 42 cout<<"整数排序后:"; 43 for (int j=1;j<=m;j++) 44 cout<<a[j]<<‘ ‘; 45 46 double b[50]; 47 int n; 48 cout<<endl; 49 cout<<"实数排序前:"; 50 for (int i=1;i<=m;i++) 51 cin>>b[i]; 52 very_quick(b,1,m); 53 cout<<"实数排序后:"; 54 for (int i=1;i<=m;i++) 55 cout<<b[i]<<‘ ‘; 56 } 57 return 0; 58 59 }
结果如下:
第三题:写一个处理用户信息的类,可以打印信息,支持修改密码。
代码如下:
#include<iostream> #include<string> using namespace std; class user { public: void setinfo(string name0,string passwd0="111111",string email0=" "); void changepasswd(); void printinfo(); private: string name; string passwd; string email; }; void user::setinfo(string name0,string passwd0,string email0) { name=name0; passwd=passwd0; email=email0; } void user::changepasswd() { cout<<"请输入旧密码:" <<endl; string passwd; int i=0; for(i=0;i<3;i++) { cin>>passwd; if(passwd=="111111") break; else cout<<"密码错误,请重新输入"<<endl; } if(i==3) cout<<"请稍后再试"<<endl; else { cout<<"密码正确,输入新密码"<<endl; cin>>passwd; cout<<"修改密码成功"<<endl; } } void user::printinfo() { cout<<"name:"<<name<<endl; cout<<"passwd:"<<"******" <<endl; cout<<"email:"<<email<<endl; } int main() { cout << "testing 1......" << endl; user user1; user1.setinfo("Leonard"); user1.printinfo(); user1.changepasswd(); cout << endl << "testing 2......" << endl << endl; user user2; user2.setinfo("Jonny","92197","[email protected]"); user2.printinfo(); return 0; }
运行结果如下:
1.三次密码输入错误
2.旧密码输入正确
第二部分:实验反思
- 在写第一道题的时候,一开始不清楚复数的实部虚部相加怎么搞,怎么改都是输出四个值的和,后来就想到了再定义一个复数的结构体类,也就是题中的complex类,将两个实部的和赋给complex.real,将两个虚部的和赋给complex.imaginary,然后直接返回整个结构体类的值,这样就能清楚的把实部和与虚部和分开了。就是下面这一小块。
complex add(complex m,complex n) { complex g; g.real=m.real+n.real; g.imaginary=m.imaginary+n.imaginary; return g; }
- 第二题快速排序我有好多话想说,这一题花了我相当长的时间,前前后后加起来差不多最少有六七节课,先是查资料,网上对于快排有很多种不同方法,一开始同时看了两三种觉得很懵,就选了最容易懂的一种,花了一节课搞明白了原理,然后一节课写出来int类的快排,然后开始在此基础上写函数模板,最后尝试用Int&double来调试,老师说可以多写一个类,使用后只需要调用的时候参数是数组名以及数组长度,在写出这个类之后,发现排序结果不对,经过修改递归的范围,也就是low&high的值,发现不同值,排序结果不同,就知道是这里错了,然后用了一个蛮笨的方法,让实数和整数数组长度都是5,发现排序结果对了。main函数如下:
int main() 33 { 34 int a[50]; 35 int m; 36 while (cin>>m) 37 { 38 cout<<"整数排序前:"; 39 for (int j=1;j<=m;j++) 40 cin>>a[j]; 41 very_quick(a,1,m); 42 cout<<"整数排序后:"; 43 for (int j=1;j<=m;j++) 44 cout<<a[j]<<‘ ‘; 45 46 double b[50]; 47 int n; 48 cout<<endl; 49 cout<<"实数排序前:"; 50 for (int i=1;i<=m;i++) 51 cin>>b[i]; 52 very_quick(b,1,m); 53 cout<<"实数排序后:"; 54 for (int i=1;i<=m;i++) 55 cout<<b[i]<<‘ ‘; 56 } 57 return 0; 58 59 }
在这个主函数上花的时间反而比在函数模板上多。
- 第三道题倒是不太难,对着employee照葫芦画瓢,比较容易能写出来,就是那个修改密码的时候要注意一下如何界定三次的范围,我是这样写的
void user::changepasswd() { cout<<"请输入旧密码:" <<endl; string passwd; int i=0; for(i=0;i<3;i++) { cin>>passwd; if(passwd=="111111") break; else cout<<"密码错误,请重新输入"<<endl; } if(i==3) cout<<"请稍后再试"<<endl; else { cout<<"密码正确,输入新密码"<<endl; cin>>passwd; cout<<"修改密码成功"<<endl; } }
用了一个0到3的for循环,当然也可以用while,但是我觉得这样写比较容易能看懂。
以上是关于实验二报告的主要内容,如果未能解决你的问题,请参考以下文章
2018-2019-2 20175308实验二《面向对象程序设计》实验报告