《第2章_C语言快速入门-3.ppt》由会员分享,可在线阅读,更多相关《第2章_C语言快速入门-3.ppt(41页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第第3 3章章 程序控制结构程序控制结构2.9 函数的定义与使用函数的定义与使用函数函数(function)是结构设计的最基本单位是结构设计的最基本单位“一个程序应该是轻灵自由的,它的一个程序应该是轻灵自由的,它的子过程子过程就象串在一就象串在一根线上的珍珠。根线上的珍珠。”Geoffrey James的的编程之道编程之道 1、按定义分:标准函数、自定义函数、按定义分:标准函数、自定义函数2、按调用分:无参调用、有参调用、按调用分:无参调用、有参调用3、按功能分:无值返回、有值返回、按功能分:无值返回、有值返回第第3 3章章 程序控制结构程序控制结构用函数解决问题的要点用函数解决问题的要点分而
2、治之分而治之 函数把较大的任务函数把较大的任务分解分解成若干个较小成若干个较小的任务,并提炼出的任务,并提炼出公用任务公用任务复用复用 程序员可以程序员可以在其他函数的基础上在其他函数的基础上构造构造程序,而不需要从头做起程序,而不需要从头做起信息隐藏信息隐藏 设计得当的函数可以把具体设计得当的函数可以把具体操作细节操作细节(程序中不需要知道它们的那些部分程序中不需要知道它们的那些部分)隐藏隐藏掉,从而使整个程序结构清楚掉,从而使整个程序结构清楚某一功能,如某一功能,如某一功能,如某一功能,如果重复实现果重复实现果重复实现果重复实现3 3 3 3遍遍遍遍以上以上以上以上,即应考,即应考,即应考
3、,即应考虑将它写成通虑将它写成通虑将它写成通虑将它写成通用函数,并向用函数,并向用函数,并向用函数,并向小组成员发布小组成员发布小组成员发布小组成员发布C C语言程序设计类型类型 函数名函数名(类型类型 参数参数1,类型类型 参数参数2,)函数体函数体;return 表达式表达式;返回值返回值返回值返回值类型类型类型类型标识符标识符标识符标识符参数表参数表参数表参数表返回值返回值返回值返回值函数出口函数出口函数出口函数出口函数定义(函数定义(definitiondefinition)第第3 3章章 程序控制结构程序控制结构函数名命名规则函数名命名规则变量名形式变量名形式“名词名词”或者或者“形
4、容词形容词+名词名词”如变量名如变量名oldValue与与newValue等等函数名形式函数名形式“动词动词”或者或者“动词动词+名词名词”(动宾词组)(动宾词组)如函数名如函数名GetMax()等等 第第3 3章章 程序控制结构程序控制结构对函数接口加以注释说明对函数接口加以注释说明/*函数功能:实现函数功能:实现功能功能 函数参数:参数函数参数:参数1,表示,表示 参数参数2,表示,表示 函数返回值:函数返回值:*/返回值类型返回值类型 函数名函数名(参数表参数表)函数体函数体return 表达式表达式;第第3 3章章 程序控制结构程序控制结构1、函数名前面的类型函数名前面的类型实际上是实
5、际上是返回值的类型返回值的类型当当函函数数无无返返回回值值时时,可可用用void 定定义义为为“无无类类型型”或或“空类型空类型”。当当函函数数有有返返回回值值时时,必必须须定定义义函函数数类类型型,并并一一定定有有return语句语句 说明:说明:例:例:void printstar()printf(“*”);第第3 3章章 程序控制结构程序控制结构2、若为、若为无参函数无参函数,则形参列表为空,但,则形参列表为空,但括号不能省略括号不能省略。3、若为、若为有参函数有参函数,则必须有,则必须有形参形参及及形参说明形参说明。如:如:int max(int x,int y)int z;z=xy?
6、x:y;return(z);总结总结总结总结关于函数关于函数关于函数关于函数 函数是函数是函数是函数是这样这样的一种运算:的一种运算:的一种运算:的一种运算:v 函数名说明运算规则函数名说明运算规则函数名说明运算规则函数名说明运算规则v 参数是运算的操作数参数是运算的操作数参数是运算的操作数参数是运算的操作数v 返回值是运算的结果返回值是运算的结果返回值是运算的结果返回值是运算的结果 当函数当函数当函数当函数执执行到行到行到行到returnreturn语语句或句或句或句或 时时,函数的运算,函数的运算,函数的运算,函数的运算停止。返回到停止。返回到停止。返回到停止。返回到调调用它的地方用它的地
7、方用它的地方用它的地方继续继续向下向下向下向下执执行行行行v 函数可以有多个函数可以有多个函数可以有多个函数可以有多个returnreturn,但最好只有一个,但最好只有一个,但最好只有一个,但最好只有一个且是最后一行且是最后一行且是最后一行且是最后一行 用用用用voidvoid定义返回值类型定义返回值类型定义返回值类型定义返回值类型v函数没有运算结果,没有返回值函数没有运算结果,没有返回值函数没有运算结果,没有返回值函数没有运算结果,没有返回值vreturn;return;函数内部可以定义只能自己使用的变量,称函数内部可以定义只能自己使用的变量,称函数内部可以定义只能自己使用的变量,称函数内
8、部可以定义只能自己使用的变量,称内部变量内部变量内部变量内部变量。参数表里的参数(形式参数)也是函数的语参数表里的参数(形式参数)也是函数的语参数表里的参数(形式参数)也是函数的语参数表里的参数(形式参数)也是函数的语句块内的变量句块内的变量句块内的变量句块内的变量总结总结总结总结关于函数关于函数关于函数关于函数第第3 3章章 程序控制结构程序控制结构函数参数函数参数形参形参(形式参数形式参数):在在定义定义函数时函数名后面括号中的函数时函数名后面括号中的变量名变量名实参实参(实际参数实际参数):在在调用调用函数时函数名后面括号中的函数时函数名后面括号中的参数参数(或表达式或表达式)形式参数形
9、式参数形式参数形式参数实际参数实际参数实际参数实际参数第第3 3章章 程序控制结构程序控制结构【例例】计算两个整数的平均数计算两个整数的平均数/*函数功能:函数功能:计算平均数计算平均数 函数入口参数:函数入口参数:整型整型x,存储第一个运算数,存储第一个运算数 整型整型y,存储第二个运算数,存储第二个运算数 函数返回值:函数返回值:平均数平均数*/float Average(int x,int y)float result;result=(x+y)/2;return result;形参第第3 3章章 程序控制结构程序控制结构【例例】使用了使用了Average函数的函数的main()void
10、main()int a=12;int b=24;float ave;ave=Average(a,b);printf(Average of%d and%d is%f.n,a,b,ave);实参第第3 3章章 程序控制结构程序控制结构float Average(int x,int y)float result;result=(x+y)/2;return result;void main()int a=12;int b=24;float ave;ave=Average(a,b);printf();执行顺序执行顺序函数调用(函数调用(call)数据传递数据传递 在函数在函数在函数在函数调调用前,形参不
11、占内存用前,形参不占内存用前,形参不占内存用前,形参不占内存单单元,元,元,元,调调用用用用时时占用,占用,占用,占用,调调用后用后用后用后释释放。放。放。放。形参形参形参形参变变量和量和量和量和实实参参参参变变量占用不同的内存量占用不同的内存量占用不同的内存量占用不同的内存单单元元元元(传值传值)定定定定义义函数函数函数函数时时,必,必,必,必须须指定形参指定形参指定形参指定形参类类型型型型。实实参必参必参必参必须须有确定的有确定的有确定的有确定的值值,可以是常量,可以是常量,可以是常量,可以是常量,变变量或表达式。量或表达式。量或表达式。量或表达式。在在在在调调用用用用时时将将将将实实参的
12、参的参的参的值赋给值赋给形参形参形参形参变变量。量。量。量。关于参数的几点说明关于参数的几点说明:形参和实参的区别形参和实参的区别实参与形参应匹配(顺序、类型、个数)实参与形参应匹配(顺序、类型、个数)实参对形参的数据传递是实参对形参的数据传递是值传递值传递,只由实参传递给,只由实参传递给形参,调用结束后,只有形参单元被释放,形参,调用结束后,只有形参单元被释放,实参单实参单元中的值不变。元中的值不变。若是地址传递,可理解为实参与形参共用同一存储若是地址传递,可理解为实参与形参共用同一存储单元单元。(这一点在学习数组、指针时请注意听(这一点在学习数组、指针时请注意听)。形参和实参的区别形参和实
13、参的区别 单向单向单向单向值传递值传递值传递值传递函数参数为函数参数为函数参数为函数参数为基本数据类型时基本数据类型时基本数据类型时基本数据类型时地址传递地址传递 函数参数为数组名、指针类型时函数参数为数组名、指针类型时 c=max(a,b);c=max(a,b);-max(max(intint x,x,intint y)y)return(z);return(z);实参实参:在运行时在运行时 把值传给函数把值传给函数形参形参:通知系统通知系统 要预留内存位置要预留内存位置把函数把函数的结果的结果赋给函赋给函数名数名 形参与实参、函数名与返回值之间的关系形参与实参、函数名与返回值之间的关系 函数
14、函数调用的一般形式用的一般形式 1.1.函数函数函数函数调调用的一般形式用的一般形式用的一般形式用的一般形式为为:有参函数:有参函数:有参函数:有参函数:函数名(函数名(函数名(函数名(实实参表列);参表列);参表列);参表列);无参函数:无参函数:无参函数:无参函数:函数名(函数名(函数名(函数名(););););2.2.有关有关有关有关规规定:定:定:定:多个多个多个多个实实参参参参间间用逗号隔开用逗号隔开用逗号隔开用逗号隔开 实实参与形参参与形参参与形参参与形参间间个数相等,个数相等,个数相等,个数相等,类类型型型型应应一致一致一致一致 实实参与形参按参与形参按参与形参按参与形参按顺顺序
15、序序序对应对应,一一,一一,一一,一一传递传递数据数据数据数据函数调用(函数调用(CALL)1.1.函数函数函数函数语语句:句:句:句:把函数把函数把函数把函数调调用作用作用作用作为为一个一个一个一个语语句。此句。此句。此句。此时时不要求函数不要求函数不要求函数不要求函数带带回回回回值值,只要求函数完成一定的操作。,只要求函数完成一定的操作。,只要求函数完成一定的操作。,只要求函数完成一定的操作。例如:例如:例如:例如:printstarprintstar()();max(a,b)max(a,b)2.2.函数表达式:函数表达式:函数表达式:函数表达式:函数出函数出函数出函数出现现在一个表达式中
16、,在一个表达式中,在一个表达式中,在一个表达式中,这这种表达式称种表达式称种表达式称种表达式称为为函数表达式。函数表达式。函数表达式。函数表达式。这时这时要求函数要求函数要求函数要求函数带带回一个确定的回一个确定的回一个确定的回一个确定的值值以参加表达式的运算。以参加表达式的运算。以参加表达式的运算。以参加表达式的运算。例如:例如:例如:例如:c=3+max(a,b);c=3+max(a,b);3.3.函数参数:函数参数:函数参数:函数参数:(函数的嵌套函数的嵌套函数的嵌套函数的嵌套调调用用用用 )函数调用作为一个函数的实参。函数调用作为一个函数的实参。例如:例如:m=max(a,max(b,
17、c);函数调用的方式函数调用的方式 函数的每次函数的每次函数的每次函数的每次执执行都会建立一个全新的独立的行都会建立一个全新的独立的行都会建立一个全新的独立的行都会建立一个全新的独立的环环境境境境为函数的每个变量(包括形式参数)分配内存为函数的每个变量(包括形式参数)分配内存为函数的每个变量(包括形式参数)分配内存为函数的每个变量(包括形式参数)分配内存把实际参数的值把实际参数的值把实际参数的值把实际参数的值复制复制复制复制给形式参数给形式参数给形式参数给形式参数开始执行函数内的第一条语句开始执行函数内的第一条语句开始执行函数内的第一条语句开始执行函数内的第一条语句 函数内的代函数内的代函数内
18、的代函数内的代码码在在在在这这个独立的个独立的个独立的个独立的环环境内工作境内工作境内工作境内工作 函数退出函数退出函数退出函数退出时时求出返回值求出返回值求出返回值求出返回值收回分配给所有变量(包括形式参数)的内存收回分配给所有变量(包括形式参数)的内存收回分配给所有变量(包括形式参数)的内存收回分配给所有变量(包括形式参数)的内存程序控制权交给调用者,调用者拿到返回值,将其作程序控制权交给调用者,调用者拿到返回值,将其作程序控制权交给调用者,调用者拿到返回值,将其作程序控制权交给调用者,调用者拿到返回值,将其作为函数调用表达式的结果为函数调用表达式的结果为函数调用表达式的结果为函数调用表达
19、式的结果函数调用的过程函数调用的过程第第3 3章章 程序控制结构程序控制结构函数原型(函数原型(prototype)调用一个函数之前,先要对其调用一个函数之前,先要对其返回值类型返回值类型、函数名函数名和和参数参数进行声明(进行声明(declare)有助于编译器进行类型检查有助于编译器进行类型检查声明时不要省略参数以及返回值的类型声明时不要省略参数以及返回值的类型被调函数在主调函数之前已定义,不需说明被调函数在主调函数之前已定义,不需说明第第3 3章章 程序控制结构程序控制结构#include/*函数功能:函数功能:计算平均数计算平均数 函数入口参数:函数入口参数:整型整型x,存储第一个运算数
20、,存储第一个运算数 整型整型y,存储第二个运算数,存储第二个运算数 函数返回值:函数返回值:平均数平均数*/float Average(int x,int y)float result;result=(x+y)/2;return result;void main()int a=12;int b=24;float ave=Average(a,b);printf(Average of%d and%d is%f.n,a,b,ave);第第3 3章章 程序控制结构程序控制结构#include float Average(int x,int y);/*声明声明Average()函数函数*/void ma
21、in()int a=12;int b=24;float ave=Average(a,b);printf(Average of%d and%d is%f.n,a,b,ave);/*函数功能:函数功能:计算平均数计算平均数 函数入口参数:函数入口参数:整型整型x,存储第一个运算数,存储第一个运算数 整型整型y,存储第二个运算数,存储第二个运算数 函数返回值:函数返回值:平均数平均数*/float Average(int x,int y)float result;result=(x+y)/2;float result;第第3 3章章 程序控制结构程序控制结构编程举例编程举例:打印下列图形打印下列图形
22、*矩形矩形矩形矩形三角形三角形三角形三角形1 1 1 1三角形三角形三角形三角形2 2 2 2三角形三角形三角形三角形3 3 3 3菱形菱形菱形菱形第第3 3章章 程序控制结构程序控制结构以下图为例(共N 行,N 由键盘输入)。*此类题目分析的要点是:通过分析,找出每行空格、*与行号i及总行数N的关系。其循环结构可用右图表示。分析:(设N=5)第1行 4个空格=5-1 1个“*”=2*行号-1第2行 3个空格=5-2 3个“*”=2*行号-1第3行 2个空格=5-3 5个“*”=2*行号-1第4行 1个空格=5-4 7个“*”=2*行号-1第5行 0个空格=5-5 9个“*”=2*行号-1由此
23、归纳出:第i行的空格数N-i个;第i行的“*”数是2i-1个。第第3 3章章 程序控制结构程序控制结构程序实现步骤程序实现步骤 输出输出n行星号是一个重复动作,可以用循环实现。行星号是一个重复动作,可以用循环实现。自定义函数自定义函数printstar(i,),表示输出第,表示输出第i行的星号。行的星号。for(i=1;i=n;i+)printstar(i,n);*第第3 3章章 程序控制结构程序控制结构 下面一步是要完成下面一步是要完成printstar(i,)的定义。的定义。其一,第其一,第i行有几个字符?行有几个字符?其二:即第其二:即第i行的第一个字符位置在哪儿?行的第一个字符位置在哪
24、儿?其三,第其三,第i行前面的空白怎么处理?行前面的空白怎么处理?2*i-12*i-1n-i+1n-i+1输出空格的个数输出空格的个数=n-in-i*第第3 3章章 程序控制结构程序控制结构函数函数printstar()的定义:的定义:#define SPACE 32 /*32是空格字符的是空格字符的ASCII码码*/void printstar(int i,int n)int j;for(j=1;j=n-i;j+)/*输出输出n-i个空格个空格*/printf(%c,SPACE);for(j=1;j=2*i-1;j+)/*输出输出2*i-1个个*/printf(%c,*);printf(“n
25、”);/*换行换行*/*第第3 3章章 程序控制结构程序控制结构主程序及运行结果主程序及运行结果#include#define SPACE 32void printstar(int i,int n);void main()int i,n;printf(please input n:);scanf(%d,&n);for(i=1;i=n;i+)printstar(i,n);第第3 3章章 程序控制结构程序控制结构枚举法(穷举法)枚举法(穷举法)“笨人之法笨人之法”:把所有可能的情况一一测试,筛选出符合把所有可能的情况一一测试,筛选出符合条件的各种结果进行输出。条件的各种结果进行输出。分析:分析:这
26、是个不定方程这是个不定方程三元一次方程组问题三元一次方程组问题 (三个变量,两个方程)(三个变量,两个方程)xyz=100 5x3yz/3=100 设公鸡为设公鸡为x只,母鸡为只,母鸡为y只,小鸡为只,小鸡为z只。只。第第3 3章章 程序控制结构程序控制结构百元买百鸡问题分析百元买百鸡问题分析x xy yz=100z=1005x5x3y3yz/3=100z/3=100三重循环第第3 3章章 程序控制结构程序控制结构void main()int x,y,z;for(x=0;x=100;x+)for(y=0;y=100;y+)for(z=0;z=100;z+)if (x+y+z=100&5*x+3
27、*y+z/3=100)printf(x=%d,y=%d,z=%dn,x,y,z);结果:x=0,y=25,z=75 x=4,y=18,z=78 x=8,y=11,z=81 x=12,y=4,z=84【讨论讨论】为什么多了几组解为什么多了几组解?第第3 3章章 程序控制结构程序控制结构百元买百鸡问题分析百元买百鸡问题分析void main()int x,y,z;for(x=0;x=100;x+)for(y=0;y=100;y+)for(z=0;z=100;z+)if (z%3=0&x+y+z=100&5*x+3*y+z/3=100)printf(x=%d,y=%d,z=%dn,x,y,z);结果
28、:x=0,y=25,z=75 x=4,y=18,z=78 x=8,y=11,z=81 x=12,y=4,z=84【讨论讨论】此为此为“最笨最笨”之法之法要进行要进行101101101=1030301次次(100多万次)运算。多万次)运算。第第3 3章章 程序控制结构程序控制结构优化优化void main()int x,y,z;for(x=0;x=100;x+)for(y=0;y=100;y+)z=100-x-y;if (z%3=0&5*x+3*y+z/3=100)printf(cocks=%d,hens=%d,chickens=%dn,x,y,z);【讨论讨论】令令z=100-x-y 只进行只
29、进行101101=10201 次运算(前者的次运算(前者的1%)取取x=20,y=33 只进行只进行2134=714 次运算(第次运算(第1种运算的种运算的6.9e-4)第第3 3章章 程序控制结构程序控制结构第第3 3章章 程序控制结构程序控制结构继续优化继续优化void main()int x,y,z;for(x=0;x=14;x+)for(y=0;y=25;y+)if (7*x+4*y=100)z=100-x-y;printf(cocks=%d,hens=%d,chickens=%dn,x,y,z);取取x=14,y=25 只进行只进行1526=390 次运算次运算第第3 3章章 程序控
30、制结构程序控制结构利用穷举法求解趣味智力题利用穷举法求解趣味智力题(韩信点兵韩信点兵)韩信有一队兵,他想知道有多少人,便让士兵排队报韩信有一队兵,他想知道有多少人,便让士兵排队报数。按从数。按从1至至5报数,最末一个士兵报的数为报数,最末一个士兵报的数为1;按从;按从1至至6报数,最末一个士兵报的数为报数,最末一个士兵报的数为5;按从;按从1至至7报数,报数,最末一个士兵报的数为最末一个士兵报的数为4;最后再按从;最后再按从1至至11报数,最报数,最末一个士兵报的数为末一个士兵报的数为10。你知道韩信至少有多少兵吗。你知道韩信至少有多少兵吗?设兵数为设兵数为x,则,则x应满足:应满足:x%5=
31、1&x%6=5&x%7=4&x%11=10穷举法对穷举法对x从从1开始试验开始试验第第3 3章章 程序控制结构程序控制结构#include void main()int x;for(x=1;x 5000;x+)if(x%5=1&x%6=5&x%7=4&x%11=10)printf(x=%dn,x);/*属于属于“瞎猫碰死耗子瞎猫碰死耗子”的做法的做法*/穷举法求解韩信点兵穷举法求解韩信点兵第第3 3章章 程序控制结构程序控制结构#include void main()int x;for(x=1;x+)if(x%5=1&x%6=5&x%7=4&x%11=10)printf(x=%dn,x);/*
32、死循环死循环永远不会退出的循环永远不会退出的循环*/穷举法求解韩信点兵穷举法求解韩信点兵第第3 3章章 程序控制结构程序控制结构穷举法求解韩信点兵:方案穷举法求解韩信点兵:方案1-goto#include void main()int x;for(x=1;x+)if(x%5=1&x%6=5&x%7=4&x%11=10)printf(x=%dn,x);goto END;END:;第第3 3章章 程序控制结构程序控制结构穷举法求解韩信点兵:方案穷举法求解韩信点兵:方案2-break#include void main()int x;for(x=1;x+)if(x%5=1&x%6=5&x%7=4&x%11=10)printf(x=%dn,x);break;第第3 3章章 程序控制结构程序控制结构穷举法求解韩信点兵穷举法求解韩信点兵:方案方案3-标志变量标志变量#include void main()int x;int find=0;/*设置找到标志为假设置找到标志为假*/for(x=1;!find;x+)if(x%5=1&x%6=5&x%7=4&x%11=10)printf(x=%dn,x);find=1;