1 / 22

上讲回顾

上讲回顾. 循环的嵌套; 基本算法 --- 穷举,迭代与递推. 本讲要点. 模块化程序设计的思路、方法; 函数定义的一般形式; 函数原型声明的方法; 函数的类型、形参、实参、返回值; 函数调用; 模块化程序设计中程序的执行过程;. 模块化程序设计. 模块化程序设计的思想及方法 在软件工程中,通常采用“自顶向下、分而治之”的方法解决一个大的问题。将大的问题分解成许多小的、单一的问题来处理; 每一个小的模块实现特定的一个功能; 模块化程序设计的特点 各模块相对独立,功能单一,接口简单; 程序结构清晰; 避免程序开发的重复劳动;

Download Presentation

上讲回顾

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 上讲回顾 • 循环的嵌套; • 基本算法---穷举,迭代与递推

  2. 本讲要点 • 模块化程序设计的思路、方法; • 函数定义的一般形式; • 函数原型声明的方法; • 函数的类型、形参、实参、返回值; • 函数调用; • 模块化程序设计中程序的执行过程;

  3. 模块化程序设计 • 模块化程序设计的思想及方法 • 在软件工程中,通常采用“自顶向下、分而治之”的方法解决一个大的问题。将大的问题分解成许多小的、单一的问题来处理; • 每一个小的模块实现特定的一个功能; • 模块化程序设计的特点 • 各模块相对独立,功能单一,接口简单; • 程序结构清晰; • 避免程序开发的重复劳动; • 程序易于维护,程序功能易于扩充; • 程序设计的复杂性得到了有效控制;

  4. 例:水仙花数问题 • 进行简单的模块化,将main( )函数改名,从而将其模块化成一个用户自定义函数fun( )。 //结构化程序设计方法 #include<stdio.h> #include<math.h> void main( ) { int i; int a1,a2,a3; for(i=100;i<1000;i++) { a1=i/100; a2=i/10%10; a3=i%10; if(i==pow(a1,3)+pow(a2,3)+pow(a3,3)) printf("%d ",i); } } void fun( ) { int i; int a1,a2,a3; for(i=100;i<1000;i++) { a1=i/100; a2=i/10%10; a3=i%10; if(i==pow(a1,3)+pow(a2,3)+pow(a3,3)) printf("%d ",i); } }

  5. //模块化程序设计 #include<stdio.h> #include<math.h> void main( ) { void fun(); //函数的声明 fun( );//函数调用 } void fun( ) //自定义函数 { int i; int a1,a2,a3; for(i=100;i<1000;i++) { a1=i/100; a2=i/10%10; a3=i%10; if(i==pow(a1,3)+pow(a2,3)+pow(a3,3)) printf("%d ",i); } } ① ② ③ 用户自定义函数fun( ),其功能是找出水仙花数。

  6. 说明 • 一个较大的程序一般应分为若干个模块,每一个模块用来实现一个特定的功能; • 在C中,模块的功能由函数来完成; • 在模块化程序设计中,一个C程序可由一个main()函数和若干个其他函数组成; • 通过模块化程序设计,可以减少重复编写程序段的工作量;

  7. C程序的执行从main函数开始,如果在main函数中调用其他函数,在调用后流程返回到main函数中,在main函数中结束整个程序的运行;C程序的执行从main函数开始,如果在main函数中调用其他函数,在调用后流程返回到main函数中,在main函数中结束整个程序的运行; • 函数的分类 • 从用户的角度,函数分为两种: • 标准函数---库函数,如printf,scanf函数等; • 用户自定义函数,如前面例程中的fun函数。自定义函数一般是为了满足用户的需要而专门编写的; • 从函数的形式,函数分为两种: • 无参函数,函数没有参数。如前面fun( )函数,就是无参函数; • 有参函数,函数有参数;

  8. ① int _sum(int x,int y); • 函数的原型声明:类似与变量的声明,告知编译系统有这么个自定义函数。 • 函数的原型声明,要将函数的类型,函数的名字,形参的类型及个数以及顺序告知编译系统; • 函数原型声明的形式: • 函数类型 函数名(参数1类型,参数2类型,参数3类型…); • 函数类型 函数名(参数1类型 参数1名,参数2类型 参数2名…) • 函数原型声明最简单的方法是将函数定义的第一行加上分号; • 如果被调函数的定义出现在main函数之前,则可以不加自定义函数的原型声明; • ②sum=_sum(a,b); • _sum(a,b) 函数调用 • 函数调用的一般形式 • 函数名();//无参函数 • 函数名(实参列表);//有参函数 • 如果实参个数多于1个,用“,”号隔开;如本例中a,b • 实参和形参个数应相等,类型应匹配; • 实参和形参按顺序对应,一一传递数据; • 如: • main() • {… sum=_sum(a,b); … } • int _sum(int x,int y) • { • int sum1; • sum1=x+y; • return sum1; • } 例:函数调用实例 #include<stdio.h> void main() { int _sum(int x,int y);//① int a,b,sum; scanf("%d,%d",&a,&b); sum=_sum(a,b);//② printf("%d",sum); } int _sum(int x,int y) //③ { int sum1; sum1=x+y; return sum1; //④ }

  9. ③函数的定义 • 有参函数的定义 • 类型标识符 函数名(形式参数列表 ) • { • 语句部分; • } • 类型标识符:函数返回值的类型; • 无参函数的定义 • 类型标识符 函数名( ) • { • 语句部分; • } • 类型标识符:函数返回值的类型; • void 表示不需要返回值;

  10. E.g 无参函数定义 • 函数的原型声明,类似于变量的声明,主要起到告知编译系统程序中要用到这么个自定义的函数。 void main( ) { void print_message( ); print_message(); } void print_message( ) { printf(“hello,world\n”); } • 函数的调用 • 函数的定义

  11. int 函数返回值类型 • max 函数名,函数命名同变量命名,“见名知义” • int x,int y 形式参数,在函数定义时,必须指定形参的类型; • return z or return (z);函数的返回值,通过return语句获得。 e.g. 有参函数定义 int max(int x,int y) { int z; z=x>y?x:y; return z; }

  12. ④函数返回值及类型 • 函数的返回值 • 通常,自定义函数被调用以后,都会有一个确定的值,这个值就是函数的返回值; • 函数的返回值通过return语句获得; • 形式如:return a;或者return (a);,通常情况下括号不写; • 函数返回值类型 • 函数返回值类型应在函数定义时指定; • 在定义函数时指定的函数类型应该和return语句中的表达式一致;当不一致时,则以函数类型为准,即函数类型决定返回值类型;

  13. 关于形参、实参的说明 • 实参,出现在调用函数中的参数;形参,出现在函数定义中的参数; • 定义在函数中的形参,在未出现函数调用时,它们不占用内存存储单元,只有在发生函数调用时,形参才被分配存储单元,函数调用结束,形参占用的存储单元被释放; • 在函数定义时,必须指定形参的类型;

  14. 关于形参、实参的说明(续) • 实参、形参的类型应相同或赋值兼容; • 实参向形参的数据传递是“值传递”,单向传递,只由实参传给形参,而不能由形参传回来给实参。 • 在内存中,实参、形参占用不同的存储单元; • 在函数调用时,主调函数在调用被调函数时,通过参数象被调函数传递数据,一般情况下,执行被调函数时会得到一个函数值,供主调函数使用。

  15. 小结 • 模块化程序设计程序的一般结构 编译预处理命令 main( ) { 变量声明; 函数的原型声明; 语句; 函数调用; … } 自定义函数 • 定义函数时,包括以下几个方面: • 函数值类型,函数名,形参及类型,函数体,返回值等

  16. 例:求三个数中的最大数 //结构化程序设计的方法 #include<stdio.h> void main( ) { int a,b,c,max; scanf(“%d,%d,%d”,&a,&b,&c); if(a>b) max=a; else max=b; if(max<c) max=c; printf(“%d ”,max); }

  17. 分析:求三个数中的最大数,将问题细化: • ①可以先求两个数中的较大数; • ②再求剩下的数与①中两者较大数。 • 从① 、②可以看出都需要求两个数的较大数,所以可以用一个函数来实现其功能; • 函数的功能如下:求出两个数,如a,b中的较大数,并返回; int _max(int a,int b) { return a>b?a:b; }

  18. #include<stdio.h> void main() { int _max(int,int); int x,y,z,max; scanf(“%d,%d,%d”,&x,&y,&z); max=_max(x,y); max=_max(max,z); printf(“%d ”,max); } 后接右 int _max(int a,int b) { return a>b?a:b; }

  19. 模块化程序设计举例 求1+2+3+…+100的和 //将求和模块化成一函数 #include<stdio.h> void main() { int sum(int); int sum2; sum2=sum(100); printf("%d\n",sum2); } int sum(int m) //求1~m和 { int n,sum1=0; for(n=1;n<=m;n++) sum1+=n; return sum1; } //控制结构 #include<stdio.h> void main() { int i,sum=0; for(i=1;i<=100;i++) sum+=i; printf("%d",sum); }

  20. //求1到任意数的和 #include<stdio.h> void main() { int sum(int); int t,sum2; scanf("%d",&t); sum2=sum(t); printf("%d\n",sum2); } int sum(int m) //求1~m的和 { int n,sum1=0; for(n=1;n<=m;n++) sum1+=n; return sum1; }

  21. 课堂练习编写程序求圆的面积,半径从键盘输入,圆面积用函数的形式实现。课堂练习编写程序求圆的面积,半径从键盘输入,圆面积用函数的形式实现。 #include<stdio.h> #define PI 3.14159 void main() { float square(int x); int r; scanf("%d",&r); printf("%.2f",square(r)); } float square(int x) { float s1; s1=PI*x*x; return s1; }

  22. 作业 • P69 3.5 、3.7、 3.8、 3.9 • 认真阅读教材第3章,谭浩强版教材P155~167

More Related