C++程序设计--实验二
第二次实验主要内容是函数重载,快速排序及其模板实现,简单的user类实现。
实验结论:
一、函数重载编程练习
/*编写重载函数add(),实现对int型,double型和Complex型数据的加法。在main函数中定义不同类型数据,调用测试。*/
代码如下:
#include<iostream>
using namespace std; struct Complex//Complex结构体定义
{
double real;
double imaginary;
}e,f; int add(int , int); double add(double , double); Complex add(Complex,Complex); int main()
{
int a,b;
double c,d; cin>>a>>b;//int 型输入
cout<<add(a,b)<<endl;
cin>>c>>d;//double 型输入
cout<<add(c,d)<<endl;
cin>>e.real>>e.imaginary>>f.real>>f.imaginary;//Complex 型输入
cout<<add(e,f).real<<"+"<<add(e,f).imaginary<<"i"<<endl;
return ;
} int add(int a,int b)
{
return a+b;
}
double add(double a,double b)
{
return a+b;
}
Complex add(Complex a,Complex b)
{
struct Complex c;
c.real=a.real+b.real;
c.imaginary=a.imaginary+b.imaginary;
return c;
}
运行截图:

二、函数模板编程练习
/*编写实现快速排序函数模板,并在main()函数中定义不同数据类型,调用测试。*/
这里我个人有一些关于快速排序简单的想法。快速排序是在实践中最快的已知排序算法,其平均运行时间是O(N log N)。
此算法之所以特别快是由于非常精炼和高度优化的内部循环。它的最坏情形的性能为O(N2),这个是在极端情况下会出现的情况,下面会有一点介绍。
假设我们将要对数组S进行排序,其基本算法可以由以下简单的四步组成:
1、若S中的元素个数是0或1,则返回。
2、取S中的任意元素v,称之为枢纽元(pivot)。
3、将S中除去v剩下的元素分为两个不相交的集合,S1,S2。
4、返回quick_sort(S1)后,继随v,继而quick_sort(S2)。
关于枢纽元的选取:通常情况下,我们的选择是将第一个元素用作枢纽元。如果输入是随机的,那么影响不是太大。但是如果输入是预排序或者是反序的,
那么以第一个元素为枢纽元就会产生一个恶劣的结果,因为所有的元素不是被分到了S1,就是被分到了S2,甚至这种情况可能发生在所有的递归中。
所以为了安全起见,我们更加倾向于随机选取枢纽元。
三数中值分割法:枢纽元最理想的结果是数组数值大小的中值,但是这很难找到,因此一般的做法是使用左端右端和中心位置上的三个元素的中值作为枢纽元。
显然,使用三数中值分割可以消除预排序的坏情况,并且可以一定程度减少排序的时间。
其它值得思考的问题:a.如果出现相同大小元素,在进行交叉排序的过程中,交叉是否会越界? b.对于处理数组元素个数并不是很多的情况下,快速排序是不是一定最有效?
限于目前的能力,以上的只是自己暂时的思考,具体在代码中还未能很好的实现。
代码如下:
#include "pch.h"//编译器需要的引用
#include<iostream>
#include<algorithm>//swap函数引用
using namespace std;
#define N 100 void swap(int &A, int &B)//定义swap函数
{
int c = A;
A = B;
B = c;
} void swap(double &A, double &B)//swap函数重载
{
double c = A;
A = B;
B = c;
} template <class T>//实现三数中值分割
int Median3(T A[], int left, int right)
{
int center = (left + right)/;//找到中间值,作为枢纽元
if (A[left] > A[center])
swap(A[left], A[center]);
if (A[left] > A[right])
swap(A[left], A[right]);
if (A[center] > A[right])
swap(A[center], A[right]);
swap(A[center],A[right-]);
return A[right - ];
} template <class T>//快速排序主程序
void quick_sort(const T A[], int left, int right)
{
int i, j;
T pivot;
pivot = Median3(A, left, right);
i = left; j = right - ;
for (;;)
{
while (A[++i] < pivot) {}
while (A[--j] > pivot) {}
if (i < j)
swap(A[i],A[j]);
else//i和j已经交错,所以不再交换
break;
}
swap(A[i],A[right - ]);
quick_sort(A, left, i - );//数组分割成两部分之后的递归部分
quick_sort(A, i + , right);
} int main()
{
int b[N],n;
double a[N];
cout << "请输入参与排序的数字个数:n=" ;
cin >> n;
cout << endl << "a[]=";
for (int i = ; i < n; i++)
cin >> a[i];
cout << endl << "b[]=";
for (int i = ; i < n; i++)
cin >>b[i];
quick_sort(a, , n-);
quick_sort(b, , n-);
for (int i = ; i < n; i++)
cout << "排序后a[]="<<a[i]<<ends;
cout << endl;
for (int i = ; i < n; i++)
cout << "排序后b[]=" << b[i] << ends;
return ;
}
运行截图:

三、类的定义、实现和使用编程
/*设计并实现一个用户类user,并在主函数中使用和测试这个类,具体要求如下:
1、每一个用户有用户名(name),密码(password)和邮箱(email)三个属性
2、支持设置用户信息setinfo()。允许设置信息时密码默认值为6个1,联系邮箱默认为空串
3、支持打印用户信息printinfo()。打印用户名,密码,联系邮箱。其中密码以6个*方式显示
4、支持修改密码changepassword()。在修改密码前,要求先输入旧密码,确认无误后,才允许修改。如果输入旧密码时
连续三次输入错误,则提示用户稍后再试,并退出暂时修改密码程序
5、在main函数中创建user类实例,测试user类的各项操作(设置用户信息,修改密码,打印用户信息)
6、(选做)对user类进行完善。
代码如下:
#include<iostream>
#include<string>
using namespace std;
//user类的声明
class user{
public:
void setinfo(string name ,string password="" ,string email="");//带有默认形参值
void changepassword();
void printfinfo();
private:
string name;
string password;
string email;
};
//user类的实现
void user::setinfo(string name0, string password0, string email0) {
name = name0;
password = password0;
email = email0;
}
//成员函数changepassword的实现
void user::changepassword()
{
string password1;
int c = ;
cout << "please enter the old password firstly,if it is right ,you can change password then" << endl;
cin >> password1;
while (password1 != ""&&c > )
{
c--;
cout << "old password is not corrent,you have " << c << " time(s) to try it again" << endl;
cin >> password1;
}
if (c <= )
cout << "you have no time to try, please try it next day!" << endl;
else
{
cout << "you changed your password successfully! please remember it" << endl;
password = password1;
}
}
//成员函数printinfo的实现
void user::printfinfo()
{
cout << "name:\t"<< name << endl;
cout << "password:\t" << "******" << endl;
cout << "email:\t" << email << endl;
}
//主函数中对user类进行测试
int main()
{
cout << "...testing 1..." << endl;
user user1;
user1.setinfo("shenqidetao");
user1.printfinfo();
user1.changepassword();
user1.printfinfo();
cout << endl;
cout << "...testing 2..." << endl;
user user2;
user2.setinfo("arboter", "", "abc123@11.com");
user2.printfinfo();
return ;
}
运行结果截图:

实验总结与体会
1、在编写快速排序函数模板的时候,尝试写一个效率更高的算法,但是在代码实现的时候,除了几个bug。
主要是处在swap函数调用的地方。个人感觉debug虽然很烦,但是在过程中遇到的一些没有见过的error,总会
给个人的能力带来提升,也会帮助自己查找学习过程中的语法漏洞,即使补缺。
2、对于user类的编写,是第一次,但是能够很明显的感觉到面向对象与结构化编程的区别。
个人感受先列出几点:
a、面向对象编程中对于数据的public,private和prevent的区分,使得数据的安全型提高。
b、提高了程序的复用性。
c、emmmm,一言难尽,感觉还挺爽的。
作者:爱因斯坦PLUS。2019-03-22 23:21:35
实验一评阅地址:
https://www.cnblogs.com/rcloud/p/10561804.html
https://www.cnblogs.com/jackyayue/p/10545013.html
https://www.cnblogs.com/Tiger-Hu22/p/10547198.html
C++程序设计--实验二的更多相关文章
- Java程序设计 实验二 Java面向对象程序设计
北京电子科技学院(BESTI) 实 验 报 告 课程:Java程序设计 班级:1353 姓名:李海空 学号:20135329 成绩: 指导教师:娄嘉鹏 ...
- .NET程序设计实验二
实验二 面向对象程序设计 一.实验目的 1. 理解类的定义.继承等面向对象的的基本概念: 2. 掌握C#语言定义类及其各种成员(字段,属性,方法)的方法: 3. 掌握方法覆盖的应用: 4. 掌握接口 ...
- #20175201 实验二:Java面向对象程序设计
20175201 实验二:Java面向对象程序设计 实验二 Java面向对象程序设计 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O.L ...
- 2017-2018-2 20165215 实验二 Java面向对象程序设计
20165215 实验二 Java面向对象程序设计 一.实验报告封面 课程:Java程序设计 班级:1652班 姓名:张家佳 学号:20165215 指导教师:娄嘉鹏 实验日期:2018年4月16日 ...
- 20165308 实验二 Java面向对象程序设计
20165308 实验二 Java面向对象程序设计 实验二 Java面向对象程序设计 一.实验报告封面 课程:Java程序设计 班级:1653班 姓名:张士洋 学号:20165308 指导教师:娄嘉鹏 ...
- 20165230 《Java程序设计》实验二(Java面向对象程序设计)实验报告
20165230 <Java程序设计>实验二(Java面向对象程序设计)实验报告 一.实验报告封面 课程:Java程序设计 班级:1652班 姓名:田坤烨 学号:20165230 成绩: ...
- 2016-2017-2 20155227实验二《Java面向对象程序设计》实验报告
2016-2017-2 20155227实验二<Java面向对象程序设计>实验报告 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉 ...
- 2017-2018-2 20165330实验二《Java面向对象程序设计》实验报告
实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O.L.I.D原则 了解设计模式 实验步骤 (一)单元测试 三种代码 伪代码:从意图层面来解 ...
- 20145215实验二 Java面向对象程序设计
一.实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O.L.I.D原则 了解设计模式 二.实验步骤 (一)单元测试 (1)三种代码 伪代码: ...
随机推荐
- the detailed annotation of StringBuilder
public int capacity() 返回当前容量.容量指可用于最新插入字符的存储量,超过这一容量便需要再次分配. 返回: 当前容量. public int length() 返回长度(字符数) ...
- reentrantlock用于替代synchronized
1.①使用reentrantlock可以完成同样的功能 ②需要注意的是,必须要必须要必须要手动释放锁(重要的事情说三遍) ③使用syn锁定的话如果遇到异常,jvm会自动释放锁,但是lock必须 ...
- create alter rename desc select update delete insert
conn scott/root;create table student (id number(3), name varchar2(10), sex char(2), sno number(3));a ...
- 2cmd 窗口 javac 错误:编码GBK的不可映射字符
错误截图: 解决办法:第一步 第二步:
- 深入理解net core中的依赖注入、Singleton、Scoped、Transient(二)
相关文章: 深入理解net core中的依赖注入.Singleton.Scoped.Transient(一) 深入理解net core中的依赖注入.Singleton.Scoped.Transient ...
- webstorm忽略node_modules目录
我在使用了cnpm后node_modules之前的层级目录变成了同一级目录,所以目录很多,造成webstorm读取时卡死. 网上大家列了各种方法,在这里我归纳一下! 先给大家看看一些相关链接. 方法1 ...
- 【转】ubuntu右键在当前位置打开终端
ubuntu右键在当前位置打开终端 ubuntu增加右键命令: 在终端中打开 软件中心: 搜索nautilus-open-terminal安装 命令行: sudo apt-ge ...
- leetCode题解之反转二叉树
1.题目描述 经典的反转二叉树,就是将二叉树中每个节点的左.右儿子交换. 2.题目分析 3.代码 TreeNode* invertTree(TreeNode* root) { if(root == N ...
- JSP九大内置对象与Servlet的对应关系
JSP对象 Servlet中怎样获得 request service方法中的request参数 response service方法中的res ...
- [翻译] SAMCoreImageView
SAMCoreImageView https://github.com/soffes/SAMCoreImageView Render a CIImage in an OpenGL thingy so ...