C++实验二——函数重载、函数模板、简单类的定义和实现
一、实验过程
函数重载编程练习
实验要求:编写重载函数add(),实现对int型,double型,complex型数据的加法。在main函数中定义不同类型的数据,调用测试。
代码实现:
先是简单的体验函数重载:
#include<iostream>
using namespace std;
struct Complex {
double real;
double imag;
};
int add(int, int);
double add(double,double);
Complex add(Complex, Complex);
int main()
{
cout<<add(,)<<endl;
cout<<add(5.7,12.7) <<endl;
cout<<add(,)<<"+"<<add(,)<<"i"<<endl;
}
int add(int a,int b)
{
return a+b;
}
double add(double a,double b)
{
return a+b;
}
Complex add(Complex a,Complex b)
{
Complex r;
r.real=a.real+b.real;
r.imag=a.imag+b.imag;
return r;
}

在前面内容的基础上,对代码和功能做了完善,使它更符合这个实验对代码的运行要求。
#include<iostream>
using namespace std;
struct Complex {
double real;
double imag;
};
int add(int, int);
double add(double,double);
Complex add(Complex, Complex);
int main()
{
char c;
int tries=;
while(true)
{
tries++;
cout<<"This is your "<<tries<<"th calculation"<<endl;
cout<<"please choose your data type(p(复数) or r(实数)):";
cin>>c;
if(c=='r')
{
cout<<"please enter two numbers:" ;
double a,b;
cin>>a>>b;
cout<<"The sum of the two numbers is:" <<add(a,b)<<endl;
}
else if(c=='p')
{
cout<<"please enter two plural:";
Complex p,q;
cin>>p.real>>p.imag;
cin>>q.real>>q.imag;
cout<<"The sum of the two numbers is:"<<(add(p,q)).real<<"+"<<(add(p,q)).imag<<"i"<<endl;
}
else
{
cout<<"Your input is incorrect" <<endl;
break;
}
}
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)
{
Complex r;
r.real=a.real+b.real;
r.imag=a.imag+b.imag;
return r;
}
运行结果如下:

函数模板编程练习
实验要求:编写实现快速排序函数模板,并在main函数中,定义不同类型数据,调用测试。
算法设计:快速排序用了二分的思想,先通过一个数把一组数分成两部分,其中一部分均比另一部分要小。之后分别再对这两个部分继续分割排序,最后使整个数组有序排列。排序分成了三个步骤:选择一个数(pivot)作为分割标准、分割、递归。这个排序函数模板的核心就是最后的递归。
代码实现
#include<iostream>
using namespace std;
void QuickSort(double ar[], int left ,int right) {
if(left<right)
{
int i = left;
int j = right;
double x = ar[i];
while(i<j)
{
while(i<j&&ar[j]>x)
j--;
if(i<j)
{
ar[i] = ar[j];
i++;
}
while(i<j&&ar[i]<x)
i++;
if(i<j)
{
ar[j] = ar[i];
j--;
}
}
ar[i] = x;
QuickSort(ar, left, i-);
QuickSort(ar, i+, right);
}
}
int main()
{
int n = ;
double ar[]={,,,,,,,,};
int i;
cout<<"The remote arry is:";
for(i=;i<n;++i)
cout<<ar[i]<<' ';
cout<<endl;
QuickSort(ar,,n-);
cout<<"The arranged arry is: ";
for(i=;i<n;++i)
cout<<ar[i]<<' ';
cout<<endl;
return ;
}

