《c语言程序设计教学资料》第7章---函数.ppt

合集下载

第7章 函数

第7章  函数

第七章 函 数学习和解题要点1.函数的概念和作用函数:是具有一定功能的一个程序块;是C 语言的基本组成单位。

要求掌握函数定义方法,有关函数类型和返回值的相关知识。

要会调用函数,并能处理函数嵌套、递归调用的相关问题。

1) 函数的参数,返回数值(示意图):2.函数的定义存储类型 (返回的)数据类型 函数名(形参说明语句序列) (注:此地分不能有分号) {函数内用的变量说明序列;(临时工作单元) 可执行语句序列;(包括 return(表达式)语句) }函数的返回值一般是通过 return 语句获得的。

返回的数据类型说明一般应该和return 语句中的表达式类型一致,若不一致则以数据类型说明为准。

如函数中没有 return 语句或 return ;函数无返回值,返回一个用户很难确定的值。

说明:函数的数据类型:int char short long float double *类型。

缺省为 int 型。

不返回值为 void 型。

函数的存储类型:内部函数 本文件内有效 static外部函数 可被其他文件函数调用 extern3.函数调用:函数名(实参表)可以为独立语句:函数名(实参表); 表达式中:变量=函数名(实参表)+其他式;实参表与形参表的对应一般要做到三个一致:个数一致类型一致(在学指针时,指针变量和地址对应)次序一致实参都应该己预先说明的,并有确定的值。

一般,函数都应先定义后调用。

对函数返回值是 int 或 char 的可先调用后定义。

如果非int 或 char型的函数一定要先调用后定义,则在函数调用语句前先作一个“申明”,申明的方法是相当于把函数头部抄一遍,加一个分号:存储类型(返回的)数据类型函数名(形参表);(注:此地分号不可少) 4.函数调用的数据传递把实参数据复制给形参,形参变量内数据变化不影响实参--值调用。

main(){ int a=45,b=50;c=max(a,b);}int max(int x,int y){ .............}把实参的地址传给形参,这时形参变量应为指针变量,因此形参实参共用一个内存位置,形参值的变化也即实参值的变化--地址调用(名调用)。

第7章函数

第7章函数

7.4 函数参数传递和函数的值
• 函数的参数分为形参和实参两种。形参出现在函数 定义中,在整个函数体内都可以使用,离开该函数 则不能使用。实参出现在主调函数中,进入被调函 数后,实参变量也不能使用。
• 形参和实参的功能是传送数据。当发生函数调用时, 主调函数把实参的值传送给被调函数的形参,从而 实现主调函数向被调函数的数据传送。这样的参数 传递方式叫做“数值传递”,简称“值传递”。
函数调用过程中,若形参的值发生改变,不会影响实参中的 值发生变化。
【例7.5】编程求n+(n-1)+(n-2)+…+1的和。 #include <stdio.h> void s(int n) void main() 程序运行过程与结果为: {int i; {int n; input number n: for(i=n-1;i>=1;i--) printf("input number n\n"); 5↙ n=n+i; scanf("%d",&n); ********* printf("n=%d\n",n); } printf("*********\n"); /*调用函数s之前,输出n值*/ n=5 printf("n=%d\n",n); /*调用函数s之前,输出n值*/ ********* printf("*********\n"); /*在函数s内部,输出n值*/ n=15 void s(int); ********* /*调用前,说明函数s*/ s(n); n=5 /*调用函数s之后,输出n值*/ printf("*********\n"); ********* printf("n=%d\n",n); /*调用函数s之后,输出n值*/ printf("*********\n"); }

C语言用函数实现模块化程序设计

