C语言第八课-----函数定义和使用的延续

这篇具有很好参考价值的文章主要介绍了C语言第八课-----函数定义和使用的延续。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

作者前言
                                

                 个人主页::小小页面

                 gitee页面:秦大大

                一个爱分享的小博主 欢迎小可爱们前来借鉴

__________________________________________________________

  目录

        1.复习

                库函数

                自定义函数

                函数参数

                函数调用

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

        2. 函数的声明和定义

        3. 函数递归

_____________________________________________________

插播小知识

1.在前面中我简单的画出C语言的内存大概分布

C语言第八课-----函数定义和使用的延续,c语言,开发语言

2. 函数具有外部链接属性


在上一篇博客中我们简单的介绍了函数的定义 ,分类 ,调用,下面我们简单的复习一下
  库函数

简单的说就是c语言编译厂商提供的常用的函数,支持可移植性和提高程序的效率方便程序员 进行软件开发

http://www.cplusplus.com

  自定义函数

ret_type fun_name(para1, * )
{
 statement;//语句项
}
ret_type 返回类型
fun_name 函数名
para1    函数参数

按照C语言的标准进行创建的具有某些功能的代码块

  函数参数

        1.实际参数(实参)

               调用函数传入的变量或者其他数值

          2.形式参数(形参)

                自定义函数时定义的变量

  函数调用

        函数使用之前要先声明再使用

        1.传值调用

                函数的形参和实参分别占有不同内存块,对形参的修改不会影响实参。

        2.传址调用

                传址调用是把函数外部创建变量的内存地址传递给函数参数的一种调用函数的方式。这种方式会影响外部变量,可以让函数和函数外边的变量建立起真正的联系,也就是函数内部可以直接操 作函数外部的变量。

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

        嵌套调用

                简单的说就是再函数里面调用函数,注意一下函数里面不能定义函数

        链式访问
                 把一个函数的返回值作为另外一个函数的参数。
下面我们进入函数的最后一点内容,

函数的声明和定义

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

函数定义

一般函数的定义在c文件,声明在头文件

C语言第八课-----函数定义和使用的延续,c语言,开发语言

vs2022的集成开发环境文件的链接的实现

C语言第八课-----函数定义和使用的延续,c语言,开发语言

 把代码拆成.c .h文件的好处

1.多人协作

2.代码保护

函数递归(递推加回归)

程序调用自身的编程技巧称为递归,把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,

递归策略

只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。 递归的主要思考方式在于:把大事化小

简单递归1:

#include<stdio.h>
int main()
{
	printf("1\n");
	main();
	return 0;
}
递归的两个必要条件
1. 存在限制条件,当满足这个限制条件的时候,递归便不再继续。
2.每次递归调用之后越来越接近这个限制条件。
练习1
输入: 1234 ,输出 1 2 3 4
#include<stdio.h>
void Print(int a)
{
	printf("%d", a % 10);
	if (a / 10)
	{
		Print(a / 10);
	}
	
}
int main()
{
	int n = 0;
	scanf("%d", &n);
	Print(n);
}

函数之所以能实现递归,是因为函数调用的时候会创建了一个函数栈帧(内存上的一块区域),函数调用开始,函数栈帧创建,函数调用结束,栈帧销毁

C语言第八课-----函数定义和使用的延续,c语言,开发语言

 这就是n = 1234 创建栈帧的简单过程 

编写函数不允许创建临时变量,求字符串的长度。
#include <stdio.h>
//int  strlen(char arr[])
//{
//	if (arr[0] != '\0')
//	{
//		return 1 + strlen(arr + 1);
//	}
//	return 0;
//}
int main()
{
	//递归和非递归分别实现strlen
	
	char arr[30];
	printf("输入字符串:>");
	scanf("%s", &arr);
	//int sum = strlen(arr);
	
	int sum = 0;
	
	int i = 0;
	for (i = 0; ; i++)
	{
		if (arr[i] != '\0')
		{
			sum++;
			continue;
		}
		break;
	}

	printf("%d", sum);
	return 0;
}

递归与迭代

当我们在使用递归无法解决的时候,可以想想使用迭代,下面我们写一下n的阶乘

#include <stdio.h>
int  fac(a)
{
	if (a == 1)
	{
		return 1;
	}
	return a * fac(a - 1);
}
int main()
{
	int a = 0;
	printf("输入数字:>");
	scanf("%d", &a);
	int num = fac(a);
	printf("%d", num);
	return 0;
}

上述方法在运算较大数值就很费时间了,主要还有栈溢出的情况,

C语言第八课-----函数定义和使用的延续,c语言,开发语言

 

所以我们要考虑迭代

#include<stdio.h>
int main()
{
	int a = 0;
	scanf("%d", &a);
	int i = 0;
	int sum = 0;
	int num = 1; 
	for (i = 1; i <= a; i++)
	{
		sum = i * num;
		num = sum;
	}
	printf("%d", sum);

	return 0;
}

