




已阅读5页,还剩63页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
高级语言程序设计(一)(CProgramming),第三讲:模块化程序设计(函数),模块化程序设计,本章目标,了解模块化程序设计思想掌握函数的定义及调用方式掌握函数参数传递方式了解变量存储类型及作用域了解递归函数了解C预处理程序,模块化程序设计,#includemain()inta,b,sum;scanf(“%d+%d”,模块化程序设计,问题1:假设有一批圆盘,需要求它们的面积。假设圆周率为3.14,这些圆盘的半径分别为:3.24、2.137、0.865、3.746、12.64、8.421、0.307,#includemain()printf(“area=%fn”,3.24*3.24*3.14);printf(“area=%fn”,2.137*2.187*3.14);printf(“area=%fn”,0.865*0.865*3.14);printf(“area=%fn”,3.746*3.749*3.14);printf(“area=%fn”,12.04*12.64*3.74);printf(“area=%fn”,8.421*8.421*3.14);printf(“area=%fn”,0.307*0.307*3.14);,能否提供求圆面积的函数呢?,模块化程序设计,定义求圆面积的函数:,函数名传递给函数什么数据:数据类型、数据名称计算完毕后函数返回什么结果函数执行语句,area,(doubler),double,doubleresult;result=r*r*3.14;returnresult;,模块化程序设计,函数定义与调用,在ANSIC标准中,函数定义形式为:类型函数名(参数说明)局部变量定义或说明语句,0个、一个或多个参数,多个参数以逗号,分隔的,称为形参,格式:数据类型参数名,模块化程序设计,函数定义与调用(续),函数名一般是标识符,一个程序只有一个main函数,其它函数名可随意取,当然最好是有助于记忆的名字。局部变量定义或说明可有可无。在ANSIC标准中,函数(返回值)类型不允许省略,即使是返回整型值(int),当函数无返回值时,应其类型说明为void类型。,若需要返回值:return表达式;,若不需要返回值:return;或者没有return语句,模块化程序设计,函数定义与调用(续)*,在C语言中,函数不能嵌套定义。如,下面定义在C语言中是不充许的:f()g(),模块化程序设计,doublearea(doubler)doubleresult;result=r*r*3.14;returnresult;,doublearea(doubler)returnr*r*3.14;,定义求圆面积的函数:,模块化程序设计,问题1编码,#includedoublearea(doubler)returnr*r*3.14;intmain()printf(“area=%fn”,area(3.24);printf(“area=%fn”,area(2.137);printf(“area=%fn”,area(0.865);printf(“area=%fn”,area(3.746);printf(“area=%fn”,area(12.04);printf(“area=%fn”,area(8.421);printf(“area=%fn”,area(0.307);return0;,函数的调用,模块化程序设计,函数定义与调用(续),函数调用形式:函数名(实参表)其中实参个数、类型、排列次序应和形参定义时一致。函数通过return语句将值返回给调用函数。它有两种使用形式:1)returnexpr;2)return;注意:使用return语句只能返回一个值。,函数调用可以作为单独语句,也可以出现在表达式中,模块化程序设计,在程序设计中如何划分函数,程序中可能有重复出现的相同或相似的计算片段,可以考虑从中抽取出共同的东西,定义为函数。这样可以缩短程序代码,提高程序的可读性和易修改性。程序中具有逻辑独立的片段。这样做主要用于分解程序的复杂性。,模块化程序设计,#includedoublearea(doubler)returnr*r*3.14;intmain()printf(“area=%fn”,area(3.24);printf(“area=%fn”,area(2.137);printf(“area=%fn”,area(0.865);printf(“area=%fn”,area(3.746);printf(“area=%fn”,area(12.04);printf(“area=%fn”,area(8.421);printf(“area=%fn”,area(0.307);return0;,#includevoidarea(doubler)printf(“area=%fn”,r*r*3.14);intmain()area(3.24);area(2.137);area(0.865);area(3.746);area(12.04);area(8.421);area(0.307);return0;,作为单独语句时不要忘记分号,模块化程序设计,#includeintmain()area(3.24);area(2.137);area(0.865);area(3.746);area(12.04);area(8.421);area(0.307);return0;voidarea(doubler)printf(“area=%fn”,r*r*3.14);,注意:调用函数前必须看到函数定义或函数声明(函数原型),模块化程序设计,函数原型说明(prototype)或函数声明:,在ANSIC标准中,所有函数调用之前必须要有函数定义或原型说明,函数原型用以说明函数的返回值类型、函数参数类型、个数及次序。函数原型说明有两种形式:直接使用函数的头部(函数头部后加分号)。如,doublearea(doubler);在原型说明中仅给出类型、个数及次序,无形参变量名。如,doublearea(double);注意:函数原型说明的类型、参数类型、个数及次序必须与函数定义时一致,否则会产生错误。,模块化程序设计,#includevoidarea(doubler);intmain()area(3.24);area(2.137);area(0.865);area(0.307);return0;voidarea(doubler)printf(“area=%fn”,r*r*3.14);,不要忘记分号!,模块化程序设计,模块化程序设计,将复杂问题分解为简单问题的程序设计方法称为结构化程序设计,其特点为:自顶向下(top-downdesign);逐步细化(stepwiserefinement);模块化(modularprogramming);模块化的好处:功能分解的需要;代码重用;,模块化程序设计,问题2:已知1980年1月1日是星期二。任意输入一个日期,求这一天是星期几。【输入形式】从键盘输入一行字符串“Y-M-D”,是一个有效的公历日期。其中Y为年(1980Y3000),M为月,D为天,都不带有前缀0。【输出形式】在屏幕输出结果。输出只有一行,是代表该日星期的字符串。对于星期一至星期日,分别输出Monday、Tuesday、Wednesday、Thursday、Friday、Saturday、Sunday。在行末要输出一个回车符。【输入样例】2004-1-6【输出样例】Tuesday,模块化程序设计,问题2分析:,输入:XXXXXXXX表示的某一天,年份大于等于1980,小于等于3000,都不带前缀0。已知1980.1.1是星期二。处理:求某一天是星期几?输出:表示星期的字符串:MondaySunday,模块化程序设计,问题2设计(1),求自1980.1.1至该日是多少天?假如是n天。(假如1980.1.1日至1980.1.2日为2天)求该日是星期几?,(n1)7,模块化程序设计,问题2设计(2),求自1980.1.1至该日是多少天?,假如输入的是2020.5.8日,计算19802019年每年有多少天?计算2020.1.1至2020.5.8日有多少天?求上述天数之和。,模块化程序设计,问题2设计(3),19802019年每年天数?2020.1.12020.5.8天数?,1980.1.11980.12.311981.1.11981.12.312018.1.12018.12.312019.1.12019.12.31,2020.1.12020.5.8,求Y年1月1日Y年M月D日的天数?,模块化程序设计,问题2设计(4),求Y年1月1日Y年M月D日的天数?,intdays=0;12月:days+=30;11月:days+=31;10月:days+=30;9月:days+=31;8月:days+=31;7月:days+=30;6月:days+=31;5月:days+=30;4月:days+=31;3月:days+=28;2月:days+=31;1月:days+=d;,如果m2并且为闰年:days+;,模块化程序设计,问题2设计(5),intdays=0;12月:days+=30;11月:days+=31;10月:days+=30;9月:days+=31;8月:days+=31;7月:days+=30;6月:days+=31;5月:days+=30;4月:days+=31;3月:days+=28;2月:days+=31;1月:days+=d;,switch(m)case12:days+=30;case11:days+=31;case10:days+=30;case9:days+=31;case8:days+=31;case7:days+=30;case6:days+=31;case5:days+=30;case4:days+=31;case3:days+=28;case2:days+=31;case1:days+=d;,模块化程序设计,问题2总体设计,输入日期;求1980.1.1至该日的天数;根据天数求星期;打印星期。,intalldays(inty,intm,intd)算法:for(i=1980;i0)f=f*x;n-;return(f);,doublef;,doublef;,f=1;,模块化程序设计,外部变量,外部变量(globalvariable):在函数外面定义的变量。使用范围为整个程序,即可在程序的所有函数中使用。外部变量(存储空间)在程序执行过程中始终存在。外部变量仅在程序开始运行时初始化一次,并且有隐含初值0。,模块化程序设计,问题3.3,问题:某老师给某年级14班讲程序设计课,期末考试后,请统计每个班及格和不及格的学生人数,同时给出大班(14班)的总人数、不及格人数。问题分析:大班总人数=1班人数+4班人数大班不及格人数=1班不及格人数+4班不及格人数,由函数dealSore()可计算得到每个班的人数及不及格人数,但如何得到14班的总人数及总不及格人数?解决办法之一:使用全局变量,设两个全局变量Alltotal,FailTotal,模块化程序设计,问题3.3:算法设计,修改后函数dealScore算法描述为,1.读入班级代号到ClassID;2.读入一成绩到变量score;3.whilescore值不为-1ifscore不合法结束处理ifscore大于或等于60PassNum加1elseFailNum加1读入下一成绩到变量score;4.输出变量ClassID,PassNum和FailNum值5.Alltotal加上PassNum和FailNum;Failtotal加上FailNum;,模块化程序设计,问题3.3:代码实现,例3_4:#includeintdealScore();intAlltotal=0,Failtotal=0;intmain()inti;for(i=0;i4;i+)dealScore();printf(AllTotal=%d,FailTotal=%d,Alltotal,Failtotal);return0;,intdealScore()intscore;intclassid,passnum,failnum;passnum=failnum=0;scanf(“%d”,外部变量定义,模块化程序设计,外部变量说明(extern),C程序可以分别放在多个文件上,每个文件可作为一个编译单位分别编译。外部变量只需在某个文件上定义一次,其它文件若要引用此变量时,应用extern加以说明。(外部变量定义时不必加extern关键字。在同一文件中,若前面的函数要引用后面定义的外部(在函数之外)变量时,也应在函数里加以extern说明。,模块化程序设计,外部变量说明(extern)(续),例如,对问题3.3的代码实现中,如果外部变量Alltotal和Failtotal不在程序头部定义,则需要extern加以说明。externintAlltotal,Failtotal;intmain()intAlltotal=0,Failtotal=0;intdealScore(),外部变量定义,外部变量说明,模块化程序设计,外部变量说明(extern)(续)*,使用外部变量的原因:解决数据共享;解决函数单独编译的协调;与变量初始化有关;外部变量的值是永久的;外部变量的副作用:使用外部变量的函数独立性差,通常不能使用在其他的程序中。而且,如果多个函数都使用到某个外部变量,一旦出现差错,就很难发现问题是由哪个函数引起的。在程序中的某个部分引起外部变量的错误,很容易误以为是由另一部分引起的。,模块化程序设计,静态变量(static)*,内部静态变量在局部变量前加上static关键字就成为内部静态变量。内部静态变量仍是局部变量,其使用范围仍在定义它的函数内。但该变量采用静态存贮分配(由编译程序在编译时分配,而一般的自动变量和函数形参均采用动态存贮分配,即在运行时分配空间),当函数执行完,返回调用点时,该变量并不撤消,其值将继续保留,若下次再进入该函数时,其值仍存在。外部静态变量在函数外部定义的变量前加上“static”关键字便成了外部静态变量。外部静态变量的使用范围为定义它的文件,即成为该文件的的“私有”(private)变量,其它文件上的函数一律不得直接进行访问,除非通过它所在文件上的各种函数来对它进行操作,这可实现数据隐藏。(在C+中提供进行一步的数据隐藏。),模块化程序设计,静态变量(static)(续)*,例:下列程序打印出什么结果。#includeintf(inti);main()inti;for(i=0;i(B)?(A):(B)于是语句x=max(p+q,r+s);可替换为:x=(p+q)(r+s)?(p+q):(r+s);
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年招标采购从业人员专业技术能力考试(招标采购合同管理中级)测试题库及答案吉安
- 江苏省泰州市招标采购从业人员专业技术能力考试(招标采购合同管理中级)测试题库及答案(2025年)
- 《科里亚的木匣》课件
- 《破阵子》辛弃疾课件
- 2025水果收购合同模板
- 广东省深圳市坪山区2022-2023学年高三下学期高考二模物理考点及答案
- 文员年度工作总结及计划
- 2025外部合作合同协议范文
- 2025短期劳动合同模板:雇佣临时工协议范本
- 洛钼集团季度汇报
- 胸外科围手术期呼吸功能锻炼的意义培训课件
- (新版)海南自由贸易港建设总体方案考试题库(含答案)
- 战现场急救技术教案
- 人教版新教材高中英语选择性必修一全册课文及翻译(中英word)
- 内蒙古电网介绍
- 气力输送计算
- 新北师大版七年级上册数学全册课件
- 公共关系学授课教案
- 河北省城市集中式饮用水水源保护区划分
- 可测试性设计
- 快速跑--弯道跑教案
评论
0/150
提交评论