c语言课件07章
合集下载
C语言上课PPT 第七章

函数的参数分为形参 实参 形参和实参 形参 实参两种,作用是实现数据传送.在调用 函数时,大多数情况下,主调函数和被调用函数之间有数据传递 关系.这就是前面已提到的有参函数.前已提到:在定义函数时 定义函数时 函数名后面括弧中的变量名称为"形式参数"(简称"形参"), 在主调函数中调用一个函数时 调用一个函数时,函数名后面括弧中的参数(可以 调用一个函数时 是一个表达式)称为"实际参数"(简称"实参").形参出现 形参出现 在函数定义中,只能在该函数体内使用.发生函数调用时, 在函数定义中,只能在该函数体内使用.发生函数调用时,调用 复制一份 函数把实参的值复制一份,传送给被调用函数的形参, 函数把实参的值复制一份,传送给被调用函数的形参,从而实现 调用函数向被调用函数的数据传送. 调用函数向被调用函数的数据传送. 【例7.2实例演示】 7.2实例演示 实例演示】
– 1.当被调用函数的函数定义出现在调用函数之前 之前时.因为在调用之 之前 前,编译系统已经知道了被调用函数的函数类型,参数个数,类型和 顺序. – 2.如果在所有函数定义之前,在函数外部(例如文件开始处)预先 对各个函数进行了说明,则在调用函数中可缺省对被调用函数的说明.
C 程 序 设 计
第七章 函数与编译预处理
四,函数的嵌套调用
函数的嵌套调用是指,在执行被调用函数时,被调用函 被调用函 数又调用了其它函数.这与其它语言的子程序嵌套调用 数又调用了其它函数 的情形是类似的
【例7.5演示】 7.5演示 演示】
C 程 序 设 计
第七章 函数与编译预处理
五,函数的递归调用
函数的递归调用是指,一个函数在它的函数体内,直 一个函数在它的函数体内, 一个函数在它的函数体内 自身.C语言允许函数的递归调用. 接或间接地调用它自身 接或间接地调用它自身 在递归调用中,调用函数又是被调用函数,执行递归函 数将反复调用其自身.每调用一次就进入新的一层.为 了防止递归调用无终止地进行,必须在函数内有终止递 归调用的手段.常用的办法是加条件判断,满足某种条 件后就不再作递归调用,然后逐层返回.(出口条件) (出口条件) 【例7.6演示】 7.6演示 演示】
– 1.当被调用函数的函数定义出现在调用函数之前 之前时.因为在调用之 之前 前,编译系统已经知道了被调用函数的函数类型,参数个数,类型和 顺序. – 2.如果在所有函数定义之前,在函数外部(例如文件开始处)预先 对各个函数进行了说明,则在调用函数中可缺省对被调用函数的说明.
C 程 序 设 计
第七章 函数与编译预处理
四,函数的嵌套调用
函数的嵌套调用是指,在执行被调用函数时,被调用函 被调用函 数又调用了其它函数.这与其它语言的子程序嵌套调用 数又调用了其它函数 的情形是类似的
【例7.5演示】 7.5演示 演示】
C 程 序 设 计
第七章 函数与编译预处理
五,函数的递归调用
函数的递归调用是指,一个函数在它的函数体内,直 一个函数在它的函数体内, 一个函数在它的函数体内 自身.C语言允许函数的递归调用. 接或间接地调用它自身 接或间接地调用它自身 在递归调用中,调用函数又是被调用函数,执行递归函 数将反复调用其自身.每调用一次就进入新的一层.为 了防止递归调用无终止地进行,必须在函数内有终止递 归调用的手段.常用的办法是加条件判断,满足某种条 件后就不再作递归调用,然后逐层返回.(出口条件) (出口条件) 【例7.6演示】 7.6演示 演示】
精品课件-C语言程序设计-第7章

