




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、计算机程序设计(C+),第5章 函 数 教师:杨振平 E-mail: ,2007-2008第二学期,1,主要内容,5.1 函数概述 5.2 函数的定义 5.3 函数的调用 5.4 函数间的参数传递 5.5函数与数组 5.6 局部变量和全局变量 5.7 函数声明 5.8 带有缺省参数的函数,2,5.1 函数概述,C+语言程序的结构特点: 程序整体由一个或多个称为函数的程序块组成 每个函数都具有各自独立的功能和明显的界面,3,5.2 函数定义, () ,1、函数定义的一般格式,4,2、函数值类型,(1)返回数值 类型名:int、long 、float、double、char等简单类型 (2)返回地
2、址值 类型是指针型,如:int * (3)使用void, 表示函数没有返回值,5,3、形式参数,形参可以完成两个函数之间数据的传递,其个数根据需要设定。 形参属于函数的局部变量,仅在该函数体中起作用。 形式参数在函数被调用时进行存储分配,同时接收调用函数传递来的实际参数值。,(1)形参概念,6,(2)形式参数声明,参数说明格式为: ,,例:函数grav将从主调函数中接收3个数据,说明如下: double grav(double m1, double m2, double distance),7,4. 函数体,由 括起来,完成函数的主要功能 与主函数一样,可以定义需要的变量、数组 可以使用各种控
3、制结构语句编写程序 如果函数有返回值,函数中必须有return 语句,其格式如下: return 表达式; 该return语句只能返回一个表达式的值。,8,例5.1 编写求n!的函数,算法分析: 计算公式为: n!= n(n-1)321, 且0!=1,int fac(int n) return result; ,函数结构,函数fac中只需一个形参数据n; 计算结果存放到result中,并返回主函数; n的阶乘可在一重循环中实现。,9,例5.1:函数 fac()计算n!,/ Example 5-1:函数 fac()计算n! int fac(int n) int result = 1; if(n1
4、) result *= n; n-; return result; ,for(int i=n;i1;i-) result*=i;,while (n1) result *= n; n-; ,10,例5.1 判断整数n是否为“素数”,算法分析: “素数”-只有1和其本身2个约数的数,最小的素数是2。,方法:在2到n-1之间,如果能找到一个n的约数,则说明n不是素数;如果找不到一个约数,则说明n是素数。,flag=1; /标志变量(1为素数,0非素数) for(int i=2;in;i+) if(n%i=0) flag=0; break; ,m=int(sqrt(n); for(int i=2;i=
5、m;i+),for(int i=2;in;i+),11,例5.1判断整数n是否为“素数”的函数 isPrime,int isPrime(int n) int flag=1; for(int i=2;in;i+) if(n%i=0) flag=0; break; return flag; ,int isPrime(int n) int flag=1; m=int(sqrt(n); for(int i=2;i=m;i+) if(n%i=0) flag=0; break; return flag; ,12,5.3 函数的调用,2、调用方式 无参调用格式: 函数名( ) 有参调用格式: 函数名(实参表
6、),1、函数调用 就是使程序转去执行某个函数体。 C+中,除了main函数外,其他任何函数都是通过主函数直接或间接进行调用。,3、实参 调用函数时,提供给各个形参的数据。其中实参可以是常量、具有值的变量或表达式。实参与形参应满足: 个数相等、类型一致。,13,例5.2 阶乘函数的调用,/ Example 5-2:测试阶乘计算函数的主程序 #include using namespace std; int main() int n; cout n; cout n ! = fac(n) endl; return 0; ,fac(n),14,例5.2 判“素数” 函数的调用,找出2-100之间的所有
7、素数。 int main() int k=0; cout2-100之间的素数如下:endl; for(int i=2;i100;i+) if( isPrime(i)=1) if(k%5=0)coutendl; coutit; k+; return 0; ,isPrime(i),15,函数调用和返回的过程,16,5.4 函数间的参数传递,C+有三种传递方式: 传值调用 引用调用 地址调用,17,一、值调用,值传递 在调用时仅将实参的值赋给形参,在函数中对形参值的任何修改都不会影响到实参的值。,好处: 减少了调用函数与被调用函数之间的数据依赖,增强了函数自身的独立性。,缺点: 被调用函数向调用函数
8、传递的数据仅有一个返回值,有时显得不够用。,/ Example 5-3:交换两个变量的值 (不成功) void swap(int x, int y) int tmp; tmp = x; x = y; y = tmp; ,结果中a,b值没有改变,结果显示如下,例5-3 交换两个变量的值,int main( ) int a = 1, b = 2; cout Before exchange:a= a ,b= b endl; swap(a, b); cout After exchange:a= a ,b= b endl; return 0; ,19,二、引用调用,1、引用 是一种特殊类型的变量,可以被
9、认为是另一个变量的别名。 通过引用名与通过被引用的变量名访问变量的效果是一样的。 在C+中,使用运算符“ cout“i=“iendl;,结果:i=8,例5-4 利用引用编写交换函数swap( ),参数设为引用,运行结果如下:,21,5.5 函数与数组,1、数组元素作为函数的实参 形参为类型一致的变量。采用值传递方式。,2、数组名作为函数的实参 形参为类型相同的数组的。采用地址传递,即函数中对形参数组的操作就是对主调函数中实参数组的操作。,22,例5-5编写用于对整型数组排序的函数,/ Example 5-5: 交换排序 void bubble_up(int list, int count) f
10、or(int i=0; ii; j=j-1) if(listj-1listj) int tmp = listj-1; listj-1 = listj; listj = tmp; ,void bubble_up(int list, int count),int list, int count,23,测试排序的主程序,int main() int i; int array16= 503, 87, 512, 61, 908, 170, 897, 275, 653, 426, 154, 509, 612, 677, 765, 703 ; cout 原数组是: endl; for(i=0; i16; i
11、+) cout array i ; coutendl;,bubble_up(array, 5);/ 函数调用 cout 对数组前5项进行排序后的结果是: endl; for(i=0; i16; i+)cout array i ; coutendl; bubble_up(array, 16); cout 对整个数组排序后的结果是: endl; for(i=0; i16; i+)cout array i ; coutendl; return 0; ,bubble_up(array, 5);,bubble_up(array, 16);,25,5.6 局部变量和全局变量,1、局部变量 定义在函数内或块
12、内的变量称为局部变量。 局部变量在程序运行到它所在的块时建立,该块执行完毕局部变量占有的空间即被释放。,2、全局变量 全局变量说明于所有函数之外,可以为本源程序文件中的所有函数共同使用。 全局变量可以在各个函数之间建立数据传输通道,但滥用会破坏程序的模块化结构。,26,例5-6 局部变量和全局变量,/ Example 5-6:全局变量和局部变量 #include using namespace std; int x;/ 声明全局变量 int func1(int x) / 函数func1()有一个名为x的参数 return (x+5)*(x+5); int func2(int y) int x=
13、y+5; / 函数func2()中声明了一个名为x的局部变量 return x*x; ,int x; / 声明全局变量,int x,int x,27,int main() x = 0;/ 在主函数中为全局变量x赋值 coutThe result in func1 :func1(5)endl; coutThe result in func2 :func2(2)endl; coutx= xendl; return 0; ,x = 0; / 在主函数中为全局变量x赋值,/ Example 5-6:全局变量和局部变量 #include using namespace std; int x; / 声明全
14、局变量 int func1(int x) / 函数func1()有一个名为x的参数 return (x+5)*(x+5); int func2(int y) int x=y+5; / 函数func2()中声明了一个名为x的局部变量 return x*x; int main() x = 0;/ 在主函数中为全局变量x赋值 coutThe result in func1 :func1(5)endl; coutThe result in func2 :func2(2)endl; coutx= xendl; return 0; ,结果如下:,29,例5-7一元作用域运算符: 的使用,/ Example
15、 5-7:一元作用域运算符:的使用 #include using namespace std; int x=0; / 声明全局变量 int main() int x = 5; / 声明局部变量 coutglobal variable: :xendl; coutlocal variable: xendl; return 0; ,:x,x,全局变量x=0,局部变量x=5,30,5.7 函数声明,1、函数和变量一样,在使用之前要先声明,声明使用函数原型 2、函数原型的一般形式: (); 3、省略函数原型的情况 先定义,后使用,31,例5-8 求任意两个整数的最大数,#include using na
16、mespace std; int max(int x, int y); /函数原型声明 int main( ) cout a b; cout y?x:y; ,int max(int x, int y);,32,5.8 带有缺省参数的函数,double func(double x,double y,int n = 1000); 其中,参数n带有缺省参数值,调用方式: a = func(b,c); a = func(b,c,2000);,33,程序举例,例5-10 打印100010000之间的回文数。 所谓回文数是指各位数字左右对称的整数, 例如12321、789987、1等都是十进制回文数。 算
17、法:for( i= 1000; i=10000; i+) if( i是回文数)输出i 判断回文数的方法: 由i求得反序值k, if(k=i) 则i是回文数,否则不是。,由i求得反序值k的算法如下: 从i的个位开始,依次取出每位数字,作为k的 最高位,次高位,,最低位。 k=0; do k=k*10+i%10; i=i/10; while(i!=0); 利用函数,实现判断回文数的功能,判断回文数的函数: bool Ispalindrome( int n) int m,k=0; m=n; do k=k*10+m%10; m=m/10; while(m!=0); return (k=n); ,例5-
18、11 编写一个用于字符串比较的函数 函数原形:int mystrcmp(char s1 ,char s2 ); 函数功能:if s1s2 ,则return 正数; if s1s2 ,则return 负数; if s1=s2 , 则return 0; 算法:比较规则: 两个字符串中的字符逐个进行比较,当 遇到不等时, 那么字符串比较结束,返回两个字符 的差值。如果每一个字符均相等且遇到 0,说明两个 字符串相等,返回0。 如:假设s1的值为:“CHIAN”, s2的值为:“XIAN” 先比较第一个字符,由于C 小于X,说明 s1小于s2,函数值为C与X的差。,运行结果如下,注意实参s1,s2为数
19、组名,38,例:写一个通用函数matrix_multy ,计算矩阵乘法cLN aLM bMN,函数头设计: 函数返回值: void 函数名: matrix_multy 参数表:(double a , double b , double c ,int l, int m, int n) 其中:l,m,n为二维数组各维长 使用一维数组a,b,c作形参,接收传递的矩阵数据 函数体: int i,j,k; for(i=0;il;i+) for(j=0;jn;j+) ci*n+j=0; for(k=0;km;k+) ci*n+j+=ai*m+k*bk*n+j; / ij += ik * kj ,39,函数
20、matrix_multy的调用,调用语句: 函数名 : matrix_multy 实参表 : (a0,b0,c0, L,M,N); 其中:a0相当于一个一维数组,即二维数组a的0行元素构成的一维数组,它与形参一维数组对应。 b0,c0分别为b和c的0行元素构成的一维数组。,40,const int L=4; const int M=5; const int N=3; int main() int aLM=; int bMN=.; int cLN; matrix_multy(L,M,N,a0,b0,c0); /调用 for(int i=0;iL;i+) for(int j=0;jN;j+) co
21、utcij“t”; coutendl; return 0; ,main( )函数中使用二维数组,#include using namespace std; const int L=4; const int M=5; const int N=3; void matrix_multi(double a, double b, double c, int l, int m, int n) int i, j, k; for(i=0; il; i+) for(j=0; jn; j+) ci*n+j = 0; for(k=0; km; k+) ci*n+j +=ai*m+k*bk*n+j; ,计算矩阵的通用函数matrix_multy,42,main( )函数中使用一维数组,int main() double aL*M= 1.0, 3.0,-2.0, 0.0, 4.0, -2.0,-1.0, 5.0,-7.
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 烟叶项目可行性研究报告
- 循环经济产业园项目可行性报告
- 电子杂志制作与推广手册
- 智能家居行业运营指南
- 个人学习成长计划表之阶段性目标
- 三农农业生产经营计划书
- 优化资源配置工作计划
- 材料选择与性能评估手册
- 高级营养师复习测试题
- 中高级复习试题含答案(一)
- 部编版三年级语文下册教学计划(含进度表)
- 2025年常州机电职业技术学院单招职业适应性考试题库及答案1套
- 2025年中考英语热点话题预测-哪吒(含答案)
- 【2025新教材】教科版一年级科学下册全册教案【含反思】
- 律师执业风险防范研究-深度研究
- 2024年全国职业院校技能大赛中职组(母婴照护赛项)考试题库(含答案)
- 2025年春新人教版语文一年级下册教学课件 语文园地二
- 2025年1月浙江高考英语听力试题真题完整版(含答案+文本+MP3)
- 2025年内蒙古兴安盟突泉县选聘生态护林员450人历年高频重点提升(共500题)附带答案详解
- 2025年兴湘集团全资子公司招聘笔试参考题库含答案解析
- 蒙医学中的推拿暖宫疗法与妇科保健技巧
评论
0/150
提交评论