第七单元 应用函数程序设计 从现在开始,将详细讲述C语言的方方面面。第一章中的所有疑惑,都将一一消灭。

Slides:



Advertisements
Similar presentations
第8章 函数 信息管理系.
Advertisements

第五章 函数 本章学习重点:  函数的定义与函数声明;  函数的调用;  函数的嵌套调用与递归调用;  数组作为函数参数;
Oracle数据库 Oracle 子程序.
不确定度的传递与合成 间接测量结果不确定度的评估
C++中的声音处理 在传统Turbo C环境中,如果想用C语言控制电脑发声,可以用Sound函数。在VC6.6环境中如果想控制电脑发声则采用Beep函数。原型为: Beep(频率,持续时间) , 单位毫秒 暂停程序执行使用Sleep函数 Sleep(持续时间), 单位毫秒 引用这两个函数时,必须包含头文件
在PHP和MYSQL中实现完美的中文显示
第8讲 函数 8.1 函数的定义与调用 8.2 函数的参数 8.3 函数重载与递归 8.4 标识符作用域与变量的存储特性.
EBNF与操作语义 请用扩展的 BNF 描述 javascript语言里语句的结构;并用操作语义的方法描述对应的语义规则
4.3函数 4.3.1函数的概念及定义 1、函数的概念: 可以被其它程序调用具有 特定功能的一段相对独立的 程序(模块),称函数。
第5章 函数及变量的存储类别 5.0 概述 5.1函数的定义 5.2函数调用 5.3变量的作用域和存储类别 5.4内部函数和外部函数
第八章 函数 §8.1 概述 一个较大程序一般分为若干个程序模块,每一个模块实现一个特定的功能。所有的高级语言中都有子程序的概念,在C中子程序就是函数。 一个C程序可由一个主函数和若干个函数构成,由主函数调用其它函数,其它函数也可以相互调用.
C语言程序设计基础 刘新国.
第7章 函 数 本章要点: C语言程序结构和特点 函数的定义 函数的返回值与函数的类型 函数的调用及参数的传递关系 函数的嵌套与递归
走进编程 程序的顺序结构(二).
C程序设计 谭浩强 著 清华大学出版社.
辅导课程六.
第7章 函 数 为什么要使用函数? 函数定义、调用、声明 局部变量和全局变量 变量的存储类别 内部函数和外部函数 函数的嵌套调用和递归调用
函数.
第一单元 初识C程序与C程序开发平台搭建 ---观其大略
Chap 5 函数 5.1 计算圆柱体积 5.2 使用函数编写程序 5.3 变量与函数.
第五讲 四则运算计算器(一) 精品教程《C#程序设计与应用(第2版)清华大学出版社 谭恒松 主编
第7章 用函数实现模块化程序设计 7.1为什么要用函数 7.2怎样定义函数 7.3调用函数 7.4对被调用函数的声明和函数原型
第二章 Java语言基础.
动态规划(Dynamic Programming)
第七章 函数 西安工程大学.
程序设计专题一 结构化程序设计与递归函数 主讲教师: 刘新国.
宁波市高校慕课联盟课程 与 进行交互 Linux 系统管理.
宁波市高校慕课联盟课程 与 进行交互 Linux 系统管理.
第一章 函数与极限.
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
1.3 C语言的语句和关键字 一、C语言的语句 与其它高级语言一样,C语言也是利用函数体中的可执行 语句,向计算机系统发出操作命令。按照语句功能或构成的不 同,可将C语言的语句分为五类。 goto, return.
C语言程序设计 主讲教师:陆幼利.
EBNF与操作语义 请用扩展的 BNF 描述 javascript语言里语句的结构;并用操作语义的方法描述对应的语义规则
简单介绍 用C++实现简单的模板数据结构 ArrayList(数组, 类似std::vector)
C语言大学实用教程 第5章 函数与程序结构 西南财经大学经济信息工程学院 刘家芬
$9 泛型基础.
C++语言程序设计 C++语言程序设计 第六章 指针和引用 第十一组 C++语言程序设计.
THE C PROGRAMMING LANGUAGE
第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 函数的嵌套调用
C++语言程序设计 C++语言程序设计 第六章 指针和引用 第十一组 C++语言程序设计.
<编程达人入门课程> 本节内容 内存的使用 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群: ,
7.1 C程序的结构 7.2 作用域和作用域规则 7.3 存储属性和生存期 7.4 变量的初始化
Web安全基础教程
第五章 函 数 要点:掌握函数的定义,函数的原形,函数的返回值,函数的调用,函数的形式参数和实际参数之间的关系;掌握函数重载的使用方法,关键字inline的含义与使用,掌握变量的作用域与生存期,了解函数的作用域。
信号量(Semaphore).
第4章 Excel电子表格制作软件 4.4 函数(一).
第九节 赋值运算符和赋值表达式.
iSIGHT 基本培训 使用 Excel的栅栏问题
3.1 变化率与导数   3.1.1 变化率问题 3.1.2 导数的概念.
本节内容 结构体 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
多层循环 Private Sub Command1_Click() Dim i As Integer, j As Integer
C++语言程序设计 C++语言程序设计 第六章 指针和引用 第十一组 C++语言程序设计.
第9章 预处理命令.
第7章 模板 陈哲 副教授 南京航空航天大学 计算机科学与技术学院.
第7章 用函数实现模块化程序设计 7.1为什么要用函数 7.2怎样定义函数 7.3调用函数 7.4对被调用函数的声明和函数原型
临界区问题的硬件指令解决方案 (Synchronization Hardware)
本节内容 C语言的汇编表示 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
本节内容 结构体.
C++语言程序设计 C++语言程序设计 第一章 C++语言概述 第十一组 C++语言程序设计.
第四章 函数 对付复杂性大程序的一种有效方法是把它局部化、模块化。 函数 函数有两类: 1)系统提供的标准函数库; 2)自定义的函数。
本节内容 动态链接库 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
C++语言程序设计 C++语言程序设计 第九章 类的特殊成员 第十一组 C++语言程序设计.
基本知识 数据类型、变量、常量、运算符.
C++语言程序设计 C++语言程序设计 第十章 多态 第十一组 C++语言程序设计.
<编程达人入门课程> 本节内容 有符号数与无符号数 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ:
第二次课后作业答案 函数式编程和逻辑式编程
计算机编程 信息管理与工程学院 2014年9月.
Presentation transcript:

