配色: 字号:
第5章 循环结构
2016-06-21 | 阅:  转:  |  分享 
  
/71#includemain(){ints;floatn,t,pi;t=1,pi=0;n=1
.0;s=1;while(fabs(t)>1e-6){pi=pi+t;n=n+2;
s=-s;t=s/n;}pi=pi4;printf("pi=%1
0.6f\n",pi);}/71例译密码例如Hello,world!译成密码:Lipps,asvph!/7
1#includemain(){charc;while((c=getchar())
!=‘\n’){if((c>=‘a’&&c<=‘z’||c>=‘A’&&c<=‘Z’))
{c=c+4;if((c>=‘Z’&&c<=‘Z’+4||c>=‘z’)c=c-26
}printf(“%c”,c);}}/71【例5
-16】输入任意一个整数,将其逆序输出,例如输入1234,输出4321。include"stdio.h"voidmain(
){ longy,n; scanf("%ld",&y) while(y!=0) {n=y%10;
printf("%ld",n); y=y/10;}}/71【
例5-17】猜数游戏:任意设置一个整数,请用户从键盘上输入数据猜想设值的数是什么,告诉用户是猜大了还是小了。10次以内猜对,用户
获胜。否则,告诉用户设置的数据是什么。#include"stdio.h"voidmain(){intnum=123
,x,n;printf("hint:01;n<=10;n++){printf("guess:");scanf("%d",&x);i
f(x==num){printf("Win!\n");break;}if(x>num)printf("b
igger!\n");if(x==11)printf("Lost!thenumberis%d\n",x);}/711、写出程序运行结果:v
oidmain(){ inti,j,x=0; for(i=0;i<2;i++) {x++;
for(j=0;j<=3;j++) {if(j%2)continue;
x++;}x++;}printf(“x=%d\n”,x);}
运行结果:x=8练习voidmain(){intx=1,y=0,a=0,b=0;switch(x)
{case1:switch(y){case0:a++;break;
case1:b++;break;}
case2:a++;b++;break;case3:a++;b++;}
printf(“a=%d,b=%d\n”,a,b);}运行结果:a=2,b=12、将程序补充完整。以下程序从输入
数据中统计正整数和负整数的个数.用输入0来结束输入.变量i存放正整数个数,变量j存放负整数的个数.voidmain(){
1i,j,n;i=j=0;scanf(“%d”,&n);while(
2){if(n>0)3i
f(n<0)4}printf(“i=%4dj
=%4d\n”,i,j);}/713、编程输出下面的数字金字塔(1到9)。
112112321.…..
12345678987654321/71main(){ inti,j; for(i=1;i<=9;i++
) { for(j=1;j<=20-i;j++) printf("");
for(j=1;j<=i;j++) printf("%d",j); for(j=1;j;j++) printf("%d",i-j); printf("\n"); }}
(1)给累乘器赋初值,一般为1;(2)用循环语句实现累乘;for(循环变量赋初值;循环条件;循环变量改变规律)(3)循环体
设计。累乘器当前值=累乘器原值循环变量当前值;例5-5:求累乘积。如:1×2×3×...×100
基本方法:属于“累乘器”类型问题。累乘器赋初值求n!=1×2×3×…n参考程序:voidmain
(){doubles=1;intk;for(k=1;k<=100;k++)s=sk;
printf("s=%lf",s);}累乘思考整数连乘结果一定是整数,而本例中结果数值相当大,用long型都无法存放
,因此将存放累乘结果的变量s定义为double型。例5-6判断一个数是否为素数?一个数x在[2,sqrt(x)]范围
内没有因子,我们就称其为素数(质数)主要编程方法:循环变量终值法、标记变量法#include"math.h"vo
idmain(){intx,k;scanf("%d",&x);排除法:如果有因子,不再往下判断是否是素数循
环变量终值法for(k=2;k<=sqrt(x);k++)if(x%k==0)break;if(k>sqrt(
x))printf("%disaprime",x);elseprintf("%d
isnotaprime",x);}在判断范围内无因子,程序正常终止有因子,程序非正常终止#includ
e"math.h"voidmain(){intx,k,f=1;scanf("%d",&x);排除法
:如果有因子,不再往下判断是否是素数for(k=2;k<=sqrt(x);k++)if(x%k==0){f=0;bre
ak;}if(f==1)printf("%disaprime",x);else
printf("%disnotaprime",x);}在判断范围内无因子,程序正常终止有因子,程序非正常终
止标记变量法/71例5-7用0--9这十个数字可以组成多少无重复的三位数?编程方法:“枚举法”按问题本身的性质,
一一列举出该问题所有可能的解,并在逐一列举的过程中,检验每个可能的解是否是问题的真正解,若是,我们采纳这个解,否则抛弃它。对于所列
举的值,既不能遗漏也不能重复。/71#include"stdio.h"voidmain()/
a,b,c代表百位、十位、个位/{intx,a,b,c,num=0;/num存放满足条件的数的个数,注意
num要赋初值/for(x=100;x<=999;x++){a=x/100;b=x/10%10;c=x%10;
if(a!=b&&a!=c&&b!=c){num++;printf("%5
d",x);if(num%5==0)printf(“\n”);}}printf("\nnum
ber=%d",num);}/71编程方法:“递推法”例5-8裴波那契数列的第1、2项分别为1、1,以后各
项的值均是其前两项之和。求前30项菲波那契数。所谓递推法就是从初值出发,归纳出新值与旧值间的关系,直到求出所需值为止。新值的求出
依赖于旧值,不知道旧值,无法推导出新值。数学上递推公式正是这一类问题。/71f1--第一个数f2--第二个数
f3--第三个数f1=1;f2=1;f3=f1+f2;以后只要改变f1,f2的值,即可求出下一个数.f
1=f2;f2=f3;f3=f1+f2;递推/71voidmain(){longf1=1,f2=1,f3;
intk;参考程序:printf("%ld\t%ld\t",f1,f2);for(k=3;k<=30;k++)
{f3=f1+f2;printf("%ld\t",f3);f1=f2;f2=f3;}
}注意f1、f2、f3、x的类型递推/715.4goto、break和continue语句1、goto语句形式:
goto语句标号;例如:gotolabel;
……label:…...语句标号用标识符表示,它的定名规则与变量名相同。2、语句执行流程:在程序执行过
程中,如果遇到goto语句,则程序执行流程无条件地转向语句标号后的语句继续执行。/71例用if和goto语句构成循环,
求#includemain(){inti,sum=0;i=1;loop:i
f(i<=100){sum+=i; i++; gotoloop;}prin
tf("%d",sum);}sum=0+1sum==1+2=3sum=3+3=6sum=6+4……sum=4950+
100=5050循环初值循环终值循环变量增值循环条件循环体/713、说明语句标号仅仅对goto语句
有效,对其它语句不影响。同一个程序中,不允许有同名标号。goto语句通常与条件语句配合使用。可用来实现条件转移、构成循环、
跳出循环体等功能不能用整数作标号只能出现在goto所在函数内,且唯一只能加在可执行语句前面限制使用goto语句/71
【例5-9】分析下面程序的运行结果:#include"stdio.h"
voidmain() {charc;loop:c=getchar();
if(c==''\n'')gotoend;putchar(c);
gotoloop;end:printf("Theend\n");}程序运行情况
为:123asd↙123asdTheend#includemain(){
intnumber,sum=0;read_loop:scanf("%d",&number); if(!nu
mber)gotoprint_sum; sum+=number; gotoread_l
oop;print_sum:printf("Thetotalsumis%d\n",sum);}例从键盘输入一组
数据,以0结束输入,求数据和/714.break语句(1)语句形式:break;(2)作用:
结束break所在的switch语句。结束当前循环,跳出break所在的循环结
构。expr2……break;…...假(0)真(非0)forexpr1expr3switchexpr语
句组1break;语句组2break;语句组nbreak;语句组break;…...const1const
2constndefaultcase/71【例5-10】求300以内能被17整除的最大的数。#include
"stdio.h"voidmain(){intx,k;for(x=300;x>=1;x--)if(x%1
7==0)break;printf("x=%d\n",x);}找到满足条件的最大数,结束循环/71例br
eak举例:小写字母转换成大写字母,直至输入非字母字符#includemain(){int
i,j;charc;while(1){c=getchar(); if
(c>=''a''&&c<=''z'') putchar(c-''a''+''A''); else break;
}}/71例break举例:输出圆面积,面积大于100时停止#definePI3.14159main(
){intr;floatarea;for(r=1;r<=10;r++){area
=PIrr;if(area>100) break;printf("r=%d,area=%
.2f\n",r,area);}}/71(1)语句形式:continue;(2)语
句作用:结束本次循环。5、continue语句(3)语句执行流程:continu
e语句可以结束本次循环,即不再执行循环体中continue语句之后的语句,转入下一次循环条件的判断与执行。/71expr
……continue;……假(0)真(非0)while真(非0)do……continue;…...expr
假(0)whileexpr2……continue;…...假(0)真(非0)forexpr1expr3/
71【例5-11】求300以内能被17整除的所有整数。#include"stdio.h"voidmain()
{intx,k;for(x=1;x<=300;x++){if(x%17!=0)continue;
printf("%d\t",x);}}/71例求输入的十个整数中正数的个数及其
平均值#includemain(){inti,num=0,a;floatsum=
0;for(i=0;i<10;i++){scanf("%d",&a); if(a<=0)cont
inue; num++; sum+=a;}printf("%dplusinteger''ssum
:%6.0f\n",num,sum);printf("Meanvalue:%6.2f\n",sum/num);}
/71while(条件){语句A;break;语句B;}真语句B条件语句Abreak
假结束循环6、break语句与continue语句的区别至此位置/71while(条件){语句A;co
ntinue;语句B;}真语句B条件语句Acontinue假结束循环至此位置/71#inc
lude"stdio.h"voidmain(){inta,b;for(a=1,b=1;a<=10;a++)
{ if(b>=10)break; if(b%3==1){b+=3;conti
nue;}}printf("%d\n",a);}【例5-12】分析以下程序的运行结果。程序运行结果:
4/71在循环体语句中又包含有另一个完整的循环结构的形式,称为循环的嵌套。如果内循环体中又有嵌套的循环语句,则构成
多重循环。5.5循环的嵌套嵌套在循环体内的循环体称为内循环,外面的循环称为外循环。while、do-while、for三
种循环都可以互相嵌套。/71循环语句之间的关系for(...){...for(...){...}..
.}内循环外循环for(....){...}for(...){...}并列循环嵌套循环交叉循环for
(....){...for(...){...}}错误/71真真外循环初始条件内循环初始条件内循环
体外循环条件假内循环条件假修改内循环条件修改外循环条件循环结束二重循环嵌套结构执行流程/71例循环嵌套
,输出九九表12345678912345678924681012141618
36912151821242791827364554637281……………..ij#i
ncludemain(){inti,j;for(i=1;i<10;i++)
printf("%4d",i);printf("\n---------------------------------
------\n");for(i=1;i<10;i++)for(j=1;j<10;j++) pr
intf((j==9)?"%4d\n":"%4d",ij);}例5-13:输出图形:

编程分析:采用双重循环,一行一行输出。每一行输出步骤:一般3步。1)光标定位3)每输完一行光标换行(\n)2)输
出图形。例如本题:共4行,若行号用k表示,则每一行有2k-1个号。#include"stdio.h
"voidmain(){intk1,k2;for(k1=1;k1<=4;k1++){putchar(‘
\t’);for(k2=1;k2<=k1;k2++)putchar(‘\b’);for(k2=1;k2<
=k12-1;k2++)putchar(‘’);putchar(‘\n’);}}定位(还可以用空格的方
法)输出inti,j;for(i=0;i<6;i++){ for(j=0;j<5-i;j++) prin
tf(“”); for(j=0;j/715.6复合结构程序设计举例【例5-14】求#include"stdio
.h"voidmain(){floats=0,f1=2,f2=1,f=1,t,n;/累加器赋初值/
for(n=1;n<=10;n++){s=s+ff1/f2;/累加器当前值=累加
器原来的值+新的要加的数据/f=f(-1);t=f2;f2=f1;f1=f1+t;
/为求下一个要加的数据做准备/}printf("s=%f\n",s);}/71第五章循环结构5
.1while语句5.2do-while语句5.3for语句5.4break、continue和goto语句5.5
循环的嵌套5.6复合结构程序设计举例/71在C语言中可以用以下语句来实现循环:1.用goto语句和if
语句构成循环;2.用while语句;3.用do--while语句;4.用for语句。循
环:就是在给定的条件成立时反复执行某一程序段,被反复执行的程序段称为循环体。/715.1while语句真(非零)表达式
循环体假(零)1、while语句的形式:while(表达式)循环体;
2、while语句常称为“当型”循环语句。/71例用while循环求#include
main(){inti,sum=0;i=1;while(i<=100){sum=su
m+i;i++;}printf("%d",sum);}循环初值循环终值循环变量增值循
环条件循环体/71例显示1~10的平方#includemain(){inti=1;
while(i<=10){printf("%d%d=%d\n",i,i,ii);i++
;}}运行结果:11=122=433=944=1655=2566=3677=4988
=6499=811010=100/713、说明:先判断表达式,后执行语句。循环体有可能一次也不执行表达式同if语
句后的表达式一样,可以是任何类型的表达式。循环体多于一句时,用一对{}括起。下列情况,退出while循环条件
表达式不成立(为零)循环体内遇break,return,goto无限循环:while(1)
循环体/71例:分析下列程序段的循环次数i=1;
while(i<=100)putchar(‘’)
;i++;
/71#include"stdio.h"voidmain(){floatx;scanf("%f",&x
);【例5-1】输入一系列整数,判断其正负号,当输入0时,结束循环。输入数据,为第一次判断做准备while(x!=0)
判断是否结束{if(x>0)printf("+");elseprintf("-");
scanf("%f",&x);}判断正负号/71#include"stdio.h"voidmain
(){charch;intnum=0;ch=getchar();【例5-2】统计从键盘输入的一行字符的个数(
以回车键作为输入结束标记)。while(ch!=''\n'')判断是否输入结束{num++;ch=getch
ar();}printf("num=%d\n",num);}/71注意表达式在判断前,必须要有明确
的值。循环体中一般有改变条件表达式的语句。while(表达式)后面没有分号。/715.2do--while语句
1、do--while的形式:do{循环体;}while(表达式);2、do--
while语句常称为“直到型”循环语句。真(非零)表达式循环体假(零)/71例用do~while循环求#
includemain(){inti,sum=0;i=1;do{
sum+=i; i++;}while(i<=100);printf("%d",sum);}/7
1例while和do~while比较#includemain(){inti,sum=0;
scanf("%d",&i);do{sum+=i; i++;}while(i<=10
);printf("%d",sum);}main(){inti,sum=0;scanf("%d"
,&i);while(i<=10){sum+=i; i++;}printf("%d
",sum);}/713、说明:先执行语句,后判断表达式。第一次条件为真时,while,do-while等价;第一次
条件为假时,二者不同。/71【例5-3】用do-while语句编写程序统计从键盘输入的一行非空字符的个数(以回车键作为输入
结束标记)。#include"stdio.h"voidmain(){ charch; intnum=0;
ch=getchar(); do { num++; ch=getchar(); }while(ch
!=''\n'');printf("num=%d\n",num);}/71注意在if、while语
句中,表达式后面都没有分号,而在do-while语句的表达式后面则必须加分号。do-while和while语句相互替换时,要注意
修改循环控制条件。/715.3for语句1、for的形式:for(初始表达式1;条件表达式2;循环表达式3)
{循环体;}表达式1:用于循环开始前为循环变量设置初始值。表达式2:控制循环执
行的条件,决定循环次数。表达式3:循环控制变量修改表达式。循环体语句:被重复执行的语句。/71表达式3计算表达式
1循环体判断表达式2零非零for的下一条语句2、执行过程/71例如:它相当于以下语句:i=1;
while(i<=100){sum=sum+i;
i++;}printf("%d",sum);表达式1;while(表达式2)表达式3;
例用for循环求#includemain(){inti,sum=0;for(i=1
;i<=100;i++)sum+=i;printf("%d",sum);}/71例:#in
cludemain(){inti=0;
for(i=0;i<10;i++)putchar(‘a’+i);
}运行结果:abcdefghij例:#includemain(){
inti=0;for(;i<10;i++)putch
ar(‘a’+i);}例:#includemain()
{inti=0;for(;i<10;)putc
har(‘a’+(i++));}例:#includemain()
{inti=0;for(;i<10;putchar(‘a’+i),i++);
}/71main(){inti,j,k;for
(i=0,j=100;i<=j;i++,j--){k=i+j; printf("%d+%d=%d\n",i,
j,k);}}#includemain(){charc;for(;(c=ge
tchar())!=''\n'';)printf("%c",c);}#includemai
n(){inti,c;for(i=0;(c=getchar())!=''\n'';i+=3) printf("%c
",i+c);}/713、说明三个表达式都可以是逗号表达式。三个表达式都是任选项,都可以省略,但要注意省略表达式
后,分号间隔符不能省略。/711、for语句中表达式省略的形式(1)for语句一般形式中的“表达式1”可以省略;
如:sum=0;i=1;for(;i<=100;i++)
sum=sum+i;/711、for语句中表达式省略的形式(2)表达式2省略,
即不判断循环条件,循环无终止地进行下去;如:for(sum=0,i=1;;i++)
{if(i>100)break;sum=s
um+i;}/711、for语句中表达式省略的形式(3)表达式3也可以
省略,但此时保证循环能正常结束如:for(sum=0,i=1;i<=100;)
{sum=sum+i;i++;}
/71(4)可以省略表达式1和表达式3,只有表达式2,如:i=1;sum=0;
for(;i<=100;){sum=sum+i;i++;}1、for语句中表达式省略的形式i=1;sum=0;while(i<=100){sum=sum+i;i++;}相当于/71while(1)循环体;即不设初值,不判断条件,循环变量不增值。无终止地执行循环体。(5)三个表达式都可省略,如for(;;)循环体;1、for语句中表达式省略的形式如:sum=0,i=1;for(;;){if(i>100)break;sum=sum+i;i++;}相当于/71(6)循环体为空语句对for语句,循环体为空语句的一般形式为:for(表达式1;表达式2;表达式3);如:for(sum=0,i=1;i<=100;sum+=i,i++);1、for语句中表达式省略的形式要在显示器上复制输入的字符,输入的字符为’.’时,结束循环。输入abcdefg.输出abcdefg.while(putchar(getchar())!=’.’);(1)在进入累加前先给累加器赋初值(一般为0);(2)用循环语句实现累加;for(循环变量赋初值;循环条件;循环变量改变规律)(3)循环体语句的设计。累加器当前值=累加器原值+循环变量当前值;典型例题分析【例5-4】求累加和1+2+3+…+1000基本方法:属于“累加器”类型问题。累加器赋初值参考程序:voidmain(){longintk,s;s=0;for(k=1;k<=1000;k++)s=s+k;printf("s=%ld",s);}累加求偶数和2+4+6+…+100思考
献花(0)
+1
(本文系信检彭博海...首藏)