《C语言模块化程序设计.ppt》由会员分享,可在线阅读,更多相关《C语言模块化程序设计.ppt(57页珍藏版)》请在优知文库上搜索。
1、1第第4章章 模块化程序设计模块化程序设计2教学目标教学目标 理解如何用函数模块构造程序理解如何用函数模块构造程序 熟悉标准库中常见的函数熟悉标准库中常见的函数 会定义和调用函数并理解函数调用的机制会定义和调用函数并理解函数调用的机制 掌握变量的作用域和存储类别掌握变量的作用域和存储类别 理解并运用递归函数编写程序。理解并运用递归函数编写程序。 34.1 模块化程序设计概述模块化程序设计概述 4.2 函数的声明、定义和调用函数的声明、定义和调用 4.3 函数的多级调用函数的多级调用 4.4 变量的作用域和存储类别变量的作用域和存储类别 4.5 计算机随机模拟方法计算机随机模拟方法 4.6 编译
2、预处理编译预处理 4 复杂任务可以分解为若干子任务。复杂任务可以分解为若干子任务。 重复使用的程序段,将其进行独立设计,使计算机可以重重复使用的程序段,将其进行独立设计,使计算机可以重复执行。复执行。 4.1 模块化程序设计概述模块化程序设计概述main( )func1()func2()func3()func4()func5()func6()图图4-1 程序模块结构图程序模块结构图51. 引例引例 4.2 函数的声明、定义和调用函数的声明、定义和调用 /*程序名:程序名:4_1.cpp*/*功能:计算两个实数中大的值功能:计算两个实数中大的值*/#include float fmax(floa
3、t x , float y); /*函数说明函数说明*/void main() float a , b , c; scanf( “%f,%f”, &a , &b ); c = fmax(a , b); /*函数调用函数调用*/ printf( “max=%fn”, c ); float fmax(float x , float y) /*函数定义函数定义*/ float z; z = x y ? x : y; return z;62.函数说明函数说明 说明格式为:说明格式为: 函数返回值类型函数返回值类型 函数名函数名( (参数表参数表) ); #include float fmax(floa
4、t x , float y); /*函数说明函数说明*/void main() float a , b , c; scanf( “%f,%f”, &a , &b ); c = fmax(a , b); printf( “max=%fn”, c ); 函数说明是一条语句函数说明是一条语句,它指它指出函数返回值的类型、函出函数返回值的类型、函数的名称、函数要接收的数的名称、函数要接收的参数的个数、顺序和类型。参数的个数、顺序和类型。 如果在一个函数中要调用如果在一个函数中要调用另外一个函数,则在调用另外一个函数,则在调用之前要对该函数进行说明。之前要对该函数进行说明。4.2 函数的声明、定义和调用
5、函数的声明、定义和调用 73.函数定义函数定义 函数定义的一般形式:函数定义的一般形式: 函数值类型函数值类型 函数名函数名( (形参表形参表) /) /* *函数头函数头* */ / / /* *函数体函数体* */ / 说明部分说明部分 执行部分执行部分 4.2 函数的声明、定义和调用函数的声明、定义和调用 float fmax(float x , float y) float z; z = x y ? x : y; return z;函数头函数头函数体函数体84.函数调用函数调用 函数调用的一般形式为函数调用的一般形式为: 函数名(实参表)函数名(实参表); ; 4.2 函数的声明、定义
6、和调用函数的声明、定义和调用 void main() float a , b , c; scanf( “%f,%f”, &a , &b ); c = fmax(a , b); printf( “max=%fn”, c ); 可用两种方式调用函数:可用两种方式调用函数:(1) 函数的调用可以在允许表函数的调用可以在允许表达式出现的任何地方。如:达式出现的任何地方。如: c=fmax( a , b );(2) 函数调用可以作为一条独函数调用可以作为一条独立的语句。比如,有函数定义:立的语句。比如,有函数定义:void printstar( ) printf(“*”);则可以把该函数调用作为一个则可
7、以把该函数调用作为一个独立语句,独立语句, printstar();94.2 函数的声明、定义和调用函数的声明、定义和调用 函数返回值函数返回值 函数返回值的类型是由函函数返回值的类型是由函数定义或说明中的函数返数定义或说明中的函数返回类型决定的。如果返回回类型决定的。如果返回的类型与函数说明的不同,的类型与函数说明的不同,则在返回值时,先作隐含则在返回值时,先作隐含的类型转换,然后再返回。的类型转换,然后再返回。 #include int fmax(float x , float y) return x y ? x : y;void main() float max; max = fmax(
8、3.5 , 2.6); printf( “max=%fn” , max); 结果结果?104.2 函数的声明、定义和调用函数的声明、定义和调用 形参和实参形参和实参 形式参数:定义函数时放在函数名称之后括号中的参形式参数:定义函数时放在函数名称之后括号中的参数,简称形参。数,简称形参。实际参数:调用函数时括号中的参数,简称实参。实际参数:调用函数时括号中的参数,简称实参。形参与实参的结合:函数在调用时,将生成实参值的形参与实参的结合:函数在调用时,将生成实参值的一个副本传递给对应的形参,这个过程称为形参与实一个副本传递给对应的形参,这个过程称为形参与实参的结合。如果只允许实参向形参传递数据,则
9、被称参的结合。如果只允许实参向形参传递数据,则被称为为“单向传递单向传递”。 114.2 函数的声明、定义和调用函数的声明、定义和调用 参数传递实例参数传递实例 void swap(float x , float y) float t; t=x; x=y; y=t;void main() float a , b; scanf( “%f,%f”, &a , &b ); swap(a,b); printf( “%f,%fn”, a,b);3.53.52.62.6实参实参a实参实参b形参形参x形参形参y图图4-2 实参和形参数据的传递实参和形参数据的传递124.2 函数的声明、定义和调用函数的声明、
10、定义和调用 函数的调用过程函数的调用过程 void main() float a , b , c; scanf( “%f,%f”, &a , &b ); c = fmax(a , b); printf( “max=%fn”, c);float fmax(float x , float y) float z; z = x y ? x : y; return z;保存返回地址及当前现场,保存返回地址及当前现场,为形参分配内存并将实参为形参分配内存并将实参的值传给形参变量的值传给形参变量恢复恢复main函数的函数的现场,取得返回现场,取得返回地址和返回值地址和返回值134.带自定义函数的程序设计带自
11、定义函数的程序设计 4.2 函数的声明、定义和调用函数的声明、定义和调用 程序设计思路:程序设计思路:(1)定义一个函数定义一个函数isprime(int m)判断)判断m是否为是否为素数,若是素数,函数素数,若是素数,函数返回返回1,否则返回,否则返回0。int isprime(int m) int i; for(i=2;i=m-1; i+) if (m % i = 0) return 0; return 1;(2)在主函数中输入一个整数,调用在主函数中输入一个整数,调用isprime函数,如果函数值为函数,如果函数值为1,则,则打印是素数,否则打印不是素数。打印是素数,否则打印不是素数。v
12、oid main() int iNumber; printf (请输入一个整数:请输入一个整数:); scanf (%d , &iNumber); if (isprime (iNumber) ) printf (%d是素数是素数 , iNumber); else printf (%d不是素数不是素数 , iNumber);【例例4-2】从键盘输入一个整数,判断该整数是否为素数。从键盘输入一个整数,判断该整数是否为素数。141.嵌套调用嵌套调用int min2(int a,int b) return ab?a:b; int min3(int a,int b,int c) int x,y; x=m
13、in2(a,b); y=min2(t,c); return y;#includevoid main() int t1,t2; t1=min2(-2,8); printf(“min=%dn”t1,); t2=min3(-2,8,-6); printf(“min=%dn”,t2);4.3 函数的多级调用函数的多级调用154.3 函数的多级调用函数的多级调用main函数函数t1=min2(-2,8);t2=min3(-2,8,-6);min3函数函数x=min2(a,b);min2函数函数return a=0 & x = 9) printf(%dn , x); else printf(%d , x
14、% 10); invertLongInt(x / 10);4.3 函数的多级调用函数的多级调用25 小结:小结:函数分为系统函数和自定义函数。函数分为系统函数和自定义函数。每个函数的都是每个函数的都是独立定义独立定义的,如果函数定义在后、的,如果函数定义在后、调用在前,要对函数原型进行说明。调用在前,要对函数原型进行说明。除了主函数外,其他函数可以相互调用,如果除了主函数外,其他函数可以相互调用,如果A调用调用B,B又调用又调用C,称为嵌套调用,如果直接或,称为嵌套调用,如果直接或间接调用自己,称为递归。间接调用自己,称为递归。26 练习:练习:函数函数fun实现计算两个数之差的绝对值,并实现
15、计算两个数之差的绝对值,并将差值返回调用函数,请编写将差值返回调用函数,请编写fun函数函数 fun(int x, int y)27 第第7周作业:周作业:1在主函数中输入三角形的的三条边,调用子在主函数中输入三角形的的三条边,调用子函数,判断是否能组成三角形,若可以则返回函数,判断是否能组成三角形,若可以则返回1否则返回否则返回0。在主函数中输出判断结果。在主函数中输出判断结果。2编写函数,求两个正整数编写函数,求两个正整数m和和n的最大公约数。的最大公约数。m 和和 n 作为函数的参数。函数返回运算结果,由作为函数的参数。函数返回运算结果,由主函数输出。主函数输出。4. 习题习题4.2 要
16、求要求:第第8周上课前提交周上课前提交28(1) 程序区程序区:存放用户程序代码,即程序中各个函数的代码。:存放用户程序代码,即程序中各个函数的代码。(2) 静态存储区静态存储区:存放程序的全局数据和静态数据。分配在静态:存放程序的全局数据和静态数据。分配在静态存储区中的变量的生命期最长,它们在存储区中的变量的生命期最长,它们在main函数运行之前就函数运行之前就存在了,在程序的整个活动期(从程序开始执行到执行结束)存在了,在程序的整个活动期(从程序开始执行到执行结束)中,这些变量始终占用静态存储区中对应的存储空间,即程中,这些变量始终占用静态存储区中对应的存储空间,即程序开始执行时分配存储单元,程序执行完毕后释放。序开始执行时分配存储单元,程序执行完毕后释放。(3) 动态存储区动态存储区:存放局部变量。分配在动态存储区中的变量只:存放局部变量。分配在动态存储区中的变量只有在所定义的函数被调用时才分配存储单元,函数结束时就有在所定义的函数被调用时才分配存储单元,函数结束时就释放。系统对函数调用时的现场保护、返回地址等也占用动释放。系统对函数调用时的现场保护、返回地址等也占用动态保护区。