C课件(3)

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

高级语言程序设计(一)(CProgramming)第三讲:模块化程序设计(函数)模块化程序设计本章目标了解模块化程序设计思想掌握函数的定义及调用方式掌握函数参数传递方式了解变量存储类型及作用域了解递归函数了解C预处理程序模块化程序设计#includestdio.hmain(){inta,b,sum;scanf(“%d+%d”,&a,&b);sum=a+b;printf(“Sum=%d\n”,sum);}tmainmainmainscanfprintf模块化程序设计问题1:假设有一批圆盘,需要求它们的面积。假设圆周率为3.14,这些圆盘的半径分别为:3.24、2.137、0.865、3.746、12.64、8.421、0.307#includestdio.hmain(){printf(“area=%f\n”,3.24*3.24*3.14);printf(“area=%f\n”,2.137*2.187*3.14);printf(“area=%f\n”,0.865*0.865*3.14);printf(“area=%f\n”,3.746*3.749*3.14);printf(“area=%f\n”,12.04*12.64*3.74);printf(“area=%f\n”,8.421*8.421*3.14);printf(“area=%f\n”,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—编码#includestdio.hdoublearea(doubler){returnr*r*3.14;}intmain(){printf(“area=%f\n”,area(3.24));printf(“area=%f\n”,area(2.137));printf(“area=%f\n”,area(0.865));printf(“area=%f\n”,area(3.746));printf(“area=%f\n”,area(12.04));printf(“area=%f\n”,area(8.421));printf(“area=%f\n”,area(0.307));return0;}函数的调用模块化程序设计函数定义与调用(续)函数调用形式:函数名([实参表])其中实参个数、类型、排列次序应和形参定义时一致。函数通过return语句将值返回给调用函数。它有两种使用形式:1)returnexpr;2)return;注意:使用return语句只能返回一个值。函数调用可以作为单独语句,也可以出现在表达式中模块化程序设计在程序设计中如何划分函数程序中可能有重复出现的相同或相似的计算片段,可以考虑从中抽取出共同的东西,定义为函数。这样可以缩短程序代码,提高程序的可读性和易修改性。程序中具有逻辑独立的片段。这样做主要用于分解程序的复杂性。模块化程序设计#includestdio.hdoublearea(doubler){returnr*r*3.14;}intmain(){printf(“area=%f\n”,area(3.24));printf(“area=%f\n”,area(2.137));printf(“area=%f\n”,area(0.865));printf(“area=%f\n”,area(3.746));printf(“area=%f\n”,area(12.04));printf(“area=%f\n”,area(8.421));printf(“area=%f\n”,area(0.307));return0;}将printf语句也放入函数?#includestdio.hvoidarea(doubler){printf(“area=%f\n”,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;}作为单独语句时不要忘记分号模块化程序设计#includestdio.hintmain(){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=%f\n”,r*r*3.14);}注意:调用函数前必须看到函数定义或函数声明(函数原型)模块化程序设计函数原型说明(prototype)或函数声明:在ANSIC标准中,所有函数调用之前必须要有函数定义或原型说明,函数原型用以说明函数的返回值类型、函数参数类型、个数及次序。函数原型说明有两种形式:直接使用函数的头部(函数头部后加分号)。如,doublearea(doubler);在原型说明中仅给出类型、个数及次序,无形参变量名。如,doublearea(double);注意:函数原型说明的类型、参数类型、个数及次序必须与函数定义时一致,否则会产生错误。模块化程序设计#includestdio.hvoidarea(doubler);intmain(){area(3.24);area(2.137);area(0.865);area(0.307);return0;}voidarea(doubler){printf(“area=%f\n”,r*r*3.14);}不要忘记分号!!!模块化程序设计模块化程序设计将复杂问题分解为简单问题的程序设计方法称为结构化程序设计,其特点为:自顶向下(top-downdesign);逐步细化(stepwiserefinement);模块化(modularprogramming);模块化的好处:功能分解的需要;代码重用;模块化程序设计问题2:已知1980年1月1日是星期二。任意输入一个日期,求这一天是星期几。【输入形式】从键盘输入一行字符串“Y-M-D”,是一个有效的公历日期。其中Y为年(1980≤Y≤3000),M为月,D为天,都不带有前缀0。【输出形式】在屏幕输出结果。输出只有一行,是代表该日星期的字符串。对于星期一至星期日,分别输出Monday、Tuesday、Wednesday、Thursday、Friday、Saturday、Sunday。在行末要输出一个回车符。【输入样例】2004-1-6【输出样例】Tuesday模块化程序设计问题2-分析:•输入:XXXX-XX-XX表示的某一天,年份大于等于1980,小于等于3000,都不带前缀0。已知1980.1.1是星期二。•处理:求某一天是星期几?•输出:表示星期的字符串:Monday……Sunday模块化程序设计问题2-设计(1)求自1980.1.1至该日是多少天?假如是n天。(假如1980.1.1日至1980.1.2日为2天)求该日是星期几?(n+1)%7模块化程序设计问题2-设计(2)求自1980.1.1至该日是多少天?假如输入的是2020.5.8日计算1980~2019年每年有多少天?计算2020.1.1至2020.5.8日有多少天?求上述天数之和。模块化程序设计问题2-设计(3)1980~2019年每年天数?2020.1.1~2020.5.8天数?1980.1.1~1980.12.311981.1.1~1981.12.31…………2018.1.1~2018.12.312019.1.1~2019.12.312020.1.1~2020.5.8求Y年1月1日~Y年M月D日的天数?模块化程序设计问题2-设计(4)求Y年1月1日~Y年M月D日的天数?intdaysofyear(inty,intm,intd)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-总体设计1.输入日期;2.求1980.1.1至该日的天数;3.根据天数求星期;4.打印星期。intalldays(inty,intm,intd)算法:for(i=1980;iy;i++)days+=daysofyear(i,12,31);days+=daysofyear(y,m,d);voidweekday(intdays)算法:week=(days+1)%7;根据week值打印字符串模块化程序设计问题2-主程序#includestdio.hintalldays(inty,intm,intd);voidweekday(intdays);intdaysofyear(inty,intm,intd);intmain(){intyear,month,day,alldays;scanf(%d-%d-%d,&year,&month,&day);alldays=alldays(year,month,day);weekday(alldays);return0;}模块化程序设计本章目标了解模块化程序设计思想掌握函数的定义及调用方式掌握函数参数传递方式了解变量存储类型及作用域了解递归函数了解C预处理程序模块化程序设计问题3.1问题:“某老师给某年级1~4班讲程序设计课,期末考试后,请统计每个班及格和不及格的学生人数。”假设学生成绩从标准输入中输入,首先输入的是班级代号(如1,2,),然后是每个学生的成绩,

1 / 68
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功