自学C语言-9
**
第9章 函数
**
大型程序一般会被分为若干个程序模块,每个模块实现一个特定功能 。C语言中,由函数实现子程序,由子程序实现模块功能。本章致力于使读者了解函数的概念,掌握函数的定义及调用方式;了解内部函数和外部函数的作用范围,能区分局部变量和全局变量的不同;最后能将函数应用于程序中,将程序分成不同的功能模块。本章的知识架构及重难点如下:
9.1 函数概述
构成C程序的基本单元是函数,函数中包含着程序的可执行代码。每个C程序的入口和出口都位于main函数中,但并不需要把所有指令都放在main函数中。一般的做法是将程序划分成若干个模块,每个模块完成一部分功能,不同的程序模块可以由不同的人来完成,从而提高软件开发的效率。这就好比是盖楼房,一栋摩天大楼是不可能靠一个人完成的,而要靠多部门、多工种之间协力完成。通常是有一个总工程师,在他的指挥下,有部门运输建筑材料,有部门建造楼房主体,还有部门粉刷内外墙涂料。编写程序的道理与盖楼是一样的,主函数就像总工程师一样,控制着整体程序的推进和执行,其中定义的其他函数就好比参与盖楼的多个部门或工种,他们要通过某种调度(函数调用)才能完成特定的功能。主函数可以调用其他函数,其他函数间也可以相互调用。函数可以有参数和返回值,通过它们实现数据间的传递。在主函数中调用其他函数,这些函数执行完毕之后会返回main函数中。通常把这些被调用的函数称为下层函数。函数调用发生时,立即执行被调用的函数,而调用者则进入等待的状态,直到被调用函数执行完毕。【例9.1】编写3个函数:做饭,钓鱼,写诗,在本实例中,定义3个函数来完成做饭、钓鱼、写诗等待定的功能,然后在主函数中调用它们。为了简化函数的功能,这里只让其输出一条提示信息。读者可通过本实例对函数有一个直观的认识。
在分析本实例之前,我们先来了解一下什么是C程序源文件、库函数和用户自定义函数。
☑源文件:由一个或者多个函数组成。C语言以源程序为单位进行编译,而不是以函数为单位进行编译。
☑库函数:由C语言系统提供,用户无须定义,调用前也不必做类型说明,但需要在程序开始部分包含有该函数原型的头文件。例如,要使用能在控制台显示信息的printf函数,需在程序开始时包含stdio.h头文件;要使用字符串操作函数strlen、strcmp等时,需在程序开始时包含string.h头文件。
☑用户自定义函数:用户编写的用来实现特定功能的函数。例如,Cook、Fish和Poem函数都是自定义函数。
在本例程序中,首先包含了stdio.h头文件,然后声明了3个自定义函数,最后在主函数main中调用了这3个函数。在主函数main外,可以看到这3个函数的定义。
运行程序,显示效果如下图所示。
编程训练:
训练1:盖楼房 编写3个函数,分别实现搬运建筑材料、建造楼房主体、粉刷内外墙功能,并在主函数中调用这3个函数。输出结果如下 :
执行搬运功能
执行建造功能
执行粉刷功能
训练2:写情书 定义一个函数,内定为一封情书,在主函数中调用该函数,将情书内容展示出来。运行结果如下:
人生最美好的是相遇
我一生最奢侈的事
就是途中与你相遇
然后相濡以沫,共闻花香,有生之年
只诉温暖不言歾,倾心相遇,安暖相陪
9.2 函数的定义和声明
C语言的库函数可以直接调用,如printf输出函数。而自定义函数则必须由用户进行定义,确定其要实现的功能,这样才能被其他函数调用。
**
9.2.1 函数的定义
**
一个函数应包括函数头和函数体。定义一个函数的语法格式如下:
首先来看一段代码,然后通过分解,了解函数的构成。
1.函数头
函数头是函数的入口,标志着一段函数代码的开始。函数头包括返回值类型、函数名和参数列表3个部分,如下图所示。
☑返回值类型:函数返回值的类型,必须是C语言中的某个数据类型。这里函数的返回值将是一个int型值。
☑函数名:函数的标识符,在一个C程序中应保持唯一。因为是标识符,所以函数名要遵守标识符命名规则。这里,函数名是AddTwoNumber,可以推测出该函数的功能是两数相加求和。
☑参数列表:调用函数时,用于将主调函数中的实际参数复制到该列表对应的形式参数中。可以没有参数,也可以有多个参数。这里定义了两个int变量,表示要相加的两个数。
2.函数体
函数体位于函数头的下方位置,由一对大括号括起来,大括号决定了函数体的范围。函数要实现的特定功能,都是在函数体部分通过代码语句完成的,最后通过return语句返回实现的结果。
在上面的代码中,函数体内首先定义了一个int型变量,用来保存加法的计算结果,之后利用传递进来的参数进行加法操作,并将结果保存在result变量中,最后函数要将所得到的结果进行返回。通过这些语句的操作,实现了求解两数和的特定功能。
在定义函数时会出现以下几种特殊的情况。
☑无参函数:没有参数列表的函数。如例9.1中的Cook、Fish、Poem都是无参函数。
☑空函数:没有任何内容,也没有什么实际功能的函数。空函数的形式如下:
类型说明符 函数名()
{
}
实际开发中,有时某个函数还未编好,或者后续要拓展某个函数,这时就会先用一个空函数代替,先占个位置,待后续时机成熟再用编好的函数取代它。
注意,C语言中,函数的定义是互相平行、独立的。也就是说,函数体内不能再包含其他函数的定义。例如,下面的代码是错误的:
int main()
{void Display() /*错误!不能在函数体内定义另一个函数*/{printf("I want to show the Nesting function");}return 0;
}
这里,主函数main中定义了一个Display函数,目的是输出一句提示。由于C语言不允许进行嵌套定义,因此编译时会出现如图9.3所示的错误提示。
9.2.2 函数的声明
在程序中编写函数时,要先对函数进行声明,再对函数进行定义。函数定义是为了让编译器知道函数的功能 ,而函数声明是为了让编译器预先知道有这么一个函数,以及函数的名称、参数、返回值类型等信息。
函数声明的一般形式如下:
返回值类型 函数名(参数列表);
要注意的是,函数声明语句的最后要用分号";"作为结尾。例如,声明一个函数的代码如下:
Int ShowNumber(int iNumber);
【例9.2】交换两个数值,通过本实例了解函数声明与函数定义的位置,及其在程序中的作用。
(1)观察上面的程序,可以看到在main函数的开头先进行了exchange函数的声明,声明的作用是告知其函数将在后面进行定义。
(2)在main函数体中,首先定义两个整型变量a、b,之后输出一条提示消息,然后调用exchange函数。
(3)在main函数的定义之后可以看到exchange函数的定义,功能是实现两个数的数值互换。
运行程序,结果如下图所示。
注意:如果先定义函数,再调用函数,则不再需要进行函数声明,此时函数定义已经包含了函数声明的作用。
编程训练:
训练3:输出谚语 编写一个程序,输出“最大的挑战和突破在于用人,而用人最大的突破是信任人”。运行效果如下:
。主函数中,通过“iResult=Minus(9,4); "语句调用Minus函数,这里9和4这实际参数,调用函数后,将用4代替iNumber1,用9代替iNumber2,因此Minus函数实际执行的运算的是9-4。
注意,函数参数可以是常量、变量、数组、指针等,也可以是表达式。
9.3.2 数组作函数参数
1.数组元素作为函数参数
【例9.3】输出数组元素
定义一个数组并为其赋值,然后将数组元素作为函数实参进行传递。自定义函数体中,形参得到实参传递的数值后,将其显示输出。
(1)首先进行函数声明,在主函数main中定义一个整型数组和一个整型变量i。
(2)使用for循环语句对数组中的元素依次赋值,在这里,变量i既是循环条件,也是引用数组元素的下标。
(3)通过for循环语句调用ShowMember函数,显示数据。
运行程序,显示效果如上图所示。
**
2.数组名作为函数参数
**
C语言中,数组名表示的是数组中第一个元素的地址 。因此,当数组名作为函数实参时,传递的是数组的地址。这点和数组元素做实参时是不一样的,注意体会其不同。
【9.4】数组名作为函数参数
在本实例中,使用数组名作为函数的实参和形参,实现数组的赋值和输出。
(1)首先对Evaluate函数和Display函数进行声明,在声明语句中可以看到数组名作为形参。
(2)在主函数main中定义一个具有10个元素的整型数组iArray。
(3)调用Evaluate函数,数组名iArray作为函数实参,传递的是数组的地址。在Evaluate函数中,使用数组iArrayName作为形参,接受对应的地址空间,并对数组进行赋值操作。
(4)调用Display函数,将数组输出,可以看到在函数参数中使用的也是数组名称。运行程序,显示效果如上图所示。
相关文章:

自学C语言-9
** 第9章 函数 ** 大型程序一般会被分为若干个程序模块,每个模块实现一个特定功能 。C语言中,由函数实现子程序,由子程序实现模块功能。本章致力于使读者了解函数的概念,掌握函数的定义及调用方式;了解内部函数和外部…...

NVIDIA Triton系列01-应用概论
NVIDIA Triton系列01-应用概论 推理识别是人工智能最重要的落地应用,其他与深度学习相关的数据收集、标注、模型训练等工作,都是为了得到更好的最终推理性能与效果。 几乎每一种深度学习框架都能执行个别的推理工作,包括 Tensorflow、Pytorc…...

LIMS(实验室)信息管理系统源码、有哪些应用领域?采用C# ASP.NET dotnet 3.5 开发的一套实验室信息系统源码
LIMS(实验室)信息管理系统源码、有哪些应用领域?采用C# ASP.NET dotnet 3.5 开发的一套实验室信息系统源码 LIMS实验室信息管理系统,是一种基于计算机硬件和数据库技术,集多个功能模块为一体的信息管理系统。该系统主…...
Web前端进国企:挑战与机遇并存
Web前端进国企:挑战与机遇并存 随着互联网的飞速发展,Web前端技术已经成为企业信息化建设的重要组成部分。对于许多热衷于前端技术的年轻人来说,进入国企工作既是一种挑战,也是一种机遇。本文将从四个方面、五个方面、六个方面和…...