类的定义、实现和使用编程练习
实验要求:设计并实现一个用户类User,并在主函数中使用和测试这个类。具体要求如下:
- 每一个用户有用户名(name), 密码(passwd),联系邮箱(email)三个属性。
- 支持设置用户信息setInfo()。允许设置信息时密码默认为6个1,联系邮箱默认为空串。
- 支持打印用户信息printInfo()。打印用户名、密码、联系邮箱。其中,密码以6个*方式显示。
- 支持修改密码changePasswd(),。在修改密码前,要求先输入旧密码,验证无误后,才允许修改。
- 如果输入旧密码时,连续三次输入错误,则提示用户稍后再试,暂时退出修改密码程序。
在main()函数中创建User类实例,测试User类的各项操作(设置用户信息,修改密码,打印用户信
息)
User类功能的完善及拓展丰富(===选做===)
自行设计。在前述内容的基础上,对代码和功能做完善,使其更符合实际应用场景。比如:
- 支持修改邮箱;用户设置邮箱时对邮箱地址合法性的检测提示(比如是否包含@)
- 用户更改密码时,当用户输入旧密码和新密码时,屏幕上均以星号代替,而不会显示用户实际
- 输入的密码;设置密码时对密码的长度、合法性进行有效性校验,等等
代码实现
#include <iostream>
#include <string>
#include<conio.h>
using namespace std;
class User
{
public:
User();
~User(); public:
//设置用户信息
void setInfo(); //打印用户信息
void printInfo(); //修改密码
void changePassword(); //修改邮箱
void changeEmail(); //设置*号
string getXinghao(); private:
string user_name_; //用户名
string user_password_; //密码
string user_email_; //邮箱
}; User::User()
{
user_password_ = ""; //密码默认为6个1
user_email_ = "";
} User::~User()
{ } void User::setInfo()
{
cout << "请输入用户名:";
cin >> user_name_; cout << "请输入密码:";
cin >> user_password_; cout << "邮箱:";
cin >> user_email_;
} void User::printInfo()
{
cout << "用户名:" << user_name_ <<endl;
cout << "密码:" << user_password_ <<endl;
cout << "邮箱:" << user_email_ <<endl;
} void User::changePassword()
{
string strOld, strNew;
int nCount = ; do
{
cout << "请输入旧密码:" <<endl;
strOld = getXinghao();
if (strOld.compare(user_password_) != )
{
int tries=;
tries++;
cout << "旧密码不正确!" << "这是您第"<<tries<<"输错密码"<<endl;
if(tries>=)
{
break;
}
}
else
{
cout << "请输入新密码:" << endl;
strNew = getXinghao();
if (strNew.size() != ) //密码6位数
{
cout << "密码长度不正确!" <<endl;
}
else
{
user_password_ = strNew;
cout << "修改密码成功!" <<endl;
break;
}
}
nCount++;
} while (nCount < );
} void User::changeEmail()
{
cout << "请输入新邮箱:";
string strEmail;
cin >> strEmail; if (strEmail.find("@") != string::npos)
{
user_email_ = strEmail;
}
else
{
cout << "邮箱地址不正确!" << endl;
}
} string User::getXinghao()
{
string password;
int i = ;
char ch;
while ((ch = _getch()) != )
{
i++;
if (ch != '\0')
{
password += ch;
cout << "*";
}
} cout <<endl; return password;
} int main()
{
User user; //设置信息
user.setInfo(); //显示信息
user.printInfo(); //修改密码
user.changePassword(); //显示信息
user.printInfo(); //修改邮箱
user.changeEmail(); //显示信息
user.printInfo();
}


