第二次实验主要内容是函数重载,快速排序及其模板实现,简单的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++程序设计--实验二的更多相关文章

  1. Java程序设计 实验二 Java面向对象程序设计

    北京电子科技学院(BESTI) 实     验    报     告 课程:Java程序设计 班级:1353  姓名:李海空  学号:20135329 成绩:             指导教师:娄嘉鹏 ...

  2. .NET程序设计实验二

    实验二  面向对象程序设计 一.实验目的 1. 理解类的定义.继承等面向对象的的基本概念: 2. 掌握C#语言定义类及其各种成员(字段,属性,方法)的方法: 3. 掌握方法覆盖的应用: 4. 掌握接口 ...

  3. #20175201 实验二:Java面向对象程序设计

    20175201 实验二:Java面向对象程序设计 实验二 Java面向对象程序设计 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O.L ...

  4. 2017-2018-2 20165215 实验二 Java面向对象程序设计

    20165215 实验二 Java面向对象程序设计 一.实验报告封面 课程:Java程序设计 班级:1652班 姓名:张家佳 学号:20165215 指导教师:娄嘉鹏 实验日期:2018年4月16日 ...

  5. 20165308 实验二 Java面向对象程序设计

    20165308 实验二 Java面向对象程序设计 实验二 Java面向对象程序设计 一.实验报告封面 课程:Java程序设计 班级:1653班 姓名:张士洋 学号:20165308 指导教师:娄嘉鹏 ...

  6. 20165230 《Java程序设计》实验二(Java面向对象程序设计)实验报告

    20165230 <Java程序设计>实验二(Java面向对象程序设计)实验报告 一.实验报告封面 课程:Java程序设计 班级:1652班 姓名:田坤烨 学号:20165230 成绩: ...

  7. 2016-2017-2 20155227实验二《Java面向对象程序设计》实验报告

    2016-2017-2 20155227实验二<Java面向对象程序设计>实验报告 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉 ...

  8. 2017-2018-2 20165330实验二《Java面向对象程序设计》实验报告

    实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O.L.I.D原则 了解设计模式 实验步骤 (一)单元测试 三种代码 伪代码:从意图层面来解 ...

  9. 20145215实验二 Java面向对象程序设计

    一.实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O.L.I.D原则 了解设计模式 二.实验步骤 (一)单元测试 (1)三种代码 伪代码: ...

随机推荐

  1. web百度地图离线开发

    公司现在做的一个项目本来用的是google离线地图,但是发现谷歌的地图数据很久没更新数据了,中国的城市发展这么快,好多地方地图和现实都对不上了. 发现百度地图数据更新挺快的(呵呵,毕竟是国产的吗),最 ...

  2. CentOS7系列--5.2CentOS7中配置和管理Docker

    CentOS7配置和管理Docker Docker是操作系统级别的虚拟化工具,它能自动化布署在容器中的应用 1. 安装Docker 1.1. 安装Docker相关软件 [root@server1 ~] ...

  3. 编译器错误消息: CS0016: 未能写入输出文件"c:\Windows\Microsoft.NET\Framework

    解决办法: 原因是由于系统目录下的Temp目录无相应的权限所致,具体操作如下: 来到C:/Windows目录,修改temp文件夹的属性. 在安全页设置IIS-IUSRS的权限,赋予修改.读取.写入等权 ...

  4. Python这个缩进让我焦头烂额!最奇葩的缩进...

        例如如下程序.     运行上面代码,如果输入年龄小于20,将会看到如下运行结果.     从上面代码可以看出,如果输入的年龄大于20,则程序会执行整体缩进的代码块. 再次重复:Python不 ...

  5. 带你从零学ReactNative开发跨平台App开发(十)

    ReactNative跨平台开发系列教程: 带你从零学ReactNative开发跨平台App开发(一) 带你从零学ReactNative开发跨平台App开发(二) 带你从零学ReactNative开发 ...

  6. 通过代码管理工具 git 完成一次完整的代码管理过程

    1.从公共远程fork一份自己的本地远程之后,从本地远程 clone 到本地 2.将本地代码跟公共远程代码做关联配置 git remote add upstream https://github.co ...

  7. 读写appSettings配置节方法

    <configuration>   <appSettings>     <add key="Socket_Path_MW_data" value=&q ...

  8. 打开struts-config.xml 报错 解决方法Could not open the editor

    打开struts-config.xml 报错 解决办法Could not open the editor 错误信息:Could not open the editor: Project XXX is ...

  9. 从Azure上构建Linux应用程序映像

    下图描述了总体的虚拟机的VHD映像生成以及发布到 Azure Azure 镜像市场的全过程: 具体步骤如下: 从Azure管理平台上Linux申请虚拟机, 安装和配置您要发布的应用软件产品,制作成映像 ...

  10. 解决eclipse 文件更新不自动刷新的问题

    打开eclipse 1. Window ===> Preferences ===> General ===> Workspace 2. 勾选 1> Refresh using ...