《c语言程序设计 第5章_循环结构.ppt》由会员分享,可在线阅读,更多相关《c语言程序设计 第5章_循环结构.ppt(73页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、C语言程序设计教程语言程序设计教程(第(第2版)版)第第5 5章章 循环结构循环结构 第5章 循环结构本章主要内容1.for循环语句结构2.while循环语句结构3.do-while循环结构4.break和continue语句的作用5.循环结构的嵌套6.案例分析循环循环就是重复地执行某些语句。程序中的循环次数是有限的,循环次数是有限的,由循环条件决定可以确定循环次数。C语言提供了3种循环结构语句:for语句while语句do_while语句ufor语句是一种计数循环。循环次数由循环变量来语句是一种计数循环。循环次数由循环变量来控制。控制。for语句的一般形式:语句的一般形式:for(表达式表达
2、式1;表达式表达式2;表达式表达式3)循环体语句循环体语句u执行流程:执行流程:表达式表达式2循环体循环体假假(0)真真(非非0)for表达式表达式1表达式表达式35.1 for语句1.1.先求解表达式先求解表达式1 1;2.2.求解表达式求解表达式2 2,若其,若其值为真值为真(非非0)0),则执,则执行循环体的内容,行循环体的内容,然后执行第然后执行第3 3步。若步。若为假为假(0)(0),则结束循,则结束循环,执行环,执行forfor语句下语句下面一条语句。面一条语句。3.3.若表达式为真,执若表达式为真,执行指定的语句后,行指定的语句后,求解表达式求解表达式3 3。4.4.返回第返回第
3、2 2步执行。步执行。此此处处无无;for语句的常用形式为:for(;)for语句的3个重要的组成部分:1初始表达式初始化循环控制变量。2条件表达式测试循环条件。3循环表达式更新循环控制变量的值。for语句的语法功能:1计算的值。该表达式是对循环控制变量进行初始化。2判断的值。该表达式就是循环条件,若该表达式的值为“假”,则退出循环,执行循环结构外的语句;若该表达式的值为“真”,则执行。3计算的值。该表达式更新循环控制变量的值。4转第2步。for语句的流程图:注意:若中有多条语句,则构成复合语句,被包含在一对花括号中。若只有一条,可以不使用花括号。例例1:编写程序,求几何级数 之和:分析:分析
4、:该数学表达式为求123100之和。设:sum为级数的和(初值为零);i为循环变量;将i从1按步长为1增加到100,循环计算:sum=sum+i;求得该级数的和。main()int i,sum;sum=0;for(i=1;i=100;i+)sum+=i;printf(“1+2+100=%d,sum);for语句所具有的特性:语句所具有的特性:1可以省略,但须保留分号(;),同时在for之前必须给循环控制变量赋值,形式为:;for(;)2一般不可省略,否则为无限循环。例如:for(i=1;i+)sum=sum+i;相当于条件总为真,程序会一直不停地执行直到“数据溢出”。例:例:main()int
5、 i=0;for(;i10;i+)putchar(a+i);#include main()char c;for(;(c=getchar()!=n;)printf(%cn,c);例:例:main()int i,sum=0;for(i=1;i+)sum=sum+i;printf(“sum=%dn”,sum);此循环构成了一个死此循环构成了一个死循环循环,即一直累加下即一直累加下去直至越界出错去直至越界出错.解决的方法是解决的方法是解决的方法是解决的方法是:在循环体内增加在循环体内增加在循环体内增加在循环体内增加一个一个一个一个breakbreak语句语句语句语句(待后介绍待后介绍待后介绍待后介绍)
6、.).3亦可省略,但在循环语句体中必须有语句来修改循环变量,以使条件表达式的值在某一时刻为假,使程序能正常结束循环。例如:for(sum=0,i=1;i=100;)sum=sum+i;i+;43个表达式均省略,即for(;),为无限循环,程序中要尽量避免避免这种情况的发生。例:例:main()int i,sum=0;for(i=1;i=100;)sum+=i;i+;printf(%d,sum);此时由于省略表达式此时由于省略表达式此时由于省略表达式此时由于省略表达式3 3,循,循,循,循环变量没有增值,循环易环变量没有增值,循环易环变量没有增值,循环易环变量没有增值,循环易出现死循环。出现死循
7、环。出现死循环。出现死循环。解决的方法是在循环体内加解决的方法是在循环体内加解决的方法是在循环体内加解决的方法是在循环体内加一条使得循环变量增值的一条使得循环变量增值的一条使得循环变量增值的一条使得循环变量增值的语句(如本例中的语句(如本例中的语句(如本例中的语句(如本例中的“i+”)i+”)例:例:main()int i,sum=0;i=1;for(;i100)break;printf(%d,sum);三个表达式均省略,此时的执行过三个表达式均省略,此时的执行过程是不设初值,不判断条件(将表程是不设初值,不判断条件(将表达达2的值看成的值看成“真真”。5条件表达式可以是关系表达式、数值表达式
8、。只要表达式的值不等于零,就执行循环体语句。如:for(i=0;(c=getchar()!=n;i+=c);6初始表达式、循环表达式可以是逗号表达式,用来完成逗号表达式中各表达式的功能。例如:for(sum=0,i=1;i=100;i+,i+)相当于:sum=0;for(i=1;i=100;i=i+2)7for循环也可以嵌套,执行时是先执行最里层的循环,再执行其外一层的循环。8.for语句中语句中表达式表达式1可以是用来设置循环变量初可以是用来设置循环变量初值的赋值表达式值的赋值表达式,也可以是与循环变量无关的也可以是与循环变量无关的其它表达式。如其它表达式。如:注意以上两者在用法上的区别注意
9、以上两者在用法上的区别注意以上两者在用法上的区别注意以上两者在用法上的区别main()int i,sum=0;for(i=1;i=100;i+)sum+=i;printf(%d,sum);main()int i=1,sum;for(sum=0;i=100;i+)sum+=i;printf(%d,sum);9.表达式表达式1、表达式、表达式3可以是一个简单的表达可以是一个简单的表达式式,也可以是逗号表达式也可以是逗号表达式.main()int i,j,k;for(i=0,j=5;i=j;i+,j-)k=i+j;printf(%d+%d=%dn,i,j,k);表达表达式式 1、3为为逗号逗号表达表
10、达式式执行过程执行过程:第一次循环第一次循环:i=0,j=5k=5,:i=0,j=5k=5,输出输出:0+5=5:0+5=5第二次循环第二次循环:i=1,j=4k=5,:i=1,j=4k=5,输出输出:1+4=5:1+4=5第三次循环第三次循环:i=2,j=3k=5,:i=2,j=3k=5,输出输出:2+3=5:2+3=5第四次循环第四次循环:i=3,j=2 :i=3,j=2 条件不满足退出循环条件不满足退出循环10.10.表达式表达式表达式表达式2 2一般是关系表达式或逻辑表达式一般是关系表达式或逻辑表达式一般是关系表达式或逻辑表达式一般是关系表达式或逻辑表达式,但也可但也可但也可但也可以是
11、数值表达式或字符表达式以是数值表达式或字符表达式以是数值表达式或字符表达式以是数值表达式或字符表达式,只要其值为非零只要其值为非零只要其值为非零只要其值为非零,就就就就执行循环体执行循环体执行循环体执行循环体.#include main()char c;for(;(c=getchar()!=n;)printf(%cn,c);执行过程执行过程:从键盘输入一个字符赋给变量从键盘输入一个字符赋给变量c,然后判然后判断输入的字符是否为断输入的字符是否为n,如果不是就执如果不是就执行循环体行循环体.程序功能程序功能:不断输入字符并将其输出不断输入字符并将其输出,直到输入一直到输入一个回车换行符个回车换行
12、符(n)为止为止.forfor语句中语句中语句中语句中 的循环体省略的情形的循环体省略的情形的循环体省略的情形的循环体省略的情形例例:#include main()int i;for(i=0;i0,b0;如果ab,或者输入的值为负数,则程序提示输入错误,不进行任何计算,直接退出程序。程序流程图如右:思考:思考:该算法的缺点;设计更好的算法。假如输入的数可以为任意整数,如果ab,计算 ;如果ab,则计算 。请设计算法并编写程序验证。例例3 3:编写一个可以为小学生提供加法、减法和乘法的二元算术运算练习的程序,计算100以内的两个数的和、两个数的差和两个数得的积,每次测试10个题目,依次由学生输入
13、答案,并由计算机判断输入的答案是否正确,最后由计算机给出简单评价。分析:分析:根据题意,组成算术表达式的操作符有3种形式:+、*,分别用1、2、3来代表。用ops表示操作符,a,b分别代表两个操作数;a,b和ops由计算机随机生成,并计算表达式的值result;用户输入表达式的结果input;将input与result进行比较;通过比较的结果,给出对计算结果的评价。程序算法流程图如图所示:程序特别处理:如果(ab),计算(ab);否则计算(ba)。思考:思考:1如果每次测试的题目不止10个,需要怎样修改算法和程序?2如果要求程序在结束了一组测试之后,可以继续进行测试,需要怎样修改算法和程序?3
14、如果要加入两位数的除法计算,需要怎样修改算法和程序?例:例:一球从一球从100100米高度自由落下,每次落地后反跳回原米高度自由落下,每次落地后反跳回原高度的一半高度的一半;再落下,求它在第再落下,求它在第1010次落地时,共经过多次落地时,共经过多少米?第少米?第1010次反弹多高?次反弹多高?程序分析:程序分析:球从第一次落地到第二次落地经过了第一球从第一次落地到第二次落地经过了第一次高度一半的两倍(上抛和下落),次高度一半的两倍(上抛和下落),共经过了共经过了100+50*2100+50*2米,将此结果存放在米,将此结果存放在snsn变量中;变量中;,第,第n n次次落地,共经过前落地,
15、共经过前n-1n-1次的路程加上第次的路程加上第n-1n-1次高度一半的次高度一半的两倍。这样每次的高度存放在两倍。这样每次的高度存放在hnhn变量中,经过的路程变量中,经过的路程存放在存放在snsn变量中。变量中。程序清单如下程序清单如下:main()float sn=100.0,hn=sn/2;int n;for(n=2;n=10;n+)sn=sn+2*hn;/*第第n次落地时共经过的米数次落地时共经过的米数*/hn=hn/2;/*第第n次反跳高度次反跳高度*/printf(the total of road is%fn,sn);printf(the tenth is%f metern,h
16、n);程序分析:程序分析:本数列分子与分母的变化规律为:后项本数列分子与分母的变化规律为:后项分母为前项的分子,后项分子为前项的分子分母之分母为前项的分子,后项分子为前项的分子分母之和。假设用和。假设用a代表分子代表分子,用用b代表分母代表分母,用用s存放和存放和.则则 核心代码为:核心代码为:s=s+a/b;t=a;a=a+b;b=t;/*这部分是程序的关键,请注意这部分是程序的关键,请注意t的作用的作用*/例例:有一分数序列:有一分数序列:2/12/1,3/23/2,5/35/3,8/58/5,13/813/8,21/13.21/13.求出这个数列的前求出这个数列的前2020项之和。项之和
17、。完整的程序清单如下完整的程序清单如下:main()int n;float a=2,b=1,s=0,t;for(n=1;n=20;n+)s=s+a/b;t=a;a=a+b;b=t;/*这部分是程序的关键,请注意t的作用*/printf(sum is%fn,s);程序分析:我们用变量n计数,并与变量t(注意赋初值为1)累乘后结果再放在此变量中,这样变量t中为n!,再将变量t中的值累加至变量s中。例:求1+2!+3!+.+20!的和 完整的程序清单如右完整的程序清单如右:main()float n,s=0,t=1;for(n=1;n=20;n+)t=t*n;s+=t;printf(“t=%en”,
18、s);程序分析:在10万以内判断,先将该数加上100后再开方,再将该数加上168后再开方,如果开方后的结果满足如下条件:该数的平方根的平方等于该数,这说明此数是一个完全平方数,就是所要求的数例例:一个整数一个整数,它加上它加上100100后是一个完全平方数后是一个完全平方数,再加再加上上168168又是一个完全平方数又是一个完全平方数,请问该数是多少请问该数是多少?完整的程序清单如右完整的程序清单如右完整的程序清单如右完整的程序清单如右:#include“math.h”#include“math.h”main()main()long long intint i,x,y,z;i,x,y,z;fo
19、r(i=1;i100000;i+)for(i=1;i100000;i+)x=sqrt(i+100);x=sqrt(i+100);y=sqrt(i+100+168);y=sqrt(i+100+168);if(x*x=i+100&y*y=i+100+168)if(x*x=i+100&y*y=i+100+168)printf(“n%ldn”,iprintf(“n%ldn”,i););例例例例:打印出所有的打印出所有的打印出所有的打印出所有的“水仙花数水仙花数水仙花数水仙花数”,所谓,所谓,所谓,所谓“水仙花数水仙花数水仙花数水仙花数”是指一个三是指一个三是指一个三是指一个三位数,其各位数字立方和等于
20、该数本身。例如:位数,其各位数字立方和等于该数本身。例如:位数,其各位数字立方和等于该数本身。例如:位数,其各位数字立方和等于该数本身。例如:153153是一个是一个是一个是一个“水仙花数水仙花数水仙花数水仙花数”,因为因为因为因为153=1153=1的三次方的三次方的三次方的三次方5 5的三次方的三次方的三次方的三次方3 3的三次方。的三次方。的三次方。的三次方。编程方法:编程方法:“枚举法枚举法”按问题本身的性质,一一列举出该问题所按问题本身的性质,一一列举出该问题所有可能的解,并在逐一列举的过程中,检验有可能的解,并在逐一列举的过程中,检验每个可能解是否是问题的真正解,若是,我每个可能解
21、是否是问题的真正解,若是,我们采纳这个解,否则抛弃它。对于所列举的们采纳这个解,否则抛弃它。对于所列举的值,既不能遗漏也不能重复。值,既不能遗漏也不能重复。main()int i,j,k,n;printf(water flowernumber is:);for(n=100;n1000;n+)i=n/100;/*分解出百位分解出百位*/j=n%100/10;/*分解出十位分解出十位*/k=n%10;/*分解出个位分解出个位*/if(i*100+j*10+k=i*i*i+j*j*j+k*k*k)printf(%-5d,n);5.2 while语句while语句的一般形式为:while()循环语句;
22、循环变量表达式;和一起构成循环体语句。while语句的语法功能:1计算的值,若该值为“假”,则跳出循环,执行循环体后面的语句;若该值为“真”,则执行循环体语句。2重复步骤1的操作。while语句的流程图如图所示:关于while语句的几点说明。1不可缺少,其作用是更新计算循环变量的值,使循环能正常结束。2若没有,则有可能会使程序出现无限循环而发生错误。3由于while循环是先判断的值,后决定是否执行,因此,有可能一次也没有执行。#include main()int i,sum=0;i=1;while(i=100)sum=sum+i;i+;printf(%d,sum);循环变量初值循环变量初值循环
23、终值循环终值循环变量增值循环变量增值循环条件循环条件循环体循环体上述程序段的功能是上述程序段的功能是:计算计算1+2+3+100的和的和例例:显示显示110的平方的平方#include main()int i=1;while(i=0)=0)s=1;i=1;s=1;i=1;while(iwhile(i=n)s=s*i;i+;=n)s=s*i;i+;printf(“%dprintf(“%d!=%ld!=%ldn”,n,sn”,n,s););else else printf(“Sorryprintf(“Sorry!”);!”);程序运行结果程序运行结果:5 5!=120例例7 7:编写程序,统计从键
24、盘输入的字符个数(回车换行符也是一个字符),当遇到结束标志时程序结束。分析:分析:关键是循环计数。设置一个累加器count(初值为0),每次从键盘输入一个字符,只要该字符的值不等于结束标志,累加器的值就增1:count=count+1;算法流程图如图所示。#include main()char ch;unsigned count=0;while(ch=getchar()!=n)count=count+1;printf(count=%un,count);getch();若是课本上的程序,则运行如下若是课本上的程序,则运行如下:Hello,world后按下后按下ctrl+z后再按后再按回车换行回车
25、换行count=11程序运行情况如下程序运行情况如下:Hello,world count=11【例5-8】编写程序,进行学生某门课程成绩的分类统计。从键盘输入每位学生的成绩等级,以大小写的A、B、C、D和E表示成绩等级,A为最高,D为最低。统计出总人数及各成绩段的人数,忽略回车键和空格键,以EOF作为输入结束。#include#include main()main()intint grade,totalgrade,total=0,errtotal=0,ecount=0;=0,errtotal=0,ecount=0;intint acountacount=0,bcount=0,ccount=0,
26、dcount=0;=0,bcount=0,ccount=0,dcount=0;while(gradewhile(grade=getchargetchar()!=EOF)()!=EOF)switch(gradeswitch(grade)case A:case A:case case a:+acount;+total;breaka:+acount;+total;break;case B:case B:case case b:+bcount;+total;breakb:+bcount;+total;break;case C:case C:case case c:+ccount;+total;brea
27、kc:+ccount;+total;break;case D:case D:case case d:+dcount;+total;breakd:+dcount;+total;break;case E:case E:case case e:+ecount;+total;breake:+ecount;+total;break;case n:case n:case :break;case :break;default:printfdefault:printf(输入有错输入有错,请重新输入请重新输入?);+?);+errtotal;breakerrtotal;break;printf(nprintf(
28、n有效输入次数:有效输入次数:%d,%d,无效输入次数无效输入次数:%:%dn,total,errtotaldn,total,errtotal););printf(uknprintf(ukn w w ovtovt :%d,%d,成绩分布如下成绩分布如下:n,totaln,total););printf(Aprintf(A级级 tBtB级级 tCtC级级 tDtD级级 tEtE级级n);n);printf(%dprintf(%d人人 t%dt%d人人 t%dt%d人人 t%dt%d人人 t%dt%d人人 n,acount,bcount,ccount,dcount,ecountn,acount,b
29、count,ccount,dcount,ecount););getchgetch();();程序运行情况见课本程序运行情况见课本例例1 1:分析下列程序段的循环次数:分析下列程序段的循环次数i=1;while(i=100)putchar(*);i+;i=1;while(i0)while(day0)x1=(x2+1)*2;x1=(x2+1)*2;x2=x1;x2=x1;day-;day-;printf(“theprintf(“the total is%dn”,x1;);total is%dn”,x1;);这里用这里用x2表示当天的桃子表示当天的桃子数,用数,用x1表示前一天的桃表示前一天的桃子数
30、。从第十天开始往前子数。从第十天开始往前计算,直到第一天为止。计算,直到第一天为止。前一天的桃子数是第二天前一天的桃子数是第二天的桃子数加的桃子数加1后的后的2倍。倍。运行情况如下:运行情况如下:the total is 15345.3 do-while语句do_while语句的一般形式为:do while();do_while语句的语法功能:1执行,2计算;若该表达式的值为“真”,则执行步骤1;若该表达式的值为“假”,则退出循环语句结构。do_while语句的流程图如图所示注意:注意:要避免出现无限循环而发生错误。5.3 do-while语句集中循环的特点比较:do_while与while和
31、for循环的区别:do_while循环中的至少会执行一次;而while和for循环中的有可能一次也不被执行。for循环和while循环的算法流程图描述是一致的。for循环适合于循环次数确定的情况。对大多数问题,do_while、while和for循环是可以互换的。5.3 do-while语句例9:求几何级数的和:用do_while语句的形式实现。分析:分析:循环变量i的值从1100递增,i的初值为1、终值为100,累加器sum的初值为0 循环计算:sum=sum+i。算法流程图如图所示。程序:exam5_9.c5.3 do-while语句例例1010:编写程序,从键盘输入x的值,求 ,直到最后
32、一项绝对值小于le7(即107)为止(注:x为弧度值)。分析:分析:关键是对多项式进行分解计算。第1项为x;从第2项开始,每一项都是前一项乘以一个因子:(n=3,5,7,9)用s代表sinx的值,s的初值为0;用t代表每一项的值,t的初值为x;从第2项开始,后面每1项的值为:(n=3,5,7,9)循环计算表达式:s=s+t;直到t的值满足精度要求为止。5.3 do-while语句算法流程图如图所示。程序:example5_10.c思考:程序怎样控制计算的精度?可否用while和for循环来实现?其他算法。5.4 用于循环中的break语句和continue语句1break语句语句break语句
33、可用于分支结构和循环语句结构。break语句的作用:跳出当前的控制结构。在循环语句中,要谨慎使用break语句。常用于循环语句体内某一个if条件分支的语句中,用来表示在循环过程中满足某一条件时,结束循环。5.4 用于循环中的break语句和continue语句例例1111:编写程序,求圆面积在100平方米为以内的半径,输出所有满足条件的半径值和圆面积的值,并输出第1个大于100的圆半径和圆面积。分析:分析:计算圆面积的表达式为:r2。依次取半径为1,2,3,循环计算圆的面积area;当area100时结束。算法流程图如图所示,外层虚线框为循环结构,内层虚线框为if结构。程序:程序:exampl
34、e5_115.4 用于循环中的break语句和continue语句循环结构中若采用了break语句,其算法结构属于非结构化的设计。用于结束当前循环语句的break语句都可以修改成不使用break语句的形式。应尽量避免使用break语句,满足结构化的要求。思考:思考:怎样修改例11的程序,使其成为结构化的程序。提示提示5.4 用于循环中的break语句和continue语句2continue语句语句continue语句的一般形式为:continue;continue的语法规则:结束本次循环,提前进入下一轮循环。注意:注意:continue语句不会跳出循环结构,而是提前进行下一个循环。while语
35、句和do_while语句遇到continue时,程序会立刻转到条件表达式,开始下一轮循环;而在for语句中遇到continue时,程序会立刻转到循环表达式,更新循环变量,开始下一轮循环。5.4 用于循环中的break语句和continue语句例例1212:编写程序,输出在50100中不能被3整除的数。分析:分析:对任意正整数n,若n%30,则输出该数n;如果n%30,则不输出该数n。算法流程图如图所示:程序:程序:example5_12.c 思考:思考:不使用continue语句,怎样修改程序?5.4 用于循环中的break语句和continue语句 continue语句同break语句一样,
36、也有可能会破坏程序的结构化,使程序成为非结构化的程序,因此,应当尽量避免使用continue语句。提示提示5.4 用于循环中的break语句和continue语句例例1313:编写程序,循环地从键盘输入整数,计算并输出数的个数、总和以及算术平均值,若输入了数字0,则不计入总数,以结束标志作为输入的结束。分析:分析:假设从键盘输入的整数为n,数据的个数为count,数据的总和为sum,算术平均值为average。如果n=0,则计数count的值不增加,不计入总和;否则count的值增1,总合sum=sum+n。最后的算术平均值为average=sum/n。算法流程图如图所示:程序:程序:exam
37、ple5_13.c 思考:思考:不使用continue语句,怎样修改程序?5.4 用于循环中的break语句和continue语句比较break语句和continue语句的区别:例例1414:阅读程序:example5_14.c和example5_14a.c。比较break语句和continue语句在程序中的区别。注意:为确保算法的结构化,清尽量不用或少用break和continue语句。5.5 循环结构的嵌套循环结构的嵌套,指的是在某一种循环结构的语句中包含有另一个循环结构。理论上,循环嵌套的深度不受限制,但实际中不提倡使用嵌套层次太多的循环结构。循环结构嵌套时,要注意:嵌套的层次不能交叉;
38、嵌套的内外层循环不能使用同名的循环变量;并列结构的内外层循环允许使用同名的循环变量。5.5 循环结构的嵌套例例1515:编写程序,在屏幕上输出阶梯形式的乘法口诀表。分析;分析;乘法口诀表可以由9行9列来表示,其中第i行有i列。利用循环嵌套,算法流程图如图所示:程序:程序:example5_15.c 例例例例3 3 3 3:编写程序,从键盘输入编写程序,从键盘输入mm和和n n的值,用符号的值,用符号“*”在屏幕在屏幕上打印出如下所示具有上打印出如下所示具有mm行行n列的矩形图案。*分析:分析:图案有规律,共有m行,每行有n个*号。可采用循环嵌套的方式:第1层(外层)控制行数,用i来表示,输出m
39、行“*”;第2层(内层)控制列数,用j来表示,输出n列“*”。5.1 for语句算法流程图如图所示:算法流程图如图所示:虚线框内是内层循环,用来输出虚线框内是内层循环,用来输出每一行的每一行的n n个个*号。号。程序:程序:example5_3.c 思考:思考:怎样利用怎样利用forfor循环的嵌套,输出循环的嵌套,输出更多有规律的平面图案。更多有规律的平面图案。关键:找出图案的规律。关键:找出图案的规律。5.6 goto语句goto语句是一种无条件转向语句,可以用在程序的任何地方。goto语句的一般形式为:goto;goto语句的作用:转到标号语句所在的地方继续执行。说明:为任何合法的标识符
40、;放在某个语句前面并加上冒号“:”作为语句的标号;只对goto语句有意义,带有标号的语句被称作标号语句。例如:error:、end:、exp:等均为合法的语句的标号。5.6 goto语句goto语句是一种非结构化的语句。goto语句会破坏结构化程序的逻辑结构,严重时会造成程序错误,因此,在程序设计中应尽量少用或不用goto语句。goto语句常用于在深层嵌套的情况下从里层完全退出到嵌套的最外层。特别提示特别提示如:for()for()for();if(mistake)gotoerror;error:;5.6 goto语句例16:阅读【例5-16】,用goto语句计算简单几何级数的和。回顾该问题的
41、其他解决方案。例例1717:编写程序,输出40以内的能同时被3和4整除的数。分别给出两种算法:使用goto语句。5.6 goto语句算法流程图:算法为非结构化的或:程序:程序:example5_17.c 5.6 goto语句不使用goto语句来实现。算法流程图:程序:程序:example5_18.c 比较例5-17和例5-18的算法。思考结构化算法的思想。5.7 程 序 范 例【例5-19】编写程序,输出ASC序列中从33127(十进制)的字符对照表。算法核心:简单的循环输出。【例5-20】设公鸡每只5元,母鸡每只3元,小鸡每元3只,现用100元钱买100只鸡,编写一个程序,算出可以各买多少只
42、鸡?算法核心:循环嵌套。5.7 程 序 范 例【例5-21】编写程序,在屏幕上输出下面的结果,输出数据的行数通过键盘输入,要求在520行之间。3 5 7 9 6 8 10 12 9 11 13 15 12 14 16 18 15 17 19 21算法核心:分析输出数据的规律,简单循环结构。5.7 程 序 范 例【例5-22】输出如图5-19所示的图案,图案的最大宽度值(水平方向*号的个数)由键盘输入。要求最大的宽度值必须为奇数。算法核心:分析输出数据的规律,用循环嵌套。5.8 本 章 小 结1.主要讨论了3种循环语句:for、while和do_while循环。2.了解了break语句、cont
43、inue语句和goto语句的作用。3.3种循环可互相嵌套以构成各种混合嵌套结构。4.while循环和for循环都要先判断条件再执行循环体语句,因此,有可能一次也不执行循环体语句,而do_while循环不论怎样都会先执行一次循环体语句。5.使用循环结构时要注意避免以下几个方面的问题。循环体语句为复合语句,但没有使用花括号。程序发生无限循环。混淆break语句与continue语句的功能。本 章 习 题一、填空题。【题5.1】【题5.10】二、单选题。【题5.11】【题5.18】三、编程题。【题5.22】【题5.23】【题5.26】【题5.227】【题5.29】【题5.39】【题5.43】附加:编写程序输出下面7种图案。