第8章 函数 信息管理系.

Slides:



Advertisements
Similar presentations
1 、谁能说说什么是因数? 在整数范围内( 0 除外),如果甲数 能被乙数整除,我们就说甲数是乙数的 倍数,乙数是甲数的因数。 如: 12÷4=3 4 就是 12 的因数 2 、回顾一下,我们认识的自然数可以分 成几类? 3 、其实自然数还有一种新的分类方法, 你知道吗?这就是我们今天这节课的学.
Advertisements

因数与倍数 2 、 5 的倍数的特征
质数和合数 2 的因数( ) 6 的因数( ) 10 的因数 ( ) 12 的因数 ( ) 14 的因数 ( ) 11 的因数 ( ) 4 的因数( ) 9 的因数( ) 8 的因数( ) 7 的因数( ) 1 、 2 、 3 、 4 、 6 、 12 1 、 11 1 、 2 、 5 、 10.
因数与倍数 2 、 5 的倍数的特征 绿色圃中小学教育网 扶余市蔡家沟镇中心小学 雷可心.
2.8 函数的微分 1 微分的定义 2 微分的几何意义 3 微分公式与微分运算法则 4 微分在近似计算中的应用.
《C语言程序设计》复习
第五章 函数 本章学习重点:  函数的定义与函数声明;  函数的调用;  函数的嵌套调用与递归调用;  数组作为函数参数;
6.4 字符串与指针 1. 用字符数组存放一个字符串.
C++中的声音处理 在传统Turbo C环境中,如果想用C语言控制电脑发声,可以用Sound函数。在VC6.6环境中如果想控制电脑发声则采用Beep函数。原型为: Beep(频率,持续时间) , 单位毫秒 暂停程序执行使用Sleep函数 Sleep(持续时间), 单位毫秒 引用这两个函数时,必须包含头文件
在PHP和MYSQL中实现完美的中文显示
第8讲 函数 8.1 函数的定义与调用 8.2 函数的参数 8.3 函数重载与递归 8.4 标识符作用域与变量的存储特性.
第5章 函数与模块化设计 学习目的与要求: 掌握函数的定义及调用方法 理解并掌握参数的传递方法 理解函数的嵌套与递归调用
4.3函数 4.3.1函数的概念及定义 1、函数的概念: 可以被其它程序调用具有 特定功能的一段相对独立的 程序(模块),称函数。
第5章 函数及变量的存储类别 5.0 概述 5.1函数的定义 5.2函数调用 5.3变量的作用域和存储类别 5.4内部函数和外部函数
由C程序结构所知,一个完整的C语言程序是由一个且只能有一个main()函数(又称主函数)和若干个其他函数组合而成的。而前面各章仅学习main()函数的编程,本章将介绍其他函数的编程,包括其他函数的定义、调用、参数传递及变量的作用域等。
第八章 函数 §8.1 概述 一个较大程序一般分为若干个程序模块,每一个模块实现一个特定的功能。所有的高级语言中都有子程序的概念,在C中子程序就是函数。 一个C程序可由一个主函数和若干个函数构成,由主函数调用其它函数,其它函数也可以相互调用.
C语言程序设计基础 刘新国.
目录 第八章 数组 1 简单学生成绩管理系统的开发 2 一维数组 3 多维数组 4 字符数组 5 数组作函数参数.
第七章 函数 目录 有参的加法函数的开发 函数定义的一般形式 函数参数和函数的值 函数的调用
第7章 函 数 本章要点: C语言程序结构和特点 函数的定义 函数的返回值与函数的类型 函数的调用及参数的传递关系 函数的嵌套与递归
C程序设计 谭浩强 著 清华大学出版社.
第八章 函数.
辅导课程六.
第7章 函 数 为什么要使用函数? 函数定义、调用、声明 局部变量和全局变量 变量的存储类别 内部函数和外部函数 函数的嵌套调用和递归调用
第一单元 初识C程序与C程序开发平台搭建 ---观其大略
6.4.1指针与二维数组 1、二维数组结构的分析 设有数组定义为:int a[3][4]; 则有: a表示数组在内存中的首地址。
Chap 5 函数 5.1 计算圆柱体积 5.2 使用函数编写程序 5.3 变量与函数.
第7章 用函数实现模块化程序设计 7.1为什么要用函数 7.2怎样定义函数 7.3调用函数 7.4对被调用函数的声明和函数原型
动态规划(Dynamic Programming)
第七章 函数 西安工程大学.
第五章 习题课 电子信息与计算机科学系 曾庆尚.
第七章 操作符重载 胡昊 南京大学计算机系软件所.
实验九 函数嵌套、函数参数 第27讲 C程序设计 Main() { int x,y; X=10; y=x*x+1;
宁波市高校慕课联盟课程 与 进行交互 Linux 系统管理.
第1章 概述 本章要点: C语言程序结构和特点 C语言程序的基本符号与关键字 C语言程序的编辑及运行 学习方法建议:
第一章 函数与极限.
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
1.3 C语言的语句和关键字 一、C语言的语句 与其它高级语言一样,C语言也是利用函数体中的可执行 语句,向计算机系统发出操作命令。按照语句功能或构成的不 同,可将C语言的语句分为五类。 goto, return.
简单介绍 用C++实现简单的模板数据结构 ArrayList(数组, 类似std::vector)
C语言大学实用教程 第5章 函数与程序结构 西南财经大学经济信息工程学院 刘家芬
C语言复习3----指针.
THE C PROGRAMMING LANGUAGE
C语言复习2----函数.
第7章 函 数 7.1 函数的定义与调用 7.2 函数的嵌套调用与递归调用 7.3 数组作为函数参数 7.4 内部变量与外部变量
函数 概述 模块化程序设计 基本思想:将一个大的程序按功能分割成一些小模块, 特点: 开发方法: 自上向下,逐步分解,分而治之
C语言程序设计.
目录 7.1 用户自定义函数的种类 7.2 函数的定义 7.3 被调函数的声明 7.4 函数的调用 7.5 函数的嵌套调用
<编程达人入门课程> 本节内容 内存的使用 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群: ,
主讲:相方莉.
C语言程序设计 第一章 数据类型, 运算符与表达式 第二章 顺序程序设计 第三章 选择结构程序设计 第四章 循环控制 第五章 数组.
7.1 C程序的结构 7.2 作用域和作用域规则 7.3 存储属性和生存期 7.4 变量的初始化
第五章 函 数 要点:掌握函数的定义,函数的原形,函数的返回值,函数的调用,函数的形式参数和实际参数之间的关系;掌握函数重载的使用方法,关键字inline的含义与使用,掌握变量的作用域与生存期,了解函数的作用域。
成绩是怎么算出来的? 16级第一学期半期考试成绩 班级 姓名 语文 数学 英语 政治 历史 地理 物理 化学 生物 总分 1 张三1 115
第十章 指针 指针是C语言的重要概念,是C语言的特色,是C语言的精华。 10.1 地址和指针的概念 内存中的每一个字节都有一个地址。
C程序设计.
第4章 Excel电子表格制作软件 4.4 函数(一).
5.4.1 二维数组 (一) 二维数组的定义 1. 二维数组定义的一般形式 类型说明符 数组名[常量表达式][ 常量表达式]
第九节 赋值运算符和赋值表达式.
3.16 枚举算法及其程序实现 ——数组的作用.
本节内容 结构体 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
多层循环 Private Sub Command1_Click() Dim i As Integer, j As Integer
第7章 模板 陈哲 副教授 南京航空航天大学 计算机科学与技术学院.
第7章 用函数实现模块化程序设计 7.1为什么要用函数 7.2怎样定义函数 7.3调用函数 7.4对被调用函数的声明和函数原型
本节内容 C语言的汇编表示 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
第二节 函数的极限 一、函数极限的定义 二、函数极限的性质 三、小结 思考题.
C++语言程序设计 C++语言程序设计 第一章 C++语言概述 第十一组 C++语言程序设计.
本节内容 动态链接库 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
C++语言程序设计 C++语言程序设计 第九章 类的特殊成员 第十一组 C++语言程序设计.
C++语言程序设计 C++语言程序设计 第十章 多态 第十一组 C++语言程序设计.
计算机编程 信息管理与工程学院 2014年9月.
Presentation transcript:

第8章 函数 信息管理系

8.1 引言 C程序是的基本组成单位是函数 一个C程序可由一个主函数和若干个函数构成。也就是说,计算机程序设计和问题求解的基本思想是:将一个大的、复杂的问题分解成若干小的、简单的子问题来逐一解决。 如:求 的值 我们可以这样做: 1、数据输入:输入n的值。 2、编写一个功能块,可以计算一个数的阶乘值。 这个功能块可写成下面的形式:jiech(i)作用是计算n的阶乘。 3、令i从1变化到n,将1/jiech(i)依次加到和里面。

象上面的功能块就可以用函数来实现。也就是说,一个函数实际上就是一个功能块,可以实现一个特定的功能。我们可以用下面的形式来表示: f1() { • • f11() } f11() { • • } main() { • • f1() f2() } f21() { • • f211() } f211() { • • } f2() { • • f21() f22() } f22() { • • }

8.2 标准函数 C语言将一些常用的操作都写成了函数的形式,放到函数库中,用户可以随时从函数库中取这些函数来实现相应的功能。 如printf(),scanf(),strcmp(),gets(),pow()等。 这些C语言自带的函数,称为标准函数,也称库函数。 这些库函数的是怎样实现相应的功能的? 它们的实现步骤都写成函数的形式放在头文件中。 如:printf()、scanf()等函数的定义都放在stdio.h中; 对字符串的操作函数都放在string.h中; 一些数学运算的函数都放在math.h中; 作图函数都放在graphic.h中。 所以我们在使用这些函数时,要记得在主函数的前面写上这样的句子#include<***.h>

8.3标准函数的使用 例1、求一元二次方程 的根。 (见程序P8_1) 使用标准函数时我们要注意: 1、了解C语言提供了那些函数? 例1、求一元二次方程 的根。 (见程序P8_1) 使用标准函数时我们要注意: 1、了解C语言提供了那些函数? 2、了解每个标准函数的功能和使用格式。 3、用户使用这些函数时,不要忘了包含其中的头文件。

8.4自定义函数 C语言本身提供的函数尽管非常丰富,但是仍不能满足程序设计的需要,因此,很多时候还需要我们自己编写函数来实现某些功能。 用户自己编写的函数称为自定义函数 用户编写函数时,需注意以下两个问题, 1、函数如何定义 2、自定义函数如何使用

8.5 函数的定义 我们先来回顾以下主函数的形式: main() { 函数体 } 函数定义的格式: 函数返回值类型 函数名(函数的形参列表) 函数返回值类型 函数名(函数的形参列表) { 函数体 }

8.5 函数的定义 例如:我们上面的计算任一个整数 i 的阶乘的函数可以这样定义: long jiech(int i) {int j; for(j=1;j<i;j++) ji=ji*j; return(ji); }

8.5 函数的定义 说明: 1、函数名: 函数名的命名规则符合标识符的规则; 函数的名字不要与库函数的名字重名。 2、函数体: 跟主函数的函数体是一样的。 即:描述函数如何一步步实现预定的功能的。也就是说函数体是实现该功能的一系列语句。 函数体包括两部分:一是变量声明部分,二是功能实现部分。 函数体可以为空,此时该函数什么也不做。

8.5 函数的定义 3、函数的参数:函数要实现预定的功能需要外界提供的一些数据。函数参数要放到()中,定义时的函数参数叫形式参数,简称形参。 函数可以有任意个形参。即可以有一个可以有多个,也可以没有。 所以,据此,函数又分为有参函数和无参函数两种。 函数的形参实际上就是若干变量,要先声明类型,再说明形参的名字。 如果函数有多个形参,中间要用逗号隔开。 如:定义max函数,求两个整数中较大的那个,应写为: int max(int a,int b)

8.5 函数的定义 4、函数返回值是指该函数通过函数体定义的一系列操作,可以提供给外界的结果。 函数的返回值由return语句返回。返回值保存在函数名中,可以直接参与运算。 例如:编写求半径为n的圆的面积的函数,并利用上述函数求半径为2,高为5的圆柱体的体积。 函数可以有返回值也可以没有返回值。如果没有返回值,说明函数只是实现了一系列的操作,此时返回值的类型为void类型。例如: 程序p3.c 输出下面的图案: * * * * * * * * * * * * * * * *

8.5 函数的定义 如果函数的返回值为整型或字符型,函数返回值的类型可以不写; 函数体中可以有多个return语句,但只执行其中的一个。函数一旦执行了一个return语句,便结束。 如:fun(int n) {if (n%2= =0) return(2*n); else return(2*n-1); } 此处的else可以不写。 return后的()可以不用。 如果函数体中有多个return语句,则他们返回值的类型应该一致。

8.5 函数的定义 C语言中,所有函数的地位都是平等的,所以在定义时应该是相互独立的。 也就是说一个函数不能在另一个函数的函数体中定义。 8.5 函数的定义 C语言中,所有函数的地位都是平等的,所以在定义时应该是相互独立的。 也就是说一个函数不能在另一个函数的函数体中定义。 也就是说函数可以在main()前定义,也可以在main()函数后定义,但不能在main()函数体中定义。

8.6函数的调用 函数是不能独立运行的。 函数的使用叫调用。 只能在main()函数中调用它,才能运行。

8.6函数的调用 如果函数在main()函数前定义,则可以直接在main()函数体中调用。

8.4函数的调用 在一个函数中调用另一个函数需要具备下面的条件: 1、首先被调用的函数必须是已经存在的函数(是库函数或用户自己定义的函数); 2、如果使用库函数,一般还应在程序开头用#include命令将该库函数所在的头文件包含进来; 3、如果使用用户自己定义的函数,而且该函数与调用它的函数(主调函数)在同一个文件中,一般还应该在主调函数中对被调用函数作声明。 定义与声明不是一回事: 定义:是指对函数功能的确立,包括指定函数名、函数值类型、形参及其类型、函数体等,它是一个完整的独立的函数单位。 声明:的作用是把函数的名字、类型以及形参的类型、个数和顺序通知编译系统,以便在调用该函数时系统按此进行对照检查(例如函数名是否正确,实参与形参的类型和个数是否一致等,以确保参数传递的正确性)。 可以简单地照写以定义函数地首部,再加一个分号,就成了对函数的声明。

函数的声明 例如:假设有如下函数定义: Double func(double a,int b,char c) { 函数体 } 那么如下几种声明方式都是正确的: 1、double func(double a, int b,char c); 2、double func(double x, int y,char z); 3、double func(double,int, char); 下面几种声明是错误的: 1、double func(a,b,c);漏掉了参数类型 2、func(double a,int b,char c);漏掉了函数类型

函数的声明 函数声明的几点说明: 1、形参名字可以与定义时的名字不一样,但形参的个数、类型与排列顺序绝对不能变; 2、在函数声明时,可以省略形参的名字; 3、当函数返回int或char型值时,函数声明可以省略; 4、在同一文件中,如果函数定义写在前面,主调函数写在后面时,可以省略函数声明。 5、函数声明可以在主调函数的内部声明,也可在所有函数的外部声明。 例如:输出松树图形的例题。

函数的调用 函数调用的一般形式: 函数名(实参列表); 例如求圆柱体体积的程序。 函数调用的方式: 1、函数语句 把函数调用作为一个语句。如程序P8_2 2、函数表达式 函数出现在一个表达式中。如程序P8_3 3、函数参数 函数调用作为函数的实参。如程序P8_4 多个文件的运行方法。

形式参数与实在参数参数值的传递 形式参数:函数定义时的参数 实在参数:函数调用时的参数 在调用函数的那一刻,必须进行形参和实参的结合,也就是说形参必须得到实参的值。那么形参如何得到值呢: 在C语言中,实参与形参是按值传递的。也称为“传值调用”。传值调用的过程如下: 1、形参与实参各占一个独立的存储空间 2、调用时,将实参的值传入形参单元 3、在被调用的函数内,访问相应的形参单元。 4、函数调用结束后,释放形参单元。

参数值的传递 main( ) {int a,b,m; a=5;b=3; m=max(a,b); printf(“\n%d”,m); } y max(int x, int y) {if(x>y) return(x); else return(y); 3 5 3 5 max函数数据区 y 3 x 5 b b main函数数据区 main函数数据区 a a 调用时 调用后

参数值的传递 y 4 15 x 15 4 b b a a 15 4 15 4 调用时 调用后,退出max函数前 main() {int a=4,b=15; viod swap(int x,int y); swap(a,b); printf(“a=%d,b=%d\n”,a,b); } void swap(int x,int y) {int t; t=x;x=y;y=t; printf(“x=%d,y=%d\n”,x,y); 15 4 15 4 swap函数数据区 y swap函数数据区 4 15 x 15 4 b b main函数数据区 main函数数据区 a a 调用时 调用后,退出max函数前

函数的嵌套调用 如:P8_5 main() { …… fun1(); } fun1() { …… fun2(); } fun2() { ……

函数的递归调用 我们知道函数可以嵌套调用,如果嵌套的函数是它本身则称为递归调用。 一个函数直接或间接地调用自身,便构成了函数的递归调用。例如:设用函数fun(n)来计算n!。 一种方法: 我们还可以用另一种方法: long fun(int n) {long ji=1; int i; for(i=1;i<=n;i++) ji=ji*i; return(ji); } long fun(int n) {long ji; if (n==1) ji=1; else ji=fun(n-1)*n; return(ji); } 也就是说n!就是在 (n-1)!的基础上乘上n就可以了。

函数的递归调用 *5 *4 *3 *2 1 1 n-1 例如要求5!执行如下: ? 2 2 n-1 120 Fun(5) ? 6 24 fun(3) fun函数数据区 3 6 Fun(3) n-1 24 ? 2 Fun(2) fun(4) 4 n-1 *5 1 Fun(1) Fun(1)=1 *4 120 ? fun(5) *3 *2 n 5 120 main函数数据区 a 调用时

函数的递归调用 练习: 1、利用函数的递归调用,写一函数求Fibonacci序列的第n项。 即:F1=1; F2=1; Fn=Fn-1+Fn-2 2、利用函数的递归调用,写一函数求f(x)的值。 已知 f(x)= (见程序P8_6, P8_7) x (x=1) 2*f(x-1)+1 (x>1)

数组作为函数参数 一个函数不仅可以对一些单个的数据进行处理,也可以对数组进行处理。这个时候,我们往往需要外界提供给它一个数组作为参数。 例如:可以把一个数组的输出写成函数的形式。 printarr(int a[],int n) {int i; printf(“\n”); for(i=0;i<n;i++) printf(“%5d”,a[i]); } main() {int a[9]={1,2,3,4,5,6,7,8,9}; printarr(a,9); }

数组作为函数参数的几点说明 1、数组元素可以作为函数的参数,作为普通的变量使用,此时形参与实参“按值传递”数据。 例如:gen(int a,int b,int c)函数用来求ax2+bx+c=0的根。若a,b,c分别存储在数组s[3]中,则可以这样调用:gen(s[0],s[1],s[2]); 2、数组名可以作为函数参数。 数组名作为参数时,实际需要的是数组的起始地址和数据的个数n。对从这个起始地址开始的n个位置的数据进行处理。 实参数组与形参数组类型应一致; 形参中数组可不定义大小,但要在数组后跟一个空[]。 对函数进行调用时,形参与实参共用一组地址空间。

数组作为函数参数的几点说明 printarr(int b[],int n) {int i; printf(“\n”); for(i=0;i<n;i++) printf(“%5d”,b[i]); } 9 8 7 6 5 4 3 2 1 printarr函数数据区 i 9 n b 2000 a[8] a[7] a[6] main函数数据区 main() {int a[9]={1,2,3,4,5,6,7,8,9}; printarr(a,9); } a[5] b a[4] a[3] a[2] a[1]2002 a[0]2000

数组作为函数参数 1、将一个一维数组的输入、输出写成函数的形式; 编写函数实现两个一维数组的加法, 并调用它们完成两个数组的加法。 2、将一个二维数组的输入、输出写成函数的形式; 编写函数实现两个二维数组的加法, 并调用它们完成两个数组的加法,并输出结果。 3、编写函数实现一组数据的冒泡排序,并调用它完成 任一组数据的排序。 4、写一函数判断一个整数是否为素数,并调用它输出一个整数的所有质因子(所有为素数的因子)。 5、写一函数,删除数组中下标为k的元素,并调用该函数,删除一个数组中所有值为x的元素

练习: 1.以下对C语言函数的描述中,正确的是( )。 A)C程序由一个或一个以上的函数组成 B)C函数既可以嵌套定义又可以递归调用 D)C程序中调用关系的所有函数必须放在同一个程序文件中 2.一个C程序由函数A(),B(),C()和函数P()构成,在函数A()中分别调用了函数B()和函数C(),在函数B()中调用了函数A(),且在函数P()中也调用了函数A(),则可以说( )。 A)函数B()中调用的函数A()是函数A()的间接递归调用 B)函数A()被函数B()调用是直接递归调用 C)函数P()直接递归调用了函数A() D)函数P()中调用的函数A()是函数P()的嵌套