晏文靖 yanwenjing@wxic.edu.cn 第七单元 应用函数程序设计 从现在开始,将详细讲述C语言的方方面面。第一章中的所有疑惑,都将一一消灭。 本章将讲述类型、变量、常量、数组等。这些概念的建立是进行进一步C语言学习的必要条件。同时,这些概念也是各种高级语言的共通概念。 晏文靖 yanwenjing@wxic.edu.cn

内容提要 函数定义、函数调用、函数原型、函数返回值 全局变量、自动变量、静态变量、寄存器变量 预处理命令 结构设计与模块化 难点:函数的参数传递与返回值 全局变量、自动变量、静态变量、寄存器变量 难点:变量的作用域与存储类型 预处理命令 结构设计与模块化

大话三国   懿问曰:“孔明寝食及事之烦简若何?”   使者曰:“丞相夙兴夜寐,罚二十以上皆亲览焉。所啖之食,日不过数升。”   懿顾谓诸将曰:“孔明食少事烦,其能久乎?”

函数(function)和模块(module) 读多少行的程序能让你不头疼? main()当中能放多少行程序?

例 计算两个整数的平均数 /* 函数功能: 计算平均数 函数入口参数: 整型x,存储第一个运算数 整型y,存储第二个运算数 函数功能: 计算平均数 函数入口参数: 整型x,存储第一个运算数 整型y,存储第二个运算数 函数返回值: 平均数 */ int Average(int x, int y) { int result; result = (x + y) / 2; return result; }

例 使用了Average函数的main() int Average(int x, int y) { int result; result = (x + y) / 2; return result; } main() int a = 12; int b = 24; int ave; ave = Average(a, b); printf(……); 数据传递 执行顺序 main() { int a = 12; int b = 24; int ave; ave = Average(a, b); printf("Average of %d and %d is %d.\n", a, b, ave); }

函数的分类 函数是C程序的基本单位 库函数 自定义函数 ANSI C定义的标准库函数 第三方库函数 自己编写的函数 包装后,也可成为函数库,供别人使用

函数定义(definition) 类型 函数名(类型 参数1, 类型 参数2, ……) { 函数体; return 表达式; } 形式参数 返回值类型 标识符 类型 函数名(类型 参数1, 类型 参数2, ……) { 函数体; return 表达式; } 返回值 函数出口

函数定义(definition) 函数是这样的一种运算: 函数名说明运算规则 参数是运算的操作数 返回值是运算的结果 当函数执行到return语句或}时,函数的运算停止。程序从当次调用函数的地方继续执行 函数可以有多个return,但最好只有一个且是最后一行 用void定义返回值类型 函数没有运算结果,没有返回值 return语句之后不需要任何表达式 用void定义参数,表示没有参数 参数表里的参数(叫形式参数,parameter)也是函数的语句块内的变量

函数调用(call) 函数名(表达式1, 表达式2, ……); 调用一个函数之前,先要对其返回值类型、函数名和参数进行声明(declare) 不对函数进行声明是非常危险的 函数定义也有声明函数的效果 调用函数时,提供的表达式(叫实际参数, argument)和该函数的形式参数必须匹配 数目一致 类型一一对应(会发生自动类型转换) 表达式的值赋值给对应的参数 返回值可以按需处理 RealEqual() realeql.c

现场编程 利用函数完成求2个数的乘积并输出 利用函数完成求2个数的最大值并输出 利用函数完成求3个数的最大值并输出

