c语言程序设计现代方法 (2)

上传人:lcm****801 文档编号:95511964 上传时间:2019-08-20 格式:PPT 页数:105 大小:637.50KB
返回 下载 相关 举报
c语言程序设计现代方法 (2)_第1页
第1页 / 共105页
c语言程序设计现代方法 (2)_第2页
第2页 / 共105页
c语言程序设计现代方法 (2)_第3页
第3页 / 共105页
c语言程序设计现代方法 (2)_第4页
第4页 / 共105页
c语言程序设计现代方法 (2)_第5页
第5页 / 共105页
点击查看更多>>
资源描述

《c语言程序设计现代方法 (2)》由会员分享,可在线阅读,更多相关《c语言程序设计现代方法 (2)(105页珍藏版)》请在金锄头文库上搜索。

1、1,第9章,函数,本章要点,函数的定义 函数的调用 函数的声明 形式参数vs实际参数 递归,概述,函数简单来说就是一连串组合在一起并且命名的语句。 每个函数本质上是一个自带声明和语句的小程序。 函数的优点: 可以利用函数把程序划分成小块,这样便于人们理解和修改程序。 可以避免重复编写可多次使用的代码。 一个函数最初可能是某个程序的一部分,但可以将其用于其他程序中。,3,函数的定义和调用,在介绍定义函数的规则之前,先来看3个简单的定义函数的程序。,4,程序:计算平均值,一个叫做average的函数用来计算两个double类型数值的平均值: double average(double a, dou

2、ble b) return (a + b) / 2; 在函数开始处放置的单词double表示了average函数的返回类型(return type)。 标识符a和标识符b(即函数的形式参数(parameter)表示在调用average函数时提供的求平均值的两个数。,5,程序:计算平均值,每个函数都有一个用大括号括起来的执行部分,称为函数体(body)。 average函数的函数体由一条return语句构成。 执行这条语句将会使函数“返回”到调用它的地方,表达式(a+b)/2的值将作为函数的返回值。,6,程序:计算平均值,一个函数调用包括函数名和其后的实际参数 (arguments)列表。 av

3、erage(x, y) 即为对average函数的调用。 实际参数用来给函数提供信息。 调用average(x,y)的效果就是把变量x和y的值复制给形式参数a和b。 实际参数不一定要是变量;任何正确类型的表达式都可以。 average(5.1, 8.9) 和 average(x/2, y/3) 都是合法的。,7,程序:计算平均值,我们把average函数的调用放在需要使用其返回值的地方。 打印x和y平均值的语句为: printf(“Average: %gn“, average(x, y); average的返回值没有保存;程序显示出这个值后就把它丢弃了。 如果需要在稍后的程序中用到返回值,可以

4、把这个返回值赋值给变量: avg = average(x, y);,8,程序:计算平均值,程序average.c读取了3个数并且计算它们的平均值,其中,一次计算一对数的平均值: Enter three numbers: 3.5 9.6 10.2 Average of 3.5 and 9.6: 6.55 Average of 9.6 and 10.2: 9.9 Average of 3.5 and 10.2: 6.85,9,average.c /* Computes pairwise averages of three numbers */ #include double average(dou

5、ble a, double b) return (a + b) / 2; int main(void) double x, y, z; printf(“Enter three numbers: “); scanf(“%lf%lf%lf“, ,10,程序:显示倒数计数,为了指示出不带返回值的函数,需要指明这类函数的返回类型为void: void print_count(int n) printf(“T minus %d and countingn“, n); void是一种没有值的类型。 print_count函数的调用必须自成一个语句: print_count(i); 程序countdown.

6、c在循环内调用了print_count 函数10次。,11,countdown.c /* Prints a countdown */ #include void print_count(int n) printf(“T minus %d and countingn“, n); int main(void) int i; for (i = 10; i 0; -i) print_count(i); return 0; ,12,程序:显示双关语(改进版),当函数没有形式参数时,则在函数名后面的圆括号中填入 void: void print_pun(void) printf(“To C, or not

7、 to C: that is the question.n“); 为了调用不带实际参数的函数,需要写出函数名并且后面跟上一对圆括号: print_pun(); 即使没有实际参数也必须显示圆括号。 程序pun2.c测试了print_pun函数。,13,pun2.c /* Prints a bad pun */ #include void print_pun(void) printf(“To C, or not to C: that is the question.n“); int main(void) print_pun(); return 0; ,14,函数定义,函数定义的一般格式: 返回类型

8、 函数名 ( 形式参数 ) 声明 语句 ,15,函数定义,函数的“返回类型”是函数返回值的类型。 下列规则用来管理返回类型: 函数无法返回数组。 指定返回类型是void型说明函数没有返回值。 在C89中,如果忽略返回类型,那么会假定函数返回值的类型是int型。 在C99中,忽略返回类型是非法的。,16,函数定义,一些程序员习惯把返回类型放在函数名的上边: double average(double a, double b) return (a + b) / 2; 如果返回类型很冗长,比如unsigned long int类型,那么把返回类型单独放在一行是非常有用的。,17,函数定义,函数名后边

9、有一串形式参数列表。 每个形式参数需要说明其类型;形式参数间用逗号进行分隔。 如果函数没有形式参数,那么在圆括号内应该出现void。,18,函数定义,函数体可以包含声明和语句。 average函数的变体: double average(double a, double b) double sum; /* declaration */ sum = a + b; /* statement */ return sum / 2; /* statement */ ,19,函数定义,函数体内声明的变量专属于此函数,其他函数不能对这些变量进行检查或修改。 在C89中,变量声明必须出现在语句之前。 在C99中

10、,变量声明和语句可以混在一起,只要变量在第一次使用前进行声明即可。,20,函数定义,返回类型为void的函数 ( “void 函数”) 的函数体可以为空: void print_pun(void) 在程序开发过程中,作为一种临时措施,留下空函数体是有意义的。,21,函数调用,函数调用由函数名和跟随其后的实际参数列表组成,其中实际参数列表用圆括号括起来: average(x, y) print_count(i) print_pun() 如果丢失圆括号,那么将无法进行函数调用: print_pun; /* WRONG */ 这条语句是合法的,但是不起作用。,22,函数调用,void型的函数调用是语

11、句,所以调用后边始终跟着分号: print_count(i); print_pun(); 非void型的函数调用产生的值可存储在变量中,还可以进行测试、显示或者其他用途: avg = average(x, y); if (average(x, y) 0) printf(“Average is positiven“); printf(“The average is %gn“, average(x, y);,23,函数调用,如果不需要,非void型函数的返回值总是可以丢弃: average(x, y); /* discards return value */ 这个调用是一个表达式语句的示例:一个计

12、算出了表达式值但是将其丢弃的语句。,24,函数调用,丢弃average的返回值是一件很奇怪的事,但在某些情况下是有意义的: 例如:printf返回显示的字符的个数。 在下面的调用后,num_chars的值为9: num_chars = printf(“Hi, Mom!n“); 通常会丢掉printfs的返回值: printf(“Hi, Mom!n“); /* discards return value */,25,函数调用,为了清楚地表示故意丢掉函数返回值,C语言允许在函数调用前加上(void): (void) printf(“Hi, Mom!n“); 使用(void)可以使别人清楚编写者是故

13、意扔掉返回值的,而不是忘记了。,26,程序:判定素数,程序prime.c检查一个数是否是素数: Enter a number: 34 Not prime 程序使用名为is_prime的函数来进行检查。该函数返回值为true就表示它的形式参数是素数,返回false就表示它的形式参数不是素数。 给定数n后,is_prime函数把n除以从2到n的平方根之间的每一个数:如果余数永远为0,就知道n不是素数。,27,prime.c /* Tests whether a number is prime */ #include /* C99 only */ #include bool is_prime(int

14、 n) int divisor; if (n = 1) return false; for (divisor = 2; divisor * divisor = n; divisor+) if (n % divisor = 0) return false; return true; ,28,int main(void) int n; printf(“Enter a number: “); scanf(“%d“, ,29,函数声明,C语言没有要求函数的定义必须放置在调用它之前。 假设重新编排程序average.c,使average函数的定义放置在main函数的定义之后:,30,函数声明,#incl

15、ude int main(void) double x, y, z; printf(“Enter three numbers: “); scanf(“%lf%lf%lf“, ,31,函数声明,当遇到main函数中第一个average函数调用时,编译器没有任何关于average函数的信息。 但是,编译器没有产生错误信息,而是假设average函数返回int型的值。 我们将其称为编译器为该函数创建了一个隐式声明(implicit declaration)。,32,函数声明,编译器无法检查传递给average的实参个数和实参类型是否正确。 它只能进行默认的实际参数提升并期待最好情况的发生。 当编译器

16、在后面遇到了average的定义时,它发现该函数返回值实际是double而非int,结果我们将得到一条错误消息的提示。,33,函数声明,为了避免定义前调用这类问题的发生,一种方法是安排程序,使每个函数的定义都在此函数调用之前进行。 可惜的是,这类安排不总是存在的。 而且即使真的做了这类安排,也会因为按照不自然的顺序放置函数定义,使程序难以阅读。,34,函数声明,幸运的是,C语言提供了一种更好的解决办法:在调用前声明(declare)每个函数。 函数声明(function declaration)使得编译器对函数进行概要浏览,而函数的完整定义稍后再出现。 函数声明的一般形式: 返回类型 函数名 ( 形式参数 ) ; 函数的声明必须与函数的定义一致。 下面是为average函数添加了声明后程序的样子:,35,函数声明,#include double average(double a, double b); /* DECL

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 大杂烩/其它

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号