《大学c程序设计教程.ppt》由会员分享,可在线阅读,更多相关《大学c程序设计教程.ppt(48页珍藏版)》请在三一办公上搜索。
1、大学C+程序设计教程,西安交通大学计算机教学实验中心http:/,1,第6章 函数,本章目标:掌握C+程序中函数的定义方法和函数调用规则。掌握C+程序中主调函数和被调函数之间进行数据传递的规则掌握函数的返回值和它的类型。掌握内联函数的概念 掌握函数重载的概念,2,授课内容,6.1 函数概述6.2 函数的定义6.3 函数的调用6.4 函数原型6.5 函数间的参数传递6.6 局部变量和全局变量6.7 带有缺省参数的函数调试技术程序设计举例,3,6.1 函数概述,C+语言程序的结构特点是,程序整体由一个或多个称为函数的程序块组成。每个函数都具有各自独立的功能和明显的界面,从而使程序具有清晰的模块结构
2、。,4,在C+语言程序中的若干个函数中必须有一个且只能有一个函数成为主函数。程序的执行总是从主函数开始,主程序的语句执行完,则程序执行结束。在一个函数中可以使用另一个函数的功能,这成为函数调用。C+提供三种类型的函数:main主函数标准库函数用户自定义函数,5,说明:,(1)一个源程序文件由一个或多个函数组成。(2)一个程序由一个或多个源程序文件组成。(3)程序的执行从main函数开始,调用其他函数后流程回到main函数,在main函数中结束整个程序的运行。,6,(4)所有函数都是平行的,即在定义函数时是互相独立的,一个函数并不从属于另一函数,即函数不能嵌套定义,函数间可以互相调用,但不能调用
3、main函数。(5)从用户使用的角度看,函数有两种:标准函数;用户自己定义的函数(6)从函数的形式看,函数分两类:无参函数;有参函数,7,6.2 函数定义,函数的定义就是编写完成函数功能的程序块。函数定义的一般格式:(),8,函数值类型,C+语言函数返回值所具有的数据类型与变量类型相同。当函数返回值是数值时,它可以是带符号或unsigned的char、int、short、long型以及float、double型。当返回值是地址时,函数的数据类型是指针型。当函数没有返回值时,它的类型是void。,9,形式参数,1函数可以带有零个或多个形式参数。2函数的是函数的内部变量。即形式参数的生存期和作用域
4、仅限于函数内部。3形式参数只是被初始化的内部变量,即只有当函数被调用,形式参数才被赋予调用函数传递来的实参数值,10,2函数值类型声明,说明调用该函数后所得到的函数值类型,是通过函数体内部的return语句提供。return语句提供的表达式的值的类型应与函数说明中的函数值类型一致。如果某一函数确实没有返回值,则使用说明符void。例如:void main()这时函数中不能出现有返回值的return语句。,11,3形式参数声明,表示将从主调函数中接收哪些类型的信息例:double grav(double m1,double m2,double distance)形式参数可以在函数体中引用,可以输
5、入、输出、赋值或参与运算 参数说明格式为:,例:int array,int count,12,4.函数间的信息交换,C+语言中可以使用参数在函数之间传递数据。主函数和子函数之间的信息交换是通过参数的结合和return语句来实现的。数据流程是:在主程序中,先给实参赋值通过函数调用,将数据从主函数带到子函数形参带值后,即可进行相应的数据处理如果有结果值,通过return语句带回到主函数,13,参数传递可以分为:1数据复制方式2地址传递方式3利用参数返回结果4利用返回值传递数据5使用全局变量传递数据,14,例6.1 求N的阶乘n!,算法分析:计算公式为:n!=n(n-1)321,且0!=1在子函数中
6、只需一个数据x,故设一个参数n计算结果要返回主函数,故设一个变量resultn的阶乘可在一重循环中实现因阶乘的结果值很大,故设结果变量为长整数,15,例6.1 求N的阶乘n!(续),int fac(int n)int result=1;if(n1)result*=n;n-;return result;,16,6.2 函数的调用,在C+中,除了主函数外,其他任何函数都不能单独作为程序运行。任何函数功能的实现都是通过被主函数直接或间接调用进行的。所谓函数调用,就是使程序转去执行函数体。无参函数的调用格式为:函数名()有参函数的调用格式为:函数名(实参表)其中实际参数简称实参,用来将实际参数的值传递
7、给形参,因此可以是常量、具有值的变量或表达式。,17,6.3 函数的调用(续),调用函数时要考虑到函数本身的参数;调用标准库函数时,要包含相应的头文件输入/输出函数 stdio.h字符串函数 string.h常用数学函数 math.h调用自定义函数时,要定义相应的实参,并给这些实参赋值。实参与形参必须一一对应:“类型一致、位置一致、个数一致”,18,例62 求N的阶乘n!,#includeint fac(int n)void main()int n;coutn;coutn!=fac(n)endl;,19,图6.1 函数调用和返回的过程,20,6.4 函数原型,函数和变量一样,在使用之前要先说明
8、。函数原型可省略的情况:“先定义,后引用”函数原型的一般形式:();,21,6.4 函数间的参数传递,(1)在定义函数中指定的形参,在未出现函数调用时,它们并不占内存中的存储单元。(2)实参可以是常量、变量或表达式,如:fac(3a);(3)在被定义的函数中,必须指定形参的类型(4)实参与形参的类型应相同或赋值兼容。(5)C+有三种调用方式:传值调用、引用调用和地址调用。,22,值调用,值传递在调用时仅将实参的值赋给形参,在函数中对形参值的任何修改都不会影响到实参的值。好处:减少了调用函数与被调用函数之间的数据依赖,增强了函数自身的独立性。缺点:被调用函数向调用函数传递的数据仅有一个返回值,有
9、时显得不够用,23,24,6-4:交换两个变量的值,#include void swap(int x,int y)int tmp;tmp=x;x=y;y=tmp;int main()int a=1,b=2;cout Before exchange:a=a,b=b endl;swap(a,b);cout After exchange:a=a,b=b endl;return 0;,输出 Before exchange:a=1,b=2 After exchange:a=1,b=2,25,引用调用,由于被调用函数向调用函数传递的数据仅有一个返回值,有时显得不够用。引用是一种特殊类型的变量,可以被认为是
10、另一个变量的别名。通过引用名与通过被引用的变量名访问变量的效果是一样的。引用运算符“,26,#include void swap(int,/6-5:交换两个整形变量的值,27,6.5 局部变量和全局变量,根据作用域的不同,可将程序中的变量分为局部变量和全局变量根据生存期的不同,可将程序中的变量分为静态变量和自动变量,28,变量的存储机制与C+的内存布局,操作系统为一个C+程序的运行所分配的内存分为四个区域,程序在内存中的区域所示:,29,局部变量,定义在函数内或块内的变量称为局部变量。局部变量在程序运行到它所在的块时建立在栈中,该块执行完毕局部变量占有的空间即被释放。局部变量在定义时可加修饰词
11、auto,但通常省略。局部变量在定义时若未初始化,其值为随机数。,30,全局变量,全局变量说明于所有函数之外,可以为本源程序文件中位于该全局变量说明之后的所有函数共同使用。全局变量可以在各个函数之间建立数据传输通道,但滥用会破坏程序的模块化结构。如出现同名变量,遵循“地方保护主义”原则。,31,举例:局部变量和全局变量,int x;/说明全局变量int func1(int x)/函数func1()有一个名为x的参数 y=x;.int func2(int y)/函数func2()中说明了一个名为x的局部变量 int x;.void main()/在主函数中为全局变量x赋值.x=0;.,32,自学
12、内容,6.6 带有缺省参数的函数6.7 C+的库函数6.8 变量的存储类别,33,6.6 带有缺省参数的函数,double func(double x,double y,int n=1000);则其参数n带有缺省参数值调用方式:a=func(b,c);a=func(b,c,2000);,34,6.7 C+的库函数,#include#include#include#include#include#include#include,35,6.9 变量的存储类别,存储类型决定了变量的生命期,变量生命期指从获得空间到空间释放之间的时期。存储类型的说明符有四个:auto,register,static和e
13、xtern。前两者称为自动类型,后两者分别为静态和外部类型。auto:前面提到的局部变量都是自动类型。其空间分配于块始,空间释放于块终,且由系统自动进行。自动变量保存在栈中,且是在程序运行过程中获得和释放空间,未初始化时值为随机数。,36,register:为提高程序运行效率,可以将某些变量保存在寄存器中,即说明为寄存器变量,但不提倡使用。static:静态变量。根据被修饰变量的位置不同,分为局部(内部)静态变量和全局(外部)静态变量。所有静态变量均存放在全局数据区,编译时获得存储空间,未初始化时自动全0,且只初始化一次。,37,自动变量和静态变量,静态变量的生存期就是整个程序的运行期。在程序
14、开始运行前就为其分配相应的存储空间,在程序的整个运行期间一直占用,直到结束。自动变量的生存期是说明了自动变量的函数或分程序。它对存储空间的利用是动态的。其初值在每次为自动变量分配存储后都要重新设置。,38,/6-6:静态局部变量的使用,#include int func()static int count=0;return+count;int main()for(int i=0;i10;i+)coutfunc()t;coutendl;return 0;,39,变量的生存期与作用域,40,Developer Studio的跟踪调试功能,Step Into(快捷键:F11):跟踪Step Over
15、(快捷键F10):单步执行Step Out(快捷键:Shift+F11):从函数体内运行到外Run To Cursor(快捷键:Ctrl+F10):从当前位置运行到编辑光标观察窗口(Watch)用于观察指定变量或表达式的值变量窗口(Variables)用于观察断点处或其附近的变量的当前值。调用栈窗口(Call Stack)用于观察调用栈中还未返回的被调用函数列表。,41,调试技术:续,Developer Studio的Debug工具栏,42,程序举例,例6-7 打印100010000之间的回文数。所谓回文数是指其各位数字左右对称的整数,例如12321、789987、1等都是十进制回文数。例6-
16、8 编写一个用于字符串比较的函数mystrcmp()。例6-9 利用高斯消去法解n元一次方程组。例6-10 定义一个结构体矩形Rectangle,根据给出矩形的左上角顶点坐标和一个右下角顶点坐标,计算该矩形的面积。,43,例6-8 编写一个用于字符串比较的函数mystrcmp()。,分析:设计了一个循环,从两个字符串的第一个字符开始比较,直到出现不同的字符,或者有一个字符串已经结束为止。从程序中可以看出,这时如果两个字符串相等,则函数mystrcmp()返回0;如果字符串s1大于字符串s2,则返回一个正数;如果字符串s1小于字符串s2,则函数返回一个负数。,44,例6-8 编写一个用于字符串比
17、较的函数mystrcmp()。,/Example 6-11:比较两个字符串#include int mystrcmp(char s1,char s2)int i=0;while(s1i=s2i,45,例6-10,定义一个结构体矩形Rectangle,根据给出矩形的左上角顶点坐标和一个右下角顶点坐标,计算该矩形的面积。,46,/Example 6-10:计算矩形的面积#include#include struct Rectangleint topleft_x;int topleft_y;int bottomright_x;int bottomright_y;,47,上机练习题,1.编写字符串查找mystrchr()。2.编写字符串反转函数mystrrev()。3.求数组中最大、最小元素的函数。4.使用递归算法编写求斐波那契数列的第n项FEB(n)的函数。5.编写函数isprime(int a)用来判断变量a是否为素数,若是素数,函数返回1,否则返回0。调用该函数找出任意给定的n个整数中的素数。,