学长教你学C-day12-C语言函数

news2024/9/20 14:52:08

       不知不觉,小刘已经讲了十一天C语言了,语法、数据结构、数组、结构体、指针的概念和使用大家都已经了然于心,但是想用C语言开发一个有用的程序还需要一个很关键的部分,那就是编写“函数”。

        “函数这个名字大家肯定都不陌生,数学中很常见。例如f(x)=x+1,这就是一个函数的表达式。其中f称为映射法则,它可以用很多其他符号来表示,括号中的x是函数的一个参数,或者叫自变量,通过等号右边的式子,对参量进行运算,最终得到的值就是通过函数想要最终得到的结果。C语言中的函数也可以从数学中的函数进行类别。”

        “首先C语言中函数的定义如下:”

函数类型 函数名(形式参数){

        函数体;

        return 返回值(与函数的类型一致);

}

        “其中函数类型和函数返回值的类型是一致的,形式参数是在函数体中才有效的,函数外则无效,通常我们想要拿一个变量到函数中进行运算,那么我们在调用函数的时候,将实际参数的位置放到与形式参数对应的位置即可,如果你的函数不需要传入其他的参数,在定义时括号中也可以什么都不写。”

        “下面我们通过一个例子来体验一下函数的作用:”

#include<stdio.h>
int main(){
	int a=1;
	printf("a=%d",a);
	return 0;
} 

        输出:

         “有的同学可能会有疑问,这也没定义函数啊,函数在哪呢?”

         “我给大家看一张图大家就明白了:”

C语言项目组织方式 :

[图片来源:](C语言中文网:C语言程序设计门户网站(入门教程、编程软件)) 

        “其实一个C语言的项目就是由一个个文件构成的,源文件里面装的就是源代码,那么项目的功能是怎么通过代码实现的呢,答案就是:通过函数实现功能。C语言项目的主要工作就是写函数。”

        “其中main()也是函数,只不过他是一个比较特殊的函数,人称:主函数。主函数就是程序的起点,所有其他函数必须在主函数中才能实现调用。当然,我们初学时写的程序功能比较简单而且是一次性的结果(无需重复使用该功能),就可以直接写在主函数中去实现。如果我们想要求一个比较复杂的问题并且此功能还要去重复使用,那么我们通常定义一个函数来解决。如:求1~n的和用函数的方法来实现:”

        code_1:void类型

#include<stdio.h>

void sum(int n){
	int sum=0;
	for(int i=1;i<=n;i++){
		sum+=i;
	}
	printf("%d\n",sum);
}

int main(){
	int n=0;
	scanf("%d",&n);
	sum(n);
	return 0;
} 

        code_2:int类型

#include<stdio.h>

int sum(int n){
	int sum=0;
	for(int i=1;i<=n;i++){
		sum+=i;
	}
	return sum; 
}

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

        code_3:无参型

#include<stdio.h>

int sum(){
	int n=0;
	scanf("%d",&n);
	int sum=0;
	for(int i=1;i<=n;i++){
		sum+=i;
	}
	return sum; 
}

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

        “上面三种就是函数定义和调用的实例,可以发现这些函数都是写在主函数main上面的,如果把函数写在主函数下面可不可以呢?”

        

        “如果我们把函数直接写在main函数的下面会发生报错,说没有找到“sum”函数,那该怎么办呢?不用急,我们只要在主函数上面或者里面对函数声明一下,就可以了。”

函数声明语法:

函数类型 函数名(形式参数<无参即不用填>); 

 如:

或:

         “C语言中函数的定义都是相互独立的,就是不能在一个函数中定义另一个函数,在语法上是不允许的,如:”

         “函数的调用除了在main函数中使用以外,还可以在其他函数中使用或者在自身函数中使用。其他函数中相互使用时函数的调用的函数必须是先声明或者先写好的,否则语法不会通过。函数调用自身还有一种说法叫“递归”,下面我们就来了解一下递归。”

        

#include<stdio.h>

void print(int n){ 
	printf("%d,",n);
	if(n!=0){
		return print(--n);
	}
}

int main(){
	int n;
	scanf("%d",&n);
	print(n);
	return 0; 
}


“上面的例子中print函数重复调用了多次,就是一种递归:”

 “递归虽然是一种巧妙的函数调用方式,但是也有巨大的问题,那就是空间或者时间开销很大:”

空间:

递归函数内部嵌套了对自身的调用,除非等到最内层的函数调用结束,否则外层的所有函数都不会调用结束。通俗地讲,外层函数被卡主了,它要等待所有的内层函数调用完成后,它自己才能调用完成。

时间:

每次调用函数都会在栈上分配内存,函数调用结束后再释放这一部分内存,内存的分配和释放都是需要时间的。
每次调用函数还会多次修改寄存器的值,函数调用结束后还需要找到上层函数的位置再继续执行,这也是需要时间的。
所有的这些时间加在一起是非常恐怖的。

“因此,掌握了递归的同时,更重要的是如何使用递归。” 

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

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

相关文章

ZooKeeper架构篇 - 分布式协调服务ZooKeeper

前言 本文基于 ZooKeeper 3.8.0 版本。 ZooKeeper集群搭建 准备四台服务器&#xff0c;IP地址分别为10.211.55.6、10.211.55.7、10.211.55.8、10.211.55.9 下载并解压 ZooKeeper 文件&#xff0c;四台服务器进入 data 目录分别创建一个 myid 文件&#xff0c;文件内容分别为…

vue全家桶(二)组件化开发

vue全家桶&#xff08;二&#xff09;组件化开发1.组件化开发思想2.组件注册2.1局部注册2.2全局注册Vue.component1.注意事项&#xff1a;2.组件的命名方式3.组件间的交互3.1父组件向子组件传值-props属性值类型1.组件化开发思想 标准分治重用组合 2.组件注册 vue 注册组件的…

《动手学深度学习》笔记一 ------机器学习中的基础概念

写在前面&#xff1a;本文按照书中的脉络做的笔记&#xff0c;包含概念的定义、自己的理解以及阅读时的小思考。感受&#xff1a;深度学习很奥妙&#xff0c;很有趣&#xff01; 1.2机器学习中的关键组件 可以⽤来学习的数据&#xff08;data&#xff09;&#xff1b;如何转换…

直接在Notepad++中运行GO语言

建议先阅读并实践&#xff08;配置notepad支持go语言语法着色(高亮)&#xff09;:https://mp.csdn.net/mp_blog/creation/editor/new/1287591911.Windows上安装Go语言开发包参考链接&#xff1a;http://c.biancheng.net/view/3992.html1.1.下载Go语言开发包可以在Go语言官网 &a…

大聪明教你学Java | 深入浅出聊 Mybatis 的一级缓存和二级缓存

前言 &#x1f34a;作者简介&#xff1a; 不肯过江东丶&#xff0c;一个来自二线城市的程序员&#xff0c;致力于用“猥琐”办法解决繁琐问题&#xff0c;让复杂的问题变得通俗易懂。 &#x1f34a;支持作者&#xff1a; 点赞&#x1f44d;、关注&#x1f496;、留言&#x1f4…

【头歌】函数的递归调用

第1关&#xff1a;编写递归函数方法求x的n次方 (要求n>0)任务描述本关任务&#xff1a;编写递归函数方法求x的n次方 (要求n>0)。相关知识递归法在定义一个过程或函数时出现调用本过程或本函数的成分&#xff0c;称之为递归。若调用自身&#xff0c;称之为直接递归。若过程…

论文笔记:SEMI-SUPERVISED CLASSIFICATION WITH GRAPH CONVOLUTIONAL NETWORKS

ICLR 2017 1 abstract和intro部分 问题的setting 在图上进行节点分类&#xff0c;其中只有一部分节点有label ——>基于图的半监督学习传统的方法是使用平滑正则 其中L0表示图中有监督部分的lossf是神经网络&#xff0c;ΔD-A表示unnormalized的拉普拉斯矩阵 这种方…

Blender 物理属性 (五)动态绘画

文章目录动态绘画简介.以小船划过水面产生波纹为例.波浪属性.动态绘画简介. 1 动态绘画可以让一个物体在另一个物体上绘制东西 2 动态绘画至少需要两个物体&#xff0c;一个作为画布&#xff0c;另一个作为笔刷 3 两个物体必须接触才有效果 以小船划过水面产生波纹为例. 1 为…

【数据结构】浅识泛型

目录 1、包装类 1.1、基本数据类型和其包装类 1.2、装箱和拆箱 1.2.1、装箱 1.2.2、拆箱 1.2.3、面试题 2、泛型的概念 3、引出泛型 3.1、语法 4、泛型类的使用 4.1、语法 5、裸类型&#xff08;Raw Type&#xff09; 6、泛型是如何编译的 6.1、擦除机制 6.2、不…