第7章 “学生成绩管理系统”中项目整体框架设计
《
C
语 言 程 序
本模块的主要任务是对“班级学生成绩管理系统”这 一项目的整体框架进行设计并进行函数定义。主要掌握函数 的定义和调用方法,能够善于利用函数,减少重复编写程序 段的工作量。学习本模块后应能对“班级学生成绩管理系统”
设 的整体框架结构进行正确的函数设计。
print_star();
\\第二次调用print_star
》
} void print_star()
\\定义print_star
{
printf("********************************\n");
}
代码贴士
(Visual C++ .
6 这个程序中,main()函数两次调用print_star()函数都打印出数目
计
》 知识目标:
(Visual C++ .
➢熟悉模块化设计思想。
➢掌握函数的定义和调用方法。
➢了解局部变量和全局变量的概念及其作用范围。
能力目标:
6 0
➢能够对项目整体框架的函数进行设计。
环
境
)
C
7.1 项目整体框架设计
《
任务目标:能够对“班级学生成绩管理系统”中所涉及到
语 言
的函数进行总体设计。
境 为无参函数和有参函数两种。
)
1)无参函数:函数定义、函数说明及函数调用中均不带参
C
参函数的3、定函义数形的式定义 型标识符 函数名()
{声明部分
《语句 }语 型言标识符和函数名称为函数头。类型标识符指明了本函数的类型,函数的 函程数返回值的类型。 该类型标识符与前面介绍的各种说明符相同。函数名 标内序设计识容符称为,函函数数体名后。有在一函个数空体括中号声明,部其分中无,参是数对,函但数括体号内不部可所少用。到的变量的 很》多情况下都不要求无参函数有返回值,此时函数类型符可以写为void。
《
C
语 言 程 序
本模块的主要任务是对“班级学生成绩管理系统”这 一项目的整体框架进行设计并进行函数定义。主要掌握函数 的定义和调用方法,能够善于利用函数,减少重复编写程序 段的工作量。学习本模块后应能对“班级学生成绩管理系统”
设 的整体框架结构进行正确的函数设计。
print_star();
\\第二次调用print_star
》
} void print_star()
\\定义print_star
{
printf("********************************\n");
}
代码贴士
(Visual C++ .
6 这个程序中,main()函数两次调用print_star()函数都打印出数目
计
》 知识目标:
(Visual C++ .
➢熟悉模块化设计思想。
➢掌握函数的定义和调用方法。
➢了解局部变量和全局变量的概念及其作用范围。
能力目标:
6 0
➢能够对项目整体框架的函数进行设计。
环
境
)
C
7.1 项目整体框架设计
《
任务目标:能够对“班级学生成绩管理系统”中所涉及到
语 言
的函数进行总体设计。
境 为无参函数和有参函数两种。
)
1)无参函数:函数定义、函数说明及函数调用中均不带参
C
参函数的3、定函义数形的式定义 型标识符 函数名()
{声明部分
《语句 }语 型言标识符和函数名称为函数头。类型标识符指明了本函数的类型,函数的 函程数返回值的类型。 该类型标识符与前面介绍的各种说明符相同。函数名 标内序设计识容符称为,函函数数体名后。有在一函个数空体括中号声明,部其分中无,参是数对,函但数括体号内不部可所少用。到的变量的 很》多情况下都不要求无参函数有返回值,此时函数类型符可以写为void。
c语言程序设计第7章(谭浩强)PPT版本

如 int a[5]; static int a[5]={6,2,3}; int a[]={1,2,3,4,5,6}; 等价于: a[0]=6; a[1]=2;a[2]=3; a[3]=0; a[4]=0; 等价于:a[0]=0; a[1]=0; a[2]=0; a[3]=0; a[4]=0; 如 编译系统根据初值个数确定数组维数 int a[3]={6,2,3,5,1}; ()
例
38 49 49 38 65 76 97 13 97 76 97 27 13 30 97 27 97 30 初 始 关 键 字 n=8
38 49 65 13 76 27 76 13 30 76 27 76 30 97 第 一 趟
38 49 13 65 27 65 13 30 65 27 65 30
程序举例
#include <stdio.h> #define SIZE 10 例 读10个整数存入数组,找出其中最大值和最小值 main() { int x[SIZE],i,max,min; printf("Enter 10 integers:\n"); for(i=0;i<SIZE;i++) 步骤: { printf("%d:",i+1); 1. 输入:for循环输入10个整数 scanf("%d",&x[i]); 2. 处理: } (a) 先令max=min=x[0] max=min=x[0]; (b) 依次用x[i]和max,min比较(循环) for(i=1;i<SIZE;i++) 若max<x[i],令max=x[i]{ if(max<x[i]) max=x[i]; 若min>x[i],令min=x[i] if(min>x[i]) min=x[i]; 3. 输出:max和min } printf("Maximum value is %d\n",max); printf("Minimum value is %d\n",min); }
C语言讲义第07章-结构体与其他构造数据类型(原)

