C语言:函数调用、参数传递、函数嵌套和链式访问、函数递归

循环结构 同时被 2 个专栏收录
10 篇文章 1 订阅
11 篇文章 0 订阅

内容

1.函数的概念
2.库函数
3.自定义函数
4.参数传递
5.函数嵌套和链式访问
6.函数递归
———————————————————————————————————————————

*1.函数的概念

函数:是一段可以被重复使用的代码,是一个子程序(是一个大型程序中的某部分代码, 由一个或多个语句块组成。它负责完成某项特定任务,而且相较于其他代码,具备相对的独立性。),可以实现特殊操作或功能的方法。
函数的分类:库函数 和 自定义函数
调用库函数或者该项目目录下另一个文件的函数时,需要包含头文件:
在这里插入图片描述
函数的声明:先声明后使用,一般出现在函数的使用之前,目的是提前告诉编译器,函数名、函数的返回类型、函数参数。函数的声明一般要放在头文件中。
语法:extern 函数类型 函数名 (参数列表)由于函数定义和函数声明很容易区分,所以关键字可以省略。
函数的定义:指函数的具体实现,交代函数的具体功能实现过程(操作)

*2.库函数

库函数:在进行C语言编程的时候,程序员频繁用到的一些函数,比如格式化打印函数(printf)、拷贝字符串函数(strcpy)、计算n的k次方的计算函数(pow)…诸如此类描述基础功能的函数,它们不是业务性的代码。但那是我们在开发的过程中每个程序员都可能用的到,为了支持可移植性和提高程序的效率,所以C语言的基础库中提供了一系列类似的库函数,方便程序员进行软件开发。
在这里插入图片描述

基本的库函数包括:

  • I/O函数
  • 字符串操作函数
  • 字符操作函数
  • 内存操作函数
  • 时间、日期函数
  • 数学函数
  • 其他库函数

