函数的作用,一是为了减少代码量,二是为了便于调试。
如果将所有代码的运行部分全部写在主函数中,那么调试的时候,只能一行一行调试
然而如果封装了函数,可以只调试对应的函数。
在编码中,能封装成函数,尽量封装成函数,这样会使你的思路更加清晰,逻辑更加简洁。
返回值类型 函数名(形式参数类型 形式参数名){//可以有多个形式参数
函数内容;
return 返回值;
}
//若没有返回值,则返回值类型应用void
返回值类型即变量类型,例如:
变量类型 | 名称 | 存储的内容 | 上限 |
---|---|---|---|
int | 整型 | 整数 | 2^31-1 |
long int | 长整型 | 整数 | 2^31-1 |
long long int | 超长整形 | 整数 | 2^63-1 |
float | 浮点型 | 小数 | 3.4E+38 |
double | 双精度浮点型 | 小数 | 1.7*10(308) |
char | 字符型 | 字符 | / |
bool | 布尔型 | true/false | / |
我们来举个例子:
bool is_prime(x){
for(int i = 2; i*i <= x; i++){
if(x % i == 0)return false;
}
return true;
}
上面是一个判断质数的函数
值得注意的是,当函数运行到返回值语句时,这个函数就结束了。
递归
1.定义:程序调用自身的编程技巧叫做递归
2.递归程序的组成部分:
1:设计递归函数的语义信息
2:边界条件处理
3:针对于问题的处理过程和递归过程
4:结果返回
下面来用递归写一个阶乘程序:
#include <iostream>
#include <cstdio>
using namespace std;
long long int factorial (int x){
if(x<=1)return 1;
else return x *= (factorial(x-1));
}
int main()
{
int a;
cin >> a;
cout << factorial(a);
return 0;
}
函数指针
返回值类型 函数名(所调用函数的返回值类型 (*所调用函数的函数名)(所调用函数的形式参数类型)){
函数语句;
return 返回值;
}
扩展欧几里得算法
#include <iostream>
#include <cstdio>
using namespace std;
int kz_gcd(int a, int b, int *x, int *y){
if(!b) {
*x = 1, *y = 0;
return a;
}
int xx,yy,ret = kz_gcd(b,a%b,&xx,&yy);
*x=yy;
*y=xx-(a/b)*yy;
return ret;
}
int main(){
int a,b,x,y;
while (~scanf("%d%d", &a, &b)){
printf("%d和%d的最大公约数为%d\n", a, b, kz_gcd(a,b,&x,&y));
printf("%d*%d+%d*%d=%d",a,x,b,y,a*x+b*y);
}
}
变参函数
函数名 | 函数作用 |
---|---|
va_list | 获得a后面的参数列表 |
va_start | 获得a后面的第一个参数 |
va_arg | 获得下一个参数 |
va_end | 获得最后一个参数 |
#include <iostream>
#include <stdio.h>
#include <stdarg.h>
using namespace std;
int max_int(int n, ... ){//...代表可变参数列表
int ans = 0;//设置变量ans用来存储答案
va_list arg;//声明变量arg,用来存储参数列表
va_start(arg,n);//使arg中的n成为第一个参数
while(n--){//循环n次
int tmp = va_arg(arg,int);//声明变量tmp,用于arg中某一参数的值
if(tmp > ans) ans = tmp; //如果ans>tmp,则更新ans
}
va_end(arg);//结束arg
return ans;
}
int main(){
int a,b,c;
cin>>a>>b>>c;
cout<<max_int(a,b,c);
}