1、函数
函数是对实现某一功能的代码的模块化封装。
函数的定义:
标准函数:
输入 n 对整数的 a、b ,输出它们的和。
#include <iostream>
#include <windows.h>
using namespace std;
int add(int a,int b);//函数原型声明
int main()
{
int n,a,b;
cin>>n;
int *c=new int[n];//动态数组
for(int i=0;i<n;i++){
cin>>a>>b;
c[i]=add(a,b);//调用函数
}
for(int i=0;i<n;i++){
cout<<c[i]<<endl;
}
return 0;
}
int add(int a,int b){//函数定义
return a+b;
}
运行结果如下:
无返回值:
输入n,输出1~n之间所有整数。
#include <iostream>
#include <windows.h>
using namespace std;
void print(int n);//函数原型声明
int main()
{
int n;
cin>>n;
print(n);
return 0;
}
void print(int n){//函数定义
for(int i=1;i<=n;i++){
cout<<i<<endl;
}
}
运行结果:
无参数:
输入n,如果n为10的倍数,输出3个“very good!”。
#include <iostream>
#include <windows.h>
using namespace std;
void print();//函数原型声明
int main()
{
int n;
cin>>n;
if(n%10==0){
print();
}
return 0;
}
void print(){//函数定义
for(int i=1;i<=3;i++){
cout<<"very good!"<<endl;
}
}
运行结果如下:
传值参数:
输入两个整数a,b,交换后输出。
#include <iostream>
#include <windows.h>
using namespace std;
void swap(int x,int y);//函数原型声明
int main()
{
SetConsoleOutputCP(CP_UTF8);
int a,b;
cin>>a>>b;
swap(a,b);
cout<<"a和b交换后"<<a<<"\t"<<b<<endl;
return 0;
}
void swap(int x,int y){//传值参数定义
int temp;
temp=x;
x=y;
y=temp;
}
发现传值参数调用,只在函数内有效,离开函数,参数并未交换值。
引用参数:
比如:int &b = a; 在定义b的时候前面的符号& 就表示b是a的一个引用,对引用变量的赋值等操作相当于对变量本身的操作。所以你对b赋值 b=a+14其实相当于a=a+14操作,引用又称为别名,相当于一个人两个名字。所以b是15。
接下来我们在参数前面加个&号,代表引用参数,改变参数值,跳出函数依然生效。
数组参数:
输入n个数存入数组a[]中,求和后输出和值。
#include <iostream>
#include <windows.h>
using namespace std;
//int a[100];//定长数组
long long sum(int s[],int n){//参数数组
long long count=0;
for(int i=0;i<n;i++){
count+=s[i];
}
return count;
}
int main()
{
SetConsoleOutputCP(CP_UTF8);
int n;
cin>>n;
int *a = new int[n];//动态数组
for(int i=0;i<n;i++){
cin>>a[i];
}
cout<<"sum 计算结果"<<sum(a,n)<<endl;
return 0;
}
运行结果(这里我输入10个数):
字符串参数:
输入n个字母,如果是小写字母将其转换为大写字母,输出转换后的字符串。
#include <iostream>
#include <windows.h>
#include <cstring>
using namespace std;
string covert(string &s)
{
for(int i=0;i<s.length();i++){
if(s[i]>='a'&&s[i]<='z'){
s[i]-=32;//将小写字符转为大写
}
}
return s;
}
int main()
{
SetConsoleOutputCP(CP_UTF8);
string s;
cin>>s;
covert(s);
cout<<s<<endl;
return 0;
}
运行结果:
函数嵌套:
#include <iostream>
#include <windows.h>
#include <cstring>
using namespace std;
int gcd(int x,int y)//最大公约数
{
int t;
t=x%y;//求余数
while(t!=0)
{
x=y;//y做被除数
y=t;//余数做除数
t=x%y;//求余数
}
return y;
}
int lcm(int x,int y){//最小公倍数
return x*y/gcd(x,y);
}
int main()
{
SetConsoleOutputCP(CP_UTF8);
int a,b;
cin>>a>>b;
cout<<"最大公约数:"<<gcd(a,b)<<endl;
cout<<"最小公倍数:"<<lcm(a,b)<<endl;
return 0;
}
运行结果如下:
函数重载(多态):
多个同名函数(参数数目、类型、顺序不同)
写一个函数,对于字符串类型数据取其长度的一半,对于浮点数类型,求其值的二分之一。
#include <iostream>
#include <windows.h>
#include <cstring>
using namespace std;
float half(float a){
return a/2;
}
string half(string s){
int n=s.length()/2;
char *str=new char[n];
for(int i=0;i<n;i++){
str[i]=s[i];
}
return str;
}
int main()
{
SetConsoleOutputCP(CP_UTF8);
float a;
string b;
cin>>a>>b;
cout<<"float 的一半值:"<<half(a)<<endl;
cout<<"string 的一半值:"<<half(b)<<endl;
return 0;
}
运行结果:
函数模版:
-
C++另一种编程思想称为 泛型编程 ,主要利用的技术就是模板
-
C++提供两种模板机制:函数模板和类模板
函数模板作用:
建立一个通用函数,其函数返回值类型和形参类型可以不具体制定,用一个虚拟的类型来代表。
函数模版语法:
template<typename T>
T add(T x,T y)
{
return x+y;
}
解释:
template --- 声明创建模板
typename --- 表面其后面的符号是一种数据类型,可以用class代替
T --- 通用的数据类型,名称可以替换,通常为大写字母
函数模版使用示例:
//交换整型函数
void swapInt(int& a, int& b) {
int temp = a;
a = b;
b = temp;
}
//交换浮点型函数
void swapDouble(double& a, double& b) {
double temp = a;
a = b;
b = temp;
}
//利用模板提供通用的交换函数
template<typename T>
void mySwap(T& a, T& b)
{
T temp = a;
a = b;
b = temp;
}
void test01()
{
int a = 10;
int b = 20;
//swapInt(a, b);
//利用模板实现交换
//1、自动类型推导
mySwap(a, b);
//2、显示指定类型
mySwap<int>(a, b);
cout << "a = " << a << endl;
cout << "b = " << b << endl;
}
int main() {
test01();
system("pause");
return 0;
}
总结:
- 函数模板利用关键字 template
- 使用函数模板有两种方式:自动类型推导、显示指定类型
- 模板的目的是为了提高复用性,将类型参数化