LLH-第4讲 函数(一)

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
main
调用
a
调用
b
调用
c
调用
d
e
f
调用
g
h
h
调用
i
e
g
13
模块与函数 在C语言中,每个模块都是由函数完成的,一个小模 块就是一个函数。 在编写某个函数时,遇到具有相对独立功能的程序段, 都应独立成另一个函数。
函数设计的原则
函数的功能要单一,不要设计多用途的函数 函数的规模要小,尽量控制在50行代码以内 所有函数都是平行的,它们不可嵌套定义,但却可以 嵌套调用;main 函数不能被调用。
C语言程序设计
教 师:梁兰华 邮 箱:406123565@qq.com
1
第5章
函 数
2
函数
[例5.1]用随机函数生成10个-500~500之间的整数,并按増 序排序。 生成10个数据 输出这10个数据 排序 再输出这10个数据

算法:流程
3
#include <stdio.h> #include <stdlib.h> #include <time.h> void CreateRandData( int p[], int n ); void PrintData( int p[], int n ); void sort(int p[], int n);
17
void main( ) { float a, b, c; scanf( “%f,%f”, &a, &b ); c = max( a, b ); printf(“ Max is %f\n”, c ); } int max( float x, float y ) { return ( x > y ? x : y ); }
同一文件情况 #include <stdio.h> int max( int x, int y ); void main( ) { int a, b, c; scanf( “%d,%d”, &a, &b ); c = max( a, b); printf( “Max is %d”, c); } int max( int x, int y ) { return ( x > y ? x : y ); }
wenku.baidu.com
void CreateRandData( int p[], int n ) { int i; srand(time(NULL)); for(i=0;i<n;i++) p[i] = 1000L*rand()/32767-500; } void PrintData( int p[], int n ) { int i; for(i=0;i<n;i++) printf("%6d",p[i]); printf("\n"); }
19
运行情况: 7, 8 Max is 8
语句c = max( a, b )使main函数中的变量a, b与max函数中的 形参变量x, y发生了关联。过程见下图:
实 际 参 数 (main函数中的调用)c = max ( a , b ) ; -----------------------------------------------------------------------------= int max ( int x , int y ) { (max函数的定义) 形 式 参 数 int z; z=(x>y)?x:y; return ( z ); } 函数返回值
8
函数
模块化程序设计 函数的定义和调用 函数的嵌套调用和递归调用 变量的作用域和生存期 指针及指针变量 指针变量作为函数参数

9
模块化程序设计
模块化程序设计思想
模块化程序设计的基本思想是将一个大的复杂的程序按功
能分割成一些小的功能模块。
当开发一个软件系统时,最好的办法是从编写主程序开始,
d = max( a, max(b, c) );
23
函数的定义和调用

函数申明(函数原型)
函数声明的作用 向编译系统提供所使用函数必要的信息,以便编译系统对函数的调 用进行检查。 这些函数基本信息是: 函数名 函数的返回值的类型 函数参数(参数的个数、参数的类型及排列次序)
在一个函数中调用另一个函数,需要具备以下条件: 被调函数必须存在(库函数、用户定义函数)。 调用库函数,应使用预编译命令将调用有关库函数所需的信息包含 到本文件来。 #include < 相应的头文件 >
26

函数申明(说明)
对于复杂的用户模块,常用头文件进行函数和变量的申明 包含用户自定义头文件时,用include "头文件名"的形式 文件sub.c int max( int x, int y ) { return ( x > y ? x : y ); }
文件test.c
#include <stdio.h> #include "sub.h" void main( ) { int a, b, c; scanf( “%d,%d”, &a, &b ); c = max( a, b); printf( “Max is %d”, c); }
4
void main() { int a[10]; CreateRandData( a, 10 ); printf("排序前的10个数据是:\n"); PrintData( a, 10 ); sort(a,10); printf("排序后的10个数据是:\n"); PrintData( a, 10 ); }
16
函数的返回值
函数的返回值是通过函数中的 return 语句获得的;如果函数 没有返回值,可以省略 return 语句,否则必有。 一个函数中可以有多个 return 语句 ,根据不同的情况 返回不同的值。 return 语句后可以是一个表达式。 函数的返回值应属于某一确定的类型,应在函数定义时予以 说明。 在定义函数时,函数值类型应与 return 语句中的 表达式类型一致;否则以函数类型为准,而且对于 数值型数据,可以自动进行类型转换。
文件sub.h
int max( int x, int y );
27
如果函数调用在函数定义之后进行,不需要进行函数说明 #include <stdio.h> int max( int x, int y ) { return ( x > y ? x : y ); } void main( ) { int a, b, c; scanf( “%d,%d”, &a, &b ); c = max( a, b); printf( “Max is %d”, c); }

