C语言程序设计案例教程(三)课件_第1页
C语言程序设计案例教程(三)课件_第2页
C语言程序设计案例教程(三)课件_第3页
C语言程序设计案例教程(三)课件_第4页
C语言程序设计案例教程(三)课件_第5页
已阅读5页,还剩126页未读 继续免费阅读

下载本文档

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

文档简介

1、Date: 04 August 2022C语言程序设计案例教程(三)第1页,共131页。Date: 04 八月 2022第三章结 构 化 程 序 设 计第2页,共131页。授课要点循环的嵌套结构第3页,共131页。问题:打印如下图案123456789123456789123456789123456789123456789112123123412345第4页,共131页。问题解答1#include void main()int i,j;for(i=1;i=5;i+)for(j=1;j=9;j+)printf(%d,j);printf(n);第5页,共131页。问题解答2#include void

2、 main()int i,j;for(i=1;i=5;i+)for(j=1;j=i;j+)printf(%d,j);printf(n);第6页,共131页。问题:打印如下图案* * * * *第7页,共131页。问题解答3#include void main()int i,j;for(i=1;i=5;i+)for(j=1;j=i;j+)printf(“*);printf(n);第8页,共131页。问题解答4#include void main()int i,j;for(i=1;i=5;i+)for(j=1;j=5-i;j+)printf( );for(j=1;j=i;j+)printf(*);

3、printf(n);第9页,共131页。问题:打印如下图案 * * * *第10页,共131页。问题解答5#include void main()int i,j;for(i=1;i=5;i+)for(j=1;j=5-i;j+)printf( );for(j=1;j=2*i-1;j+)printf(*);printf(n);第11页,共131页。模仿练习* * * * * * * * *第12页,共131页。小组讨论并总结循环嵌套的执行过程“控制流程”编码中的常见错误。第13页,共131页。结论1循环嵌套的执行过程执行顺序:1、语句12、判断表达式:如果为假,执行语句5;如果为真执行另一个循环语

4、句块3、执行语句24、判断表达式2:如果为假,执行语句4,转回表达式1;如果为真,循环执行语句3第14页,共131页。结论2“控制流程”中常见错误ifelse不配对switch中表达式类型与case语句的值不匹配 无结束条件,死循环循环次数不清楚误用break和continue第15页,共131页。学以致用寻找你身边的一个实际问题,构造出解决问题的表达式,描述解决问题的算法,以及编写解决问题的程序。例如:假设你在某公司工作,老板要你打印一张表,买主可以用它来购买多个特定部件的费用。单个部件的价格从1元到9元不等。N件东西的费用就是单价与数量相乘得出。因此,你要打印一张像下面这样的数字表: 某公

5、司部件费用明细表 1 2 3 4 5 6 7 8 9 2 4 6 8 10 12 14 16 18 3 6 9 12 15 18 21 24 27 4 8 12 16 20 24 28 32 36 2007年4月7日 第16页,共131页。作业【练习1】将1、2、3、9打印15行。【练习2】打印如下图案: * * * * * * *第17页,共131页。【练习3】打印九九乘法表,如图所示第18页,共131页。Date: 04 八月 2022第三章结 构 化 程 序 设 计第19页,共131页。授课要点循环的嵌套结构嵌套结构的转换第20页,共131页。问题:输入一个数n,求其阶乘分析规律:1!=

6、12!=2*1=2*1!3!=3*2*1 =3*2!4!=4*3*2*1=4*3!n!=n*(n-1)*(n-2)*3*2*1=n*(n-1)!利用循环结构来实现第21页,共131页。编程思路(1)用变量n保存待计算阶乘数的数据,用p保存逐项累乘的结果,初值为1;(2)循环变量i的初值为1;(3)如果i超过n值,循环结束,转(6);(4)每次循环,将变量i与p相乘,结果保留到p中;(5)循环变量i增加1,转回到(3);(6)输出累乘结果p,结束运行。第22页,共131页。流程图及代码int n;/*存储计算阶乘的n值*/scanf(“%d”,&n); /*取得输入值n*/int j; /*循环

7、变量j*/int p; /*累乘结果p*/for(j=1;j=n;j+)p=p*j; /*累乘,结果放到p中*/printf(“%d”,p);/*输入累乘结果*/第23页,共131页。问题:求1!+2!+3!+20!的值分析:1、1-20分别求阶乘(p1,p2,p20),然后求各个阶乘的和。2、两重循环解决问题内重循环:n!123n的实现外重循环:p1+p2+p3+p4+ +p20的实现第24页,共131页。嵌套循环流程图第25页,共131页。循环嵌套双重循环两个while循环嵌套while()while()语句;内重循环外重循环两个for循环嵌套for()for()语句;第26页,共131页

