《C语言程序设计基础》课件-函数_第1页
《C语言程序设计基础》课件-函数_第2页
《C语言程序设计基础》课件-函数_第3页
《C语言程序设计基础》课件-函数_第4页
《C语言程序设计基础》课件-函数_第5页
已阅读5页,还剩44页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

主函数被调函数搭建建筑主体门窗等水路、电路

在设计一个复杂的应用程序时,往往是把整个程序划分成若干个功能较为单一的程序模块,然后分别予以实现,最后再把所有的程序模块像堆积木一样装配起来,这种在程序设计中分而治之的策略,被称为模块化程序设计方法。这样的程序便于编写、阅读、修改和维护,提高程序的可靠性,保证了程序的质量。函数

一个较大的程序通常分为若干个子程序模块,每个子程序模块实现一个特定的功能。在C语言中,这些子程序模块是由函数来完成的。一个C程序可由一个主函数和若干个函数组成。程序执行时,从主函数开始,通过主函数调用其他函数,来实现程序功能。(其他函数也可互相调用)模块化程序设计方法

举例1:编程实现,使屏幕上输出如下图形:main(){printf("**********\n");printf("Cprogram!\n");printf("**********\n");printf("----------\n");}案例简单函数调用实例方法一:方法二:采用函数调用实现printa()函数实现输出“**********”,printb()函数实现输出“C

program!”printc()函数实现输出“------------”。

#include<stdio.h>

main()

{printa();/*调用printa函数*/

printb();/*调用printb函数*/

printa();

printc();}

printa()/*定义printa函数*/

{printf(“**********\n”);}

printb()/*定义printb函数*/

{printf(“Cprogram!\n”);}

printc()/*定义printc函数*/

{printf("----------\n");}

案例简单函数调用实例(1)main()函数通过调用程序中其余各函数实现程序功能。注意:其余各函数不能调用main函数。

(2)C程序的执行从main函数开始,调用其他函数后流程返回到main函数,在main函数中结束整个程序的运行。说明案例简单函数调用实例(3)此例中函数调用的过程:main(){printa();……}printa(){…}调用返回说明案例简单函数调用实例(4)函数分类

从函数定义的角度,函数分为两种:①标准函数,即库函数。如scanf、printf、getchar、putchar等都是标准函数。②用户自己定义的函数。如例1中printa、printb和printc。说明案例简单函数调用实例从函数参数的角度,函数分为两种:

①无参函数。函数定义、函数说明、函数调用均不带参数。如printa()。

②有参函数。函数定义、函数说明、函数调用时时都有参数。说明案例简单函数调用实例举例2:有参函数#include"stdio.h"intmax(intx,inty){intz;z=x>y?x:y;returnz;}voidmain(){inta,b,m;printf("请输入两个数:\n");scanf("%d,%d",&a,&b);m=max(a,b);printf("较大的数是:%d\n",m);}案例简单函数调用实例1.无参函数的定义无参函数定义的一般形式为:类型说明符函数名(){声明语句部分执行语句部分}2.有参函数的定义有参函数定义的一般形式为:类型说明符函数名(形式参数表列){声明语句部分执行语句部分}3.空函数在程序设计时,有时用到“空函数”。空函数定义的一般形式为:类型说明符函数名(){}7.1函数的定义与声明举例3:分析程序结果。分析:求两个数的和。#include"stdio.h"voidmain(){

floatadd(floatx,floaty);floata,b,c;printf("请输入两个数:\n");scanf("%f,%f",&a,&b);

c=add(a,b);printf("这两个数的和是:%.2f\n",c);}floatadd(floatx,floaty){floatz;z=x+y;returnz;}7.1函数的定义与声明对被调函数的声明从程序中可以看到,函数的声明与函数定义的第一行(函数首部)基本上是相同的,只差一个分号。因此可以简单地对照函数首部,加一个分号,就构成函数的“声明”。7.1函数的定义与声明函数声明一般形式有两种:1)函数类型函数名(参数类型1,参数类型2,…,参数类型n);2)函数类型函数名(参数类型1参数名1,参数类型2参数名2,…,参数类型n参数名n);

7.1函数的定义与声明注意:

函数的“声明”和函数的“定义”不是一回事,函数的声明是把函数类型、函数名以及形式参数的类型、个数和顺序通知编译系统,以便调用该函数时系统按此对照检查(例如,函数类型是否正确,实际参数与形式参数是否匹配等)。而函数的定义是指对函数功能的确立,包括指定函数类型、函数名、形参及函数体等,它是一个完整的,独立的函数单位。7.1函数的定义与声明三种情况可以省略声明:(1)若被调函数出现在主调函数之前,则可以省略对被调函数的声明。(2)若被调函数的返回类型为int或char型,C语言允许在主调函数中可以不对被调函数做声明。(3)若在函数的外部,已对所有调用的函数做了声明,则在各主调函数中不必对被调函数做函数声明。7.1函数的定义与声明1.函数参数函数参数有形式参数和实际参数两种。