快速上手SpringBoot
黑马程序员Spring Boot2 文章目录 1、SpringBoot 入门程序开发1.1 创建一个新的项目 2、浅谈入门程序工作原理2.1 parent2.2 starter2.3 引导类2.4 内嵌tomcat 1、SpringBoot 入门程序开发 1.1 创建一个新的项目 file > new > project > empty Project 创建新模块&a…...
SQL 快速参考
SQL 快速参考 SQL(Structured Query Language)是一种用于管理关系数据库管理系统(RDBMS)的标准编程语言。它用于执行各种操作,如查询、更新、插入和删除数据库中的数据。本快速参考将提供SQL的基本语法和常用命令&…...

Cask ‘oraclexxx‘ is unavailable: No Cask with this name exists.
brew search oracle-jdk或brew search --cask oracle-jdk 原因:Homebrew官方仓库不再维护多个旧版本的OracleJDK 不推荐使用Homebrew环境安装JDK //指定版本安装 brew install --cask temurin17 //设置 JAVA_HOME 环境变量 //找到安装的JDK 版本的路径 /usr/lib…...

2024年武汉市中级、高级职称水测考试开卷方法分享
2024年武汉市(除开东湖高新区外)职称首次组织全员水测,先考水测后报名,水测报名在5月16号截止。 武汉市水测组织形式: 武汉市2024年专业技术职务水平能力测试分为笔试和面试,面试答辩有关事项另行通知&…...
计算机网络(6) ICMP协议
ICMP(Internet Control Message Protocol,互联网控制消息协议)是一种用于在IP网络中传递控制消息和错误报告的协议。ICMP是IP协议族的一部分,尽管它并不用于传输用户数据,但它在网络诊断和管理中起着关键作用。以下是关…...

FuTalk设计周刊-Vol.036
🔥AI漫谈 热点捕手 1、Stable Zero123:从单张图像生成高质量 3D 对象 Stable Zero123 可以生成物体的新颖视图,展示从各个角度对物体外观的 3D 理解,由于训练数据集和高程条件的改进,其质量比 Zero1-to-3 或 Zero123-XL 显著提高…...