库函数的使用:在程序中要使用库函数,则必须包含 #include 对应的头文件。
库函数的学习:学会查询工具的使用

  • MSDN(Microsoft Developer Network

  • www.cplusplus.com

  • http://en.cppreference.com
    (练习学习看英文文献)
    如:在猜数字游戏上一个c语言循环结构练习中需要使用设置随机数,我们可以查询rand函数->进入网址 www.cplusplus.com->搜索rand->
    在这里插入图片描述

  • 我们找到该函数定义,通过阅读,可以看到创建随机数的定义方法和随机数的取值范围。但是图中最后一句指出(通过这个函数模式定义的随机数并不能生成均匀随机的随机数)
    还需要设置随机数种子:
    在这里插入图片描述

在这里插入图片描述

  • 通过文档中给出的例子,可以看到要先生成近似真正的随机数,需要给srand(初始化随机数生成器)设置不同的随机数seed种子。比如随机数种子通过调用(time)当前时间代表值进行初始化,然后生成不同的随机数。在使用中需要(#include
  • 其次,随机数返回值类型为整型int,所以生成过程中 time类型需要强制转化使用srand((unsigned int) time (MULL));

*3.自定义函数

自定义函数:是程序员根据自己需求设置的符合函数定义规范的函数。
ret_type fun_name(para1, * )
{
statement; //语句项
}

  • ret_type 返回类型
  • fun_name 函数名
  • para1 函数参数

例:

int add(int x,int y)
{ //创建一个实现两数相加返回两数之和的函数
	return x+y;
}

*4.参数传递

(1)函数参数:

  • 真实传给函数的参数,叫实参。实参可以是:常量、变量、表达式、函数等。
  • 无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。
  • 形式参数是指函数名后括号中的变量,因为形式参数只有在函数被调用的过程中才实例化(分配内存单元),所以叫形式参数。形式参数当函数调用完成之后就自动销毁了。因此形式参数的作用域只在函数中。
//判断两数大小,并返回最大值
int get_max(int x,int y){
	return (x>y) ? (x) : (y);
}

int main(){
	int a=2;
	int b=3;
	get_max(a,b);
	return 0;
}

如上例所示:get_max()函数括号内的 x,y就是该函数的形式参数;在主函数中调用get_max(a,b) 时,此时 a,b 为函数的实际参数。

(2)参数传递

  • 值传递:函数调用时,将实参的值赋值给形参,实际上形参实例化就是实参的一份临时拷贝。执行函数体操作时,形参改变并不会影响实参。
  • 传址调用:就是把函数外部创建的变量地址(&变量名)作为函数实参,传递给形参的调用过程。相当于可以通过形参间接访问实参地址并进行修改的方式。形参的改变会引起实参改变。这种传参方式可以实现把函数和函数外部的变量联系起来,函数内部可以可以直接操作函数外部的变量。

例:

#include<stdio.h>
#include<stdlib.h>
//函数 值传递
void swap01(int x,int y){
	int temp = x;
	x = y;
	y = temp;
}
//函数 地址传递(定义一个指针指向实参地址作为函数形参)
void swap02(int *x,int *y){
	int temp = *x;
	*x = *y;
	*y = temp;
}

int main(){
	int a=1;
	int b=2;
	swap01(a,b);
	printf("a=%d,b=%d",a,b);
	swap02(&a,&b);
	printf("a=%d,b=%d",a,b);
	system("pause");
	return 0;
}

结果:
在这里插入图片描述

*5.函数嵌套和链式访问

函数嵌套:函数与函数之间可以有机结合,在一个函数体内可以调用另一个函数。(比如在main函数中调用其他函数的过程就是嵌套)
链式访问:把一个函数的返回值作为另一个函数的参数

#include <stdio.h>
#include <string.h>
int main()
{
    char arr[20] = "hello ";
 int ret = strlen(strcat(arr,"bit"));
 printf("%d\n", ret);
 return 0;
}

结果为:9
通过查找,得到strcat函数的使用方法:
在这里插入图片描述
strcat(目标字符串,源字符串):给目标字符串后面直接连接一个源字符串,形成一个新的目标字符串。
strlen函数是计算字符串长度,并不包含字符串自带的结束标志“\0”。

*6.函数递归

递归函数:一个函数在它的函数体内调用它自己的调用是递归调用,该函数成为递归函数。
程序叫用自身的编程思想叫递归( recursion)。 递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。 递归的主要思考方式在于:把大事化小。
注意:执行递归函数调用时,每调用一次就执行新的一层,直到最内层调用完成后,再由内向外一层层退出。
递归的两个必要条件:

  • 存在限制条件,当满足这个限制条件的时候,递归便不再继续。
  • 每次递归调用之后越来越接近这个限制条件。

相关数学算法方法:

  • 数学归纳法:

在这里插入图片描述

  • 分治思想:
    在这里插入图片描述
    在这里插入图片描述

例1:计算n的阶乘

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>

//递归调用计算n的阶乘
long factorial(int n) {
	long result = 0;  //定义一个结果变量
	if (n == 0 || n == 1) {
		return 1;
	}
	else {
		result = factorial(n - 1)*n; //递归调用,自己调用自己
	}
	return result;
}

int main() {

	int n = 0;
	printf("请输入一个整数:\n");
	scanf("%d", &n);
	printf("%d的阶乘为:%d\n",n,factorial(n));

	system("pause");
	return 0;
}

在这里插入图片描述
例2:
要求接受一个整型值(无符号),按照顺序打印它的每一位。 输入:1234,输出 1 2 3 4.

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>

//递归函数:实现对无符号整数从个位到最高位的依次输出
void printNum(int num) {
	if (num > 9)
	{
		printNum(num / 10);
	}
	printf("%d ", num % 10);
}

int main() {

	int num = 1234;
	printNum(num);
	system("pause");
	return 0;
}

在这里插入图片描述

  • 2
    点赞
  • 1
    评论
  • 3
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

评论 1 您还未登录,请先 登录 后发表或查看评论
©️2022 CSDN 皮肤主题:数字20 设计师:CSDN官方博客 返回首页

打赏作者

CY桑榆

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值