形参:函数定义时,函数名后面括号中的参数称为“形式参数”,简称“形参”,“形参”只在函数定义的函数体内有效,出了函数定义则无效。实参:函数调用时,函数名后面括号中的参数称为“实际参数”,简称“实参”。“实参”的作用是把值传递给被调函数的“形参”。从而实现主调函数向被调函数数据传递的功能。7.2函数的参数和函数的值2.函数返回值函数的返回值也称为函数值,是指由函数被调用,执行完后,返回给主调函数的值。函数的返回值一般通过return语句获得,return语句将被调函数中的一个确定值带回主调函数中。return语句的一般形式为:return(表达式);或return表达式;一个函数中可以有一个以上的return语句,执行到哪一个return语句,哪一个语句起作用,一个return只能带回一个值。在函数调用过程中,大部分都存在着数据上的联系,如外部数据如何传递到函数内部,函数内部处理过的数据如何传递到外部程序。实际上,在C语言中,函数间的参数传递有两种:(1)值传递(2)地址传递7.4函数的参数传递方式值传递是将实参的值传递给形参。值传递是单向数据传递,函数调用结束后,形参的值并不回传给实参。值传递7.4函数的参数传递方式值传递的过程是,先计算实参的值,进入函数调用时,系统为形参分配存储空间,然后将实参的具体数值传递到相应的形参中。这样,在函数内部,通过对形参的操作实现对外部数据的引用。当函数调用结束时,系统将释放形参所占的存储空间。值传递中,形参和实参各自占用不同的存储空间,在函数内部对形参的任何操作,结果只影响形参的值,而不会影响到实参的值。这种方式只能实现外部数据向函数内部的传递,不能实现函数内部数据向外传递。

在C语言中,当形参是变量,实参是表达式(可以是常量、变量等),数据间的传递都是值传递。7.4函数的参数传递方式举例4:分析程序结果

分析:实参向形参传递参数是单向“值传递”。#include"stdio.h"voidswap(intx,inty){intt;printf("x=%d,y=%d\n",x,y);t=x;x=y;y=t;printf("x=%d,y=%d\n",x,y);}voidmain(){inta,b;a=3,b=5;

swap(a,b);printf("a=%d,b=%d\n",a,b);}7.4函数的参数传递方式地址传递

地址传递是将数据的存储地址作为实参传递给形参。地址传递时,形参和实参指向同一个内存单元地址,即数据在主调函数和被调函数中占用相同的存储单元,因此对形参的操作会直接影响实参的值。

7.4函数的参数传递方式举例5:分析程序运行结果。分析:数组名作为实参传递的是数组首地址。#include"stdio.h"voidswap(intx[2]){intt;printf("x[0]=%d,x[1]=%d\n",x[0],x[1]);t=x[0];x[0]=x[1];x[1]=t;printf("x[0]=%d,x[1]=%d\n",x[0],x[1]);}voidmain(){inta[2]={3,5};

swap(a);printf("a[0]=%d,a[1]=%d\n",a[0],a[1]);}7.4函数的参数传递方式C语言的函数定义是互相平行的、独立的,也就是说,在定义函数时,一个函数体内不能包含另一个函数的定义,即函数不能嵌套定义,但是可以嵌套调用函数。下图是函数调用示意图。

7.5函数的嵌套与递归举例6:计s=1*(1+2)*(1+2+3)*…(1+2+…+10)分析:定义函数sum实现1+2+…+n,定义函数fun实现x1*x2*…*xm

7.5函数的嵌套与递归#include"stdio.h"voidmain(){

doublefun(int);/*fun函数声明*/doubles;

s=fun(10);/*fun函数调用*/printf("s=%.2e\n",s);

}doublefun(intm)/*fun函数定义*/{intsum(int);/*sum函数声明*/doublet=1;inti;for(i=1;i<=m;i++)

t=t*sum(i);/*sum函数调用*/returnt;}intsum(intn)/*sum函数定义*/{ints=0,j;for(j=1;j<=n;j++)s=s+j;returns;}7.5函数的嵌套与递归函数的递归调用

在函数的调用过程中直接或间接地调用自身,称为函数的递归调用。在C语言中允许函数的递归调用。注意:在递归调用中,主调函数又是被调函数,整个递归过程就是函数不断自我调用的过程,但递归过程不是无限制进行下去,必须有一个结束递归过程的条件(递归出口)。

7.5函数的嵌套与递归举例7:用递归法求阶乘

n!=1*2*…*n.【例7.11】分析:有数学知识可知:n!=n*(n-1)!

