版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
输出里程较长的中国高铁线——函数的定义与调用——目录CONTENTS01函数的定义与调用02形参与实参03实例:输出里程较长的中国高铁线函数的定义与调用承上启下完成了程序基础语法的学习,正式进入函数核心知识模块。本讲主题输出里程较长的中国高铁线,围绕函数的定义与调用展开,逐一学习知识点并结合案例实操。课程导入1掌握函数的定义与调用格式理解并能正确书写函数定义与调用的一般形式。2理解函数的参数和返回值分清形参与实参,理解return语句的作用。3掌握字符数组的初始化掌握字符数组初始化的正确写法。4了解恺撒加密的相关案例通过案例拓展函数的应用视野。函数的定义与调用课程目标01函数的定义与调用函数定义的一般形式如下:类型名函数名(形式参数列表){函数体}注意函数体是函数的核心,包含声明部分和语句部分,是实现函数具体功能的代码块。定义格式四要素:类型名、函数名、形式参数列表、函数体,缺一不可。函数的定义与调用01函数的定义格式函数调用的一般形式:函数名(实在参数列表);1无参函数调用"实参表列"可以没有,但括号不能省略。2多个实参实参表列包含多个实参时,各参数间用逗号隔开。函数的定义与调用01函数的调用方式02形参与实参理解数组下标与内存地址、数据存储的关系,是理解参数传递的基础;在此基础上重点认识形参和实参。形参(形式参数)函数定义时写的参数,那时它只是一个占位符。实参(实在参数)真正调用函数时传递进去的数值,可以是常量、变量或表达式。形参和实参的功能都是数据传送,二者配合完成函数内外的数据传递。函数的定义与调用02形参与实参参数让函数更灵活:函数定义时通过参数列表指定参数的数量和类型,传入不同参数可实现更丰富的功能。打个比方:造一辆车车轮用一个函数来生产;若所有型号的车轮都一样,就无法个性化销售。函数要支持个性化定制:车轮可以是圆的,也可定制梅花、五角星等图案——这就是参数的用法。函数的定义与调用02参数的作用:个性化定制实参(主调函数)调用时把实实在在的值交出去值传递形参(被调函数)从实参得到一个值1传递规则:系统把实参的值传递给被调用函数的形参。2有效期间:该值在函数调用期间有效,可参加该函数中的运算。3虚实结合:此数据传递称为"虚实结合",如用函数输出两整数较大值。函数的定义与调用02数据传递:虚实结合函数的返回值通过函数中的return语句获得,一般形式有以下两种:return(表达式);return表达式;返回值能把函数的计算结果带回调用处,是函数间数据传递的重要方式。函数的定义与调用02函数的返回值03实例:输出里程较长的中国高铁线任务:编程实现输入任意两条铁路线的长度,输出较长的高速铁路线,要求使用函数完成。1第一步:定义函数max求出两个数之间的较大者。2第二步:主函数调用max在main中调用max函数,输出较大者。功能拆分:max()封装比较逻辑,接收两个参数并返回最大值;main()负责输入输出,并调用max完成任务。函数的定义与调用03实例:任务核心目标1①函数定义将max定义在main之前,实现比较两个整数并返回较大值的核心逻辑,符合语法规则,为省略函数声明做铺垫。2②函数声明max定义在main之前,声明语句可以省略;若定义在main之后,必须提前声明,否则编译器无法识别、代码报错。3③函数调用main中将用户输入的实参a、b传递给max,获取返回值并最终输出,这是实现整个实例任务的关键步骤。函数的定义与调用03代码分析:定义、声明与调用#include<stdio.h>int
max(intx,inty){
intz;z=x>y?x:y;
return(z);}int
main(){
inta,b,c;
printf("请输入两条铁路线的长度:");
scanf("%d%d",&a,&b);c=max(a,b);
printf("较长的铁路线为:%d公里\n",c);
return
0;}阅读提示结合之前的分析逐行理解:•上半部分是max函数定义;•下半部分是main主函数;•注意三目运算符与虚实结合。函数的定义与调用03实例:完整代码1#include<stdio.h>引入标准输入输出头文件,为printf和scanf的使用提供支持。2intmax(intx,inty)定义max函数:int表示返回值为整型;intx,inty是两个整型形参,接收两条高铁线里程数。3intz;定义整型变量z,用于存储比较后的最大值。4z=x>y?x:y;用三目运算符实现比较:x大于y则把x赋给z,否则把y赋给z。5return(z);将z的值作为函数返回值,传递给函数的调用处。函数的定义与调用03逐行讲解(上):max函数1intmain()主函数,是C程序的入口,所有程序都从main开始执行。2inta,b,c;a、b存储输入的两条高铁线长度,c存储max返回的最大值。3printf/scanfprintf输出提示语引导输入;scanf读取两个整数,分别存入a、b的内存地址。4c=max(a,b);调用max:实参a、b传给形参x、y,完成虚实结合,返回值赋给c。5printf("较长的铁路线为…")以整型格式输出变量c的值,即较长的高铁线里程数。函数的定义与调用03逐行讲解(下):main函数请输入两条铁路线的长度:23412258较长的铁路线为:2341公里Processexitedafter9.382secondswithreturnvalue0请按任意键继续...在Dev-C++编译器中的实际运行结果结果解读输入2341和2258,输出较长线为2341公里;返回值为0,程序正常结束。函数的定义与调用03实例:运行结果定义·声明·调用定义(创建功能)、声明(告知编译器)、调用(执行功能),是构建程序的基础。函数封装比较逻辑封装在max中,main负责调用,是模块化设计的基础,功能划分更清晰。执行流程从main开始,遇调用跳转到定义处执行,完毕后返回调用点继续,形成闭环。模块化与解耦复杂程序分解为独立模块,降低耦合度,结构更清晰、逻辑更简单、可维护性更高。函数的定义与调用课程总结谢谢大家函数的参数与返回值——值传递与地址传递的区别——主讲人:冯淑婷目录CONTENTS01值传递:单向的数据拷贝02地址传递:直接操作实参地址03值传递与地址传递对比04函数的返回值值传递与地址传递上节回顾学习函数的定义、调用以及形参实参的基础传递规则。本讲内容学习参数传递的两种核心方式:值传递与地址传递,厘清二者的本质区别。从核心概念、代码实现、内存模型三个维度拆解。课程导入1知识层面理解值传递与地址传递的核心原理,掌握值传递"单向"、地址传递"双向"的特点,理解两者不同的内存模型。2技能层面能识别程序中的参数传递方式,分析不同传递方式对程序结果的影响,并能按需灵活选择。3素养层面培养严谨的逻辑思维,提升分析问题的能力,体会C语言指针的强大功能。值传递与地址传递课程目标void
swap(intx,inty){
intt;t=x;x=y;y=t;}int
main(){
inta=3,b=5;
swap(a,b);
printf("a=%db=%d\n",a,b);
return
0;}代码意图定义swap交换函数;主函数中a=3、b=5,调用swap尝试交换a和b的值。值传递与地址传递情境导入:交换失败的案例a=3b=5函数内部x和y成功交换,但主函数中a、b仍是3和5,没有任何变化。核心疑问:为什么函数内部的操作无法影响主函数的变量?关键在于参数传递的方式。值传递与地址传递运行结果与核心疑问01值传递:单向的数据拷贝值传递的核心是单向的数据拷贝:函数调用时,系统为形参x、y分配新的内存空间,再将实参a、b的值拷贝给形参——形参就是实参的一个“副本”。特点一:单向传递数据只能从实参流向形参,反过来不行。特点二:内存独立实参和形参在内存中是互不干扰的两个区域。一句话记住:值传递=复印一份给函数用,原件不会被动到。值传递与地址传递一、值传递:单向的数据拷贝1各自独立main中a、b有独立的内存地址和值;调用swap时,系统为x、y分配新地址,只拷贝值。2只动副本函数内部仅操作x、y的内存空间,交换只作用于实参的“副本”,和a、b没有关系。3形参销毁函数结束后形参x、y被销毁,实参a、b自然不变——这就是值传递单向性导致的失败本质。值传递与地址传递值传递内存模型:失败原因02地址传递:直接操作实参地址值传递无法修改主函数的实参,若需要在函数内修改实参值,该怎么办?地址传递(指针传递)核心是直接操作实参的内存地址。形参变身形参不再是普通变量,而是指针变量,专门接收实参的内存地址。第二种传递方式登场:地址传递,也叫指针传递。值传递与地址传递二、地址传递:直接操作实参地址工作原理:传递“门牌号”调用时传递的不是实参的值,而是内存地址;形参指针拿到“门牌号”,就拥有访问实参内存的“钥匙”。关键特点:双向传递与内存共享形参指针和实参指向同一块内存,形参可直接修改实参内容,操作会直接反映到实参上。值传递与地址传递地址传递的工作原理void
swap(int*px,int*py){
intt;t=*px;*px=*py;*py=t;}int
main(){
inta=3,b=5;
swap(&a,&b);
printf("a=%db=%d\n",a,b);
return
0;}a=5b=3交换成功!1指针形参形参改为int*px、int*py,存储整型变量的地址。2取地址符&调用时swap(&a,&b),让px、py指向a、b的内存。3解引用符**px等价于a,*py等价于b,通过解引用完成交换,操作的就是实参内存。值传递与地址传递地址传递:正确的交换代码03值传递与地址传递对比对比维度值传递地址传递传递内容实参的值(副本)实参的内存地址形参类型普通变量指针变量内存关系实参形参独立存储形参指针指向实参内存数据流向单向双向对实参的影响修改形参不影响实参修改形参指向内容会影响实参使用场景只需使用实参值需要在函数内修改实参值值传递与地址传递三、值传递与地址传递对比void
swap_by_value(intx,inty){
intt=x;x=y;y=t;}//调用后a、b不变值传递版本void
swap_by_address(int*px,int*py){
intt=*px;*px=*py;*py=t;}//调用后a、b成功交换地址传递版本实际效果差异:值传递调用后a、b不变;地址传递调用后a、b成功交换。值传递与地址传递两种传递方式的代码对比04函数的返回值返回值的核心作用是反馈执行结果;硬性语法规定:一个函数只能有一个返回值。参数传递=输入方向:主调函数→被调函数,为主调函数向被调函数传入数据。返回值=输出方向:被调函数→主调函数,为被调函数向主调函数输出数据。实际编程:参数接收多个输入,经计算由返回值输出单一结果;需要输出多个结果时,必须使用地址传递(指针或引用)实现。值传递与地址传递四、函数的返回值1核心区别值传递传“副本”,单向不影响实参;地址传递传“地址”,双向可修改实参。2内存模型值传递实参形参内存独立;地址传递形参指针指向实参内存——这是底层关键。3实际应用按需选择:需修改主调函数变量用地址传递;仅使用值时用值传递更安全。4编程思想深入理解底层内存操作是写出高效代码的关键,按场景选传递方式,提升程序的健壮性和灵活性。值传递与地址传递任务总结谢谢大家求阶乘——函数的递归调用——主讲人:冯淑婷目录CONTENTS01递归调用的定义02实例:递归求阶乘03递归与循环的对比04递归的风险:栈溢出函数的递归调用上节回顾掌握了函数参数的两种传递方式,理解了函数间数据交互的底层逻辑。本讲内容学习函数的高级调用方式——递归调用,通过求阶乘案例掌握递归的用法。这是C语言中非常重要的知识点。课程导入1掌握函数的递归调用本讲重点,结合求阶乘案例深入理解。2巩固函数的参数和返回值复习参数传递与返回值的相关知识。3学习字符数组的初始化掌握字符数组初始化的正确写法。4结合案例掌握恺撒加密的实现拓展函数知识的实际应用。函数的递归调用课程目标01递归调用的定义在C语言中,函数的定义与调用有以下核心规则:定义:不能嵌套函数的定义相互独立,一个函数内不能再定义另一个函数。调用:可以嵌套在调用一个函数的过程中,可以再调用另一个函数。正是“调用可以嵌套”这条规则,为函数自己调用自己提供了可能——这就是递归的语法基础。函数的递归调用01函数定义与调用的嵌套规则递归调用的定义一个函数在其函数体内直接或间接地调用该函数本身,则该函数为递归,此调用方式称函数的递归调用。调用方式递归调用的一般形式与普通调用相同:函数名(实在参数列表);该语句要出现在原函数体内,且函数名仍为原函数名。函数的递归调用01递归调用的定义与方式02实例:递归求阶乘任务核心目标:运用递归思想,编写程序计算一个正整数的阶乘。阶乘的数学定义
特殊规定:0!=1函数的递归调用02实例:任务目标与阶乘定义
阶乘的递归关系式把求n的阶乘这个大问题,分解成求n-1的阶乘这个更小的问题。这正是递归思想的核心——将大问题分解为结构相似的小问题。函数的递归调用02阶乘的递归关系编写所有递归函数的两个必要条件,缺一不可:条件一:基线条件当n=0或1时直接返回1——这是递归能停下来的关键,否则函数会无限自我调用。条件二:递归步骤调用自身计算(n-1)!,再与n相乘返回——不断缩小问题规模,直到触达基线条件。没有基线条件,递归将永远无法终止,最终导致程序崩溃。函数的递归调用02递归算法的两个必要条件以计算5!为例,第一阶段回溯:不断分解问题。5!4!3!2!1!分解到n=1时满足基线条件,直接返回1。特点:函数不断调用自身,问题规模逐渐缩小,直到触达可以直接解决的基线条件。函数的递归调用02第一阶段:回溯(分解问题)第二阶段递推:从基线条件的结果开始,反向逐步计算出最终值。2!=23!=64!=245!=1201!=1从基线条件的1!=1开始,依次算出2!=2、3!=6、4!=24,最终得到5!=120——这是递归得到结果的关键步骤。函数的递归调用02第二阶段:递推(合并结果)代码解读•返回值类型为long,参数为int型n;•n>0时递归调用自身:result=n*fact(n-1);•n≤0时result=1,满足0!=1的基线条件。long
fact(intn){
longresult;
if(n>0)result=n*fact(n-1);
elseresult=1;
returnresult;}递归求阶乘的fact函数函数的递归调用02代码实现:fact函数主函数要点•先声明fact函数;•定义整型变量n和长整型变量y;•用printf、scanf实现用户输入;•调用fact计算后输出结果:输入6,输出720。函数的递归调用02主函数与运行结果int
main(){
intn;
longy;
printf("请输入一个正整数:");
scanf("%d",&n);y=fact(n);
printf("%d的阶乘是%ld\n",n,y);
return
0;}请输入一个正整数:66的阶乘是720long
long
factorial_loop(intn){
long
longresult=1;
for(inti=1;i<=n;i++)result*=i;
returnresult;}循环思路•初始化result为1;•for循环从1遍历到n;•每次result*=i,返回即得n!。函数的递归调用03循环实现阶乘03递归与循环的对比对比维度递归循环代码结构简洁优雅,接近数学描述相对冗长,需手动管理循环变量执行效率较低,每次调用有额外开销更高,系统开销更小内存使用消耗大,栈帧过多易溢出消耗小,只需少数变量适用场景树结构、分治等递归结构问题大多数简单的重复操作函数的递归调用03递归与循环的对比04递归的风险:栈溢出什么是栈溢出?函数调用会在内存“栈”中分配栈帧,存储参数、局部变量等数据;栈内存被耗尽时,程序就会异常终止。递归深度过大时,未释放的栈帧大量堆积;栈空间不足以支撑当前递归深度时,就会触发栈溢出错误,导致程序崩溃。典型场景:用递归计算超大数阶乘,如factorial(10000),递归层数达一万层,栈帧耗尽栈空间——所以大数阶乘一般用循环而非递归。函数的递归调用递归的风险:栈溢出递归核心概念本质是函数自我调用,将复杂大问题层层分解为结构相似的小问题。两个必要条件基线条件防止无限循环,递归步骤不断缩小问题规模,缺一不可。执行两阶段“递推”分解问题直至基线条件;“回溯”从基线逐层合并结果返回最终答案。权衡与风控递归简洁但效率较低、深度过大会栈溢出;性能敏感场景优先用循环替代。函数的递归调用课程总结谢谢大家求长方体体积——函数作用域——主讲人:冯淑婷目录CONTENTS01函数作用域02变量的四种存储类别03案例实战:求长方体体积04拓展案例:求长方体表面积函数作用域上节回顾学会了将数组作为函数参数传递,实现了数组相关的函数操作。本讲内容学习函数作用域与变量存储类别,结合长方体体积计算案例掌握变量的使用规则,掌握程序数据组织和管理的方法。课程导入1理解并掌握函数作用域的核心概念。2认识变量的不同存储类别,清楚各类别的特性。3通过求长方体体积的案例,学会运用函数作用域和变量知识编写程序。4通过长方体表面积的案例,巩固所学内容,做到学以致用。函数作用域课程目标01函数作用域局部变量在函数内部声明的变量,函数的形参也属于局部变量。作用域受限:仅在声明它的函数中起作用,函数外部无法使用。复合语句内定义的变量,出了该范围即失效。全局变量在函数外面定义的变量,也叫外部变量。需要在多个函数中使用同一个变量时,可定义全局变量。能被本程序中所有函数共用,是函数间共享数据的一种方式。核心区别:局部变量的作用域是函数/复合语句内部,全局变量的作用域是整个程序。函数作用域01函数作用域:全局变量与局部变量02变量的四种存储类别auto自动变量变量的默认存储类别,未指定即为auto。存储在栈区,函数调用结束后自动释放。static静态变量存储在静态区,生存周期长。函数调用结束后值仍保留,具备“记忆”功能。extern外部变量声明在其他文件中定义的全局变量。实现跨文件的变量访问。register寄存器变量建议编译器将变量存入CPU寄存器,提高访问速度。适合频繁读写的变量;是否存入由编译器决定。函数作用域02变量的四种存储类别四类存储类别核心差异对比:存储类别存储位置作用域生存周期auto自动变量栈区块内块的执行期static静态变量数据段/BSS段文件/函数内整个程序运行期extern外部变量全局数据区整个程序程序运行期register寄存器变量寄存器块内块的执行期函数作用域02存储类别对比表03案例实战:求长方体体积核心思路:以“数组找最大值”理解函数分工与数据传递。1定义长度为10的数组a存放10个数,设计max函数求两个数的大者。2主函数定义变量m,初值为a[0],假定第一个元素是最大值。3依次将a[1]到a[9]和m比较,最终的m就是10个数的最大值。思路核心:函数的分工和数据的传递,与求长方体体积的编程思路相通。函数作用域03求长方体体积:任务分析核心问题①如何用C语言编写程序计算长方体的体积?核心问题②长、宽、高这些核心数据定义在程序的什么位置,才能让程序结构更清晰、更不容易出错?本课核心目标不是单纯编写一个求体积的程序,而是通过这个程序,深入理解变量的作用域与存储类别。掌握组织和管理程序数据的关键方法,这是编程的核心思路,也是后续开发中必须掌握的能力。函数作用域03核心问题思考float
calculateVolume(floatl,floatw,floath){
returnl*w*h;}int
main(){
floatlength=12,width=56,height=8;
floatv;v=calculateVolume(length,width,height);
printf("v=%.0f\n",v);
return
0;}代码解析•形参l、w、h是局部变量。•main中的length、width、height、v也是局部变量。•主函数传参调用,函数内乘法计算并返回,主函数接收后打印。•所有变量的作用域都在各自的函数内部。方案一:使用局部变量函数作用域03方案一:使用局部变量floatlength=12,width=56,height=8;float
calculateVolume(){
returnlength*width*height;}int
main(){
floatv;v=calculateVolume();
printf("v=%.0f\n",v);
return
0;}代码解析•length、width、height定义在所有函数外部,成为全局变量。•全局变量作用域是整个程序,函数可直接使用
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年电大《土地利用规划》期末考试高频考点试题及答案解析
- 2026年金属制品行业战略咨询报告及未来五至十年研发投入与专利布局
- 2026年海东地区公务员人员招聘笔试参考题库与答案详解
- 2026年其他未列明建筑业行业发展研究报告及未来五至十年资本热度与投融资趋势
- 2026年哈尔滨市南岗区公务员人员招聘考试备考题库与答案详解
- 2026年临终关怀服务行业市场深度调查及投资规划报告及未来五至十年区域市场差异与机会
- 2026年台式电脑行业洞察报告及未来五至十年发展趋势报告
- 2026年渭南市临渭区公务员人员招聘笔试试题与答案详解
- 2026年工业自动控制系统装置制造行业市场调查研究及发展前景报告及未来五至十年市场渗透率与增量空间
- 2026年非木竹材林产品采集行业市场监测与评估报告及未来五至十年用户画像与需求分层
- 2026年初级车险理赔试题及答案
- 高低压成套设备装配质量罚款细则
- 【完美导学】Unit 4 Humor Lesson 3 My Favourite Comedian Reading and writing workshop 课件-2022-2023学年高二英语同步备课(北师大版2019选择性必修第二册)
- 2025年全国职业院校技能大赛中职(电子产品设计与应用赛项)考试题附答案
- 2026年黑龙江绥化市中考数学卷试题真题(含答案详解)
- 充电桩生产制造项目投资计划书
- 2026中国超声波按摩器市场消费状况与竞争态势分析报告
- 政府釆购内部控制制度
- 2026年医疗器械基础知识培训资料
- 2026贵州航天控制技术有限公司(航天科工十院0612研究所)招聘笔试参考题库及答案解析
- 寒暑假托管班协议合同
评论
0/150
提交评论