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)三种代码 伪代码: ...
随机推荐
- spring boot(15)-异常处理
异常传递 如图:服务层和dao层的异常最终都会到达控制层,控制层的异常则会自动记入logback日志系统.所以我们应该在控制层来捕获系统异常 捕获控制层异常 import org.slf4j.Logg ...
- python/numpy/pandas数据操作知识与技巧
pandas针对dataframe各种操作技巧集合: filtering: 一般地,使用df.column > xx将会产生一个只有boolean值的series,以该series作为dataf ...
- Windows自带强大的入侵检测工具——Netstat 命令 查询是否中木马
Netstat命令可以帮助我们了解网络的整体使用情况.根据Netstat后面参数的不同,它可以显示不同的网络连接信息.Netstat的参数如图,下面对其中一些参数进行说明.如何检测本机是否有被中木马, ...
- 用UITextView模拟UITextField的placeHolder
用UITextView模拟UITextField的placeHolder 效果: 源码: // // ViewController.m // TextView // // Created by You ...
- 【matlab】 QR分解 求矩阵的特征值
"QR_H.m" function [Q,R] = QR_tao(A) %输入矩阵A %输出正交矩阵Q和上三角矩阵R [n,n]=size(A); E = eye(n); X = ...
- 铁乐学python_Day42_线程池
铁乐学python_Day42_线程池 concurrent.futures 异步调用模块 concurrent.futures模块提供了高度封装的异步调用接口 ThreadPoolExecutor: ...
- mysql5.7.22的安装与配置(适用mysql5.7.20至mysql5.7.22版本)
一.解压Mysql5.7.20安装包,刚解压是没有 data 这个文件夹的 二.配置mysql环境变量,创建MYSQL_HOME,然后在Path上添加%MYSQL_HOME%\bin; 三.配置m ...
- casperjs,phantomjs,slimerjs and spooky
1.casperjs http://casperjs.org/ CasperJS is a navigation scripting & testing utility for Phantom ...
- 使用FASTJSON做反序列化的时间格式处理
JSONObject.DEFFAULT_DATE_FORMAT = "yyyy-MM-dd'T'HH:mm:ss.mmm"; Productorder tmp1 = JSONObj ...
- python邮件处理
SMTP SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式.Python对SMTP支持有 ...