循环结构
该章内容:本章我们学习三大结构之一:循环结构。通常采用循环结构来解决有规律性的重复性工作,如求学生的总成绩;统计车站某月的人流量。在程序设计中对那些需要重复执行的操作我们采用循环结构来完成,几乎所有实用的程序都包含循环。c语言中有三种循环语句来构成循环结构:while语句,do-while语句和for语句。本章是考试的重点章节。
学习方法:先了解循环结构相关的基础知识,熟悉三种循环结构的特点,先读懂循环的程序,再慢慢学习编写程序。最终一定要学会用循环来解决规律性的重复性工作的问题。
第一节 while语句及其构成的循环结构
知识点:while语句的执行过程;循环体中语句书写的位置对程序的影响;
重要程度:★★★★
程序一:
while(y++); (循环体为空,while只管后面一个语句,管多个用大括号!!!)
printf(“%d”,y);
----------------------------------------
程序二:
while(y++) (循环体为printf(“%d”,y);)
printf(“%d”,y);
当以上两个程序的y初始化为-2的时候,两个程序运算的结果是不同的,请注意原因就是:程序二中的while(y++)后面有没有分号。(这几年考试的热点)
注意:while只管后面一个语句,管多个要用大括号!!(考试热点)
图1 while循环流程图
例1:以下程序的输出结果是________(for、while这些循环都只管后面一个分号)
main( )
{ int x=2;
while(x- -);
printf("%d",x);
}
分析:本题需要特别注意的是while(x--)后面紧跟一个分号,它表示while循环的循环体部分是一个空语句,而不是printf语句。
(1)程序首先将x的值初始化为2。进入while循环后,表达式x--的值为2,为真,执行空循环体,此时x的值为1。第一轮循环结束。
(2)进入第二轮循环,x--的值为1,表达式仍然为真,继续执行空循环体,此时x的值为0。第二轮循环结束。
(3)进入第三轮循环,x--的值为0,表达式仍然为假,跳出循环,执行printf语句,此时x的值为-1。答案为-1。
第二节 do-while语句及其构成的循环结构
知识点:do-while语句的执行过程;do-while和while的相似和不同之处;
重要程度:★★★★
do-while语句的一般形式如下:
do
循环体
while (表达式);
图3 do-while语句流程图
注意:
(1)do-while循环语句的循环体至少执行一次。
(2)在while(表达式)后的“;”不可以少。它表示do-while语句的结束。
(3)do-while语句与while语句可以相互转换。
例1:有如下程序
main( )
{ int x=23;
do
{ printf("%d",x--);}
while(!x);
}
该程序的执行结果是 ( )。
A) 321 B) 23 C) 不输出任何内容 D) 陷入死循环
分析:本例就是告诉大家do-while循环至少执行一次循环体。
首先执行循环体,将表达式x--的值输出,其值为23。接着判断!x为假,因此跳出do-while循环。最后得到输出结果为23,答案选择B。不要先去判断表达式!x的真假,这样容易选到C。
例2:有以下程序(注:字符a的ASCIl码值为97)
#include
main()
{char*s={"abe");
do
{printf(”%d”,*s%10);++s;)
while(*s);
)
程序运行后的输出结果是( )。B
A)abc
B)789
C)7890
D)979899
第三节 for语句及其构成的循环结构(重点章节)
知识点:for语句的执行过程;for语句中三个表达式使用方法;for 、while、 do-while之间的联系和区别;
重要程度:★★★★★
for(表达式1;表达式2;表达式3)
循环体语句
三个表达式要背诵的:
表达式1:作用是初始化循环的变量;(执行一次)
表达式2:循环条件的判断;(可执行多次)
表达式3:作用是循环变量增值或减少。(可执行多次)
其执行过程如下:
(1) 求解表达式1。
(2) 求解表达式2,若其值为“真”非0,则执行
for语句控制的循环体语句,然后执行步骤(3)。
若为“假”0,则结束循环,转到第(5)步。
(3) 求解表达式3
(4) 返回第(2)步继续执行。
(5) 循环结束,执行for语句后面的语句。
图4 for循环流程图
例1:如有以下程序
main()
{
int i , sum=0;
for(i=1;i<6;i++) sum+=i;
printf("%d\n",sum);
}
执行后sum的值是( )
A)15 B)14 C) 不确定 D)0
分析:本例用一个for循环实现了1到5的累加。首先i为1,sum为0,i<6为真,执行sum+=i;使sum的值变为1,然后执行i++,使i的值变为2,i<6仍然为真,继续执行循环体sum+=i;,使sum的值变为3,再执行i++,使i的值变为3。如此反复,直到i为6,i<6为假,跳出循环,执行printf语句输出sum的值。答案选A。本例有两种变形,请读者自己分析结果。希望读者深刻理解,循环体语句可以是一条语句,也可以是一条复合语句,甚至是条空语句。
变形1:main() 变形2:main()
{ {
int i , sum=0; int i , sum=0;
for(i=1;i<6;i++); for(i=1;i<6;i++)
sum+=i; {sum+=i;
printf("%d\n",sum); printf("%d\n",sum);}
} }
关于for语句我们这里有几点说明:
(1)for语句可以完全代替while语句:
表达式1;
while(表达式2)
{
循环体语句
表达式3;
}
(2)for后面小括号中的表达式1和表达式3都可以缺省,表达式1可以移到for语句之前,表达式3可以移到for循环体的尾部,但分号一定不能省。如:
i=1;
for(;i<=100;)
{
sum=sum+i;
i++;
}
同理表达式1和表达式3既可以是单个的表达式,也可以是由多个表达式构成,中间用逗号“,”隔开。如:for(sum=0,i=1;i<=100;i++,i++)。
(3)表达式2可以缺省,此时相当于表达式2的值永远为真,循环将无限执行下去,一般就会形成死循环。这样就会出现三个表达式都缺省的情况。如 for(;;),等同于while(1)。
(4)看懂:for(sum=0,i=1;i<=100,sum=sum+i; i++)这个长得很特殊的循环的程序。
例2:以下程序的输出结果是( )。
main()
{ int a=0,i;
for(i=1;i<5;i++)
{
switch(i)
{ case 0:
case 3:a+=2;
case 1:
case 2:a+=3;
default:a+=5;
}
}
printf("%d\n",a);
}
A) 31 B) 13 C) 10 D) 20
分析:本例是for语句和switch语句的结合应用。首先i为1,i<5为真,执行循环体,循环体是一条switch语句,转到case 1它不做任何操作,特别注意它后面的case也要执行,因此执行a+=3;和a+=5;,此时a为8了。接着执行i++,i变为2,i<5为真,继续执行循环体switch语句,执行case2和后面的default,此时a变为16。如此反复,直到i为5,i<5为假,跳出循环。最后结果为31。答案选A。
例3:有以下程序
#include <stdio.h>
double f(double x);
main()
{double a=0;int i;
for(i=0;i<30;i+=10)a+=f((double)i);
printf("%5.0f\n",a);
}
double f(double x)
(return x*x+1;)
程序运行后的输出结果是( )。
A)503
B)401
C)500
D)1404
第四节 循环的嵌套
知识点:嵌套循环的执行的过程; (学会做题目,掌握循环的方法)
重要程度:★★★★
例1:
有以下程序
main( )
{
int i,j,sum=0;
for(i=1;i<5;i++)
for(j=1;j<4;j++)
sum++;
printf("%d",sum);
}
程序的输出结果是_______
分析:本题考察点在嵌套的for循环中,内层和外层循环的执行过程。内层循环结构的循环体是sum变量的自加,外层循环的循环体是内层的for循环结构。首先i的值为1,进入循环体(内层for循环结构),j的值为1,sum的值变为1;内层循环继续执行,j为2,sum再次自加为2;j自加为3,sum也为3;j自加为4的时候,j<4为假,因此跳出内层循环。外层循环的循环体执行完毕一次,下面计算i++。
i的值变为2,进入循环体,重复上述过程,sum一共增加3,值为6。跳出内层循环。外层循环的循环体执行完毕。再次计算i++。
i的值变为3,重复以上过程,sum的值增加3。i的值变为4,sum继续增加3。当i的值变为5的时候,i<5为假,跳出外层循环。输出sum的值。由于外层循环每执行一次,sum要自加3次,所以一共sum自加12次。最后sum的值为12。各个变量的变化情况见图5所示。
i 1 2 3 4
j 1 2 3 1 2 3 1 2 3 1 2 3
sum 1 2 3 4 5 6 7 8 9 10 11 12
图5 例6中各变量的变化情况
考试核心:
1、 近几年是考试的重点,复习时候,把习题册上最近三年的嵌套循环完成就可以了。
2、 嵌套循环是上机考试天空题目的重点。
3、 一定要知道嵌套循环的实质,和运算的整个流程。
sum = 0;
for(i=1;i<=10;i++){
for(j=2;j<=5;j++) sum++;
}
这个程序中,sum就一共执行了10(外层循环次数)乘以4(嵌套的二次循环)等于40次。
第五节 break语句和continue语句在循环体中的运用
知识点:break和continue的区别; break和continue的使用范围;
重要程度:★★★★★
1、break语句
break; 英文的意思是打破的意思。所以看到break,我们马上要知道它是终止了循环这个过程。
例1:以下程序运行后的输出结果是
main( )
{ int x=15;
while(x>10)
{ x++;
if(x%3) {x++;break;} //误区,break是打破一层循环,不是一层括号!!
x++;
}
printf(“%d\n”,x);
}
A)15 B)16 C)17 D)18
分析:本例是break语句在循环体中的运用。x的初值为15,满足while循环条件,执行循环体。x++使x的值变为16。进入if语句,计算16%3的值为1,if后的表达式为真,故执行复合语句,x自加为17,接着执行break语句,跳出整个while循环。显然后面的x++并不执行。因此x的值为17,答案选C。
注意: break语句只能出现在switch语句体和循环结构中。
2、continue语句
continue;英文的意思是继续的意思.。其作用是结束本轮循环,跳过本轮循环体中余下尚未执行的语句,接着下一轮继续进行循环。
注意:continue语句和break语句的区别:continue语句只结束本轮循环,而不是终止整个循环。而break语句则是结束整个循环。
|
|
以上两个程序看上去是只有break和countine的差别,但是运算起来差别很大。第一个程序运算的结果为2,第二个程序运算的结果为3。
例2:把100~500之间的能3整除的数输出。(深刻理解)
main( )
{ int n;
for(n=100;n<=500;n++)
{ if(n%3!=0) continue;
printf("%3d",n);
}
}
分析:当n不能被3整除时,表达式n%3!=0为真,执行continue语句,跳过printf语句,直接执行n++,然后再对n<=500进行判断,决定是否执行循环体。当n能被3整除时,表达式n%3!=0为假,跳过continue语句,执行printf语句将该数输出。
考试核心:
1、含有break和continue的程序运算考察,习题册上有多个经典考题的代表。
2、break和continue的概念区别是考试爱出题的地方。
3、自己写一下,输出1-100之间被三整除的数,并且每行输出三个数字的程序。
main( )
{ int n=1,count=0;
for(n=1;n<=100;n++)
{ if(n%3==0) {printf("%3d",n);count++;}
if(count%3==0)printf(“\n”);
}}