atoi(char*str);将数字字符串转换为整型。
atof(char*str);将数字字符串转换为双精度的 实型。 atol(char*str);将数字字串转换长整型。 使用上述函数,要包含头文件"stdlib.h"。
7.1 结构体
• 例7-1类型转换函数在结构体变量数据输 入中的应用示例。定义结构体类型及变 量,输入一个学生的有关信息并输出。 例7-1源程序
7.1 结构体
结构体变量一旦进入其作用域,系统便根据结构体类 型定义时成员排列的先后,自动为结构体变量的每一 个成员分配相应的存储空间。结构体变量的各个成员 均有自己的存储空间,结构体变量所占存储空间的大 小为各成员所占空间之和。 例如:student1 所占空间大小为:8 + 10 + 1+ 4 * 2 = 27(字节)。
例如:指针变量p1,p2指向结构体变量x。
p1 = p2 = &x; 例如:通过结构体指针p1和p2来引用结构体变量x成员。以下三种 方式是等价的。 x.no、、x.score[0] p1->no、p1->name、p1->score[0]
(*p2).no、(*p2).name、(*p2).score[0]
7.2 结构体数组的定义和引用
• 结构体数组的输入与输出一般在循环结构中进行, 一次循环可以输入或输出一条结构体记录。 • 例7-3定义一个结构体数组用于存储和显示三个学 生的基本信息。
例7-3源程序
• 程序运行结果如下:
no. 06030217 06050105 06010116 name zhang san li si wang wu sex m m f age 19 18 18 depart Economy & Commerce engineering Computer science
c语言学习,c语言课件第07章

[演示]
7.2.2 有参数函数的定义形式
函数名(形式参数列表) 类型标识符 函数名(形式参数列表) { 函数体语句 } 例如: 例如: /*求两个数的和 求两个数的和* int sum(int x, int y) /*求两个数的和*/ { int z; z=x+y; z=x+y; (z); return (z); } 有参函数比无参函数多了一个参数表。调用有参函数时, 调用函数将赋予这些参数实际的值。为了与调用函数提供的 实际参数区别开,将函数定义中的参数表称为形式参数表, 简称形参表。
7.3 函数的返回值与函数类型
语言的函数兼有其它语言中的函数和过程两种功能, C 语言的函数兼有其它语言中的函数和过程两种功能 , 从这 个角度看,又可把函数分为有返回值函数和无返回值函数两种。 个角度看,又可把函数分为有返回值函数和无返回值函数两种。 函数返回值与return语句 1.函数返回值与 语句 有参函数的返回值,是通过函数中的return语句来获得的。 return语句来获得的 有参函数的返回值,是通过函数中的return语句来获得的。 return语句的一般格式 语句的一般格式: (1)return语句的一般格式: return ( 返回值表达式 ); return语句的功能 返回调用函数,并将“ 语句的功能: (2)return语句的功能:返回调用函数,并将“返回值表达 的值带给调用函数。 式”的值带给调用函数。 注意: 调用函数中无return 语句, 并不是不返回一个值, return语句 注意 : 调用函数中无 return 语句 , 并不是不返回一个值 , 而 是一个不确定的值。 为了明确表示不返回值 , 可以用“ void”定 是一个不确定的值 。 为了明确表示 不返回值, 可以用 “ void 定 不返回值 义成“ 类型” 义成“无(空)类型”。
c语言程序设计第7章PPT课件