3.下面不正确的描述为( )。 A)调用函数时,实参可以是表达式 B)调用函数时,实参与形参可以共用内存单元 C)调用函数时,将为形参分配内存单元 D)调用函数时,实参与形参的类型必须一致 4.在调用函数时,如果实参是简单变量,它与对应形参之间的数据传递方式是( )。 A)地址传递 B)单向值传递 C)由实参传给形参,再由形参传回实参 D)传递方式由用户指定

5.在C语言程序中( )。 A)函数的定义可以嵌套,但函数的调用不可以嵌套 B)函数的定义和调用均可以嵌套 C)函数的定义和调用均不可以嵌套 D)函数的定义不可以嵌套,但函数的调用可以嵌套 6.以下函数调用语句中,含有的实参个数是( )。 fun(x+y,(e1,e2),fun(xy,d,(a,b))); A)3 B)4 C)6 D)8

7.以下程序输出的结果是( )。 #include <stdio.h> 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)15

8.以下程序的输出结果是( )。 #include <stdio.h> long fib(int n) {if(n>2)return(fib(n-1)+fib(n-2)); else return(2); } main( ) {printf("%d\n",fib(3));} A)2 B)4 C)6 D)8

9.以下程序的输出结果是( )。 #include <stdio.h> 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)无定值  

