《c语言大学教材循环结构程序设计.ppt》由会员分享,可在线阅读,更多相关《c语言大学教材循环结构程序设计.ppt(42页珍藏版)》请在课桌文档上搜索。
1、,第5章循环结构程序设计,本章教学内容,引例for循环while循环do-while循环break语句和continue语句循环语句的嵌套*用循环实现通讯录实例的部分功能,教学目标、重点和难点,教学目标了解三种循环形式的异同和应用场合掌握用循环实现常见问题的求解熟悉break、continue语句在循环中的作用掌握循环的嵌套(2层)进一步熟悉单步执行、断点跟踪等程序调试方法教学重点For、while、do-while循环的使用;涉及循环的常用算法教学难点循环的嵌套;经典算法,引例1,输出一行10个星号“*”语句是?,printf(“*n”);,输出两行10个星号“*”语句是?,输出100行10
2、个星号“*”语句是?,重复语句,for(i=1;i=100;i+)printf(“*”);,用循环结构解决,引例2:从键盘依次输入若干个圆的半径值,分别输出对应的圆面积。,#include#define PI 3.1416main()float r,area;scanf(“%f”,重复语句,如果对不定个数的多个圆求其面积该如何处理?,scanf(“%f”,用循环结构解决,C 语言中的各种循环,while,do-while,for,需要多次重复执行一个或多个任务的问题考虑使用循环来解决,for(表达式1;表达式2;表达式3)循环体;,for 循环的一般语法:,1、for 循环,counter=0
3、;inum=100;i=1;,counter=10;inum 25;i=100,counter+;inum=inum+1;i+;,分号用于分隔 for 循环的三个表达式,1、计算表达式1的值,通常为循环变量赋初值;2、计算表达式2的值,即判断循环条件是否为真,若值为真则执行循环体一次,否则跳出循环;3、计算表达式3的值,这里通常写更新循环变量的赋值表达式,然后转回第2步重复执行;,工作原理,1,2,3,4,P120,表达式2,处理表达式1,执行循环体,非0,0,处理表达式3,流程示意,for(i=1;i=100;i+),sum=sum+2;,sum=sum+1;,sum=0;,不确定,sum,
4、0,1,3,sum=sum+3;,6,sum=sum+100;,5050,sum=sum+i;,规律是:,表示为:,是for语句!,计算并输出1+2+3+100的值sum,P120,#include main()int i=0,sum=0;for(i=1;i=100;i+)sum=sum+i;printf(1+2+3+.+100=%dn,sum);,运行结果:1+2+3+.+100=5050,循环体,完整代码:,求任意输入的一个整数n的阶乘 n!,#include void main()int n,i,fac=1;printf(n 请输入任意一个正整数:);scanf(%d,请输入任意一个正整
5、数:5,5,1,1,2,120,6,循环执行五次,5的阶乘=120,注意阶乘变量fac的值的溢出问题,键盘输入10个学生的成绩,输出各成绩及平均成绩。,哪些语句重复执行,执行多少次循环体,输入10个,重复10次,P114,printf(n);ave=(float)sum/10;printf(ave=%fn,ave);,用复合语句,for(i=1;i=10;i+)scanf(%d,循环体是3条语句,main()int i,score,sum=0;float ave=0;printf(Input score:n);,不必放在循环体内,#include main()int a=0,max=0,i=0
6、;printf(nmax=%dn,max);,scanf(%d,printf(Input data:);,输入第一个数并输出,max=a;,第一个数存入max,输入后九个数并输出,for(i=1;i=9;i+)scanf(%d,if(maxa),max=a;,思考:100个数中求最大,如何修改?,例题 从键盘输入10个数,求其中最大值,for(i=1;i=100;i+)sum=sum+(float)1/i;,先思考:如何求,求,再思考:如何解决正负相间的问题,for(i=1;i=100;i+)sum=sum+(float)1/i;,sign=1;,sign=-sign;,sign,sign=1
7、,sum=sum+1/1,i=1,sign=-1,sum=sum-1/2,i=2,sign=1,sum=sum+1/3,i=3,符号翻转,完整程序,for(i=1;i=100;i+)sum=sum+(float)sign/i;sign=-sign;,printf(sum=%fn,sum);,#include main()int i=0,sign=1;float sum=0.0;,关于for 循环的几点说明:,for循环用于循环次数已知或循环次数确定的情况(否则通常常用while 或do-while循环结构)for 循环中有三个表达式for 语句中的各个表达式都可以省略(不提倡!)分号分隔符不能
8、省略,for(;);,可省略,不能省略,2、while 循环,while(表达式)循环体;,while 循环的一般语法:,while(index 100).index+;,计算表达式的值,当值为真(非0)时,执行循环体语句,一旦条件为假,就停止执行循环体。如果条件在开始时就为假,那么不执行循环体语句直接退出循环。,工作原理,示例,表达式,循环体,非0,0,P97,流程示意,#include main()int a,sum=0;printf(Input data:n);scanf(%d,进入循环前先输入一个数,当a为非0时,执行循环体,while,关键字,循环体内再输入一个数,从键盘输入若干个非
9、0数据,求它们的和,用0结束循环的执行。,P97,用while循环求 1+2+3+100,#include main()int,sum=0;printf(sum=%dn,sum);,while(i=100)sum=sum+i;,i=1,i+;,不同循环语句之间可以相互转换,while(i=100)sum=sum+i;,i+;,P99,关于while 循环 的几点说明:,规则1:,while(循环条件),循环条件中使用的变量需要经过初始化,规则2:,while(index 100).index+;,while 循环主体中的语句必须修改循环条件的值,否则会形成死循环,while(1),3、do-w
10、hile 循环,do 语句;while(表达式);,while 循环的一般语法:,do.scanf(“%c”,先执行循环体中的语句,然后再判断条件是否为真,如果为真则继续循环;如果为假,则终止循环。,工作原理,示例,流程示意,非0,表达式,循环体,0,P100,问题描述:猜数游戏。要求猜一个介于110之间的数字,根据用户猜测的数与标准值进行对比,并给出提示,以便下次猜测能接近标准值,直到猜中为止。,用do-while 循环实现猜数,int number=5,guess;printf(猜一个介于 1 与 10 之间的数n);do printf(请输入您猜测的数:);scanf(%d,猜一个介于
11、1 与 10 之间的数请输入您猜测的数:3太小请输入您猜测的数:5您猜中了!答案为 5,输入数字 5 后,dowhile 循环中的条件为假,输出结果消息后,程序终止。,4、break 语句 和continue语句,break语句:可以用在循环体内,也可以用在switch结构中,用于改变程序的控制流break语句用于do-while、while、for循环中时,可使程序终止循环而执行循环外面的语句 break语句通常在循环中与条件语句一起使用。若条件值为真,将跳出循环,控制流转向循环后面的语句如果已执行break语句,就不会执行循环体中位于 break 语句后的语句在多层循环中,一个break语
12、句只向外跳一层,P103,break 语句示例,跳出 for 循环for(;)printf(这将一直进行下去);i=getchar();if(i=X|i=x)break;,跳出 while 循环while(1)if(x=10)break;,跳出 do-while 循环do if(x=10)break;while(x 15);,问题描述:统计从键盘输入的若干个字符中有效字符的个数,以换行符作为输入结束。有效字符是指第一个空格符前面的字符,若输入字符中没有空格符,则有效字符为除了换行符之外的所有字符。,#includevoid main()int count=0,ch;printf(n 请输入一行
13、字符:);while(ch=getchar()!=n)if(ch=)break;count+;printf(n 共有%d 个有效字符。n,count);,break 语句应用举例,H,0,_,请输入一行字符:Hello world,共有 5 个 有效字符,1,循环执行 5 次,5,continue 语句continue 语句只能用在循环里continue 语句的作用是跳过循环体中剩余的语句而执行下一次循环对于while和do-while循环,continue 语句执行之后的动作是条件判断;对于for循环,随后的动作是变量更新,问题描述:统计从键盘输入的若干个字符中有效字符的个数,以换行符作为输
14、入结束。有效字符是指第一个空格符前面的字符,若输入字符中没有空格符,则有效字符为除了换行符之外的所有字符。,#includevoid main()int count=0,ch;printf(n 请输入一行字符:);while(ch=getchar()!=n)if(ch=)continue;count+;printf(n 共有%d 个有效字符。n,count);,continue 语句应用举例,H,0,_,请输入一行字符:Hello world,共有 10个 有效字符,1,循环执行11 次,10,break与continue 语句的比较,while()continue;,while()break
15、;,跳出整个循环,继续下一次循环,5、循环语句的嵌套,while(i=10).while(i=j).,外循环,内循环,只有在内循环完全结束,外循环才会进行下一趟。,在一个循环体内又包含另一个循环。称为嵌套循环。for while do-while 可以互相嵌套 嵌套 while 循环的语法,P105,问题描述:用“*”打印一个直角三角形图案。图案如下所示:*,嵌套 while 循环示例,void main()int nstars=1,stars;while(nstars=10)stars=1;while(stars=nstars)printf(*);stars+;printf(n);nstar
16、s+;,内层循环控制每行打印*号的个数,外层循环控制打印的行数,输出:*,嵌套 do-while 循环的语法,do.do.while(.).while(.),外循环,内循环,只有在内循环完全结束后,外循环才会进行下一趟。,嵌套 for 循环的语法,for(.).for(.).,外循环,内循环,只有在内循环完全结束后,外循环才会进行下一趟。,问题描述:用“*”输出一个菱形图案,图案如下:*,for嵌套循环示例,void main()int i,j,k;for(i=1;i=4;i+)for(j=1;j=4-i;j+)printf();for(k=1;k=2*i-1;k+)printf(*);pri
17、ntf(n);for(i=1;i=3;i+)for(j=1;j=i;j+)printf();for(k=1;k=7-2*i;k+)printf(*);printf(n);,输出:*,*,控制打印的行数,控制每行打印的空格数,控制每行打印的*号数,控制打印的行数,控制每行打印的空格数,控制每行打印的*号数,问题描述:输出所有两位素数,要求一行输出15个素数。编程点拨:当a=10,11,99时,逐个判断是不是素数,因此需要再套一个循环。,for嵌套循环示例,#include main()int i,a,end,n;,end=sqrt(a);for(i=2;iend)/如果是素数 printf(%4
18、d,a);n+;if(n%15=0)printf(n);,for(a=10;a=99;a+),能改成for(a=11;a=99;a=a+2)?,判断a是否素数,a在1099时,P106,循环结构综合举例,规律:前两项的值各为1,从第3项起,每一项都是前两项的和。要求:一行输 出6项,例5.8 输出斐波纳契(Fibonacci)数列前30项,1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 10946 17711 28657 4636875025 121393 196418 317811 514229 83204
19、0,P133,求解过程,+,a,b,next 第5项,+,next 第3项,a,b,next 第4项,a,b,next 第6项,+,2,8,1,2,3,2,3,5,3,5,main()int i,n;long a,b,next;,a=b=1;printf(%10ld%10ld,a,b);n=2;,处理前两项,for(i=3;i=30;i+)next=a+b;a=b;b=next;,处理后28项,printf(%10ld,next);n+;if(n%6=0)printf(n);,输出并控制换行,如何输出级数1、1、1、3、5、9、17、的前20项?,通讯录实例(操作演示),实例3 编写在实例1的
20、主菜单中重复选择选项的程序 shili_3.c,小 结,循环结构是在给定条件成立时,重复执行某程序段有for、while和do while三种形式;for 循环主要用于循环次数已知或确定的情况,属于先判断后执行;while和do-while循环通常用于循环次数不确定的情况;while循环先判断后执行,循环体可能一次都不执行;do while循环先执行后判断,循环体将至少执行一次需要修改循环变量的值以改变循环条件,否则有可能形成死循环循环嵌套必须将内层循环完整的包含在外层循环中break 语句用在循环中时,可以直接终止循环,将控制转向循环后面的语句continue 语句的作用是跳过循环体中剩余的语句而执行下一次循环,