220 likes | 313 Views
上讲回顾. 循环的嵌套; 基本算法 --- 穷举,迭代与递推. 本讲要点. 模块化程序设计的思路、方法; 函数定义的一般形式; 函数原型声明的方法; 函数的类型、形参、实参、返回值; 函数调用; 模块化程序设计中程序的执行过程;. 模块化程序设计. 模块化程序设计的思想及方法 在软件工程中,通常采用“自顶向下、分而治之”的方法解决一个大的问题。将大的问题分解成许多小的、单一的问题来处理; 每一个小的模块实现特定的一个功能; 模块化程序设计的特点 各模块相对独立,功能单一,接口简单; 程序结构清晰; 避免程序开发的重复劳动;
E N D
上讲回顾 • 循环的嵌套; • 基本算法---穷举,迭代与递推
本讲要点 • 模块化程序设计的思路、方法; • 函数定义的一般形式; • 函数原型声明的方法; • 函数的类型、形参、实参、返回值; • 函数调用; • 模块化程序设计中程序的执行过程;
模块化程序设计 • 模块化程序设计的思想及方法 • 在软件工程中,通常采用“自顶向下、分而治之”的方法解决一个大的问题。将大的问题分解成许多小的、单一的问题来处理; • 每一个小的模块实现特定的一个功能; • 模块化程序设计的特点 • 各模块相对独立,功能单一,接口简单; • 程序结构清晰; • 避免程序开发的重复劳动; • 程序易于维护,程序功能易于扩充; • 程序设计的复杂性得到了有效控制;
例:水仙花数问题 • 进行简单的模块化,将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); } }
//模块化程序设计 #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( ),其功能是找出水仙花数。
说明 • 一个较大的程序一般应分为若干个模块,每一个模块用来实现一个特定的功能; • 在C中,模块的功能由函数来完成; • 在模块化程序设计中,一个C程序可由一个main()函数和若干个其他函数组成; • 通过模块化程序设计,可以减少重复编写程序段的工作量;
C程序的执行从main函数开始,如果在main函数中调用其他函数,在调用后流程返回到main函数中,在main函数中结束整个程序的运行;C程序的执行从main函数开始,如果在main函数中调用其他函数,在调用后流程返回到main函数中,在main函数中结束整个程序的运行; • 函数的分类 • 从用户的角度,函数分为两种: • 标准函数---库函数,如printf,scanf函数等; • 用户自定义函数,如前面例程中的fun函数。自定义函数一般是为了满足用户的需要而专门编写的; • 从函数的形式,函数分为两种: • 无参函数,函数没有参数。如前面fun( )函数,就是无参函数; • 有参函数,函数有参数;
① 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; //④ }
③函数的定义 • 有参函数的定义 • 类型标识符 函数名(形式参数列表 ) • { • 语句部分; • } • 类型标识符:函数返回值的类型; • 无参函数的定义 • 类型标识符 函数名( ) • { • 语句部分; • } • 类型标识符:函数返回值的类型; • void 表示不需要返回值;
E.g 无参函数定义 • 函数的原型声明,类似于变量的声明,主要起到告知编译系统程序中要用到这么个自定义的函数。 void main( ) { void print_message( ); print_message(); } void print_message( ) { printf(“hello,world\n”); } • 函数的调用 • 函数的定义
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; }
④函数返回值及类型 • 函数的返回值 • 通常,自定义函数被调用以后,都会有一个确定的值,这个值就是函数的返回值; • 函数的返回值通过return语句获得; • 形式如:return a;或者return (a);,通常情况下括号不写; • 函数返回值类型 • 函数返回值类型应在函数定义时指定; • 在定义函数时指定的函数类型应该和return语句中的表达式一致;当不一致时,则以函数类型为准,即函数类型决定返回值类型;
关于形参、实参的说明 • 实参,出现在调用函数中的参数;形参,出现在函数定义中的参数; • 定义在函数中的形参,在未出现函数调用时,它们不占用内存存储单元,只有在发生函数调用时,形参才被分配存储单元,函数调用结束,形参占用的存储单元被释放; • 在函数定义时,必须指定形参的类型;
关于形参、实参的说明(续) • 实参、形参的类型应相同或赋值兼容; • 实参向形参的数据传递是“值传递”,单向传递,只由实参传给形参,而不能由形参传回来给实参。 • 在内存中,实参、形参占用不同的存储单元; • 在函数调用时,主调函数在调用被调函数时,通过参数象被调函数传递数据,一般情况下,执行被调函数时会得到一个函数值,供主调函数使用。
小结 • 模块化程序设计程序的一般结构 编译预处理命令 main( ) { 变量声明; 函数的原型声明; 语句; 函数调用; … } 自定义函数 • 定义函数时,包括以下几个方面: • 函数值类型,函数名,形参及类型,函数体,返回值等
例:求三个数中的最大数 //结构化程序设计的方法 #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); }
分析:求三个数中的最大数,将问题细化: • ①可以先求两个数中的较大数; • ②再求剩下的数与①中两者较大数。 • 从① 、②可以看出都需要求两个数的较大数,所以可以用一个函数来实现其功能; • 函数的功能如下:求出两个数,如a,b中的较大数,并返回; int _max(int a,int b) { return a>b?a:b; }
#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; }
模块化程序设计举例 求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); }
//求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; }
课堂练习编写程序求圆的面积,半径从键盘输入,圆面积用函数的形式实现。课堂练习编写程序求圆的面积,半径从键盘输入,圆面积用函数的形式实现。 #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; }
作业 • P69 3.5 、3.7、 3.8、 3.9 • 认真阅读教材第3章,谭浩强版教材P155~167