函数申明方法: 1. 直接复制函数头部,后面加分号。 int max( int x, int y ); 2. 函数形参表只提供参数类型 int max( int, int);
25
不同文件情况 文件test.c #include <stdio.h> int max( int x, int y ); void main( ) { int a, b, c; scanf( “%d,%d”, &a, &b ); c = max( a, b); printf( “Max is %d”, c); } 文件sub.c int max( int x, int y ) { return ( x > y ? x : y ); }
24
函数的定义和调用

调用自定义函数需要函数申明的情况
自定义函数与调用它的函数不在同一源文件中 虽在同一文件中,但被调用函数在主调函数之后定义
类型标识符 函数名(形参类型说名); 如有函数定义: int max( int x, int y ) { return ( x > y ? x : y ); }
5
排序算法:选择排序
第一遍
第二遍
9 8 4 5 0
第一次
8 9 4 5 0
第二次
4 9 8 5 0
4 9 8 5 0
0 9 8 5 4
结果
0 9 8 5 4
第一次
0 8 9 5 4
第二次
0 5 9 8 4
第三次
0 4 9 8 5
结果
第三次 第四次
6
排序算法:选择排序
第三遍 0 4 9 8 5
第一次
14
函数
模块化程序设计 函数的定义和调用 函数的嵌套调用和递归调用 变量的作用域和生存期 指针及指针变量 指针变量作为函数参数

15
函数的定义和调用

函数的定义
返回值类型 函数名( 形参表 ) { 函数体 } int max( int x, int y ) { int z; void PrintStar( ) { z = ( x > y ) ? x : y; printf( “************\n”); return z; } }
22
函数的定义和调用

函数调用的方式
1、函数语句:无函数返回值,仅执行一定的操作。如:
printf(“a=%d, b=%d\n”, a, b );
2、函数表达式:函数调用出现在一个表达式中,要求
其带回一个确定的值。如: c = 2*max( a, b );
3、函数参数:函数调用作为一个函数的实参。如:
第四遍 0 4 8 9 5 0 4 5 9 8
结果
0 4 5 9 8
第一次
0 4 5 8 9
结果
第二次
7
void swap(int *x,int *y) { int t; t=*x; *x=*y; *y=t; } void sort(int p[], int n) { int i,j; for( i=0; i<n-1; i++ ) for( j=i+1; j<n; j++ ) if( p[i] > p[j] ) swap( &p[i], &p[j] ); }
运行情况: 1.5, 2.5 Max is 2.000000
函数没有返回值, 要用void来说明函数的返回值类型。
18
形式参数和实际参数
在定义函数时,函数名后面括弧中的变量称为“形式参数” 在调用函数时,函数名后面括弧中的表达式称为“实际参数” int max( int x, int y ) { return x > y ? x : y; } void main( ) { int a, b, c; scanf( “%d,%d”, &a, &b ); c = max( a+b, a*b ); printf(“Max is %d”, c ); }
11
C程序的构成
C 程 序
源程序文件1
源程序文件i
源程序文件n
预编译命令
函 数 1
函 数 n
说明部分
执行部分(语句)
一个C程序可以由一至若干个函数构成,这些函数既可以放在同一个源 程序文件中,也可以放在若干个源程序文件中,但是不能将一个函数分 开放在不同的源程序文件中。
12
C程序的执行
一个C程序中,有且仅有一个main函数。 main函数是整个C程序的开始,也是结尾。
形参仅仅在函数被调用时才分配存储单元(动态),在函数 调用结束后即释放。
20
实参可以是常量、变量、表达式,但必须有确定的值。 实参与形参的类型应该一致。(类型转换)
C语言规定,实参与形参变量之间的数据传送是单向的“值 传递”,即将实参的值传递给形参,而形参的变化不会反映 到实参(实参与形参占据不同的内存单元)。
在主程序中,将问题作为一个整体考虑,然后找出完成整 个任务的主要步骤,再沿着这条主线将整个问题继续分解 为独立的简单模块,这就是模块化程序设计的主要思想。
10
模块化设计方法
功能分解 自顶向下、逐步求精的过程。 每个功能非常单一,一般不超过50行的程序就能实现。 模块分解的原则 保证模块的相对独立性。 模块的实现细节对外不可见(外部:关心做什么;内 部:关心怎么做)。 设计好模块接口 接口是指罗列出一个模块中所有与外部打交道的函数、 变量等(一般有模块的头文件描述)。 定义好后不要轻易改动。
a x


b y


a x
2 10
b y
3 15
实 参
21
形 参
函数的定义和调用
函数的调用
函数调用的一般形式
函数名(实参列表) 实参与形参个数应相等,类型应一致, 且按顺序对应,一一传递数据。
实参列表中各实参以逗号分隔。
int max( int x, int y ) { return x > y ? x : y; } void main( ) { int a, b, c; scanf( “%d,%d”, &a, &b ); c = max( a, b ); printf(“Max is %d”, c ); }
相关文档
最新文档