函数

目录

一 分类

库函数

自定义函数

函数的结构

二 函数的参数

实际参数(实参)

形式参数(形参)

三 函数的调用

传值调用

传址调用

四 函数的嵌套调用和链式访问

嵌套调用:

链式访问:

五 函数的声明和定义

函数的声明:

函数的定义:

应用:

六 函数递归

函数递归是什么

递归的两个必要条件


一 分类

库函数

常见的库函数有:

IO函数

字符串操作函数

内存操作函数

时间函数

数学函数

其他库函数

我们不需要将所有的库函数都记住,没必要也不现实,我们要学会在需要时查找并学习使用库函数。推荐一个学习库函数的网站:www.cplusplus.com

这里举两个学习使用的例子:

1 strcpy

首先,要使用库函数,必须要包含对应的#include头文件。strcpy就在头文件string.h中。

65ac04564e5b4108bf441989569e5b2d.png

4f31d3e294c8445f9305c138647df533.png

 08002848707c4bee8f552d27164071ea.png

 27e1841540c045c5b74a71f59238ccf3.png

 例子:

#include <stdio.h>
#include <string.h>
int main()
{
	char ch1[] = "brilliantalone";
	char ch2[20] = { '0' };
	strcpy(ch2, ch1);
	printf("%s", ch2);
	return 0;
}

2memset

da1cafe898324459a49008b7d6277e7a.png

d1d704e0ceae4805ad1798637ba6107b.png

ef5a32a758344d84911bdf9873f8ca8c.png

这里value的数据类型是int,但是可以输入字符,因为根据ASC码表每一个字符都对应着一个整数。

 d7849e2067814257855bf98cce52acbb.png

例子:

#include <stdio.h>
#include <string.h>
int main()
{
	char ch1[] = "brilliantalone";
	memset(ch1, 'd', 6);
	printf("%s", ch1);
	return 0;
}

自定义函数

总有一些问题是库函数不能解决的,需要我们自定义函数。

和库函数一样,自定义函数也需要返回类型,函数名和参数。

函数的结构

        返回类型    函数名  (参数,参数...)

        {

                函数语句;

        }

例子:

 计算字符串中字符的个数

#include <stdio.h>
#include <string.h>
int count(char* ch)
{
	int i = 0;
	int k = 0;
	for (i = 0;i < strlen(ch);i++)
	{
		if (ch[i] != '\n')
			k++;
	}
	return k;
}
int main()
{
	char ch1[] = "brilliantalone";
	int x = count(ch1);
	printf("%d", x);
	return 0;
}

二 函数的参数

实际参数(实参)

函数调用时,真实传给函数的参数是实参,实参可以是常量,变量,表达式或函数等,但都必须是一个确定的值,以便把这些值传给形参。

形式参数(形参)

形式参数是函数括号后的变量,因为只有在函数被调用时才实例化(分配内存空间),所以叫形式参数。形式参数在函数调用结束后就被销毁,所以形式参数只在函数内起作用。

三 函数的调用

传值调用

将实参的值传给形参。

形参只是实参的一份临时拷贝,所以改变形参的值不改变实参的值。

传址调用

将函数外部变量的内存地址传给形参。

传址调用可以让函数与函数外的变量建立实际的联系,所以函数内部可以直接操作外部变量。

例子:

交换两个数字

d364391b2c374abdab13a52fc2f23a79.png

 因为传值调用,函数只是把x的值赋给a,把y的值赋给b,再对ab的值进行交换,在函数调用结束后ab被销毁,所以x和y的值并没有改变。

2489110ccc6b4434b59adcb515324997.png

 传址调用通过指针直接改变实参。

四 函数的嵌套调用和链式访问

嵌套调用:

#include <stdio.h>
void new_line()
{
	printf("brilliantalone\n");
}
void three_line()
{
	int i = 0;
	for (i = 0; i < 3; i++)
	{
		new_line();
	}
}
int main()
{
	three_line();
	return 0;
}

函数可以嵌套调用,但是不可以嵌套定义。

链式访问:

#include <stdio.h>
int max(int a, int b)
{
	return a > b ? a : b;
}
int main()
{
	int x = 10;
	int y = 20;
	int z = 30;
	int n = max(z, max(x, y));
	printf("%d", n);
	return 0;
}

五 函数的声明和定义

函数的声明:

函数的声明要在使用前,先声明后使用。

一般函数声明在头文件中。(不少书中为了使用函数声明,在主函数前声明函数,将函数定义放在主函数后面,个人认为这种代码正常人不会写,只是为了使用而使用。)

函数的定义:

函数的定义是指函数的具体实现,交代函数的具体功能实现。

应用:

函数的分文件编写:

第一步:在头文件放置函数的声明

19d9719bce0442e995cb3e2be14d5458.png

 第二步:在源文件中放置函数的定义

701177f92be148b89007d55d7be666a7.png

第三步:在项目中引用头文件#include"e.h"使用

 6bce57f0254b4fb4b86bcec3825318d6.png

六 函数递归

函数递归是什么

递归是在一个过程中或函数定义说明中直接或间接调用自身的一种算法,可以将复杂问题逐个分解为多个相似的问题解决,可以大大减少代码量,但是代码未必高效,如果运算量过大还会造成程序崩溃,栈溢出的问题。

递归的两个必要条件

1存在限制条件,在满足这个条件后,递归不再执行;

2在每一次递归调用后,都越来越接近限制条件

例子:

1 接受一个整型值(无符号),按照顺序打印它的每一位。

#include <stdio.h>
int evenum(int n)
{
	if (n > 9)
	{
		evenum(n / 10);
	}
	printf("%d ", n % 10);
}
int main()
{
	int n = 0;
	scanf("%d", &n);
	evenum(n);
	return 0;
}

2 编写函数不允许创建临时变量,求字符串的长度。

#include <stdio.h>
int count(char* str)
{
	if (*str != '\0')
		return 1 + count(str + 1);
	else
		return 0;
}
int main()
{
	char ch[] = "brilliantalone";
	int n = count(ch);
	printf("%d", n);
	return 0;
}

3 求n的阶乘

int factorial(int n)
{
    if(n <= 1)
        return 1;
    else
        return n * factorial(n-1);
}

4 求第n个斐波那契数

#include <stdio.h>
int fib(int n)
{
	if (n < 3)
		return 1;
	else
		return fib(n - 1) + fib(n - 2);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值