10.以下函数值的类型是( )。 fun ( float x ) {float y; y= 3*x-4; Return y; } A)int B)不确定 C)void D)float

11.以下程序的输出结果是( )。 #include <stdio.h> inta, b; void fun( ) {a=100; b=200; } main( ) { int a=5, b=7; fun( ); printf("%d%d\n", a,b); } A)100200 B)57 C)200100 D)75

12.下面程序的运行结果是______。 #include <stdio.h> main( ) { int x=10; func(x); printf("%d\n",x); } func(int x) { x=20;

13.下面程序的运行结果是______。 #include <stdio.h> int a=5; int b=7; main( ) { int a=4, b=5,c; c=plus(a,b); printf("A+B=%d\n",c); } plus(int x,int y) { int z; z=x+y; return(z);  

回顾: 一、为什么要引入函数? 二、函数如何定义?(如何写一个函数?) 三、如何调用一个函数? 四、什么是函数的嵌套调用和递归调用? 五、形参与实参之间是如何进行参数传递的?

函数的定义格式 函数类型 函数名(形参列表) { …… } ………函数的首部 定义变量 ………函数体 功能的 实现步骤

函数的调用 调用格式: 函数名(实参列表); 调用形式: 1、函数调用作为一条独立的语句; 2、函数调用可以出现在表达式中; 3、函数调用可以作为参数; 注意事项: 1、调用库函数 2、当被调函数在主调函数的后面定义的时候

