1、C语语言程序言程序设计设计第第4章章 循环结构循环结构2本章主要本章主要内内容容 1.循循环结构设计环结构设计理念理念 2.for循循环语环语句句 3.while循循环语环语句句 4.dowhile循循环语环语句句 5.循循环环嵌套嵌套 6.流程控制流程控制语语句句3循循环结构环结构程序程序设计设计所谓循环是指使用一定条件对同一个程序段重复执行所谓循环是指使用一定条件对同一个程序段重复执行若干次。被重复执行的部分称为循环体。若干次。被重复执行的部分称为循环体。循环设计步骤循环设计步骤:step1:构造循环体构造循环体step2:寻找控制循环的变量寻找控制循环的变量step3:找出控制循环变量的
2、找出控制循环变量的3个要素:初值、继个要素:初值、继续循环的条件、使循环趋于结束的部分。续循环的条件、使循环趋于结束的部分。4循循环环控制控制的的两种两种方法方法标志法标志法 主要用在循环次数不确定的情况下。基本思主要用在循环次数不确定的情况下。基本思想是:设置一个标志变量,标志变量的值随想是:设置一个标志变量,标志变量的值随着循环发生变化。每循环一次,就测试一次着循环发生变化。每循环一次,就测试一次标志变量的值,当标志变量的值满足指定条标志变量的值,当标志变量的值满足指定条件时,结束循环件时,结束循环。计数法计数法 主要用在循环次数确定的情况下。基本思想主要用在循环次数确定的情况下。基本思想
3、是是:设置一计数变量,称为计数器。循环开设置一计数变量,称为计数器。循环开始前给出初始值,每循环一次,计数变量增始前给出初始值,每循环一次,计数变量增1(即计一次数),直到计数变量的值到达(即计一次数),直到计数变量的值到达指定次数。指定次数。5C循循环环语语句句for语句while语句do-while语句6for语句语句语法形式:语法形式:for(表达式表达式1;表达式;表达式2;表达式;表达式3)循环体;循环体;执行过程:执行过程:step1:先求解表达式先求解表达式1,表达,表达式式1只执行一次,一般是赋值只执行一次,一般是赋值语句,用于初始化循环变量。语句,用于初始化循环变量。step
4、2:求解表达式求解表达式2,若为,若为0(假),则退出循环执行后续语假),则退出循环执行后续语句。若为非句。若为非0(真),则执行(真),则执行循环体。循环体。step3:执行表达式执行表达式3。Step4:转回转回step2继续判断。继续判断。7for语句应用实例语句应用实例【例例4.1】在屏幕上显示一行在屏幕上显示一行6个个*。核心语句:核心语句:for(i=1;i=6;i+)printf(*);执行次数执行次数循环变量循环变量i值值循环条件循环条件i=6循环体执行循环体执行表达式表达式3第第1次循环次循环i=1真真*i=2第第2次循环次循环i=2真真*i=3第第3次循环次循环i=3真真*
5、i=4第第4次循环次循环i=4真真*i=5第第5次循环次循环i=5真真*i=6第第6次循环次循环i=6真真*i=7第第7次循环次循环i=7假假循环结束循环结束8for语句应用实例语句应用实例【例例4.2】求求1+2+3+100的累加和。的累加和。#include stdio.h#include stdio.hvoid main()void main()int i,sum=0;int i,sum=0;for(i=1;i=100;i+)for(i=1;i100)if(i100)break;break;sum+=i;sum+=i;i+;i+;for(i=1;i=100;sum+=i,i+);for(
6、i=1,j=10;ij;i+,j-)printf(%3d,i+j);11while语句语句语法形式:语法形式:while(while(表达式表达式)循环体;循环体;执行过程:执行过程:step1:求解表达式,若求解表达式,若为为0(假),则退出循(假),则退出循环执行后续语句。若环执行后续语句。若为非为非0(真),则执行(真),则执行循环体。循环体。step2:转回转回step1继续继续判断。判断。表达式?表达式?循环体循环体非非0(0(真真)0(0(假假)后续语句后续语句12while语句应用实例语句应用实例【例例4.3】从键盘上读入一个非从键盘上读入一个非0的整数,统计该数的的整数,统计该
7、数的位数。位数。#includestdio.h#includestdio.hvoid main()void main()int count=0,number;int count=0,number;printf(Please enter an integer:);printf(Please enter an integer:);scanf(%d,&number);scanf(%d,&number);if(number0)number=-number;if(number0)number=-number;while(number!=0)while(number!=0)count+;count+;nu
8、mber=number/10;number=number/10;printf(It contains%d digits.n,count);printf(It contains%d digits.n,count);语句功能语句功能?13while语句应用实例语句应用实例【例例4.4】计算表达式计算表达式a+aa+aaa+aaaa,其中,其中a与与x的值从的值从键盘上输入。键盘上输入。int a,x;int a,x;long sum=0,n=1,tn;long sum=0,n=1,tn;scanf(%d,%d,&a,&x);scanf(%d,%d,&a,&x);tn=a;tn=a;while(n=
9、x)while(n=x)sum+=tn;sum+=tn;tn=tntn=tn*10+a;10+a;n+;n+;循环次数循环次数循环条件循环条件sumsum值值tntn值值n n值值第第1 1次次1=41=4为真为真0+20+22 2*10+210+22 2第第2 2次次2=42=4为真为真2+222+222222*10+210+23 3第第3 3次次3=43=4为真为真24+22224+222222222*10+210+24 4第第4 4次次4=44=4为真为真246+2222246+222222222222*10+210+25 5第第5 5次次5=45=4为假为假14想一想?想一想?whil
10、e(c=getchar()!=Y|c!=y|c!=N|c!=n);while(1);while(i);while(!i);15dowhile语句语句语法形式:语法形式:do 循环体;循环体;while(表达式表达式);执行过程:执行过程:step1:step1:执行执行dodo后面循环体后面循环体中的语句;中的语句;step2:step2:求解求解whilewhile后圆括后圆括号内的表达式。若为号内的表达式。若为0 0(假),执行假),执行step3step3;若为;若为非非0 0(真),转去继续执(真),转去继续执行循环体。行循环体。step3:step3:退出退出do-whiledo-w
11、hile循循环,执行后续语句。环,执行后续语句。表达式?表达式?循环体循环体非非0(0(真真)0(0(假假)后续语句后续语句16dowhile语句应用实例语句应用实例【例例4.5】编写含有菜单的算术四则运算程序。编写含有菜单的算术四则运算程序。dodo printf(n math exercise);printf(n math exercise);printf(n please enter your choice and numbers);printf(n please enter your choice and numbers);scanf(%d%dscanf(%d%d,&x,&y);,&x
12、,&y);op=getchar();op=getchar();getchar();getchar();switch(op)switch(op)case 1:printf(n add is%d,x+y);break;case 1:printf(n add is%d,x+y);break;default:printf(n error.choice again n);break;default:printf(n error.choice again n);break;while(op!=5);while(op!=5);17循环嵌套循环嵌套 循环语句可以嵌套。在循环体语句中又包含另一循环语句可以嵌套。
13、在循环体语句中又包含另一个完整的循环结构的形式,称为循环的嵌套。个完整的循环结构的形式,称为循环的嵌套。嵌套在循环体内的循环称为内循环,外面的循环嵌套在循环体内的循环称为内循环,外面的循环称为外循环。称为外循环。如果内循环体中又有嵌套的循环语句,则构成多如果内循环体中又有嵌套的循环语句,则构成多重循环。重循环。for、while、do-while循环语句既可以并列,也循环语句既可以并列,也可以相互嵌套,但要层次清楚,不能出现交叉可以相互嵌套,但要层次清楚,不能出现交叉 。18循环嵌套的原则循环嵌套的原则对于多重循环,特别要注意给与循环有关的变量赋对于多重循环,特别要注意给与循环有关的变量赋初值
14、的位置;初值的位置;内、外循环变量不能出现循环控制混乱,导致死循内、外循环变量不能出现循环控制混乱,导致死循环或计算结果错误;环或计算结果错误;应正确编写内、外循环的循环体,需要在内循环中应正确编写内、外循环的循环体,需要在内循环中执行的所有语句必须用执行的所有语句必须用括起来组成复合语句作为括起来组成复合语句作为内循环体;属于外循环的语句应放在内循环体之外内循环体;属于外循环的语句应放在内循环体之外、外循环体之内;、外循环体之内;不应在循环中执行的操作应放在进入最外层循环之不应在循环中执行的操作应放在进入最外层循环之前或最外层循环结束之后;前或最外层循环结束之后;19循环嵌套应用举例循环嵌套
15、应用举例【例例4-6】打印九九乘法表。打印九九乘法表。1 1*1=11=12 2*1=2 21=2 2*2=42=43 3*1=3 31=3 3*2=6 32=6 3*3=93=94 4*1=4 41=4 4*2=8 42=8 4*3=12 43=12 4*4=164=165 5*1=5 51=5 5*2=10 52=10 5*3=15 53=15 5*4=20 54=20 5*5=255=256 6*1=6 61=6 6*2=12 62=12 6*3=18 63=18 6*4=24 64=24 6*5=305=307 7*1=7 71=7 7*2=14 72=14 7*3=21 73=21
16、7*4=28 74=28 7*5=35 75=35 7*6=426=428 8*1=8 81=8 8*2=16 82=16 8*3=24 83=24 8*4=32 84=32 8*5=40 85=40 8*6=48 86=48 8*7=567=569 9*1=9 91=9 9*2=18 92=18 9*3=27 93=27 9*4=36 94=36 9*5=45 95=45 9*6=54 96=54 9*7=64 97=64 9*8=72 98=72 9*9=819=81for(i=1;i=9;i+)for(i=1;i=9;i+)for(j=1;j=i;j+)for(j=1;j=i;j+)pr
17、intf(%d printf(%d*%d=%-4d,i,j,i%d=%-4d,i,j,i*j);j);printf(printf(nn););i=1i=1j=1j=1输出:输出:1 1*1=1 1=1 换行换行i=2i=2j=1j=1输出:输出:2 2*1=2 1=2 换行换行j=2j=2输出:输出:2 2*2=4 2=4 换行换行i=9i=9j=1j=1输出:输出:9 9*1=9 1=9 换行换行j=2j=2输出:输出:9 9*2=18 2=18 换行换行j=9j=9输出:输出:9 9*9=81 9=81 换行换行20循环嵌套应用举例循环嵌套应用举例【例例4.74.7】抓交通肇事犯。一辆卡车
18、违反交通规则,撞人后逃跑。现场有三抓交通肇事犯。一辆卡车违反交通规则,撞人后逃跑。现场有三人目击事件,但都没有记住车号,只记下车号的一些特征。甲说:牌照的前人目击事件,但都没有记住车号,只记下车号的一些特征。甲说:牌照的前两位数字是相同的;乙说:牌照的后两位数字是相同的,但与前两位不同;两位数字是相同的;乙说:牌照的后两位数字是相同的,但与前两位不同;丙是数学家,他说:四位的车号刚好是一个整数的平方。请根据以上线索求丙是数学家,他说:四位的车号刚好是一个整数的平方。请根据以上线索求出车号。出车号。for(i=1;i=9;i+)for(i=1;i=9;i+)for(j=0;j=9;j+)for(
19、j=0;j=9;j+)if(i!=j)if(i!=j)k=i k=i*1000+i1000+i*100+j100+j*10+j;10+j;for(c=31;c for(c=31;c*ck;c+);ck;c+);if(c if(c*c=k)printf(Lorry-No.is%d.n,k);c=k)printf(Lorry-No.is%d.n,k);21循环嵌套应用举例循环嵌套应用举例【例例4.84.8】从键盘上输入从键盘上输入n n的值为的值为5 5,编程打印具有如下,编程打印具有如下规律的对称图形。规律的对称图形。行号(行号(i i)空格数(空格数(j j)个数(个数(k k)-2-2 2
20、2 1 1 -1 -1 1 1 3 3 0 0 0 0 5 5 1 1 1 1 3 3 2 2 2 2 1 1 fabs(i)fabs(i)n-2n-2*fabs(i)fabs(i)#includestdio.h#includestdio.h#includemath.h#includemath.hvoid main()void main()int i,j,k,n;int i,j,k,n;printf(printf(请输入一个小于大于请输入一个小于大于2 2且小于且小于8080的奇数:的奇数:););scanf(%d,&n);scanf(%d,&n);for(i=-n/2;i=n/2;i+)fo
21、r(i=-n/2;i=n/2;i+)for(j=1;jfabs(i);j+)for(j=1;jfabs(i);j+)printf();printf();for(k=1;kn-2 for(k=1;kn-2*fabs(i);k+)fabs(i);k+)printf();printf();printf(n);printf(n);可以从可以从0 0开始吗?开始吗?22流程控制语句流程控制语句 在循环结构中,循环体一般都要执行到循环条件在循环结构中,循环体一般都要执行到循环条件不成立的时候才会退出循环。但是解决实际问题时,不成立的时候才会退出循环。但是解决实际问题时,常遇到一些特殊的情况需要中途退出循环
22、体,或者某常遇到一些特殊的情况需要中途退出循环体,或者某次循环时不希望执行循环体中的某些语句,这时就需次循环时不希望执行循环体中的某些语句,这时就需要使用到流程控制语句。要使用到流程控制语句。breakbreak语句语句:终止循环语句,使程序执行跳出循终止循环语句,使程序执行跳出循环体。环体。continuecontinue语句语句:中断循环体的本次执行(跳过循环中断循环体的本次执行(跳过循环体中尚未执行的语句),立即开始执行下一次循环。体中尚未执行的语句),立即开始执行下一次循环。23break语句语句 语句形式为:语句形式为:break;break;表达式表达式2 2?part1part1
23、非非0(0(真真)0(0(假假)后续语句后续语句表达式表达式1 1表达式表达式3 3结束表达式结束表达式?非非0(0(真真)0(0(假假)forforpart2part2for(for(表达式表达式1;1;表达式表达式2;2;表达式表达式3)3)part1;part1;if(if(结束表达式结束表达式)break;)break;part2;part2;后续语句;后续语句;24break语句应用举例语句应用举例 【例例4.94.9】输入一个正整数输入一个正整数m m,判断它是否为素数。素,判断它是否为素数。素数就是只能被数就是只能被1 1和自身整除的正整数,和自身整除的正整数,1 1不是素数,不
24、是素数,2 2是素是素数。数。#includestdio.h#includestdio.h#includemath.h#includemath.hvoid main()void main()int i,m,n;int i,m,n;printf(Enter a number:);printf(Enter a number:);scanf(%d,&m);scanf(%d,&m);n=(int)sqrt(m);n=(int)sqrt(m);for(i=2;i=n;i+)for(i=2;in)printf(%d is a prime number!n,m);if(in)printf(%d is a p
25、rime number!n,m);else printf(%d is not a prime number!n,m);else printf(%d is not a prime number!n,m);25continue语句语句 语句形式为:语句形式为:continue;continue;for(for(表达式表达式1;1;表达表达式式2;2;表达式表达式3)3)part1;part1;if(if(结束表达式结束表达式)continue;continue;part2;part2;后续语句;后续语句;while(while(表达式表达式)part1;part1;if(if(结束表达式结束表达式
26、)continue;)continue;part2;part2;后续语句;后续语句;dodo part1;part1;if(if(结束表达式结束表达式)continue;)continue;part2;part2;while(while(表达式表达式););后续语句后续语句;part1part1非非0(0(真真)后续语句后续语句part2part2结束表达式?结束表达式?0(0(假假)whilewhile非非0(0(真真)表达式?表达式?0(0(假假)26算法解析算法解析 【例例4.114.11】计算计算1-1/2+1/3-1/4+.+1/99-1/1001-1/2+1/3-1/4+.+1/9
27、9-1/100的前的前n n项的值,项的值,n n从键盘输入,从键盘输入,n n大于大于1 1,小于,小于100100。int n,i,flag=1;int n,i,flag=1;double sum=0.0;double sum=0.0;printf(nn=);printf(nn=);while(1)while(1)scanf(%d,&n);scanf(%d,&n);if(n1&n1&n100)break;else printf(“data error!input again!n”);else printf(“data error!input again!n”);for(i=1;i=n;i+
28、)for(i=1;i=a&c=a&c=A&c=A&c=0&c=0&c=9)number+;else if(c=)space+;else if(c=)space+;else other+;else other+;28算法解析算法解析 【例例4.154.15】百钱百鸡问题。中国古代数学家张丘建在他的百钱百鸡问题。中国古代数学家张丘建在他的算经算经中提出了闻名的中提出了闻名的“百钱买百鸡问题百钱买百鸡问题”:鸡翁一,值钱五,鸡母一:鸡翁一,值钱五,鸡母一,值钱三,鸡雏三,值钱一,百钱买百鸡,问翁、母、雏各几何?,值钱三,鸡雏三,值钱一,百钱买百鸡,问翁、母、雏各几何?int x,y,z,j=0;in
29、t x,y,z,j=0;printf(Following are possible plans:n);printf(Following are possible plans:n);for(x=0;x=20;x+)for(x=0;x=20;x+)for(y=0;y=33;y+)for(y=0;y=33;y+)z=100-x-y;z=100-x-y;if(z%3=0&5if(z%3=0&5*x+3x+3*y+z/3=100)y+z/3=100)printf(%2d:cock=%2d hen=%2d chicken=%2dn,+j,x,y,z);printf(%2d:cock=%2d hen=%2d
30、 chicken=%2dn,+j,x,y,z);29算法解析算法解析 【例例4.164.16】猜数游戏。猜数游戏。使用随机数函数需要包含头文件使用随机数函数需要包含头文件stdlib.hstdlib.h。函数函数rand()rand()是随机数生成器,可以设定生成数的范围,如生成是随机数生成器,可以设定生成数的范围,如生成A A与与B B之间的随机整数之间的随机整数i i(AA随机数随机数i Bi num)printf(Wrong!Too big!n);if(guessnum)printf(Wrong!Too big!n);else if(guessnum)printf(Wrong!Too s
31、mall!n);else if(guessnum)printf(Wrong!Too small!n);else printf(Right!n);else printf(Right!n);while(guess!=num);while(guess!=num);printf(Count=%dn,count);printf(Count=%dn,count);30|语句语句while(!E);while(!E);中的表达式!中的表达式!E E等价于等价于 A)E=0 B)E!=1 C)E!=0 D)E=1 A)E=0 B)E!=1 C)E!=0 D)E=1|下面程序段的运行结果是下面程序段的运行结果是
32、_。a=1;b=2;c=2;a=1;b=2;c=2;while(abc)t=a;a=b;b=t;c-;while(abc)t=a;a=b;b=t;c-;printf(%d,%d,%d,a,b,c);printf(%d,%d,%d,a,b,c);A)1,2,0 B)2,1,0 C)1,2,1 D)2,1,1A)1,2,0 B)2,1,0 C)1,2,1 D)2,1,1|下面程序段的运行结果是下面程序段的运行结果是_。x=y=0;x=y=0;while(x15)y+;x+=+y;while(x10&x10&x50)x+;x+;if(x/3)x+;break;else continue;if(x/3
33、)x+;break;else continue;printf(%dn,x);printf(%dn,x);|执行以下程序后,输出执行以下程序后,输出#号的个数是号的个数是_。main()main()int i,j;int i,j;for(i=1;i5;i+)for(j=2;j=i;j+)putchar(#);for(i=1;i5;i+)for(j=2;j=i;j+)putchar(#);32复习第四章复习第四章预习第五章预习第五章完成完成习题与上机实践习题与上机实践第四章的习题第四章的习题上机实习内容:上机实习内容:完成完成“三、实验三、实验”的相关内容的相关内容 完成完成“二、习题二、习题(三)编程题(三)编程题”并提交并提交C语语言程序言程序设计设计