C语言用函数实现模块化程序设计
• 指定函数的名字,以便以后按名调用 • 指定函数类型,即函数返回值的类型 • 指定函数参数的名字和类型,以便在调 用函数时向它们传递数据 • 指定函数的功能。这是最重要的,这是 在函数体中解决的
7.2.1 为什么要定义函数
• 对于库函数,程序设计者只需用 #include指令把有关的头文件包含到本 文件模块中即可 • 程序设计者需要在程序中自己定义想用 的而库函数并没有提供的函数
7.1为什么要用函数
例7.1 输出以下的结果,用函数调用实现。 ****************** How do you do! ******************
7.1为什么要用函数
• 解题思路:
– 在输出的文字上下分别有一行“*”号,显然不 必重复写这段代码,用一个函数print_star来实 现输出一行“*”号的功能。 – 再写一个print_message函数来输出中间一行文 字信息 – 用主函数分别调用这两个函数
x 2
7.3.3 函数调用的过程
调用结束,形参单元被释放 实参单元仍保留并维持原值,没有改变 如果在执行一个被调用函数时,形参的值 发生改变,不会改变主调函数的实参的值 实参 形.4. 函数的返回值
通常,希望通过函数调用使主调函数能得 到一个确定的值,这就是函数值(函数的返 回值) (1)函数的返回值是通过函数中的return语 句获得的。
#include <stdio.h> int main() { void print_star(); void print_message(); print_star(); print_message(); print_star(); return 0; } void print_star() { printf(“******************\n”); } void print_message() { printf(“ How do you do!\n”); }

C语言课件第07章-自定义函数

C语言课件第07章-自定义函数

在主函数或其他函数中,我们可以使用y=sum();语句执行函数sum,并把 函数的值送给y,或者用printf("%d",sum());直接输出函数sum的值。
第7章 自定义函数
2. 有参函数的定义形式 如果一个函数,需要调用者提供原始数据才能执 行(如sqrt函数),则这种函数可以被定义成有 参函数。其定义形式如下:
第7章 自定义函数
下面我们定义一个函数,名叫 printStar,其功能就是专门输出 则,主函数代码可以简化为:
经过函数调用,程序的代码行大大缩水,且main 函数更清晰且可读性更好。
第7章 自定义函数
如果我们把printStar函数的代码放到d盘根目录 下的一个文本文件中,比如放到function.txt文 本文件中,其他的程序如果有需要,也完全可以 用#include <d:\function.txt>把有关内容包含 到对应程序文件中,在需要的时候调用printStar 函数即可 。 函数:函数就是一个用名字命名的独立的程序块( 子程序),能实现某些功能,可供本程序其他函数 ,或者另外一些程序的函数调用。
第7章 自定义函数
factorial 函数专门求n的阶乘
第7章 自定义函数
形式参数(形参):函数在声明(定义) 的时候,同时对函数所需要的参数的数量、类型做出 说明。这些参数的名字只是一种形式,只有在函数被 调用时,这些参数才能得到具体值,所以这些参数为 形式参数。比如,函数求阶乘函数中的n就是形式参 数。 实际参数(实参):一个有参函数在被调用的时候, 主调函数必须根据被调用函数形参(形式参数)的要 求,传递具体数据给被调用函数的形参,这些实际的 数据就叫做实际参数,也就是我们所说的实参。 实参是有具体值的,实参可以是常数,也可以是变量 。但在使用时必须有具体值。

C语言程序设计第07章 指针

C语言程序设计第07章 指针