二、实验反思
1、实验一中关于复数的运算,可以写一个复数类。实验二中快排的优点就是速度极快,数据移动少,但是当快排到后期,当待排数组割到一定大小后,快排不如其他一些排序方法好,此时可以用插排等,后期查了些资料,三数取中+插排效率要更高一点。总而言之,各排序方法都有各自的优缺点。
2、函数重载减少了函数名的数量,让代码更清晰,代码可读性提高。类有很多优点,我认为很大一部分体现在模块化编程上,将具有特定功能的一个组件封装到一个类中。将各个模块独立,能够使得程序结构更加清晰,可以减少程序的bug。
互评地址:https://www.cnblogs.com/yidaoyigexiaopenyou/p/10556646.html
https://www.cnblogs.com/sjn1/p/10556014.html
https://www.cnblogs.com/elise00/p/10555817.html
C++实验二——函数重载、函数模板、简单类的定义和实现的更多相关文章
- C++ 类的多态二(函数重载--函数重写--函数重定义)
//函数重载--函数重写--函数重定义 #include<iostream> using namespace std; /* 函数重载: 必须在一个类中进行(子类无法重载父类中的函数) 子 ...
- singleton 类模板限制类只能定义一个对象
singleton 类模板限制类只能定义一个对象 singleton 类模板限制类只能定义一个对象 singleton 类模板限制类只能定义一个对象 ???
- C++ 实验2:函数重载、函数模板、简单类的定义和实现
1.函数重载编程 编写重载函数add(),实现对int型,double型,Complex型数据的加法.在main()函数中定义不同类型数据,调用测试. #include <iostream> ...
- c++学习笔记之函数重载和模板理解
1.函数重载: C++ 不允许变量重名,但是允许多个函数取相同的名字,只要参数表不同即可,这叫作函数的重载(其英文是 overload).重载就是装载多种东西的意思,即同一个事物能完成不同功能. 所谓 ...
- c++之函数重载(函数匹配)
Case void f(); void f(int); void f(int, int); void f(double, double = 3.14); 匹配原则: 1)其形参数量与本次调用提供的实参 ...
- JS高级之简单类的定义和继承
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- C++学习笔记之模板(1)——从函数重载到函数模板
一.函数重载 因为函数重载比较容易理解,并且非常有助于我们理解函数模板的意义,所以这里我们先来用一个经典的例子展示为什么要使用函数重载,这比读文字定义有效的多. 现在我们编写一个交换两个int变量值得 ...
- C++ primer(八)--内联函数 引用变量 引用传递函数参数 函数重载/模板/模板具体化
一.内联函数 常规函数和内联函数的区别在于C++编译器如何将他们组合到程序中.编译过程的最终产品是可执行程序--由一组机器语言指令组成.运行程序时,操作系统将这些指令载入到计算机内存中,因此每 ...
- C++函数重载和函数模板(04)
函数重载 函数重载可以使一个函数名具有多种功能,即具有“多种形态”,这种特性称为多态性. C++的多态性又被直观地称为“一个名字,多个函数”.源代码只指明函数调用,而不说明具体调用哪个函数.编译器的这 ...
随机推荐
- Linux系统备份还原工具1(DD)
注意:只要时运行备份,建议都使用Ubuntu的Live CD功能启动来操作(即启动盘下的试用Ubuntu而不安装的功能),因为这样可以减少资源占用造成的备份不完整. 说明: 1.使用DD进行硬盘备份可 ...
- tensorflow变量-【老鱼学tensorflow】
在程序中定义变量很简单,只要定义一个变量名就可以,但是tensorflow有点类似在另外一个世界,因此需要通过当前的世界中跟tensorlfow的世界中进行通讯,来告诉tensorflow的世界中定义 ...
- call、apply、bind
***call,apply,bind 替换this 何时: 只要this不是想要的都可用call,apply,bind替换 选择: call/apply: *调用*函数,在调用时,*临时*替换函数中的 ...
- Django--Hello
学习导向:what(是什么).why(为什么).how(怎么用) 1.视图 ①.在没有框架的时代,我们一般使用html实现一个页面 ②.但是现在我们不可能用写html来实现所有功能(不可能) ③.我们 ...
- 同源策略jsonp和cors
同源策略: 同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响.可以说Web是构建在同源策略基础之上 ...
- Microsoft Office Word 中的公式自动编号
先插入公式,#,插入题注(交叉引用),生成了标号.此时整个公式是题注样式.在公式和标号之间插入一个样式分隔符. ____________________________________________ ...
- sqlalchemy.exc.ProgrammingError: (pymysql.err.ProgrammingError)
在我学习flask建立网站时间碰到了一个棘手的问题,就是在我进行操作日志的更新时间,发现表格建立有点错误,导致表缺失,从而报了下面的错误 sqlalchemy.exc.ProgrammingError ...
- vscode断点调试工程化服务端文件
一.创建express应用我们使用express-generator创建一个新的express应用.1.全局安装express-generator // 安装 sudo npm install exp ...
- IDEA 2018.2.5最新版破解到2100年图解教程
先看下我破解后的效果图 把下载的破解补丁放在你的idea的安装目录下的bin的目录下面(如下图所示),本文示例为F:\ProgramFiles\JetBrains\IntelliJ IDEA 2018 ...
- BZOJ.4598.[SDOI2016]模式字符串(点分治 Hash)
LOJ BZOJ 洛谷 点分治.考虑如何计算过\(rt\)的答案. 记\(pre[i]\)表示(之前的)子树内循环匹配了\(S\)的前缀\(i\)的路径有多少,\(suf[i]\)表示(之前的)子树内 ...