Java——面向对象进阶(三)
前言: 抽象类,接口,内部类 文章目录 一、抽象类1.1 抽象方法1.2 抽象类1.3 抽象类的使用 二、 接口2.1 接口的定义和实现2.2 default 关键字2.3 实现接口时遇到的问题 三、内部类3.1 成员内部类3.2 静态内部类3.3 成员内部类3.4 匿名内部类&a…...
鸿蒙开发电话服务:【@ohos.telephony.observer (observer)】
observer 说明: 本模块首批接口从API version 6开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 导入模块 import observer from ohos.telephony.observerobserver.on(‘networkStateChange’) on(type: ‘networkStateChange’, ca…...

希亦、追觅、云鲸洗地机:究竟有何不同?选择哪款更合适
最近收到很多私信里,要求洗地机测评的呼声特别高,作为宠粉的测评博主,当然是马上安排起来,满足大家对想看洗地机的愿望。这次洗地机测评,我挑选了三款热门的品牌型号,并从多个维度对它们进行使用测评&#…...
代码随想录算法训练营第二十六天
题目:455. 分发饼干 贪心第一题 这里的局部最优就是大饼干喂给胃口大的,充分利用饼干尺寸喂饱一个,全局最优就是喂饱尽可能多的小孩。或者小饼干先喂饱小胃口 首先要对 g 和 s进行排序这样才能知道最大的胃口和最大的饼干然后进行遍历即可…...

[面试题]Java【并发】
[面试题]Java【基础】[面试题]Java【虚拟机】[面试题]Java【并发】[面试题]Java【集合】[面试题]MySQL 因为 Java 并发涉及到的内容会非常多,本面试题可能很难覆盖到所有的知识点,所以推荐 《Java并发编程的艺术》 。 Java 线程 线程 通知 等待 线…...

基于VSCode和MinGW-w64搭建LVGL模拟开发环境
目录 概述 1 运行环境 1.1 版本信息 1.2 软件安装 1.2.1 下载安装VS Code 1.2.1.1 下载软件 1.2.1.1 安装软件 1.2.2 下载安装MinGW-w64 1.2.2.1 下载软件 1.2.2.2 安装软件 1.2.3 下载安装SDL 1.2.3.1 下载软件 1.2.3.2 安装软件 1.2.4 下载安装CMake 1.2.4.…...
H5112B 降压恒流芯片12V24V36V48V60V72V100V 1.2ALED 调光无频闪光滑细腻
H5112B多功能LED恒流驱动器是一款具有良好性能与高度集成度的驱动芯片。以下是该产品的主要优点及应用领域的详细分析: 产品优点: 宽电压输入范围:H5112B支持5V至90V的宽电压输入范围,使其能够适应多种不同的电源环境࿰…...

真心建议大家冲一冲新兴领域,工资高前景好【大模型NLP开发篇】
前言 从ChatGPT到新近的GPT-4,GPT模型的发展表明,AI正在向着“类⼈化”⽅向迅速发展。 GPT-4具备深度阅读和识图能⼒,能够出⾊地通过专业考试并完成复杂指令,向⼈类引以为傲的“创造⼒”发起挑战。 现有的就业结构即将发⽣重⼤变…...

深度剖析淘宝扭蛋机源码:打造趣味性电商活动的秘诀
在当今电商市场中,如何吸引用户的注意力、提升用户的参与度成为了各大电商平台竞相追求的目标。淘宝扭蛋机作为一种新型的电商活动形式,以其趣味性和互动性深受用户喜爱。本文将深度剖析淘宝扭蛋机源码,探讨其如何打造趣味性与互动性并存的电…...
vue3+优化vue-baidu-map中marker点过多导致的页面卡顿问题
场景: 移动端h5中,当我们需要在地图中展示很多marker点坐标的时候,通常会使用 bm-marker ,去循环生成marker点,在数量不多的情况下是没问题的,但是随着数据量的增加,地图就会变得卡顿,以及渲染延…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查
在对接支付宝API的时候,遇到了一些问题,记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

循环冗余码校验CRC码 算法步骤+详细实例计算
通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)࿰…...

YSYX学习记录(八)
C语言,练习0: 先创建一个文件夹,我用的是物理机: 安装build-essential 练习1: 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件,随机修改或删除一部分,之后…...

376. Wiggle Subsequence
376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

Python实现prophet 理论及参数优化
文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候,写过一篇简单实现,后期随着对该模型的深入研究,本次记录涉及到prophet 的公式以及参数调优,从公式可以更直观…...

GC1808高性能24位立体声音频ADC芯片解析
1. 芯片概述 GC1808是一款24位立体声音频模数转换器(ADC),支持8kHz~96kHz采样率,集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器,适用于高保真音频采集场景。 2. 核心特性 高精度:24位分辨率,…...

七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...

排序算法总结(C++)
目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指:同样大小的样本 **(同样大小的数据)**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...

搭建DNS域名解析服务器(正向解析资源文件)
正向解析资源文件 1)准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2)服务端安装软件:bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...
scikit-learn机器学习
# 同时添加如下代码, 这样每次环境(kernel)启动的时候只要运行下方代码即可: # Also add the following code, # so that every time the environment (kernel) starts, # just run the following code: import sys sys.path.append(/home/aistudio/external-libraries)机…...