版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C语言程序设计智能工程学院“现场课程”
目
录目录CONTENTS
函数概述7.1
函数定义7.2
函数的调用7.3模块化程序设计的核心思想,是将复杂的大型程序拆解为若干个独立的程序模块,每个模块专注实现一个特定功能,通过模块间的协作完成整体任务。在C语言中,函数正是实现模块功能的核心载体——一个完整的C程序,通常由1个主函数(main函数)和若干个其他函数构成。程序运行时,由主函数作为入口,调用其他函数;这些被调用的函数之间,也可以相互调用。并且,同一个函数可被一个或多个函数调用任意次数,极大提升了代码的复用性,其调用关系可通过包含函数a~f的示意图直观呈现。为了更通俗地理解这一概念,我们可以将编写程序类比为学校组织学生打扫教室卫生的过程:主函数就如同负责统筹安排的老师,核心作用是控制程序每一步的执行流程,决定何时调用哪个“功能模块”;而程序中定义的其他函数,就像分工明确的学生——有的专门负责擦窗户,有的专注擦桌子,有的承担扫地任务,每个函数都只聚焦于完成自己对应的“特定工作”。从用户使用的角度看,函数可分为库函数和用户自定义函数两大类,下面分别进行介绍。
7.1函数概述库函数是C语言标准库或第三方库中预先实现并封装好的函数,它们由编译器厂商或开发组织提供,用于完成一些常用的基础功能,供开发者直接调用,无需用户自己编写实现代码。例如,调用printf和scanf函数时需要在程序开头包含stdio.h头文件;调用sqrt函数和log函数时需要包含math.h头文件;调用strcpy函数和strlen函数时需要包含string.h头文件。库函数主要包括以下特点:通用性强:覆盖了程序开发中常见的基础功能,如输入输出(printf、scanf)、字符串处理(strlen、strcpy)、数学运算(sqrt、sin)、内存管理(malloc、free)等。高效可靠:经过严格测试和优化,执行效率高且稳定性强,避免了用户重复开发可能出现的错误。需包含头文件:使用库函数前,必须通过#include指令包含对应的头文件(头文件中声明了函数的原型)。例如:使用printf、scanf需包含<stdio.h>;使用strlen需包含<string.h>;使用sqrt(开平方)需包含<math.h>。
7.1函数概述7.1.1库函数了解函数返回值的意义及类型。3了解需要使用的包含文件。4
提示不同的C语言编译系统提供的库函数的数量和功能会有一些不同,不过,大多数基本函数都是相同的。
7.1函数概述明确函数的功能。1了解函数参数的数目和顺序,以及每个参数的意义及类型。2使用库函数时应注意以下几个问题:7.1.1库函数【例7-1】计算一个数的平方根。【问题分析】计算一个数的平方根,需先明确输入非负(负数无实根,需提示错误)。数据类型选double以兼容小数结果。计算可直接用<math.h>的sqrt库函数(高效精准),或手动实现牛顿迭代法/二分法(适合学底层)。还需处理输入非数值的情况,输出可借printf控制精度,核心是先验输入合法性,再选适配计算方式输出结果。
7.1函数概述7.1.1库函数【参考代码】#include<stdio.h>//包含输入输出库函数的头文件#include<math.h>//包含数学库函数的头文件intmain(){doublenum,result;printf("请输入一个非负数:");scanf("%lf",&num);if(num<0){printf("错误:输入的数不能为负数!\n");return1;//程序异常退出}result=sqrt(num);printf("%lf的平方根是:%lf\n",num,result);return0;}
7.1函数概述7.1.1库函数【运行结果】程序运行结果如图所示。
7.1函数概述7.1.1库函数【例7-2】打印固定格式的欢迎信息。【问题分析】该程序含头文件、自定义函数printWelcome和主函数。printWelcome为无参无返回值函数,用printf输出固定格式欢迎信息;main函数调用它实现功能。体现函数封装性,便于复用与维护,是C语言模块化编程基础示例。在C语言中,用户自定义函数是由程序员根据需求自行设计的函数,用于封装特定功能,提高代码的复用性和可读性。
7.1函数概述7.1.2用户自定义函数【参考代码】#include<stdio.h>//自定义函数:打印固定格式的欢迎信息voidprintWelcome(){printf("====================\n");printf("WelcometoCLang\n");printf("====================\n");}intmain(){printWelcome();//调用自定义函数return0;}
7.1函数概述7.1.2用户自定义函数【运行结果】程序运行结果如图所示。【程序说明】程序先引入标准输入输出库,定义无参无返回值函数printWelcome,其用printf输出带分隔线的欢迎信息。主函数main调用该函数完成打印。此程序展示了C语言自定义函数的基本用法,通过封装固定功能实现代码复用,结构清晰易维护。
7.1函数概述7.1.2用户自定义函数
名师点睛(1)一个C程序可由一个或多个程序模块组成,每个程序模块可作为一个源程序文件。对于较大的程序,一般由若干个源程序文件组成。一个源程序文件可以为多个C程序共用。(2)C语言是以源文件为单位进行编译的,一个源程序可由一个或多个函数组成。(3)在C语言中,不管main函数在程序中的什么位置,程序总是从main函数开始执行,调用其他函数后,最终在main函数中结束。(4)所有函数都是平行的,在定义时相互独立,一个函数不属于另一个函数。函数不可以嵌套定义,但可以相互调用,main函数可以调用任何函数,一个函数可以多次被调用,而其他函数不能调用main函数。
7.1函数概述7.1.2用户自定义函数无参函数定义1在C语言中,无参函数是指不接收任何输入参数的函数,其定义格式为:类型说明符函数名(){ 函数体;}或类型说明符函数名(void){ 函数体;}函数名后面括号内的void表示“空”,即函数没有参数。无参函数的“类型说明符”指定函数返回值的类型,可以是任何有效类型。省略“类型说明符”时,系统默认的函数返回值类型为int型。当函数只完成特定操作而不需返回函数值时,可用类型名void,如例7-2中的window,desk和floor函数。此外,函数的命名规则与变量的命名规则相同。
7.2函数定义有参函数定义2在C语言中,有参函数是指需要接收外部输入参数的函数,定义有参函数的一般形式为:类型说明符函数名(形式参数声明){ 函数体}有参函数在函数名后的括号内必须有形式参数(简称“形参”)表,用于调用函数和被调函数之间的数据传递,故必须对其进行类型说明,这由形式参数声明部分完成。一般情况下,函数中需要多少个原始数据,函数的形参表中就应有多少个形参,每个形参存放一个数据,形参之间用逗号隔开。例如:intmin(inta,intb){ intc; c=a<b?a:b; return(c);}
7.2函数定义空函数3C语言中可以有“空函数”,它的形式为:类型说明符函数名(){}例如:voidtriangle(){}调用此函数时,什么工作也不做。在主调函数中写“triangle();”,表明这里要调用一个函数而现在这个函数不起作用,等以后扩充函数功能时再补上。
7.2函数定义
目
录目录CONTENTS
函数概述7.1
函数定义7.2
函数的调用7.3函数调用的一般形式为:函数名(实际参数表列)需要说明以下几点:如果调用无参函数,则“实际参数表列”可以没有,但括号不能省略。实际参数(简称“实参”)表中实参的类型及个数必须与形参相同,并且顺序一致。当有多个实参时,参数之间用逗号隔开。实参可以是常量、有确定值的变量或表达式及函数调用。
7.3函数的调用7.3.1函数的调用形式123【例7-3】求两个实数的平均值。【问题分析】在这里我们定义一个有参函数用于计算两实数的平均值。在主函数中可以多次调用此函数用于计算不同数值的平均值。
7.3函数的调用7.3.1函数的调用形式【参考代码】#include<stdio.h>floataverage(floatx,floaty) /*定义函数用于计算两数的平均值,x和y为形参*/{floatav; /*定义变量av用于存放平均值*/
av=(x+y)/2.0; /*求平均值*/
returnav; /*返回av的值*/}intmain(){
floata=1.8,b=2.6,c;
c=average(a,b); /*实参为确定值的变量*/
printf("Theavergaeof%5.2fand%5.2fis%5.2f\n",a,b,c);
c=average(a,a+b); /*实参为表达式*/
printf("Theavergaeof%5.2fand%5.2fis%5.2f\n",a,a+b,c);
c=average(2.0,4.0); /*实参为常量*/
printf("Theavergaeof2.0and4.0is%5.2f\n",c);
c=average(c,average(a,b)); /*实参为函数调用*/
printf("Theavergaeis%5.2f\n",c);}
7.3函数的调用7.3.1函数的调用形式【运行结果】程序运行结果如图所示。
7.3函数的调用7.3.1函数的调用形式【程序说明】求两个实数的平均值函数average有两个形式参数x和y,这两个参数用来接收调用函数时传递来的变量或表达式的值。该程序主函数调用了四次average函数,第一次调用时,用形式参数x和y接收实参变量a和b的值;第二次调用时,用表达式a+b作为实参之一,将a和a+b的值传给形参x和y;第三次调用时,用常量作为实参,将2.0和4.0的值传给x和y;第四次调用时,用函数调用average(a,b)作为实参之一,将c和average(a,b)的值传给形参x和y。按被调用函数在主调函数中出现的位置和完成的功能进行划分,函数调用有下列三种调用方式。
7.3函数的调用7.3.1函数的调用形式把函数调用作为一个语句,如例7-2中的“window();”,这时不要求函数带回值,只要求函数完成一定的操作。1在表达式中调用函数,这种表达式称为函数表达式。这时要求函数带回一个确定的值以参加表达式的运算。例如:c=average(a,b); /*将调用函数的结果赋值给c*/d=8*average(a,b); /*将调用函数的结果乘以8后赋值给d*/2将函数调用作为另一个函数调用的实参。例如:c=average(c,average(a,b));此处把average(a,b)作为average函数的一个参数。3
7.3函数的调用7.3.1函数的调用形式在一个函数调用另一个函数时,如果使用用户自定义函数,并且该函数与主调函数在同一个文件中,此时一般被调用函数应放在主调函数之前定义。若被调用函数的定义在主调函数之后出现,就必须在主调函数中对被调函数加以声明。函数声明的一般形式为:类型说明符函数名(形参表);函数声明实际上就是函数定义时的函数头,后面加分号构成一条声明语句。函数声明与函数头的区别是,函数声明的形参表中可以只写类型名,而不写形参名。例如,下面两种写法都是正确的:floataverage(floatx,floaty);floataverage(float,float);【例7-4】输入两个实数,用一个函数求出两数中较小数。【问题分析】分别编写min函数和main函数,main函数在min函数之前,需要在main函数中对min函数进行声明。
7.3函数的调用7.3.2函数声明【参考代码】#include<stdio.h>intmain(){floatx,y,z;
floatmin(floata,floatb); /*函数声明*/
printf("Pleaseentertwonumbers:");
scanf("%f
%f",&x,&y);
z=min(x,y); /*函数调用*/
printf("minis%f\n",z); /*输出结果*/
return0;}floatmin(floata,floatb) /*函数定义*/{
floatc;
if(a>b) /*比较大小,将较小数赋值给c*/ c=b;
else c=a;
returnc; /*返回值为c*/}
7.3函数的调用7.3.2函数声明【运行结果】程序运行结果如图所示。
7.3函数的调用7.3.2函数声明【程序说明】程序第5行是对被调用的min函数的声明:floatmin(floata,floatb);从程序中可以看到,main函数的位置在min函数的前面,而程序编译时是从上到下逐行进行的。如果没有对min函数的声明,当编译到程序第8行(z=min(x,y);)时,编译系统将无法确定min是不是函数名,也无法判断实参(x和y)的类型和格式是否正确,因此,在调用函数前必须对被调函数加以声明。C语言规定以下几种情况,可以不在主调函数中对被调函数进行声明:如果被调函数写在主调函数的前面,可以不必进行声明。例7-2和例7-3均属于此种情况,在此不再赘述。1如果函数的返回值为整型或字符型,可以不必进行声明。2
7.3函数的调用7.3.2函数声明【例7-5】通过自定义函数,求任意两个整数的和。【参考代码】#include<stdio.h>intsum(int,int);
intmain(){inta,b;
printf("inputtwointegers:");
scanf("%d
%d",&a,&b);
printf("Thesumof%dand%dis%d\n",a,b,sum(a,b)); /*调用函数*/
return0;}intsum(inta,intb) /*函数定义*/{
return(a+b); /*返回a+b的值*/}
7.3函数的调用7.3.2函数声明【运行结果】程序运行结果如图所示。
7.3函数的调用7.3.2函数声明如果在所有函数定义之前,在源程序文件的开头,即在函数的外部已经对函数进行了声明,则在各个调用函数中不必再对所调用的函数进行声明。例如,例7-4程序中也可将第5行函数声明(floatmin(floata,floatb);)放到main函数之前。3
名师点睛在调用函数前,可以在主调函数内部对被调函数进行声明。如果使用这种声明方式,则本次函数声明只在主调函数内部有效,也就是说,如果其他函数中也需要调用该被调函数,在那些函数中对被调函数仍然需要进行声明。如果已经在文件的开头(或在函数前)对某函数进行了声明,则从声明处开始,在本文件中对声明函数的调用不需要再次进行声明。
7.3函数的调用7.3.2函数声明在调用有参函数时,主调函数和被调函数之间往往有数据传递关系。前面已经介绍过,在定义函数时函数名后面圆括号内的为“形式参数”(简称“形参”),用于接收主调函数传来的数据;在调用函数时,函数调用语句的函数名后面圆括号中的内容为“实际参数”(简称“实参”)。在调用函数过程中,系统会把实参的值传递给被调用函数的形参。该值在函数调用期间有效,可以参加该函数的运算。例如,例7-4程序中第12~20行是一个被调函数(注意第12行的末尾没有分号)。第12行定义了一个函数名为min,函数类型为float的函数。指定两个形参a和b,形参的类型为float。主调函数main的第8行(z=min(x,y);)是一个函数调用语句,表示调用min函数,此处函数名min后面圆括号内的x和y是实参。x和y是主调函数main函数中定义的变量,a和b是被调函数min中定义的形参变量,通过函数调用,使两个函数之间发生数据传递。实参x和y的值按顺序对应传递给被调函数中的形参a和b,x传给a,y传给b。在执行被调函数min后,其返回值c作为函数的返回值返回给主调函数,赋给变量z。
7.3函数的调用7.3.3函数的参数传递
名师点睛关于形参和实参的说明如下:(1)函数中指定的形参变量,在未出现函数调用时,并不占用内存单元。在发生函数调用时,被调函数的形参被临时分配内存单元,调用结束后,形参所占的内存单元被自动释放。(2)函数一旦被定义,就可多次调用,但必须保证形参和实参数据类型一致。如果实参和形参数据类型不一致,则按不同类型数值的赋值规则进行转换。例如,实参a为float型变量,其值为5.8,而形参x为int型,则在传递时先将实数5.8转换成整数5,然后送到形参x。(3)实参可以是常量、变量或表达式,但要求它们有确定的值。(4)在被定义的函数中,必须指定形参的数据类型。(5)C语言规定,实参对形参变量的数据传递是“值传递”,即单向传递,只由实参传给形参,而不能由形参传回给实参。
7.3函数的调用7.3.3函数的参数传递【例7-6】阅读下面的程序,试分析运行结果。#include<stdio.h>intswap(inti,intj){intt;
t=i;i=j;j=t;
printf("Infunctioni=%d,j=%d\n",i,j);}intmain(){
inti=2,j=3;
swap(i,j);
printf("Outfunctioni=%d,j=%d\n",i,j);
return0;}
7.3函数的调用7.3.3函数的参数传递【运行结果】程序运行结果如图所示。【程序说明】该程序中的swap函数的作用是将形参i和j两数互换,因此,在函数内部输出i和j时,两数实现了交换。但是,C语言中规定:只能把实参数值传递给形参,而形参不能把数值传递给实参。因此,main函数中的i和j还是原来的值,没有实现交换。
7.3函数的调用7.3.3函数的参数传递一般情况下,主调函数调用完被调函数后,都希望能够得到一个确定的值,这就是函数的返回值。在C语言中,函数返回值是通过return语句来实现的。return语句的一般形式有三种:return(表达式);return表达式;return;下面对返回语句和函数返回值作一些说明。(1)return语句可使函数从被调函数中退出,返回到调用它的代码处,并向调用函数返回一个确定的值。如果需要从被调函数带回一个函数值(供主调函数使用),被调函数中必须包含return语句且return中带表达式,此时使用return语句的前两种形式均可。如果不需要从被调函数带回函数值,应该用不带表达式的return语句;也可以不要return语句,这时被调函数一直执行到函数体的末尾,然后返回
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年中电建生态环境集团有限公司招聘备考题库及完整答案详解一套
- 2026年中华联合财产保险股份有限公司温州中心支公司招聘备考题库及答案详解一套
- 2026年南宁市良庆区大沙田街道办事处公开招聘工作人员备考题库含答案详解
- 2026年四川省教育融媒体中心(四川教育电视台)公开招聘编外工作人员备考题库完整答案详解
- 2026年外派至中铁建昆仑高速公路运营管理有限公司南充过境高速及德遂高速公路路巡队员招聘备考题库完整答案详解
- 2026年中共宁德市委党校招聘劳务派遣人员7人备考题库及1套完整答案详解
- 2026年《中国文化报》社有限公司招聘备考题库及一套参考答案详解
- 2026年中煤科工集团武汉设计研究院有限公司招聘备考题库及参考答案详解一套
- 2026年【张家堡社区卫生服务中心】招聘5人备考题库带答案详解
- 2026年合肥市规划设计研究院公开招聘工作人员备考题库及一套参考答案详解
- 2025浙江绍兴越城黄酒小镇旅游开发有限公司编外人员第二次招聘总笔试历年典型考点题库附带答案详解2套试卷
- DB54∕T 0378-2024 牦牛短期育肥技术规范
- 2025 年中国装配式装修产业发展研究报告
- 户外拓展活动中中级攀岩指导员职责分工计划
- 数据中心配电知识培训课件
- 数据标注员专业技能考核试卷及答案
- 传染病信息报告管理规范2025版
- 海南自贸港课件
- 北京市东城区2026届数学九上期末考试试题含解析
- 叉车盲区安全培训记录课件
- 自然资源部所属单位2025年度公开招聘工作人员(第三批)笔试模拟试题含答案详解
评论
0/150
提交评论