1. 函数
作用:对某一个具体功能的过程进行封装,对细节进行隐藏
基本形式:
返回类型 函数名(参数类型 参数名1,参数类型 参数名2 . ....){
//主要功能
....
return 返回值;
}
分类:
- 库函数:比如printf,scanf等
- 自定义函数
可以在memset - C++ Reference (cplusplus.com)
查找自己自己需要的库函数,及对应的头文件。
例如,math.h中提供了一系列数学计算函数:
2. 函数的调用
函数调用自身称为递归。
递归的==两个必要条件==:
- 存在限制条件,当满足这个条件时,递归便不再继续。
- 每次递归调用之后越来越接近这个限制条件。
1. 传值调用
函数的形参和实参分别占有不同的内存块,对形参修改==不会==影响实参。
- 代码示例
#include<stdio.h>
//交换函数
void swap(int x, int y)//x,y是形参
{
int tmp = x;
x = y;
y = tmp;
}
int main()
{
int a, b, c;
printf("请输入任意三个数\n");
scanf("%d %d %d", &a, &b, &c);
if (a > b)
{
swap(a, b); // 实参
}
if (b > c)
{
swap(b, c);
}
if (a > b)
{
swap(a, b);
}
printf("这三个数从小到大依次为%d %d %d:\n", a, b, c);
return 0;
}
2. 传址调用
-
传址调用是把函数外部所创建的==变量的内存地址==传递给函数参数的一种调用方式;
-
这种方式可以让函数和外部变量建立真正的联系,也就是函数内部就可以直接操作外部变量。
-
代码示例
#include<stdio.h>
void swap(int* px, int* py) // 参数变为指针
{
int tmp = *px;
*px = *py;
*py = tmp;
}
int main()
{
int a, b, c;
printf("请输入任意三个数\n");
scanf("%d %d %d", &a, &b, &c);
if (a > b)
{
swap(&a, &b); // 传入参数为变量地址
}
if (b > c)
{
swap(&b, &c);
}
if (a > b)
{
swap(&a, &b);
}
printf("这三个数从小到大依次为%d %d %d:\n", a, b, c);
return 0;
}
- ==注意:==
- ==函数的定义时:参数类型变为指针类型,操作时也是直接操作指针,也就是带*==
- ==函数使用时,传入的参数名前加上取地址符&==
3. 递归调用
1.直接递归
#include <stdio.h>
void Add(int b,int sum) {
sum += b;
//设定一个结束递归的条件,否则陷入死循环
if (sum < 50) {
printf("%d\n", sum);
Add(b,sum);//函数定义的内部调用本身
}
}
int main() {
int b;
int sum =0;
scanf("%d",&b);
Add(b,sum);
return 0;
}
2.间接递归
- 示例程序:输入两个参数a,b。结果如果不等于50,则从0开始一直加上a,减去b。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
void Add(int a, int b, int res);
void Subtract(int a, int b, int res);
void Add(int a,int b,int res) {
res += a;
if (res !=50) {
printf("%d\n", res);
Subtract(a,b,res);
}
else {
printf("sum=50!\n");
}
}
void Subtract(int a,int b,int res) {
res -= b;
if (res !=50) {
printf("%d\n", res);
Add(a,b, res);
}
else {
printf("sum=50!\n");
}
}
int main() {
int a,b;
int sum =0;
scanf("%d %d",&a,&b);
Add(a,b,sum);
return 0;
}
练习题
判断素数
思路:素数的定义:不能被除1和本身以外的任何数字整除。
- 代码
//判断质数
#include <stdio.h>
int Prime_Num(int num) {
if (num==2||num==3) {
return 1;
}
else if (num > 3) {
int i = 2;
while (i<num) {
if (num % i == 0) {
return -1;
}
i++;
}
return 1;
}
else {
return -1;
}
}
int main() {
int num;
scanf("%d",&num);
int flag=Prime_Num(num);
if (flag == 1) {
printf("%d是素数!\n",num);
}
else {
printf("%d不是素数!\n", num);
}
return 0;
}
- 运行效果