(4)只有left参数是必须的。但是,要指定任 何其他的参数,必须先指定出现在语法中该参数
第13页/共34页
7.3 窗体的常用方法
• 【例7-1】 在窗体上分别用4个命令按钮上、下、左、右移动一个标签。
第14页/共34页
7.3 窗体的常用方法
Private Sub Command1_Click() Label1.Move Label1.Left, Label1.Top - 10 ' 上移
当用户的应用程序在工具条上最小化或
Icon
窗体图标 在Windows桌面上变为一个独立应用程序
时,该属性决定将采用何种图标,窗体
控制框里的图标也由它决定
第7页/共34页
7.2 窗体的常用属性
属性
名称
说明
Left 、 Height Width
To、p 、左顶高 度
边距 边距 度、
、 、 宽
决定窗体在屏幕上的位置及窗体大 小
• 3. MouseMove事件 移动鼠标时触发的事件称为MouseMove事件。语法如下:
Private Sub Form_MouseMove([Index As Integer] Button As Integer, Shif t As Integer, X As Single, Y As Single)
7.3 窗体的常用方法
• 4. Print 方法
• 作用:在指定对象上显示文本。
• 格式:[对象.]Print[{Spc(n)|Tab(n)}][表达式列 表][;|,]
• 说明:
(1)对象:可以是窗体、图形框或打印机,缺省 对象在窗体上输出。
(2)Spc(n)函数:在当前位置插入n个空格,允
第13页/共34页
7.3 窗体的常用方法
• 【例7-1】 在窗体上分别用4个命令按钮上、下、左、右移动一个标签。
第14页/共34页
7.3 窗体的常用方法
Private Sub Command1_Click() Label1.Move Label1.Left, Label1.Top - 10 ' 上移
当用户的应用程序在工具条上最小化或
Icon
窗体图标 在Windows桌面上变为一个独立应用程序
时,该属性决定将采用何种图标,窗体
控制框里的图标也由它决定
第7页/共34页
7.2 窗体的常用属性
属性
名称
说明
Left 、 Height Width
To、p 、左顶高 度
边距 边距 度、
、 、 宽
决定窗体在屏幕上的位置及窗体大 小
• 3. MouseMove事件 移动鼠标时触发的事件称为MouseMove事件。语法如下:
Private Sub Form_MouseMove([Index As Integer] Button As Integer, Shif t As Integer, X As Single, Y As Single)
7.3 窗体的常用方法
• 4. Print 方法
• 作用:在指定对象上显示文本。
• 格式:[对象.]Print[{Spc(n)|Tab(n)}][表达式列 表][;|,]
• 说明:
(1)对象:可以是窗体、图形框或打印机,缺省 对象在窗体上输出。
(2)Spc(n)函数:在当前位置插入n个空格,允
c语言 课件第7章

