C语言程序设计基础 刘新国.

Slides:



Advertisements
Similar presentations
第五节 函数的微分 一、微分的定义 二、微分的几何意义 三、基本初等函数的微分公式与微分运算 法则 四、微分形式不变性 五、微分在近似计算中的应用 六、小结.
Advertisements

2.8 函数的微分 1 微分的定义 2 微分的几何意义 3 微分公式与微分运算法则 4 微分在近似计算中的应用.
2.5 函数的微分 一、问题的提出 二、微分的定义 三、可微的条件 四、微分的几何意义 五、微分的求法 六、小结.
第8章 函数 信息管理系.
第五章 函数 本章学习重点:  函数的定义与函数声明;  函数的调用;  函数的嵌套调用与递归调用;  数组作为函数参数;
Oracle数据库 Oracle 子程序.
第三章 导数与微分 习 题 课 主要内容 典型例题.
C++中的声音处理 在传统Turbo C环境中,如果想用C语言控制电脑发声,可以用Sound函数。在VC6.6环境中如果想控制电脑发声则采用Beep函数。原型为: Beep(频率,持续时间) , 单位毫秒 暂停程序执行使用Sleep函数 Sleep(持续时间), 单位毫秒 引用这两个函数时,必须包含头文件
第8讲 函数 8.1 函数的定义与调用 8.2 函数的参数 8.3 函数重载与递归 8.4 标识符作用域与变量的存储特性.
C语言程序设计 第八章 函数.
4.3函数 4.3.1函数的概念及定义 1、函数的概念: 可以被其它程序调用具有 特定功能的一段相对独立的 程序(模块),称函数。
第八章 函数 §8.1 概述 一个较大程序一般分为若干个程序模块,每一个模块实现一个特定的功能。所有的高级语言中都有子程序的概念,在C中子程序就是函数。 一个C程序可由一个主函数和若干个函数构成,由主函数调用其它函数,其它函数也可以相互调用.
第3章 顺序结构程序设计 本章要点: 格式化输出函数──printf() 格式输入函数——scanf() 字符输出函数——putchar()
Chap 10 函数与程序结构 10.1 函数的组织 10.2 递归函数 10.3 宏定义 10.4 编译预处理.
If … else 選擇結構 P27.
Chap 2 用C语言编写程序 2.1 在屏幕上显示 Hello World! 2.2 求华氏温度 100°F 对应的摄氏温度
第七章 函数 目录 有参的加法函数的开发 函数定义的一般形式 函数参数和函数的值 函数的调用
第7章 函 数 本章要点: C语言程序结构和特点 函数的定义 函数的返回值与函数的类型 函数的调用及参数的传递关系 函数的嵌套与递归
《C++程序设计》 主讲教师:张玉宏.
走进编程 程序的顺序结构(二).
C程序设计 谭浩强 著 清华大学出版社.
辅导课程六.
第7章 函 数 为什么要使用函数? 函数定义、调用、声明 局部变量和全局变量 变量的存储类别 内部函数和外部函数 函数的嵌套调用和递归调用
第7章 编译预处理 本章要求: 本章重点: 本章难点: 掌握用#define定义无参数宏和带有参数宏定义和调用方法;
函数.
6 使用者函數 6.1 函數定義 宣告函數 呼叫函數 呼叫多個函數 6-6
第一单元 初识C程序与C程序开发平台搭建 ---观其大略
算法的基本概念.
Chap 5 函数 5.1 计算圆柱体积 5.2 使用函数编写程序 5.3 变量与函数.
C语言 程序设计基础与试验 刘新国、2012年秋.
第五讲 四则运算计算器(一) 精品教程《C#程序设计与应用(第2版)清华大学出版社 谭恒松 主编
第7章 用函数实现模块化程序设计 7.1为什么要用函数 7.2怎样定义函数 7.3调用函数 7.4对被调用函数的声明和函数原型
第五章 函 数. 第五章 函 数 教学目标 (1) 了解函数在程序设计中的作用; (2) 掌握函数的定义方法; (3) 掌握函数调用和参数传递的机制和方法; (4) 了解变量的作用域和生存期的概念。
第七章 函数 西安工程大学.
第七章 函数及变量存贮类型 7.1 函数基础与C程序结构 7.2 函数的定义和声明 7.3 函数的调用 7.4 函数的嵌套与递归
第1章 概述 本章要点: C语言程序结构和特点 C语言程序的基本符号与关键字 C语言程序的编辑及运行 学习方法建议:
第一章 函数与极限.
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
1.3 C语言的语句和关键字 一、C语言的语句 与其它高级语言一样,C语言也是利用函数体中的可执行 语句,向计算机系统发出操作命令。按照语句功能或构成的不 同,可将C语言的语句分为五类。 goto, return.
C语言程序设计 主讲教师:陆幼利.
EBNF与操作语义 请用扩展的 BNF 描述 javascript语言里语句的结构;并用操作语义的方法描述对应的语义规则
简单介绍 用C++实现简单的模板数据结构 ArrayList(数组, 类似std::vector)
$9 泛型基础.
C程序设计.
第7章 函 数 7.1 函数的定义与调用 7.2 函数的嵌套调用与递归调用 7.3 数组作为函数参数 7.4 内部变量与外部变量
C语言程序设计.
Chap 10 函数与程序结构 10.1 函数的组织 10.2 递归函数.
目录 7.1 用户自定义函数的种类 7.2 函数的定义 7.3 被调函数的声明 7.4 函数的调用 7.5 函数的嵌套调用
Chap 5 函数 5.1 计算圆柱体积 5.2 使用函数编写程序 5.3 变量与函数.
Chap 5 函数 5.1 计算圆柱体积 5.2 数字金字塔 5.3 复数运算.
7.1 C程序的结构 7.2 作用域和作用域规则 7.3 存储属性和生存期 7.4 变量的初始化
第五章 函 数 要点:掌握函数的定义,函数的原形,函数的返回值,函数的调用,函数的形式参数和实际参数之间的关系;掌握函数重载的使用方法,关键字inline的含义与使用,掌握变量的作用域与生存期,了解函数的作用域。
第十四章 若干深入问题和C独有的特性 作业: 函数指针 函数作参数 函数副作用 运算 语句 位段 存储类别 编译预处理
第4章 Excel电子表格制作软件 4.4 函数(一).
<编程达人入门课程> 本节内容 为什么要使用变量? 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ:
第七单元 应用函数程序设计 从现在开始,将详细讲述C语言的方方面面。第一章中的所有疑惑,都将一一消灭。
第九节 赋值运算符和赋值表达式.
第二章 类型、对象、运算符和表达式.
Introduction to the C Programming Language
多层循环 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語言入門、變數、基本處理與輸入輸出 講師:林業峻 CSIE, NTU 3/7, 2015.
第三章 流程控制 程序的运行流程 选择结构语句 循环结构语句 主讲:李祥 时间:2015年10月.
第二次课后作业答案 函数式编程和逻辑式编程
计算机编程 信息管理与工程学院 2014年9月.
Presentation transcript:

C语言程序设计基础 刘新国

第五章 函数 结构化程序设计(Structured Programming) C语言中的函数 第五章 函数 结构化程序设计(Structured Programming) 将复杂程序分解为若干个简单的模块,用函数进行实现 模块之间相对独立,通过参数进行调用 C语言中的函数 众多函数是平等的兄弟关系 函数main是第一个被执行的函数 函数之间通过调用结合在一起

学生成绩统计程序的层次结构图 学生成绩统计程序 成绩输入 数据计算 数据查找 输出成绩 计算学生平均分 计算课程平均分

一、函数是什么? 函数是指完成一个特定工作的独立程序模块。 库函数:由C语言系统提供定义 自定义函数:需要用户自己定义 如scanf()、printf()等函数 自定义函数:需要用户自己定义 如计算圆柱体体积函数cylinder() main()也是一个函数,C程序有且仅有一个main()

函数定义 /* 计算圆柱体体积 */ double cylinder (double r, double h) { double result; /* 计算体积 */ result = 3.1415926 * r * r * h; /* 返回结果 */ return result; }

二、函数的定义 函数类型 函数名( 形式参数表 ) { 函数实现语句 } 函数类型:返回值的类型 形式参数表: 例如void、int、float,等等 如果返回类型不是void,必须使用return语句返回函数值 形式参数表: 类型1 参数名1,类型2 参数名1,…,类型n 参数名n 不能把cylinder的形式参数写作:double r, h double cylinder (double r, double h) { double result; result = 3.1415926 * r * r * h; return result; }

指出函数类型、函数名、形参、函数头、函数体、返回值? double cylinder (double r, double h) { double result; result = 3.1415926 * r * r * h; return result; }

无结果的函数 函数也可以完成一系列操作步骤,不返回任何运算结果。 void 函数名(参数表) { 函数实现语句 } void不可少,否则默认为int 可以没有return语句 可用return提前结束函数(一般是在分支语句中)

三、函数的调用 定义一个函数后,就可以在程序中调用这个函数 调用标准库函数时,在程序的最前面用 命令包含相应的头文件 #include 命令包含相应的头文件 调用自定义函数时,程序中必须有相应的函数定义。