实验十一 实验名称:函数的使用 实验目的: 1、掌握定义、声明和调用函数的方法; 2、掌握数组作为函数参数的方法,体会数组作为函数参数时,形参与实参的传递方式。 3、掌握函数的递归调用和嵌套调用 实验要求: 1、写一个判断素数的函数。调用上述函数,输出一个数所有的质因子(是素数的因子)。 2、写一函数,用冒泡法对一组数据进行排序,在主函数中调用该函数,对数组中从下标为3的数开始的数据进行排序,查看运行结果。 3、编写函数,用递归法求将一个十六进制数转换为十进制数。

回顾 Exp1.c

局部变量和全局变量 一、局部变量 在一个函数的内部定义的变量是内部变量,它只在本函数内有效,也就是说只有在本函数内才能使用他们,在此函数以外不能使用这些变量。这样的变量称为“局部变量” 例如: P8_2~P8_4

局部变量 说明: 1、主函数(main函数)中定义的变量也只能在主函数中有效。 2、不同函数中可以使用相同名字的变量,它们代表不同的对象,互不干扰。 3、形式参数也是局部变量。(exp2.c) 4、在一个函数的内部,可以在复合语句中定义变量,这些变量只在本复合语句中有效。例如: Main() {int a,b; …… {int c; c=a+b; } a,b在此范围内有效。 C在此范围内有效。

全局变量(exp1.c) 在函数内定义的变量是“局部变量”,也称“内部变量”。 在函数外定义的变量是“全局变量”,也称“外部变量”。 全局变量可以被本文件中的所有函数共用。 它的有效范围为从定义变量的位置到本文件的结束。 如: int p=1,q=5;—————————————————— float f1(int a)——— {…… }—————————— char c;—————————————— char f2(int x,inty)… } main() }——————————————————————— 局部变量a的有效范围 全局变量p,q的有效范围 局部变量x,y的有效范围 全局变量c的有效范围