1
C 语言程序设计
第7章 预处理命令
7.1 编译预处理
2
源文件 *.c *.c
Hale Waihona Puke 目标文件 编译编译 编译 编译 编译 连接 连接 *.obj *.obj
运行文件 *.exe *.exe
编译预处理 编 译
编译预处理包括: 编译预处理包括: 宏定义 文件包含 条件编译
2005年3月
7.1 编译预处理(续) 编译预处理(
2005年3月
7.1 编译预处理(续) 编译预处理(
例如: 例如: #define PI 3.14
main() 替 { float r,s,c; 换 scanf(“%f” scanf(“%f”,&r); 3.14 PI; s = r * r * PI; 3.14 PI; c = 2 * r * PI; printf(“ c=%f” printf(“s=%f, c=%f”,s,c); }
14
2005年3月
7.2 多文件程序的调试方法(续) 多文件程序的调试方法(
2. 使用文件包含命令将多个文件连接成一个 可执行文件的方法 为例, 以例7.5为例,分析文件包含后源程序的情 为例 况。
15
2005年3月
7.2 多文件程序的调试方法(续) 多文件程序的调试方法(
预处理前
file1.c
6
②为了增加程序的可读性,建议宏名用大写字母,其 为了增加程序的可读性,建议宏名用大写字母,
他的标识符用小写字母。 他的标识符用小写字母。 双引号中有与宏名相同的字符串不进行替换。 ③双引号中有与宏名相同的字符串不进行替换。 已经定义的宏名可以被后定义的宏名引用。 ④已经定义的宏名可以被后定义的宏名引用。在预处 理时将层层进行替换。 理时将层层进行替换。
C 语言程序设计
第7章 预处理命令
7.1 编译预处理
2
源文件 *.c *.c
Hale Waihona Puke 目标文件 编译编译 编译 编译 编译 连接 连接 *.obj *.obj
运行文件 *.exe *.exe
编译预处理 编 译
编译预处理包括: 编译预处理包括: 宏定义 文件包含 条件编译
2005年3月
7.1 编译预处理(续) 编译预处理(
2005年3月
7.1 编译预处理(续) 编译预处理(
例如: 例如: #define PI 3.14
main() 替 { float r,s,c; 换 scanf(“%f” scanf(“%f”,&r); 3.14 PI; s = r * r * PI; 3.14 PI; c = 2 * r * PI; printf(“ c=%f” printf(“s=%f, c=%f”,s,c); }
14
2005年3月
7.2 多文件程序的调试方法(续) 多文件程序的调试方法(
2. 使用文件包含命令将多个文件连接成一个 可执行文件的方法 为例, 以例7.5为例,分析文件包含后源程序的情 为例 况。
15
2005年3月
7.2 多文件程序的调试方法(续) 多文件程序的调试方法(
预处理前
file1.c
6
②为了增加程序的可读性,建议宏名用大写字母,其 为了增加程序的可读性,建议宏名用大写字母,
他的标识符用小写字母。 他的标识符用小写字母。 双引号中有与宏名相同的字符串不进行替换。 ③双引号中有与宏名相同的字符串不进行替换。 已经定义的宏名可以被后定义的宏名引用。 ④已经定义的宏名可以被后定义的宏名引用。在预处 理时将层层进行替换。 理时将层层进行替换。
c语言第七章PPT课件

{ float z;
z=x+y;
return (z);
共 71 页 第 21 页
}
第21页/共70页
3. 函数声明和函数定义的区别
函数声明的作用是把函数的名字、函数类型以 及形参的类型、个数和顺序通知编译系统,以便在调 用该函数时系统按此进行对照检查。
函数定义是指对函数功能的确立,包括指定函 数名、函数值类型、形参及其类型、函数体等,它是 一个完整的、独立的函数单位。
[例7-2]
}
形参变量的说明
(现代形式) int max ( x, y)
int max (int x,int y) { int z; z=x>y?x : y; return z; }
int x,y; { int z;
形参变量的说明 (传统形式)
z=x>y?x : y;
return z;
}
共 71 页 第 7 页
用户定义函数: 形式
无参函数 有参函数 空函数
共 71 页 第 2 页
第2页/共70页
函数示例
[7-1] 输入三个整数,计算它们的和并输出运算结果。
main( )
{ int a, b, c, sum ;
scanf("%d,%d,%d",&a,&b,&c);
sum=add(a,b,c); printf(" sum= %d\n",sum); }
}
形参:通知系统 要预留内存位置.
把函数的 结果赋给函数名
实参:在运行时把 值传给函数.
共 71 页 第 14 页
第14页/共70页
数据在函数间的传递
main()
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2005年3月
4
说明
⑴ 一个C源程序可以由一个或多个源程序文件组 成。C编译系统在对C源程序进行编译时是以文件 为单位进行的。 ⑵ 一个C源程序文件可以由一个或多个函数组成。 所有函数都是独立的。主函数可以调用其它函数, 其它函数可以相互调用。 ⑶ 在一个C程序中,有且仅有一个主函数main。 C程序的执行总是从main函数开始,调用其它函数 后最终回到main函数,在main函数中结束整个程 序的运行。
2005年3月
12
有关形参和实参的说明:
① 当函数被调用时才给形参分配内存单元。调用结 束,所占内存被释放。 ② 实参可以是常量、变量或表达式,但要求它们有 确定的值。 ③ 实参与形参类型要一致,字符型与整型可以兼容 。 ④ 实参与形参的个数必须相等。在函数调用时,实 参的值赋给与之相对应的形参。“单向值传递” 。
int cube (int x) /* 函数定义 */ { return (x * x * x); } main( ) 程序的执行总是 { int f, a; 从main函数开始 printf("\nEnter an integer number:"); scanf("%d", &a); 函数调用 f = cube (a); printf("%d * %d * %d = %d\n", a, a, a, f); 程序运行情况如下: } Enter an integer number:2 2*2*2=8
2005年3月
⑵ 函数的返回值
函数的返回值是通过return语句带回到主调函数的 return 语句格式: return (表达式); 或 return 表达式 ; 或 return; 功能:终止函数的运行,返回主调函数,若有返 回值,将返回值带回主调函数。 说明: ① 若函数没有返回值,return语句可以省略。 ② return语句中的表达式类型一般应和函数的类 型一致,如果不一致,系统自动将表达式类型转 换为函数类型。
2005年3月
【例7.10】 哥德巴赫猜想之一是任何一个大于5的偶 数都可以表示为两个素数之和。验证这一论断。
输入n的值 for (a=6; a<=n; a+=2) for(b=3;b<=a/2;b+=2) b是素数 ? T c=a-b c是素数? T F 输出: a、b、c的值 break;
图 7.2 验证哥德巴赫猜想
程序的输出结果如下: ********************************* Welcome to China *********************************
2005年3月
7
7.2.1 函数的定义
函数定义的一般形式 函数类型 函数名(类型名 形式参数1,… ) { 说明语句 执行语句 }
5
2005年3月
⑷ 函数的种类
从使用的角度看: ① 标准函数(库函数) 库函数是由系统提供的。 如:getchar( )、sin(x)等。 在程序中可以直接调用 它们。附录A列出了C的 部分库函数。 ② 用户自定义函数。 如:例7.1中的cube函数。
6
从函数定义形式分:
① 有参函数: 在主调(用)函数和被调 (用)函数之间通过参数 进行数据传递, 如: int cube (int x) { … } ② 无参函数: 如:getchar( ) 在调用无参函数时,主调 函数不需要将数据传递给 无参函数。
14
2005年3月
2.函数的类型与函数的返回值
15
【例7.6】输出两个数中的大数。 ⑴ 函数的类型 max(int x,int y) 说明: { int z; ①函数的类型 z=x>y?x:y; 决定了函数返 return (z); /* 返回z的值 */ 回值的类型。 } 若省略函数的 main( ) 类型,系统默 { int a,b,c; 认其为int型。 scanf("%d,%d",&a,&b); ②无返回值的 c=max(a,b); 函数应将其类 printf("max is %d\n",c); 型定义为void } (空)类型。
2005年3月
【例7.2】无参函数的定义与调用。
void welcome ( ) { printf("*********************************\n"); printf(" Welcome to China \n"); printf("*********************************\n"); } main( ) { welcome( );}
2005年3月
21
F
程序如下:
22
可以在main函数的前面对prime #include "math.h" 函数进行声明。实际上,该声 int prime(int n); 明可以省略,为什么? main( ) { int a,b,c,n; /* 穷举法判断素数 */ scanf("%d",&n); int prime(int n) for (a=6; a<=n; a+=2) { int i; for (i=2; i<=sqrt(n); i++) for (b=3; b<=a/2; b+=2) if (n%i==0) return 0; if (prime(b)) return 1; { c=a-b; } if (prime(c)) { printf("%d=%d+%d\n",a,b,c); break; } } } 2005年3月
13
注意:在TC中,实参的求值顺序是从右到左。
2005年3月
【例7.5】函数调用中实参的求值顺序。 void fun(int a,int b) { printf("a=%d,b=%d\n",a,b); } main( ) { int m=5; fun(3+m, m++); }
程序输出结果: a=9,b=5
2005年3月
20 【例7.9】计算并输出两个数的和、差、积、商。
main( ) { void calc(float x,float y,char opr); float a,b; char opr; 对被调函 printf("\nInput expression:"); scanf("%f%c%f",&a,&opr,&b); 数的声明 calc(a,b,opr); } void calc(float x,float y,char opr) { switch(opr) { case '+':printf("%5.2f%c%5.2f=%6.2f\n",x,opr,y,x+y);return; case '-':printf("%5.2f%c%5.2f=%6.2f\n",x,opr,y,x-y);return; case '*':printf("%5.2f%c%5.2f=%6.2f\n",x,opr,y,x*y);return; case '/':printf("%5.2f%c%5.2f=%6.2f\n",x,opr,y,x/y);return; default :printf("Operator err! \n"); } }
2005年3月
16
【例7.8】计算并输出圆的面积。
s(int r) { return 3.14*r*r;} 自动转换 main( ) 为int型 { int r,area; 程序运行情况如下: scanf("%d",&r); 2 printf("%d\n",s(r)); 12 }
思考: 若要得到单精度实型的圆面积,程序应如何修改
2005年3月
18
对被调函数进行声明的一般形式
函数类型 函数名(参数类型1 参数名1,…); 或 函数类型 函数名(参数类型1,参数类型2,…); 第二种形式省略了参数名,此以下哪种情况需要在主调函数中对被调函数声明
被调函数定义在前,主调函数定义在后。
主调函数定义在前,被调函数定义在后,且被调 函数的类型不是整型的。 被调函数定义在后,但被调函数的类型是整型。
2005年3月
7.2.2 函数的调用
函数调用的一般形式:
10
函数名(实参表列)
在C语言中,把函数调用也作为一个表达式。 因此凡是表达式可以出现的地方都可以出现函数 调用。例如:
① welcome( ); ② if (iabs (a)>max) max=iabs(a); ③ m=max(c,max(a,b));
如下定义都是错误的 int max(x,y) { int x,y; …… } 或 int max(int x,y) { …… } 或 int max(x,y) int x,y,z; { z = x > y ? x : y; return( z ); }
√
花括号中也可以为空,这种函数叫空函数 。 不能在函数体内定义其他函数,即函数不能嵌套定义。
2005年3月
17
7.2.4 对被调函数的声明和函数原型
变量要先定义后使用, 函数也如此。即被调函数的 定义要出现在主调函数的定 义之前。如swap函数: 允许整型函数(且参数 也是整型)的定义出现在主 调函数之后。如max函数: 如果非整型函数在主调 函数之后定义,则应在主调 函数中或主调函数之前对被 调函数进行声明。 void swap(int x, int y) { …} main( ) {… swap(a,b); } main( ) {… c=max(a,b); } max(int x,int y) { …}
4
说明
⑴ 一个C源程序可以由一个或多个源程序文件组 成。C编译系统在对C源程序进行编译时是以文件 为单位进行的。 ⑵ 一个C源程序文件可以由一个或多个函数组成。 所有函数都是独立的。主函数可以调用其它函数, 其它函数可以相互调用。 ⑶ 在一个C程序中,有且仅有一个主函数main。 C程序的执行总是从main函数开始,调用其它函数 后最终回到main函数,在main函数中结束整个程 序的运行。
2005年3月
12
有关形参和实参的说明:
① 当函数被调用时才给形参分配内存单元。调用结 束,所占内存被释放。 ② 实参可以是常量、变量或表达式,但要求它们有 确定的值。 ③ 实参与形参类型要一致,字符型与整型可以兼容 。 ④ 实参与形参的个数必须相等。在函数调用时,实 参的值赋给与之相对应的形参。“单向值传递” 。
int cube (int x) /* 函数定义 */ { return (x * x * x); } main( ) 程序的执行总是 { int f, a; 从main函数开始 printf("\nEnter an integer number:"); scanf("%d", &a); 函数调用 f = cube (a); printf("%d * %d * %d = %d\n", a, a, a, f); 程序运行情况如下: } Enter an integer number:2 2*2*2=8
2005年3月
⑵ 函数的返回值
函数的返回值是通过return语句带回到主调函数的 return 语句格式: return (表达式); 或 return 表达式 ; 或 return; 功能:终止函数的运行,返回主调函数,若有返 回值,将返回值带回主调函数。 说明: ① 若函数没有返回值,return语句可以省略。 ② return语句中的表达式类型一般应和函数的类 型一致,如果不一致,系统自动将表达式类型转 换为函数类型。
2005年3月
【例7.10】 哥德巴赫猜想之一是任何一个大于5的偶 数都可以表示为两个素数之和。验证这一论断。
输入n的值 for (a=6; a<=n; a+=2) for(b=3;b<=a/2;b+=2) b是素数 ? T c=a-b c是素数? T F 输出: a、b、c的值 break;
图 7.2 验证哥德巴赫猜想
程序的输出结果如下: ********************************* Welcome to China *********************************
2005年3月
7
7.2.1 函数的定义
函数定义的一般形式 函数类型 函数名(类型名 形式参数1,… ) { 说明语句 执行语句 }
5
2005年3月
⑷ 函数的种类
从使用的角度看: ① 标准函数(库函数) 库函数是由系统提供的。 如:getchar( )、sin(x)等。 在程序中可以直接调用 它们。附录A列出了C的 部分库函数。 ② 用户自定义函数。 如:例7.1中的cube函数。
6
从函数定义形式分:
① 有参函数: 在主调(用)函数和被调 (用)函数之间通过参数 进行数据传递, 如: int cube (int x) { … } ② 无参函数: 如:getchar( ) 在调用无参函数时,主调 函数不需要将数据传递给 无参函数。
14
2005年3月
2.函数的类型与函数的返回值
15
【例7.6】输出两个数中的大数。 ⑴ 函数的类型 max(int x,int y) 说明: { int z; ①函数的类型 z=x>y?x:y; 决定了函数返 return (z); /* 返回z的值 */ 回值的类型。 } 若省略函数的 main( ) 类型,系统默 { int a,b,c; 认其为int型。 scanf("%d,%d",&a,&b); ②无返回值的 c=max(a,b); 函数应将其类 printf("max is %d\n",c); 型定义为void } (空)类型。
2005年3月
【例7.2】无参函数的定义与调用。
void welcome ( ) { printf("*********************************\n"); printf(" Welcome to China \n"); printf("*********************************\n"); } main( ) { welcome( );}
2005年3月
21
F
程序如下:
22
可以在main函数的前面对prime #include "math.h" 函数进行声明。实际上,该声 int prime(int n); 明可以省略,为什么? main( ) { int a,b,c,n; /* 穷举法判断素数 */ scanf("%d",&n); int prime(int n) for (a=6; a<=n; a+=2) { int i; for (i=2; i<=sqrt(n); i++) for (b=3; b<=a/2; b+=2) if (n%i==0) return 0; if (prime(b)) return 1; { c=a-b; } if (prime(c)) { printf("%d=%d+%d\n",a,b,c); break; } } } 2005年3月
13
注意:在TC中,实参的求值顺序是从右到左。
2005年3月
【例7.5】函数调用中实参的求值顺序。 void fun(int a,int b) { printf("a=%d,b=%d\n",a,b); } main( ) { int m=5; fun(3+m, m++); }
程序输出结果: a=9,b=5
2005年3月
20 【例7.9】计算并输出两个数的和、差、积、商。
main( ) { void calc(float x,float y,char opr); float a,b; char opr; 对被调函 printf("\nInput expression:"); scanf("%f%c%f",&a,&opr,&b); 数的声明 calc(a,b,opr); } void calc(float x,float y,char opr) { switch(opr) { case '+':printf("%5.2f%c%5.2f=%6.2f\n",x,opr,y,x+y);return; case '-':printf("%5.2f%c%5.2f=%6.2f\n",x,opr,y,x-y);return; case '*':printf("%5.2f%c%5.2f=%6.2f\n",x,opr,y,x*y);return; case '/':printf("%5.2f%c%5.2f=%6.2f\n",x,opr,y,x/y);return; default :printf("Operator err! \n"); } }
2005年3月
16
【例7.8】计算并输出圆的面积。
s(int r) { return 3.14*r*r;} 自动转换 main( ) 为int型 { int r,area; 程序运行情况如下: scanf("%d",&r); 2 printf("%d\n",s(r)); 12 }
思考: 若要得到单精度实型的圆面积,程序应如何修改
2005年3月
18
对被调函数进行声明的一般形式
函数类型 函数名(参数类型1 参数名1,…); 或 函数类型 函数名(参数类型1,参数类型2,…); 第二种形式省略了参数名,此以下哪种情况需要在主调函数中对被调函数声明
被调函数定义在前,主调函数定义在后。
主调函数定义在前,被调函数定义在后,且被调 函数的类型不是整型的。 被调函数定义在后,但被调函数的类型是整型。
2005年3月
7.2.2 函数的调用
函数调用的一般形式:
10
函数名(实参表列)
在C语言中,把函数调用也作为一个表达式。 因此凡是表达式可以出现的地方都可以出现函数 调用。例如:
① welcome( ); ② if (iabs (a)>max) max=iabs(a); ③ m=max(c,max(a,b));
如下定义都是错误的 int max(x,y) { int x,y; …… } 或 int max(int x,y) { …… } 或 int max(x,y) int x,y,z; { z = x > y ? x : y; return( z ); }
√
花括号中也可以为空,这种函数叫空函数 。 不能在函数体内定义其他函数,即函数不能嵌套定义。
2005年3月
17
7.2.4 对被调函数的声明和函数原型
变量要先定义后使用, 函数也如此。即被调函数的 定义要出现在主调函数的定 义之前。如swap函数: 允许整型函数(且参数 也是整型)的定义出现在主 调函数之后。如max函数: 如果非整型函数在主调 函数之后定义,则应在主调 函数中或主调函数之前对被 调函数进行声明。 void swap(int x, int y) { …} main( ) {… swap(a,b); } main( ) {… c=max(a,b); } max(int x,int y) { …}