版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
if+goto语句构成循环
while循环控制语句
do…while循环控制语句
for循环控制语句
循环嵌套
break和continue语句第六章循环控制6.1概述循环概述重复执行某部分代码,就构成循环结构。有限循环:在某个条件满足时重复执行,不满足时结束无限循环:无条件的重复执行或循环结束条件永远不满足
循环结构的组成要素:循环初始化部分循环变量或循环计数器循环继续条件(循环终止条件)
循环体(重复执行的代码)
4种实现方式:
if+goto语句
while语句
do…while语句
for语句注意:后3种是专门的循环控制语句重点:每种循环语句的执行过程。
6.2goto语句及用goto语句
构成循环
goto语句
if+goto语句构成循环Here:
……gotoHere;……gotoThere;……There
:
……goto语句
goto语句:无条件跳转语句。用法:goto语句标号;
功能:程序流程直接转到语句标号所在的地方执行
语句标号是一个标识符,命名的规则同变量的命名规则。定义方法在语句前放上语句标号:注意:
goto可以往上跳转。goto可以往下跳转。语句标号出现的方式是:在其后面必须跟上一个冒号。goto语句应该慎用,因为它不判断条件而直接跳转,容易破坏程序的结构化。主要用于:①和if语句构成循环;②从循环体内跳到循
环体外。算法和思路:为什么可以用循环?
因为数据有规律的递增且都是乘法运算。循环的是什么?
每次产生一个新数据并把它乘到上次的结果中。什么时候结束循环?
当新产生的数据大于10的时候就停止上述循环过程。怎样实现循环控制?
goto
语句可以无条件跳转,用于跳到循环开始的地方;
if
语句是条件分支语句,用于判断循环结束条件是否满足。如果满足,则循环结束并输出计算结果;如果不满足,则利用goto语句返回继续循环。用if语句和goto语句构成循环:例6-1例:编程计算1×2×3×…×n,n=10#include<stdio.h>voidmain(){longintprod=1;intn=1;Loop:
if(n<=10){prod=prod*n;n++;gotoLoop;}printf(“1*2*3*…*%d=%ld\n”,n–1,prod);return;}循环变量n
初值=1变化步长=1终值=10循环继续条件:n<=10
即循环终止条件:n>10循环体:大括弧中的语句。其中的n++
使循环终止条件越来越接近满足,也就是说循环最终会结束。由if判断条件,goto直接跳转,使得一部分指定的操作被重复执行了。这就是循环。循环结束后:循环变量的值是多少?
#include<stdio.h>voidmain(){longintprod=1;intn=1;Loop:
if(n>10)printf(“1*2*3*…*%d=%ld\n”,n–1,prod);
else
{prod=prod*n;n++;gotoLoop;}}换成用循环终止条件来控制。6.3while语句在while语句的执行过程中就隐含了用
if判断条件,用goto直接跳转的流程。while语句(当型循环)语法:while(表达式)循环体语句;
执行过程:首先求解表达式的逻辑值。若值为“T”,则执行内嵌的语句,然后返回再次求解表达式;若值为“F”,则while语句结束,接着执行其后的语句。注意:
①当循环体包含多于一个语句时,必须用大括号把它们括起来构成复合语句。②while(表达式)后没有分号。③如果第一次求解表达式,其值就为“F”,则循环体不被执行。语句TF表达式while循环控制语句:例例:编程计算1×2×3×…×n,n=10#include<stdio.h>voidmain(){longintprod=1;intn=1;Loop:
if(n<=10){prod=prod*n;n++;gotoLoop;}printf(“1*2*3*…*%d=%ld\n”,n–1,prod);return;}while(n<=10)用if+goto
构成的循环用while语句
构成的循环这后面没有分号。将内嵌语句用大括号括起来形成复合语句。◆
1.下面程序执行的结果是()。#include“stdio.h”voidmain(){intn=1;while(n=1)n--;printf(“n=%d\n”,n);}(A)n=0 (B)while构成无限循环(C)n=1 (D)n=-1课堂练习:while语句答案:(B)◆
2.下面程序执行的结果是()。#include“stdio.h”voidmain(){intn=1;while(n==1)n--;printf(“n=%d\n”,n);}(A)n=0 (B)while构成无限循环(C)n=1 (D)n=-1课堂练习:while语句答案:(A)课堂练习:while语句◆
3.下面程序执行的结果是()。#include“stdio.h”voidmain(){intn=1;while(n=n-1)n--;printf(“n=%d\n”,n);}(A)n=0 (B)while构成无限循环(C)n=1 (D)n=-1答案:(A)课堂练习:while语句(例6-2)◆
4.下面程序执行的结果是()。#include“stdio.h”voidmain(){intn=1;while(n--);printf(“n=%d\n”,n);}(A)n=0 (B)while构成无限循环(C)n=1 (D)n=-1答案:(D)6.4do…while语句在do…while语句的执行过程中也隐含了用if判断条件,用goto直接跳转的流程。do…while语句语法:do循环体语句;while(表达式);
执行过程:首先执行do后的循环体语句,然后求解表达式的逻辑值。若值为“T”,则返回继续执行内嵌的循环体语句;若值为“F”,则do…while语句结束,接着执行其后的语句。注意:
语句TF表达式①当循环体语句多于一个时,必须用大括号把它们括起来构成复合语句。②while(表达式)后有分号。③不论第一次求解表达式的值是什么,循环体语句至少被执行一次。do…while循环控制语句:例例:编程计算1×2×3×…×n,n=10#include<stdio.h>voidmain(){longintprod=1;intn=1;
while(n<=10){prod=prod*n;n++;}printf(“1*2*3*…*%d=%ld\n”,n–1,prod);return;}用while语句
构成的循环用do…while语句
构成的循环do
{prod=prod*n;n++;}
while(n<=10);这后面有分号。while语句和do…while语句的对比
do…while
语句的流程图语句TF表达式语句TF表达式while
语句的流程图不论第一次求解表达式的值是什么,循环体语句至少被执行一次。如果第一次求解表达式,其值就为“F”,则循环体不被执行。一般情况下,同一个问题用while语句和do…while语句实现,其循环体都是一样的。但是,有可能循环体被执行的次数是不同的。
while和do…while循环比较适用于循环次数不太明确,但是循环的终止条件(或循环继续条件)比较明确的问题中。◆小强今年12岁,父亲大他20岁。问过多少年父亲年龄是小强年龄的2倍,那时两人分别是多少岁?#include<stdio.h>voidmain(){intson=12,dad=son+20,year=0;
while(dad!=son*2){dad++;son++;year++;}printf(“%dyearspast\n”,year);printf(“son\’sage=%d\n”,son);printf(“dad\’sage=%d\n”,dad);}课堂练习:(例6-3)循环次数不太明确而循环终止条件明确的情况。do{dad++;son++;year++;}while(dad!=son*2);while((dad+year)!=(son+year)*2){year++;}printf(“%dyearspast\n”,year);printf(“son\’sage=%d\n”,son+year);printf(“dad\’sage=%d\n”,dad+year);6.5for语句for语句语法:for(表达式1;表达式2;表达式3)循环体语句;
执行过程:首先求解表达式1的具体值;②再求解表达式2的逻辑值。若值为“T”,则执行内嵌的循环体语句,转③若值为“F”,则循环结束,执行for语句下面的语句;③求解表达式3的具体值;④返回第②步循环体语句TF表达式2求解表达式1求解表达式3
通常:表达式1用于循环初始化;表达式2用于描述循环继续条件;表达式3的用于循环变量的增减,从而使循环继续条件越来越不满足。for循环控制语句:例例:编程计算1×2×3×…×n,n=10#include<stdio.h>voidmain(){longintprod=1;intn=1;
while(n<=10){prod=prod*n;n++;}printf(“1*2*3*…*%d=%ld\n”,n–1,prod);return;}用while语句
构成的循环用do…while语句
构成的循环do
{prod=prod*n;n++;}
while(n<=10);用for语句
构成的循环longintprod=1;intn;
for(n=1;n<=10;n++)
{prod=prod*n;}prod=prod*nTFn<=10n=1n++for语句的有关说明for语句语法组成部分多,功能强大,使用非常灵活。#include<stdio.h>voidmain(){longintprod=1;intn;
for(n=1;n<=10;n++)
{prod=prod*n;}printf(“1*2*3*…*%d=%ld\n”,n–1,prod);return;}表达式1可以省略,循环初始化可以放在for语句之前。longintprod=1;
intn=1;for(;n<=10;n++)
{prod=prod*n;}如果表达式2也省略,则成了无限循环。显然这里是不允许的。longintprod=1;
intn=1;for(;;n++)
{prod=prod*n;}longintprod=1;
intn=1;for(;n<=10;)
{prod=prod*n;n++;}表达式3也可以省略,把它放回到循环体语句中。longintprod=1;
intn=1;for(;n<=10;prod=prod*n,n++)
{;}循环体中的部分表达式语句甚至也可以放到表达式3中。只要保证流程正确即可。for循环常用于循环次数(循环变量的初值和终值)比较明确的问题中。for语句:例6-4例:课本p120习题6.3
编程求Sn=a+aa+aaa+…+a…a(n个a)
其中,a是一个0~9的整数,n是一个整数由键盘输入。思路:肯定是用循环来解决。为什么?因为每一次都是向和数中加入一个数(即累加)。重复的相同运算。S=S+D
如何寻找每一个加入数据产生的规律?
考察某个数据和前一个数据的关系;Dk=Dk-1*10+aC语言中表示为D=D*10+a或者考察某个数据与它在整个数据序列中所处位置的关系
,如第4项aaaa,a*103+a*102+a*101+a*100
10*(10*(10*(10*0+a)+a)+a)+a
第一次aD1=D0*10+aD0=0
第二次
aa
D2=D1*10+a
第三次
aaa
D3=D2*10+a
第四次
aaaa
D4=D3*10+a#include<stdio.h>voidmain(){inta=2,n=0,i;longintsum=0,temp=0;printf(“Pleaseinputainteger:”);scanf(“%d”,&n);for(i=1;i<=n;i++){temp=temp*10+a;sum=sum+temp;}printf(“Sn=%ld\n”,sum);}每个数据
产生的规律迭代法6.6循环嵌套while(){…
while(){…}…}while(){…do
{…}
while();…}while(){…for(;;){…}…}循环嵌套在一个循环体内包含另一个循环控制语句称为“循环嵌套”。嵌套的层数不同的系统规定不同。一般来说,实际中最多就用到4层嵌套。最常用的是双重循环。do
{…do
{…}while();…}while();do
{…while(){…}…}while();do{…
for(;;){…}…}while();for(;;)
{…do
{…}while();…}for(;;)
{…while(){…}…}for(;;)
{…
for(;;){…}…}循环嵌套:例6-5例:课本p129习题6.4编程求∑n!=1!+2!+3!+…+n!其中,n是一个整数。思路:用两层循环内层循环求每一个数的阶乘,外层循环求累加值#include<stdio.h>voidmain(){intn=10,i,j;longintsum=0,prod=1;
for(i=1;i<=n;i++){prod=1;
for(j=1;j<=i;j++)prod=prod*j;sum=sum+prod;}printf(“1!+2!+3!+…+%d!=%ld\n”,n,sum);}外层循环变量把每次由内层循环计算出的阶乘值累加到变量sum中。注意开始要把sum=0内层循环用于求外层循环变量i当前值的阶乘。注意开始要把prod=1实际上,这个问题用一层循环
就可以解决。就是利用关系式:
n!=(n-1)!*n#include<stdio.h>voidmain(){intn=10,i;longintsum=0,prod=1;
for(i=1;i<=n;i++){
prod=prod*i;sum=sum+prod;}printf(“1!+2!+3!+…+%d!=%ld\n”,n,sum);return;}6.8break语句和continue语句break语句语法:break;
用法:用在一个循环控制语句的循环体内。作用:结束整个循环语句,接着执行该循环语句后面的语句。break语句只能用在switch
语句和三种专门的循环控制即while、do…while和for语句中。用在switch语句中作用是结束它所在的switch语句的执行,接着执行switch后面的语句。用在循环体中作用是结束它所在的循环语句的执行,接着执行该循环语句后面的语句。注意:
continue语句语法:continue;
用法:用在一个循环控制语句的循环体内。作用:结束本次循环的执行,即当遇到continue语句时,就跳过该循环体中位于continue后面的语句,接着进行下一次是否继续循环的判断。continue语句只能用在三种专门的循环控制语句即while、do…while和for语句中。注意:
break语句和continue语句的区别break语句:
结束整个循环语句continue语句:
结束本次循环的执行TF表达式1表达式2while后的语句TFbreakwhile(表达式1){…
if(表达式2)break;…}TF表达式1表达式2while后的语句TFcontinuewhile(表达式1){…
if(表达式2)continue;…}#include<stdio.h>voidmain(){longintprod=1;intn=1;
while(1){prod=prod*n;n++;if(n>10)break;}printf(“1*2*3*…*%d=%ld\n”,n–1,prod);return;}break语句:例6-6例:编程计算1×2×3×…×n,n=10用常量1作判断表达式,好像形成了一个无限循环。当循环终止条件满足时,
用break语句结束循环。#include<stdio.h>voidmain(){intsum=0;intn=0;
while(n<=100){sum=sum+n;n+=2;}printf(“sum=%d\n”,sum);return;}
continue语句:例6-7例:编程计算1~100之间所有偶数的和。for(;n<=100;)
{sum=sum+n;n=n+2;}用while语句
实现用for语句
实现for(;n<=100;n++)
{if(n%2!=0)continue;sum=sum+n;}用for语句和continue实现6.9循环结构程序举例程序举例6-8:题目及分析例:课本p124例6.6用π/4=1–1/3+1/5–1/7+…公式求π的近似值,直到最后一项的绝对值小于1e-6为止。分析:题目需要计算累加,应该用到循环语句。用那种循环语句来控制呢?根据题目的要求,要累计到最后一项数据的绝对值小于某个值的时候结束。也就是说,我们无法知道要累计多少个数据,只知道什么时候结束累计,因此应该用while或do…while比较合适。如何解决累加的数据符号在交替变化的问题?可以设置一个变量,专门用于保存数据的符号,根据循环次数的不同,依次在正负之间转换。如何求一个数据的绝对值?可以调用数学库函数,或自己编写代码求绝对值。程序举例6-8:实现方案#include<stdio.h>#include<math.h>voidmain(){floatt=1,pi=0.0;floatn=1,sign=1;while(fabs(t)>1e-6){pi=pi+t;n=n+2;sign=-sign;t=sign/n;}pi=pi*4;printf("pi=%10.6f\n",pi);}因为用到数学库函数,所以要包含相应的头文件用于保存
符号的变量fabs是用于求实型数据绝对值的函数每循环一次,符号就变化一次求出下一个要累计的数据1对兔子,第3个月起,每月生1对兔子,在讨论的时间内兔子总活着
,第n个月有多少对兔子--Fibonacci数列1月 1
2月 1
3月 1 1
4月 1 1
1
5月 1 1
1 1
1
6月 1 1
1 1
1
1
1
1老兔一胎小兔一小兔的一小兔二小兔的一小兔一小兔的二小兔二胎小兔三胎小兔四胎小兔f1=1,f2=1;fn=fn-1+fn-2程序举例6-9:题目及分析程序举例6-9:题目及分析例:课本p125例6.7求Fibonacci数列的前40个数。该数列满足递推公式f1=1,f2=1;fn=fn-1+fn-2分析:题目需要计算累加,应该用到循环语句。用那种循环语句来控制呢?根据题目考虑用for语句比较合适。怎么循环?我们把前40个数的递推过程写一下:f1=1f2=1f3=f2+f1f4=f3+f2f5=f4+f3……可见,在已知f1和f2的时候,从第3个数据开始,每个数据都只与前面相邻的两个数据有关。比如:当根据f1+f2=f3
求出f3后,再求f4时,原来f1变量中的数据不再有用,所以如果把f2的值放到f1中,把f3的值放到f2中,那么计算f4的表达式f3+f2就变成了f2+f1,结果又可以放到f3中,依此类推就形成了循环。程序举例6-9:算法1f3=f2+f1f3=f2f1(f3)(f2)+f4=f3+f2(f4)f3=f2f1+f5=f4+f3(f4)(f3)(f5)第1次循环:第2次循环:第3次循环:算法1:每循环一次求出一个新的数据程序举例6-9:实现方案一/*算法1:循环一次输出一个数据*/#include<stdio.h>voidmain(){longintf1=1,f2=1,f3;intn;printf(“%12d%12d”,f1,f2);for(n=3;n<=40;n++){f3=f1+f2;printf(“%12d”,f3);if(n%5==0)printf(“\n”);f1=f2;f2=f3;}}每次循环求出一个新的数据并输出使每行只输出5个数据实现循环递推算法的关键程序举例6-9:算法2算法2:每循环一次求出两个新的数据f3=f2+f1f4=f3+f2第1步:求f3第2步:求f4f1=f2+f1(f3)f2=f1+f2(f4)(f3)一次循环:每循环一次求出两个新的数据程序举例6-9:实现方案二/*算法2:循环一次输出两个数据*/#include<stdio.h>voidmain(){longintf1=1,f2=1;intn;for(n=1;n<=20;n++){printf(“%12d%12d”,f1,f2);if(n%2==0)printf(“\n”);f1=f2+f1;f2=f1+f2;}}循环变量的初值和终值不一样了一次输出两个数据每行输出
4个数据技巧性比较强的循环递推算法的实现程序举例6-10:题目及分析例:课本p126例6.8判断一个整数是否是素数。分析:素数是指除了1和它本身外,不能被任何数整除的自然数。如何判断呢?根据素数的性质,对一个给定的整数num,用它去除以从2到num-1之间的所有整数。在这个检验过程中,只要有一个能整除,就说明num不是素数;只有到最后检验结束,都不能整除,才说明num是素数。枚举法根据上述分析可见,需要使用循环控制语句产生2~num-1之间的整数,依次去除num。循环体中判断能否整除,并在发现第一个能整除的情况下提前结束循环(即是说,没有必要继续往下检验能否整除了),否则循环会正常结束。如何判断一个循环是提前结束还是正常结束的呢?检查循环变量在循环结束的当前值。程序举例6-10:实现方案一#include<stdio.h>voidmain(){intnum,n;printf(“Pleaseinputainteger:”);scanf(“%d”,&num);for(n=2;n<=num-1;n++)if(num%n==0)break;if(n>=num)printf(“%disaprimenumber.\n”,num);elseprintf(“%disnotaprimenumber.\n”,num);}循环变量n终值是num-1,步长是+1,因此如果循环正常结束,那么n的值应该等于num。只要有第一个能被整除的,就结束循环。判断循环是否正常结束#include<stdio.h>#defineTRUE1#defineFALSE0voidmain(){intnum,n,bIsPrime=TRUE;printf(“Pleaseinputainteger:”);scanf(“%d”,&num);for(n=2;n<=num-1;n++)if(num%n==0){bIsPrime=FALSE;break;}if(bIsPrime)printf(“%disaprimenumber.\n”,num);elseprintf(“%disnotaprimenumber.\n”,num);}程序举例6-10:实现方案二定义两个含义清楚的符号变量,代表逻辑值
“T”和“F”。定义一个标志变量保存是否素数的判断结果。此处初始化为“T”。若发现有能被整除的,即将标志变量设为“F”,同时结束循环。程序举例6-11:题目及分析例:一次执行程序,可以判断多个整数是否是素数。分析:需要前例中判断素数的全部代码。当用户根据提示信息输入一个整数后,程序接收它并判断给出结果,一个数据的判断过程就结束了。此时,若再次给出提示信息,要求用户继续输入数据,就可以实现判断若干个数据的目的。因此需要把判断素数的全部代码在放到一个循环体中。该循环的结束是由用户的输入决定的。即当用户输入一个整数0时表示他想结束程序的运行,输入其它数据时表示他想判断是否是素数。程序举例6-11:实现方案#include<stdio.h>#defineTRUE1#defineFALSE0voidmain(){intnum,n,bIsPrime=TRUE;
while(TRUE){printf(“Pleaseinputainteger
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 教育培训资源租赁合同
- 塑料制品物流招标模板
- 外籍员工住宿租赁合同
- 文化创意产业人才聘用合同样本
- 专卖店电气系统聘用协议
- 农业机械检修安全要求
- 北京旅游纪念品采购策略
- 生态保护区用地管理办法
- 生态环境监测站合同范例
- 硬件公司图书室管理办法
- 四川省成都市九县区2024-2025学年高一上学期期中考试数学试题(含答案)
- 2024秋国开《四史通讲》期末大作业试题B答案(第1套)
- 2024年8月CCAA国家注册审核员《管理体系认证基础》考试题目含解析
- 户外广告安装施工方案
- 钠离子电池低成本硬碳负极关键技术开发-2024-10-技术资料
- 2023医疗质量安全核心制度要点释义(第二版)对比版
- 2025届广东省珠海市紫荆中学高二数学第一学期期末教学质量检测试题含解析
- 2024年中央企业全面质量管理知识竞赛考试真题库(含答案)
- 2022版义务教育(道德与法治)课程标准(附课标解读)
- 思想道德与法治第二章
- 相似三角形常见模型(总结)
评论
0/150
提交评论