第四章 函数 丘志杰 电子科技大学 计算机学院 软件学院.

Slides:



Advertisements
Similar presentations
《C语言程序设计》复习
Advertisements

移动应用软件开发技术 第二讲:C++编程基础
第一章 C语言概述 计算机公共教学部.
VC++系统开发 第二章 C++语言基础 河北经贸大学信息技术学院.
心理的力量 --兼谈教师心理压力的调适
课标教材下教研工作的 实践与思考 山东临沂市教育科学研究中心 郭允远.
第5章 函数与模块化设计 学习目的与要求: 掌握函数的定义及调用方法 理解并掌握参数的传递方法 理解函数的嵌套与递归调用
第5章 函数与预处理 《 C语言程序设计》 (Visual C++ 6.0环境) 本章导读
第一章 C语言概述.
由C程序结构所知,一个完整的C语言程序是由一个且只能有一个main()函数(又称主函数)和若干个其他函数组合而成的。而前面各章仅学习main()函数的编程,本章将介绍其他函数的编程,包括其他函数的定义、调用、参数传递及变量的作用域等。
選擇排序法 通訊一甲 B 楊穎穆.
函數(一) 自訂函數、遞迴函數 綠園.
第4章 函数与预处理 4.1 概述 4.2 定义函数的一般形式 4.3 函数参数和函数的值 4.4 函数的调用 *4.5 内置函数
Introduction to the C Programming Language
教材 《C++程序设计》.谭浩强. 清华大学出版社 王雪晶
第七章 函数 目录 有参的加法函数的开发 函数定义的一般形式 函数参数和函数的值 函数的调用
Introduction to the C Programming Language
授课老师:龚涛 信息科学与技术学院 2018年3月 教材: 《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
Object-Oriented Programming in C++ 第一章 C++的初步知识
第12章 從C到C++語言 12-1 C++語言的基礎 12-2 C++語言的輸出與輸入 12-3 C++語言的動態記憶體配置
第八章 函数.
QQ: 李祥 QQ: 欢迎多种方式的学习交流,祝大家学有所成.
第一章 C++编程简介 丘志杰 电子科技大学 计算机学院 软件学院.
第二章 C++对C 在非面向对象方面的改进 更简洁,更安全.
谭浩强 编著 中国高等院校计算机基础教育课程体系规划教材 C++程序设计.
第十章 模板 丘志杰 电子科技大学 计算机学院 软件学院.
Introduction to the C Programming Language
2.1 C语言的数据类型 2.2 常量与变量 2.3 变量赋初值 2.4 各类数值型数据间的混合运算 2.5 C语言的运算符和表达式
第1章 概述 本章要点: C语言程序结构和特点 C语言程序的基本符号与关键字 C语言程序的编辑及运行 学习方法建议:
六、函数 教学目标: 函数的概念、定义、调用和返回 带自定义函数的程序设计 递推算法 递归思想及算法实现 函数的参数传递方式 C语言程序设计.
C++语言程序设计 C++语言程序设计 第五章 函数 第十一组 C++语言程序设计.
C语言大学实用教程 第5章 函数与程序结构 西南财经大学经济信息工程学院 刘家芬
材料二甲 授課教師:王致傑 老師 (學420、分機5305)
材料二乙 授課教師:林昆明 老師 (學210 、 分機5302)
Java變數 2014/6/24.
第三章 C++的语句和简单的程序设计 主要内容:
第一章 程序设计和C语言 主讲人:高晓娟 计算机学院.
C语言程序示例: 1.输入10个数,按从小到大的顺序排序。 2.汉诺塔问题。.
第10讲 构造函数和析构函数 构造函数 析构函数 This 指针.
1.2 C语言程序的结构与书写规则 一、 C语言程序的总体结构
Introduction to the C Programming Language
函数 概述 模块化程序设计 基本思想:将一个大的程序按功能分割成一些小模块, 特点: 开发方法: 自上向下,逐步分解,分而治之
Oop8 function函式.
指標
C程序设计.
第5章 函 数.
第一章 C语言概述 教师:周芸.
C语言程序设计 李祥 QQ:
C++语言程序设计教程 第2章 数据类型与表达式 第2章 数据类型与表达式 制作人:杨进才 沈显君.
C++语言程序设计 C++语言程序设计 第十章 多态 第十一组 C++语言程序设计.
第二章 类型、对象、运算符和表达式.
第2章 数据类型与表达式 学习目的与要求: 掌握C 语言的基本数据类型及使用方法 掌握C程序中常用的运算符和表达式 了解数据类型的转换.
第二章 基本数据类型 ——数据的表示.
本节内容 函数嵌套调用的内存布局 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
挑戰C++程式語言 ──第9章 函數.
#include <iostream.h>
第五章 逻辑运算和判断选取控制 §5.1 关系运算符和关系表达式
C++语言程序设计 C++语言程序设计 第十章 多态 第十一组 C++语言程序设计.
第1章 数据结构基础概论 本章主要介绍以下内容 数据结构研究的主要内容 数据结构中涉及的基本概念 算法的概念、描述方法以及评价标准.
第十二章 位运算.
《数据结构与算法设计》第一部分 面向对象的C++程序设计基础.
C# 匿名委派 + Lambda + Func 建國科技大學 資管系 饒瑞佶.
单片机应用技术 (C语言版) 第4章 C51程序设计入门
第三章 高级函数特性.
Introduction to the C Programming Language
基本資料型態 變數與常數 運算子 基本的資料處理 授課:ANT 日期:2014/03/03.
第9章 C++程序设计初步 9.1 C++的特点 9.2 最简单的C++程序 9.3 C++的输入输出 9.4 函数的重载
資料!你家住哪裏? --談指標 綠園.
第三章 流程控制 程序的运行流程 选择结构语句 循环结构语句 主讲:李祥 时间:2015年10月.
第六章 复合数据类型 指针的声明与使用 数组的声明与使用 指针与数组的相互引用 字符串及相关库函数 new与delete
Presentation transcript:

第四章 函数 丘志杰 电子科技大学 计算机学院 软件学院

函数的定义和声明 定义函数的一般格式为: 返回类型 函数名 (数据类型1 参数1, 数据类型2 参数2,... ) { 函数体; }  定义函数的一般格式为: 返回类型 函数名 (数据类型1 参数1, 数据类型2 参数2,... ) {    函数体; } 形参表 返回类型:任意数据类型 函数名:符合C++标识符的一般命名规则 形参列表:需指定参数类型和参数名 函数体:语句序列

例子 #include <iostream.h> int max(int x,int y) { int z; 函数定义 #include <iostream.h> int max(int x,int y) { int z; z=(x>y)?x:y; return z ; } void main() int a,b; cin>>a>>b; cout<<max(a,b)<<endl; 函数体:函数所完成的具体操作 函数调用

函数原型 函数原型的一般形式: 返回值类型 函数名(参数列表); 如果函数定义在先,调用在后,调用前可以不必声明;如果函数定义在后,调用在先,调用前必须声明。 加上参数名会使函数的 功能和参数更清晰。 int max(int, int);//或int max(int a,int b); void main(){ int value=max(5,6); } int max(int x, int y){......}; 2019/5/18

函数调用 函数调用的一般形式为: 各实际参数表中的实际参数应与形参表中的形参一一对应,即个数相等且对应参数的数据类型相同。 函数调用是一个表达式,函数名连同括号是函数调用运算符。表达式的值就是被调函数的返回值,它的类型就是函数定义中指定的函数返回值的类型,即函数的类型。 如果函数的返回值为void,说明该函数没有返回值。 例如:cout<<max(a,b)<<endl; 函数名 (参数1, 参数2,... ); 实际参数表

C++程序的内存空间 当一个程序准备运行时,操作系统会为程序分配一块内存空间,C++程序的内存通常被分为四个区: 全局数据区:存放全局变量、静态变量、字符串常量、常变量 代码区:存放代码 栈区:存放为运行函数而分配的函数参数、局部变量、返回地址等 堆区:用于动态内存分配

函数参数的按值传递 函数参数传递过程的实质是将实参值通过栈空间一一传送给形参的过程。 2019/5/18

例子:函数参数的按值传递 #include<iostream.h> void swap(int a,int b) { int t; t=a, a=b, b=t; } void main() int x=7,y=11; cout<<"x="<<x<<" y="<<y<<endl; swap(x,y); cout<<"after swap:"; 函数定义 传值调用

