第5章 函数(C语言程序设计)
C语言程序设计教程(第5章 函数)
22
信息科学与工程学院
作用域(可用域)与生存期
C语言中定义的变量都有一个起作用的范 围,称为变量的作用域。 程序运行时,变量被创建和被删除的时间 段,称为变量的生存期。
23
信息科学与工程学院
局部变量和全局变量
在一个函数内部定义的变量是内部变量, 它只在本函数内部范围内有效。也就是说 只有在本函数内才能使用它们。这些变量 称为“局部变量”。 在函数之外定义的变量称为外部变量,也 称为全局变量,在文件内的所有函数都能 使用它。它的有效范围为从定义变量的位 置开始到文件的结束。
4
信息科学与工程学院
5.1 问题的提出
C语言程序是由什么构成的? 函数 什么是函数?
能完成特定功能的功能块; 一般有输入参数 和返回值; 一次定义,可以调用多次。
一个C语言程序为什么需要不同的函数?
一个函数过大难于编写和维护; 一个函数的程序不利于协作; 代码和功能共享的需要。
5
信息科学与工程学院
6. 函数调用举例分析(见下页)
15
信息科学与工程学院
实参到形参是单向值传递 例2 求两个整数中的最大值
int max(int x,int y) /*函数定义*/ { int temp; if (x>y) temp=x; else temp = y; COPY return temp; } void main() { int a,b; scanf("%d,%d",&a,&b); a = max(a,b); /*函数调用*/ printf("\n max= %d \n",a); }
2
信息科学与工程学院
第5章 函数
本章需要掌握的知识点: 函数定义 函数说明 函数调用 形参和实参的关系 变量的存储类别
高树芳C语言程序设计--第五章
VC程序代码
21
5.4
for循环结构
相关知识:
求解表达式1
1.for语句 见执行过程图。 2. for语句的说明 三个表达式均可省略, 但两个分号不可省略。
假 计算表达式2 真 循环体语句
求解表达式3
for语句的后续语句
22
5.2
while(当型)循环结构
[课堂训练5-4] 用for循环编程实现倒计时效果。即在屏幕上 固定位置显示10,然后清除之,再显示9,之后 是8……,至到1。
是成绩非-1等。
10
5.2
while(当型)循环结构
相关知识:
1.while语句的一般形式 2.while语句的说明 3.循环结构的构造方法 4.if语句与循环语句的区别
11
5.2
while(当型)循环结构
[课堂训练5-2] 计算s=1+1/2+1/3+1/4+„„+1/n,直到s大于或等 于3为止,输出n的值。 提示: 这是“标志”型循环。设置实型变量s并设初值为 0.0,设置整型变量i并设初值为1,循环条件是 s<=3,重复内容是s=s+1.0/i,注意要使用1.0实型 常量,或者将1或i作强制类型转换,将其转换为 实数,否则运算结果为0。
20
5.4 for循环结构 案例5-6 跳动的“O”
[案例任务]
编程实现字符“O”从屏幕的左端移动到右端。每一 秒种移动一下,形成跳动的效果。运算结果大致如 下。
[解决方案]首先显示一个O,延时片刻,然后光标
后退(用转义字符),再显示一个空格和一个O。循 环以上功能直到光标到屏幕最右端。
WIN-TC程序代码
[解决方案]该循环至少执行1次,使用do„while
C语言程序设计第五章
05 案例分析
案例一:条件语句在程序中的应用
总结词
条件语句是C语言中用于根据不同条件执行不同操作的语句,通过if、else if和else关键 字实现。
详细描述
编程练习二:循环语句应用
总结词
理解并掌握while和for循环的使用
详细描述
通过编写程序,实现重复执行某段代 码直到满足特定条件,或者根据需要 重复执行某段代码指定次数。例如, 计算1到100的累加和,或者打印出0 到99的所有偶数。
编程练习三:数组操作应用
总结词
理解并掌握数组的基本操作
VS
详细描述
详细描述
数组在程序中用于存储和处理同一种类型的 数据元素,例如存储一组学生的成绩、计算 一组数据的平均值等。数组操作包括数组的 声明、初始化、访问和修改等。通过循环语 句可以方便地遍历数组元素并进行处理。数 组操作在程序中具有广泛的应用,是C语言
中重要的数据结构和算法之一。
06 总结与展望
本章总结
详细描述
C语言中的数组是一种存储相同类型元素的线性数据结构。可以通过索引访问数 组元素,进行赋值、交换、排序等操作。同时,C语言还提供了字符串操作函数, 如strcpy、strcat、strlen等。
语法点三:数组操作
01
示例代码
02
```c
int array[10]; // 声明一个包含10个整数的数组
详细描述
循环语句在程序中用于重复执行一段代码, 例如打印1到10的数字、计算一定数量的累 加和等。循环语句可以嵌套使用,以实现更 复杂的循环结构和算法。循环语句通常与条 件语句结合使用,以控制循环的执行条件和 次数。
C语言程序设计 (何钦铭 颜晖 著) 高等教育出版社第五章 课后答案
{
double e,x,cos;
printf("Enter two numbers e and x :"); /*输入两个数e,x */
scanf("%lf%lf",&e,&x);
cos=funcos(e,x); /*调用函数funcos */
printf("The result of cos(%lf) is %lf.\n",x,cos);
printf("sign(%lf)=%d\n",x,y); /*输出x的符号*/
}
int sign(double x) /*定义函数sign */
{
int y;
if(x>0)y=1;
else if(x==0)y=0;
else y=-1;
return y;
}
练习5-2
#include <stdio.h>
#include <stdio.h>
int even(int n); /*声明函数even */
void main()
{
int num,sum=0;
printf("Enter the first number :"); /*输入第一个数*/
scanf("%d",&num);
while(num>0)
{
{
int i,j;
for(i=1;i<=n;i++) /*共n行金字塔*/
{
for(j=1;j<=n-i;j++)printf(" "); /*输出每行左边的空格*/
C语言程序设计 第05章 函数
8
计算机与信息工程学院
Page 8
C语言程序设计 第 5 章 函数
例1 计算两个整数的平均数的函数。 /* 函数功能:就算平均数 函数入口参数:整型x,存储第一个运算数
7
计算机与信息工程学院
Page 7
C语言程序设计 第 5 章 函数
❖参数:一般用于一个函数把数据传递给另一个函数(调用 者和被调用者之间),实现函数之间的通信。定义函数的 时候,函数的参数是形式参数,是对一件具体事件可能需 要数据的假设。
❖ 返回值: 即函数带回来的值。而返回值的类型是在定义函数 的时指定的,即用“返回值类型”指定函数的类型。 ❖ 1、如果类型标识符为void则表示不需要带回函数值; ❖ 2、如果没有类型标识,则为默认返回值类型,视编译 器的不同而不同。
单向传递,只由实参传给形参,而不能由形参传回 来给实参。 f) 在内存中,实参单元与形参单元是不同的单元。
13
计算机与信息工程学院
Page 13
C语言程序设计 第 5 章 函数
例2 调用函数时的数据(参数)传递。
#include <stdio.h> void main() {
int max(int x, int y); int a, b, c; scanf("%d, %d",&a, &b); c=max(a, b); printf("max is %d", c); }
计算机与信息工程学院
Page 4
C语言程序设计 第 5 章 函数
5.2.1 函数的分类
C语言程序设计(第3版)第5章习题参考答案
printf(" 4: insert 5:delete 6:exit \n");
while(1)
{ printf("\nplease input a menu option:");
scanf("%d",&iMenu);
switch(iMenu)
break;
case 4: printf("\nplease input the data to be inserted:");
scanf("%d",&iInsert);
for(i=0;i<10;i++)
{
if(iInsert>iScore[i])
{
iFlag=i;
break;
}
}
for(i=10;i>iFlag;i--)
{
if(iScore[j]<iScore[j+1])
{
iTemp = iScore[j];
iScore[j] = iScore[j+1];
iScore[j+1] = iTemp;
}
}
}
printf("\nthe sorted datas :");
for(i=0;i<10;i++)
printf("%d ",iScore[i]);
printf("%d\t",s[i][0]);
for(j=1;j<=i;j++)
C语言程序设计-第5章--函数
实参可以是常量、变量或表达式,但要求 它们必须要有确定的值,在调用时将实参 的值赋给形参。另外,实参和形参的类型 应相同或兼容。
— 31 —
5.2 函数的参数传递和返回值
➢ 5.2.2 函数的返回值
一般情况下,主调函数调用完被调函数后,都希望能够得到一 个确定的值,这就是函数的返回值。在C语言中,函数返回值 是通过return语句来实现的。return语句的一般形式有3种:
/*函数声明*/
/*调用逆序函数,将a的逆序值赋给b*/ /*调用逆序函数,将b的逆序值赋给c */
— 23 —
5.2 函数的参数传递和返回值
➢ 5.2.1 函数的形参与实参
{
int y=0,sign=1;
/*定义sign表示x的符号,定义变量y代表逆序数据*/
if(x<0)
/*当x小于0时取符号及取反*/
— 18 —
5.1 函数的定义和调用
➢ 5.1.2 函数的调用
另外,按函数在语句中的作用来分,可以有以下3种函数调用方式:
函数表达式
函数语句
函数作为实参
函数作为表达式中的一项出 现,以函数返回值参与表达 式的运算。
函数调用的一般形式加上分 号即构成函数语句。
函数作为另一个函数调用的 实际参数出现,即把该函数 的返回值作为实参进行传送。
#include<stdio.h> int main() {
int x=0,y; y=trans(x); printf("y=%d\n",y); printf("x=%d\n",x); return 0; } trans(int a) { a++; printf("a=%d\n", a); return a; }
c语言程序设计5(函数)
参数的传递
1. 函数调用时,被调函数中的形参被分配 临时的存储单元,实参的值赋给形参变量 2. 实参可以是常量、变量或表达式 3. 实参的个数、类型和顺序必须与形参一致 4. 形参与实参各占一个独立的存储空间,调 用结束后,形参单元被释放
形参值的改变不会影响实参-----值传递
例:P134 main( ) { int v1=10, v2=20; printf(“v1=%d v2=%d\n”,v1,v2); printf(“_ do swap _\n”); swap(v1,v2); printf(“v1=%d v2=%d\n”,v1,v2); } void swap(int x, int y) { int temp; v1=10 v2=20 temp=x; _ do swap _ x=y; y=temp; v1=10 v2=20 }
自定义函数的应用实例
P136 例3:输出“九 九表”。 它是一个
9行9列的二维表格,
加上一个行标题和一
个列标题,显示出来
应该是10行10列。
#include <stdio.h> void drawLine(int n,char ch); /* 连续显示n个ch字符 */ main() { int i,j; printf("\n 9.9 table\n"); /* 显示表名 */ drawLine(30, '='); /* 显示每列的标题 */ printf("\n 1 2 3 4 5 6 7 8 9"); drawLine(30, '='); for (i=1; i<=9; i++) { /* 显示每行的内容 */ printf("\n%3d", i); for (j=1; j<=9; j++) printf("%3d", i*j); if (i<9) drawLine(30, '-'); else drawLine(30, '='); } void drawLine(int n, char ch) /*连续显示n个ch字符*/ } { int i; putchar('\n'); /*换行*/ for (i=1; i<=n; i++) putchar(ch); /*连续显示n个字符ch*/ }
C语言程序设计(李圣良)章 (5)
printf("%3d",score[i]); printf("\n"); pass(score,10);
第5单元 函 数
printf("处理之后的成绩如下:\n"); for(i=0;i<10;i++)
printf("%3d",score[i]); printf("\n"); } void pass(int array[],int n) { int i; for(i=0;i<n;i++)
function(); }
第5单元 函 数 图5-2 例5-4程序运行结果
第5单元 函 数
5.2.2 函数的声明 在C语言中,除了main函数外,用户所定义的函数遵循
“先定义、后使用”的规则。当把函数的定义放在调用之后, 应该在调用之前对函数进行声明,即在所调用的函数之后定义, 则在调用函数之前需要对被调函数进行声明。
第5单元 函 数
(2) 调用的函数仅仅是完成某些操作而不返回函数值,这 时函数的调用可以作为一条独立的语句。
【例5-4】 读程序,理解无返回值的函数调用。
#include <stdio.h> void function() {
printf(“Hello,World!\n”); } main() {
{
int z;
/* 求得的最大公约数用z存放 */
实现函数功能的语句
return (z);
/* return语句带回返回值 */
}
C语言程序设计第5章
表达式
语句1 语句
语句2 语句
请注意: 请注意: else部分是整个 语句的一个子句,它不能脱离 语句而独立存在。 部分是整个if语句的一个子句 它不能脱离if语句而独立存在 语句而独立存在。 部分是整个 语句的一个子句,
5.3 if语句 语句
例如, 例如, if(g>=90)putchar(‘A’); else if(g>=80)putchar(‘B’); else if(g>=70)putchar(‘C’); else if(g>=60)putchar(‘D’); else putchar(‘E’); 该语句的执行流程图(P97图5-6)是: 该语句的执行流程图 图 是 若表达式1的值为真 则执行语句1, 的值为真, 若表达式 的值为真,则执行语句 , 假 表达式1 表达式 语句1执行后,整个if语句执行完毕; 语句 执行后,整个 语句执行完毕; 执行后 语句执行完毕 否则,再根据表达式2的值来决定下 否则,再根据表达式 的值来决定下 真 假 表达式2 表达式 一步操作。 一步操作。 假 真 若表达式2的值为真 则执行语句2, 的值为真, 若表达式 的值为真,则执行语句 , 表达式3 表达式 语句2执行后 整个if语句执行完毕 执行后, 语句执行完毕; 语句 执行后,整个 语句执行完毕; 假 真 表达式m 表达式 否则,再根据表达式3的值来决定下 否则,再根据表达式 的值来决定下 一步操作。 一步操作。… 真 若表达式1~ 的值全为假 的值全为假, 若表达式 ~m的值全为假,则执行 语句1 语句 语句2 语句 语句3 语句m 语句 语句n 语句 语句 语句n,语句n执行后 整个if语句执 执行后, 语句 ,语句 执行后,整个 语句执 行完毕。 行完毕。例如(exc\ch5\if-3.c)。 3. if(表达式 语句 表达式1)语句 表达式 语句1 else if(表达式 语句 表达式2)语句 表达式 语句2 … … else if(表达式 语句 表达式m)语句 表达式 语句m else 语句 语句n
第5章-C语言程序设计(第2版)教材习题答案
【教材】《C语言程序设计(第2版)》清华大学出版社,黄保和,江弋编著。
2011年10月第二版。
ISBN:978-7-302-26972-4。
售价:35元。
【答案版本】本习题答案为2012年2月修订版本。
一、选择题1. 设有程序段”int k=10; while(k=0) k=k-1;”,则下面叙述正确的是D)循环体语句一次也不执行。
A. while循环执行10次B. 循环是无限循环C. 循环体语句执行一次D. 循环体语句一次也不执行2. 设有程序段”int x=0,s=0;while(!x!=0) s+=++x; printf(“%d”,s);”则A)运行程序段后输出1。
A. 运行程序段后输出1B. 程序段执行无限次C. 运行程序段后输出0D. 程序段中的控制表达式是非法的3. 下面循环语句中,错误的是D) int a=1,b=2;do b-- while(b= =0);。
A. int a=1,b=2; while(b--);B. int a=1,b=2; do a++; while(a==b);C. int a=1,b=2; while(a=3);D. int a=1,b=2; do b-- while(b==0);4. 已知”int i=5;”,下列do…while循环语句的循环次数为C) 5。
do{ printf(“%d\n”,i--); } while(i!=0);A. 0B. 1C. 5D. 无限5. 循环语句”for(int i=0,j=10; i==j; i++,j--)”的循环次数是A) 0。
A. 0B. 5C. 10D. 无限6. 下述有关break语句的描述中,不正确的是C) break语句用于if语句的内嵌语句内,它结束该if语句。
A. break语句用于循环体内,它将结束该循环B. break语句用于开关语句,它结束该开关语句C. break语句用于if语句的内嵌语句内,它结束该if语句D. break语句在一个循环体内可使用多次7. 下面关于循环语句的描述中,错误的是B)循环体内必须同时出现break语句和continue 语句。
函数的递归调用_C语言程序设计(第2版)_[共4页]
121 return s; }/*函数名:fac*//*形参:n,int 型*//*返回值:long 型*//*功能:求n!的值*/ long fac(int n) { int i; long t=1;for(i=1;i<=n;i++) t=t*i; return t; }程序运行结果如图5-16所示。
程序分析:在该程序中定义了两个函数,sum 函数用来求1!+2!+…+n!的值,fac 函数用来求n!的值。
由于sum 函数的累加通项为i !,所以sum 函数中对fac 函数进行了调用。
这里要注意一点,虽然sum 函数和fac 函数的形参都是n ,但它们是不相干的,函数的形参变量只在本函数内有效,离开了本函数,形参变量也就消失了。
在主程序mian 中,调用了sum(x)求分子,sum(y)求分母,由于sum 函数返回值是long 型,因此表达式sum(x)/sum(y)的值也为long 型,这可能导致结果不正确,因此这里需要把分子或分母强制转换类型成float 型。
5.5.2 函数的递归调用一个函数在程序运行的过程中,直接或间接地调用自己称为递归调用。
C语言允许函数的递归调用,递归调用示意图如图5-17所示。
图5-17 递归调用示意图执行递归函数将反复调用该函数自身,每调用一次就进入新的一层,因此递归函数一定要有控制终止递归调用的语句。
没有控制的递归是毫无意义的,例如:void p() { printf("****");p(); }是一个递归函数,但是该函数将无休止地调用其本身,是一个死循环。
很明显,这种不会终止递归的程序是不正确的。
为了防止递归无终止地进行,常用的办法是在递归中加入条件判断,满足某种条件后就不再作递归调用,然后逐层返回。
下面我们来看一个递归调用的例子。
【例5.9】 用递归法计算n!。
n!可以表示为:图5-16 例5.8程序运行结果。
四川大学《c语言程序设计》课件-第5章 函数
用void定义参数 ,表示没有参数
void 函数名(void)
{ 声明语句序列 可执行语句序列 return ;
}
return语句后无需 任何表达式
【例】 计算整数n的阶乘n!
/* 函数功能: 用迭代法计算n!
返回值函数类入型口参数:函整数型名变量说n明表示阶乘的形阶参数表,函
函数返回值: 函返数回的n!功的能值
函数定义(Function definition)
返回值 类型
函数名标识符, 说明运算规则
参数表相当于 运算的操作数
类型 函数名(类型 参数1, 类型 参数2, ……)
{ 声明语句序列
可执行语句序列 return 表达式;
}
函数出口
返回运算的结果
函数定义(Function definition)
因变量
函数名
自变量
程序设计中的函数
程序设计中的函数不局限于计算 –计算类,如打印阶乘表的程序…… –判断推理类,如排序、查找……
问题的提出
读多少行的程序能让你不头疼? 假如系统提供的函数printf()由10行代码替换,那么你编过的程 序会成什么样子?
–实际上一个printf()有上千行代码 main()中能放多少行代码? 如果所有代码都在main()中,怎么团队合作? 如果代码都在一个文件中,怎么团队合作?
C程序的存储类别 – auto型(自动变量) – static型(静态变量) – extern型(外部变量) – register型(寄存器变量)
变量的存储类型( Storage Class)
变量的生存期(Lifetime )
The lifetime of a variable is the period of time during which memory is allocated to the variable
c语言程序设计(第3版)的习题答案
c语言程序设计(第3版)的习题答案c语言程序设计(第3版)的习题答案本文为《c语言程序设计(第3版)》中的习题答案汇总,旨在帮助读者更好地理解和掌握该教材。
以下是各章节习题的详细解答:第1章:计算机概述习题1:答案:计算机是一种能够接受输入数据、对其进行逻辑和算术运算,并产生输出结果的电子设备。
习题2:答案:计算机主要由中央处理器(CPU)、主存储器、输入设备和输出设备四个主要部分组成。
......第2章:c语言概述习题1:答案:C语言是一种通用的高级编程语言,由贝尔实验室的Dennis Ritchie于1972年开发。
习题2:答案:C语言的特点包括高效性、可移植性、灵活性和丰富的操作符与控制语句。
......第3章:数据类型、运算符和表达式习题1:答案:C语言中的基本数据类型包括int、float、double、char等。
习题2:答案:C语言中的运算符包括算术运算符、关系运算符、逻辑运算符等。
......第4章:程序控制结构习题1:答案:C语言中的程序控制结构主要包括顺序结构、选择结构和循环结构。
习题2:答案:顺序结构是指程序按照语句的顺序依次执行,没有分支和循环。
......第5章:函数习题1:答案:C语言中的函数由函数头和函数体组成。
习题2:答案:函数的定义包括函数名、返回类型、参数列表和函数体。
......第6章:数组和字符串习题1:答案:数组是一组相同类型的数据元素的集合。
习题2:答案:C语言中的字符串是以空字符'\0'结尾的字符数组。
......第7章:指针习题1:答案:指针是用来存储另一个变量的地址的变量。
习题2:答案:指针变量可以通过取地址运算符(&)获取普通变量的地址。
......第8章:结构和共用体习题1:答案:结构是由不同数据类型的成员组成的复合类型。
习题2:答案:共用体(union)是一种特殊的数据类型,它可以存储不同类型的数据,但在同一时间只能存储其中的一种。
C语言程序设计(第3版)何钦铭-颜-晖-第5章--函数
第5章函数【练习5-1】使用函数求1到n之和:输入一个正整数n,输出1〜n之和。
要求自定义和调用函数sum(n)求1〜n之和。
若要计算m〜n(m<n)之和,又该如何定义函数?试编写相应程序。
解答:#include<stdio.h>intsum(intn);intmain(void){intn;intsum;printf("Entern:")scanf("%d",&n);printf("sum=%d\n",sum(n));return0;}intsum(intn){intresult,i;result=0;for(i=1;i<=n;i++)result=result+i;returnresult;}若要计算m〜n(m<n)之和,则需要在main()中定义2个变量m和n:scanf("%d%d",&m,&n);printf("sum=%d\n",sum(m,n));同时在函数定义时需设置2个形参:intsum(intm,intn){intresult,i;result=0;for(i=m;i<=n;i++)result=result+i;returnresult;}【练习5-2】使用函数找最大值:输入2个数,输出其中较大的数。
要求定义和调用函数max(a,b)找出并返回a、b中较大的数。
试编写相应程序。
解答:#include<stdio.h>doublemax(doublea,doubleb);intmain(void)inta,b;printf(“Inputaandb:”);scanf("%lf%lf",&a,&b);printf("max=%lf\n",max(a,b));return0;}doublemax(doublea,doubleb){if(a>b)returna;elsereturnb;}【练习5-3】数字金字塔:输入一个正整数n,输出n行数字金字塔。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
<函数体>:函数体由一对花括号“{ }”括起,它由 变量说明语句和执行语句序列组成。右花括号的后 面 不能有分号。 <返回值>:当函数要返回值时,必须通过return语句 返回。格式为: return (表达式); 表达式的类型应该和函数的类型一致,return后 的 括号可有可无。
例:理解如下函 数的定义。 int pf( int x) { int a; a=x*x; return(a); }
pf为函数名,执行后的返回值是int 型的。它有一个int型的参数,名为 x。在函数体里,说明一个变量a,x 的平方值存放在它里面。最后由 “return(a);”语句将a中的内容返 回。 该函数只是给出计算一个整型变量 平方值的抽象方法。因此,它自己 不能独立运行,必须由调用者(比如 函数main() )通过调用语句,把要计 算的对象传递给它。
void main() { int a, b, c, m; int max(int x1,int x2,int x3); printf ("Please enter three integers:"); scanf ("%d%d%d", &a, &b, &c); m = max (a, b, c); printf ("max = %d\n", m); }
5.3 函数的参数传递
函数调用时,调用者通过实参把所需加工的数 据传递给被调函数。被调用者用相同类型的形参 接收传递过来的数据,并对其进行加工处理。被 调函数可以通过return()语句向调用者返回数据。 (1)参数是普通变量时的数据传递过程 当调用者与被调用者之间是以普通变量作为参 数进行数据传递时,调用者是把实参变量的值赋 给被调用者的形参变量的。
如果使用在前,定义在后,必须用extern进行引用声 明。 ②在使用另一个源程序文件中定义的外部变量,必 用extern声明后才能使用。 ③当全局变量和局部变量同名时,在局部变量的作 用范围内,局部变量起作用,全局变量被屏蔽。 (2)静态全局变量 当用static定义全局变量时,该全局变量不允许其
函数调用的功能: 实参向形参传递数据。 为参数和函数体内的变量分配内存空间。 中断当前函数执行,把执行流程转向被调用函 数 的入口,执行被调用的函数。
例:编写一个求三个数中最大值的函数,供 main()函数调用。
#include "stdio.h" int max (int x1, int x2, int x3) { int temp; if (x1 > x2) temp = x1; else temp = x2; if (temp < x3) temp = x3; return (temp); }
静态变量具有永久性:进到说明它的函数里, 它 就存在可用;出了它的作用域,它虽不能使用了 (因 它是局部变量,别的函数是不能用它的),但它仍 然 存在(即它仍占据着分配给它的存储区)。 (3)寄存器变量 使用register定义的局部变量,称为寄存器变量。 寄存器变量占有CPU的通用寄存器,而不占内存单
5.4 函数的嵌套调用和递归调用 (1)嵌套调用 在C语言中,函数不可以嵌套定义,但可以嵌套 调 用。在调用一个函数时,这个函数又调用其它的函 数,就称为函数的嵌套调用。
main( )函数 #include <stdio.h> …… main( ) { …… …… a=fl(……); …… …… }
程序如下: #include “stdio.h” float ff(int n) { long f; if (n<0) printf(“n<0 data error!”); else if (n=0||n==1) f=1; else f=ff(n-1)*n; return f; }
main() { int n; long y; printf(“ input a number”);
(2)函数的声明与调用 ●函数的声明 C语言总是遵循“先声明后使用”的原则。因此 在 调用一个函数前,应在调用函数中,先对被调函数 进行声明,然后再调用。不过,只要在编写程序 时,注意安排被调函数和调用函数的位置,可以省 略对被调函数的说明。 声明格式:<函数类型> <函数名>(形参列表); 例:int pf(int x);
f1( )函数 int f1(……) { …… …… f2(……); …… …… }
f2( )函数 char f2(……) { …… …… return(……) ; }
(2)函数的递归调用
如果在一个函数的调用过程中又直接或间接地 对自己进行了调用,这样的调用形式就是函数的 递归调用,这个函数就称为递归函数。 例如:利用递归函数计算n!的阶层。
实参变量和形参变量占用的是内存中不同的存储 区,被调函数对形参的加工,是在形参变量自己的存 储区里进行的,所以不会去改变和影响到实参变量。 被调用者如果要返回信息给调用者,只能通过 return语句,不能借助于形参变量或实参变量。所以 ,称这种数据传递是“单向的”。 (2)参数是指针(地址)时的数据传递过程 调用者和被调用者通过共同指向的存储区,“双向 地”传递了信息:调用者通过该区,把要加工的信息 传递给被调用者;被调用者又通过该区,将加工完的 结果传递给调用者。
就可直接调用了。用户自己编写的函数,是“用户函 数”。用户函数事先并不存在,所以在使用前,必须 先进行定义。 ②有返回值函数和无返回值函数。函数被调用执行 后,返回一个执行的结果给主调函数,则这个函数就 称为“有返回值函数”。否则就称为“无返回值函 数”, 对于无返回值的函数,应说明其类型为空类型void。 ③有参函数和无参函数。有时被调用函数需从调用 函数那里接收传递过来的数据信息,这些信息就被称
(2)局部变量 在某函数(或复合语句)里面定义的变量,称为“局 部变量”,它只能在说明它的范围内使用。即凡在 一 对花括号内说明的变量,就是局部变量,它只能在 该 括号内使用。出了这个括号,该变量就不能使用了。 作为函数的形参。这类变量也是局部变量,其作 用就是用于接收调用者传递过来的实参数据。越出 了 函数范围,该变量就不能使用了。
{ int i;
for (i=1;i<=5;i++) Printf(“%d!=%d\n”I,fact(i)); }
return t;}
C语言把用户执行程序所占用的内存空间分为3 部 分:程序代码区、静态变量存储区和动态变量存储 区。静态变量存储区中的变量在编译时创建,在程 序结束时才被撤销。全局变量和静态变量放在该区 ,在整个程序执行期间它们始终存在。而存储在动 态存储区中的变量,在程序的执行过程中根据需要 创建,在运行完所在域后即被撤销,它们是动态存 在的。局部变量和形参就分配在动态存储区。
scanf(“%d”,&n);
y=ff(n); printf(%d!=%d”,n,y); }
5.5 变量的作用域
5.5.1 问题及分析 写一个函数,送入圆的半径r后,得到圆的半径 及圆的周长。 5.5.2 示列程序 例5.11:编写程序,利用全局变量来完成一个函 数,输入圆的半径r后,得到圆的面积及圆的周长 的程序。
为参数。有参数的函数,称为“有参函数”,否则称 为 “无参函数”。 5.2 函数的定义和调用
(1)函数的定义
函数定义的一般格式是: <函数类型> <函数名> (<形式参数表>) { <函数体> }
<函数类型>:所定义函数执行完后返回结果的数 据类型,它可是基本数据类型,也可是指针型的。若 一个函数在执行后不返回任何结果值,那么其<函数类 型>应指定为void。若定义函数时,省略了<函数类 型 >,那将默认为是int的。 <函数名>:是所定义函数的名称,它可是任何合 法的标识符。注意,在一个程序中,函数名必须是唯 一的,别的函数都通过函数名来调用函数。
<形式参数表>:是括在圆括号里的、由“<类 型 ><参数>”对组成的参数表,每对间用逗号隔开。 <参数>是变量名,<类型>给出后面那个<参数 >的数据类型。形式参数表中列出的形式参数,简 称“形参”。被调函数通过这些形参,接收从调用 函 数传递过来的数据。无论所定义的函数有无参数, 函数名后的圆括号都不能省略。
(3)变量的作用域 在C语言中,称一个变量的作用范围为“变量的 作 用域”。由于每个变量都有自己的作用域,因此在 不 同函数内说明的局部变量可使用相同的变量名,类 型也可以不一样,它们不会因为名字相同而互相干 扰。 C语言规定,在一个源程序文件中,当所说明的 全局变量与某个函数内说明的局部变量同名时,那 么在该局部变量的作用域,全局变量就不起作用。
间,提高了程序的执行效率。所以,那些被频繁使 用而占用字节数又不多的变量,适合定义为寄存器 变量。 5.6.4 全局变量的存储类型 全局变量有两种存储类型:外部变量(extern)和 静态全局变量(static)。 (1)外部变量 在函数之外定义的变量,就叫外部变量。引用这
种外部变量时,要用extern加以说明。 定义外部变量的格式为: [extern] 类型 变量名[=初始化值]; 定义在函数外的变量都是外部变量,extern可以 缺省,当初始化值缺省时,系统会自动为其赋初值。 引用外部变量的声明格式为: extern 类型 变量名 注意: ①在同一个源文件中使用外部变量时,
●函数的调用 没有返回值的函数,是以函数调用语句的方式进 行调用的。即:<函数名> (<实际参数表>);pok(); 注意,这是一个语句,必须要以分号结尾。 有返回值的函数,是以函数表达式的方式调用的。 即:<函数名> (<实际参数表>),例c=max(a,b) 无论是有返回值还是没有返回值,函数调用时在 <实际参数表>中列出的实参,必须与被调函数在 定义中<形式参数表>里所列的形参个数相等、类型 相符、次序相同,各实参之间仍以逗号为分隔符。