哈尔滨工业大学C语言2014课件 第七章 函数教材
合集下载
第七讲 函数

–函数中可有多个return语句 –若无return语句,遇}时,自动返回调用函数 –若函数类型与return语句中表达式值的类型不一致, 按前者为准,自动转换------函数调用转换 –void型函数
例 函数返回值类型转换
C语言程序设计课件
C 语 言 程 序 设 计 课 件
main() { float a,b; int c; scanf("%f,%f",&a,&b); c=max(a,b); printf("Max is %d\n",c); } max(float x, float y) { float z; z=x>y?x:y; return(z); }
例 指向函数的指针。 设一个函数operate,在调用它的时候,每次实现不同的 功能。输入a和b两个数,第一次调用operate得到a和b中最大 值,第二次得到最小值,第三次得到a与b之和。
main( ) { int max(), min(), sum(), a, b; /* 必须进行函数声明, 否则无法调用 */ printf("Enter two number: "); scanf("%d%d", &a, &b); printf("max="); operate(a, b, max); printf("min="); operate(a, b, min); printf("sum="); operate(a, b, sum); } max(int x, int y) { if(x>y) return(x); else return(y); } min(int x, int y) { if(x<y) return(x); else return(y); } sum(int x, int y) { return(x+y); } operate(int x, int y, int (*fun)()) { printf("%d\n", (*fun)(x, y)); }
例 函数返回值类型转换
C语言程序设计课件
C 语 言 程 序 设 计 课 件
main() { float a,b; int c; scanf("%f,%f",&a,&b); c=max(a,b); printf("Max is %d\n",c); } max(float x, float y) { float z; z=x>y?x:y; return(z); }
例 指向函数的指针。 设一个函数operate,在调用它的时候,每次实现不同的 功能。输入a和b两个数,第一次调用operate得到a和b中最大 值,第二次得到最小值,第三次得到a与b之和。
main( ) { int max(), min(), sum(), a, b; /* 必须进行函数声明, 否则无法调用 */ printf("Enter two number: "); scanf("%d%d", &a, &b); printf("max="); operate(a, b, max); printf("min="); operate(a, b, min); printf("sum="); operate(a, b, sum); } max(int x, int y) { if(x>y) return(x); else return(y); } min(int x, int y) { if(x<y) return(x); else return(y); } sum(int x, int y) { return(x+y); } operate(int x, int y, int (*fun)()) { printf("%d\n", (*fun)(x, y)); }
C语言(函数)ppt课件

} main() { int x=6, y=5, z;
如果x, y是字符型,则自动 进行类型转换,结果正确;
z=max(x, y);
如果x, y是短整型,则自动
printf(“%d”, z); }
进b=y行; 类型转换,结果正确;
a=x;
如果x在或参数y传是递时实数,则自动 进行类型转换,有数据丢失,
• 在被调函数内改变形参的值不会改变主调函数中 实参的值。
• 如果函数不需要修改参数的值,就采用这种调用 方式。
– 引用传递
• 主调把实参“自身”传递给被调函数的形参。 • 在被调函数内改变形参的值将改变主调函数中实
函数
参数传递
i{•ntin实mtaxc参(=ai>n=t和b?aa,形:bi;n参t b)的类型确应如;该果相x, y同是或整赋型,值则兼结容果。正 return c;
在函数调用结束后,形参所 占存储单元被释放。
函数
实参
• 实参 int max(int a, int b)
{ int c=a>=b?a:b; return c;
} main() { int a, b, c;
scanf(“%d%d”, &a, &b);
a b c=max( , );
}
实参是函数调用时主调函数 传送给被调函数的形式参数的 实际值。
void main() {
int
int
int
int a, b, c;
printf(“Input three integers: ");
scanf("%d%d%d", &a, &b, &c);
printf("Maximum is: %d\n", maximum(a, b, c));
C语言程序课件ppt-第7章函数

例7-7读程序,写出运行结果
# include <stdio.h> void swap(float x,float y){
float temp; temp=x;x=y;y=temp; } void main(){ float x=8.5,y=3.7; swap(x,y); printf("x=%.2f y=%.2f\n",x,y); }
哪个return都将结束函数的调用返回主调函数.
如: void swap(float x,float y) {float temp; temp=x;x=y;y=temp; return x; return y;}
(3)return语句中的括号可以省略;return后面的值可以是一 个表达式.
7.2.2函数的返回值
§7.1.1 函数概述
C程序的结构图如图所示:
main
a bc d e f g hh i
e
g
1、一个C程序可以分为若干个函数;
2、每个程序有且只能有一个主函数 (main),其他函数都是子函数;
3、子函数可以相互调用,但主函数 不能被调用;
4、一个源程序由一个或多个函数构 成,一个源程序文件是一个编译单 位;
例7-1函数调用示例
#include <stdio.h> void printstar(){
printf("***************\n"); } void print_message(){
printf (" How do you do?\n"); } void main(){
printstar(); print_message(); printstar(); }
《C语言函数章节》课件

学习如何在函数定义中设 置参数的默认值,方便函 数调用时的灵活性。
局部变量与全局变量
1
局部变量
了解索全局变量的定义和使用方式,以及注意事项。
3
变量的命名规范
学习良好的变量命名规范,提高代码的可读性和维护性。
函数递归
递归原理
数学递归
探索函数在自身内部调用的原理, 以及递归函数的特点。
展示一些数学问题的递归解法, 如阶乘、斐波那契数列等。
递归数据结构
介绍递归数据结构的概念和应用, 如二叉树和链表。
函数指针
指针基础
回顾指针的概念和用法,为后续学习函数指针做准 备。
函数指针的定义
学习如何定义和声明函数指针,以及对函数指针的 操作。
函数库与库函数
1 函数库
介绍函数库的概念和作用,如标准库和第三方库。
函数定义与调用
函数定义
学习如何在C语言中定义一个函数,包括函数名、 参数和返回值。
函数调用
了解如何在代码中调用函数,并传递参数和接收返 回值。
函数参数传递
1 值传递
了解值传递的概念和实现 方式,以及在函数调用时 传递参数的作用。
2 引用传递
探索引用传递的特性和用 法,包括指针和引用的概 念。
3 参数默认值
2 常用库函数
展示一些常用库函数的使用,如字符串操作、文件操作等。
3 自定义库函数
了解如何编写和使用自定义的库函数,提高代码的复用性。
内联函数和宏定义
1
内联函数
探索内联函数的特性和使用场景,以及与普通函数的区别。
2
宏定义
学习宏定义的概念和用法,如宏函数和宏常量。
3
内联函数和宏的对比
比较内联函数和宏定义在使用上的优势和劣势。
局部变量与全局变量
1
局部变量
了解索全局变量的定义和使用方式,以及注意事项。
3
变量的命名规范
学习良好的变量命名规范,提高代码的可读性和维护性。
函数递归
递归原理
数学递归
探索函数在自身内部调用的原理, 以及递归函数的特点。
展示一些数学问题的递归解法, 如阶乘、斐波那契数列等。
递归数据结构
介绍递归数据结构的概念和应用, 如二叉树和链表。
函数指针
指针基础
回顾指针的概念和用法,为后续学习函数指针做准 备。
函数指针的定义
学习如何定义和声明函数指针,以及对函数指针的 操作。
函数库与库函数
1 函数库
介绍函数库的概念和作用,如标准库和第三方库。
函数定义与调用
函数定义
学习如何在C语言中定义一个函数,包括函数名、 参数和返回值。
函数调用
了解如何在代码中调用函数,并传递参数和接收返 回值。
函数参数传递
1 值传递
了解值传递的概念和实现 方式,以及在函数调用时 传递参数的作用。
2 引用传递
探索引用传递的特性和用 法,包括指针和引用的概 念。
3 参数默认值
2 常用库函数
展示一些常用库函数的使用,如字符串操作、文件操作等。
3 自定义库函数
了解如何编写和使用自定义的库函数,提高代码的复用性。
内联函数和宏定义
1
内联函数
探索内联函数的特性和使用场景,以及与普通函数的区别。
2
宏定义
学习宏定义的概念和用法,如宏函数和宏常量。
3
内联函数和宏的对比
比较内联函数和宏定义在使用上的优势和劣势。
《C语言函数》课件

函数的参数传递
函数可以接受参数,用于传递数据给函数内部使 用。
函数的调用
函数通过调用语句来执行,将会转到函数内部执 行相应的代码。
函数的分类
标准库
自定义函数
程序员可以根据需要自行定义函数,以完成特定的 任务。
函数的组成部分
1
函数头
函数头包含函数名和参数列表,用于声明函数的名称和接受的参数。
《C语言函数》PPT课件
C语言函数是学习C语言的基础,本课件将介绍函数的基本概念、分类、组成 部分,以及函数的递归调用、函数指针、库函数的使用等内容。
函数的基本概念
函数的定义
函数是一段完成特定任务的可重复使用的代码块, 通常接受参数并返回值。
函数的返回值
函数可以返回一个值,用于提供计算结果或执行 状态。
编写函数库
将函数编写为库
将一组相关函数封装成库,方便重用。
库的使用方法
使用库函数时,需要包含相关的头文件,并链接 库文件。
错误处理
1
错误处理的概念
程序中可能出现各种错误,需要进行处理,以确保程序正确运行。
2
错误处理的方法
常见的错误处理方法包括返回特定错误码、抛出异常等。
总结
函数的重要性
函数是程序的基本组成单元, 可以将复杂任务分解为更小 的可管理部分。
函数指针
1
函数指针的定义
函数指针是指向函数的指针变量,可以
函数指针的应用
2
用来存储函数的地址。
函数指针可以用来动态地调用不同的函 数,增加代码的灵活性。
库函数的使用
标准库函数的使用
标准库提供了许多常用的函数,可以直接调用来完 成任务。
自定义库函数的使用
C语言程序设计ppt-第7章PPT学习教案

{int x=150,y=250,step, num,i,gdriver,gmode;
printf("input step and number please!\n");
scanf("%d%d",&step,&nu m);
gdriver=DETECT;
initgraph(&gdriver,&gmode, "c:\\tc20"); setcolor(3); setbkcolor(GREEN);
解决方法
初始化前用Turbo C的自动检测显示器硬件函数
void far detectgraph(int far *gdriver, int far *gmode) 完成对适配器的检查, 得到显示器类型号和相应的最高分辨率模式
第6页/共57页
2021/6/19
华中科技大学计算机学院
7
图形模式初始化例子
用于返回到文本方式,但不关闭图形系统
即图形函数所占用的内存不被释放
和setgraphmode交互使用,在图形和文本之间来回切 换。
第8页/共57页
2021/6/19
华中科技大学计算机学院
9
例7.1 一个能独立运行 的简单C图形程序
1.
#include<stdio.h>
2.
#include<graphics.h>
setcolor(3); setbkcolor(GREEN); for(x=x0;x<x1;x++){
y=y0+k*x; putpixel(x,y,RED); } getch(); closegraph(); } 思考:将画线程序改为函数: void myline(int int int int);
printf("input step and number please!\n");
scanf("%d%d",&step,&nu m);
gdriver=DETECT;
initgraph(&gdriver,&gmode, "c:\\tc20"); setcolor(3); setbkcolor(GREEN);
解决方法
初始化前用Turbo C的自动检测显示器硬件函数
void far detectgraph(int far *gdriver, int far *gmode) 完成对适配器的检查, 得到显示器类型号和相应的最高分辨率模式
第6页/共57页
2021/6/19
华中科技大学计算机学院
7
图形模式初始化例子
用于返回到文本方式,但不关闭图形系统
即图形函数所占用的内存不被释放
和setgraphmode交互使用,在图形和文本之间来回切 换。
第8页/共57页
2021/6/19
华中科技大学计算机学院
9
例7.1 一个能独立运行 的简单C图形程序
1.
#include<stdio.h>
2.
#include<graphics.h>
setcolor(3); setbkcolor(GREEN); for(x=x0;x<x1;x++){
y=y0+k*x; putpixel(x,y,RED); } getch(); closegraph(); } 思考:将画线程序改为函数: void myline(int int int int);
C语言程序设计实例教程课件:函数

