C语言程序设计项目式教程:模块化程序设计_第1页
C语言程序设计项目式教程:模块化程序设计_第2页
C语言程序设计项目式教程:模块化程序设计_第3页
C语言程序设计项目式教程:模块化程序设计_第4页
C语言程序设计项目式教程:模块化程序设计_第5页
已阅读5页,还剩130页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

模块化程序设计C语言程序设计任务驱动式教程特别提示程序宏观框架结构程序的构成程序开发过程程序开发环境目录导学可采用“组装”的办法来简化程序设计。根据需要选取配件组装成成品——这就是“模块化”程序设计思路。C程序是有称之为“函数’的配件组成。什么是“函数’呢?函数的概述任务一一个庞大的main()函数会带来如下问题:①不可能稳定可靠。②不可能精炼高效。③不可能与时俱进。④不可能控制精度。C语言为程序的结构提供了有力武器:函数函数的概述任务一解决的方法:用模块化程序设计的思路函数就是功能每一个函数用来实现一个特定的功能函数的名字应反映其代表的功能在设计一个较大的程序时,往往把它分为若干个程序模块,每一个模块包括一个或多个函数,每个函数实现一个特定的功能C程序可由一个主函数和若干个其他函数构成主函数调用其他函数,其他函数也可以互相调用同一个函数可以被一个或多个函数调用任意多次函数的概述任务一任务一函数的概述打印输出如下所示超市购物小票的票头。#include<stdio.h>voidprint_welcome();//声明print_welcome函数voidprint_star(intn);

//声明print_star函数voidmain(){

print_welcome();

//调用自定义函数

print_star(30); }voidprint_welcome()//定义print_welcome函数{

printf("\n某某超市欢迎您\n");}//定义print_star函数,n为'*'号的数量void

print_star(intn){int

i;for(i=0;i<n;i++)putchar('*');}任务一函数的概述-几点说明通过引例可得:⑴一个程序由一个或多个程序模块组成。这样便于分工合作,提高效率。⑵一个源程序文件由一个或多个函数组成。C程序的执行从主函数main开始。⑶被调用的函数分为两类:库函数和用户自定义函数。⑷从函数的外观形式看,函数分为有参函数和无参函数两类。任务一函数的概述-几点说明对于库函数,程序设计者只需用#include指令把有关的头文件包含到本文件模块中即可。程序设计者需要在程序中自己定义想用的而库函数并没有提供的函数。(1)库函数查看“附录

常用的ANSIC标准库函数”。使用库函数要添加函数所在的头文件,例如:#include<stdio.h>#include<math.h>(2)自定义函数你可以按照自己的意愿编写自己的函数,完成特定的功能。本章重点介绍自定义函数。技能实训1、编程实现:输出以下的结果,用函数调用实现。******************

Howdoyoudo!

******************解题思路:在输出的文字上下分别有一行“*”号,显然不必重复写这段代码,用一个函数print_star来实现输出一行“*”号的功能。再写一个print_message函数来输出中间一行文字信息用主函数分别调用这两个函数。练一练函数的概述任务一任务一函数的概述

#include<stdio.h>intmain(){voidprint_star();voidprint_message();

print_star();print_message();

print_star();return0;}voidprint_star(){printf(“******************\n”);}voidprint_message(){printf(“Howdoyoudo!\n”);}输出16个*输出一行文字声明函数定义函数学习总结答一答【问题1】一个庞大的main()函数会带来哪些不良问题?【问题2】被调用的函数分为哪两类呢?任务一函数的概述感谢观看!模块化程序设计C语言程序设计任务驱动式教程特别提示程序宏观框架结构程序的构成程序开发过程程序开发环境目录导学“函数’是怎么定义的呢?函数的基本使用

