当前位置: 首页 > article >正文

函数(c语言进阶)


目录

一.库函数

1.使用库函数的步骤

memset函数

Strcpy函数

二.函数的定义:

实例1:写一个函数求最大值

三.函数的参数

四.函数的传值调用和传址调用

1.传值调用

实例:判断是否为闰年,用函数写

2.传址调用

实例:交换俩个数的值,通过函数来实现

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

1.嵌套调用

2.链式访问

六.函数的声明

函数的声明

​编辑

函数的定义

七.函数的递归

递归的限制条件

例题1:斐波那契数列的实现

例题2:字符串的逆序,使用函数递归实现

例题3:打印数字的每一位


一.库函数

在 C 语言中,库函数是指预先定义并编译好的函数,这些函数可以被程序员在其代码中调用。这些函数在不必重新编写代码的情况下提供了常用功能,从而提高了编程的效率和方便性

1.使用库函数的步骤

  1. 包含头文件:在代码中使用 #include 指令包含相关的头文件。例如:

    #include <stdio.h>
  2. 调用库函数:直接调用库函数,就像调用任何其他函数一样。例如:

    printf("Hello, World!\n");

举例

memset函数

#include<string.h>
#include<stdio.h>


int main()
{
	char arr[] = { "Hello World" };
	//第一个目标对象
	//修改内容
	//修改范围
	memset(arr, 'X', 5);
	printf("%s", arr);
	return 0;
}

Strcpy函数

这个函数具有拷贝功能,能把\0拷贝过来

#include<string.h>
#include<stdio.h>
int main()
{
	char arr1[] = { "Hello World" };
	char arr2[20] = {"#######"};
	//arr2 拷贝目标
	//arr1 拷贝对象
	strcpy(arr2, arr1);
	printf("%s", arr2);

	return 0;
}

程序运行

二.函数的定义:

返回值类型 函数名(参数类型1 参数名1, 参数类型2 参数名2, ...) 
{
    // 函数体
}

实例1:写一个函数求最大值

//函数的定义
int Max(int a, int b)
{
	if (a > b)
	{
		return a;
	}
	else if (a < b)
	{
		return b;
	}
	else
	{
		return a;//或者return b
	}
}
//return会把值返回到函数调用的部分



int main()
{
	int a = 0;
	int b = 0;
	scanf("%d %d", &a, &b);
	int num =Max(a, b);//函数的调用
	printf("%d ", num);
	return 0;
}

三.函数的参数

实参:真实传给函数的参数

实参可以是常量,表达式,变量,函数等。

无论实参是何种类型的值,在函数调用的时候,都必须要有确定的值,以便传给形参

形参:是指函数名后括号中的变量,因为形式参数只有在函数调用的时候实例化,所以叫形式参数

,形式参数当函数调用后就自动销毁了。因此,形式参数只有在函数内才有效

四.函数的传值调用和传址调用

1.传值调用

特征

传值调用时,函数接收的是参数的副本

修改函数内部的参数不会影响到实参

实例:判断是否为闰年,用函数写

int year(a)
{
	if (a % 4 == 0 && a % 100 != 0 || a % 400 == 0)
	{
		printf("闰年");
	}
	else
	{
		printf("平年");
	}
}



int main()
{
	int a = 0;
	printf("请输入年份\n");
	scanf("%d", &a);
	year(a);
	return 0;
}

2.传址调用

1.传址调用传递的是参数的地址,允许函数直接访问和修改原数据(实参)

2.通过指针来实现

实例:交换俩个数的值,通过函数来实现

错误示范

写完之后,诶,他俩的值并没有发生变化。

解释

由图可得

实参和形参的地址不一样,对形参的修改并不会改变实参的值,这是一种传值调用

如果使用传址调用的,形参和实参的地址一样,也就是说对形参的修改会影响到实参的值

正确代码:

int Swap(int*pa, int*pb)
{
	int temp = *pa;
	*pa=*pb ;
	*pb= temp;
}




int main()
{
	int a = 0;
	int b = 0;
	scanf("%d %d", &a, &b);
	printf("交换前\n");
	printf("a=%d b=%d\n", a, b);
	int result =Swap(&a, &b);
	printf("交换后\n");
	printf("a=%d b=%d",a,b);
	return 0;
}

代码运行


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

1.嵌套调用

函数可以嵌套调用,不能嵌套定义

2.链式访问

把一个数的返回值当作另外一个数的参数

注意:

printf函数的返回值是int


六.函数的声明

函数先声明后使用

函数的声明

函数的定义


七.函数的递归

递归的限制条件

1.存在限制条件,当满足这个条件后,递归便不再继续。

2.每次递归调用后越来越接近这个条件,

例题1:斐波那契数列的实现

int f(int n)
{
	if (n ==1 || n==2)
	{
		return 1;
	}
	else
	{
		return f(n - 1) + f(n - 2);
	}
}





int main()
{
	int num = 0;
	scanf("%d", &num);
	int result =f(num);
	printf("%d ", result);
	return 0;
}

函数递归的过程


例题2:字符串的逆序,使用函数递归实现

void reverse(char arr[], int a)
{
	if (a < 0)
	{
		return;
	}
	purchar(arr[a]);
	//函数的递归
	reverse(arr, a - 1);
}



int main()
{
	char arr[] = "abcdef";
	int sz = sizeof(arr) / sizeof(arr[0]);
	int a = sz - 2;
	//sz表达式计算出来字符串的元素个数,包含\0,
	//又因为数组的下标是从0开始的.因为sz-2
	reverse(arr, a);
	return 0;
}

例题3:打印数字的每一位

void print(int a)
{

	if (a == 0)
	{
		return;
	}
	//函数先通过递归
	print(a / 10);
	//然后再打印每个数字,'0'是转换成字符
	putchar((a % 10) + '0');
}



int main()
{
	int a = 0;
	printf("请输入一个数");
	scanf("%d", &a);
	print(a);
	return 0;
}

结语:

限于水平,本篇文章不足之处在所难免,还望读者指正,谢谢大家


http://www.kler.cn/news/360893.html

相关文章:

  • YOLOv11改进策略【模型轻量化】| 替换骨干网络 CVPR-2024 StarNet,超级精简高效的轻量化模块
  • D45【python 接口自动化学习】- python基础之类
  • 水果忍者网页版(重制版)
  • 【Linux】Linux命令行与环境变量
  • docker配置镜像源
  • Java面试宝典-并发编程学习02
  • Android IP路由策略和防火墙
  • 什么是全局污染?怎么避免全局污染?
  • 基准线markLine的值超过坐标轴范围导致markline不显示
  • Go-知识依赖Vendor
  • 025 elasticsearch索引管理-Java原生客户端
  • 【MySQL】提高篇—索引与性能优化:索引的概念与类型(单列索引、复合索引、全文索引)
  • 手机功耗技术领域
  • Hadoop 踩坑汇总
  • Clip 模型实现文搜图
  • web网页QQ登录
  • 【JavaEE初阶】网络编程TCP协议实现回显服务器以及如何处理多个客户端的响应
  • rpm 命令
  • Java项目-基于springboot框架的逍遥大药房管理系统项目实战(附源码+文档)
  • 上海市计算机学会竞赛平台2024年10月月赛丙组游戏闯关