函数调用的形式 函数名( 实际参数表 ) 实际参数表与形式参数表对应 返回结果的函数调用(使用返回值) 无返回结果的函数调用(完成操作) 可以是常量、变量、表达式 返回结果的函数调用(使用返回值) volume = cylinder(radius, height); printf("%f \n", cylinder(radius, height)); 无返回结果的函数调用(完成操作) pyramid(5);

函数调用的过程 计算机在执行程序时,从主函数main开始执行 如果遇到某个函数调用,主函数被暂停执行,转而执行相应的函数,该函数执行完后,将返回主函数。然后再从原先暂停的位置继续执行。 在函数中,如果执行完所有语句或者执行到return语句,那么将返回主函数

分析函数调用的过程 #include <stdio.h> int main( void ) { …… volume = cylinder (radius, height ); } double cylinder (double r, double h) return result; /* 调用函数 */ /* 实参形参 */ /* 执行函数中的语句 */ /* 返回调用它的地方 */

函数调用的参数传递 函数定义时的参数被称为形式参数(简称形参) 函数调用时的参数被称为实际参数(简称实参) 实参形参 double cylinder (double r, double h); 函数调用时的参数被称为实际参数(简称实参) volume = cylinder (radius, height); 实参形参 在参数传递过程中,实参把值复制给形参。 形参和实参一一对应 数量、类型、顺序 实参:常量、变量或表达式 形参:变量,用于接受实参传递过来的值

函数结果返回 函数结果返回的形式: 函数返回的两种情况 return 表达式; return (表达式); 对于void类型的函数,表达式为空 函数返回的两种情况 完成运算,将结果返回给主调函数。 只是完成工作,无需返回结果给主调函数 函数类型为void。

[例5-3,P94] 判断奇偶数的函数 定义一个判断奇偶数的函数:当参数为偶数时返回1,否则返回0。 int even( int n )

[例5-3,P94] 判断奇偶数的函数 int even (int n) /* 函数首部 */ { if( n % 2 == 0 ) /* 判别奇偶数 */ return 1; /* 偶数返回1 */ else return 0; /* 奇数返回0 */ } 如何调用该函数? 例如: even( 3 ); if( even(x) ) printf("x is even\n");

函数原型声明 函数类型 函数名(参数表); 声明函数时,可省略形式参数的名字,因为无关紧要。 但是建议不要省略,增加可读性 即:函数定义中的第1行(函数首部),并以分号结束。 例如 double cylinder (double r, double h); void pyramid (int n); 声明函数时,可省略形式参数的名字,因为无关紧要。 double cylinder (double, double); void pyramid (int); 但是建议不要省略,增加可读性

函数原型声明 函数类型 函数名(参数表); 函数必须先定义后调用 函数定义可以出现在主调函数之后 将主调函数放在被调函数的后面,就像变量先定义后使用一样 函数定义可以出现在主调函数之后 需要在函数调用前,声明函数原型 说明函数的类型和参数的情况,以保证程序编译时能判断对该函数的调用是否正确。

四、函数应用 [例5-2] 定义一个函数判定一个整数的奇偶 int even( int n ) { if( n%2==0 ) return 1; else return 0; }

函数程序设计 [例5-3] 使用格里高利公式,求π的近似值。输入精度e,精确到最后一项的绝对值小于e。

定义函数funpi,求π的近似值 double funpi (double e) { int denominator = 1, flag = 1; double item = 1, sum = 0; while (fabs (item) >= e) item = flag * 1.0 / denominator; sum = sum + item; flag = -flag; denominator = denominator + 2; } return sum * 4;

[例5-4, P94]源程序 #include <stdio.h> #include <math.h> int main (void) { double error, pi; double funpi (double e); printf ("Enter error:"); scanf ("%lf", &error); pi = funpi (error); printf ("pi = %f\n", pi); return 0; } 建议将函数申明语句放在函数体外面 printf ("pi = %f\n", funpi(error));

[例5-5,P103]输出数字金字塔 1 2 2 3 3 3 4 4 4 4 5 5 5 5 5

[例5-5,103]数字金字塔源程序 1 2 2 3 3 3 4 4 4 4 5 5 5 5 5 void pyramid (int n) 2 2 3 3 3 4 4 4 4 5 5 5 5 5 void pyramid (int n) { int k, j; for( k = 1; k <= n; k++ ) for( j = 1; j <= n-k; j++ ) printf(" "); /* 空格 */ for( j = 1; j <= k; j++ ) printf("%d ", k); /* 数字 */ putchar ('\n'); /* 换行 */ } #include <stdio.h> int main (void) { void pyramid (int n); pyramid(5); return 0; }