Springboot+ssm371的在线考试系统maven idea

摘 要 I 1 绪论 1 1.1研究背景 1 1.2研究现状 1 1.3研究内容 2 2 系统关键技术 3 springboot是基于spring的快速开发框架, 相比于原生的spring而言, 它通过大量的java config来避免了大量的xml文件, 只需要简单的生成器便能生成一个可以运行的javaweb项目, 是…

DPO4104示波器

18320918653 DPO4104 详细说明&#xff1a; 美国泰克Tektronix DPO4104数字荧光示波器主要产品特色&#xff1a;Inspector智能存储管理2.串行触发和分析3.10.4”更大的显示器, 前面板上USB和CompactFlash端口, 及TekVPI?改善的探头接口, 更强的操作渐 变性商品名称 &#x…

针孔相机模型

针孔相机模型坐标系(1) 图像像素坐标系(2) 图像物理坐标系(3) 相机坐标系(4) 归一化平面坐标系(5) 世界坐标系畸变校正针孔相机模型中一般会涉及到图像像素坐标系、图像物理坐标系、相机坐标系、归一化平面坐标系和世界坐标系这5个坐标系。 坐标系 (1) 图像像素坐标系 图像像…

IDEA设置界面和控制台的滚动条颜色

前言 不知道大家是否和我一样有这么一个烦恼&#xff1a; IDEA自带的滚动条颜色很暗&#xff0c;配上一些主题颜色搭配很难发现。 所以今天就想着怎么可以修改滚动条颜色&#xff0c;首先去网上搜了搜都是什么鼠标滚轮加shift滚动&#xff0c;一点也不实用 偶然看到了个不错的…

图表控件LightningChart.NET 系列教程(七):LightningChart 组件——LightningChart.NET 函数库

LightningChart.NET SDK 是一款高性能数据可视化插件工具&#xff0c;由数据可视化软件组件和工具类组成&#xff0c;可支持基于 Windows 的用户界面框架&#xff08;Windows Presentation Foundation&#xff09;、Windows 通用应用平台&#xff08;Universal Windows Platfor…

匿名函数 lambda

匿名函数 lambda 匿名函数&#xff1a;一句话函数&#xff0c;比较简单的函数,没有函数名的函数 在Python中&#xff0c;lambda的语法是唯一的 lamlambda a,b:ab lamlam(a1,b2) # 传参 print(lam) # 3lmbda的语法是唯一的。其形式如下&#xff1a;lambda argument_list: expr…

python图像处理(prewitt算子)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 前面几章谈到了灰化、增强、旋转、滤波等内容,今天来谈一谈边缘检测。边缘检测是图像处理的重要内容。很多图像分割、图像识别的前一步就是边缘检测。某种意义上说,边缘检测的好坏…

7-查看和处理文件内容

7-查看和处理文件内容 文本文件 ASCII、UTF-8、Unicode、ANSItxt、xml、conf、properties、yml等配置文件、日志文件、源代码 二进制文件 可执行文件、图片、音频、视频 cat 全拼&#xff1a;concatenate [kənˈkt(ə)nˌeɪt] 连接 格式&#xff1a;cat 文件名 more/…

2. Spring 注解开发

文章目录1. 用注解开发定义bean2. 纯注解开发3. 注解开发的 bean 管理3.1 作用范围管理&#xff08;单例或非单例&#xff09;3.2 生命周期管理4. 注解开发的依赖注入4.1 引用类型的依赖注入4.2 简单类型的依赖注入4.2.1 直接注入值4.2.2 注入 properties 文件中的值5. 注解开发…

Acwing---1101. 献给阿尔吉侬的花束

献给阿尔吉侬的花束1.题目2.基本思想3.代码实现1.题目 阿尔吉侬是一只聪明又慵懒的小白鼠&#xff0c;它最擅长的就是走各种各样的迷宫。 今天它要挑战一个非常大的迷宫&#xff0c;研究员们为了鼓励阿尔吉侬尽快到达终点&#xff0c;就在终点放了一块阿尔吉侬最喜欢的奶酪。…

MYSQL不存在插入 存在更新的解决方法和对比

设置主键id自增&#xff0c;name为唯一索引 一、避免重复插入 insert ignore into&#xff08;有唯一索引&#xff09; 关键字/句: insert ignore into&#xff0c;如果插入的数据会导致 UNIQUE索引 或 PRIMARY KEY 发生冲突/重复&#xff0c;则忽略此次操作/不插入数据&…