函数体: • 实际上是一个复合语句。花括号“{}”中包含了各种语句,函数的 功能就是由执行这些语句来实现的。
4.2.1 函数的定义
从函数是否带参数的角度来看,函数可分为无参函数和有参函数 两种。如果函数不带参数,则函数名后的圆括号中为空,但圆括号不 可省略。如果带多个参数,则参数间用逗号间隔。
4.2.1 函数的定义
4.3 函数调用
3. 函数调用过程 一个C程序可以包含多个函数,但必须包含且只能包含
一 个 main() 函 数 。 程 序 的 执 行 从 main() 函 数 开 始 , 到 main()函数结束。程序中的其它函数必须通过main()函数 直接或者间接地调用才能执行。
【例4.3】比较两个数的大小,输出较大值。
分析:定义一个求n!的函数fac,主函数中三次调用fac 函数实现求组合数。 当输入6,2,运行结果如图所示:
4.6 递归调用
如果一个函数在调用的过程中出现直接或者间接地调用 该函数本身,称为函数的递归调用。C语言的特点之一就是 允许使用函数的递归调用。
int fn(int a) { int x,y;
4.2.1 函数的定义
在函数定义中还应注意以下几个问题: ▪ 不论函数的形式参数类型是否相同,必须分别说明参数类型。 如: (float a, float b)不能写成(float a, b) ▪ 函数的定义不允许嵌套。也就是说不允许在一个函数体内再 定义一个函数。下列写法是错误的:
int f1(int x, int y) { int a, b; … int f2(int m) { … } … }
出2!,就必须先求出1!,而根据递归公式可知,1!=1,从而,再反过来 就可以依次求出2!,3!,4!,5!。
4.2.1 函数的定义
从函数是否带参数的角度来看,函数可分为无参函数和有参函数 两种。如果函数不带参数,则函数名后的圆括号中为空,但圆括号不 可省略。如果带多个参数,则参数间用逗号间隔。
4.2.1 函数的定义
4.3 函数调用
3. 函数调用过程 一个C程序可以包含多个函数,但必须包含且只能包含
一 个 main() 函 数 。 程 序 的 执 行 从 main() 函 数 开 始 , 到 main()函数结束。程序中的其它函数必须通过main()函数 直接或者间接地调用才能执行。
【例4.3】比较两个数的大小,输出较大值。
分析:定义一个求n!的函数fac,主函数中三次调用fac 函数实现求组合数。 当输入6,2,运行结果如图所示:
4.6 递归调用
如果一个函数在调用的过程中出现直接或者间接地调用 该函数本身,称为函数的递归调用。C语言的特点之一就是 允许使用函数的递归调用。
int fn(int a) { int x,y;
4.2.1 函数的定义
在函数定义中还应注意以下几个问题: ▪ 不论函数的形式参数类型是否相同,必须分别说明参数类型。 如: (float a, float b)不能写成(float a, b) ▪ 函数的定义不允许嵌套。也就是说不允许在一个函数体内再 定义一个函数。下列写法是错误的:
int f1(int x, int y) { int a, b; … int f2(int m) { … } … }
出2!,就必须先求出1!,而根据递归公式可知,1!=1,从而,再反过来 就可以依次求出2!,3!,4!,5!。
哈工大c语言课件7

者曰:“丞相夙兴夜寐,罚二十以上皆亲览焉 。所啖之食,日不过数升。”懿顾谓诸将曰: “孔明食少事烦,其能久乎?”
–此话音落不久,诸葛亮果然病故于五丈原。
“事无巨细”,“事必躬亲”
–管理学的观点是极其排斥这种做法的,认为
工作必须分工,各司其职
–其中的思想,在程序设计里也适用
2019/7/25
5/78
2019/7/25
19/78
7.3.3函数封装与防御性程序设计
函数封装(Encapsulation)使得外界对函数的影响 仅限于入口参数,而函数对外界的影响仅限于一个 返回值和数组、指针类型的参数
【例7.1】
传入负数实参 会怎样?
2019/7/25
Why?
20/78
防御性程序设计(Defensive Programming)
2019/7/25
35/78
汉诺塔(Hanoi)问题
n=3
A
B
C
A→B,A→C,B→C, A→B,C→A,C→B,A→B
2019/7/25
36/78
汉诺塔(Hanoi)问题
n=3
A
B
n更大些 怎么办?
C
A→B,A→C,B→C, A→B,C→A,C→B,A→B
2019/7/25
37/78
汉诺塔(Hanoi)问题
函数是C语言中模块化编程的最小单位
– 可以把每个函数看作一个模块( Module )
如把编程比做制造一台机器,函数就好比其
零部件
–可将这些“零部件”单独设计、调试、测试好
,用时拿出来装配,再总体调试。
–这些“零部件”可以是自己设计制造/别人设
计制造/现成的标准产品
–此话音落不久,诸葛亮果然病故于五丈原。
“事无巨细”,“事必躬亲”
–管理学的观点是极其排斥这种做法的,认为
工作必须分工,各司其职
–其中的思想,在程序设计里也适用
2019/7/25
5/78
2019/7/25
19/78
7.3.3函数封装与防御性程序设计
函数封装(Encapsulation)使得外界对函数的影响 仅限于入口参数,而函数对外界的影响仅限于一个 返回值和数组、指针类型的参数
【例7.1】
传入负数实参 会怎样?
2019/7/25
Why?
20/78
防御性程序设计(Defensive Programming)
2019/7/25
35/78
汉诺塔(Hanoi)问题
n=3
A
B
C
A→B,A→C,B→C, A→B,C→A,C→B,A→B
2019/7/25
36/78
汉诺塔(Hanoi)问题
n=3
A
B
n更大些 怎么办?
C
A→B,A→C,B→C, A→B,C→A,C→B,A→B
2019/7/25
37/78
汉诺塔(Hanoi)问题
函数是C语言中模块化编程的最小单位
– 可以把每个函数看作一个模块( Module )
如把编程比做制造一台机器,函数就好比其
零部件
–可将这些“零部件”单独设计、调试、测试好
,用时拿出来装配,再总体调试。
–这些“零部件”可以是自己设计制造/别人设
计制造/现成的标准产品
C语言课件第7章 函数

第7章 函 数
本章要点: C语言程序结构和特点 函数的定义 函数的返回值与函数的类型 函数的调用及参数的传递关系 函数的嵌套与递归 全局变量和局部变量的概念 变量的存储类别 学习方法建议: 学习本章内容时,应重点掌握函数的定义和使用方法,学会函数的调 用以及参数的传递关系。要求从阅读程序开始,逐步掌握函数编程的思路, 并仿照例题练习编写程序、上机调试,真正掌握结构化程序的设计。函数 的递归调用是本章的难点。
7.3.2 函数的递归调用
所谓函数的递归调用是指,一个函数在它的函数体内,直接或 间接地调用它自身。递归调用分为直接递归调用和间接递归调 用两种,如图所示。
递归调用的过程可分为如下两个阶段: (1)递推阶段:将原问题不断转化为新问题,逐渐从未知向 已知的方向推测,最终达到已知的条件,即递归结束条件。
7.2.3 对被调用函数的说明和函数原型
对被调用函数进行说明,其一般格式为:
函数类型 函数名(数据类型[ 参数名1][, 数据类型[ 参数名 2]…]); C语言规定,以下两种情况,可以省去对被调用函数的说明: (1)当被调用函数的函数定义出现在调用函数之前时。因为在 调用之前,编译系统已经知道了被调用函数的函数类型、参数个 数、类型和顺序。 (2)如果在所有函数定义之前,在函数外部(例如文件开始处) 预先对各个函数进行了说明,则在调用函数中可缺省对被调用函 数的说明。
3. 空函数的定义 既无参数、函数体又为空的函数。其一般形式为: [函数类型] 函数名() { } 说明: (1)函数类型:用于指定函数带回来的值的类型,可以是任何有效类型。 函数类型可以省略,则系统默认为int型,这时函数返回一个整数值。当函 数无返回值时函数类型一般应写成void,称为无类型或空类型。 (2)参数表:它是一个用逗号分隔的变量说明表,参数表中的参数称为 “形式参数”,简称“形参” 。形参用于主调函数和被调用函数之间进行 数据传递,即当函数被调用时,形参接收实参传过来的值。 参数表的定义形式如下: 类型标识符 形式参数1,类型标识符 形式参数2,…… 例如:float area(float a,float b,float c) (3)可以定义空函数,即形式参数和函数体均为空。调用此函数时,不 做任何工作,只是表明这里需要调用一个函数。
本章要点: C语言程序结构和特点 函数的定义 函数的返回值与函数的类型 函数的调用及参数的传递关系 函数的嵌套与递归 全局变量和局部变量的概念 变量的存储类别 学习方法建议: 学习本章内容时,应重点掌握函数的定义和使用方法,学会函数的调 用以及参数的传递关系。要求从阅读程序开始,逐步掌握函数编程的思路, 并仿照例题练习编写程序、上机调试,真正掌握结构化程序的设计。函数 的递归调用是本章的难点。
7.3.2 函数的递归调用
所谓函数的递归调用是指,一个函数在它的函数体内,直接或 间接地调用它自身。递归调用分为直接递归调用和间接递归调 用两种,如图所示。
递归调用的过程可分为如下两个阶段: (1)递推阶段:将原问题不断转化为新问题,逐渐从未知向 已知的方向推测,最终达到已知的条件,即递归结束条件。
7.2.3 对被调用函数的说明和函数原型
对被调用函数进行说明,其一般格式为:
函数类型 函数名(数据类型[ 参数名1][, 数据类型[ 参数名 2]…]); C语言规定,以下两种情况,可以省去对被调用函数的说明: (1)当被调用函数的函数定义出现在调用函数之前时。因为在 调用之前,编译系统已经知道了被调用函数的函数类型、参数个 数、类型和顺序。 (2)如果在所有函数定义之前,在函数外部(例如文件开始处) 预先对各个函数进行了说明,则在调用函数中可缺省对被调用函 数的说明。
3. 空函数的定义 既无参数、函数体又为空的函数。其一般形式为: [函数类型] 函数名() { } 说明: (1)函数类型:用于指定函数带回来的值的类型,可以是任何有效类型。 函数类型可以省略,则系统默认为int型,这时函数返回一个整数值。当函 数无返回值时函数类型一般应写成void,称为无类型或空类型。 (2)参数表:它是一个用逗号分隔的变量说明表,参数表中的参数称为 “形式参数”,简称“形参” 。形参用于主调函数和被调用函数之间进行 数据传递,即当函数被调用时,形参接收实参传过来的值。 参数表的定义形式如下: 类型标识符 形式参数1,类型标识符 形式参数2,…… 例如:float area(float a,float b,float c) (3)可以定义空函数,即形式参数和函数体均为空。调用此函数时,不 做任何工作,只是表明这里需要调用一个函数。
c07函数

有参函数(现代风格) 例 有参函数(现代风格) 例 空函数 int max(int x, y) dummy( ) { int z; { } z=x>y?x:y; return(z); 函数体为空 }
函数名(形参表) 函数类型 函数名(形参表) 传统风格: 传统风格: 形参类型说明 { 说明部分 语句部分 }
调用函数时的数据传递. 例1 调用函数时的数据传递. #include <stdio.h> 主调函数 void main( ) { int a,b,c; 声明函数 int max(int x,int y) ; scanf("%d%d",&a,&b); c=max(a,b); 实际参数 printf("max=%d\n",c); 被调函数 } int max(int x,int y) /*有参函数 有参函数*/ 有参函数 { int z; z=(x>y)?x:y; 形式参数 return(z);}
#include <stdio.h> <stdio.h> #include float void main() add(float x, float y) void main() float z; { float{add(float,float); /*函数说明 函数说明*/ 函数说明 { float a,b; z=x+y; float a,b,c;int c; float add(); return(z); scanf("%f,%f",&a,&b); scanf("%f,%f",&a,&b); } c=add(a,b); c=max(a,b); 被调函数出现在主调函数 #include <stdio.h> printf("sum is %f",c); is %d\n",c); 之前,不必函数说明 printf("Max 之前, int或char型函数可不作函数说明 或 型函数可不作函数说明 void main() } } 不行) 不行 { float x, float y) /*定义函数 (Borland C++不行) a,b,c; float add(float 定义函数*/ max(float x, float定义函数 y) { float z;scanf("%f,%f",&a,&b); { float z; z=x+y; c=add(a,b); z=x>y?x:y; printf("sum is return(z); return(z); %f",c); } } }
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
提炼出公用任务
信息隐藏(Information Hiding, Parnas, 1972) –设计得当的函数可把具体操作细节对外界隐藏
起来,从而使整个程序结构清楚
–使用函数时,不用知道函数内部是如何运作的
,只按照我们的需要和它的参数形式调用它即可
2020/7/15
6/78
程序设计的艺术
算法设计艺术
}
2020/7/15
函数出口
返回运算的结果
12/78
7.2.2函数的定义 (Function Definition)
参数表里的变量(叫形式参数, Formal Parameter)也是内部变量
类型 函数名(类型 参数1, 类型 参数2, ……)
{ 声明语句序列
函数体的定界符
可执行语句序列 return 表达式;
……
2020/7/15
7/78
7.2 函数(Function)的定义
函数是C语言中模块化编程的最小单位
– 可以把每个函数看作一个模块( Module )
如把编程比做制造一台机器,函数就好比其
零部件
–可将这些“零部件”单独设计、调试、测试好
,用时拿出来装配,再总体调试。
–这些“零部件”可以是自己设计制造/别人设
–函数调用(Founction Call)时提供的表达式
有返回值时 –放到一个数值表达式中 返回值 = 函数名(实参表列);
c = max(a,b);
–作为另一个函数调用的参数
c = max(max(a,b),c);
printf("%d\n", max(a,b));
无返回值时 –函数调用表达式
“自顶向下、逐步求精”的模块化程序设计方 法
2020/7/15
2/78
数学中的函数
y f (x)
因变量
函数名
自变量
程序设计中的函数
程序设计中的函数不局限于计算
–计算类,如打印阶乘表的程序……
–判断推理类,如排序、查找……
2020/7/15
3/78
问题的提出
读多少行的程序能让你不头疼? 假如系统提供的函数printf()由10行代码替 换,那么你编过的程序会成什么样子?
–此话音落不久,诸葛亮果然病故于五丈原。
“事无巨细”,“事必躬亲”
–管理学的观点是极其排斥这种做法的,认为
工作必须分工,各司其职
–其中的思想,在程序设计里也适用
2020/7/15
5/78
7.1分而治之与信息隐藏
分而治之( Divide and Conquer,Wirth, 1971 ) – 函数把较大的任务分解成若干个较小的任务,并
–程序的灵魂
–Donald E. Knuth,
“The Art of Computer Programming”, 清华大学出版社(英),国防工业出版社(中)
结构设计艺术
–程序的肉体 –模块化(Parnas, 1972)
结构化(Structural) 面向对象(Object-Oriented) 面向组件(Component-Oriented) 面向智能体(Agent-Oriented)
2020/7/15
10/78
7.2.1函数的分类
标准库函数
– ANSI/ISO C定义的标准库函数
符合标准的C语言编译器必须提供这些函数 函数的行为也要符合ANSI/ISO C的定义
– 第三方库函数
由其他厂商自行开发的C语言函数库 不在标准范围内,能扩充C语言的功能(图形、网络、数据 库等)
自定义函数
第7章 函数
哈尔滨工业大学 计算机科学与技术学院
苏小红 sxh@
本章学习内容
函数定义、函数调用、函数原型、函数的参数 传递与返回值
递归函数和函数的递归调用
函数封装,函数复用,函数设计的基本原则, 程序的健壮性
变量的作用域与存储类型,全局变量、自动变 量、静态变量、寄存器变量
long result = 1;
for (i=2; i<=n; i++)
{ result *= i;
}
返回值作为函数 调用表达式的值
return result;
}
2020/7/15
15/78
7.3向函数传递值和从函数返回值
函数名(表达式1, 表达式2, ……);
实际参数(Actual Argument )
计制造/现成的标准产品
Larry
Curly
Moe
2020/7/15
8/78
7.2 函数(Function)的定义
若干相关的函数可以合并成一个“模块” 一个C程序由一个或多个源程序文件组成 一个源程序文件由一个或多个函数组成
2020/7/15
9/78
7.2.1函数的分类
函数生来都是平等的,互相独立的,没有 高低贵贱和从属之分 – main()稍微特殊一点点 – C程序的执行从main函数开始 – 调用其他函数后流程回到main函数 – 在main函数中结束整个程序运行
–自己定义的函数
包装后,也可成为函数库,供别人使用
2020/7/15
11/78
7.2.2函数的定义 (Function Definition)
返回值 类型
函数名标识符, 说明运算规则
参数表相当于 运算的操作数
类型 函数名(类型 参数1, 类型 参数2, ……)
{ 声明语句序列
可执行语句序列 return 表达式;
}
函数体
2020/7/15
13/78
7.2.2函数的定义 (Function Definition)
函数无返回值,用 void定义返回值类型
用void定义参数 ,表示没有参数
void 函数名(void)
{ 声明语句序列
可执行语句序列
return; }
return语句后无
需任何表达式
2020/7/15
14/78
【例7.1a】 计算整数n的阶乘n!
/* 函数功能: 用迭代法计算n!
返回值函数类入型口参数:函整数型名变量说n明表示阶乘的形阶参数表,函
函数返回值: 函返数回的n!功的能值
数入口
*/
long Fact(int n) /* 函数定义 *函/ 数内部可以定义
{
只能自己使用的变
int i;
量,称内部变量
– 实际上一个printf()有上千行代码 main()中能放多少行代码? 如果所有代码都在main()中,怎么团队合作? 如果代码都在一个文件中,怎么团队合作?
2020/7/15
4/78
问题的提出
《三国演义》中有这样一段描写:
–懿问曰:“孔明寝食及事之烦简若何?”使
者曰:“丞相夙兴夜寐,罚二十以上皆亲览焉 。所啖之食,日不过数升。”懿顾谓诸将曰: “孔明食少事烦,其能久乎?”
信息隐藏(Information Hiding, Parnas, 1972) –设计得当的函数可把具体操作细节对外界隐藏
起来,从而使整个程序结构清楚
–使用函数时,不用知道函数内部是如何运作的
,只按照我们的需要和它的参数形式调用它即可
2020/7/15
6/78
程序设计的艺术
算法设计艺术
}
2020/7/15
函数出口
返回运算的结果
12/78
7.2.2函数的定义 (Function Definition)
参数表里的变量(叫形式参数, Formal Parameter)也是内部变量
类型 函数名(类型 参数1, 类型 参数2, ……)
{ 声明语句序列
函数体的定界符
可执行语句序列 return 表达式;
……
2020/7/15
7/78
7.2 函数(Function)的定义
函数是C语言中模块化编程的最小单位
– 可以把每个函数看作一个模块( Module )
如把编程比做制造一台机器,函数就好比其
零部件
–可将这些“零部件”单独设计、调试、测试好
,用时拿出来装配,再总体调试。
–这些“零部件”可以是自己设计制造/别人设
–函数调用(Founction Call)时提供的表达式
有返回值时 –放到一个数值表达式中 返回值 = 函数名(实参表列);
c = max(a,b);
–作为另一个函数调用的参数
c = max(max(a,b),c);
printf("%d\n", max(a,b));
无返回值时 –函数调用表达式
“自顶向下、逐步求精”的模块化程序设计方 法
2020/7/15
2/78
数学中的函数
y f (x)
因变量
函数名
自变量
程序设计中的函数
程序设计中的函数不局限于计算
–计算类,如打印阶乘表的程序……
–判断推理类,如排序、查找……
2020/7/15
3/78
问题的提出
读多少行的程序能让你不头疼? 假如系统提供的函数printf()由10行代码替 换,那么你编过的程序会成什么样子?
–此话音落不久,诸葛亮果然病故于五丈原。
“事无巨细”,“事必躬亲”
–管理学的观点是极其排斥这种做法的,认为
工作必须分工,各司其职
–其中的思想,在程序设计里也适用
2020/7/15
5/78
7.1分而治之与信息隐藏
分而治之( Divide and Conquer,Wirth, 1971 ) – 函数把较大的任务分解成若干个较小的任务,并
–程序的灵魂
–Donald E. Knuth,
“The Art of Computer Programming”, 清华大学出版社(英),国防工业出版社(中)
结构设计艺术
–程序的肉体 –模块化(Parnas, 1972)
结构化(Structural) 面向对象(Object-Oriented) 面向组件(Component-Oriented) 面向智能体(Agent-Oriented)
2020/7/15
10/78
7.2.1函数的分类
标准库函数
– ANSI/ISO C定义的标准库函数
符合标准的C语言编译器必须提供这些函数 函数的行为也要符合ANSI/ISO C的定义
– 第三方库函数
由其他厂商自行开发的C语言函数库 不在标准范围内,能扩充C语言的功能(图形、网络、数据 库等)
自定义函数
第7章 函数
哈尔滨工业大学 计算机科学与技术学院
苏小红 sxh@
本章学习内容
函数定义、函数调用、函数原型、函数的参数 传递与返回值
递归函数和函数的递归调用
函数封装,函数复用,函数设计的基本原则, 程序的健壮性
变量的作用域与存储类型,全局变量、自动变 量、静态变量、寄存器变量
long result = 1;
for (i=2; i<=n; i++)
{ result *= i;
}
返回值作为函数 调用表达式的值
return result;
}
2020/7/15
15/78
7.3向函数传递值和从函数返回值
函数名(表达式1, 表达式2, ……);
实际参数(Actual Argument )
计制造/现成的标准产品
Larry
Curly
Moe
2020/7/15
8/78
7.2 函数(Function)的定义
若干相关的函数可以合并成一个“模块” 一个C程序由一个或多个源程序文件组成 一个源程序文件由一个或多个函数组成
2020/7/15
9/78
7.2.1函数的分类
函数生来都是平等的,互相独立的,没有 高低贵贱和从属之分 – main()稍微特殊一点点 – C程序的执行从main函数开始 – 调用其他函数后流程回到main函数 – 在main函数中结束整个程序运行
–自己定义的函数
包装后,也可成为函数库,供别人使用
2020/7/15
11/78
7.2.2函数的定义 (Function Definition)
返回值 类型
函数名标识符, 说明运算规则
参数表相当于 运算的操作数
类型 函数名(类型 参数1, 类型 参数2, ……)
{ 声明语句序列
可执行语句序列 return 表达式;
}
函数体
2020/7/15
13/78
7.2.2函数的定义 (Function Definition)
函数无返回值,用 void定义返回值类型
用void定义参数 ,表示没有参数
void 函数名(void)
{ 声明语句序列
可执行语句序列
return; }
return语句后无
需任何表达式
2020/7/15
14/78
【例7.1a】 计算整数n的阶乘n!
/* 函数功能: 用迭代法计算n!
返回值函数类入型口参数:函整数型名变量说n明表示阶乘的形阶参数表,函
函数返回值: 函返数回的n!功的能值
数入口
*/
long Fact(int n) /* 函数定义 *函/ 数内部可以定义
{
只能自己使用的变
int i;
量,称内部变量
– 实际上一个printf()有上千行代码 main()中能放多少行代码? 如果所有代码都在main()中,怎么团队合作? 如果代码都在一个文件中,怎么团队合作?
2020/7/15
4/78
问题的提出
《三国演义》中有这样一段描写:
–懿问曰:“孔明寝食及事之烦简若何?”使
者曰:“丞相夙兴夜寐,罚二十以上皆亲览焉 。所啖之食,日不过数升。”懿顾谓诸将曰: “孔明食少事烦,其能久乎?”