第5章函数(C语言程序设计)
C语言程序设计(第3版)何钦铭-颜-晖-第5章--函数
第5章函数【练习5-1】使用函数求1到n之和:输入一个正整数n,输出1~n之和。
要求自定义和调用函数sum(n)求1~n 之和。
若要计算m~n(m<n)之和,又该如何定义函数?试编写相应程序。
解答:#include <stdio.h>int sum(int n);int main(void){int n;int sum;printf("Enter n:")scanf("%d", &n);printf("sum = %d\n", sum(n));return 0;}int sum(int n){int result, i;result = 0;for(i = 1; i <= n; i++)result = result + i;return result;}若要计算m~n(m<n)之和,则需要在main()中定义2 个变量m 和n:scanf("%d%d", &m, &n);printf("sum = %d\n", sum(m, n));同时在函数定义时需设置2 个形参:int sum(int m, int n){int result, i;result = 0;for(i = m; i <= n; i++)result = result + i;return result;}【练习5-2】使用函数找最大值:输入2个数,输出其中较大的数。
要求定义和调用函数max(a, b)找出并返回a、b 中较大的数。
试编写相应程序。
解答:#include <stdio.h>double max(double a, double b);int main(void){int a, b;printf(“Input a and b:”);scanf("%lf%lf",&a, &b);printf("max= %lf\n", max(a, b));return 0;}double max(double a, double b){if(a > b)return a;elsereturn b;}【练习5-3】数字金字塔:输入一个正整数n,输出n行数字金字塔。
C语言 函数
1. 函数声明的一般形式:
类型说明符 函数名([类型1 形参1,类型2 形参2,…]);
▪ 编译系统只检查函数类型、函数名、形参 类型和形参个数,不检查形参名。
➢ 因此,函数声明可省略形参名:
类型说明符 函数名([类型1,类型2…]);
➢ 以下两个函数声明语句 等价:
int min(float x,float y); int min(float,float);
}
}
5.2.4 函数原型
▪ 当被调函数位于主调函#in数clud后e 面<st时dio,.h>需要在 主调函数中对被调函数v{ oid进m行ain声() 明。
int min(float x,float y); int m; float a,b; scanf("%f,%f",&a,&b); m=min(a,b); printf("Min is %d\n",m); } int min(float x,float y) { return x<y?x:y; }
与函数的类型不一致,{前者将被自动转换为后
者的类型。
int m; float a,b;
scanf("%f,%f",&a,&b);
m=min(a,b);
printf("Min is %d\n",m);
}
3.函数调用的一般形式 函数名(实参表列);
A.说明: (1)如调用无参函数,()也不能省略。 (2)如实参表列含多个实参,参数间用逗号
第5章 函数
▪ 函数是C程序的基本组成单位。
▪ 使用函数能够实现模块化程序设计:
➢ 程序设计时往往把一个大的问题分解成若干小 的且易解决的问题
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 函数的分类
第5章 函数与带参数宏 《C语言程序设计及应用教程》课件-PPT课件
5.2 函数的嵌套与递归调用
函数的嵌套调用
不允许嵌套定义,函数间平行的、独立。 C中的函数:
允许嵌套调用。
main( ) 调用函数a 结束
a函数
调用函数b
b函数
【例5-7】 输入两个整数,求平方和
#include <stdio.h>
int fun1(int x,int y)
int fun1(int x,int y);
斐波那契数列");
for(i=0;i<N;i++)
{
printf("%d\t",iF[i]);
if((i+1)%10==0)
printf("\n");
}
printf("\n");
}
int Sum(int iF[],int n); void main() { int i,Fibonacci[N],m,n; //生成斐波那契数列 CreateFibonacci(Fibonacci); //输出斐波那契数列 PrintFibonacci(Fibonacci); //求数列前n项的和 printf(" 请输入要求和的项数 n(n<%d): ",N); scanf("%d",&n); m=Sum(Fibonacci,n); printf("\n 斐波那契数列前 %d项的和:%4d\n",n,m);}
第5章 函数与带参数宏 ?C语言 程序设计及应用教程?课件
5.1 函数的声明、定义与调用
5.1.1 函数的声明与定义 5.1.2 函数调用 5.1.3 函数参数传递 5.1.4 主函数中的参数
第5章 函数
5.3函数的调用
在一个源程序中,如果调用的是标准函数, 则需在调用之前用#include命令将对应的头文 件包含进来;如果调用的是用户自定义函数, 则需将被调用的函数放在主调函数之前,否 则就需要在主调函数的声明部分加入被调用 函数的原型声明。
5.3.1 函数的声明
1. 函数声明的一般形式有两种: (1)函数类型 函数名(参数类型1, 参数类型 2, ……); (2) 函数类型 函数名(参数类型1 参数名1, 参 数类型2 参数名2, ……); 两种形式是的等价的。如: float add(float,float); 等效于: float add(float x,float y);
3. 从主调函数和被调函数之间数据传送的角度看,又 可分为: (1) 无参函数 函数定义、函数说明及函数调用中均不带参数。主 调函数和被调函数之间不进行参数传送。如上述程 序中的pline()函数、word()函数只是输出字符。 (2) 有参函数(带参函数) 在函数定义和函数说明时都带有的参数,称为形式 参数(简称为形参)。函数调用时所给出的参数, 称为实际参数(简称为实参)。进行函数调用时, 主调函数将把实参的值传送给形参,供被调函数使 用。
运行结果如图所示。
5.3.4 函数的嵌套调用
一个函数内不能定义另一个函数。但在函数调用时,可以嵌 套调用,即在调用一个函数的过程中,又调用另一个函数。
【例5.7】用调用函数求s=(12)!+(22)!+(32)!的 值,并在主函数中输出结果。 本题可编写两个函数,一个是用来计算平方 值的函数f1,另一个是用来计算阶乘值的函 数f2。主调函数先调f1计算出平方值,再在f1 中以平方值为实参调用 f2,计算其阶乘值, 然后返回f1,再返回主调函数,在循环过程 中计算累加和。
C语言程序设计-第5章全解
函数返回的值,程序可以使用它, 也可以不使用它
while(…) { getchar(); c=getchar(); … } /* 返回值不被使用 */ /* 返回值被使用 */
2018/10/21 华中科技大学计算机学院C语言课程组 18
5.2.1
函数的定义
函数定义的一般形式为: 类型名 函数名(参数列表) { 声明部分 语句部分 }
2018/10/21 华中科技大学计算机学院C语言课程组 19
类型名说明函数返回值(即出口参数)的数据类型 (简称为函数的类型或函数值的类型),可以是除 数组以外的任何类型。当返回值类型为void,函数 将不返回任何值。 参数列表说明函数入口参数的名称、类型和个数, 它是一个用逗号分隔的变量名及其类型列表,它描 述了在调用函数时函数所接收的参数。一个函数可 能没有参数,在没有参数的情况下,参数列表说明 为void,否则必须明确地列出每一个参数的类型。
16
图5.1 C语言程序的基本结构
2018/10/21
华中科技大学计算机学院C语言课程组
17
5.2
函数的定义与函数的声明
程序中若要使用自定义函数实现所需的功能, 需要做三件事: ① 按语法规则编写完成指定任务的函数,即 定义函数; ② 有些情况下在调用函数之前要进行函数声 明; ③ 在需要使用函数时调用函数
2018/10/21
华中科技大学计算机学院C语言课程组
9
在函数的顶端用“/*……*/”格式包含的部分是函 数头部注释,包括函数名称、函数功能、函数参数、 函数返回值等内容,如有必要还可增加作者、创建 日期、修改记录(备注)等相关项目。虽然函数头 部注释在语法上不是必需的,但可以提高程序的质 量和可维护性,在程序设计时要遵从这一编程规范。 GetNum是函数名,其后的void说明函数调用时不 接收任何参数,即没有入口参数,函数执行完应该 返回所产生的随机数,即该随机数是函数的出口参 数,函数名前的int说明出口参数的类型为整型。 函数体内的rand是接口stdlib.h中的一个函数,它 返回一个非负并且不大于常量RAND_MAX的随机整 数,RAND_MAX的值取决于计算机系统。 MAX_NUMBER是用#define定义的符号常量,其 值为1000。当执行return语句时,其后表达式的值 被带回到调用函数中。
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章
第5章 选择结构程序设计
/*程序 5 - 3, 求两个数的最大值、 最小值*/ main( ) { float x, y; float max, min; printf(″请输入两个数x, y: ″); scanf(″%f, %f″, &x, &y); if (x>y) {max=x; min=y; } else {max=y; min=x; } printf(″max=%6.2f, min=%6.2f\n″, max, min); } 输入数据: 1.2, 2.54 运行结果: max= 2.54, min= 1.20
第5章 选择结构程序设计
5.1.3 多分支if语句
多分支if语句不是一条具体的语句,它通过if语句的嵌套实
现。其一般形式为: if (条件表达式1)
if (条件表达式2) 语句1
else 语句2 else if (条件表达式3) 语句3 else 语句4
第5章 选择结构程序设计
T T
条件表达式1 条件表达式2
}
第5章 选择结构程序设计
例 5 — 7 将例 5 — 5 用switch语句实现。
switch ((int)(cj/10)) { 10: 9: ch=′A′; break; /*注意选择表达式的构造*/
8: ch=′B′; break;
7: ch=′C′; break; 6: ch=′D′; break;
第5章 选择结构程序设计
例 5 –3 输入两个数, 求两个数的最大值、最小值。 数据分析:
输入量: 两个数x、 y, float
C语言程序设计教程 第五章 课后习题参考答案
C语言程序设计教程第五章课后习题参考答案一、选择题1. B2. A3. C4. B5. D二、填空题1. while2. binary3. 164. 35. continue6. global三、判断题1. 错误2. 正确3. 错误4. 错误5. 正确四、编程题1.```c#include<stdio.h>int main() {int num;printf("请输入一个整数:"); scanf("%d", &num);if (num % 2 == 0) {printf("%d是偶数\n", num); } else {printf("%d是奇数\n", num); }return 0;}```2.```c#include<stdio.h>int main() {int num1, num2;printf("请输入两个整数:");scanf("%d %d", &num1, &num2);printf("%d与%d的和为%d\n", num1, num2, num1 + num2); return 0;}```3.```c#include<stdio.h>int isPrime(int num) {int i;if (num <= 1)return 0;for (i = 2; i <= num / 2; i++) {if (num % i == 0) {return 0;}}return 1;}int main() {int num;printf("请输入一个整数:");scanf("%d", &num);if (isPrime(num)) {printf("%d是素数\n", num); } else {printf("%d不是素数\n", num); }return 0;}```4.```c#include<stdio.h>int factorial(int num) {int i, result = 1;for (i = 1; i <= num; i++) {result *= i;}return result;}int main() {int num;printf("请输入一个整数:");scanf("%d", &num);printf("%d的阶乘为%d\n", num, factorial(num)); return 0;}```五、简答题1. C语言逻辑与运算符(&&)短路特性是什么?答:C语言逻辑与运算符(&&)具有短路特性,即在进行逻辑与运算时,如果前一个表达式的值为假(0),则后面的表达式将不会被计算,整个逻辑与表达式的值直接为假(0)。
四川大学《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语言程序设计第5章“使用指针参数交换两个变量值”案例
使用指针参数交换两个变量值”案例C主讲教师崔玲玲 5.1 “【案例说明】用函数实现两个变量值的交换使其在主调函数和被调函数中的值一致。
要求用指针变量作为函数参数。
程序运行结果如图 5.1所示。
图 5.1 使用指针参数交换两个变量值【案例目的】 1 熟悉如何定义指针变量掌握将指针变量作为函数参数的方法。
2 掌握通过指针参数由被调函数向主调函数传递多个值的方法。
【技术要点】由于变量的值始终存放在内存单元中因此要交换两个变量的值只需交换这两个变量对应的存储单元的值即可这就需要知道两个变量的地址。
也就是说需要保证主调函数与被调函数中所要交换的两个数的内存单元是同一内存单元即传递的参数是内存单元的地址而不是内存单元中的值。
【相关知识及注意事项】1. 指针和地址2. 指针变量的定义及初始化3. 指针变量的赋值4. 指针变量的引用 5. 指针作为函数参数 5.2 “有序数列的插入”案例【案例说明】用指针法编程插入一个数到有序数列中。
程序运行结果如图 5.7所示。
图 5.7 有序数列的插入【案例目的】 1 熟悉如何定义指针变量掌握将指针变量指向一维数组元素的方法。
2 掌握如何在一个有序的数列中查找合适的位置。
3 掌握如何将一个数插入到一个有序数列中。
【技术要点】 1 有序数组中插入一个数的关键是找到该数据插入的位置然后将插入位置及其后的所有元素均后移一位在空出的位置放入待插入的数据。
例如在13、27、38、49、65、76、97这列有序数据中插入53这个数成为新的有序数列13、27、38、49、53、65、76、97。
2 定义数组时必须多开辟一个存储单元用于存放待插入的数据。
【相关知识及注意事项】1. 指针变量的运算 2. 指针与一维数组 5.3 “两个字符串首尾连接”案例【案例说明】编写程序将两个字符串首尾连接起来。
要求用字符指针变量处理。
程序运行结果如图 5.9所示。
图 5.9 两个字符串首尾连接【案例目的】 1 学会定义基类型为字符型的指针变量并将指针变量指向串首的操作。
第05章 函数
函 数
高 级 语 言 程 序 设 计 与 应 用 教 程
第11次课结束
函数调用
实 参可 以是常 量 、 变量、 表达式、函数等
函数名( 实参1,实参2,……,实参n ); 注意事项: (1) 实参列表中的实参必须与函数定义时的形参数量 相同、类型相符。 (2) 赋值对应关系: 实参1 -> 形参1 实参2 -> 形参2 …… 实参n -> 形参n (3)实参表求值顺序(即实参赋值给形参的顺序) TC、BC、VC均是自右向左,也就是说最右边的实参最 先赋值给最右边的形参, 最左边的实参最后赋值给最左边 的形参。
第 五 章 返回
void main ( ) { int a; 注意:对函数调用之前,必须要先声明或先 scanf ("%d", &a); while (a < 0) 定义,否则编译错! { showerror( ); scanf ("%d", &a); } 调用showerror printf ("sqrt(a) = %.2f\n", sqrt(a)); 函数 } void showerror( ) //函数的定义,无参数无返回值 { printf("input error!\n"); //函数体,没有声明变量 }
小写字符转换成大写字符
函 数
14
高 级 语 言 程 序 设 计 与 应 用 教 程
函数的调用 函数名( void ); 或 变量 = 函数名( ); 实例 【例5-2】反复计算幂函数,直到接受到一个回车符为止。
第 五 章
函 数
15
高 级 语 言 程 序 设 计 与 应 用 教 程
C语言课件-第5章 函数 湘潭大学上课课件
为什么要用函数
解决的方法:用模块化程序设计的思路
采用‚组装‛的办法简化程序设计的过程 事先编好一批实现各种不同功能的函数 把它们保存在函数库中,需要时直接用
为什么要用函数
解决的方法:用模块化程序设计的思路
函数就是功能 每一个函数用来实现一个特定的功能 函数的名字应反映其代表的功能
b
g h
c
i
为什么要用函数
可以使用库函数
可以使用自己编写的函数 在程序设计中要善于利用函数,可以减少
重复编写程序段的工作量,同时可以方便 地实现模块化的程序设计
C语言中的函数
0个或多个数据被传递
参数
函数体
至多一个数据或结构被返回
C语言中的函数
math.h中提供的函数(库函数)
double sqrt(double x)
//函数定义 int firstDigit (int num) { return (num % 10); }
digit = firstDigit (number); printf("\nLeast significant digit is: %d\n", digit); return 0; } // main
带参数的void函数:void getnum(int a) 有返回值但不带参数的函数:int caculate() 有返回值且带参数的函数:int max(int a,int b)
函数使用(调用)
greeting();
getnum(10); Result=caculate();
a
200 100
?
x
200 100
void TryToChange(int x) { x = x * 2; }
第5章 函数
第10页
上海师范大学 计算机系
5.3.2 函数调用
• C语言中,函数调用的一般形式为: 函数名([实在参数表]) 其中,实在参数表中,实参的个数与顺序必须与形参的个数 与顺序相同,实参的数据类型必须与对应的形参数据类型相 同或兼容。实参是有确定值的变量或表达式,各实参之间用 逗号分隔。对无参函数调用时,无实在参数表,但函数名后 的圆括号不能省略。 • 主调函数中可以用以下几种方式调用被调函数:
(1) 避免代码的重复。 (2) 便于结构化程序设计。
• 在C语言中可从不同的角度对函数分类:
(1) 从函数定义的角度看,函数可分为库函数和用户定义函数两种。 (2) C语言的函数兼有其它高级语言中的函数和过程两种功能,从这个角度 看,又可把函数分为有返回值函数和无返回值函数两种。 (3) 从主调函数和被调函数之间数据传送的角度看又可分为无参函数和有参 函数两种。
• 定义函数时应根据问题的需求,首先决定函数的类型并选定 一个函数名,然后决定形式参数的类型、个数和形参名,最 后在一对大括号内写函数体。在函数体中可以把形参当作是 已经被赋值过的变量那样使用。 • 可见,函数用来实现某一特定的功能,在设计函数时只有抽 象的功能要求,没有具体的数据,即不知道函数形参的具体 值,但是对这些形参所进行的操作却都是相同的。
2013年10月7日星期一 第5章 函 数 第7页 上海师范大学 计算机系
5.3.1 函数声明
• 在一个函数中要调用另一个函数时,需要具备以下条件:
(1) 被调用的函数必须是已经存在的函数(库函数或用户自己定义的函数)。 (2) 如果调用的是库函数,用#include将此库函数所需用到的有关信息包含 到本文件来。例如:#include <stdio.h> 其中“stdio.h”是一个头文件,在stdio.h文件中存放了有关输入输出库 函数的相关信息。 (3) 如果调用的是用户自己定义的函数,且该函数与主调函数在同一个文件 中,应在主调函数中对被调用函数进行函数声明。
《程序设计基础——C语言》 局部变量和全局变量(十)
p,q的作用范围
c1,c2的作用范围
活动:分析运行结果
int a = 3 , b = 5 ; max ( int a , int b ) { int c ; c= a > b ? a : b ; return ( c ) ; } main ( ) { int } a = 8 ; printf ( “%d ” , max ( a , b )) ;
结果:8
全局变量应用
int p=1,q=5; 扩 float f1(int a) 展 后 { int b,c; c1,c2 extern char c1,c2; ……. 的 } 作 int f3() 用 {….. } 范 围 char c1,c2; char f2(int x,int y) { int i,j; …… } main() { int m,n; ……. }
全局变量示例
int a = 3 , b = 5 ; ②void gx( ) main( ) { 、 { extern int x,y; printf(“%d , %d\n “ , a , b ); 有 } x=135; 效 fun(void) 范 { … y=x+20; 围 x 、 y 是全局变量 printf(“%d , %d \n “ , a , b ) ; … printf(“%d”,y); } ①
a b
}
全局变量和局部变量的应用
全局变量和局部变量同名时,在局部变量的作用 范围全局变量无效。
int a=3,b=5; max(int a, int b) { int c; c=a>b?a:b; return(c); } main() { int a=8; printf("max=%d",max(a,b)); } 运行结果:max=8
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
{ … z=f(x); … }
(n 0,1) (n 1)
long f ( int n ) { long y; if (n==0||n==1) y= 1; else y= n*f(n-1);自己调自己 return y; }
第5章 函数 n!递归完整演示过程:
释放变量 3
释放变量 2
long fac ( int n ) long fac ( int n ) 声明函数原型 { long f; { long f; long fac ( int n ); if (n==0||n==1) if (n==0||n==1) f=1; f=1; main ( ) else 2*fac(1); else 3*fac(2); n f=n*fac(n-1); { int n; f=n*fac(n-1); 3 f=2*1 f=3*2; return f; 释放变量 return f; } scanf(“%d”,&n); 1 } 3!=6 long fac ( int n ) printf(“%d!=%d”, { long f; 1 n, fac(n) ); if (n==0||n==1) 3 6 f=1; } return f; }
图书管理程序的C语言实现示意图 每个模块编写成一个函数 借书模块函数( ) { …具体实现语句 } 还书模块实现函数( ) { …具体实现语句 } 馆藏图书模块函数( ) { …具体实现语句 } 图书查询模块函数( ) { …具体实现语句 }
第5章 函数
主控模块实现函数: main( ) {
调用只是一条语句
s= sum( 2,3,4 );
z= max( 5,10 ); s= 5* f( 3,4,2 );
scanf( “%d”,&a );
printf( “x=%d”,x);
printf( “x=%d”, max( 5,10 ) );
第5章 函数
函数的调用过程
被调用函数 a=x; b=y float f2 ( int a, int b)
} 0
else return -1;
}
【例5.4】写出程序运行结果
第序有什么关系? 主调函数写在前? 还是被调函数写在前? 函数的书写顺序有两种类型: 1. 先定义,后调用 2. 先调用,后定义 C语言规定函数的作用域 从定义位置开始,直到源文件的末尾: 书写顺序不同,函数的作用域不同
{
主调函数
f1 ( ) { … 调用函数语句 s= f2( x, y) … }
…
return … ;
}
第5章 函数
【例5.2】求长方形面积 main ( ) 释放main函数内变量 float area ( int a, int b) { float s; s=a*b;
{
20
5
s 100
float length,with, s;
1 (n 0,1) n! n * (n 1)! (n 1)
递归函数内部对自身的每一次调用都会导致一个 与原问题相似而范围要小的新问题。 直到停止递归函数的调用。
构造递归函数的关键在于寻找递归算法和终结条件。
第5章 函数
2. 递归函数的设计
【例5.7】
1 n! n * (n 1)!
第5章 函数
函数先调用,后定义的表现形式: 修改:在调用函数前,声明函数的原型 float max ( int a,int b ); float max ( int ,int ); float max ( ); 特殊:函数类型是int,不需声明
main() { 放主调函数内也可 int x,y,z; scanf(“%d,%d”,&x,&y); z=max(x,y); printf(“maxnum=%d”,z); } 大部分情况下编译通不过 float max ( float a,float b ) { if(a>b) return a; else return b; }
第5章 函数
5.4
函数的递归调用
在调用一个函数的过程中,又出现直接或间接地调 用该函数本身。这种调用方式称递归调用 实现递归调用的函数称为递归函数。 直接调用自己称为直接递归,间接调用自己称为间 接递归。
第5章 函数 1.递归函数的特点
递归函数常用于解决那些需要分多次求解, 并且每次求解过程基本类似的问题。
函数体 : {默认为int型: return是函数的逻辑结尾, 函数执行后会获得一个值 数据类型 : extern或static 函数名是一个标识符,它的命名规则同变量相同 函数的返回值(函数的值)可以是常数、变量或表达式 形式参数(简称形参 )的说明形式如下: 存储类型 } 通常把函数名和形参的说明部分称为“函数头”, 可以出现多条,但只能执行一条 可以是空函数,只写出函数的形式,先考虑如何调用 无值类型表达式; extern 外部函数(默认), (表达式); return :void 数据类型 形式参数1,数据类型 内部函数 return static 形式参数2,
long cmn(int m,int n) {long fc; long fc 6 m n fc=fac(m); fac(m) 3 2 6/2 fc=fc/fac(n); fc/fac(n) fc fc=fc/fac(m-n); 3 6 return fc; 3/ 1 }
long fac(int x) long fac(int x) long fac(int x) i x i y x {int i; int x i 1y {int i; 3 2 2 long y; 3 4 3 2 1 6 2 1 long y; for(i=1,y=1;i<=x;i++) y for i=1,y=1;i<=x;i++ for(i=1,y=1;i<=x;i++) for(i=1,y=1;i<=x;i++) for(i=1,y=1;i<=x;i++) y=y*i; y=1*1 *2 *3 y=y*i; y=y*i; y=y*i; return y; return y; } return y;
第5章 函数
函数的调用可以是嵌套的,即在调用一个函数的过程 中可以再调用另一个函数。C语言不允许嵌套定义, 函数的设计原则: 但可以嵌套调用。 【例5.6】计算组合数 函数内尽量最简
m! C n!*(n m)!
n m
封装性要好 不要输入输出语句 long fac(int x) { return
第5章 函数
【例】求两个数的最大值。
函数先定义,后调用的表现形式: max ( int a,int b ) { if(a>b) return a; else return b; } 编译时不会出现问题 main() { int x,y,z; scanf(“%d,%d”,&x,&y); z=max(x,y); printf(“maxnum=%d”,z); }
用花括号括起来的部分称为“函数体”。 回头再实现定义体 也可以没有return语句(void类型) 声明形参实际是定义变量,形参在函数体内不赋值! return ;
第5章 函数
5.3 函数的调用
函数名(实参表); 函数调用时的参数叫实际参数, 简称实参 实参和形参是一一对应的 实参以值的形式表现 形参以声明变量的形式表现
第5章 函数
C语言中,实参求值顺序不固定,T C从右向左。 int f(int a,int b) b a { if(a>b) main( ) { int i=2,p; i p
3
3
2
0
return 1;
else if(a==b)
return 0;
p=f(i,++i); f( 3, 3 ) 0 printf(“%d”,p);
第5章 函数
一个C语言程序由主函数和若干个(0个用户函数) 组成。 C语言中的函数没有隶属关系,即所有的函数都 是独立定义的,不能嵌套定义。 函数是通过调用来执行的,允许函数间互相调用, 也允许直接或间接的递归调用其自身。main函数可以调 用任何一个函数,而其他函数不能调用main函数。 主动调用其它函数的函数称为主调函数,被调用的函数 称为被调函数。 系统函数不需要定义,只要在使用时调用就可以了 如printf( ), scanf( )是系统函数 用户函数需要先定义,后调用,不调用是不执行的
scanf(“%f,%f”,&length,&width);
a 20
b 5
s return s; 100
} 释放函数内变量
s = area(lengh,width); s= 100 printf(“%5.2f”,s); }
20,5
100.00
第5章 函数
【例5.3】编写程序,计算3个不同时为0的整数之和。 int sum(int x,int y,int z) y z 释放main函数内变量 { x i j k s main(){ 20 0 -3 int i,j,k,s; 20 0 -3 17 int m; m scanf(“%d %d %d”,&i,&j,&k); m=x+y+z; if( !(i==0&&j==0&&k==0) ) 17 return m; 释放函数内变量 { s=sum(i,j,k); sum(i,j,k); } printf("sum=%d\n",s); } 20 0 -3 } sum=17
第5章 函数
第5章 函数
第5章 函数
5.1 C函数与C程序结构 C语言程序的基本单位是函数,而不是语句。 使用函数的目的是实现模块化程序设计 什么是模块化程序设计思想?