怎么办??? [例5-6, P100]复数运算 输入两个复数的实部和虚部,采用函数计算它们的和与积。 复数的计算结果有两个:实部和虚部 但是,return语句只能返回一个计算结果 怎么办???

[例5-6, P100]复数运算源程序 定义全局变量保存和传递计算结果 #include <stdio.h> #include <math.h> float result_real, result_imag; /* 复数之和 */ void complex_add(float r1, float m1, float r2, float m2) { result_real = r1 + r2; result_imag = m1 + m2; } /* 复数之积 */ void complex_prod(float r1, float m1, float r2, float m2) result_real = r1*r2 - m1*m2; result_imag = r1*m2 + r2*m1; 定义全局变量保存和传递计算结果

[例5-6, P100]复数运算源程序 int main(void) { float real1, real2, imag1,imag2; …… /* 输入两个复数,此处略 */ complex_add(real1, imag1, real2, imag2); printf("addition of complex is %f+%fi\n", result_real, result_imag); complex_prod(real1, imag1, real2, imag2); printf("product of complex is %f+%fi\n", return 0; }

五、变量分类 全局变量 在函数外部定义的变量 从定义起,之后的函数都可以使用 作用范围广,使用方便 [例5-6]中的 result_real 和 result_imag 从定义起,之后的函数都可以使用 定义之前的函数不可以 作用范围广,使用方便 省去参数传递

全局变量 典型应用 避免滥用 软件运行的全局状态 公共资源 传递运算结果 所用范围广,缺点+优点, 不易管理、破坏程序的模块化 慎用、尽量少用

局部变量 函数内部的变量 局部变量 函数的形式参数 特殊的局部变量 函数调用时,用于接收的实际参数值 复合语句内部的变量

局部变量和全局变量 局部变量 全局变量 函数内部定义的变量(包括形参) 定义在复合语句内的变量 在所有函数外部定义的变量,不属于任何函数 作用范围:本函数内部 定义在复合语句内的变量 作用范围:复合语句内部 全局变量 在所有函数外部定义的变量,不属于任何函数 作用范围:从定义处到源文件结束(包括各函数)

[例5-7,P103] 局部变量和全局变量。 运行结果 4 7 在函数f内部,全局变量x被f的局部变量x屏蔽了 #include <stdio.h> int x; int f(); int main (void) { int a = 1; x = a; a = f(); int b = 2; b = a + b; x = x + b; } printf ("%d %d" , a, x); return 0; int f() int x = 4; return x; 运行结果 4 7 在函数f内部,全局变量x被f的局部变量x屏蔽了

变量作用范围示例 x=? a=? b=? x=1, a=2, b=3 b=? b没有定义 x=? b=? t=? a=? int x=1; void main( ) { int a=2; …… int b=3; } f(); ……… int t=4 ; void f( ) int x=5, b=6; int a=7; 变量作用范围示例 x=? a=? b=? x=1, a=2, b=3 b=? b没有定义 x=? b=? t=? a=? x=5 b=6 t=4 a没定义

变量的生命周期 变量的生命周期 局部变量 全局变量:从程序执行开始,到程序的结束,存储单元始终存在 变量从分配存储单元开始,到被回收存储单元的过程 局部变量 函数调用时,定义变量,分配存储单元 函数调用结束,存储单元自动被收回 包括形式参数 全局变量:从程序执行开始,到程序的结束,存储单元始终存在

操作系统(例如Windows)、语言系统 变量的存储类型 自动型(auto) 普通的局部变量 静态型(static) 静态的局部变量 生命周期和全局变量一样 静态的全局变量 只能在本文件中使用 外部变量(extern) 全局变量,可跨文件使用 寄存器型(register) 存储在硬件寄存器中的变量 操作系统(例如Windows)、语言系统 程序区(代码) 主函数main、其他子函数等 数据区 静态 存储区 动态 全局变量 静态局部变量 主函数局部变量区 其他函数的 局部变量区

静态变量 static 类型名 变量表 作用范围 生命周期 静态变量的初值 保持不变 程序开始执行直到程序结束 等同于全局变量 定义的时候给初值 否则,缺省为0(每一个bit都是0)

[例5-9] 静态变量示例:计算1-n的阶乘 #include <stdio.h> double fact_s( int ); int main( void ) { int i, n; printf("Input n: "); scanf("%d", &n); for( i=0; i<n; i++ ) printf("%3d!=%.0f\n", i, fact_s(i)); return 0; } double fact_s(int n) static double f = 1; f = f * n; return f; 静态变量的初值为1 静态变量会记住前一次调用时的值

本章要点 函数定义、声明、调用 函数参数,参数传递 变量的分类、生命周期、存储类型 局部变量、全局变量、静态变量 全局变量优缺点,静态变量的特性