初始C语言 - 函数(2)

news2024/11/26 22:24:19

目录

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

1)函数嵌套调用

    2)函数的链式访问 - 函数的返回值作为另一个函数的参数

 2. 函数的声明和定义

1)变量的声明和定义 

2)函数的声明和定义

//函数必须先声明后使用//函数的声明写在头文件里

3.  函数递归  - 程序自己调用自己,递推回归

递归的两个必要条件

例子1:函数调用不当 - 死循环

例2:接收一个整型值(无符号),按照顺序打印每一位输入1234 打印1 2 3 4 

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

4.递归与迭代 - 练习

例1:求n的阶乘。(不考虑溢出)

例2:求第n个斐波那契数

方法1:第n个数等于前两个数的和

方法二:优化

迭代,从前往后算(从第3个开始往后求,n前面的两个数,再求第n) 前两个数的和等于第三个数


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

    函数和函数之间可以根据实际的需求进行组合的,也就是互相调用的

1)函数嵌套调用

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

每个函数之间是平等独立的存在。

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

    2)函数的链式访问 - 函数的返回值作为另一个函数的参数

int main()
{
	int len = strlen("abcdef");
	printf("%d\n", len);

	//链式访问
	printf("%d\n", strlen("abcdef"));
	
	//经典链式访问
	printf("%d", printf("%d", printf("%d", 43)));//打印4321
	//printf()返回的值是:打印字符的个数。打印43后,返回2;打印2,返回1;
	return 0;
}

 2. 函数的声明和定义

2.1 函数声明:
1. 告诉编译器有一个函数叫什么,参数是什么,返回类型是什么。但是具体是不是存在,函数
声明决定不了。
2. 函数的声明一般出现在函数的使用之前。要满足 先声明后使用
3. 函数的声明一般要放在头文件中的。
2.2 函数定义:
函数的定义是指函数的具体实现,交待函数的功能实现。

 

test.h 的内容
放置函数的声明
test.c 的内容
放置函数的实现
//在写大量代码的时候,例如三字棋和扫雷,可以试着这样规划代码。

1)变量的声明和定义 

//变量 声明 和 定义
//先定义(声明)后使用
int b;//声明
int main()
{
	//定义变量
	int a = 10;
	printf("%d %d\n", a,b);

	
	return 0;
}
int b = 20;//定义

2)函数的声明和定义

//函数必须先声明后使用
//函数的声明写在头文件里
 

//正常在工程里,会有很多函数被调用
//通常函数定义代码写在.c文件里,函数的声明写在.h的头文件里
//在使用函数时,引用该函数的头文件,这样就能调用了

//如果卖代码,不想泄露源代码,可以把写好的代码,转为静态库,然后将代码的静态库和头文件打包
//给甲方,这样甲方用#pragma comment(lib,"头文件名")就可以引用,再调用使用了
 

//这种只声明,再main函数后面定义的方式,是可以的,但是这样不太清晰,尽量声明定义一起写

int Add(int a, int b);//函数的声明(声明里面必须有类型,可以不写x,y)

int main()
{
	int a = 10;
	int b = 10;
	int c = Add(a, b);
	printf("%d\n", c);
	return 0;
}

int Add(int a,int b)//函数的定义
{
	return a + b;
}



3.  函数递归  - 程序自己调用自己,递推回归

递归思想:把大事化小(把大型的复杂的问题,转化为一个与原问题相似的规模较小的问题来求解)

递归的两个必要条件

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

例子1:函数调用不当 - 死循环

int main()
{
    printf("hehe\n");
    //函数递归,main函数自己调用自己
    main();//死循环打印hehe,然后栈溢出,报错
    return 0;
}

 

例2:接收一个整型值(无符号),按照顺序打印每一位
输入1234 打印1 2 3 4 

//接收一个整型值(无符号),按照顺序打印每一位
//输入1234 打印1 2 3 4 
//print(1234)
//print(123) 4
//print(12) 3 4
//print(1) 2 3 4
//1 2 3 4