8、。双重循环代码分解/*内重循环代码*/int j; /*循环变量*/p=1;for(j=1;j=i;j+)p*=j;/*外重循环代码*/int i; /*循环变量*/int sum=0;/*求和结果*/for(i=1;i=20;i+)sum=sum+p; /*累加*/printf(“%d”,sum);给出一个个i值得到p值第27页,共131页。双重循环代码块while双重循环int i=1;int sum=0;while(i=20) int j=1; int p=1; while(j=i)p=p*j; /*累乘积*/j+;i=i+1;sum=sum+p;相应的for双重循环int i,j,su

9、m=0;int p=1;for(int i=1; i=20; i+)for(int j=1;j=i;j+)p=p*j;/*累乘积*/sum=sum+p;第28页,共131页。问题扩展在问题中,采用的是两个while和for循环的嵌套。能不能换成两个dowhile循环的嵌套?能不能换成for、dowhile、while的混合型嵌套?第29页,共131页。for循环和dowhile循环互换int i=1;int p=1;while(i=20)int j=1; for(int j=1;j=i;j+) p=p*j; i=i+1; sum=sum+p;int i=p=1;while(i=20)int j

10、=1;dop=p*j;j+;while(j=i);i=i+1;sum=sum+p;第30页,共131页。问题:搬运砖块假设有36块砖,共需36个人搬,男人可搬4块,女人可搬3块,小孩两人搬1块,要求一次全部搬完,问男、女、小孩人数的可能组合。思路:男人的可能值是08;女人的可能值是011;小孩的取值是(36男人女人)。第31页,共131页。问题:求100200之间的全部素数什么是素数?如何判断m是否是素数?思路:让m被2到根号m除,如果m能被其中任何一个整数整除,则m不是素数。第32页,共131页。小组讨论并总结循环主菜单是如何跳出循环的?第33页,共131页。结论3循环主菜单如何跳出循环?v

11、oid main()int input;scanf(“%d”,&input);switch(input)case 1:/*语句*/break;/*跳出循环*/case 2:/*语句*/break; /*跳出循环*/使用break语句第34页,共131页。Date: 04 八月 2022第四章模 块 化 程 序 设 计第35页,共131页。授课要点什么是结构化程序设计函数的定义、声明、调用无参无返回值的函数无参有返回值的函数第36页,共131页。什么是结构化程序设计?自上而下逐步细化的模块化程序设计方法结构化程序设计的好处是什么?复杂问题简单化便于多人协作完成一个大的任务提高程序可维护性、可读性

12、模块复用C语言中如何实现结构化程序设计?模块化在C语言中用函数实现结构化程序设计第37页,共131页。#include #include main() /主函数 int iNo,b;printf(“input a number:n”);/输出函数scanf(“%d”,&iNo); /输入函数b=sqrt(iNo); /求平方根函数printf(“%d”,b); /输出函数初识函数1第38页,共131页。/*从键盘输入3个数,求和并输出。*/#include #include int myAdd(int x,int y,int z)int s;s=x+y+z;return s;main() /主

13、函数int iNo1,iNo2,iNo3,sum;printf(input 3 numbers:n);/输出函数scanf(%d%d%d,&iNo1,&iNo2,&iNo3); /输入函数sum=myAdd(iNo1,iNo2,iNo3); /用户自定义函数printf(sum=%d,sum); /输出函数初识函数2第39页,共131页。函数:一段函数就是一段实现一定功能的代码,就像一台具有某种功能机器。因此函数的调用就类似启动一台机器来完成某个任务。C语言中,函数是实现模块化的工具。什么是函数?第40页,共131页。用函数解决问题输入若干个学生的学号、某门课程的平时成绩和期末成绩,计算出总评

