c语言基础课件8.函数.ppt

上传人:小飞机 文档编号:6503820 上传时间:2023-11-07 格式:PPT 页数:42 大小:1.98MB
返回 下载 相关 举报
c语言基础课件8.函数.ppt_第1页
第1页 / 共42页
c语言基础课件8.函数.ppt_第2页
第2页 / 共42页
c语言基础课件8.函数.ppt_第3页
第3页 / 共42页
c语言基础课件8.函数.ppt_第4页
第4页 / 共42页
c语言基础课件8.函数.ppt_第5页
第5页 / 共42页
点击查看更多>>
资源描述

《c语言基础课件8.函数.ppt》由会员分享,可在线阅读,更多相关《c语言基础课件8.函数.ppt(42页珍藏版)》请在三一办公上搜索。

1、第九章,函数,回顾 2-1,指针是一个变量,它存储另一个对象的内存地址指针的声明由基本类型、星号(*)和变量名组成为指针赋值,赋值运算符右侧必须是一个地址如果是普通变量需要在前面加一个取地址运算符&;如果是另一个指针变量或者是一个数组,不需要加&运算符运算符*用于返回指针指向的内存地址中存储的值,回顾 2-2,指针算术运算的含义是指针的移动,将指针执行加上或者减去一个整数值n的运算相当于指针向前或向后移动n个数据单元指针可以执行比较相等的运算,用来判断两个指针是否指向同一个变量指向数组的指针,存储的是数组中元素的地址。数组data的第(i+1)个元素的地址可表示为&datai 或(data+i

2、),目标,描述 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

3、=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的平

4、方根和立方。,内置函数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

5、 6的立方:216 7的平方根:2.65 7的立方:343 8的平方根:2.83 8的立方:512 9的平方根:3.00 9的立方:72910的平方根:3.16 10的立方:1000Press 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);pri

6、ntf(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()

7、=ceil(99.1)=100.000000 ceil(-99.1)=-99.000000 ceil(99.9)=100.000000 ceil(-99.9)=-99.000000Press any key to continue,toupper和tolower示例,2,6,64,#include#includevoid main()char msg1,msg2,to_upper,to_lower;printf(请输入一个小写字母:);msg1=getchar();to_upper=toupper(msg1);printf(转换为大写:%cn,to_upper);printf(请输入一个大写字

8、母:);fflush(stdin);msg2=getchar();to_lower=tolower(msg2);printf(转换为小写:%cn,to_lower);,请输入一个小写字母:d转换为大写:D请输入一个大写字母:E转换为小写:ePress any key to continue,内置函数rand示例,2,6,64,#include#include/#includevoid main()int i;printf(产生 10 个 0 到 99 之间的随机数序列:nn);/srand(unsigned)time(NULL);for(i=0;i10;i+)printf(%d,rand()%

9、100);printf(n);,产生 10 个 0 到 99 之间的随机数序列:44 73 26 58 37 94 27 42 28 90Press 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说明无返回值,函数体内的语句用于根据产品的价格求折扣后的价格。,该函数

10、名为max,它有两个double类型的参数,返回值为double类型。在函数体内有三条语句实现了求两个数中较大的数,并将它返回。,函数原型,#include float count(int,int);void main().float count(int x,int y).,函数原型说明在形式上与函数头部类似,最后加一个分号。原型说明中参数表里的参数名可以不写(只写参数类型)。,通过在程序中使用函数名称,可以执行函数中包含的语句,这称为调用函数函数之间允许相互调用,也允许嵌套调用函数还可以自己调用自己,称为递归调用,#includevoid main():set_discount();disp

11、layDiscount();:,float set_discount():float displayDiscount():,函数调用,void reverse():,#includevoid main():palindrome();:,void palindrome():reverse();:,函数嵌套调用,从一个函数调用另一个函数称为函数的嵌套调用,/*此函数用于计算 a 的阶乘*/int factorial(int a)if(a=1)return 1;else a=a*factorial(a-1);return a;,函数递归调用,在一个函数体内调用自身称为函数的递归调用,问题描述:根据用

12、户的选择求不同形状的面积。,函数调用示例,#includevoid 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

13、 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,a