即n!可用下面的公式表示:n!=1(n=1)n*(n-1)!(n>1)7.5函数的嵌套与递归#include"stdio.h"voidmain(){longfun(intn);longf;intn;printf("请输入一个整数:\n");scanf("%d",&n);if(n>=0){f=fun(n);printf("%d!=%ld\n",n,f);}elseprintf("ERROR!\n");}longfun(intn){longf;if(n==0||n==1)f=1;elsef=n*fun(n-1);/*函数递归调用*/returnf;}7.5函数的嵌套与递归通过前面知识的学习,我们知道:变量是程序运行过程中值可以改变的量。变量的数据类型用来说明该变量在内存中所占的字节数以及变量的元素规则。其实,变量的属性还包含另两个方面的内容:一是变量的作用域,即变量的合法使用范围;二是变量的存储类型,用来说明变量的存储位置,变量的存储类别决定着变量的生存期。7.6变量的作用域与存储类别变量的作用域是指变量的有效范围,在该范围内,变量是可用的。C语言中,变量的说明方式不同,其作用域也不同,通常分为局部变量和全局变量。变量的作用域7.6变量的作用域与存储类别1.局部变量在一个函数内部定义的变量或在一个复合语句内部定义的变量称为局部变量,其作用域只在本函数内部或本复合语句内部。7.6变量的作用域与存储类别

2.全局变量是在函数之外定义的变量。它不属于哪一个函数,而属于一个源程序文件,也称为外部变量或全程变量。全局变量可以被本文件中其他函数所共用。它的有效范围为:从定义变量的位置开始到本源文件结束。7.6变量的作用域与存储类别举例8:分析程序结果。分析:复合语句中定义的变量只在本复合语句中有效。#include"stdio.h"voidmain(){intx=3,y=3;

{intx=2;

{intx=1,y=1;printf("x=%d,y=%d\n",x,y);}printf("x=%d,y=%d\n",x,y);}printf("x=%d,y=%d\n",x,y);}7.6变量的作用域与存储类别变量的存储类别

从变量作用域(存储空间)的角度来看,变量可以分为局部变量和全局变量。而从变量的存在时间(即生存期)的角度来看,变量可以分为静态存储方式和动态存储方式。

7.6变量的作用域与存储类别

C存储方式分为两大类:静态存储方式和动态存储方式。具体分成4种:(1)auto:自动变量;(2)static:静态变量;(3)register:寄存器变量;(4)extern:外部变量;7.6变量的作用域与存储类别C语言规定:函数中的局部变量,如果不专门声明为static存储类别,都是动态分配存储空间的,数据存储在动态存储区中。这类局部变量称为自动变量。自动变量用关键字auto作存储类别声明。

auto变量

7.6变量的作用域与存储类别在程序中,如果希望函数中的局部变量的值在函数调用结束后不消失而保留原值,即占用的存储空间不释放,在下一次函数调用时,该变量的值就是上一次函数调用结束时的值,这时就指定该局部变量为“静态局部变量”,用关键字static进行声明。

static局部变量7.6变量的作用域与存储类别举例9:分析程序给出结果。#include"stdio.h"intfun(intn){staticintx=1;returnx=x*n;}voidmain(){inti;for(i=1;i<=5;i++)printf(“%5d”,fun(i));}7.6变量的作用域与存储类别请思考:如果改写程序为:#include"stdio.h"intfun(intn){intx=1;returnx=x*n;}voidmain(){inti;for(i=1;i<=5;i++)printf("%5d",fun(i));}运行结果有什么不同?7.6变量的作用域与存储类别一般情况下,变量(包含静态存储变量和动态存储变量)是存储在计算机内存中的,寄存器变量不同,寄存器变量是存储在CPU的寄存器中的,寄存器与普通存储器的区别在于它的存取速度快。因此用寄存器变量能提高程序的运行速度。通常,对需要频繁使用的变量(如控制循环次数的变量及循环体内反复使用的变量)才定义为寄存器变量。寄存器变量属于动态存储方式。

register变量7.6变量的作用域与存储类别这里再对外部变量做几点说明:(1)外部变量和全局变量是对同一类变量的两种不同角度的提法。全局变量是从它的作用域提出的,外部变量是从它的存储方式提出的,表示它的生存期。(2)在一个源文件中,全局变量的作用域只限在定义点到文件结尾。如果需要扩大全局变量的作用域,即在全局变量定义之前引用该全局变量,须用“extern”存储类型加以说明。对整型变量的extern的声明中,int可省略。extern变量

7.6变量的作用域与存储类别1、内部函数如果一个函数只能被本文件中其他函数调用,则该函数被称为内部函数。内部函数定义的一般形式为:static类型标识符函数名(参数列表)例如:staticintfun(intx,inty);内部函数也称为静态函数。但此处static的含义已不是指存储方式,而是指对函数的调用范围只局限于本源文件。因此在不同的源文件中定义同名的内部函数是不会混淆的。7.7内部函数和外部函数2、外部函数在定义函数时,如果在函数类型前面加”extern”,则表示该函数是外部函数,可供其他文件调用。外部函数定义与声明的一般形式为:extern类型说明符函数名(形参表);例如:externintfun(intx,inty);C语言规定,如果在定义函数时没有声明extern或static,则默认为外部函数。本书前面所用的函数都是外部函数。若在函数中需要调用外部函数,则需要用extern声明。7.7内部函数和外部函

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论