函数

子淼
发布于 2024-04-03 / 74 阅读
1
0

函数

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;
}


评论