《C语言-第5章循环结构.ppt》由会员分享,可在线阅读,更多相关《C语言-第5章循环结构.ppt(44页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第第5章章 循环结构循环结构 n循环的基本要素有三个:循环的基本要素有三个:n循环入口(即循环的初始化条件)循环入口(即循环的初始化条件)n循环出口(即循环的终止条件)循环出口(即循环的终止条件)n循环体(反复执行的部分)循环体(反复执行的部分)n C C语言提供了语言提供了3 3种循环语句实现循环结构种循环语句实现循环结构n5.1 5.1 whilewhile语句语句n5.2 5.2 do-whiledo-while语句语句n5.3 5.3 forfor语句语句 n5.4 5.4 转移语句转移语句n5.5 5.5 举例举例n巩固练习巩固练习图图1.6当型循环结构当型循环结构A当当p为真为真语
2、义语义:计算表达式的值,计算表达式的值,当值为非当值为非0(0(真真)时,执行循环体语句。重复上述操作,时,执行循环体语句。重复上述操作,直到表达式的值为直到表达式的值为0 0(假)时,跳出循环,转而执行(假)时,跳出循环,转而执行whilewhile语句的后续语句。语句的后续语句。5.1while语句语句 nwhile语句的一般形式为:语句的一般形式为:while (while (表达式表达式)语句;语句;图图5.1 while语句的语义语句的语义表达式表达式语句语句sum=0,i=1i=100?sum=sum+ii=i+1输出输出sumwhile(i=100)sum=sum+i;i=i+1
3、;sum=0,i=1i=100?sum=sum+ii=i+1输出输出sum【例例5.1】计计算算 i=n输出输出sumsum=sum+i;i+;图图5.2 例例5.1N-S图图定义变量定义变量i=1,sum=0和和n输入正整数给输入正整数给n/*求求n个自然数的累加和个自然数的累加和*/#include stdio.hmain()int n,i=1,sum=0;printf(Enter a number:);scanf(%d,&n);while(i=n)sum+=i;i+;printf(Sum is%d,sum);sum称为累加称为累加器,使用前要器,使用前要进行初始化,进行初始化,一般初始化
4、为一般初始化为0思考:思考:2.求求1+1/2+1/3+.+1/n3.求求1-1/2+1/3-.-1/n 1.求求使用使用while语句应注意以下几点:语句应注意以下几点:1.while语句中的表达式可以是任意表达式,一般是关语句中的表达式可以是任意表达式,一般是关系表达或逻辑表达式,只要表达式的值为非系表达或逻辑表达式,只要表达式的值为非0(真真)则则继续循环。继续循环。如:如:while(n-)printf(%d,n);2.循环体可以是空语句、单语句或用花括号括起来的复循环体可以是空语句、单语句或用花括号括起来的复合语句。合语句。3.应注意循环条件的选择以避免死循环。例如下列循环应注意循环
5、条件的选择以避免死循环。例如下列循环语句:语句:while(n=10)printf(%d,n+);4.while语句从语法上来说是一条完整的控制语句。语句从语法上来说是一条完整的控制语句。死循环死循环5.允许允许while语句的循环体语句又是语句的循环体语句又是while语句,从语句,从而形成循环嵌套。而形成循环嵌套。如:如:i=1;while(i=9)/*外循环外循环*/j=1;while(j100)sum+=i;使用使用while语句应注意以下几点:语句应注意以下几点:5.2 do-while语句语句ndo-while语句的一般形式为:语句的一般形式为:do 语句;语句;while(表达式
6、表达式);图图5.4 do-while语句的语义语句的语义表达式表达式语句语句语义:语义:先执行循环体语句一次,先执行循环体语句一次,再判别表达式的值,若为非再判别表达式的值,若为非0(0(真真)则则继续执行循环体语句,否则终止循环,继续执行循环体语句,否则终止循环,转而执行转而执行do whiledo while语句后面的语句。语句后面的语句。/*求求n个自然数累加和个自然数累加和*/main()int n,i=1,sum=0;printf(Enter a number:);scanf(%d,&n);do sum+=i;i+;while(i=100);printf(%d,sum);/*求求n
7、个自然数的累加和个自然数的累加和*/#include stdio.hmain()int n,i=1,sum=0;printf(Enter a number:);scanf(%d,&n);while(i=n)sum+=i;i+;printf(Sum is%d,sum);注意观察注意观察【例例5.3】一个人口统计程序,一个人口统计程序,1980年世界人口已达年世界人口已达45亿,按年亿,按年增长率增长率1%计算,问什么年份开始世界人口突破计算,问什么年份开始世界人口突破100亿大关。亿大关。#include“stdio.h”main()int year=1980;double rate=0.01,
8、p=4.5e+09;do p=p*(1+rate);year+;while(p1e+10);printf(year=%d,%en,year,p);while(p1e+10)p=p*(1+rate);year+;初值:年:初值:年:year=1980人口:人口:p=4.5e+09以后每年的人口:以后每年的人口:p=p*(1+0.01)5.3 for语句语句n一般形式为:一般形式为:for(表达式表达式1;表达式;表达式2;表达;表达3)语句语句 n执行过程:执行过程:计算表达式计算表达式1的值,为循环变量赋初值。的值,为循环变量赋初值。计算表达式计算表达式2的值,若值为非的值,若值为非0(真真)
9、,则执行循环体一,则执行循环体一次,否则跳出循环。次,否则跳出循环。计算表达式计算表达式3的值,转回第的值,转回第步重复执行。步重复执行。表达式表达式2语句语句图图5.5 for语句的语义语句的语义表达式表达式1表达式表达式3如如:sum=0;for(k=1;k=100;k+)sum+=k;赋值赋值控制循控制循环结束环结束循环变循环变量增值量增值或减值或减值#include“stdio.h”main()int n,i=1,sum=0;printf(“Enter a number:”);scanf(“%d”,&n);while(i=n)sum+=i;i+;printf(Sum is d,sum)
10、;例:求例:求n个自然数的累加和个自然数的累加和do sum+=i;i+;while(i=n);for(i=1;i=n;i+)sum+=i;【例例5.4】编程计算正整数编程计算正整数1到到n中的奇数之和以及偶数之和。中的奇数之和以及偶数之和。#include“stdio.h”main()int i,n,o_sum,e_sum;scanf(%d,&n);e_sum=0;o_sum=0;for(i=1;i=n;i+)if(i%2=0)e_sum+=i;else o_sum+=i;printf(o_sum=%d,e_sum=%dn,o_sum,e_sum);输入输入ni=n定义变量定义变量i,n,e
11、_sum,o_sume_sum+=ii=1非非00i%2=0o_sum+=i输出输出e_sum和和o_sume_sum=0;o_sum=0;图图5.6 例例5.4N-S图图i+注意:注意:n 三个表达式均可省略,但两个分号不能省略。三个表达式均可省略,但两个分号不能省略。q省略表达式省略表达式1:此时必须在此时必须在for语句之前给循环变量赋语句之前给循环变量赋初值。初值。如:如:k=1;for(;k=100)break;q省略表达式省略表达式3:应另设法使循环正常执行。应另设法使循环正常执行。如:如:for(k=1;k=100;)s+=k;k+;q全省略全省略:“死循环死循环”如:如:for
12、(;)sum+=k;关于:关于:for(表达式表达式1;表达式;表达式2;表达;表达3)语句语句 n循环体也可以省略,但分号不可省略。循环体也可以省略,但分号不可省略。“;”代表空语句,代表空语句,表示不执行任何操作,但在语法上不可少。表示不执行任何操作,但在语法上不可少。如:如:for(k=1;k=10000;k+);n表达式表达式1和和3还可包含与循环变量无关的其它表达式。还可包含与循环变量无关的其它表达式。如:如:for(s=0,k=1;k=100;k+,s=s+k);for(k=0;k=100;k+,k+)s+=k;n表达式表达式2可为任意表达式,只要值为非零,就执行循环体。可为任意表
13、达式,只要值为非零,就执行循环体。如:如:for(k=0;(c=getchar()!=n;k+);for(;(c=getchar()!=n;)printf(“%c”,c);思考:使用三种循环语句实现:思考:使用三种循环语句实现:1+2*2+3*3+100*100 关于:关于:for(表达式表达式1;表达式;表达式2;表达;表达3)语句语句 n三种循环语句可相互嵌套,构成多重循环。三种循环语句可相互嵌套,构成多重循环。for()while()do for()while();while()for()for()for()for(i=1;i=2;i+)j=1;while(j=5)printf(“%d”
14、,j);printf(“n”);【例例5.6】有有1、2、3三个数字,编写程序输出由这三个数三个数字,编写程序输出由这三个数组成的互不相同且无重复数字的两位数。即输出:组成的互不相同且无重复数字的两位数。即输出:12,13,21,23,31,32。#include“stdio.h”main()int i,j,k;printf(n);for(i=1;i4;i+)*二重循环二重循环*/for(j=1;j4;j+)if(i!=j)/*确保确保i、j两位互不相同两位互不相同*/printf(%d%dn,i,j);三位数?三位数?三位数?三位数?【例例5.7】编程打印三角形表示编程打印三角形表示(黑色区
15、域黑色区域)的的九九乘法表九九乘法表*1 2 3 4 5 6 7 8 91 12 2 43 3 6 9 4 4 8 12 165 5 10 15 20 256 6 12 18 24 30 367 7 14 21 28 35 42 498 8 16 24 32 40 48 56 649 9 18 27 36 45 54 63 72 81#include stdio.hmain()int i,j,p;for(i=1;i=9;i+)for(j=1;j=i;j+)p=i*j;printf(%4d,p);printf(“n”);/换行换行n一般形式为:一般形式为:break;qbreak语句只能用在语句
16、只能用在switch 语句或循环语句中语句或循环语句中q作用作用:跳出跳出switch语句或跳出本层循环,转去执语句或跳出本层循环,转去执行后面的程序语句。行后面的程序语句。main()int i,s;s=0;for(i=1;i5)break;printf(“s=%dn”,s);5.4 转移语句转移语句-break语句语句 n一般格式是:一般格式是:continue;n语义:结束语义:结束本次本次循环,即不再执行循环体中循环,即不再执行循环体中continue 语句之后的语句,转入语句之后的语句,转入下一次下一次循环条循环条件的判断与执行。件的判断与执行。n注意(注意(1)只能用在循环体中)只
17、能用在循环体中,(2)只结束本层本次的循环,并不跳出循环。)只结束本层本次的循环,并不跳出循环。#include stdio.hmain()int k=0,s=0,i;for(i=1;i2)continue;k=k+s;printf(s=%d,k=%dn,s,k);5.4 转移语句转移语句-continue语句语句例:打印例:打印1-1001-100之内能被之内能被7 7整除的数整除的数#include“stdio.h”main()int n;for (n=1;n=100;n+)if(n%7)=0)printf(“%d ”,n);思考:如何控思考:如何控制每行打印制每行打印5个个数数(n%7)
18、!=0)continue;【例例5.11】打印打印fibonacci数列数列:1,1,2,3,5,8,13,21,的的前前36个数个数分析分析:由题意可得下由题意可得下列递推公式列递推公式:F1=1 F2=1 Fn=Fn-1+Fn-2 (n=336)#include stdio.hmain()long f1,f2;int i;f1=1;f2=1;for(i=1;i=18;i+)printf(%12ld%12ld,f1,f2);if(i%2=0)printf(n);f1=f1+f2;f2=f2+f1;一行打印一行打印4个数个数本本 章章 举举 例例 本本 章章 举举 例例【例例5.12】有一个古
19、老的传说有一个古老的传说(棋盘上的麦粒棋盘上的麦粒):有一位宰相:有一位宰相发明了国际象棋,国王打算奖赏他。国王问他想要什么,宰发明了国际象棋,国王打算奖赏他。国王问他想要什么,宰相对国王说:相对国王说:“陛下,请您在棋盘上的第一小格里,赏给我陛下,请您在棋盘上的第一小格里,赏给我1粒麦子,第粒麦子,第2个小格里给个小格里给2粒,第粒,第3个小格里给个小格里给4粒,以后每粒,以后每一小格给的麦子都是前一小格的一小格给的麦子都是前一小格的2倍。您像这样把棋盘上的倍。您像这样把棋盘上的64个小格用麦粒摆满,就把这些麦粒赏给我吧!个小格用麦粒摆满,就把这些麦粒赏给我吧!”请问国王请问国王需要拿出多少
20、麦粒?需要拿出多少麦粒?答案:答案:1.84467*1019#include“stdio.h”main()int i;double p,sum;p=1,sum=1;for(i=1;i=n,则,则说明说明for 语句是正语句是正常退出,即常退出,即m不不能被能被2n-1之间的之间的任何数整除任何数整除#include stdio.hmain()int n,i;scanf(%d,&n);for(i=2;i=n )printf(%4d is primen,n);只要只要n能被能被2n-1之间的任何之间的任何一个数整除立一个数整除立即退出循环即退出循环【例例5.16】输出输出2100以内的素数。以内的
21、素数。【例例例例5.165.16】:判断一个整数判断一个整数判断一个整数判断一个整数n n是否是素数是否是素数是否是素数是否是素数(只能被(只能被(只能被(只能被1 1和本身整除的数称为和本身整除的数称为和本身整除的数称为和本身整除的数称为素素素素数)数)数)数)如果如果i=k,则,则说明说明for 语句是正语句是正常退出,即常退出,即m不不能被能被2k之间的之间的任何数整除任何数整除#include stdio.hmain()int n,i;scanf(%d,&n);for(i=2;i=n )printf(%4d is primen,n);其实循环只需其实循环只需从从2到到n的平方的平方根就
22、可以了。根就可以了。【例例5.16】输出输出2100以内的素数。以内的素数。k=sqrt(n);kk,k;【例例例例5.165.16】:判断一个整数判断一个整数判断一个整数判断一个整数n n是否是素数是否是素数是否是素数是否是素数(只能被(只能被(只能被(只能被1 1和本身整除的数称为和本身整除的数称为和本身整除的数称为和本身整除的数称为素素素素数)数)数)数)#include“math.h”【例例5.16】输出输出2100以内的素数。以内的素数。【例例例例5.165.16】:判断一个整数判断一个整数判断一个整数判断一个整数n n是否是素数是否是素数是否是素数是否是素数(只能被(只能被(只能被
23、(只能被1 1和本身整除的数称为和本身整除的数称为和本身整除的数称为和本身整除的数称为素素素素数)数)数)数)#include stdio.h#include“math.h”main()int n,i,k;scanf(%d,&n);k=sqrt(n);for(i=2;i=k )printf(%4d is primen,n);其实其实n无需输入,无需输入,可以循环取值。可以循环取值。for(n=2;n=100;n+)#include stdio.h#include math.h main()int n,i,k;for(n=2;n=100;n+)if(n!=2&n%2=0)continue;k=s
24、qrt(n);for(i=2;i=k)printf(%dt,n);去掉去掉2以上的所有偶数以上的所有偶数再次优化再次优化行数行数x 前导空格数前导空格数a 输出字符个数输出字符个数n 1 3 1 2 2 3 3 1 5 4 0 7 3 1 5 2 2 3 1 3 1 归纳:归纳:x a=4-x n=2*x-1 补充例题补充例题1(习题(习题5.3(6):打印如下图形打印如下图形 *#include stdio.h main()int x,n,a;for(x=1;x=4;x+)for(a=1;a=4-x;a+)printf();for(n=1;n=1;x-)for(a=1;a=4-x;a+)pr
25、intf();for(n=1;n=2*x-1;n+)printf(*);printf(n);*1 222 33333 4444444 33333 222 1 如果?如果?行数行数x 前导空格数前导空格数a 输出字符个数输出字符个数n 1 3 1 2 2 3 3 1 5 4 0 7 3 1 5 2 2 3 1 3 1 归纳:归纳:x a=4-x n=2*x-1(输出数输出数)#include stdio.hmain()int x,n,a;for(x=1;x=4;x+)for(a=1;a=4-x;a+)printf();for(n=1;n=1;x-)for(a=1;a=4-x;a+)printf(
26、);for(n=1;n=2*x-1;n+)printf(*);printf(n);1 222 33333 4444444 33333 222 1printf(%d,x);printf(%d,x);#include stdio.hmain()int x,n,a;for(x=1;x=4;x+)for(a=1;a=4-x;a+)printf();for(n=1;n=1;x-)for(a=1;a=4-x;a+)printf();for(n=1;n=2*x-1;n+)printf(%d,x);printf(n);for(n=1;n0;n-)printf(%d,n);for(n=1;n0;n-)print
27、f(%d,n);1 121 12321 1234321 12321 121 1 又如果?又如果?补充例题补充例题2:从输入的若干个正数中选择最大:从输入的若干个正数中选择最大值,用值,用-1结束输入结束输入#include“stdio.h”main()int x,max=0,i;scanf(“%d”,&x);if(x0&x!=-1)max=x;/*确保输入的第一个数是正数且非确保输入的第一个数是正数且非-1*/do scanf(“%d”,&x);if(xmax)max=x;while(x!=-1);printf(“max=%d”,max);补充例题补充例题3:输入一个多位数字输入一个多位数字,
28、以相反的顺序打以相反的顺序打印该数。如:印该数。如:输入输入3456,输出,输出6543#include“stdio.h”main()int number,right,t=0;printf(“enter your number:n”);scanf(“%d”,&number);do right=number%10;t=t*10+right;number=number/10;while(number!=0);printf(“%dn”,t);1.以下程序中,以下程序中,while循环的循环次数是循环的循环次数是_。main()int i=0:while(i10)if(i1)continue;if(i
29、=5)break;i+:A)1B)10C)6D)死循环,不能确定次数死循环,不能确定次数巩巩巩巩 固固固固 练练练练 习习习习D)死循环,不能确定次数死循环,不能确定次数2.以下程序运行时,从键盘输入:以下程序运行时,从键盘输入:01,程序执,程序执行后输出结果是行后输出结果是_:#include stdio.hmain()char k;int i;for(i=1;i3;i+)scanf(%c,&k);switch(k)case 0:printf(anothern);case 1:printf(numbern);A)anotherB)another C)anotherD)number numb
30、er number number number another number巩巩巩巩 固固固固 练练练练 习习习习A)3.以下程序的输出结果是以下程序的输出结果是_。#include stdio.hmain()int a=0,i;for(i=1;i5;i+)switch(i)case 0:case 3:a+=2;case 1:case 2:a+=3;default:a+=5;printf(%dn,a);A)3l B)13 C)10 D)20巩巩巩巩 固固固固 练练练练 习习习习A)3l4.以下程序的输出结果是以下程序的输出结果是_。#include stdio.hmain()int i=0,a
31、=0;while(i20)for(;)if(i%10)=0)break;else i-;i+=11;a+=i;printf(%dn,a);A)21B)32C)33D)11巩巩巩巩 固固固固 练练练练 习习习习B)325.以下程序的功能是:按顺序读入以下程序的功能是:按顺序读入10名学生名学生4门课程的成绩,门课程的成绩,计算出每位学生的平均分并输出:计算出每位学生的平均分并输出:#include stdio.hmain()int n,k;float score,sum,ave;sum=0.0;for(n=1;n=10;n+)for(k=1;k10&x50)x+;if(x/3)x+;break;
32、else continue;printf(%dn,x);巩巩巩巩 固固固固 练练练练 习习习习17本章小结本章小结语言提供了三种循环语句用于实现循环结构。语言提供了三种循环语句用于实现循环结构。nfor语句一般用于实现语句一般用于实现给定给定循环变量初值,步长循环变量初值,步长增值及循环次数的循环结构。增值及循环次数的循环结构。n当循环次数及循环控制条件要在循环过程中才当循环次数及循环控制条件要在循环过程中才能确定的循环可用能确定的循环可用while或或dowhile语句。语句。n三种循环语句可以相互三种循环语句可以相互嵌套嵌套组成多重循环,循组成多重循环,循环之间可以并列但不能交叉。环之间可
33、以并列但不能交叉。n三种循环语句分析三种循环语句分析q用用while和和dowhile循环时,循环变量的初始循环时,循环变量的初始化操作在循环之化操作在循环之前前进行,而进行,而for循环是在表达式循环是在表达式1中进行的。中进行的。qwhile循环和循环和for循环都是先判断表达式,后执行循环都是先判断表达式,后执行循环体,而循环体,而do-while循环是先执行循环体后判断循环是先执行循环体后判断表达式,也就是说表达式,也就是说do-while的循环体最少被执行的循环体最少被执行一次,而一次,而while 循环和循环和for就不一定了。就不一定了。q这三种循环都可以用这三种循环都可以用br
34、eak语句跳出循环,用语句跳出循环,用continue语句结束本次循环。语句结束本次循环。续。续。n 在结构化程序设计中,三种基本结构并不孤立在结构化程序设计中,三种基本结构并不孤立q在循环结构的循环体中可能出现选择结构、顺在循环结构的循环体中可能出现选择结构、顺序结构;序结构;q在选择结构的内嵌语句中也可能出现循环、顺在选择结构的内嵌语句中也可能出现循环、顺序结构;序结构;q而如果把循环语句和选择语句看成是一条完整而如果把循环语句和选择语句看成是一条完整的语句时,它们本身又是构成顺序结构的一个的语句时,它们本身又是构成顺序结构的一个元素,因此合理使用这三种基本结构,就能实元素,因此合理使用这三种基本结构,就能实现各种算法。现各种算法。续。续。