任务二与变量“先定义,后使用”的使用规则相同,函数的使用也必须遵循“先定义,后调用”的原则。函数的定义是指对函数功能的确定,包括指定函数名、函数值的类型、形参及其类型、函数体等。函数由函数头和函数体两部分组成。函数头又由返回值类型、函数名和形式参数表组成。返回值类型可以是某个数据类型;函数名是用户为函数起的名字,用来唯一标识一个函数;形式参数表可以有零个或多个变量,在进行函数调用时,实际参数将被复制到这些变量中。函数体则是函数实现自身功能的一组语句。函数的基本使用

任务二对于一个函数,应包括以下内容:(1)函数返回值类型:表示该函数返回值的类型,可以是int、float、char或其他标准的预定义类型,也可以是用户自定义的类型,甚至是无值型void(即函数不返回任何值),若省略,系统将自动赋予函数的类型为int型。(2)函数名:函数标志符,命名规则与变量相同。(3)函数参数:代表函数的自变量,形式参数和实际参数之间必须用逗号隔开。参数表或形式参数说明表外加了一对方括号,表示函数的参数可有可无,是任选的。(4)函数功能/函数体:函数体必须起始于左括号,结束于右括号。其中给出的是实现函数功能的语句列表。函数的基本使用-函数定义任务二函数首部

1.定义无参函数定义形式:类型名

函数名(void){声明部分语句部分

类型名

函数名(){声明部分语句部分

函数体函数首部函数体函数名后面括号内的void表示“空”,即函数没有参数。无参函数的“类型说明符”指定函数返回值的类型,可以是任何有效类型。省略“类型说明符”时,系统默认的函数返回值类型为int型。当函数只完成特定操作而不需返回函数值时,可用类型名void函数的基本使用-函数定义任务二函数返回值类型函数名(形式参数列表){

函数体;

}定义形式2.定义有参函数有参函数在函数名后的括号内必须有形式参数(简称“形参”)表,用于调用函数和被调函数之间的数据传递,故必须对其进行类型说明,这由形式参数声明部分完成。一般情况下,函数中需要多少个原始数据,函数的形参表中就应有多少个形参,每个形参存放一个数据,形参之间用逗号隔开。函数的基本使用-函数定义任务二函数返回值类型函数名(

){}定义形式3.定义空函数作用:先用空函数占一个位置,以后逐步扩充。好处:程序结构清楚,可读性好,以后扩充新功能方便,对程序结构影响不大。函数的基本使用-函数定义示例任务二函数首部包括函数返回值类型、函数名、形式参数;函数体实现函数功能。

任何自定义函数都是由函数首部、函数体两部分组成。函数的基本使用-函数定义示例任务二自定义函数sum,计算1+2+3+……+n的和。int

sum(int

n){

inti,s;

for(i=0;i<=n;i++)

s+=i;return

s;}▲函数返回值为int。▲函数名为sum。▲形参为1个int型n。▲函数类型int应与returns;中变量s类型一致。函数的基本使用-函数定义示例任务二#include<stdio.h>intsum(intn);intmain(){intn,x;printf("输入n:"); scanf("%d",&n);x=sum(n); printf("1+2+3+...+n=%d\n",x); return0;}intsum(intn){inti,s=0;for(i=0;i<=n;i++)s+=i;returns;}自定义函数sum,计算1+2+3+……+n的和。函数的基本使用-函数定义示例任务二自定义函数string_len,计算一个字符串的长度。▲函数返回值为int。▲函数名为string_len。▲形参是1个一维字符数组。▲函数类型int应与returni;中变量i类型一致。intstring_len(charstr[]){ inti=0;

while(str[i]!='\0') i++;

returni;}【注意】当一维数组作为函数形参时,允许不给出数组的长度。函数的基本使用-函数定义说明任务二⑴函数的第一行称为函数首部。

包括函数返回值类型、函数名和形参列表等信息。intcom(intx,inty)//函数首部{

if(x>y)

return

x;

else

return

y;}函数返回值类型函数名形式参数列表⑵大括号“{}”中的语句称为函数体,实现函数功能。函数体函数的基本使用-函数定义说明任务二⑶函数无返回值,则为void类型。