void Print(unsigned int n)
{
	if (n > 9)
	{
		Print(n / 10);
	}
	printf("%d ",n % 10);
}
int main()
{
	unsigned int num = 0;
	scanf("%u", &num);
	Print(num);
	return 0;
}

 

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

//编写函数,不允许创建临时变量,求字符串的长度
//数组名是数组首元素的地址

//普通方法:创建临时变量
//int my_strlen(char* str)
//{
//	int count = 0;
//	while (*str != '\0')
//	{
//		count++;
//		str++;
//	}
//	return count;
//}

int my_strlen(char* str)
{
	if (*str != '\0')
	{
		return 1+my_strlen(str+1);
	}
	else
	{
		return 0;
	}
}

int main()
{
	char arr[10] = "abcdef";
	int len = my_strlen(arr);
	printf("%d\n", len);
	return 0;
}

4.递归与迭代 - 练习

例1:n的阶乘。(不考虑溢出)

//普通方法:循环
//int fac(int n)
//{
//	int i = 0;
//	int ret = 1;
//	for (i = 1; i <= n; i++)
//	{
//		ret = ret * i;
//	}
//	return ret;
//}

//递归
//n <=1, fac(n)=1
//n > 1, fac(n) = n*fac(n-1)
//fac(5)
//fac(4)*5
//fac(3)*4 *5
//fac(2)*3 *4 *5
//fac(1)*2 *3 *4 *5
//1 *2 *3 *4 *5


//递归
int fac(int n)
{
	if (n <= 1)
	{
		return 1;
	}
	else
	{
		return n * fac(n - 1);
	}
}

int main()
{
	int n = 0;
	scanf("%d", &n);
	int ret = fac(n);
	printf("%d\n", ret);
	return 0;
}

 

例2:求第n个斐波那契数

//斐波那契数列:1 1 2 3 5 8 12 21 34 55...
//n<=2,Fib(n)=1
//n>2,Fib(n)=Fib(n-1)+Fib(n-2)

方法1:第n个数等于前两个数的和

//方法1:第n个数等于前两个数的和
int count = 0;
int Fib(int n)
{
	//计算第3个斐波拉契数被调用的次数
	if (3 == n)//通过次数39088169次,可以发现数字越小的斐波那契数,被调用的次数越多
	{
		count++;
	}
	if (n <= 2)
	{
		return 1;
	}
	else
	{
		return Fib(n - 1) + Fib(n - 2);
	}
}


int main()
{
	int n = 0;
	scanf("%d", &n);
	int ret = Fib(n);
	printf("%d\n", ret);
	printf("count=%d\n", count);
	return 0;
}

方法二:优化

迭代,从前往后算(从第3个开始往后求,n前面的两个数,再求第n)
 前两个数的和等于第三个数


//优化:迭代,从前往后算(从第3个开始往后求,n前面的两个数,再求第n)
// 前两个数的和等于第三个数
int Fib(int n)
{
	int a = 1;
	int b = 1;
	int c = 1;//因为当n=1或2的时候,返回c,这时斐波那契数为1,所以令c=1

	while (n >= 3)
	{
		c = a + b;
		a = b;
		b = c;
		n--;//逼近循环结束条件
	}
	return c;
}