迭代就不会有栈溢出的情况

求第 n 个斐波那契数。
C语言第八课-----函数定义和使用的延续,c语言,开发语言

 

#include<stdio.h>
int main()
{
	int a = 0;
	scanf("%d", &a);
	int i = 1;
	int j = 1;
	int sum = 0;
	if (a <= 2)
	{
		printf("%d", i);
		return 0;
	}
	while (a >= 3)
	{
		sum = i + j;
		i = j;
		j = sum;
		a--;	
	}
	printf("%d", sum);
	return 0;
}

总结:

这里函数的介绍就到这里结束了,有不懂的小可爱可以来私聊我文章来源地址https://www.toymoban.com/news/detail-607826.html

到了这里,关于C语言第八课-----函数定义和使用的延续的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 通俗易懂的子网划分(第八课)

    1 思考一下为什么要子网划分? 2 如何去子网划分? 3 学习这个技术的目的是啥? 4 什么是IP地址? 5 IP地址如何分类的依据是啥? 6 IP地址都组成? 7 IP地址的分类? 8 二进制到十进制的转化 十进制到二进制的转换 9 如何 计算192.168.1.1的网络ID?

    2024年02月10日
    浏览(51)
  • 【.NET基础加强第八课--委托】

    委托(Delegate) 是存有对某个方法的引用的一种引用类型变量 1,定义一个委托类型 2,声明了一个委托变量 并且new 了一个委托对象,并且把方法传进去 3,调用委托相当于调用了方法 //2, 声明了一个委托变量 md ,并且new 了一个委托对象,并且把方法M1传进去 using System.Text; using

    2024年02月03日
    浏览(33)
  • css第八课:文本属性(字体,颜色属性)

    这一节我们要讲的是文本属性: 文本属性就是: css样式里的属性,对文本的修饰,比如颜色,大小,字体,下划线... 下图是文本的一些属性: 1.font-size和font-family属性 我们先来演示一下前两个属性:字体大小和字体类型  结果:  解释:我们这里第一个p标签设置的css样式

    2024年02月06日
    浏览(48)
  • 网络安全进阶学习第八课——信息收集

    信息收集(Information Gathering)信息收集是指通过各种方式获取所需要的信息。渗透的本质是信息搜集,而信息搜集整理为后续的情报跟进提供了强大的保证。 目标资产信息搜集的程度,决定渗透过程的复杂程度。 目标主机信息搜集的深度,决定后渗透权限持续把控。 收集信

    2024年02月13日
    浏览(46)
  • STM32第八课:PWM控制直流电机

            TB6612FNG是一款新型驱动器件,能独立双向控制2个直流电机,它具有很高的集成度,同时能提供足够的输出能力,运行性能和能耗方面也具有优势因此在集成化、小型化的电机控制系统中,它可以作为理想的电机驱动器件。                           

    2024年03月24日
    浏览(51)
  • 孩子都能学会的FPGA:第八课——状态机

    (原创声明:该文是 作者的原创 ,面向对象是 FPGA入门者 ,后续会有进阶的高级教程。宗旨是 让每个想做FPGA的人轻松入门 , 作者不光让大家知其然,还要让大家知其所以然 !每个工程作者都搭建了全自动化的仿真环境,只需要双击 top_tb.bat 文件就可以完成整个的仿真(前

    2024年01月21日
    浏览(50)
  • 【代码随想录python笔记整理】第八课 · 奇怪的信

    前言: 本笔记仅仅只是对内容的整理和自行消化,并不是完整内容,如有侵权,联系立删。        在之前的算术运算中,我们遇到了一种曾经不常见的运算——取模。接下来,我们就通过这道题目来理解一下取模的作用。        对于这道题目我们其实有两种角度。第一种

    2024年02月22日
    浏览(56)
  • MySQl数据库第八课-------SQL命令查询-------主要命脉

     欢迎小可爱们前来借鉴我的gtiee秦老大大 (qin-laoda) - Gitee.com —————————————————————————————— 查询数据         条件         逻辑运算符         模糊查询         范围查询 in         判断空 UNION  排序 聚合 分组:gro

    2024年02月16日
    浏览(53)
  • 从零实战SLAM-第八课(非特征点的视觉里程计)

     在七月算法报的班,老师讲的蛮好。好记性不如烂笔头,关键内容还是记录一下吧,课程入口,感兴趣的同学可以学习一下。 ------------------------------------------------------------------------------------------------------------------------------- 特征点法流程: 1.在图像中提取特征点并计算特征

    2024年02月12日
    浏览(34)
  • 【go语言】2.1.3 函数的定义和使用

    在 Go 语言中,函数是一种代码抽象和复用的方式。函数可以接受参数,执行特定的操作,并返回结果。 函数的定义以  func  开始,后面跟着函数名、参数列表、返回值列表(可选)以及函数体。下面是一个函数定义的例子: 这个函数接受一个类型为  string  的参数

    2024年02月15日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包