函数有返回值,则函数体中应有一条return语句。voidprint_welcome() { printf("\n

欢迎进入...\n");}floatsum(floatx,flaoty){

floats; s=x+y;

returns;}技能实训1、自定义函数even,其功能为判断一个整数是否为偶数,如果是偶数,则返回值为1,否则返回值为0。⑴函数返回值为int。⑵函数名为even。⑶形参的类型为1个int型。练一练函数的基本使用-函数定义任务一#include<stdio.h>inteven(intn){if(n%2==0)return1;elsereturn0;}intmain(){intn;printf("pleaseinputanumber:\n");scanf("%d",&n);if(even(n))printf("1\n");elseprintf("0\n");return0;}#include<stdio.h>voidsort(intn){if(n%2==0)printf("thenumberisdouble\n");elseprintf("thenumberisodd\n");}intmain(){intn;printf("pleaseinputanumber:\n");scanf("%d",&n);sort(n);return0;}学习总结答一答【问题1】函数定义的语法格式?【问题2】函数的组成部分?【问题3】函数的分类?任务一函数的基本使用-函数定义感谢观看!模块化程序设计C语言程序设计任务驱动式教程特别提示程序宏观框架结构程序的构成程序开发过程程序开发环境目录导学----Printf是未声明标识符?如何消除错误导学----错误消除C语言要求,在程序中用到的所有函数,必须“先定义,后使用”函数声明的作用、方法和位置。

函数的基本使用-函数声明任务二函数声明作用:⑵编译系统对程序进行编译时,检查被调用函数是否正确存在。⑴将函数信息(函数类型、函数名、函数参数的个数与类型)通知编译系统。函数的基本使用-函数声明任务二

在源程序的开始位置将库函数对应的头文件进行包含即可。标准库函数头文件#include"stdio.h"voidmain(){

int

x;scanf("%d",&x);......}

只需将函数首部取出来,再加一个“;”即可。自定义函数声明#include"stdio.h"int

sum(intn);voidmain(){......}intsum(intn){

……}库函数声明自定义函数声明函数的基本使用-函数声明任务二【声明位置】#include"stdio.h"int

sum(intn);voidmain(){

int

x=100,s;s=sum(x);......}intsum(intn){

……}⑴函数声明写在主调函数的外部▲main()函数是主调函数▲函数声明为全局声明▲可被声明语句之后的所有函数调用intsum(int);等价于

函数声明中形参变量名可省略,而只写形参类型。函数的基本使用-函数声明任务二【声明位置】⑵函数声明写在主调函数的说明语句中▲只能被main调用,其他函数不能调用▲函数声明为局部声明#include"stdio.h"void

main(){

intsum(int

);int

x=100,s;s=sum(x);......}intsum(intn){

……}函数的基本使用-函数声明任务二C语言规定以下几种情况,可以不在主调函数中对被调函数进行声明:▲如果函数的返回值为整型或字符型,可以不必进行声明。▲如果被调函数写在主调函数的前面,可以不必进行声明。▲如果在所有函数定义之前,在源程序文件的开头,即在函数的外部已经对函数进行了声明,则在各个调用函数中不必再对所调用的函数进行声明。函数的基本使用-函数声明任务二▲通过自定义函数,求任意两个整数的和。#include<stdio.h>intmain(){inta,b;

printf("inputtwointegers:");

scanf("%d,%d",&a,&b);

printf("Thesumof%dand%dis%d\n",a,b,sum(a,b)); /*调用函数*/

return0;}intsum(inta,intb) /*函数定义*/{

return(a+b); /*返回a+b的值*/}学习总结答一答【问题1】函数声明作用?【问题2】简要说明不同的函数的声明位置?任务二程序宏观框架结构感谢观看!模块化程序设计C语言程序设计任务驱动式教程特别提示程序宏观框架结构程序的构成程序开发过程程序开发环境目录导学这些函数呢C语言程序有函数构成,函数包括库函数和自定义函数。?如何调用调用这些函数呢函数的基本使用-函数调用的形式任务二#include"stdio.h"intsum(intx,inty){