8
10/7/2013
内存地址
内存单元
1000 1001 1002 1003 1004
1004
12
图 一个变量指向另一个变量
9
10/7/2013
1、两个概念:变量指针与指针变量
变量指针:一个变量的地址 指针变量:专门存放变量地址的变量
指针 变量的地址
…...
2000
2001 2002 2003 2004 2005
k的 地址 2005
2004
…...
5
8.7
…...
…...
i
k
float k;
编译或函数调用时为变量分配内存单元 变量是对程序中数据 存储空间的抽象
4
程序中:i = 5; k = 8.7;
…...
10/7/2013
7.1.1 指针的概念
理解变量的地址和变量的值
变量名
00000000H 00000001H
C语言程序设计教学课件
第7章
指针
7.0 目标 理解指针的概念 定义指针变量 掌握对指针的操作 理解指针和数组的楼
存储地址
内存
0
…...
存储 单元
601
501
602 502
2000 2001
50
2002 注意:内存单元的地址与内存单元中的数据是 401 402 两个完全不同的概念。 2003 存储单元有
存放变量的内存 单 元 ,int 型 为 两 个 字节。
6
a
变量的值(a=6)
int a; a = 6;
变量的 地址
变量存储在内存某个单元中; 不同类型变量所占内存空间大小不一定相同; 不同编译环境,同一类型变量占用空间大小可能不同

程序设计语言编译原理第三版第7章PPT课件

程序设计语言编译原理第三版第7章PPT课件

0
id
b
1
Id
c
2 uminus 1
3
*
0
4
id
b
5
id
c
6 uminus 5
7
*
4
8
+
3
9
id
a
10 assign 9
id c
id c
2
6 7 8
12
§7.1 中间语言
三、三地址代码 1.三地址代码:下面一般形式的语句构成的序列:
x:=y op z T1:=y*z, T2:=x+T1
x,y,z: 名字,常数,编译时产生的临时变量 op: 运算符号(如定点运算符,浮点运算符,逻辑运算符等)
点,一个内部结点代表一个操作符,它的孩子 代表操作数; 不同点:在一个DAG中代表公共子表达式的结点具有多个 父结点,而在一棵抽象语法树中公共子表达式 被表示为重复的子树。
9
§7.1 中间语言
例子:如图所示,为a+a*(b-c)+(b-c)*d的DAG
+
+
*
*
d
a
-
b
c
10
§7.1 中间语言
2.抽象语法树
称为三地址代码的原因: 每条语句通常包含三个地址,两个用来表示操作数,一个用
来存放结果。 具体实现:用记录表示,其中包含运算符和操作数的域。
13
§7.1 中间语言
2.四元式:带有四个域的记录结构 (op,arg1,arg2,result) 内容均是指针, 指向有关名字的符号表入口
14
§7.1 中间语言
E1’ op
7
§7.1 中间语言

C13第7章 函数(3)

C13第7章 函数(3)

例7-27 汉诺塔问题。
设A座上有n个盘子。 座上有n个盘子。 如果n 如果n为1时,即A座上只有一个盘子,则把它直接移到C座上 座上只有一个盘子,则把它直接移到C 否则,用下面三步完成任务: 否则,用下面三步完成任务: 第一步, 第一步,把A座上的n-1个盘子先利用C座移动到B座上。 座上的n 个盘子先利用C座移动到B座上。 第二步, 第二步,把A座上仅有的第n个盘子移动到C座上。 座上仅有的第n个盘子移动到C座上。 第三步,把B座上的n-1个盘子利用A座移动到C座上。 第三步, 座上的n 个盘子利用A座移动到C座上。
分析upstairs(4)的运行情况
upstairs(4) upstairs(3) + upstairs(2) upstairs(2) + upstairs(1)
Hale Waihona Puke 程序的输出为void main( ) { printf(“4阶楼梯有 种不同的走法 阶楼梯有%d种不同的走法 阶楼梯有 种不同的走法\n”, upstairs(4));}
例7-24
例7-25
编写一个递归函数isPalin判断字符数组中的字符串是 编写一个递归函数isPalin判断字符数组中的字符串是 isPalin 否为回文,是则返回1 不是返回0 否为回文,是则返回1,不是返回0。
例7-27
汉诺塔问题。
古代有一个梵塔,塔内有3个标示为A 古代有一个梵塔,塔内有3个标示为A、B、C的座,A座 的座, 上有5个大小不等的盘子,大的在下面,小的在上面, 上有5个大小不等的盘子,大的在下面,小的在上面,如 图7-8所示。现要求把5个盘子从A座移动到C座,每次只允 所示。现要求把5个盘子从A座移动到C 许移动一个盘子,在移动过程中可以利用B座,但是3个座 许移动一个盘子,在移动过程中可以利用B 但是3 上要始终保持大盘在下面,小盘在上面。 上要始终保持大盘在下面,小盘在上面。