14、成绩。其中, 总评成绩 = 50%*平时成绩50*期末成绩最后,从键盘输入一个学生的学号,查询该生的平时成绩、期末成绩和总评成绩。第41页,共131页。用函数解决的思路定义若干具有不同功能的函数,在main函数中分别调用它们,用以解决这个问题。如:main() /定义必要的变量 inputScore(); /输入学生学号及成绩信息 computeTotalScore();/计算每个学生的总成绩 searchByNo(); /按学号查找某个学生的信息 printSearchInfo();/输出查找到的学生信息main函数只负责解决问题的流程;具体子问题的实现交给不同的函数去处理。第42页,共13

15、1页。函数的定义除了系统提供的函数外,我们都需要对函数进行定义。函数定义的通用形式为: 返回值数据类型 函数名称(参数数据类型 参数1 , 参数数据类型 参数2, ) 函数首部函数体第43页,共131页。函数定义示例(1)无参数无返回值的函数如:定义printStar函数,用以在屏幕上输出5个*符号。void printStar( ) int star; for(star=1; star=5; star+) printf(*); printf(n) ;函数无返回值时使用的数据类型第44页,共131页。 函数的调用无参的调用形式:函数名();第45页,共131页。无参数无返回值的函数的调用#in

16、clude main( ) printStar( );/函数调用void printStar( ) int star; for(star=1; star=5; star+) printf(*); printf(n) ;第46页,共131页。自定义函数的声明在程序的开头加上对应函数的声明,就不会出现函数未定义(或重复定义)的错误。函数声明的形式: 返回值类型 函数名称(参数类型 参数1, ) ; 其中前面的与函数定义时的首部完全一样,但末尾必须加“;”。如对printStar函数的声明为: void printStar( );第47页,共131页。无参数无返回值的函数的声明#include vo

17、id printStar( ); /函数声明main( ) printStar( ); /函数调用void printStar( ) /函数定义(首部) int star; for(star=1; star=5; star+) printf(*); printf(n) ;第48页,共131页。 问题:过年回家,车票难买,到处托人。假如你先把车票钱给帮你买车票的朋友, 那么返回给你的应该是一张车票(当然要顺利的话)。 同理,在C语言中,函数的调用有时候也是有返回值的,那么如何理解?第49页,共131页。分析 对应到函数上,你的朋友就是函数,车票钱是函数输入,车票就是函数的返回值,而你就是调用函数

18、的主程序。 第50页,共131页。 函数的返回值函数的返回值返回语句形式: return(表达式); 或 return 表达式; 或 return;功能:使程序控制从被调用函数返回到调用函数中,同时把返值带给调用函数第51页,共131页。函数定义示例(2)无参数有返回值的函数如定义函数sum_100,用以求1+2+3+100的和,并将结果返回给调用它的函数。 int sum_100( ) int s=0, i; for(i=1; i=100; i+)s=s+i; return s; /用return返回一个值给主调函数 第52页,共131页。无参数有返回值的函数示例 #include int

19、sum_100( ); /函数声明 main( ) int s1; s1 = sum_100( ); /函数调用 printf(和值为:%dn, s1); int sum_100( ) /函数定义(首部) int s=0, i; for(i=1; i=100; i+)s=s+i; return s; /返回值给主调函数 第53页,共131页。模仿练习无参无返回值函数编写:1、自定义函数myPrint1(),在屏幕上输出如下图形(每行10个$符号),并在主函数中调用myPrint1()函数。 $ $ $第54页,共131页。模仿练习无参无返回值函数编写:2、自定义函数myPrint2(),在屏幕

20、上输出如下图形,并在主函数中调用myPrint2()函数。 第55页,共131页。模仿练习无参有返回值函数编写:3、自定义函数myFac(),计算10!,将计算结果返回给调用者。然后在主函数中调用myFac()函数,输出该结果。4、自定义函数myMax(),实现功能:从键盘输入3个数,求最大数并在主函数中调用myMax()函数,输出该结果。第56页,共131页。小组讨论并总结1、为什么使用函数?2、如何理解函数调用与函数定义的不同?3、空函数在程序结构设计中有什么作用?第57页,共131页。学以致用寻找你身边的一个实际问题,编写解决问题的程序,用到函数定义和调用。例、电视是我们日常生活中所熟悉

