第二次实验主要内容是函数重载,快速排序及其模板实现,简单的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. 《深入浅出WPF》读书笔记

    依赖属性: 节省实例对内存的开销: 属性值可以通过Binding依赖到其他对象上. WPF中,依赖对象的概念被DependencyObject类实现,依赖属性被DependencyProperty类实 ...

  2. flutter控件之ListView滚动布局

    ListView即滚动列表控件,能将子控件组成可滚动的列表.当你需要排列的子控件超出容器大小,就需要用到滚动块. import 'package:flutter/material.dart'; cla ...

  3. Android 对话框 (AlertDialog)

    Android 提供了 AlertDialog 类可通过其内部类 Builder 轻松创建对话框窗口,但是没法对这个对话框窗口进行定制,为了修改 AlertDialog 窗口显示的外观,解决的办法就是 ...

  4. Django 添加自定义包路径

    在设置文件里: import sys sys.path.insert(0,os.path.join(BASE_DIR,"要导包的目录名")) 用pycharm时,如果导包后没有自动 ...

  5. 二、ionic如何使用外链

    1.ionic如何使用外链并返回原有页面? html如下: 对应的controller如下: (function() { angular.module('app').controller('extra ...

  6. HDFS pipeline写 -- datanode

    站在DataNode的视角,看看pipeline写的流程,本文不分析客户端部分,从客户端写数据之前拿到了3个可写的block位置说起. 每个datanode会创建一个线程DataXceiverServ ...

  7. 在 Linux 上创建虚拟机规模集和部署高度可用的应用

    利用虚拟机规模集,可以部署和管理一组相同的.自动缩放的虚拟机. 可以手动缩放规模集中的 VM 数,也可以定义规则,以便根据资源使用情况(如 CPU 使用率.内存需求或网络流量)进行自动缩放. 在本教程 ...

  8. BeautifulSoup爬虫基础知识

    安装beautiful soup模块 Windows: pip install beautifulsoup4 Linux: apt-get install python-bs4 BS4解析器比较 BS ...

  9. asp.net 對象圖解

  10. 查询会龄 sql部分

      AND (       case when ${fld:vc_age} = '1' then ((current_date-d.c_idate::date)/30)<3       when ...