现场编程 利用函数完成求1+2+3+…+n 利用函数完成求n!

函数原型(prototype) 调用一个函数之前,先要对其返回值类型、函数名和参数进行声明(declare) 不对函数进行声明是非常危险的 声明时不要省略参数以及返回值的类型

例 #include <stdio.h> int Average(int x, int y); /*声明Average()函数*/ main() { int a = 12; int b = 24; int ave = Average(a, b); printf("Average of %d and %d is %d.\n", a, b, ave); } /* 函数功能: 计算平均数 函数入口参数: 整型x,存储第一个运算数 整型y,存储第二个运算数 函数返回值: 平均数 */ int Average(int x, int y) int result; result = (x + y) / 2; return result; 例

现场编程 输入一个数,判断其是否素数

函数的嵌套调用 在被调函数中,又调用了函数----嵌套调用 main() { … ... } a 函数 { … } b函数 { … } ③ ① ② ④ ⑥ ⑦ ⑤

函数的递归调用 在被调函数中,又调用了自身----递归调用 利用递归求n! n!=n*(n-1)! n>1 n!=1 n=1

变量的作用域 指在源程序中定义变量的位置及其能被读写访问的范围 分为 局部变量(Local Variable) 全局变量(Global Variable )

局部变量 局部变量 在语句块内定义的变量 形参也是局部变量 定义时不会自动初始化,除非程序员指定初值 进入语句块时获得内存,仅能由语句块内语句访问,退出语句块时释放内存,不再有效 并列语句块各自定义的同名变量互不干扰

全局变量 全局变量 使函数之间的数据交换更容易,也更高效 尽量少用全局变量。不得不用时,要严格控制对它的改写 在所有函数之外定义的变量 在程序中定义它的位置以后都有效 自动初始化为0 从程序运行起即占据内存,程序运行过程中可随时访问,程序退出时释放内存 在定义点之前或在其他文件中引用,应该进行如下声明: extern 类型名 变量名; 使函数之间的数据交换更容易,也更高效 但是并不推荐使用 因为谁都可以改写全局变量,所以很难确定是谁改写了它 尽量少用全局变量。不得不用时,要严格控制对它的改写

变量的存储类型 指数据在内存中存储的方式,即编译器为变量分配内存的方式,它决定变量的生存期 动态存储 静态存储 程序区 静态存储区 根据需要临时分配存储空间,离开即释放 静态存储 在程序运行期间分配固定的存储空间不释放 程序区 静态存储区 动态存储区 形参、自动变量、函数调用的现场等 全局变量、 静态变量

自动变量 (auto ) “自动”体现在 动态局部变量 标准定义格式 缺省的存储类型 进入语句块时自动申请内存,退出时自动释放内存 不初始化时,值是不确定的

静态变量(static) 一个函数的内部变量在函数退出后失效。再次进入函数,变量值重新初始化 static int i; 静态变量和全局变量都是静态存储类型 自动初始化为0 从静态存储区分配,生存期为整个程序运行期间 但作用域不同

预编译指令 编译器在开始正式编译之前处理的指令,叫预编译指令 文件包含:#include 它们不会存在于最后生成的目标代码中 用#include指定的文件内容替换#include所在的行 用<>或者""括上文件名 <>表示在编译器的include目录内查找文件 ""表示在当前目录查找文件 文件名中可以带有路径

#define #define 宏名字 替换文本 在#define之后,所有独立出现“宏名字”的地方(除了字符串内)都被“替换文本”替换 “替换文本”中可以有空格 宏可以有参数 #define max(A,B) ((A) > (B) ? (A) : (B)) 能想出带参数的宏和函数的区别吗? 定义宏的时候注意替换发生后产生的非预想结果 一般用括号可以避免,如上例 宏名中间不要有空格 带参数的宏可以获得比函数执行效率更高的代码,而且不用固定参数类型

与#define配套者 #undef,从现在开始取消#define的定义 #if, #else,#elif,#endif #undef MAXLINE #if, #else,#elif,#endif #ifdef,#ifndef 这些预编译指令通常用来处理多文件工程和程序多版本的问题。(程序多版本一般是不同平台的版本,不同用户等级的版本,不同开发阶段的版本等)

使用预编译指令的目的 增强程序可读性 精简源代码,提取变化 不编译无用代码,精炼目标代码 但是调错时宏可能带来很多难题 这一点更多时候用函数的效果更好,但宏也有其不可替代的优势 不编译无用代码,精炼目标代码

模块和链接 将一个程序分解成若干个模块,分别放在几个源文件中,形成一个项目(Project) 然后,对每一个源文件分别单独进行编译 再将它们的目标代码连同标准函数库中的函数链接在一起,形成可执行文件。 主模块 main()所在的文件也是一个模块 模块之间通过互相调用函数和共享全局变量联系起来 头文件是联系的纽带 头文件里对全局变量的声明要加上extern关键字,用以说明该变量为外部变量