C语言 第7章 函数1
第7章 用户自定义函数
7.2 函数的定义
1.无参函数的定义
无参函数的定义形式为: 类型标识符 函数名() {
声明部分 执行部分 }
1)函数首部
类型标识符和函数名为函数首部。 (1)类型标识符指明了本函数返回值的类型。无参函数可以带 回或不带回函数值,但一般以不带回函数值的居多,此时函数 类型声明符可以写为void。
返回本章首页
7.5 函数的嵌套调用
C语言允许在一个函数的定义中出现对另一个函数的调用。 这样就出现了函数的嵌套调用,即在被调函数中又调用其它函数。 b函数⑤①⑨结束a函数③调用b函数⑦②⑧④⑥main函数图7_3 函数嵌套调用a函数 例如:图7_3中执行main函数中调用a函数的语句时,即转去执 行a函数,在a函数中调用b函数时,又转去执行b函数,b函数执 行完毕返回a函数的断点继续执行,a函数执行完毕返回main函 数的断点继续执行。
返回本章首页
7.2 函数的定义
3.带返回值的函数定义
带返回值的函数,函数体的执行部分必须通过return语句 给函数返回指定类型的值。
return语句的一般形式为: return 表达式; 或者为: return (表达式);
该语句的功能是计算表达式的值,并将该值返回给主调 函数。在函数中允许有多个return语句,但每次调用只能有一个 return语句被执行,因此只能返回一个函数值。在定义函数时指 定的函数类型一般应该和return语句中的表达式类型一致;如果 函数值的类型和return语句中表达式的值不一致,则以函数类型 为准。
#include<stdio.h> long f1(int p) { int k,r=0;
int f2(int); for(k=1;k<=p;k++)r=r+k; return f2(r); }
精品-清华大学C语言课件 第7章01 if语句的基本形式
【例7.1】 使用if语句模拟信号灯指挥车辆行驶。 在本实例中,为了模拟十字路口上信号灯指挥车辆行驶,要使用if语句进行判断信号灯的状态。如果
信号灯为绿色,说明车辆可以行驶通过,通过输出语句进行信息提示说明车辆的行动状态。
#include<stdio.h> int main() { int iSignal;/*定义变量表示信号灯的状态*/ printf("0代表红灯,1代表绿灯\n");/*输出提示信息*/ scanf("%d",&iSignal);/*输入iSignal变量*/ if(iSignal==1)/*使用if语句进行判断*/ { printf("信号灯是绿灯,车可以行驶\n");/*判断结果为真时输出*/ } return 0; }
在上面的代码中,如果if判断变量value的值为真的话,则执行if后面的语句块进行输出。如果if判 断的结果为假值,则执行else下面的语句块。 注意: 一个else语句必须跟在一个if语句的后面。
【例7.3】 用键盘输入三个数,输出三个数中最小的数 比较三个数值的大小,这三个数值由用户输入。首先比较两个数值的大小,然后将其中相对较小的赋
运行程序,显示效果如图7.3所示。
图7.3 完善if语句的使用 初学编程的人在程序中使用if语句时,常常会将下面的两个判断弄混,例如:
if(value){…}/*判断变量值*/ if(value==0){…}/*判断表达式的值*/
这两行代码的判断中都有value变量,value值虽然相同,但是判断的结果却不同。第一行代码表示判 断的是value的值,第二表示判断value等于0这个表达式是否成立。假定其中value的值为0,那么在第一 个if语句中,value值为0则说明判断的结果为假,所以不会执行if后的语句。但是在第二个if语句中,判 断的是value是否等于0,因为设定value的值为0,所以表达式成立,那么判断的结果就为真,执行if后的 语句。
C语言程序设计第四版_谭浩强7章
➢函数的功能
return z; }
函数体
函数首部,不是语 句,行尾无分号
精选课件ppt
函数的返回值,类 型与首部定义一致14
函数的定义
关于函数类型的说明
无返回值的函数类型为void; 有返回值的函数,其类型根据返回值 类型决定;省略类型时默认为int(建议 不要省略)
精选课件ppt
15
函数的调用
int main( )
{ int max(int a[ ],int n);
int x[6],i;
for(i=0;i<=5;i++)
scanf("%d",&x[i]);
printf("max=%d",max(x,6));
return 0;
}
实参为数组名
精选课件ppt
int max(int a[ ],int n) { int m,i; m=a[0]; for (i=1;i<n;i++)
float fac; fac=1; for(i=1;i<=n;i++)
fac=fac*i; return fac;
printf("c="); scanf("%d",&c);
}
sum=factorial(a)+factorial(b)+factorial(c);
printf("%d!+%d!+%d!=%.0f",a,b,c,sum);
函数1 函数2 函数3
函数1 函数2
精选课件ppt
34
变量作用域——局部变量和全局变量
第7章 函数(function)与过程(procedure)
Fun ction与 proced ure 之 间 的 差 异 在 于 :funct ion的 返 回 值 永 远 只 有 一 个 ,而 procedure的 返 回 值 却 可 以 不 只 一 个 。 Function 所 有 的 参 数 都 是 input 信 号 , 而 procedure的参数却可以是input、output,甚至inout。Function的返回值置于 参数声明之外,而procedure的返回值是放在参数声明之内的。图7-1所示即为上 面所述的差异。
library ieee; use ieee.std_logic_1164.all;
entity V7_1 is port(a,b : in bit; c : out std_logic);
end V7_1;
architecture a of V7_1 is
function bit2std(Inb : bit ) return std_logic is
还 有 一 点 就 是 在 子 程 序 中 所 有 的 语 句 都 是 像 在 process中 的 sequential logic, 所 以 在 第 6章 中 所 使 用 到 的 语 法 都 能 在 子 程 序 中 使 用 。 现 在 让 我 们 看 看子程序的特性。
第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章 函数与预处理命令
例如:求两个数的最大值。 int max(int x,int y) { int z; 没有形式参数 z = x > y ? x : y; 为无参函数 return( z ); }
龙诚数码:
9
形参也可以这样定义 int max(x,y) int x,y; { int z; z = x > y ? x : y; return( z ); }
龙诚数码:
【例7.1】求一个整数的立方。
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
a=9,b=5
14
龙诚数码:
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 } (空)类型。
计算机二级C语言第七章函数
C.int fun(int a[], int *, int);
D.int fun(int [], int *, int);
正确答案:A 【解析】C语言中,函数声明的函数名、返回值类型和参数列表必须与函数定义相同,其中参数列表中可以省略参 数名。题意中,fun()函数返回整型,三个参数分别是:整型指针、整型指针、整型,选项A中,第一个参数应该是 整型指针类型,第二个参数也应该是指针类型,错误;其他选项都正确,本题答案为A。
函数说明的一般形式如下: 类型名 函数名(参数类型1,参数类型2,……) 如: double sum( double, double );
也可采用下面的形式: 类型名 函数名(参数类型1 参数名1,参数类型2 参数名2,……) 如: double sum( double p, double q );
正确答案:A 【解析】数学库中定义了函数的名称、参数个数与类型、返回值类型与具体的函数体,A选项正确。编译预处理时, 预处理程序将查找指定的被包含文件,并将其复制到#include命令出现的位置上,B、C选项错误。不引用 math.h文件,文件编译时,编译器无法识别没有被定义的sin函数,D选项错误。
关于C语言函数说明的位置,以下叙述正确的是( ) A.在函数说明之后对该函数进行调用,编译时不会出现错误信息 B.函数说明可以出现在源程序的任意位置,在程序的所有位置对该函数的调用,编译时都不会出现错误信息 C.函数说明只能出现在源程序的开头位置,否则编译时会出现错误信息 D.函数说明只是为了美观和编译时检查参数类型是否一致,可以写也可以不写
C语言程序设计_课件_第七章(适于清华谭浩强版)
注意:
(1) return(表达式); 和return 表达式;都 是正确的。 (2) 带返回值的函数只能返回一个值。 (3) 在函数定义时,允许使用多个return语句, 但是应尽量在末尾使用一个return语句。 (4) return语句中的表达式与函数的返回值类 型不匹配时,以函数定义时的返回类型为准。
问题的提出 函数基础 函数的定义 函数说明 函数调用 参数传递 程序举例 递归调用 变量的存储类别
7.1 问题的提出
例6.20它可以解决的问题有: ①输入若干个学生的姓名、某课程的期中 和期末成绩,并计算每个学生的总评成绩; ②计算总评成绩的分数段情况; ③输出所有学生的姓名、期中、期末和总 评成绩; ④查询某个学生的总评成绩。
函数调用时需要传递数据。调用函数要将 实参的值传送给被调用函数的形参。 若函数定义首部是 double power(double x,int n) /*函数定义 */ 调 用 形 式 是 可 以 是 power(y,m) , 也 可 以 是 power(3.0,5)。 其中,x和n是形式参数,y和m是实际参数,3.0 和可以是一个变量 名,因为变量名也构成一个表达式,形式参数只 能是变量名。当实际参数是变量名时,它与形参 的名称既可以相同,也可以不同,只是要注意, 在函数定义内部应该使用形参的名称。 (2) 实际参数与形式参数的参数个数、数据类型 和顺序都应该一致,如果数据类型不一致,系统 将按照自动转换规则进行转换。
7.3 函数的定义
7.3.1 函数的定义形式 在C语言中函数定义的形式有两种。
第一种:
函数返回值的数据类型说明 函数名称(带有类型说明的参数表)
{
函数内部数据说明; 语句;
}
第二种:
C语言程序设计基础 第7章
模块化程序设计的基本要点是贯彻“自顶向下,逐步细 化”的思想方法,即将一个复杂功能的编程问题,划分成若 干个功能相对简单的子问题。这种划分可以逐层进行,直到 便于编程为止。在C语言中,一个模块的功能由一个函数来 实现。顶层函数是主函数main( )。功能模块与C语言函数的 关系如图7.1所示。
图7.1 模块与函数
第7章 函数——模块化程序设计方法的实现
7.1 模块化程序设计方法与函数 7.2 函数的定义 7.3 函数的调用 7.4 函数调用的条件与函数声明 7.5 函数的嵌套调用和递归调用 7.6 变量的作用域与函数间的数据传递 7.7 用函数实现模块化程序设计 实训任务十三 熟悉函数的功能及其使用方法 实训任务十四 学习模块化程序设计的方法
② 函数功能实现部分,是一个程序段,要依据实现某 种功能的算法进行设计。
③ 函数体最后使用一个“return(返回值);”语句,括 号中的返回值是一个需传带给主调函数的数据对象。如果没 有返回值,可以不要这个语句。VC++ 6.0系统中提倡在 main( )函数体后使用一个“return 0;”语句,表示正常返 回系统,否则会出现警告。如果函数体仅是一对花括号,没 有任何语句,就是空函数。空函数一般是无参函数。
7.2 函 数 的 定 义
怎样定义函数?定义函数要考虑哪些问题?
定义函数要解决两个方面的问题:一是函数间的接口问 题,二是功能实现问题。接口问题包括如何被上层函数调用 ,调用时需传递什么数据,调用返回时需传带什么数据。功 能实现问题就是如何实现模块的过程算法。
函数定义的一般形式为
基类型符 函数名(类型符形式参数 1,类型符形式参数 2,…) {
函数体内数据对象定义或声明部分; 函数功能实现部分; return(返 回值); }
C语言程序设计知识点—第7章 函数
第 7 章:函数
主讲教师:杨剑
1. 本章目标
熟练掌握函数的定义与调用方法 理解函数的定义、声明和调用的区别 理解函数原型、实参、形参和函数的返回值 了解函数的嵌套调用和递归调用的方法 掌握数组做为函数参数的使用方法 理解变量的作用域和存储方法
2. 函数机制的优点
~6~
C 语言程序设计知识点
主讲教师:杨剑
[练习]若各选项中所用变量已正确定义,函数 fun 中通过 return 语句返回一个函数值,
以下选项中错误的程序是( )
A.main()
{……x=fun(2,10); ……}
float fun(int a,int b){……}
B.float fun(int a,int b){……}
int data; scanf(“%d”,&data); printf(“%d”,add(data)); return 0;
~5~
C 语言程序设计知识点
主讲教师:杨剑
} int add(____②_____) {
int i,sum=0; for(i=1;i<=n;i++)
sum=sum+i; _______③__________ } 答案: ①int add(int); ②int n ③retrun sum;
{
printf(“%d\n”,F(3+5));
}
[练习]程序运行后的输出结果是( )
A.192 B.29
C.25
D.编译出错
答案:D
在 C 语言中,函数返回值的类型最终取决于( )
A.函数定义时在函数首部所说明函数类型
B.return 语句中表达式值的类型 C.调用函数时主调函数所传递的实参类型
第七章(c语言谭版)函数
调用a
调用b
}
}
}
例: 用弦截法求方程的根。
x3–5x2+16x–80=0 方法如下: (1) 取两个不同点x1、x2,如果f(x1)和f(x2)符号相反, 则(x1,x2)区间内必有一个根。如果f (x1)与f (x2)同 符号,则应改变x1、x2,直到f (x1)、f (x2)异号为 止。注意x1、x2的值不应差太大,以保证(x1, x2) 区间只有一根。
float x1, x2; { int i; float x, y, y1; y1=f(x1); do { x=xpoint(x1, x2);
y=f(x);
if (y*y1>0) /*f(x)与f(x1)同符号。*/ {y1=y; x1=x;} else x2=x; } while (fabs(y)>=0.0001); return (x); }
个return.
返回值类型为函数类型。 一般return中的返
回值类型应与函数定义时的类型一致, 不一致时,
以函数定义类型为准。
5. 调用函数应对被调用函数的返回值类型作出说 明:(函数名相当于一变量,但应有所区别)
类型符 函数名( );
它不同于函数的定义(功能定义) 例: 求二实数之和 main ( ) { float add( ); float a, b, c;
hanoi(n, one, two, three)
表示n个盘子从one塔借助于two塔(空)移至three塔。 调用时塔用字符常量'A' ,' B ', ' C '表示。
§7.5 数组作为函数参数
分为两种情况: 1. 数组元素作为实参
计算机等级考试 C语言 第7章C语言 函数
/* 函数功能: 用迭代法计算n!
返回值函数类入型口参数:函整数型名变说量n明表示阶乘的形阶参数表,函
函数返回值: 函返数回的n!功的能值
数入口
*/
long Fact(int n) /* 函数定义 *函/ 数内部可以定义
{
只能自己使用的变
int i;
量,称内部变量
long result = 1;
for (i=2; i<=n; i++)
2/51
问题的提出
此前,我们所有的代码基本上都是放在main函 数中,这对于一个小的问题来说没问题,但如 果一个问题较大,里面涉及到成百上千个变量 ,将所有代码放在main函数里面显然是非常糟 糕的事情。
我们可以将一个大的问题分解成一个一个的小 问题,每个小问题放在一个函数里面,最后在 main函数里整合。这种思想实际上就是所谓的 “分而治之”。
printf("Input data error!\n"); } else {
for(i=2;i<=n;i++) {
result*=i;
2019/9/10
} return result; } }
25/51
防御性程序设计(Defensive Programming)
但是输入-1后,会输出 :
Input data error!
int i; long result=1; for(i=2;i<=n;i++) {
result*=i; } return result; }
int main() { int m; long ret;
printf("input m:"); scanf("%d",&m); ret=Fact(m); printf("%d!=%d\n",m,ret); return 0; }
C语言第七章
4、strcpy(字符数组1,字符数组2):
例:main()
把“字符串2”的值拷贝到“字符串1”中。
{char str1[10]; char str2[ ]="Chinese"; strcpy(str1,str2); puts(str1); } 输出: Chinese 说明: (1)字符数组1的长度不应小于字符串2的长度。 (2)“字符数组1”必须写成数组名形式,“串2”可以是字符数 组名,也可以是一个字符串常量。如:strcpy(str1,“China”); (3)拷贝是‘\0‟一起拷贝。 (4)不能用赋值语句将一个字符常量或字符数组直接赋给一个 字符数组。 (5)可以用strcpy函数将字符串2中前面若干个字符拷贝到字符 数组1中去。 例如:strcpy(str1,str2,2);
3、部分元素赋值: int a[3][4] = {{1},{5},{9}}; 1 0 0 0 5 0 0 0 9 0 0 0
仅对a[0][0]、a[1][0]、a[2][0]赋值,编译器自动为未赋
值元素指定初值0。
4、如果对全部元素赋初值,则第一维的长度可以 不指定,但必须指定第二维的长度。 int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12}; 与下面定义等价: int a[ ][4]={1,2,3,4,5,6,7,8,9,10,11,12};
[例6.6]: main() { int i; char c1[ ] = {"How are you?"}; char c2[15]; scanf("%s", c2 ); for(i=0;i<12;i++) printf("%c", c2[i] ); printf("%s", c1 ); } 程序运行时:输入:abcdefghijklmno 结果:abcdefghijklHow are you?
高树芳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章 函数
函数的 参数?
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;
(完整版)答案第七章函数..
(完整版)答案第七章函数..第七章函数一、选择题1.以下函数声明正确的是: C 。
(02~03第一学期试题)A) double fun(int x, int y) B) double fun(int x; int y)C) double fun(int x, int y) ; D) double fun(int x , y)2.C语言规定,简单变量作实参,它与对应形参之间的数据传递方式是: B 。
(0级)A)地址传递;B)单向值传递;C)双向值传递;D)由用户指定传递方式3.以下关于C语言程序中函数的说法正确的是: B 。
(0级)A)函数的定义可以嵌套,但函数的调用不可以嵌套;B)函数的定义不可以嵌套,但函数的调用可以嵌套;C)函数的定义和调用均不可以嵌套;D)函数的定义和点用都可以嵌套。
4.以下正确的函数形式是: D 。
(1级)A)double fun(int x,int y) B)fun (int x,y){z=x+y;return z;} {int z;return z;}C)fun(x,y) D)double fun(int x,int y){int x,y ; double z; {double z;z=x+y; return z;} z=x+y; return z;}5.以下说法不正确的是: B 。
(1级)C 语言规定A)实参可以是常量、变量或表达式B)形参可以是常量、变量或表达式C)实参可以是任意类型D)形参应与其对应的实参类型一致6.C语言允许函数值类型缺省定义,此时该函数值隐含的类型是 B 。
(0级)A) float型B) int 型C)long 型D)double 型7.以下错误的描述是 D 。
(0级)函数调用可以A)出现在执行语句中B)出现在一个表达式中C)做为一个函数的实参D)做为一个函数的形参8.若用数组名作为函数调用的实参,传递给形参的是 A 。
(0级)A)数组的首地址B)数组第一个元素的值C)数组中全部元素的值D)数组元素的个数9.以下正确的说法是 A 。
《C语言程序设计》课件 《C语言程序设计》课件 第7章 函数的使用
<<C语言程序设计>>
电脑模块化组装
模块化程序
Page 4
7.1 为什么使用函数
【例7-1】打印输出如下所示超市购物小票的票头
某某超市欢送您 *****************************
*
分析
1、第一行为欢送词,自定义一个函数print_welcome来实 现欢送词的输出功能 2、第二行为一定数量的“*〞号,自定义一个函数 print_star来实现 “*〞号的输出功能
第7章 函数的使用
<<C语言程序设计>> 课程
<<C语言程序设计>>
Page 1
主要内容
1 为什么使用函数 2 函数的根本使用 3 函数递归调用 4 用带参数的宏定义代替公式型函数 5 函数和变量的作用域及存储类型
<<C语言程序设计>>
Page 2
问题引入
数学函数sqrt()、字符串处理函数strlen() 等。这些具有通 用功能的函数称之为标准库函数,是由C语言开发环境提供, 标准库函数给编程带来了极大的方便。
形式参数 实际参数
<<C语言程序设计>>
Page 17
7.3 函数的调用
函数调用的形式
函数名(参数表) – 对实参的要求
• 实参个数和形参个数相等。 • 实参的类型要和形参的类型一
致。 • 被调用函数无形参,实参表是
空的,但括号不能省略。
main( ) { int a=1,b=3,c;
函数调用
c=max(a,b);
{ int n=1, i; for(i=1;i<=a;i++) n=n*i; return n;
计算机二级c语言第七章 函数习题
第七章函数一、选择题1、以下关于函数的叙述中正确的是A)每个函数都可以被其它函数调用(包括main函数)B)每个函数都可以被单独编译C)每个函数都可以单独运行D)在一个函数内部可以定义另一个函数2、设函数fun的定义形式为void fun(char ch,float x) { … }则以下对函数fun的调用语句中,正确的是A)fun("abc",3.0); B)t=fun('D',16.5);C)fun('65',2.8); D)fun(32,32);3、有以下程序int f1(int x,int y){return x>y?x:y;}int f2(int x,int y){return x>y?y:x;}main(){ int a=4,b=3,c=5,d=2,e,f,g;e=f2(f1(a,b),f1(c,d));f=f1(f2(a,b),f2(c,d));g=a+b+c+d-e-f;printf("%d,%d,%d\n",e,f,g); }程序运行后的输出结果是A)4,3,7 B)3,4,7 C)5,2,7 D)2,5,74、有以下程序#define P 3#define F(int x) { return (P*x*x);}main(){ printf("%d\n",F(3+5));}程序运行后的输出结果是A)192 B)29 C)25 D)编译出错5、若程序中定义了以下函数double myadd(double a,double B){ return(a+B);}并将其放在调用语句之后,则在调用之前应该对该函数进行说明,以下选项中错误的说明是A)double myadd(double a,B); B)double myadd(double,double);C)double myadd(double b,double A); D)double myadd(double x,double y);6、有以下程序char fun(char x ,char y){ if(x < y) return x;return y;}main(){ int a=’9’,b=’8’,c=’7’;printf("%c\n",fun(fun(a,b),fun(b,c))); }程序的执行结果是A)函数调用出错 B)8 C)9 D)77、有以下程序void f(int v,int w){ int t;t=v;v=w;w=t;}main(){ int x=1,y=3,z=2;if(x>y) f(x,y);else if(y>z) f(y,z);else f(x,z);printf("%d,%d,%d\n",x,y,z);}执行后输出结果是A) 1,2,3 B) 3,1,2 C) 1,3,2 D) 2,3,18、若已定义的函数有返回值,则以下关于该函数调用的叙述中错误的是A) 调用可以作为独立的语句存在 B) 调用可以作为一个函数的实参C) 调用可以出现在表达式中 D) 调用可以作为一个函数的形参9、有以下函数定义:void fun(int n,double x) { …… }若以下选项中的变量都已正确定义并赋值,则对函数fun的正确调用语句是A)fun(int y,double m); B) k=fun(10,12.5);C)fun(x,n); D) vold fun(n,x);10、有以下程序fun(int a,int b){ if(a>b) return(a);else return(b);}main(){ int x=3,y=8,z=6,r;r=fun(fun(x,y),2*z);printf("%d\n",r);}程序运行后的输出结果是A) 3 B) 6 C) 8 D) 1211、在一个C程序中A) main函数必须出现在所有函数之前 B) main函数可以在任何地方出现C) main函数必须出现在所有函数之后 D) main函数必须出现在固定位置12、有以下程序int f1(int x,int y){ return x>y?x:y; }int f2(int x,int y){ return x>y?y:x; }main(){ int a=4,b=3,c=5,d,e,f;d=f1(a,b); d=f1(d,c);e=f2(a,b); e=f2(e,c);f=a+b+c-d-e;printf("%d,%d,%d\n",d,f,e);}执行后输出结果是A) 3,4,5 B) 5,3,4 C) 5,4,3 D) 3,5,413、有如下程序void f(int x,int y){ int t;if(x < y){ t=x; x=y; y=t; }}main(){ int a=4,b=3,c=5;f(a,b); f(a,c); f(b,c);printf("%d,%d,%d\n",a,b,c);}执行后输出结果是A) 3,4,5 B) 5,3,4 C) 5,4,3 D) 4,3,514、C语言中,函数值类型的定义可以缺省,此时函数值的隐含类型是A) void B) int C) float D) double15、有以下程序float fun(int x,int y){ return(x+y); }main(){ int a=2,b=5,c=8;printf("%3.0f\n",fun((int)fun(a+c,b),a-c));}程序运行后的输出结果是A) 编译出错 B) 9 C) 21 D) 9.016、若有以下程序#includevoid f(int n);main(){ void f(int n);f(5);}void f(int n){ printf("%d\n",n); }则以下叙述中不正确的是A)若只在主函数中对函数f进行说明,则只能在主函数中正确调用函数fB)若在主函数前对函数f进行说明,则在主函数和其后的其它函数中都可以正确调用函数fC)对于以上程序,编译时系统会提示出错信息:提示对对f函数重复说明D)函数f无返回值,所以可用void将其类型定义为无值型17、以下函数值的类型是fun(float x){ float y;y= 3*x-4;return y;}A)int B)不确定 C)void D)float18、以下所列的各函数首部中,正确的是A)void play(var :Integer,var b:Integer)B)void play(int a,b)C)void play(int a,int b)D)Sub play(a as integer,b as integer)19、以下程序的输出结果是fun(int x, int y, int z){ z=x*x+y*y; }main(){ int a=31;fun(5,2,a);printf("%d",a);}A)0 B)29 C)31 D)无定值20、有如下函数调用语句func(rec1,rec2+rec3,(rec4,rec5));该函数调用语句中,含有的实参个数是A) 3 B) 4 C) 5 D) 有语法错21、有如下程序int func(int a,int b){ return(a+b);}main(){ int x=2,y=5,z=8,r;r=func(func(x,y),z);printf("%d\n",r);}该程序的输出的结果是A) 12 B) 13 C) 14 D) 1522、以下叙述中不正确的是A)在不同的函数中可以使用相同名字的变量B)函数中的形式参数是局部变量C)在一个函数内定义的变量只在本函数范围内有效D)在一个函数内的复合语句中定义的变量在本函数范围内有效23、有以下程序void fun (int a,int b,int c){ a=456; b=567; c=678;}main(){ int x=10, y=20,z=30;fun(x,y,z);printf("%d,%d,%d \n",z,y,x);}输出结果是A)30,20,10 B)10,20,30 C) 456,567,678 D) 678,567,45624、有以下程序#include "stdio.h"int abc(int u,intv);main(){ int a=24,b=16,c;c=abc(a,b);printf("%d\n",c);}int abc(int u,int v){ int w;while(v){ w=u%v; u=v; v=w }return u;}输出结果是A)6 B)7 C)8 D)925、以下说法中正确的是A)C语言程序总是从第一个的函数开始执行B)在C语言程序中,要调用的函数必须在main()函数中定义C)C语言程序总是从main()函数开始执行D)C语言程序中的main()函数必须放在程序的开始部分26、请读程序:#includefunc( int a, int b){ int c;c=a+b;return c;}main(){ int x=6,y=7,z=8,r;r=func((x--,y++,x+y),z--);printf("%d\n",r);}上面程序的输出结果是A)11 B)20 C)21 D)31二、填空题1、有以下程序int sub(int n) {return(n/10+n%10); }main(){ int x,y;scanf("%d",&x);y=sub(sub(sub(x)));printf("%d\n",y);}若运行时输入:1234<回车>,程序的输出结果是。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
函数声明
函数调用
函数定义
函数定义
函数概述: 函数概述:
当问题很复杂时, 当问题很复杂时,需要将一个复杂的大问题划分成 若干个子问题。将所有的子问题解决之后, 若干个子问题。将所有的子问题解决之后,大问题 也就解决了。 也就解决了。 解决复杂问题的有效途径:把问题分解, 解决复杂问题的有效途径:把问题分解,分别用函 数实现,然后把众多函数组织起来, 数实现,然后把众多函数组织起来,有机地组成一 个系统。 个系统。 优点:对问题逐步细化,程序结构清晰,逻辑性强。 优点:对问题逐步细化,程序结构清晰,逻辑性强。 而且,小程序模块的规模小,容易编制调试, 而且,小程序模块的规模小,容易编制调试,从而 在最大程度上保证程序设计的正确性。 在最大程度上保证程序设计的正确性。
函 数 定 义
函 数 定 义
24
例1: int www() { …… } void abc() { …… }
分别定义
25
注意: 注意: 函数的“定义” 函数的“定义”和“声明”不是一回事。 声明”不是一回事。 •函数的定义是指对函数功能的确立,包括指定函数名, 函数的定义是指对函数功能的确立,包括指定函数名, 函数的定义是指对函数功能的确立 函数值类型、形参及其类型、函数体等, 函数值类型、形参及其类型、函数体等,它是一个完 整的、独立的函数单位。 整的、独立的函数单位。 •函数的声明的作用则是把函数的名字、函数类型以及 函数的声明的作用则是把函数的名字、 函数的声明的作用则是把函数的名字 形参的类型、个数和顺序通知编译系统,以便在调用 形参的类型、个数和顺序通知编译系统, 该函数时系统按此进行对照检查。它不包含函数体。 该函数时系统按此进行对照检查。它不包含函数体。
30
本节重点掌握内容
一、函数概述 二、函数的定义 三、函数的调用 四、C 程序的执行过程
31
三、函数的调用
32
函数调用的一般形式为: 函数调用的一般形式为: 函数名(实参表) 函数名(实参表);
C语言规定: 语言规定: 1、任何变量和函数在使用之前必须先定义;但是 任何变量和函数在使用之前必须先定义; 函数可以在任意地方定义; 函数可以在任意地方定义; 2、为了使用在本处后面定义的函数,须对其进行 为了使用在本处后面定义的函数, 说明。 说明。
40
程序的参数传递是“值传递” C 程序的参数传递是“值传递”, 即:将实参的值赋给形参 实参向形参的数据传递是单向“值传递” 实参向形参的数据传递是单向“值传递”,只能 由实参传给形参,而不能由形参传回来给实参。 由实参传给形参,而不能由形参传回来给实参。 在调用函数时,给形参分配存储单元, 在调用函数时,给形参分配存储单元,并将实参 对应的值传递给形参,调用结束后,形参单元被释放, 对应的值传递给形参,调用结束后,形参单元被释放, 实参单元仍保留并维持原值。 实参单元仍保留并维持原值。
12
说明: 说明: 2 、 一个源程序文件由一个或多个函数以及其他有关 内容(如命令行、数据定义等)组成。 内容(如命令行、数据定义等)组成。 一个源程序文件是一个编译单位, 一个源程序文件是一个编译单位 ,在程序编译时是以 源程序文件为单位进行编译的, 源程序文件为单位进行编译的, 而不是以函数为单位 进行编译的。 进行编译的。 3、C程序的执行是从main函数开始的,如果在 、 程序的执行是从 函数开始的, 函数开始的 如果在main 函数中调用其他函数,在调用后流程返回到main函数, 函数, 函数中调用其他函数,在调用后流程返回到 函数 函数中结束整个程序的运行。 在main函数中结束整个程序的运行。 函数中结束整个程序的运行
27
怎样定义无参函数? 怎样定义无参函数? 定义无参函数的一般形式为: 定义无参函数的一般形式为: 函数名() 类型标识符 函数名() { 声明部分 语句部分 }
28
怎样定义有参函数? 怎样定义有参函数? 定义有参函数的一般形式为: 定义有参函数的一般形式为: 函数名(形式参数表列) 类型标识符 函数名(形式参数表列) { 声明部分 语句部分 }
14
说明: 说明: 5.从用户使用的角度看,函数有两种: 用户使用的角度看,函数有两种: 的角度看 标准函数,即库函数。这是由系统提供的, ① 标准函数,即库函数。这是由系统提供的,用户不 必自己定义这些函数,可以直接使用它们。不同的C 必自己定义这些函数,可以直接使用它们。不同的C系 统提供的库函数的数量和功能会有一些不同, 统提供的库函数的数量和功能会有一些不同 , 但许多 基本的函数是共同的。 基本的函数是共同的。 用户自己定义的函数。用以解决用户的专门需要。 ② 用户自己定义的函数。用以解决用户的专门需要。
33
函数无参数时, 函数无参数时, 这对“ 这对“( )” 也不能省略 函数说明
函数定义
函数调用和参数传递
1、形参和实参 2、函数返回值 3、函数调用的一般形式 4、函数的调用方式 被调用函数的说明 5、被调用函数的说明
36
1.形参和实参 形参和实参
函数之间的信息传递
全程的外部变量
将实际参数值传递给被 调函数的形式参数
37
例:
void exch ( int x,int y) , { int t; ; t = x; x = y; y = t; ; ; ;
此函数的 功能? 功能?
}
38
在定义函数时,写在参数表中的参数称为形式参数 在定义函数时,写在参数表中的参数称为形式参数 简称形参 形参) 形式参数在定义函数时, (简称形参);形式参数在定义函数时,并不在内存占 空间。只有在函数被调用时,它才真正存在。 空间。只有在函数被调用时,它才真正存在。 而且当函数执行结束后,这些形参也将随之消失。 而且当函数执行结束后,这些形参也将随之消失。 形参的有效作用范围是:其所在的函数内。 形参的有效作用范围是:其所在的函数内。 在调用函数时写在参数表中的参数称为实在参数(简 在调用函数时写在参数表中的参数称为实在参数( 实在参数 实参) 称实参)。 调用语句中的实参个数应和被调用函数的形参个数相 顺序和类型完全一致。 等,顺序和类型完全一致。
void main() { printf ( “ * * * * * * * * *\n ” ); ; printf ( “ How do you do!\n ” ); ; printf ( “ * * * * * * * * *\n ” ); ; }
5
如果希望在屏幕上显示: 如果希望在屏幕上显示:
26
从函数的形式看,函数分两类: 函数的形式看 函数分两类: 无参函数。 ①无参函数。无参函数一般用来执行指定的一组操作 在调用无参函数时, 。在调用无参函数时,主调函数不向被调用函数传递数 据。 有参函数。主调函数在调用被调用函数时, ②有参函数。主调函数在调用被调用函数时,通过参 数向被调用函数传递数据。 数向被调用函数传递数据。
例如: 例如:
29
定义空函数 定义空函数的一般形式为: 定义空函数的一般形式为: 函数名() 类型标识符 函数名() {}
例如: 例如: void dummy() ( { } 主调函数调用空函数时, 主调函数调用空函数时,只表明 这里要调用一个函数, 这里要调用一个函数,但函数本 身什么工作也不做等,以后扩充 身什么工作也不做等, 函数功能时补充上。 函数功能时补充上。
9
C程序的结构: 程序的结构: 程序的结构 C程序 程序
源程序文件1 源程序文件 预处理命令 源程序文件2 源程序文件 数据声明 源程序文件n 源程序文件
函数1 函数
函数n 函数
函数首部
函数体
执行语句
数据声明
10
一个 C 程序的源文件: 程序的源文件: 函数是 C 由一个或若干个函数组成 语言的基本构件
13
说明: 说明: 4. 所有函数都是平行的,即在定义函数时是分别进 所有函数都是平行的, 行的,是互相独立的。 行的,是互相独立的。一个函数并不从属于另一函数 函数不能嵌套定义。 ,即函数不能嵌套定义。 函数间可以互相调用, 不能调用 函数。 函数间可以互相调用,但不能调用main函数。 函数 main函数是系统调用的。 函数是系统调用的。 函数是系统调用的
15
说明: 说明: 函数的形式看 函数分两类: 6. 从函数的形式看,函数分两类: 无参函数。 ①无参函数。无参函数一般用来执行指定的一组操作 在调用无参函数时, 。在调用无参函数时,主调函数不向被调用函数传递数 据。 ②有参函数。主调函数在调用被调用函数时,通过参 有参函数。主调函数在调用被调用函数时, 数向被调用函数传递数据。 数向被调用函数传递数据。
main( )
func1()
func2()
func3()
主函数完成原始数 据的输入、输出, 据的输入、输出, 以及对所需子函数 的调用功能。
func4()
func5()
func6()
程序模块结构图
每一个函数解决一 个独立的问题, 个独立的问题,完 成一个独立的功能
11
说明: 说明: 一个C程序由一个或多个程序模块组成, 1、一个C程序由一个或多个程序模块组成,每一个程 序模块作为一个源程序文件。 序模块作为一个源程序文件。 对于较大的程序, 对于较大的程序 , 通常将程序内容分别放在若干个源 文件中,再由若干源程序文件组成一个C程序。 文件中,再由若干源程序文件组成一个C程序。这样便 分别编写、分别编译,提高调试效率。 于分别编写、分别编译,提高调试效率。 一个源程序文件可以为多个C程序公用。 一个源程序文件可以为多个C程序公用。
16
本节重点掌握内容
一、函数概述 二、函数的定义 三、函数的调用 四、C 程序的执行过程
17
二、函数的定义
18
函数定义的一般形式: 函数定义的一般形式: [ 函数类型说明符 ] ( { 函数的标志 [ 变量定义和变量、函数说明部分 ] 变量定义和变量、 [ 语句部分 ] } 函数名