函数的嵌套调用 在一个函数中调用其它函数叫函数的嵌套。 C++中函数的定义是平行的,除了main函数以外,都可以互相调用。 函数不可以嵌套定义,但可以嵌套调用。比如函数1调用了函数2,函数2再调用函数3,这便形成了函数的嵌套调用。

递归调用 在调用一个函数的过程中又直接或间接地调用该函数本身的这一现象,叫做函数的递归调用。 1 (n=0) n!= n(n-1)! (n>0) 递归可以分为: 直接递归调用:是在调用函数的过程中又调用该函数本身; 间接递归调用:是在调用f1()函数的过程中调用f2()函数,而f2()中又需要调用f1()。

内联函数 宏定义带来的问题 最后j的值为是0。问题出在编译器在遇到宏时只是进行简单的宏替换。 #define abs(a) ((a) < 0 ? –(a):(a)) int i = -2, j; j = abs(++i); ==> j = ((++i) < 0 ? –(++i) : (++i)) 最后j的值为是0。问题出在编译器在遇到宏时只是进行简单的宏替换。 2019/5/18

用inline定义一个内联函数 使用宏的好处是没有类似于普通函数调用时的系统开销,并且宏定义的参数可以适宜大多数类型的数据。但其缺点是有时会产生不可预料的副作用。 C++中的内联函数既具有宏定义的优点,又克服了宏定义的缺点。 在函数名前加上“inline”,即为内联函数。 inline void func(int a, int b); 因为是在编译时在调用func的地方用函数体进行了替换,所以程序执行时会减少调用开销。 2019/5/18

内联函数举例举例 注意事项: inline long abs(long value) { return (num < 0 ? –num : num); } 注意事项: 并非所有函数都需要定义为内联函数,一般只会将那些频繁被调用的,并且函数体较小的(只有几条语句)函数定义为内联函数。 内联函数内不允许有循环语句和switch语句,否则按照普通函数来处理。 2019/5/18

函数重载 两个以上的函数,具有相同的函数名,但是形参的个数或者类型不同,编译器会根据实参的类型及个数的最佳匹配来自动确定调用哪一个函数。 void main(){ int a , b ,c; float f1, f2; add(a, b); add(f1, f2); add(a, b, c); } //形参列表不同 int add(int x, int y){…..}; float add(float x, float y){…..}; int add(int x, int y, int z){…..}; 2019/5/18

几点注意 不能以形参名字或函数返回类型的不同来区分函数。 //错误!编译器不以形参名来区分函数 int add(int x, int y){ return x+y;} int add(int a, int b){ return a+b;} //错误!编译器不以返回值来区分函数 float add(int x, int y){ return (float)(a+b);} 2019/5/18

不要将不同功能的函数定义为重载函数,以免出现混淆。 int add(int x, int y){ return x+y;} float add(float x, float y){ return x-y;} 2019/5/18

带默认形参值的函数 在定义函数时预先声明默认的形参值。调用时如果给出实参,则用实参初始化形参;否则采用预先声明的默认形参值。例如: int add(int x=5, int y=6){ return x+y;} void main( ){ int ret; ret=add(10, 20); ret=add(10); ret=add(); } 2019/5/18

默认形参值必须按照从右向左的顺序声明。在有默认值的形参右边,不能出现无默认值的形参。(请思考:为什么??) int add(int x=5, int y=6,int z=7){…}//正确 int add(int x=5, int y=6,int z){…}//不正确 int add(int x=5, int y,int z=7){ …}//不正确 2019/5/18

默认形参值可以在函数原型中给出,例如: int add(int x=5, int y=6); void main( ) { int ret = add(); } int add(int x, int y){ return x+y;} 2019/5/18

在相同的作用域内,默认形参值的说明应保持唯一;但在不同的作用域内,允许说明不同的默认形参值。 int add(int x=5, int y=6); void main( ){ int add(int x=7,int y=8); int ret = add(); //实现7+8 } void func( ){ add( );}//实现5+6 int add(int x, int y){ return x+y;} 2019/5/18

请分析以下情况是否正确 int add(int x, int y){ return x+y;} int add(int x, int y, int z=2){ return x+y+z;} void main( ){ int ret; ret=add(10,20); } 这种调用在编译时会出错! 2019/5/18