21、的,我们通过遥控器选择不同的频道,就可以播放相应的频道。请定义一个函数tvPlay( int channel) ,模拟根据遥控器的输入的频道号码,播放相应的频道。然后给出调用的例子,比如,遥控器上选择 5, 则播放CCTV-5体育频道。第58页,共131页。作业每人必做1 、编写一个函数sum(n),计算1+2+n 之和,根据n值的不同,得到不同的值。要求分别计算n50,n80,n100的情况。2、 将自己的“学生成绩管理系统”(循环菜单)以模块化的形式进行处理,具体实施方案:主菜单的显示和选择部分可定义函数menu_select()来调用,“编辑子菜单”可定义editmenu()来调用,“查

22、找”可定义serachmenu()来调用。第59页,共131页。作业小组必做寻找你身边的一个实际问题,构造出解决问题的表达式,描述解决问题的算法,以及编写解决问题的程序。例如,MP3可以播放不同的歌曲,请编写一个MP3模拟函数,根据输入不同的歌曲代号,可以显示相应的歌曲名。然后,调用该函数。第60页,共131页。Date: 04 八月 2022第四章模 块 化 程 序 设 计第61页,共131页。授课要点有参无返回值的函数有参有返回值的函数第62页,共131页。函数定义示例(3)有参数无返回值的函数如定义printStar_n()函数,用以在屏幕的一行上输出n个*号。其中n的值是由调用该函数的

23、函数传递过来的。 void printStar_n( int n) int star; for(star=1; star=n; star+)printf(*); printf(n); 函数参数(称为形参)第63页,共131页。 函数调用有参函数的调用形式:函数名(实参);实参与形参:个数相等类型一致按顺序一一对应第64页,共131页。有参数无返回值的函数调用 #include void printStar2(int n); /函数声明 main( ) int starNum; scanf(%d, &starNum); printStar_n(starNum); /函数调用 void print

24、Star_n( int n) /函数定义(首部) int star; for(star=1; star=n; star+)printf(*); printf(n); 函数参数(称为形参)调用时传递的参数(称为实参)第65页,共131页。函数定义示例(4)有参数有返回值的函数如定义函数sum_n(),用以求1+2+3+n的和,并将结果返回给调用它的函数。 int sum_n( int n ) int s=0, i; for(i=1; i=n; i+)s=s+i;return s; /通过return返回一个值 函数参数(称为形参)第66页,共131页。 #include int sum_n( i

25、nt n ); /函数声明 main( ) int s1, n; scanf(%d, &n); s1 = sum_n( n ); /函数调用 printf(和值为:%dn, s1); int sum_n( n ) /函数定义 (首部) int s=0, i; for(i=1; i=n; i+) s=s+i; return s; /返回一个值给主调函数 有参数有返回值的函数调用第67页,共131页。 函数的调用1、语句调用方式2、函数表达式3、函数参数 第68页,共131页。 函数的调用调用方式语句调用: 例 printmsg(); printf(“打印成功!n”);函数表达式调用: 例 res