14、ge3;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,函数是程序中的一个相对独立的单元或模块,程序在需要时可以任意多次地调用函数来完成特定功能使用函数带来的好处:程序更清晰、易维护、分模块方便设计与开发、提高代码的重用性语言提供了极为丰富的内置函数,这些内置函数分门别类地放在不同的头文件中,要使用这些内置函数,只要在程序前

15、包含相应的头文件即可,小结 2-2,自定义函数是用户在程序中根据需要而编写的函数函数的结构包括:返回值类型、函数名、参数列表、函数体函数原型说明以便向编译器指出该函数使用什么样的格式和语法函数调用时程序控制流将转向被调函数,被调函数执行结束时,控制流返回主调函数return 语句用于向调用函数返回值,变量的作用域 4-1,作用域是某些事物起作用或有效的区域。,限于陆地,限于海洋,限于空中,程序中变量也有不同的使用范围,称为变量的作用域。变量的作用域决定变量的可访问性,变量的作用域 4-2,void displayDiscount()float discount_amt;.,局部变量:不能在函数

16、外使用,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

17、,0,45,请输入两个数:56 45,子函数中sum的值是101,主函数中sum的值是101,56,101,存储类型 2-1,变量的存储方式可分为“静态存储”和“动态存储”两种静态存储变量是一直存在的,而动态存储变量则时而存在时而消失这种由于变量存储方式不同而产生的特性称为变量的生存期生存期表示了变量存在的时间,存储类型 2-2,静态局部变量,静态局部变量生存期为整个源程序静态局部变量作用域与自动变量相同,即只能在定义该变量的函数内使用该变量对基本类型的静态局部变量若在说明时未赋以初值,则系统自动赋予0值函数被调用时,其中的静态局部变量的值将保留前次被调用的结果,静态局部变量示例,void f

18、ormat()static int m=0;m+;if(m%10=0)putchar(n);elseputchar();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 910 11 12 13 14 15 16 17 18 1920 21 22 23 24 25 26 27 28 2930 31 32 33 34 35 36 37 38 3940 41 42 43 44 45 46 47 48 49,2,静态全局变量,静态全局变量与普通全局变量在

19、存储方式上完全相同区别在于:非静态全局变量的作用域是整个源程序;而静态全局变量的作用域只是定义它的文件,函数形参和实参,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的结果/定义函数funcvoid func(int a)a=10;/让参数a等于10,传值调用,0,传值调用,将会输出什么,#include void increment(int,int);void

20、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,引用调

21、用示例,请输入两个数:,45 67,递增前的值是 45 和 67,_,递增后的值是 46 和 68,45,67,子函数中的值是 46 和 68,46,FF23,FF05,68,FF23,FF05,数组作为函数参数,在用数组作实参时,以传址方式调用函数,也就是说把实参数组的首地址赋给形参实际上形参数组和实参数组为同一数组,共同拥有一段内存空间,数组作为参数示例1,问题描述:通过函数实现5个学员成绩的排序。,#include#define N 5void sort(float);void main()float gradeN;int i;printf(n 输入%d 个学员的成绩:n,N);for(

22、i=0;iN;i+)scanf(%f,传递数组时不使用“&”,演示:示例5,void sort(float aN)int i,j;float temp;for(i=0;i aj+1)temp=aj+1;aj+1=aj;aj=temp;,问题描述:通过函数实现求5个数中的最大值。,#include int find_larg(int*);void main()int arr15;int i,larg_num;printf(n 请输入 5 个不同的值,存储在一个数组中 n);for(i=0;i=4;i+)scanf(%d,数组作为参数示例2,演示:示例6,int find_larg(int*ptr

23、)int high=*ptr,i;ptr+;for(i=1;i=4;i+)if(high*ptr)high=*ptr;ptr+;return high;,总结 2-1,根据变量的作用域可以将变量划分为:局部变量和全局变量根据变量的存储类型(决定生存期)将变量划分为:自动变量、寄存器变量、静态变量、外部变量静态局部变量的生存期为整个源程序,但其作用域为定义该变量的函数静态全局变量的生存期为整个源程序,其作用域为定义该变量的源文件,总结 2-2,采用传值调用方式时,在被调用函数中改变形参的值,只是改变其副本值,而不会影响调用函数中实参值采用引用调用方式时,传递的是变量的地址值,这样在被调函数中,对形参的操作实际上操作的是实参本身数组作为函数传递时,实际采用引用调用方式,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号