int main()
{
	int n = 0;
	scanf("%d", &n);
	int ret = Fib(n);
	printf("%d\n", ret);
	printf("count=%d\n", count);
	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/167117.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

集成学习、Bagging集成原理、随机森林构造过程、随机森林api与案例、boosting集成原理、梯度提升决策树(GBDT)、XGBoost与泰勒展开式

一、集成学习 集成学习&#xff1a;通过建立几个模型来解决单一预测问题&#xff0c;工作原理是生成多个分类器/模型&#xff0c;各自独立地学习和作出预测。这些预测最后结合成组合预测&#xff0c;因此优于任何一个单分类的做出预测 机器学习的两个核心任务 集成学习中boost…

【UE4 第一人称射击游戏】51-制作手榴弹

上一篇&#xff1a;【UE4 第一人称射击游戏】50-用另一种方法实现僵尸随机漫游 僵尸攻击玩家时造成伤害本篇效果&#xff1a;按G键投掷出手榴弹&#xff0c;产生爆炸效果步骤&#xff1a;新建一个蓝图类&#xff08;父类为Actor&#xff09;&#xff0c;命名为“GrenadeActor”…

水声功率放大器模块在圆柱壳结构声源辐射研究中的应用

客户需求&#xff1a;实验需要在消声水池中对圆柱壳声源振动和远场声压进行实验测量&#xff0c;圆柱壳内部尺寸为&#xff1a;高0.5m(不含盖板)&#xff0c;壳外径0.5&#xff0c;内径0.497m&#xff0c;上下盖板高0.014m&#xff0c;所以对圆柱壳内功率放大模块的尺寸以及供电…

Qt图表操作(QCustomPlot 与 QtCharts的介绍与使用)

一、QCustomPlot简介 QCustomPlot是QT下一个方便易用的绘图工具&#xff0c;该绘图库专注于制作美观&#xff0c;出版品质的2D图表&#xff0c;图表和图表&#xff0c;以及为实时可视化应用程序提供高性能。它可以导出为各种格式&#xff0c;如矢量化的PDF文件和光栅化图像&…

Task12 数据缘何而来数据格式

目录1 常见的格式1.1 Excel文件的格式1.2 Excel数据的格式1.3 基本知识2 Excel数据格式2.1 数据类型转换3 练习1 常见的格式 1.1 Excel文件的格式 Excel文件的常见格式&#xff1a;.xls和.xlsx 1.2 Excel数据的格式 Excel数据的存储不同格式&#xff1a;xlsx、csv、txt cs…

mysql快速生成100W条测试数据(8)全球各城市人口及经济增长速度并存入mysql数据库

这是之前的文章里面包含一些以前的一些操作流程可以进行参考学习 更加详细操作步骤在第一篇文章里面 mysql快速生成100W条测试数据&#xff08;1&#xff09;&#xff1a;游戏人物数据 mysql快速生成100W条测试数据&#xff08;2&#xff09;公司员工信息 mysql快速生成100W条测…

本地挂载网盘_Alist_RaiDrive_windows

目录 一、下载安装Alist 二、启动登录Alist 三、挂载网盘 四、挂载到本地 五、开机自启动 一、下载安装Alist 安装地址&#xff1a;https://github.com/alist-org/alist 二、启动登录Alist 1.打开alist.exe所在目录&#xff0c;输入cmd 2.利用cmd&#xff0c;输入alist …

[oeasy]python0051_ 转义_escape_字符_character_单引号_双引号_反引号_ 退格键

转义字符 回忆上次内容 上次研究的是进制转化10进制可以转化为其他形式 binocthex 其他进制也可以转化为10进制 int可以设置base来决定转为多少进制 回忆一下 我们为什么会有八进制&#xff1f;因为需要用八进制输出转义字符 \ooo 把(ooo)8进制对应的ascii字符输出 就如同 \…

QMAKE_POST_LINK QMAKE_PRE_LINK解释

命令解释 QMAKE_POST_LINK是在可执行程序链接后执行它的命令 QMAKE_PRE_LINK是在可执行程序链接前执行它的命令 注意C/C程序是先编译后链接 如果你需要一个编译前执行的命令可以使用 copy_files.files $$filelist copy_files.path $$OUT_PWD COPIES copy_files即使是编…

存储与数据库 | 字节青训营笔记

目录 一、存储系统 1、什么是存储系统 2、存储系统的特点 3、RAID技术 RAID出现的背景 RAID 0 RAID 1 RAID 01 二、数据库 1、难道数据库和存储系统不一样吗 2、数据库vs经典存储 三、主流产品剖析 1、单机存储 本地文件系统 key-value存储 2、分布式存储系统 …

【程序员陪你过大年】html+css+js 实现春节动态烟花特效及服务器部署

前言 不知不觉又到了年底&#xff0c;这一年是值得庆贺的一年&#xff0c;疫情过去&#xff0c;经济好转。我们急需在春节这个特殊的日志释放下自己的情绪。但是大部分地区都不让放炮&#xff0c;于是乎我为大家带来一套十分炫酷应景的春节烟花动画代码实现。效果如下图所示 :…

第10章 FreeRTOS

ESP32 FREERTOS 打印ESP32任务 menuconfig中&#xff0c;打开FreeRTOS的trace打印功能 menuconfig中&#xff0c;增加app_main主任务的栈大小 测试代码 ESP32最小工程 #include <stdio.h> #include "freertos/FreeRTOS.h" #include "freertos/task.h&q…

php sql注入

文章目录一、什么是sql注入二、sql注入处理1、使用内置函数2、使用pdo预处理语句三、安全注意事项一、什么是sql注入 在应用程序中&#xff0c;为了和用户交互&#xff0c;允许用户提交输入数据&#xff0c;假如应用程序并没有对用户输入数据进行处理&#xff0c;攻击者可以输…

linux开发工具

文章目录linux开发工具1.软件包管理器yum2.编辑器vim3.gcc4.make与makefile5.git6.gdb7.小程序进度条linux开发工具 1.软件包管理器yum yum等同于手机上的应用商店.yum自动解决软件之间的耦合问题 yum list 显示软件清单 yum install 下载 yum remove 删除 2.编辑器vim 其…

opencv开发之numpy使用

打开Spyder, 在IPython控制台中输入 import numpy as np 引入numpy库并使用numpy构造一个ndarray对象: np.zeros((2,4),np.uint8),该对象为一个二维数组 ,构造一个2行4列的二维数组(矩阵) ,并初始化所有元素为0,及指定数据类型为uint8 创建并初始化:数据可视化:取矩阵类型: typ…

基于YOLOv4的车辆检测 MATLAB实现

目录 摘要 研究背景 算法设计及实现过程 车辆目标数据集的构建 基于YOLOv4的目标检测 对YOLOv4模型进行改进 实验结果及分析 结论与展望 代码实现 摘要 针对车辆检测&#xff0c;本文提出了一种基于YOLOv4车辆检测算法。制作了一个多天侯、多时段、多场景的车辆目标数…

怎么拆分PDF文件,教你用最简单的方法

PDF文档拆分是一种很常见的需求。因为有时候文档页数过多&#xff0c;打开和阅读都不太方便&#xff0c;我们可以通过拆分把想要的部分提取出来。拆分PDF的时候可以借助一些工具更快更有效地达成目的&#xff0c;这里就给大家介绍几款比较受欢迎的处理工具&#xff0c;它们在辅…

Linux——系统管理篇

1、、Linux 中的进程和服务 计算机中、一个正在执行的程序或命令&#xff0c;叫进程&#xff08;process&#xff09;。 启动之后一直存在、常驻内存的进程&#xff0c;一般称为“服务”&#xff08;Service&#xff09; // 我更喜欢叫它守护进程 Daemon 比如windows的那一堆…

软件测试面试,如何自我介绍?

01 如何自我介绍 面试过程中一定要放慢语速&#xff0c;做到条理清晰。特别是做自我介绍时&#xff0c;可以适当多介绍自己会什么&#xff0c;有哪些重要经验。 例如&#xff1a; 面试官&#xff0c;上午/下午好。 我是XXX&#xff0c;今天来面试贵公司的软件测试工程师岗位&a…

利用QT 的 Graphics View 系统实现一个 简易的 Graph Editor

QT 中的 Graphics View 系统. 是一个相对成熟的渲染引擎的上层框架&#xff0c;通常也可以会叫做 Scene - View。 通常会有 QGraphicsView, QGraphicsScene, QGraphicsItem 这几个类构成。 view是视口(viewport)&#xff1b;scene是一个场景&#xff0c;负责容纳各种item&…