26、ult=aver(totalscore, stuno);函数参数调用: 例 printf(“%f”,aver(totalscore, stuno); 第69页,共131页。随堂实践有参无返回值函数编写:1、自定义函数myprint_n(),在屏幕的一行上输出n个$符号。在主函数中调用myprint_n()函数,输出如下图形(每行上的符号个数由调用它的函数传递过来) 。函数首部为:void myprint_n( int n) $(5个$) $(10个) $(15个) $(20个)2、修改以上程序,实现以下功能:打印个数由用户输入决定,支持用户循环输入,当用户输入0时结束程序。第70页,共131页

27、。有参有返回值函数编写:3、自定义函数myfac_n(),求n!,并在主函数中调用myfac_n()函数,输出结果。 函数首部为: int myfac_n( int n)4、自定义函数mypower(),求x的y次幂,并在主函数中调用mypower()函数,输出结果。 函数首部为:double mypower( double x, int y)5、自定义函数circleArea(),用于计算圆的面积,其中半径作为参数传入。然后在主函数中调用它,并输出结果。函数首部为: double circleArea(double radius) 随堂实践第71页,共131页。小组讨论并总结1、函数的功能应

28、该尽量保持相对独立还是依赖 函数外的数据为好 ?2、怎样使一个函数具有更大的通用性? 3、函数参数的值传递有哪些特点?第72页,共131页。学以致用寻找你身边的一个实际问题,编写解决问题的程序,要求用到函数调用、参数传递。例如:踢足球的时候,裁判要求换人,比如要用8号换下18号,请用函数模拟换人,并在主函数中调用。 第73页,共131页。作业每人必做 将“控制流程”阶段完成的“小型计算器”功能改写为函数,并在主函数中调用,注意参数的类型定义及传参过程。第74页,共131页。Date: 04 八月 2022第四章模 块 化 程 序 设 计第75页,共131页。授课要点复习,评讲模拟练习参数的值传

29、递实训第76页,共131页。函数的值传递方式#include void main() void swap(int a,int b); /*swap函数的声明*/ int x=7,y=11; printf(x=%d,ty=%dn,x,y); printf(swapped:n); swap(x,y); /*调用swap函数*/ printf(x=%d,ty=%dn,x,y);void swap(int a,int b) /*定义swap函数*/ int temp; temp=a; a=b; b=temp; 输出结果:x=7, y=11 swapped: x=7, y=11第77页,共131页。 结

30、论:值传递方式方式:函数调用时,为形参分配单元,并将实参的值复制到形参中;调用结束,形参单元被释放,实参单元仍保留并维持原值特点:形参与实参占用不同的内存单元单向传递第78页,共131页。 结论:函数参数的传递方式还有另一种-地址传递方式其传递的参数为地址而不是值,具体内容将在数组章节中学习.第79页,共131页。Date: 04 八月 2022第四章模 块 化 程 序 设 计第80页,共131页。授课要点作业评讲变量的存储类别第81页,共131页。问题#include void prt();main() int x; for(x=1; x=5; x+)prt();void prt()stat

31、ic int y=0; y+;printf(%d, y);输出结果:12345去掉static后的结果为多少?第82页,共131页。问题分析动态存储变量和静态存储变量动态变量:用auto关键字表示如auto int p, f; /p,f为两个动态变量在C中,默认的变量定义就是定义为动态变量即上述的p,f变量定义与 int p, f; 是完全等价的。静态变量:在程序生存期内一直有效。注意,如果静态变量出现在函数中,不会因为函数的调用结束而丢失这个变量的值第83页,共131页。变量的生存期int a,b,c; /外部变量定义main() int x, y; /内部变量 float f; /内部变量

32、 /其他语句int sum(int n) int s=0, i; /内部变量 /语句x, y, f的有效区域s,i的有效区域a, b, c的有效区域内部变量与外部变量的作用区域是不一样的。第84页,共131页。1变量的存储类型 计算机的存储器分为内存和外存。还有一个小小的临时存储器称为寄存器,用以存储一些反复被加工的数据。C语言允许程序员区分是在主存还是在寄存器中开辟变量的存储空间。2变量的生存期(1)在编译时分配存储单元。这种变量的生存期为程序执行的整个过程,在该过程中占有固定的存储空间,称为永久存储。(2)只在程序执行的某一段时间内存在。比如在函数的执行过程中存在。这种存储方式称为动态存储

33、。小结第85页,共131页。小结3变量的可用域 变量的可用域也分为全局可用和局部可用。 C语言中,用“存储属性”来表示以上三个方面的属性,如表所示。名称寄存器变量自动变量静态变量外部变量存储属性registerautostaticextern存储位置寄存器主存生存期动态生存期永久生存 期作用域局部局部或全局全局第86页,共131页。模仿练习1、写出以下程序的运行结果:int fun(int a)/*a为形参,自动型局部变量*/ auto int b=0;/*b是自动型局部变量*/ static int c=3; /*c是静态型局部变量,初始化仅进行一次*/ b+=1; c=c+1; retur

34、n a+b+c;main() int a=2,i; /*a和i都是自动型局部变量*/ for(i=0;i3;i+) printf(%dt,fun(a);第87页,共131页。模仿练习2、写出以下程序的运行结果:int sum(int n); /函数声明int a=4,b=5,c=6; /外部变量定义main() int x=1, y=2; float f=3.0; x=sum(10); printf(x=%d,y=%d,f=%fn, x, y, f); printf(a=%d,b=%d,c=%dn, a, b, c); /printf(s=%d, i=%dn, s, i);int sum(in

35、t n) int s=0, i; for(i=1; i=n; i+) s = s+i; printf(s=%d, i=%dn, s, i); printf(a=%d,b=%d,c=%dn, a, b, c); /printf(x=%d,y=%d,f=%fn, x, y, f); return s;第88页,共131页。Date: 04 八月 2022第四章模 块 化 程 序 设 计第89页,共131页。授课要点函数的嵌套调用函数的递归调用第90页,共131页。函数的嵌套调用f1() f2(); f2() f3(); f3() 第91页,共131页。函数的嵌套调用举例1main() int a=

36、3,b=5,s; s=cal(a,b); printf(“%d”,s);int cal(int x,int y) int result,s1,s2; s1=powl(x,y); s2=pow(y,x); result=s1+s2; return result;int pow(int m,int n) int i,res=1; for(i=0;in;i+) res *=m; return res;求 3 5 。53第92页,共131页。函数的嵌套调用举例2 自定义函数mymax2(),求出2个参数的最大值,然后定义函数 mymax3(),调用mymax2()求出3个参数中的最大值,将值返回给主函

37、数,输出该结果。函数首部为: float mymax3(float x, float y, float z) 第93页,共131页。模仿练习1、自定义函数mymax (),求出3个参数的最大值; 自定义函数 mymin(),求出3个参数的最小值; 自定义函数mysub(),调用mymax()和mymin()求出3个参数的最大值与最小值的差; 在主函数中调用mysub(),输出结果。函数首部为: float mymax (float x, float y,float z) float mymin(float x,float y,float z) float mysub (float x,floa

38、t y,float z)2、计算s=1k+2k+3k+N k函数首部为:long f1(int n,int k)/*计算n的k次方*/ long f2(int n,int k)/*计算1到n的k次方之累加和*/ 第94页,共131页。案例解答#define K 4#define N 5long f1(int n,int k)/*计算n的k次方*/ long power=n; int i; for(i=1;ik;i+) power *= n; return power;long f2(int n,int k)/*计算1到n的k次方之累加和*/ long sum=0; int i; for(i=1

39、;i=n;i+) sum += f1(i, k); return sum;main() printf(Sum of %d powers of integers from 1 to %ld = ,K,N); printf(%dn,f2(N,K);第95页,共131页。函数的递归调用C语言的函数调用允许直接或间接地调用该函数本身,称为函数的递归调用。含有直接或间接调用自己的函数称为递归函数。函数f调用函数f函数f1调用函数f2调用函数f1函数f2直接调用本身间接调用本身第96页,共131页。函数的递归调用举例用递归函数求4!4! = 4*3! ;3! = 3*2! ;2! = 2*1! ;1! =

40、 1 ;n! = n*(n-1)! 1! = 1第97页,共131页。函数的递归调用举例例:用递归函数求n! n! = n * (n-1)! int myFac( int n) if (n=1) return 1; /递归的结束条件 return n*myFac(n-1); myFac(n)就是求n!myFac(n-1)就是求(n-1)!第98页,共131页。函数的递归调用举例fac(3)*4fac(2)*3fac(1)*2reutrn(1)reutrn(1*2)reutrn(2*3)return(6*4)调用过程返回过程fac(4)reutrn(24)用递归函数求4!第99页,共131页。函

41、数的递归调用举例例:用递归函数求n!的完整程序#include int myFac(int n);main() int f, n;scanf(%d, &n);f = myFac(n);printf(%d!=%dn, n, f);int myFac( int n) int s; if (n=1) s= 1; /递归的结束条件 else s= n*myFac(n-1); return s;单步调试,理解递归程序的执行流程第100页,共131页。函数的递归调用举例递归算法的组成:递归终止条件:当满足一定条件时,递归调用必须可以结束,否则会无限地递归调用而导致程序无法结束。例如n!中当n=1时,令结果

42、为1则可以结束递归调用,否则它将继续调用(0)!而无限继续下去。对于由多个通项表示的情况,则需要给出最后一个递归调用的所有项的值。如an = an-1 + an-2 ,要给出n=1时的结果以及n=2时结果才可以结束递归调用。递归表达式,如fac(n)=n*fac(n-1)第101页,共131页。函数的递归调用举例求下数列的第20项的值。1,2,3,5,8,13,21,34a1=1;a2=2;a3=a1+a2;an=an-1 + an-2; 第102页,共131页。函数的递归调用举例求下数列的第20项的值。1,2,3,5,8,13,21,34f(1)=1;f(2)=2;f(n)=f(n-1)+f

43、(n-2); 第103页,共131页。函数的递归调用举例main() int a; a=f(20); printf(“%d”,a); int f(int n) int s; if(n=1) s= 1; else if(n=2) s= 2; else s= f(n-1)+f(n-2); return s; 第104页,共131页。模仿练习递归函数的编写:1、 用递归方法编写函数求n!。 函数定义如下: int recFac(int n)2、用递归函数的方法编写函数求 斐波纳契(Fibonacci)数列的第20项的值。函数定义如下: int Fib (int n) 其中n为该数列中的第n项。 1,

44、1,2,3,5,8,13第105页,共131页。模仿练习递归函数的编写:3、用递归算法,计算:1 2 3 n 2222第106页,共131页。Date: 04 八月 2022第四章模 块 化 程 序 设 计第107页,共131页。授课要点数组的概念一维数组的定义和引用一维数组的初始化和赋值数组元素的遍历第108页,共131页。这样做好吗?如果题目改为10个数、100个数该怎么做?问题1:从键盘输入5个整数,逆序输出这5个数。main()int a0,a1,a2,a3,a4;scanf(“%d”,&a0); scanf(“%d”,&a1);scanf(“%d”,&a2);scanf(“%d”,&

45、a3);scanf(“%d”,&a4);printf(“%dn”,a4);printf(“%dn”,a3);printf(“%dn”,a2);printf(“%dn”,a1);printf(“%dn”,a0);第109页,共131页。在“学生成绩管理系统”中,我们需要对多个学生进行处理,比如100个学生,是否必须定义100个变量呢?Student stu1;Student stu2;Student stu3;Student stu100;定义多个变量,在定义、输入、输出、处理的时候非常不方便。如果需要处理5000个学生的成绩,情况就更糟。问题2第110页,共131页。以上两个例子有什么共同之处

46、?问题2具有相同的数据类型!第111页,共131页。数组的概念 数组是一组变量,满足下列条件:(1)具有相同的名字(2)具有相同的数据类型(3)在存储器中连续存放每个变量名字相同下标不同,称为“数组元素”“数组名”代表整个数组,其值是这组变量在内存中所占连续存储空间的首地址。数组要先定义后使用。数组名不能与相同作用域的其他变量名重名第112页,共131页。问题如何定义数组?如何为数组元素赋值?如何引用数组元素?第113页,共131页。一维数组的定义一维数组:只有一个下标的数组定义形式为:类型说明符 数组名常量表达式例如:int a10;说明数组名为a数组中每个元素的数据类型为int类型10个数

47、组元素 内是常量表达式,不能为变量第114页,共131页。1、定义100个整型变量2、定义50个浮点型变量3、定义1000个“学生”变量,“学生”类型定义如下:typedef structchar acNum10;char acName15;Student;模仿练习第115页,共131页。以下一维数组的定义是否正确?int a ;#define SIZE 100float bSIZE;int n=10;char cn;int 2a10;错误,没有指明数组的大小int a10;正确 ,SIZE是常量,相当于 float b100;错误,数组的大小不能是变量,应为 int a10;错误,数组名2a

48、 不符合标识符的命名规则第116页,共131页。数组元素的引用数组就是一组变量的集合,每个数组元素相当于是一个变量数组元素的表示: 数组名下标如:int a5;所定义的数组就是五个变量的集合,分别是: a0, a1,a2, a3, a4int aN; 下标的取值范围:0N-1 ,其中N为数组的大小下标是整型值,可以是整型常量、整型变量或整型表达式 如:ai a3+1 a2*i-1注意:下标不能越界,否则可能覆盖其他数据,造成严重后果第117页,共131页。定义数组之后,与普通变量一样,数组是沒有初始值的,各存储单元的值都是不定的。初始化:定义数组的同时赋初值语法: 数据类型说明符 数组名长度=

49、数值1,数值2,; 如 : int data10=0,1,2,3,4,5,6,7,8,9;一维数组的初始化第118页,共131页。1、定义并初始化一个float型数组,包含5个元素。2、定义并初始化一个字符型数组,包含6个元素。3、定义一个全0的整形数组,包含15个元素。模仿练习第119页,共131页。初始化注意事项:(1) 允许初始化一部分元素,其他没有赋初值的元素初值为0; int a10=0,1,2,3,4,5; 相当于 int a10=0,1,2,3,4,5,0,0,0,0;(2)允许初始化时省略数组的长度,数组的长度为赋初值的个数; int a=1,2,3,4,5; 相当于 int a5=1,2,3,4,5; (3)不能对整个数

温馨提示

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

评论

0/150

提交评论