变量的存储类别 从变量的作用域的角度来分,可分为局部变量与全局变量; 从变量值存在的时间来分,可分为动态存储方式与静态存储方式: 所谓静态存储方式是指在程序运行期间分配固定的存储空间的方式 所谓动态存储方式是指在程序运行期间根据需要进行动态的分配存储空间的方式。 用户使用的存储空间分三部分: 程序区(存放程序) 静态存储区(存放全局变量) 动态存储区(存放函数的形式参数、自动变量、函数调用时的现场保护和返回地址等)

变量的存储类别 在C语言中,每一个变量和函数都有两个属性:数据类型和数据的存储类别。 数据类型:如整型、实型、字符型等,决定存储空间的大小。 存储类型:指数据在内存中的存储方式。(exp3.c) 主要分两大类:静态存储和动态存储。 具体包含四小类: 自动的(auto),静态的(static), 寄存器的(register),外部的(extern)。 根据变量的存储类别,可以知道变量的作用范围和生存期。

auto变量 函数中的局部变量,如不特殊说别,都作为auto类型变量处理。这类变量动态存储。 如: Int fun(int a) {auto int b=3; …… } 关键字auto可以省略。

静态变量(static) 有时希望函数中的局部变量在函数调用结束后不消失而保留原值与存储空间,这时就需要将变量定义为静态类型。 例如: fun(int a) {int b=0; static int c=3; b=b+1;c=c+1; return(a+b+c); } main() {int a=2,i; for(i=0;i<3;i++) printf(“%d ”,fun(a)); a b c 2 3 第一次调用开始 2 1 4 第一次调用结束 2 4 第二次调用开始 2 1 5 第二次调用结束 2 5 第三次调用开始 2 1 6 第三次调用结束

对静态变量的几点说明: 1、静态局部变量属于静态存储类别,在静态存储区分配存储单元,在程序的整个运行期间都不释放。而自动变量属于动态存储类别,占用动态存储区空间,函数调用结束后释放。 2、对静态局部变量是在编译时赋初值的,即只赋值一次,在程序运行时已有初值。以后每次调用函数时不再重新赋初值而只是保留上次函数调用结束时的结果。对自动变量赋初值,不是在编译时进行的,而是在函数调用时进行,每调用一次函数重新赋一次初值。 3、如在定义局部变量时不赋初值,则对静态变量来说,编译时自动赋初值0(对数值型变量)或‘\0’(对字符型变量)。而对自动变量来说,如果不赋初值,它的值是一个不确定的值。 4、虽然静态局部变量在函数调用结束后仍然存在,但其他函数是不能引用它的。

寄存器变量(register) 一般情况下,变量(包括静态和动态)的值是存储在内存中的。 如果有一些变量使用频繁,C语言允许将值存放到寄存器中,以提高存取效率。 值存放到寄存器中的变量叫做寄存器变量。用关键字register声明。 Register int I; 说明: 1、只有局部自动变量和形式参数可以作为寄存器变量。其他(如全局变量与局部静态变量)不行。 2、一个计算机系统中的寄存器数目是有限的,不能定义多个寄存器变量。不同的系统允许使用的寄存器个数是不同的。

外部变量(extern) 一、在一个文件内声明外部变量 如果外部变量不在文件的开头定义,其有效范围只限于定义处到文件结束。 如:int max(int a,int b) {int c; c=a>b?a:b; return ( c ); } main() {extern int A,B; printf(“%d”,max(A.B)); int A=13,B=-8;

变量存储类别小结 变量存储类别 函数内 函数外 作用域 存在性 自动变量和寄存器变量   静态局部变量 静态外部变量 (只限本文件)

内部函数与外部函数 内部函数: 如果一个函数只能被本文件中的其他函数调用,称为内部函数。也叫静态函数。 内部函数的定义方式为: static 函数类型 函数名(形参列表) 这样定义的函数只局限于所在文件,其他文件不能使用。如果在不同的文件中有同名的内部函数,它们互不干扰。

外部函数 在定义函数时前边加关键字extern,则该函数为外部函数,这样定义的函数不仅可以被本文件使用,还可以被其他文件使用。外部函数在定义时可以省略关键字extern。 其他文件调用外部函数时,需用extern加以说明。

练习: #include <stdio.h> main( ) { int a=5, b=7; fun( ); 1、以下程序的输出结果是( )。 #include <stdio.h> main( ) { int a=5, b=7; fun( ); printf(“\n a=%d,b=%d", a,b); } fun( ) {int a=10, b=20; printf(“\na=%d,b=%d”,a,b); } #include <stdio.h> int a, b; main( ) {a=2; b=5; fun( ); printf("\na=%d,b=%d", a,b); } fun( ) {a=10, b=20; printf("\na=%d,b=%d",a,b); } a=10,b=20 a=5,b=7 a=10,b=20

练习: 3、以下各函数的首部中,正确的是() A、void play(var:int,var:b) B、void play(int a,b) C、void play(int a,int b) D、void play(int a,int b);  

4、以下程序的输出结果是() #include <stdio.h> int f( ) {static int i=0; int s=1; s+=i; i++; return s; } main( ) { int j,a=0; for(j=0;j<5;j++) a+=f( ); printf("%d\n",a);} A)20 B)24 C)25 D)15 j a i s

练习: 1、在C语言中,函数的隐含存储类别是() A、auto B、static C、extern D、无存储类别 2、当调用函数时,实参是一个数组名,则向函数传送的是() A、数组的长度 B、数组的首地址 C、数组每一个元素的地址 D、数组每个元素中的值 3、以下只有在使用时才为该类型变量分配存储空间的存储类型说明是() A、auto和static B、auto和register C、register和static D、extern和register 4、若有以下程序,则以下叙述中不正确的是()

5、以下程序的输出结果是: A、10 B、18 C、8 D、15 #include<stdio.h> void f(int n); main() {void f(int n); f(5); } void f(int n) {printf(“%d”,n); void f2() { …… 5、以下程序的输出结果是: A、10 B、18 C、8 D、15 A、若只在主函数中对函数f进行说明,则只能在主函数中正确调用函数f; B、若在主函数前对函数f进行说明,则在主函数和其后的其他函数中都可以正确调用函数f C、对于以上程序,编译时系统会提示出错信息:提示对函数f重复说明 D、函数f无返回值,所以可用void将其类型定义为无值型 f(int b[],int m,int n) {int i,s=0; for(i=m;i<n;i=i+2) s=s+b[i]; return(s); } main() {int x,a[]={1,2,3,4,5,6,7,8,9}; x=f(a,3,7); printf(“%d\n”,x);

6、以下程序的 运行结果是() #include<stdio.h> main() {int k=4,m=1,p; p=func(k,m); printf(“%d”,p); p=func(k,m); printf(“%d \n”,p); } func(int a,int b) {static int m=0,i=2; i+=m+1; m=i+a+b; return(m);

7、以下程序中,sort函数的功能是对a所指数组的所有元素进行由大到小的排序,程序运行后的输出结果是: void sort(int a[],int n) {int i,j,t; for(i=0;i<n-1;i++) for(j=i+1;j<n;j++) if(a[i]<a[j]) {t=a[i];a[i]=a[j];a[j]=t;} } main() {int aa[10]={1,2,3,4,5,6,7,8,9,10},i; sort(&a[3],5); for(i=0;i<10;i++) printf(“%d”,aa[i]);

8、设在主函数中有以下定义和函数调用语句,且fun函数为void类型;请写出fun函数的首部,要求形参名为b。 9、以下程序的输出结果是() main() {double s[10][22]; int n; …… fun(s); } void fun() {static int a=0; a+=2; printf(“%d”,a); } main() {int cc; for(cc=1;cc<4;cc++) fun(); printf(“\n”);

10、在C语言中,形参的默认存储类型是() A、auto B、static C、extern D、register 11、在调用函数时,如果实参是简单变量,它与对应形参之间的数据传递方式是() A、地址传递 B、由实参传给形参,再由形参传回实参 C、单向值传递 D、传递方式由用户指定 12、以下叙述中不正确的是() A、在不同的函数中可以使用相同名字的变量 B、函数中的形式参数是局部变量 C、在一个函数内定义的变量只在本函数范围内有效 D、在一个函数内的复合语句中定义的变量在本函数范围内有效

13、函数fun的功能是:使一个字符串按逆序存放,请填空: void fun (char str[]) {char m;int i,j; for(i=0;j=strlen(str);i< ;i++,j--) {m=str[i]; str[i]= ; str[j-1]=m; } printf(“%s\n”,str);

将数据中的数据倒置存放,如: ‘4’ ‘7’ ‘6’ ‘3’ ‘1’ ‘5’ ‘2’ ‘2’ ‘5’ ‘1’ ‘3’ ‘6’ ‘7’ ‘4’

程序改错 1、给定程序中,函数fun()的功能是:计算整数n的阶乘。请改正程序中的错误,使它能计算出正确的结果。 注意:不要改动main()函数,不得增行或删行,也不得更改程序的结构。 double fun(int n) {double result=1.0; while(n>1 && n<170) result*=--n; return; } main() {int n; printf(“Enter an interger:\n”); scanf(“%d”,&n); printf(“\n%d!=%lg”,n,fun(n));

程序改错 2、给定程序中,函数fun()的功能是:求广义菲玻那契级数的第n项。1,1,1,3,5,9,17,31,第n项值通过函数返回main函数输出。请改正程序中的错误,使它能计算出正确的结果。 注意:不要改动main()函数,不得增行或删行,也不得更改程序的结构。 long fun(int n) {long a=1,b=1,c=1,k; for(k=4;k<=n;k++) d=a+b+c; a=b; b=c; c=d; return(d); } main() {int n=15; printf(“\nthe value is:%ld”,fun(n));

程序设计 int fun(int array[3][3]) { } int printarr(int a[3][3]) {int I,j; for(I=0;I<3;I++) {printf(“\n”); for(j=0;j<3;j++) printf(“%7d”,array[I][j]); main() {int array[3][3]={{100,200,300}, {400,500,600},{700,800,900}}; printarr(array); fun(array); 1、编写函数fun()。它的功能是:实现矩阵(3×3)的转置。 例如输入下面的矩阵: 100 200 300 400 500 600 700 800 900 程序输出 100 400 700 200 500 800 300 600 900 请勿改动主函数和其他函数中任何内容,仅在函数fun()的花括号中填入所编写的若干语句。

程序设计 int fun(int score[],int m,int below[]) { } main() {int I,n,below[9]; int score[9]={10,20,30,40, 50,60,70,80,90}; n=fun(score,9,below); printf(“\nbelow the average score are:\n”); for(I=0;I<n;I++) printf(“%d “,below[I]); 2、将m个人的成绩存放在数组score中,请编写函数fun(),它的功能是:将低于平均分的人数作为函数值返回,将低于平均分的分数存放在below所指向的数组中。 例如:当score数组中的数据为:10、20、30、40、50、60、70、80、90时,函数返回的人数应该是4,blow中的数据应为10、20、30、40。 请勿改动主函数和其他函数中任何内容,仅在函数fun()的花括号中填入所编写的若干语句。