程序设计语言课件_第1页
程序设计语言课件_第2页
程序设计语言课件_第3页
程序设计语言课件_第4页
程序设计语言课件_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

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

文档简介

第七章函数C语言程序是由许多函数组合而成,其中主函数main是必须要有的,它是整个程序的入口和出口(不论main函数处于程序中的什么位置)。函数有库函数和用户自行编写的函数两种。如我们前面使用到的scanf()与printf()函数是系统提供的库函数,我们只要正确调用它就可以了,无须用户自已编写,但使用前请在程序开头处加下#include<头文件名>,否则无法使用。对库函数和用户自行编写好的函数(既函数定义)的使用,即函数调用格式如下:函数名(参数表)例如y=x2.5+1.3C程序中应写为y=pow(x,2.5)+1.3;x和2.5是pow的两个参数第一节函数的定义和返回值与函数相关的概念一个较大的程序一般应分为若干个程序模块,每个模块用来实现一个特定的功能。在C语言中用函数来实现模块的功能。一个C程序可由一个主函数和若干个其他函数构成。由主函数调用其他函数,其他函数之间也可以相互调用,但是不能调用主函数。同一个函数可以被一个或多个函数调用任意多次。关于函数的几点说明如下:1)一个源程序文件由一个或多个函数组成。一个源文件是一个编译单位,即以源程序为单位进行编译,而不是以函数为单位进行编译。2)一个C程序由一个或多个源程序文件组成。一个源文件可以为多个C程序公用。3)C程序的执行从main函数开始,调用其他函数后流程返回到main函数,在main函数中结束整个程序的运行。4)所有函数都是平行的,即在定义函数时是互相独立的,一个函数并不从属于另一个函数,即函数不能嵌套定义。函数间可以互相调用,但不能调用main函数;5)从用户使用角度看,函数分为标准函数即库函数和用户自已定义的函数两种。6)从函数的形式看,函数分为无参函数、有参函数两种。函数的定义方法1、无参函数的定义形式类型标识符函数名(){声明部分语句部分}用类型标识符指定函数值的类型,即函数应该带回来的值的类型。无参函数一般不需要带回函数值,因此可以不写类型标识符。2、有参函数的定义形式类型标识符函数名(类型名形式参数1,类型名形式参数2,……){声明部分语句部分}如果在定义函数时不指定函数类型,系统会隐含指定函数类型为int型。例:doubleadd(doublea,doubleb){doubles;s=a+b;returns;}注:函数体中,除形参外,用到的其它变量必须在说明部分进行定义。这些变量只在函数被调用时才临时开辟存储单元,退出函数时,开辟的空间全部被释放。3、空函数的一般定义方式类型标识符函数名(){}调用这样的函数时,什么工作也不做,没有任何实际作用。只是先占一个位置,说明此处要调用一个函数。这样做的目的是使程序的结构清楚,可读性好,可扩充性强,对程序结构影响不大。[例]以下叙述中正确的是()A)构成C程序的基本单位是函数B)可以在一个函数中定义另一个函数C)main函数必须放在其他函数之前D)所有被调用的函数一定要在调用之前进行定义答案:A函数的返回值通常,希望通过函数调用使主调函数能得到一个确定的值,这就是函数的返回值。1)函数返回值一般由return语句带回:格式一:return表达式;或return(表达式);利用这种形式的return语句控制函数返回时要带回一个表达式,此表达式的值就是函数的返回值。格式二:return;如此使用return语句时,只起控制流程作用,不带回任何值,故此时函数亦为void型。如果需要从被调用函数带回一个函数值(供主调函数使用),被调用函数中必须包含return语句。如果不需要从被调用函数带回函数值可以不包含return语句。一个函数中可以有一个以上的return语句,执行到哪一个return语句,哪一个语句就起作用。2)函数值的类型应该在定义函数时指定。并且在定义函数时对函数值说明的类型一般应该和return语句中的表达式类型一致。3)如果函数值的类型和return语句中表达式的值不一致,则以函数类型为准。对数值型数据,可以自动进行类型转换。即函数类型决定返回值的类型。4)如果被调用函数中没有return语句,并不带回一个确定的、用户所希望得到的函数值,但实际上,函数并不是不带回值,而只是不带回有用的值,带回的是一个不确定的值。5)为了明确表示“不带回值”,可以用void定义为“无类型”或称(“空类型”)。[例]以下函数值的类型是()func(floata){floats;s+=5*a-1;returns;}A)intB)voidC)floatD)不确定答案:A形式参数与实在参数、参数值的传递1、形式参数与实在参数在调用函数时,大多数情况下,主调函数和被调函数之间有数据传递关系。在定义函数时,函数名后面括号中的变量名称为“形式参数”(简称“形参”),在主调函数中调用一个函数时,函数名后面括号中的参数(可以是一个表达式)称为“实际参数”(简称“实参”)。关于形参和实参的几点说明:1)在定义函数中指定的形参,在未出现函数调用时,它们并不占内存的存储单元。只有在发生函数调用时,函数的形参才分配内存单元;2)实参可以是常量、变量或表达式;3)在被定义的函数中,必须指定形参的类型;4)实参与形参的类型应相同或赋值兼容;5)C语言规定,实参变量对形参变量的数据传递是“值传递”,即单向传递,只由实参传给形参,而不能由形参传回给实参。在内存中,实参单元与形参单元是不同的单元。2、参数值的传递参数值的传递分两种:值传递和传地址。传地址一般是指指针变量作形参,后面章节介绍。[例]有以下函数调用语句:fun(x+y,(a,b),fun(n+k,a,(x,y)));则函数fun的形参个数为_______。答案:3第二节函数的调用