returnx+y;}voidmain(){

intsum(int,int);

inta=100,b=210,s; s=sum(a,b); ......}函数声明

函数声明和函数定义的最终目的是为了使用这些函数。使用函数的过程就称为函数的调用。函数定义函数调用函数的基本使用-函数调用的形式任务二变量必须先定义,后使用。函数也必须先定义,后调用。函数调用的一般形式:

函数名(实参1,实参2,…);【说明】函数定义时,圆括号内的参数称为形参。函数调用时,圆括号内的参数称为实参。实参与形参的个数应相等,类型应一致,顺序应对应。如果调用无参函数,则“实际参数表列”可以没有,但括号不能省略。函数的基本使用-函数调用的形式任务二按函数调用在程序中出现的形式和位置来分,可以有以下3种函数调用方式:1.函数调用语句把函数调用单独作为一个语句如printf_star();这时不要求函数带回值,只要求函数完成一定的操作2.函数表达式函数调用出现在另一个表达式中如c=max(a,b);这时要求函数带回一个确定的值以参加表达式的运算函数调用的形式:函数的基本使用-函数调用的形式任务二3.函数参数函数调用作为另一函数调用时的实参如m=max(a,max(b,c));其中max(b,c)是一次函数调用,它的值作为max另一次调用的实参函数调用的形式:函数的基本使用-函数调用的形式任务二函数名(形式参数列表)voidprint_welcome() {printf("\n欢迎进入...\n");}voidmain(){

int

sum(int,int);

int

a=100,b=210,s;print_welcome();s=sum(a,b);......}调用无参函数,实参为空。【调用形式】函数的基本使用-函数调用的形式任务二例如:intsum(intx,inty){

return

x+y;}voidmain(){

int

sum(int,int);

inta=100,b=210,s;print_welcome();s=sum(a,b); ......}调用有参函数,在()内写出实参,各实参之间用逗号隔开,实参与形参一

一对应。函数的基本使用-函数调用的形式任务二#include"stdio.h"voidprint_welcome() {…….}intsum(intx,inty){……}voidmain(){intsum(int,int);

inta=100,b=210,s;print_welcome();s=sum(a,b);......}函数无返回值,函数调用单独作为一个语句函数有返回值,函数调用通常出现在表达式中函数的基本使用-函数调用的形式任务二例如:intsum(intx,inty){

return

x+y;}voidmain(){

int

sum(int,int);

inta=100,b=210,s;print_welcome();s=sum(a,b); ......}调用有参函数,在()内写出实参,各实参之间用逗号隔开,实参与形参一

一对应。函数的基本使用-函数调用的形式任务二编写一个函数,选出能被3整除且至少一位是5的两位数,用主函数调用这个函数,并输出所有这样的两位。#include<stdio.h>intmain(){intfunc(inta);intr,i;for(i=10;i<100;i++){r=func(i);if(r!=0)printf("%3d",r); } printf("\n");return0;}intfunc(inta){if(a%3==0&&(a%10==5||a/10==5))return(a);else return(0);}学习总结答一答【问题1】函数调用的一般形式是怎么样的?【问题2】按函数调用在程序中出现的形式和位置来分,可以有哪几种函数调用方式?任务二函数的基本使用-函数调用的形式感谢观看!模块化程序设计C语言程序设计任务驱动式教程特别提示程序宏观框架结构程序的构成程序开发过程程序开发环境目录导学这些函数呢?调用函数的时候,参数之间值是如何传递的呢函数的基本使用-函数调用值的传递任务二1.形式参数和实际参数在调用有参函数时,主调函数和被调用函数之间有数据传递关系自定义函数时函数名后面的变量名称为“形式参数”(简称“形参”)主调函数中调用一个函数时,函数名后面参数称为“实际参数”(简称“实参”)实际参数可以是常量、变量或表达式2.实参和形参间的数据传递在调用函数过程中,系统会把实参的值传递给被调用函数的形参或者说,形参从实参得到一个值该值在函数调用期间有效,可以参加被调函数中的运算函数的基本使用-函数调用值的传递任务二例:

输入两个整数,要求输出其中值较大者。要求用函数来找到大数。解题思路:(1)函数名应是见名知意,今定名为max(2)由于给定的两个数是整数,返回主调函数的值(即较大数)应该是整型(3)max函数应当有两个参数,以便从主函数接收两个整数,因此参数的类型应当是整型函数的基本使用-函数调用值的传递任务二先编写max函数:intmax(intx,inty){

intz;

z=x>y?x:y;

return(z);}在max函数上面,再编写主函数#include<stdio.h>intmain(){intmax(intx,inty);inta,b,c;printf(“twointegernumbers:");scanf(“%d,%d”,&a,&b);c=max(a,b);printf(“maxis%d\n”,c);}实参可以是常量、变量或表达式函数的基本使用-函数调用值的传递任务二

c=max(a,b);(main函数)intmax(intx,inty)(max函数){intz;z=x>y?x:y;return(z);}函数的基本使用-函数调用值的传递任务二在定义函数中指定的形参,在未出现函数调用时,它们并不占内存中的存储单元。在发生函数调用时,函数max的形参被临时分配内存单元。2a3bxy23实参形参函数的基本使用-函数调用值的传递任务二调用结束,形参单元被释放实参单元仍保留并维持原值,没有改变如果在执行一个被调用函数时,形参的值发生改变,不会改变主调函数的实参的值2a3bxy23实参形参学习总结答一答【问题1】什么是形式参数和实际参数?【问题2】实参和形参间的数据是如何传递的?任务二函数调用值的传递感谢观看!模块化程序设计C语言程序设计任务驱动式教程特别提示程序宏观框架结构程序的构成程序开发过程程序开发环境目录导学这些函数呢通常,希望通过函数调用使主调函数能得到一个确定的值,那么这个值是多少呢?该如何判断呢??函数的基本使用-函数的返回值任务二通常,希望通过函数调用使主调函数能得到一个确定的值,这就是函数值(函数的返回值)。1、函数的返回值是通过函数中的return语句获得的。一个函数中可以有一个以上的return语句,执行到哪一个return语句,哪一个就起作用。return语句后面的括号可以不要。2、函数值的类型。应当在定义函数时指定函数值的类型。3、在定义函数时指定的函数类型一般应该和return语句中的表达式类型一致。如果函数值的类型和return语句中表达式的值不一致,则以函数类型为准。函数的基本使用-函数的返回值任务二将前面我们学习过的:输入两个整数,要求输出其中值较大者的程序稍作改动,将在max函数中定义的变量z改为float型。函数返回值的类型与指定的函数类型不同,分析其处理方法。解题思路:如果函数返回值的类型与指定的函数类型不同,按照赋值规则处理。#include<stdio.h>intmain(){intmax(floatx,floaty);floata,b;intc;scanf("%f,%f,",&a,&b);c=max(a,b);printf("maxis%d\n",c);return0;}intmax(floatx,floaty){floatz;z=x>y?x:y;return(z);}1.52.62.62变为2函数的基本使用-函数原型任务二对被调用函数的声明和函数原型在一个函数中调用另一个函数需要具备如下条件:(1)被调用函数必须是已经定义的函数(是库函数或用户自己定义的函数)。(2)如果使用库函数,应该在本文件开头加相应的#include指令。(3)如果使用自己定义的函数,而该函数的位置在调用它的函数后面,应该声明。函数的基本使用-函数原型任务二例:

输入两个实数,用一个函数求出它们之和。解题思路:用add函数实现。首先要定义add函数,它为float型,它应有两个参数,也应为float型。特别要注意的是:要对add函数进行声明。分别编写add函数和main函数,它们组成一个源程序文件main函数的位置在add函数之前在main函数中对add函数进行声明函数的基本使用-函数原型任务二#include<stdio.h>intmain(){floatadd(floatx,floaty);floata,b,c;printf("Pleaseenteraandb:");scanf("%f,%f",&a,&b);c=add(a,b);printf("sumis%f\n",c);return0;}floatadd(floatx,floaty){floatz;z=x+y;return(z);}求两个实数之和,函数值也是实型对add函数声明定义add函数调用add函数只差一个分号函数的基本使用-函数原型任务二函数原型的一般形式有两种:如floatadd(floatx,floaty);floatadd(float,float);原型说明可以放在文件的开头,这时所有函数都可以使用此函数学习总结答一答【问题1】什么是函数返回值?函数的返回值是怎样获得的?【问题2】在一个函数中调用另一个函数需要具备什么条件?任务二函数的返回值感谢观看!模块化程序设计C语言程序设计任务驱动式教程特别提示程序宏观框架结构程序的构成程序开发过程程序开发环境目录导学这些函数呢C语言的函数定义是互相平行、独立的,即函数不能嵌套定义,但可以嵌套调用函数。?如何嵌套调用函数呢函数的基本使用-函数的嵌套调用任务二一个函数在被调用的过程中可以调用其他函数,这就是函数的嵌套调用。下图给出了函数的两层嵌套调用示意图,sum函数在被main函数调用的过程中又调用了fac函数,其执行顺序如下图中的①~⑨。main函数①调用a函数⑨结束a函数③调用b函数⑦②⑧b函数⑤④⑥函数的基本使用-函数的嵌套调用任务二例:

输入4个整数,找出其中最大的数。用函数的嵌套调用来处理。解题思路:main中调用max4函数,找4个数中最大者max4中再调用max2,找两个数中的大者max4中多次调用max2,可找4个数中的大者,然后把它作为函数值返回main函数main函数中输出结果函数的基本使用-函数的嵌套调用任务二#include<stdio.h>intmain(){intmax4(inta,intb,intc,intd);//对max4函数声明inta,b,c,d,max;printf(“4intergernumbers:");scanf("%d%d%d%d",&a,&b,&c,&d);//输入4个整数max=max4(a,b,c,d);//调用后肯定是4个数中最大者printf("max=%d\n",max);//输出最大者return0;}▲主函数:函数的基本使用-函数的嵌套调用任务二▲max4函数intmax4(inta,intb,intc,intd){intmax2(inta,intb);//对max2函数声明intm;m=max2(a,b);//a,b中较大者m=max2(m,c);

//a,b,c中最大者m=max2(m,d);//a,b,c,d中最大者return(m);}▲max2函数intmax2(inta,intb)//a,b中较大者

{if(a>=b)returna;elsereturnb;}技能实训练一练技能实训任务二编程实现:自定义函数string_len,其功能为计算一个字符串的长度。#include<stdio.h>#defineN100intstring_len(char[]);

//函数声明voidmain(){

char

s[N];

int

len;

printf("请输入一个字符串:");

gets(s);

len=string_len(s);

//函数调用

printf("字符串长度为:%d.\n",len);}intstring_len(charstr[])//函数定义{

int

i=0;while(str[i]!='\0')

i++;

returni;}输入:Hello!6学习总结答一答【问题1】什么是函数的嵌套调用?任务一函数的嵌套调用感谢观看!模块化程序设计C语言程序设计任务驱动式教程特别提示程序宏观框架结构程序的构成程序开发过程程序开发环境目录导学这些函数呢?什么是带参宏定义带参宏定义任务三在C语言中,公式型函数还有另一种简单的实现方式,即使用带参宏定义。#definePI3.14用符号PI代表常量3.14,这是无参数宏定义。#defineL(r)2*PI*r参数r为圆的半径,这是带参数宏定义。也是公式型函数的另外一种简单的实现方式带参宏定义-定义形式任务三#define宏名(形参列表)字符串⑴宏名一般用大写字母表示。⑵两个以上的形参之间用逗号隔开,形参不分配内存单元。宏名形参之间用逗号隔开#define

