1.什么是函数
函数是对实现某一功能的代码的模块化封装,定义如下:
返回值类型 函数名(参数类型 参数名1,参数类型 参数名2,......,参数类型 参数名n){
执行语句;
return 返回值;
}
在 C++ 中,函数由一个函数头和一个函数主体组成。下面列出一个函数的所有组成部分:
返回类型:一个函数可以返回一个值。return_type 是函数返回的值的数据类型。有些函数执行所需的操作而不返回值,在这种情况下,return_type 是关键字 void。
函数名称:这是函数的实际名称。函数名和参数列表一起构成了函数签名。
参数:参数就像是占位符。当函数被调用时,您向参数传递一个值,这个值被称为实际参数。参数列表包括函数参数的类型、顺序、数量。参数是可选的,也就是说,函数可能不包含参数。
函数主体:函数主体包含一组定义函数执行任务的语句。
2.标准函数
例如:输入n对整数a和b,输出它们的和。
#include<iostream>
using namespace std;
int add(int a,int b){
return a+b;
}
int main(){
int n,a,b;
cin >> n;
for(int i=1;i<=n;i++){
cin >> a >> b;
c = add(a,b);
cout<<c<<endl;
}
return 0;
}
3.无返回值函数
如果函数没有返回值,则返回值类型维void。
例如:输入n,输出n个*号
#include<iostream>
using namespace std;
void print(int n){
for(int i=1;i<=n;i++){
cout<<"*";
}
}
int main(){
int n;
cin >> n;
print(n);
return 0;
}
4.无参数函数
例如:输入n,如果n为10的倍数,输出3个good。
#include<iostream>
using namespace std;
void print(){
for(int i=1;i<=3;i++){
cout<<"good"<<endl;
}
}
int main(){
int n;
cin >> n;
if(n%10==0){
print();
}
return 0;
}
5.传值调用(方式1)
传值函数在函数内部的改变出了函数无效。
例如:
#include<iostream>
using namespace std;
void change(int x,int y){
x = 10;
y = 11;
cout<<"改变"<<x<<" "<<y<<endl;
}
int main(){
int a=3,b=5;
cout<<"改变前"<<a<<" "<<b<<endl;
change(a,b);
cout<<"改变后"<<a<<" "<<b<<endl;
return 0;
}
上面代码输出为:
改变前3 5
改变10 11
改变后3 5
说明执行change函数后,a和b的值没有被改变。
6.引用调用(方式2)
引用参数在参数前加&符号,引用参数在函数内部的改变出了函数后仍然有效。
例如:
#include<iostream>
using namespace std;
void change(int &x,int &y){
x = 10;
y = 11;
cout<<"改变"<<x<<" "<<y<<endl;
}
int main(){
int a=3,b=5;
cout<<"改变前"<<a<<" "<<b<<endl;
change(a,b);
cout<<"改变后"<<a<<" "<<b<<endl;
return 0;
}
上面代码输出为:
改变前3 5
改变10 11
改变后10 11
说明执行change函数后,a和b的值被改变了。
7.指针调用(方式3)
该方法把参数的地址赋值给形式参数。在函数内,该地址用于访问调用中要用到的实际参数。这意味着,修改形式参数会影响实际参数。
#include <iostream>
using namespace std;
void swap(int *x, int *y){
int temp;
temp = *x;//保存地址x的值
*x = *y;//把 y 赋值给 x
*y = temp;//把 x 赋值给 y
return;
}
int main (){
int a = 100;
int b = 200;
cout << "交换前,a 的值:" << a << endl;
cout << "交换前,b 的值:" << b << endl;
swap(&a, &b);
cout << "交换后,a 的值:" << a << endl;
cout << "交换后,b 的值:" << b << endl;
return 0;
}
输出结果为
交换前,a 的值:100
交换前,b 的值:200
交换后,a 的值:200
交换后,b 的值:100
8.数组参数函数
例如:输入n个整数并将其存入a[]数组,求和后输出值。
#include<iostream>
using namespace std;
//int arr(int *a,int n){ 这样写也可以
int arr(int a[],int n){
int sum=0;
for(int i=0;i<n;i++){
sum+=a[i];
}
return sum;
}
int main(){
int n,s;
int a[1001];
cin >> n;
for(int i=0;i<n;i++){
cin >> a[i];
}
s = arr(a,n);//数组传参只写数组名
cout<<s<<endl;
return 0;
}
注意:数组的名字就是一个地址,所有数组作为参数进入函数是,如果函数内改变了数组内容,函数结束后,数组的值会改变。
#include<iostream>
using namespace std;
void arr(int a[]){
for(int i=1;i<=5;i++){
a[i]=1;
}
}
int main(){
int a[1001];
for(int i=1;i<=10;i++){
a[i] = i;
}
arr(a);
for(int i=1;i<=10;i++){
cout<<a[i]<<" ";
}
return 0;
}
代码输出
1 1 1 1 1 6 7 8 9 10
9.字符串参数函数
char类型字符在函数传参时遵循数组的规律,string类型字符串在函数传参时和int一样。
示例1:
#include<iostream>
using namespace std;
void arr(string s){
s="abc";
}
int main(){
string s = "123";
arr(s);
cout<<s;
return 0;
}
输出结果为:123
示例2:
#include<iostream>
using namespace std;
void arr(string &s){
s="abc";
}
int main(){
string s = "123";
arr(s);
cout<<s;
return 0;
}
输出结果为:abc
10.函数嵌套
多个函数之间可以相互调用,函数也可以自己调用自己(递归)。
例如:输入两个整数a和b,求这两个整数的最大公约数和最小公倍数。
#include<iostream>
using namespace std;
//最大公约数 辗转相除法
int gcd(int x,int y){
int t;
t = x%y;
while(t!=0){
x = y;
y = t;
t = x%y;
}
return y;
}
//最小公倍数
int lcm(int x,int y){
int g;
g = gcd(x,y);//调用gcd函数
return x*y/g;
}
int main(){
int a,b,c,d;
cin>>a>>b;
c = gcd(a,b);
d = lcm(a,b);
cout<<c<<endl;//公约数
cout<<d<<endl;//公倍数
return 0;
}
11.函数模板(了解)
例如:输入两个数a和b(整数或者浮点数),求这两个数的和。
#include<iostream>
using namespace std;
template<typename T>//模板
T add(T x,T y){
return x+y;
}
int main(){
int a,b;
double c,d;
cin>>a>>b>>c>>d;
cout<<add(a,b)<<endl;
cout<<add(c,d)<<endl;
return 0;
}