a、调用的一般形式1、函数名(实在参数表);

函数的调用可作为表达式出现在允许表达式出现的任何地方。2、函数名();

这种用法可以仅进行某些操作而没有返回值,这时函数的调用可作用一条独立的语句。b、注意:1.函数必须先定义,后调用,即函数应在main函数之前定义。函数返回值类型为int或char时,被调用函数的定义也可以放在调用位置之后,即在main函数之后定义。例:voidmain(){printf("%d\n",add(2,3));}add(inta,intb){returna+b;}2.函数可以直接或间接的调用自己,称为递归调用3.实在参数个数必须与形式参数个数一致。实参可以是表达式,在类型上应按位置与形参一一对应匹配。如果类型不匹配,C编译程序按赋值兼容的规则进行转换,如形参为double类型,而实参为int类型,这时实参代入形参时,将转为double类型。如果实参与形参类型不赋值兼容,通常程序并不报错,但不会得到正确结果,因此注意实参与形参一定要保证类型匹配。c、函数调用的方式按函数在程序中出现位置分,可以有三种函数调用方式:1)函数语句:把函数调用作为一个语句,这时不要求函数返回值,只要求函数完成一定的操作;2)函数表达式:函数出现在一个表达式中,这种表达式称为函数表达式。这时要求函数返回一个确定的值以参加表达式的运算;3)函数参数:函数调用作为一个函数的实参。函数调用作为函数的参数,实质上也是函数表达式形式调用的一种,因为函数的参数本来就要求是表达式形式。d、对被调用函数的声明和函数原型在一个函数中调用另一个函数(即被调用函数)需要具备的条件:1)被调用函数必须是已经存在的函数(是库函数或用户自定义的函数);2)如果使用库函数,应该在程序开头用#include命令将有关库函数在被调用时所需用到的信息包含到本程序中来;3)如果使用用户自定义的函数,而且该函数与被调用它的函数(即主调函数)在同一个文件中,一般还应该在主调函数中对被调用函数作声明,即向编译系统声明将要调用此函数,并将有关信息通知编译系统。第三节函数的声明上节说过返回值为int或char时,函数可以在调用后定义,如果想即在调用后定义,而且返回值不是int或char的其它类型,应在调用前对函数进行声明。其声明的一般形式如下:类型名函数名(参数类型1,参数类型2,…..)如doubleadd(double,double)函数说明可以是一条独立的语句,如:

doubleadd(double,double);也可以与普通变量一起在定义语句中定义。如:

doublex,y,add(double,double);例:voidmain(){doubleadd(double,double);printf("%f\n",add(2,3));}doubleadd(doublea,doubleb){returna+b;}注意:函数声明的位置当某函数声明在所有函数前部,该函数可以在所有函数中使用。但如果声明在某函数内,那么该函数就只能在该函数中使用,如在main函数中声明,就只能在main中使用该函数。doubleadd(double,double);doublereduce(){returnadd(2,3)-1;}voidmain(){printf("%f\n",add(2,3));printf("%f\n",reduce());}doubleadd(doublea,doubleb){returna+b;}注意:对函数的定义和声明并不是一回事。定义:是指对函数功能的确立,包括指定函数名、函数类型、形参及其类型、函数体等,它是一个完整的、独立的函数单位。声明:声明的作用则是把函数名、函数类型以及形参的类型、个数和顺序通知编译系统,以便在调用该函数时系统按此进行对照检查(例如函数名是否正确,实参与形参的类型和个数是否一致)。第四节函数的数据传递

C语言中,可通过三种方式进行函数的数据传递。

1.实在参数和形式参数之间进行数据传递,是由函数外向函数内传递数据。

2.通过return语句把函数值返回调用函数,是由函数内向函数外传递数据。

3.通过全局变量。注:全局变量指在所有函数前定义的变量。intg_var;add(){g_var=g_var+3;}main(){g_var=2;add();printf("%d\n",g_var);}注意:在C语言中数据只能从实参单向传递给形参,称为值传递方式。也就是说当用简单变量作为实参时,函数中实参对应的形参值发生改变,作为实参的变量不能被改变。:voidmain(){intx=2,y=3,z=0;printf("(1)x=%dy=%dz=%d\n",x,y,z);try(x,y,z);printf("(4)x=%dy=%dz=%d\n",x,y,z);}try(intx,inty,intz){printf("(2)x=%dy=%dz=%d\n",x,y,z);z=x+y;x=x*x;y=y*y;printf("(3)x=%dy=%dz=%d\n",x,y,z);}第五节程序举例例1、编写函数isprime(inta),用来判断自变量a是否为素数。若是素数,函数返回整数1,否则返回0。见示例文件:7-1-1.c#include<stdio.h>intisprime(int);voidmain(){ intx; printf("请输入一个整数给x:"); scanf("%d",&x); if(isprime(x)) {printf("%d是素数\n",x);} else {printf("%d不是素数\n",x);}}intisprime(inta){ inti; for(i=2;i<=a/2;

温馨提示

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

评论

0/150

提交评论