C语言模块化程序设计ppt课件.ppt_第1页
C语言模块化程序设计ppt课件.ppt_第2页
C语言模块化程序设计ppt课件.ppt_第3页
C语言模块化程序设计ppt课件.ppt_第4页
C语言模块化程序设计ppt课件.ppt_第5页
已阅读5页,还剩52页未读 继续免费阅读

下载本文档

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

文档简介

第4章模块化程序设计,1,教学目标,理解如何用函数模块构造程序熟悉标准库中常见的函数会定义和调用函数并理解函数调用的机制掌握变量的作用域和存储类别理解并运用递归函数编写程序。,2,4.1模块化程序设计概述4.2函数的声明、定义和调用4.3函数的多级调用4.4变量的作用域和存储类别4.5计算机随机模拟方法4.6编译预处理,3,复杂任务可以分解为若干子任务。重复使用的程序段,将其进行独立设计,使计算机可以重复执行。,4.1模块化程序设计概述,4,1.引例,4.2函数的声明、定义和调用,/*程序名:4_1.cpp*/*功能:计算两个实数中大的值*/#includefloatfmax(floatx,floaty);/*函数说明*/voidmain()floata,b,c;scanf(“%f,%f”,floatfmax(floatx,floaty)/*函数定义*/floatz;z=xy?x:y;returnz;,5,2.函数说明,说明格式为:函数返回值类型函数名(参数表);,#includefloatfmax(floatx,floaty);/*函数说明*/voidmain()floata,b,c;scanf(“%f,%f”,函数说明是一条语句,它指出函数返回值的类型、函数的名称、函数要接收的参数的个数、顺序和类型。如果在一个函数中要调用另外一个函数,则在调用之前要对该函数进行说明。,4.2函数的声明、定义和调用,6,3.函数定义,函数定义的一般形式:函数值类型函数名(形参表)/*函数头*/*函数体*/说明部分执行部分,4.2函数的声明、定义和调用,floatfmax(floatx,floaty)floatz;z=xy?x:y;returnz;,函数头,函数体,7,4.函数调用,函数调用的一般形式为:函数名(实参表);,4.2函数的声明、定义和调用,voidmain()floata,b,c;scanf(“%f,%f”,可用两种方式调用函数:(1)函数的调用可以在允许表达式出现的任何地方。如:c=fmax(a,b);(2)函数调用可以作为一条独立的语句。比如,有函数定义:voidprintstar()printf(“*”);则可以把该函数调用作为一个独立语句,printstar();,8,4.2函数的声明、定义和调用,函数返回值函数返回值的类型是由函数定义或说明中的函数返回类型决定的。如果返回的类型与函数说明的不同,则在返回值时,先作隐含的类型转换,然后再返回。,#includeintfmax(floatx,floaty)returnxy?x:y;voidmain()floatmax;max=fmax(3.5,2.6);printf(“max=%fn”,max);,结果?,9,4.2函数的声明、定义和调用,形参和实参形式参数:定义函数时放在函数名称之后括号中的参数,简称形参。实际参数:调用函数时括号中的参数,简称实参。形参与实参的结合:函数在调用时,将生成实参值的一个副本传递给对应的形参,这个过程称为形参与实参的结合。如果只允许实参向形参传递数据,则被称为“单向传递”。,10,4.2函数的声明、定义和调用,参数传递实例,voidswap(floatx,floaty)floatt;t=x;x=y;y=t;voidmain()floata,b;scanf(“%f,%f”,11,4.2函数的声明、定义和调用,函数的调用过程,voidmain()floata,b,c;scanf(“%f,%f”,floatfmax(floatx,floaty)floatz;z=xy?x:y;returnz;,保存返回地址及当前现场,为形参分配内存并将实参的值传给形参变量,恢复main函数的现场,取得返回地址和返回值,12,4.带自定义函数的程序设计,4.2函数的声明、定义和调用,程序设计思路:(1)定义一个函数isprime(intm)判断m是否为素数,若是素数,函数返回1,否则返回0。intisprime(intm)inti;for(i=2;i=m-1;i+)if(m%i=0)return0;return1;,(2)在主函数中输入一个整数,调用isprime函数,如果函数值为1,则打印是素数,否则打印不是素数。voidmain()intiNumber;printf(请输入一个整数:);scanf(%d,【例4-2】从键盘输入一个整数,判断该整数是否为素数。,13,1.嵌套调用,intmin2(inta,intb)returnab?a:b;intmin3(inta,intb,intc)intx,y;x=min2(a,b);y=min2(t,c);returny;,#includevoidmain()intt1,t2;t1=min2(-2,8);printf(“min=%dn”t1,);t2=min3(-2,8,-6);printf(“min=%dn”,t2);,4.3函数的多级调用,14,4.3函数的多级调用,main函数t1=min2(-2,8);t2=min3(-2,8,-6);,min3函数x=min2(a,b);,min2函数returna=0,4.3函数的多级调用,24,小结:函数分为系统函数和自定义函数。每个函数的都是独立定义的,如果函数定义在后、调用在前,要对函数原型进行说明。除了主函数外,其他函数可以相互调用,如果A调用B,B又调用C,称为嵌套调用,如果直接或间接调用自己,称为递归。,25,练习:函数fun实现计算两个数之差的绝对值,并将差值返回调用函数,请编写fun函数fun(intx,inty),26,第7周作业:1在主函数中输入三角形的的三条边,调用子函数,判断是否能组成三角形,若可以则返回1否则返回0。在主函数中输出判断结果。2编写函数,求两个正整数m和n的最大公约数。m和n作为函数的参数。函数返回运算结果,由主函数输出。4.习题4.2要求:第8周上课前提交,27,(1)程序区:存放用户程序代码,即程序中各个函数的代码。(2)静态存储区:存放程序的全局数据和静态数据。分配在静态存储区中的变量的生命期最长,它们在main函数运行之前就存在了,在程序的整个活动期(从程序开始执行到执行结束)中,这些变量始终占用静态存储区中对应的存储空间,即程序开始执行时分配存储单元,程序执行完毕后释放。(3)动态存储区:存放局部变量。分配在动态存储区中的变量只有在所定义的函数被调用时才分配存储单元,函数结束时就释放。系统对函数调用时的现场保护、返回地址等也占用动态保护区。(4)堆:自由存储区,用于运行程序时动态申请内存。,4.4变量的作用域和存储类别,1.程序在内存中的分布区域,28,局部变量:在块内定义的变量。局部变量作用域:块内定义、块内使用。所谓块内是指一对以为界限的若干个语句,例如函数体、复合语句。而块内使用,是指变量的作用范围仅仅局限在从变量定义处开始、到变量定义所在的那个块结束。如:,4.4变量的作用域和存储类别,2.局部变量及存储类别,局部于main的局部变量,局部于func的局部变量,voidmain()intn=5;printf(“%d”,n);func();voidfunc()intn=8;printf(“%d”,n);,29,形式参数也为局部变量,其作用范围是形式参数所在的整个函数。例如:voidmain()printf(“%d,%d”,x,y);/*error*/voidfunc(intx,inty)/*/,4.4变量的作用域和存储类别,30,局部变量的存储类别:自动变量:用关键字auto(可缺省)加以说明的局部变量。如:autofloatb;或floatb;特点:是短生命期的局部变量,安排在动态存储区,由系统自动分配和释放,用到时分配内存,不用时释放内存,以节省程序执行时的内存资源。局部静态变量:用关键字static加以说明的局部变量。局部静态变量在静态存储区分配空间。如:staticintcount;特点:是长生命期的局部变量。函数执行结束后,分配给该变量的存储区不释放。局部静态变量安排在静态存储区。寄存器变量:用关键字register说明的局部变量为寄存器变量。特点:寄存器变量的值存放在CPU的寄存器中。可以提高程序的执行效率。,4.4变量的作用域和存储类别,31,【例4-10】局部变量存储方式举例,分析下面程序运行结果:/*程序名:4_10.cpp*/*功能:局部变量存储方式示例*/#includeintfun1(int);intfun2(int);voidmain()inti;for(i=2;i5;i+)printf(fun1(%d)=%dt,i,fun1(i);printf(n);for(i=2;i5;i+)printf(fun2(%d)=%dt,i,fun2(i);printf(n);,4.4变量的作用域和存储类别,32,续上页:intfun1(intx)intf=1;return(f*=x);intfun2(intx)staticintf=1;return(f*=x);,4.4变量的作用域和存储类别,程序执行结果为:fun1(2)=2fun1(3)=3fun1(4)=4fun2(2)=2fun2(3)=6fun2(4)=24,33,#includeintfunc(int,int);voidmain()intk=4,m=1,p;p=func(k,m);printf(%d,p);p=func(k,m);printf(%dn,p);intfunc(inta,intb)staticintm,i=2;i+=m+1;m=i+a+b;return(m);,结果:8,17,主函数:,第一次fun函数:,k,m,4,1,m,i,0,2,m,i,8,3,第二次fun函数:,m,i,8,3,m,i,17,12,34,全局部变量:函数外定义的变量。全局变量作用域:全局变量的作用范围是从变量定义处开始到所定义的源文件结束处,即从全局变量定义所在处开始到源文件结束处之间的所有函数都可以访问该变量。如:intn=1;voidmain()printf(“%d”,n);func();printf(“%d”,n);floatm;voidfunc()n=5;m=3;,4.4变量的作用域和存储类别,2.全局部变量及存储类别,35,【例4-11】全局变量的作用域举例,分析下面程序运行结果。#includevoidswap(void);inta,b;/*是两个函数公用的变量*/voidmain()scanf(%d%d,/*使用的变量名a和b全局变量a和b*/,4.4变量的作用域和存储类别,36,局部变量与全局变量同名时的处理:小范围优先【例4-12】分析下面程序运行结果:inti=1;/*变量i定义在所有函数之外,属于全局变量*/voidmain()printf(“主函数中访问的变量i:%dn,i);i=test()+1;printf(“主函数中访问的变量i:%dn,i);inttest()inti;printf(“test中访问的变量i:%dn,i);i=2;printf(“test中访问的变量i:%dn,i);returni;,4.4变量的作用域和存储类别,程序运行结果:主函数中访问的变量i:1test中访问的变量i:28345test中访问的变量i:2主函数中访问的变量i:3,37,全局部变量的存储类别:静态全局变量:使用关键字static定义的全局变量是文件内部的全局变量。特点:只能被定义所在的源文件中的所有函数访问,同一程序的其它源文件中的函数都不能访问该变量。非静态全局变量:使用缺省关键字的全局变量。特点:则该变量不仅能被定义所在的源文件中的所有函数访问,而且组成程序的其它源文件中的所有函数也都能访问该变量。因此,从作用范围看,缺省关键字的全局变量要比使用关键字static的静态全局变量大。关键字extern的作用关键字extern的作用是对要使用的某个尚未定义的全局变量在使用前作变量说明,该全局变量或者是以后会在该源文件中定义的全局变量,或者是在另一个源文件中使用缺省关键字定义的全局变量。,4.4变量的作用域和存储类别,38,【例4-13】全局变量存储方式举例,分析下面程序运行结果:/*程序名:4_13.cpp*/*功能:全局变量存储方式示例*/#includeexterninta;/*对4_13_2.cpp中定义的变量进行说明*/voidfun1();voidfun2();voidmain()fun1();fun2();printf(函数main中的a是%dn,a);,4.4变量的作用域和存储类别,39,/*程序名:4_13_1.cpp*/#includestaticinta;/*只允许文件4_13_1.cpp中函数访问的全局变量*/voidfun1()a=2;printf(函数fun1中的a是%dn,a);/*程序名:4_13_2.cpp*/#includeinta;/*允许其它文件中函数访问的全局变量*/voidfun2()a=4;printf(函数fun2中的a是%dn,a);,4.4变量的作用域和存储类别,40,rand()函数可随机生成0RAND_MAX之间的一个整数。RAND_MAX是头文件中定义的一个符号常量。ANSI规定RAND_MAX的值不小于32767。根据下面公式可以得到所需范围内的随机数:n=a+rand()%b其中a为位移,是所需连续整数范围的第一个数,b是比例因子,是所需连续整数范围的宽度,则希望产生16之间随机数的公式为:face=1+rand()%6,4.5计算机随机模拟方法,1.伪随机数的产生,41,【例4-14】编写一个模拟投掷硬币的程序,模拟20次,统计出正面出现的次数。#include#includevoidmain()inti,face,iCount=0;for(i=1;i99)printf(Compiledforarraygreaterthan99n);#elseprintf(Compiledforsmallarrayn);#endif(2)协调多个头文件,避免一个符号或一个头文件被多次包含。例如,符号NULL在几个不同的头文件中都进行了定义,如果一个源文件包含其中几个头文件,则会出现符号NULL被多次定义的错误,这时需要使用条件编译命令:#ifdefNULL#defineNULL(void)0)#endif,4.6编译预处理,3.条件编译,51,4.7本章小结,函数分为系统函数和自定义函数。每个函数的都是独立定义的,如果函数定义在后、调用在前,要对函数原型进行说明。除了主函数外,其他函数可以相互调用,如果A调用B,B又调用C,称为嵌套调用,如果直接或间接调用自己,称为递归。内存为用户提供的存储空间可以分三类:程序区、静态存储区、动

温馨提示

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

评论

0/150

提交评论