MAX(x,y)x>y?x:y#define

MAX(x,y)x>y?x:y【形式】【说明】带参宏定义-定义形式任务三⑶字符串中要用到形参列表中的各个形参。两个形参都要用到#define

MAX(x,y)x>y?x:y⑷宏定义不是语句,行未不加;号。#define

MAX(x,y)x>y?x:y行末无;号【说明】带参宏定义-调用任务三宏名(实参列表)

;⑴宏调用中的实参是有具体值的常量、变量或表达式,实参的数量要与形参对应。c=MAX(3,9);c=MAX(a,b);c=MAX(a+10,b);实参是常量实参是变量实参是表达式【形式】【说明】带参宏定义-调用任务三⑵宏调用时,对实参表达式不作任何计算,而是直接用实参原样代替形参,即“先原样替换,然后再计算”。#include"stdio.h"#defineT(y)y*yvoidmain(){

inta,b; scanf("%d",&a); b=T(a+1); printf("%d\n",b);}输入:37#include"stdio.h"#defineT(y)(y)*(y)voidmain(){

inta,b; scanf("%d",&a); b=T(a+1); printf("%d\n",b);}输入:316b=3+1*3+1b=(3+1)*(3+1)【说明】带参宏定义任务三用带参宏定义的方式,输出两个整数中的较大数。【应用】#include<stdio.h>#defineMAX(x,y)x>y?x:yvoidmain(){inta,b,c;printf("输入a、b:");

scanf("%d%d",&a,&b);c=MAX(a,b);printf("较大数是:%d\n",c);}技能实训练一练技能实训任务二1、用带参数的宏定义表示圆的面积。【分析】⑴利用无参宏定义,定义PI为3.14。⑵利用带参宏定义,定义R(r)为PI*r*r。⑶输出保留2位小数。学习总结答一答任务三带参宏定义1、什么是带参数宏定义?2、带参宏定义的定义形式是怎样的?3、带参宏定义如何调用?感谢观看!模块化程序设计C语言程序设计任务驱动式教程特别提示程序宏观框架结构程序的构成程序开发过程程序开发环境目录导学这些函数呢一个自定义函数,可以调用自己吗?。?函数递归调用任务四在调用一个函数的过程中又出现直接或间接地调用该函数本身,称为函数的递归调用。C语言的特点之一就在于允许函数的递归调用。函数的递归调用是函数嵌套调用的一种特殊形式。【注意】所有能用递归方法解决的问题都可以用非递归方法来实现。采用递归方式的优点:算法简单、容易实现,代码简洁。采用递归方式的缺点:程序的运行效率低。函数递归调用任务四函数递归调用分为直接调用和间接调用:f函数调用f函数f2函数调用f1函数f1函数调用f2函数直接调用本函数间接调用本函数函数递归调用任务四实现递归分为以下两个阶段:(1)递推阶段。将原问题不断分解为新的子问题,不断推进直到已知条件,即递归结束条件。(2)回归阶段。从已知条件除法,按递推的逆过程逐一求值回归,直到递推的开始处结束回归阶段。通用的递归函数体的形式表示如下:if(递归终止条件成立)return递归公式的初值;elsereturn递归函数调用返回的结果值;函数递归调用任务四⑴建立递归关系。利用递归调用解决问题需要两步:⑵找出递归调用的终止条件。利用递归方法:计算:⑴递归关系:n!=n*(n-1)!⑵递归调用的终止条件:n=1或n=0时,n!=1,即:

1!=1,

0!=1。

【步骤】【示例】函数递归调用任务四解题思路:求n!可以用递推方法:即从1开始,乘2,再乘3……一直乘到n。递推法的特点是从一个已知的事实(如1!=1)出发,按一定规律推出下一个事实(如2!=1!*2),再从这个新的已知的事实出发,再向下推出一个新的事实(3!=3*2!)。n!=n*(n-1)!。函数递归调用任务四#include"stdio.h"int

