140 likes | 358 Vues
第 7 章 函数. 7.1 函数概述. 1 、函数的概念. 函数其实就是一段可以重复调用的、功能相对独立完整的程序段。. C 是 函数式 语言 必须有且只能有一个名为 main 的主函数 C 程序的执行总是 从 main 函数开始,在 main 中结束 函数 不能嵌套定义,可以 嵌套 调用. 使用库函数应注意: 1 、函数功能 2 、函数参数的数目和顺序,及各参数意义和类型 3 、函数返回值意义和类型 4 、需要使用的包含文件. 2 、函数的分类. 从用户角度. 标准函数(库函数):由系统提供 用户自定义函数. 从函数形式. 无参数无返回值
E N D
7.1 函数概述 1、函数的概念 函数其实就是一段可以重复调用的、功能相对独立完整的程序段。 • C是函数式语言 • 必须有且只能有一个名为main的主函数 • C程序的执行总是从main函数开始,在main中结束 • 函数不能嵌套定义,可以嵌套调用 使用库函数应注意: 1、函数功能 2、函数参数的数目和顺序,及各参数意义和类型 3、函数返回值意义和类型 4、需要使用的包含文件 2、函数的分类 • 从用户角度 • 标准函数(库函数):由系统提供 • 用户自定义函数 • 从函数形式 • 无参数无返回值 • 无参数有返回值 • 有参数无返回值 • 有参数有返回值
7.2 函数的定义和调用 函数体 必须为合法的标识符 1、无参数无返回值的函数 • 定义格式 void 函数名 (void) { 变量声明部分 执行部分 } 空类型,表明函数无返回值,不可省! 表明无参数,可缺省! • 函数用途 此类函数用于完成某项固定的处理任务,执行完成后不向调用者返回函数值。它类似于其它语言的过程。 • 函数的原型声明 void 函数名( void ); 或 void 函数名( ); C语言规定,对函数调用之前必须对其原型加以声明,否则会出现编译错!
调用showerror 函数 返回 1、无参数无返回值的函数 • #include <stdio.h> • #include <math.h> • void showerror ( );//声明showerror函数的原型 • void main ( ) • { • int a; • scanf ("%d", &a); • while (a < 0) • { • showerror( ); • scanf ("%d", &a); • } • printf ("sqrt(a) = %.2f\n", sqrt(a)); • } • void showerror( )//函数的定义,无参数无返回值 • { • printf("input error!\n"); //函数体,没有声明变量 • } • 函数的调用 函数名( ); 注意:不能将这种函数调用赋值给任何变量,因为它没有返回值。调用时,( )中间不能有void。 • 实例 注意:对函数调用之前,必须要先声明或先定义,否则编译错!
例如: void showyes ( ) { char key; key = getch ( ); if (toupper(key) != 'Y') return; printf ("YES! "); } 函数showyes的功能是: 如果输入的字符不是'Y'或'y',则什么都不输出,直接返回,否则,输出"YES! " • 函数的返回 • 形式 ①rerurn (表达式); //有返回值 ②rerutn 表达式; //有返回值 ③return; //无返回值 标准库函数,其功能是将小写字符转换成大写字符 • 功能 使程序控制从被调用函数返回到调用函数中,如果有返回值,同时把返值带给调用函数。 • 说明 函数中可以有多个return语句。在无返回值的函数中,return语句的形式只能是第③种形式。
函数体 2、无参数有返回值的函数 必须为合法的标识符 • 定义格式 返回值类型符 函数名 (void) { 变量声明部分 执行部分 } 可以为除数组类型外的任何类型,缺省时,默认为int型 表明无参数,可缺省! • 函数用途 此类函数用于完成某项固定的处理任务,执行完成后向调用者返回函数值。 • 函数的原型声明 返回值类型符 函数名( void ); 或 返回值类型符 函数名( );
2、无参数有返回值的函数 int sum ( ) { int i, tot = 0; char key; key = getche ( ); if (key != '0' && key != '1') return (-1); for (i = (key == '0') ? 2 : 1; i <= 100; i += 2) tot += i; return ( tot ); } • 函数的调用 变量声明部分 函数名( void ); 或 变量 = 函数名( ); • 实例 #include <stdio.h> #include <conio.h> #include <ctype.h> int sum ( ); void main ( ) { int tot; tot = sum ( ); if (tot == -1) printf ("\nnot select!\n"); else printf ("\nthe result is : %d\n", tot); } 声明sum函数的原型 函数的定义,无参数有返回值 调用sum 函数 函数sum的功能是: 输入‘0’:计算1~100之间所 有偶数之和 输入‘1’:计算1~100之间所 有奇数之和
#include <stdio.h> int sum ( ); void main ( ) { int x; x = sum ( ); printf (“x = %d\n", x); } int sum ( ) { int i, tot = 0; for (i = 1; i <= 100; i ++) tot += i; } 因sum函数无return语句, x的值将是无法预知的! 应加上 return tot;语句 2、无参数有返回值的函数 • 函数的返回 • 格式 rerurn (表达式); 或rerutn 表达式; • 说明 注意:如果不将函数调用赋值给任何变量,它的返回值将被丢弃! • 表达式的值即是函数的返回值; • 函数体中一般都包含return(表达式)语句, 如果没有, 函数也会返回一个值。这个值是不可预知的, 将会使程序可能犯有逻辑错; • 一般情况下,表达式值的类型应与函数返回值类型一致;
形参列表 函数体 3、有参数无返回值的函数 至少要有一项,形参之间要用逗号“,”分开 • 定义格式 void 函数名 (类型符1 形参名1, 类型符2 形参名2, … , 类型符n 形参名n) { 变量声明部分 执行部分 } 不允许对 形参赋初值 指明形参类型 • 函数用途 此类型的函数主要是根据形参的值来进行某种事务的处理。灵活性上要比无形参的函数强,它更能体现调用函数与被调函数之间的数据联系。 • 函数的原型声明 void 函数名(类型符1 形参名1, 类型符2 形参名2, … , 类型符n 形参名n ); 或 void 函数名(类型符1 , 类型符2 , … , 类型符n );
实参可以是常量、变量、表达式、函数等 3、有参数无返回值的函数 • 函数调用 函数名( 实参1,实参2,……,实参n ); 注意事项: (1) 实参列表中的实参必须与函数定义时的形参数量相同、类型相符。 (2) 赋值对应关系: 实参1 -> 形参1 实参2 -> 形参2 …… 实参n -> 形参n
运行结果(在VC下) 运行结果(在TC或BC下) a = 2 b = 2 a = b i = 3 a = 3 b = 2 a > b i = 3 实参 实参 i i 2 2 i++ i++ 2 2 ③ i+1 ② i+1 ③ ① ② ① b b a a 形参 形参 3、有参数无返回值的函数 #include <stdio.h> void compare (int a, int b); void main ( ) { int i = 2; compare ( i, i++ ); printf ("i = %d\n", i); } void compare ( int a, int b ) { printf ("a = %d b = %d\n", a, b); if ( a > b) printf ("a > b\n"); else if (a == b) printf ("a = b\n"); else printf ("a < b\n"); } 原型声明 i为实参 3 a、b为形参 2 3 3 2 2
形参列表 函数体 4、有参数有返回值的函数 • 定义格式 返回值类型符 函数名 (类型符1 形参名1, … … , 类型符n 形参名n) { 变量声明部分 执行部分 } • 函数用途 此类型的函数主要是根据形参的值来进行某种事务的处理,同时可将处理后的结果值返回给调用函数。它最能体现调用函数与被调函数之间的数据联系。 • 函数的原型声明 返回值类型符 函数名(类型符1 形参名1, …… , 类型符n 形参名n ); 或 返回值类型符 函数名(类型符1 , 类型符2 , …… , 类型符n );
4、有参数有返回值的函数 • 函数调用 函数名( 实参1,实参2,……,实参n ); 或 变量名 = 函数名( 实参1,实参2,……,实参n ); #include <stdio.h> int max (in t a, int b); //函数的原型声明 void main ( ) { int a, b, c; scanf ("%d%d", &a, &b); c = max (a, b);//函数调用(a、b为实参) printf ("the biggest number is : %d\n", c); } int max (int a, int b) //函数定义(a、b为形参) { return (a > b ? a : b); } 运行结果: 5 9↙ the biggest number is 9
练习 编写一判断素数的函数,在主函数中随机生成一个数n,调用自定义函数输出1到n的素数,且每行输出5个数。