中国矿业大学(北京)《C语言程序设计》课件第7章指针与数组

中国矿业大学(北京)《C语言程序设计》课件第7章指针与数组

a[1] a[2] a[3]
mmaainn(()) {{iinntt aa[[1100] ],,ii;;
ppuuttss((““pplleeaassee iinnppuutt %%dd ssccoorree::””,,N1)0;);
ffoorr ((ii==00;;i<i1<01;0i;++i+) +) ssccaannff(“(%"%d”d,"a?,+i&a[)i;]);
main()
{
int i = 0;
printf("%c%s\n",*a, b + 1);
while (putchar (*(a + i)))
{ i++;
Program
}
printf("i = %d\n",i);
PROGRAM
while ( -- i)
{ putchar (*(b + i));
i=7
} printf("\n%s\n", &b[3]);
1,2,3,3,2,3,4,4
20
读程序-3
#include <stdio.h>
char b[] = "program";
char *a = “PROGRAM”;
/*定义一个指针变量指向字符串,与上边定义的区别是:前者是先申请内存空间, 后存入字符串,而后者是先将字符串存入在内存的某个地方,然后再用a指向 该字符串所在内存的开始位置。另外。b是常量,a是变量*/
–指针变量指向哪儿?
–所指向的变量里存储的数据是多少?

高树芳C语言程序设计--第七章

高树芳C语言程序设计--第七章
[解决方案] 一行需要两个函数。一个函数显 示星号左面的空格,一个函数显示星号。
程序代码
11
7.2函数的定义、声明和调用
相关知识:
1.有参、无返回值函数的定义 2.有参、无返回值函数的调用 3.有参、无返回值函数的声明
12
7.2函数的定义、声明和调用
案例7-4 求组合数
[案例任务]
键盘输入m和n两个整数, 计算并显示下面的组合数, C 要求运用函数编程。
n m m! n! (m-n)!
[解决方案] 定义一个求阶乘的函数。它有一个 形参,而且有返回值。
程序代码
13
7.2函数的定义、声明和调用
[课堂训练7-2]
修改案例7-3的主函数,使之显示一个与案例7-3 形状相似的倒三角“*”号图案(要求显示4行)。
14
7.2函数的定义、声明和调用
相关知识: 1.有参、有返回值函数的定义 2.有参、有返回值函数的调用 3.无参、有返回值函数的调用
15
7.2函数的定义、声明和调用
案例7-5
显示100~200间的素数
[案例任务]
参照案例5-9判断素数程序,将其改造成一个函数如 prime,其功能是对给定的整数x,判断它是否是素数,如 是则返回1,不是则返回0。然后利用下面给出的主函数 调用函数prime ,显示100至200之间的全部素数。
[解决方案] 设计一个函数用于判断一个整数是
案例7-2 用函数实现简易菜单 [案例任务]
对案例5-3进行简化和改造。要求循环显示菜单并等 待用户选择,然后显示用户选择了第几项功能,如选 择0则结束程序。要求用函数实现菜单的显示内容。
[解决方案]定义无形参、无返回值的函数显示菜单。
程序代码

C语言第7章 函数

C语言第7章 函数

函数的 参数?
int main() {
int a=12, b=24; … printf("%d\n", Average(a, b)); … return 0; }
int Average(int x, int y) {
int result;
result = (x + y) / 2;
return result; }
C语言程序设计
22/114
7.3.1 函数调用
每次执行函数调用时
现场保护并为函数的内部变量(包括形参)分配内存 把实参值复制给形参,单向传值(实参形参) 实参与形参数目一致,类型匹配(否则类型自动转换)
int main()
{

int a=12, b=24,ave;

ave = Average(a, b);
21
1*2
3 (1*2)
(1*2)*3
}
4 (1*2*3)
(1*2*3)*4
return result;
……

}
n (1*2*3*4*…)
(1*2*3*4*…)*n
C语言程序设计
监视窗(Watches)
26/114
7.3.2函数原型
第7章 函数
函数原型(Function Prototype)
调用函数前先声明返回值类型、函数名和形参类型
Function Call?
int main() {
int a=12, b=24, ave; … ave = Average(a, b); … return 0; }
int Average(int x, int y) {
int result;

C语言7数组课件教程

C语言7数组课件教程

a[0][0] a[0][1] a[0][2] a[1][0] a[1][1] a[1][2]
13
C 程序设计
第7章 数组
§遍历所有二维数组元素a[n][m] for(i=0;i<n;i++) for(j=0; j<m; j++) {
printf(“%d”,a[i][j]); }
14
C 程序设计
6
a[0]1例[0] ai[n0t]0a[[12]][a3[0]=0][{2{]1a,2[1}4],{[04]}}a;[15][1] a[10][2]
a[0111][0] a[0222][1] a[3034][2] a[4140][0] a[5150][1] a[6100][2]
aaa[[[000]]][[[1000]]] aaa[[[000]]][[2[111]]] aaa[[[000]]][0[[222]]] aaa[[[111]]][4[[000]]] aaa[[[111]]][0[[111]]] aaa[[[111]]]0[[[222]]]
1
3
5
7
a[1] a[210]0[08] a2[10]1[01] a2[10]1[22] a2[10]1[43] 9 11 13 15
a[2] a[2210]71[06] a2[210]91[81] a2[220]12[02] a2[220]32[23]
每个元素a[i]由包含4个元素 的一维数组组成
输出:max和row,colum
colum = j;
}
printf("max=%d,row=%d, \
colum=%d\n",max,row,colum); 16
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

print_message(); /*调用print_message函数*/
printstar();
/*调用printstar函数*/
}
void printstar() /*定义printstar函数*/ { printf("* * * * * * * * * * * * * * * *\n"); }
ห้องสมุดไป่ตู้
main
a
b
c
de fg h i
e
模块化程序设计方法
➢ 功能分解
- 自顶而下、逐步求精的过程
➢ 模块化分解原则
- 保证模块的相对独立性
高聚合(模块的功能独立、单一)、低耦合(模块对外接口简单)
➢ 设计好模块接口
- 接口是指罗列出一个模块的所有与外部打交道的变量 - 定义好后不要轻易改动 - 在模块开头(文件的开头)进行函数声明
第7章 函数
主要内容
➢ 模块化程序设计 ➢ 函数的定义 ➢ 向函数传递值和从函数返回值 ➢ 函数的调用 ➢ 函数的作用域和存储类别
问题:
为什么要用函数?
如果程序的功能比较多,规模比较大,把所有代码都写 在main函数中,就会使主函数变得庞杂、头绪不清,阅读和 维护变得困难 有时程序中要多次实现某一功能,就需要多次重复编写 实现此功能的程序代码,这使程序冗长,不精炼
(4)所有函数都是平行的,即在定义函数时是分别进 行的,是互相独立的。一个函数并不从属于另一函 数,即函数不能嵌套定义。函数间可以互相调用, 但不能调用main函数。main函数是系统调用的。
(5)从用户使用的角度看,函数有两种: ① 标准函数,即库函数。这是由系统提供的,用户 不必自己定义这些函数,可以直接使用它们。不同的 C系统提供的库函数的数量和功能会有一些不同,但 许多基本的函数是共同的。 ② 用户自己定义的函数。用以解决用户的专门需要 。
是各种类型的变z量=x,>y个?x参:y数; 之间用逗号间隔。进行
函数调用时,主r调et函urn数(将z);赋予这些形式参数实际的
例:函数调用的简单例子
# include <stdio.h>
void main()
{
void printstar();
/*对printstar函数声明*/
void print_message(); /*对print_message函数声明*/
printstar();
/*调用printstar函数*/
(6) 从函数的形式看,函数分两类: ①无参函数。无参函数一般用来执行指定的一组操 作。在调用无参函数时,主调函数不向被调用函数 传递数据。 ②有参函数。主调函数在调用被调用函数时,通过 参数向被调用函数传递数据。
怎样定义函数?
为什么要定义函数 定义函数的方法
C语言要求,在程序中用到的所有函数,必须 “先定义,后使用”
函数定义的一般形式
(1)无参函数的定义一般形式 (2)有参函数定义的一般形式 (3)空函数
函数定义的一般形式
(1)无参函数的定义一般形式
类型 函数名()
{
声明部分 语句部分 }
类型 函数名(void)
{
声明部分 语句部分 }
类型标识符指明函数类型,函数的类型实际上是函 数返回值的类型。函数名后面有一个空括号,其中 无参数,但是括号不能少。
void print_message() /*定义print_message函数*/ { printf("How do you do!\n"); }
运行情况如下:
**************** How do you do! ****************
说明:
(1)一个C程序由一个或多个程序模块组成,每一个 程序模块作为一个源程序文件。对较大的程序,一般 不希望把所有内容全放在一个文件中,而是将它们分 别放在若干个源文件中,由若干个源程序文件组成一 个C程序。这样便于分别编写、分别编译,提高调试 效率。一个源程序文件可以为多个C程序共用。
例如: void hello() {
printf(“hello world!\n”); }
(2)有参函数定义的一般形式
类型 函数名(类型 形式参数1,类型 形式参数 2,…)
{
声明部分
语句部分例如:
}
int max(int x, int y)
{
有参函数比无参i函nt数z;多了/ *形函式数参体数中列的表声,明它部分们*可/ 以
例:输出以下的结果,用函数调用实现。
****************** How do you do!
******************
解题思路:
➢ 在输出的文字上下分别有一行“*”号,显然不 必重复写这段代码,用一个函数printstar来实现输 出一行“*”号的功能 ➢ 再写一个print_message函数来输出中间一行文 字信息 ➢ 用主函数分别调用这两个函数
用模块化程序设计
在设计一个较大的程序时,往往把它分为若干个程序模块, 每一个模块包括一个或多个函数,每个函数实现一个特定的 功能
采用“分而治之”的办法简化程序设计的过程 C程序可由一个主函数和若干个其他函数构成 事先编好一批实现各种不同功能的函数 主函数调用其它函数,其它函数也可以互相调用 同一个函数可以被一个或多个函数调用任意多次
指定函数名字、函数返回值类型、函数实现的 功能以及参数的个数与类型,将这些信息通知编 译系统。
指定函数的名字,以便以后按名调用 指定函数类型,即函数返回值的类型 指定函数参数的名字和类型,以便在调用函数时向它
们传递数据 指定函数的功能。这是最重要的,这是在函数体中解
决的
对于库函数,程序设计者只需用#include指令把 有关的头文件包含到本文件模块中即可 程序设计者需要在程序中自己定义想用的而库函 数并没有提供的函数
(2) 一个源程序文件由一个或多个函数以及其他有 关内容(如命令行、数据定义等)组成。一个源程 序文件是一个编译单位,在程序编译时是以源程序 文件为单位进行编译的,而不是以函数为单位进行 编译的。
(3) C 程 序 的 执 行 是 从 main 函 数 开 始 的 , 如 果 在 main函 数 中 调 用 其 他 函 数 , 在 调 用后 流 程返 回 到 main函数,在main函数中结束整个程序的运行。
相关文档
最新文档