f(int

n){

if(n==1||n==0)

return1;

else

returnn*fac(n-1);}voidmain(){

intn,m;printf("请输入一个非负整数:");scanf("%d",&n);m=f(n);printf("%d!=%d\n",n,m);}以n=5为例说明f(5)=5*f(4)f(1)=1f(4)=4*f(3)f(3)=3*f(2)f(2)=2*f(1)f(2)=2f(3)=6f(4)=24f(5)=120输入:515调

程程

回返函数递归调用任务四自定义函数sum实现自然数求和。intsum(intn){

inti,s=0;

for(i=1;i<=n;i++) s+=i;

returns;}⑴自然数求和是一个等差数列求和。⑵数列求和过程:前n项和等于前n-1项的和加上n,求和过程可描述为:递归关系【分析】函数递归调用任务四intsum(intn){

if(n==1)

return

1;

else

return

sum(n-1)+n;}⑴若n=1,则sum(1)=1,返回1;⑵若n>1,则sum(n)=sum(n-1)+n,返回sum(n-1)+n。函数递归调用这样的函数调用由公式得:重新描述sum函数:函数递归调用任务四调

程自定义函数sum实现自然数求和。#include"stdio.h"int

sum(intn){if(n==1)

return

1;

else

return

sum(n-1)+n;}voidmain(){

int

x;scanf("%d",&x);printf("%d\n",sum(x));}sum(5)=sum(4)+5sum(4)=sum(3)+4sum(3)=sum(2)+3sum(2)=sum(1)+2sum(1)=1sum(2)=3sum(3)=6sum(4)=10sum(5)=15以n=5为例说明程

回返输入:515技能实训1、有5个学生坐在一起:问第5个学生多少岁?他说比第4个学生大2岁问第4个学生岁数,他说比第3个学生大2岁问第3个学生,又说比第2个学生大2岁问第2个学生,说比第1个学生大2岁最后问第1个学生,他说是10岁请问第5个学生多大解题思路:要求第5个年龄,就必须先知道第4个年龄要求第4个年龄必须先知道第3个年龄第3个年龄又取决于第2个年龄第2个年龄取决于第1个年龄每个学生年龄都比其前1个学生的年龄大2练一练技能实训任务二技能实训任务二解题思路:age(5)=age(4)+2age(4)=age(3)+2age(3)=age(2)+2age(2)=age(1)+2age(1)=10age(5)=age(4)+2age(4)=age(3)+2age(3)=age(2)+2age(2)=age(1)+2age(1)=10age(2)=12age(3)=14age(4)=16

回溯阶段

递推阶段age(5)=age(4)+2age(4)=age(3)+2age(3)=age(2)+2age(2)=age(1)+2age(1)=10age(2)=12age(3)=14age(4)=16age(5)=18

回溯阶段

递推阶段结束递归的条件#include<stdio.h>intmain(){intage(intn);printf("NO.5,age:%d\n",age(5));return0;}

intage(intn){intc;if(n==1)c=10;elsec=age(n-1)+2;return(c);}age(5)输出age(5)mainc=age(4)+2age函数n=5c=age(3)+2age函数n=4c=age(1)+2age函数n=2c=age(2)+2age函数n=3c=10age函数n=1age(1)=10age(2)=12age(3)=14age(4)=16age(5)=1818学习总结答一答【问题1】简要说明采用递归方式的优点和缺点?【问题2】简要说明实现递归调用的两个阶段?任务四函数递归调用感谢观看!模块化程序设计C语言程序设计任务驱动式教程特别提示程序宏观框架结构程序的构成程序开发过程程序开发环境目录导学这些函数呢C语言中的变量有作用范围吗??作用域及存储类型任务五函数的作用域是指可使用该函数的程序范围。函数的存储类型有static和extern两种,在函数定义时进行说明。有存储类

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论