已阅读5页,还剩37页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第九章,函数,回顾 2-1,指针是一个变量,它存储另一个对象的内存地址 指针的声明由基本类型、星号 (*) 和变量名组成 为指针赋值,赋值运算符右侧必须是一个地址如果是普通变量需要在前面加一个取地址运算符 &;如果是另一个指针变量或者是一个数组,不需要加 &运算符 运算符 * 用于返回指针指向的内存地址中存储的值,回顾 2-2,指针算术运算的含义是指针的移动,将指针执行加上或者减去一个整数值n的运算相当于指针向前或向后移动n个数据单元 指针可以执行比较相等的运算,用来判断两个指针是否指向同一个变量 指向数组的指针,存储的是数组中元素的地址。数组data的第 (i + 1) 个元素的地址可表示为 &datai 或 (data+i),目标,描述 C 语言中的函数 掌握 C 语言中常见的内置函数 理解函数原型和函数的返回值 熟练掌握自定义函数的定义和调用 理解变量的作用域 理解变量的存储类型 理解两种参数传递的方式:传值、引用 熟悉带参函数的调用 熟练使用数组作为函数参数,本章结构,简介,函 数,类型转换,符号常量,内置函数,输入输出函数,算术运算符,接收并显示字符,void main() : x=x*x*x; y=y*y*y; z=z*z*z; ans1=x+y+z; a=a*a*a; b=b*b*b; c=c*c*c; ans2=a+b+c; : ,为什么使用函数,重复多次的同一计算类型,void main() : ans1=cube(x,y,z); ans2=cube(a,b,c); : ,int cube(int a,b,c) int ans; ans=(a*a*a)+(b*b*b)+(c*c*c); return ans; ,函数,主程序,ans,函数可以把相对独立的某个功能抽象出来,使之成为程序中的一个独立实体。可以在同一个程序或其他程序中多次重复使用,函数机制的优点,使程序变得更简短而清晰 有利于程序维护 可以提高程序开发的效率 提高了代码的重用性,函数类型,内置函数: 由语言系统提供; 用户无须定义,也不必在程序中作类型说明; 只需在程序前包含有该函数定义的头文件;,自定义函数: 用户在程序中根据需要而编写的函数;,常用内置函数,问题描述: 求自然数110的平方根和立方。,内置函数sqrt 和pow 示例,2,6,64,#include #include void main() int x=1; double squareroot,power; while(x = 10) squareroot=sqrt(x); power=pow(x,3); printf(“ %d的平方根:%3.2ft%d的立方:%5.0f n“, x,squareroot,x,power); x+; ,1的平方根: 1.00 1的立方: 1 2的平方根: 1.41 2的立方: 8 3的平方根: 1.73 3的立方: 27 4的平方根: 2.00 4的立方: 64 5的平方根: 2.24 5的立方: 125 6的平方根: 2.45 6的立方: 216 7的平方根: 2.65 7的立方: 343 8的平方根: 2.83 8的立方: 512 9的平方根: 3.00 9的立方: 729 10的平方根: 3.16 10的立方: 1000 Press any key to continue,内置函数ceil和floor示例,2,6,64,#include #include void main() printf(“=floor()=“); printf(“n floor(99.1) = %f n“,floor(99.1); printf(“ floor(-99.1) = %fn“,floor(-99.1); printf(“ floor(99.9) = %fn“,floor(99.9); printf(“ floor(-99.9) = %fn“,floor(-99.9); printf(“n=ceil()=“); printf(“n ceil(99.1) = %fn“,ceil(99.1); printf(“ ceil(-99.1) = %fn“,ceil(-99.1); printf(“ ceil(99.9) = %fn“,ceil(99.9); printf(“ ceil(-99.9) = %fn“,ceil(-99.9); ,=floor()= floor(99.1) = 99.000000 floor(-99.1) = -100.000000 floor(99.9) = 99.000000 floor(-99.9) = -100.000000 =ceil()= ceil(99.1) = 100.000000 ceil(-99.1) = -99.000000 ceil(99.9) = 100.000000 ceil(-99.9) = -99.000000 Press any key to continue,toupper和tolower示例,2,6,64,#include #include void main() char msg1,msg2,to_upper,to_lower; printf(“请输入一个小写字母:“); msg1=getchar(); to_upper=toupper(msg1); printf(“转换为大写:%cn“,to_upper); printf(“请输入一个大写字母:“); fflush(stdin); msg2=getchar(); to_lower=tolower(msg2); printf(“转换为小写:%cn“,to_lower); ,请输入一个小写字母:d 转换为大写:D 请输入一个大写字母:E 转换为小写:e Press any key to continue,内置函数rand示例,2,6,64,#include #include /#include void main() int i; printf(“产生 10 个 0 到 99 之间的随机数序列:nn“); /srand(unsigned)time(NULL); for(i=0; i10; i+) printf(“%d “, rand() % 100); printf(“n“); ,产生 10 个 0 到 99 之间的随机数序列: 44 73 26 58 37 94 27 42 28 90 Press any key to continue,演示:示例4,函数定义,void displayDiscount() float price, discount_amt; printf(“请输入价格“); scanf(“%f, ,double max(double x, double y) double m; m=xy?x:y; return m; ,该函数名为displayDiscount,无参数,使用void说明无返回值,函数体内的语句用于根据产品的价格求折扣后的价格。,该函数名为max,它有两个double类型的参数,返回值为double类型。在函数体内有三条语句实现了求两个数中较大的数,并将它返回。,函数原型,#include float count (int, int); void main() . . . . . . float count(int x,int y) . . . ,函数原型说明在形式上与函数头部类似,最后加一个分号。原型说明中参数表里的参数名可以不写(只写参数类型)。,通过在程序中使用函数名称,可以执行函数中包含的语句,这称为调用函数 函数之间允许相互调用,也允许嵌套调用 函数还可以自己调用自己,称为递归调用,#include void main() : set_discount(); displayDiscount(); : : ,float set_discount() : : float displayDiscount() : : ,函数调用,void reverse() : : ,#include void main() : palindrome(); : : ,void palindrome() : reverse(); : ,函数嵌套调用,从一个函数调用另一个函数称为函数的嵌套调用,/* 此函数用于计算 a 的阶乘 */ int factorial(int a) if (a = 1) return 1; else a = a * factorial(a-1); return a; ,函数递归调用,在一个函数体内调用自身称为函数的递归调用,问题描述: 根据用户的选择求不同形状的面积。,函数调用示例,#include void AreaOfRect(); void AreaOfTriangle(); void AreaOfRound(); void main() int select; do printf(“ 0、退出n 1、长方形n 2、三角形n 3、圆形n“); printf(“请选择功能:“); scanf(“%d“, ,void AreaOfRect() int x,y; printf(“请输入长方形的长:“); scanf(“%d“, ,void AreaOfTriangle() int x,y; printf(“请输入三角形的底:“); scanf(“%d“, ,void AreaOfRound() int r; printf(“请输入圆形的半径:“); scanf(“%d“, ,函数原型,演示:示例6,int divisibleCheck(int num) if (num % 5 = 0) return 1; else return 0; ,C语言中的函数至多可以返回一个值,不能返回多个值; 返回值的数据类型必须与函数原型中返回值的数据类型匹配; 当遇到 return 语句时,函数执行将终止。程序控制流将立即返回调用函数;,函数返回值,C 语言中的 return 语句用于向调用函数返回值,语法如下: return ();,函数返回值示例,#include int get_age(); void main() int age1, age2, age3; age1 = get_age(); age2 = get_age(); age3 = get_age(); if ( (age1 age2) ,65,78,int get_age() int age; printf(“n请输入年龄: “); scanf(“%d“, ,请输入年龄:65,请输入年龄:78,请输入年龄:54,年龄为 78 岁的人最大,54,小结 2-1,函数是程序中的一个相对独立的单元或模块,程序在需要时可以任意多次地调用函数来完成特定功能 使用函数带来的好处: 程序更清晰、易维护、分模块方便设计与开发、提高代码的重用性 语言提供了极为丰富的内置函数,这些内置函数分门别类地放在不同的头文件中,要使用这些内置函数,只要在程序前包含相应的头文件即可,小结 2-2,自定义函数是用户在程序中根据需要而编写的函数 函数的结构包括:返回值类型、函数名、参数列表、函数体 函数原型说明以便向编译器指出该函数使用什么样的格式和语法 函数调用时程序控制流将转向被调函数,被调函数执行结束时,控制流返回主调函数 return 语句用于向调用函数返回值,变量的作用域 4-1,作用域是某些事物起作用或有效的区域。,限于陆地,限于海洋,限于空中,程序中变量也有不同的使用范围,称为变量的作用域。变量的作用域决定变量的可访问性,变量的作用域 4-2,void displayDiscount() float discount_amt; . . . . . . . . . ,局部变量:不能在函数外使用,float discount_amt; void main() . . . . . . void displayDiscount() . . . . . . ,全局变量:可以在整个程序中使用,变量的作用域 4-3,#include void addNumbers() int num1,num2,sum; printf(“n 请输入两个数:“); scanf(“%d %d“, ,0,45,请输入两个数:56 45,子函数中sum的值是101,主函数中sum的值是 0,56,101,变量的作用域 4-4,#include int sum=0; void addNumbers() int num1,num2; printf(“n 请输入两个数:“); scanf(“%d %d“, ,0,45,请输入两个数:56 45,子函数中sum的值是101,主函数中sum的值是101,56,101,存储类型 2-1,变量的存储方式可分为“静态存储”和“动态存储”两种 静态存储变量是一直存在的,而动态存储变量则时而存在时而消失 这种由于变量存储方式不同而产生的特性称为变量的生存期 生存期表示了变量存在的时间,存储类型 2-2,静态局部变量,静态局部变量生存期为整个源程序 静态局部变量作用域与自动变量相同,即只能在定义该变量的函数内使用该变量 对基本类型的静态局部变量若在说明时未赋以初值,则系统自动赋予0值 函数被调用时,其中的静态局部变量的值将保留前次被调用的结果,静态局部变量示例,void format() static int m = 0; m+; if (m % 10 = 0) putchar(n); else putchar( ); void main() int i; for(i=0;i50;i+) printf(“%d“,i); format(); ,0,0,1,1,循环执行50次,49,49,0 1,0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49,2,静态全局变量,静态全局变量与普通全局变量在存储方式上完全相同 区别在于:非静态全局变量的作用域是整个源程序;而静态全局变量的作用域只是定义它的文件,函数形参和实参,void main ( ) . . . . . . display ( 10, 20.5 ); display ( int num, float fraction ) . . . . . . ,实际参数,函数调用,形式参数,void main() int a = 0; /初始化a值为0 func(a); /调用函数func printf(“%d“,a); /输出a的结果 /定义函数func void func(int a) a = 10; /让参数a等于10 ,传值调用,0,传值调用,将会输出什么,#include void increment(int,int); void main() int num1,num2; printf(“n 请输入两个数: “); scanf(“ %d %d“, ,传值调用示例,请输入两个数 :,34 56,递增前的值是 34 和 56,_,递增后的值是 34 和 56,34,56,子函数中的值是 35 和 57,35,34,56,57,void main() int a = 0; /初始化a值为0 func( /让参数a等于10 ,引用调用,FFE0,引用调用,a=FFE0,将会输出什么,#include void increment(int*, int*); void main() int num1,num2; printf(“n 请输入两个数: “); scanf(“ %d %d“, ,引用调用示例,请输入两个数 :,45 67,递增前的值是 45 和 67,_,递增后的值是 46 和 68,45,67,子函数中的值是 46 和 68,46,FF23,FF05,68,FF23,FF05,数组作为函数参数,在用数组作实参时,以传址方式调用函数,也就是说把实参数组的首地址赋给形参 实际上形参数组和实参数组为同一数组,共同拥有一段内存空间,数组作为参数示例1,问题描述: 通过函数实现5个学员成绩的排序。,#include #define N 5 void sort(float); void main() fl
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 浅析《盗墓笔记》中铁三角人物形象的塑造本科毕业论文
- 毕业论文模板及表格填写规范
- 文科类毕业论文格式规范2
- 浅析民间传说的现代意义
- 学位论文写作中的十个问题共32
- 采购管理体系范文
- 蓝墨云教材在线编辑器的开发与研究-以计算机基础课程为例
- 论文研究计划怎么写
- 浅析建筑施工质量管理存在的问题及对策
- 分析中药饮片现状及其发展策略
- 2025内蒙古巴彦淖尔市交通投资(集团)有限公司(第二批)招聘40人笔试考试参考试题及答案解析
- 宠物直播带货案例分析-洞察及研究
- 江西铜业校招笔试题及答案
- 大一会计考试试题及答案
- 2025国际贸易合同协议书标准版范本
- 2025宁夏建设投资集团有限公司招聘60人笔试历年典型考点题库附带答案详解试卷2套
- 积极心理学理论知识考核试题及答案
- 分式计算题强化训练(12大题型96道)原卷版-八年级数学上册
- 2025人教版八年级英语上册第五单元综合检测试卷
- 2025年《治安管理处罚法》多项选择题题库及答案
- 全国大学生职业规划大赛《网络直播与运营》专业生涯发展展示【高职(专科)】
评论
0/150
提交评论