第 5章 循环结构
计算机的特点是运算速度快、能够自动执行编写的程序,使其适合做重复性的工作。在解决许多实际问题时常要用到循环控制。例如:求学生的总成绩;
统计车站某月的人流量;计算给定某范围内符合条件的数的个数等等,也就是说循环结构使用的非常普遍。因此熟练掌握循环结构是程序设计的基本要求。
循环结构的特点是:在给定条件(称为循环条件)
成立时,反复执行某程序段(称为循环体),直到条件不成立时终止。
下面重点介绍 C语言的三种循环结构:
1.while循环结构
2.do-while循环结构
3.for循环结构
5.1 goto语句构成循环
在介绍 C语言的三种循环结构之前,先介绍一种采用非结构化程序设计的方式来构成的循环,即使用无条件转移语句
goto语句。它的一般格式为:
goto 语句标号;
说明,goto语句把程序的控制流转移到在 goto语句中指定的标号之后的第一条语句。标号是跟有“:”的标识符,它必须与引用它的 goto语句在同一个函数中,但可以不在同一个循环层中。标号的命名规则与变量名相同,即由字母、数字和下划线组成,其第一个字符必须为字母或下划线,不能用整数来作标号。例如,goto lsx;是正确的,而 goto 12;是错误的。
【 例 5-1】 编程求 10个学生的总成绩。
【 编程思路 】
分析:该题显然是在重复做累加求和的工作,关键是怎样控制循环的停止。可以借助前面学过的 if语句和 goto语句一起来构成循环。
main()
{
int count=1,total=0,grade;
star:if(count<=10)
{
printf("input the grade:");
scanf("%d",&grade);
total=total+grade;
count++;
goto star;
}
printf("%d\n",total);
}
在编写程序时我们强调使用结构化程序设计,
一般不提倡使用非结构化 goto语句(除非它能够极大地提高效率),因为如果滥用了这种语句将使程序难以调试、维护和修改。
5.2 while循环结构
它的一般格式为:
while( 表达式 )
语句;
说明:其中表达式是循环条件,语句为循环体。在执行 while语句时,先对表达式进行计算,若其值为
“真(非 0)”,则执行循环体中的语句,否则跳过循环体执行该结构后面的语句。在进入循环体后,
每执行完一次循环体语句后再对表达式进行一次计算和判断,当发现其值为“假( 0)”时,立即退出循环。注意其特点:先判断表达式,后执行语句。
其流程图如图 5.1。
对 【 例 5-1】 采用 while循环结构改写为:
【 源程序 】
main()
{
int count=1,total=0,grade;
while(count<=10)
{
printf("input the grade:");
scanf("%d",&grade);
total=total+grade;
count++;
}
printf("%d\n",total);
}
注意:
1.while语句中的表达式一般是关系表达式或逻辑表达式,只要表达式的值为“真(非 0)”
即可继续循环。
2.循环体如果包括一个以上的语句,则必须用,{}”括起来组成复合语句。
3.在循环体内必须要有使循环结束的语句,
如果无此语句则循环便成了“无限循环”。
5.3 do-while循环结构
它的一般格式为:
do
语句;
while( 表达式 );
说明:当流程到达 do后,立即执行循环体一次,然后才对表达式进行计算和判断。若表达式的值为
“真(非 0)”,则重复执行一次循环体,否则退出。注意其特点:先执行语句,后判断表达式。其流程图如图 5.2。
对 【 例 5-1】 采用 do-while循环结构改写为:
【 源程序 】
main()
{
int count=1,total=0,grade;
do
{
printf("input the grade:");
scanf("%d",&grade);
total=total+grade;
count++;
}while(count<=10);
printf("%d\n",total);
}
从以上的例子编写中我们发现 do-while循环结构与 while循环结构相类似,但要注意区别:
在 while循环结构中继续循环的条件是在循环开始时判断的,而在 do-while循环结构中是在执行完循环体之后判断继续循环条件的,因此至少要执行一次。也就是说用两种循环结构处理同一问题时,若二者的循环体部分是一样的,当 while后面表达式的第一次的值为
“真(非 0)”时,两种循环结构得到的结果相同,否则二者的结果不相同。
【 例 5-2】 编程任意输入一个小于 10的正整数,
求其到 10的累加和。
while循环结构 do-while循环结构
main() main()
{ {
int sum=0,x; int sum=0,x;
printf("input the x:"); printf("input the x:");
scanf("%d",&x); scanf("%d",&x);
while(x<=10) do
{ {
sum=sum+x; sum=sum+x;
x++; x++;
} } while(x<=10);
printf("%d\n",sum); printf("%d\n",sum);
} }
5.4 for循环结构
它的一般格式为:
for(表达式 1;表达式 2;表达式 3)
语句;
说明:“表达式 1”的作用是初始化循环控制变量;“表达式
2”的作用是判断循环终止的条件,其一般是关系表达式或逻辑表达式,也可以是数值表达式或字符表达式;“表达式 3”
的作用是改变控制变量的值;这三个部分之间用“;”隔开,
由此其最简单的应用形式也是最容易理解的形式为:
for(循环变量赋初值;循环条件;改变循环变量)
语句;
其执行过程为先求解表达式 1,然后判断表达式 2的值,若为“真(非 0)”则执行循环体,
接着求解表达式 3,然后又判断表达式 2的值,
直到其值为“假( 0)”才退出循环。其流程图如图 5.3。
对 【 例 5-1】 采用 for循环结构改写为:
【 源程序 】
main()
{
int count,total=0,grade;
for(count=1;count<=10;count++)
{
printf("input the grade:");
scanf("%d",&grade);
total=total+grade;
}
printf("%d\n",total);
}
从以上的例子编写中我们发现 for循环结构完全可以代替 while循环结构。其一般的格式可以用 while循环结构改写如下:
表达式 1;
while(表达式 2)
{
语句;
表达式 3;
}
显然对比后我们发现用 for循环结构简单、方便,且不易遗漏改变循环控制变量值的语句。
注意:
1,for循环结构可以灵活使用,其“表达式 1”、“表达式 2”、“表达式 3”都是选择项,即可以省略,但
“;”不能省略。若省略了“表达式 1”即表示不对循环控制变量赋初值;若省略了“表达式 2”即表示不判断循环条件,循环无终止地进行下去,也就是认为“表达式 2”的值始终为“真(非 0)”;若省略了“表达式 3”即表示不改变循环控制变量的值。对于这些省略的“表达式”,编程时可以另外编写来保证程序的正确运行,建议在编程时不要过分地利用这一特点,这样会使 for循环结构显得结构不清析,
可读性降低。
2.,表达式 1”可以是设置循环控制变量初值的赋值表达式,也可以是与循环控制变量无关的其它表达式。
例如,for( total=0;count<=10;count++ );
3.,表达式 1”和“表达式 3”可以是一个简单表达式或逗号表达式(即包含一个以上的简单表达式,中间用逗号隔开)。例如,for(i=0,j=0;i<=100;i++,j++);
在逗号表达式内按从左到右的顺序计算,其返回值和类型是最右边表达式的值和类型。例如:
for(m=1;m<=100;m++,m++);相当于
for(m=1;m<=100;m=m+2);
4.建议在 for循环结构中在“表达式 1”和“表达式 3”
部分只放置包含循环控制变量的表达式,对其它变量的操作应放置在循环之前(如果这种操作只执行一次)或循环体中(如果循环都要执行一次这种操作,如递增或递减语句),否则会造成程序难以阅读。
5.5 break语句和 continue语句在循环结构中的运用
5.5.1 break语句
break语句通常用在 switch语句和循环结构中。
在前面的章节我们已经介绍过用 break语句可以使流程跳出 switch结构而执行其结构后面的第一条语句。下面再介绍 break语句在循环结构中的运用。
在 while,do-while,for循环结构中使用 break
语句,其通常与 if语句一起使用,当满足条件时使程序立即退出该循环结构,转而执行该循环结构后面的第一条语句。
【 例 5-3】 编程输出 1到 10之间的数,当数为 6
时停止输出。
【 编程思路 】
分析:该题用循环结构控制输出,用 if语句判断条件,当条件满足时立即用 break语句跳出循环。其流程图如图 5.4。
main()
{
int n;
for(n=1;n<=10;n++)
{
if(n==6)
break;
printf("%4d",n);
}
}
5.5.2 continue语句
continue语句的作用是跳过循环体中剩余的语句而强行执行下一次循环。它只能用在
while,do-while,for循环结构中,常与 if条件语句一起使用以此来加速循环地执行。在
while和 do-while循环结构中执行完 continue
语句就立即判断循环的条件;而在 for循环结构中执行完 continue语句后先执行“表达式 3”,
然后才判断循环的条件。
【 例 5-4】 编程输出 1到 10之间的数,当数为 6
时不输出。
【 编程思路 】
分析:该题与 【 例 5-3】 要注意区别,此时是当数为 6时不输出,其前后的数都输出,用 if
条件语句与 continue语句组合完成。其流程图如图 5.5。
【 源程序 】
main()
{
int n;
for(n=1;n<=10;n++)
{
if(n==6)
continue;
printf("%4d",n);
}
}
注意 break语句和 continue语句的区别:
continue语句只结束本次循环,而不是终止整个循环的执行; break语句则是结束循环,
即不再进行循环条件判断。 break语句和
continue语句不能对由 if语句和 goto语句构成的循环进行控制。
5.6 实例解析
【 例 5-5】 编程输入若干个学生的成绩(用负数结束输入),统计并输出最高分和最低分。
【 编程思路 】
分析:该题对若干个学生的成绩的输入采用循环控制,然后在循环体内用条件判断语句比较成绩的高低即可。
【 源程序 】
main()
{
int grade,max,min;
printf("input the grade:");
scanf("%d",&grade);
max=grade;
min=grade;
while(grade>0)
{
if(grade>max)
max=grade;
if(grade<min)
min=grade;
printf("input the next grade:");
scanf("%d",&grade);
}
printf("max=%d min=%d\n",max,min);
}
【 例 5-6】 计算 1!+ 3!+ 5!+ … + 99! 。
【 编程思路 】
分析:该题实质上是一个累加求和的问题,
而且已知其循环的次数因此可以用 for语句来实现;对于累加应有选择地进行,即只对奇数项求和,可以用 if语句和 continue语句组合来进行选择性地累加。
【 源程序 】
main()
{
int n;
long t=1,sum=0;
for(n=1;n<100;n++)
{
t=t*n;
if(n%2==0)
continue;
sum=sum+t;
}
printf("sum=%ld\n",sum);
}
5.7 本章小结
本章重点介绍了 C语言的三种循环结构,while,do-while、
for循环结构。在处理同一问题时,一般情况下三者可以互相替换。三种循环结构还可以互相嵌套,即构成多层循环。对于 while和 do-while循环结构,循环控制变量初始化的操作应在 while和 do-while语句之前完成,只在 while后面指定循环条件,切记在循环体内要包含使循环趋于结束的语句; for循环结构可以在表达式 1中初始化循环控制变量,表达式 2指定循环条件,表达式 3中包含使循环趋于结束的语句;注意
while和 for循环结构是先判断表达式,后执行循环体,而 do-
while循环结构是先执行循环体,后判断表达式。在实际运用中,应根据具体的情况灵活选用这三种循环结构来解决问题。
计算机的特点是运算速度快、能够自动执行编写的程序,使其适合做重复性的工作。在解决许多实际问题时常要用到循环控制。例如:求学生的总成绩;
统计车站某月的人流量;计算给定某范围内符合条件的数的个数等等,也就是说循环结构使用的非常普遍。因此熟练掌握循环结构是程序设计的基本要求。
循环结构的特点是:在给定条件(称为循环条件)
成立时,反复执行某程序段(称为循环体),直到条件不成立时终止。
下面重点介绍 C语言的三种循环结构:
1.while循环结构
2.do-while循环结构
3.for循环结构
5.1 goto语句构成循环
在介绍 C语言的三种循环结构之前,先介绍一种采用非结构化程序设计的方式来构成的循环,即使用无条件转移语句
goto语句。它的一般格式为:
goto 语句标号;
说明,goto语句把程序的控制流转移到在 goto语句中指定的标号之后的第一条语句。标号是跟有“:”的标识符,它必须与引用它的 goto语句在同一个函数中,但可以不在同一个循环层中。标号的命名规则与变量名相同,即由字母、数字和下划线组成,其第一个字符必须为字母或下划线,不能用整数来作标号。例如,goto lsx;是正确的,而 goto 12;是错误的。
【 例 5-1】 编程求 10个学生的总成绩。
【 编程思路 】
分析:该题显然是在重复做累加求和的工作,关键是怎样控制循环的停止。可以借助前面学过的 if语句和 goto语句一起来构成循环。
main()
{
int count=1,total=0,grade;
star:if(count<=10)
{
printf("input the grade:");
scanf("%d",&grade);
total=total+grade;
count++;
goto star;
}
printf("%d\n",total);
}
在编写程序时我们强调使用结构化程序设计,
一般不提倡使用非结构化 goto语句(除非它能够极大地提高效率),因为如果滥用了这种语句将使程序难以调试、维护和修改。
5.2 while循环结构
它的一般格式为:
while( 表达式 )
语句;
说明:其中表达式是循环条件,语句为循环体。在执行 while语句时,先对表达式进行计算,若其值为
“真(非 0)”,则执行循环体中的语句,否则跳过循环体执行该结构后面的语句。在进入循环体后,
每执行完一次循环体语句后再对表达式进行一次计算和判断,当发现其值为“假( 0)”时,立即退出循环。注意其特点:先判断表达式,后执行语句。
其流程图如图 5.1。
对 【 例 5-1】 采用 while循环结构改写为:
【 源程序 】
main()
{
int count=1,total=0,grade;
while(count<=10)
{
printf("input the grade:");
scanf("%d",&grade);
total=total+grade;
count++;
}
printf("%d\n",total);
}
注意:
1.while语句中的表达式一般是关系表达式或逻辑表达式,只要表达式的值为“真(非 0)”
即可继续循环。
2.循环体如果包括一个以上的语句,则必须用,{}”括起来组成复合语句。
3.在循环体内必须要有使循环结束的语句,
如果无此语句则循环便成了“无限循环”。
5.3 do-while循环结构
它的一般格式为:
do
语句;
while( 表达式 );
说明:当流程到达 do后,立即执行循环体一次,然后才对表达式进行计算和判断。若表达式的值为
“真(非 0)”,则重复执行一次循环体,否则退出。注意其特点:先执行语句,后判断表达式。其流程图如图 5.2。
对 【 例 5-1】 采用 do-while循环结构改写为:
【 源程序 】
main()
{
int count=1,total=0,grade;
do
{
printf("input the grade:");
scanf("%d",&grade);
total=total+grade;
count++;
}while(count<=10);
printf("%d\n",total);
}
从以上的例子编写中我们发现 do-while循环结构与 while循环结构相类似,但要注意区别:
在 while循环结构中继续循环的条件是在循环开始时判断的,而在 do-while循环结构中是在执行完循环体之后判断继续循环条件的,因此至少要执行一次。也就是说用两种循环结构处理同一问题时,若二者的循环体部分是一样的,当 while后面表达式的第一次的值为
“真(非 0)”时,两种循环结构得到的结果相同,否则二者的结果不相同。
【 例 5-2】 编程任意输入一个小于 10的正整数,
求其到 10的累加和。
while循环结构 do-while循环结构
main() main()
{ {
int sum=0,x; int sum=0,x;
printf("input the x:"); printf("input the x:");
scanf("%d",&x); scanf("%d",&x);
while(x<=10) do
{ {
sum=sum+x; sum=sum+x;
x++; x++;
} } while(x<=10);
printf("%d\n",sum); printf("%d\n",sum);
} }
5.4 for循环结构
它的一般格式为:
for(表达式 1;表达式 2;表达式 3)
语句;
说明:“表达式 1”的作用是初始化循环控制变量;“表达式
2”的作用是判断循环终止的条件,其一般是关系表达式或逻辑表达式,也可以是数值表达式或字符表达式;“表达式 3”
的作用是改变控制变量的值;这三个部分之间用“;”隔开,
由此其最简单的应用形式也是最容易理解的形式为:
for(循环变量赋初值;循环条件;改变循环变量)
语句;
其执行过程为先求解表达式 1,然后判断表达式 2的值,若为“真(非 0)”则执行循环体,
接着求解表达式 3,然后又判断表达式 2的值,
直到其值为“假( 0)”才退出循环。其流程图如图 5.3。
对 【 例 5-1】 采用 for循环结构改写为:
【 源程序 】
main()
{
int count,total=0,grade;
for(count=1;count<=10;count++)
{
printf("input the grade:");
scanf("%d",&grade);
total=total+grade;
}
printf("%d\n",total);
}
从以上的例子编写中我们发现 for循环结构完全可以代替 while循环结构。其一般的格式可以用 while循环结构改写如下:
表达式 1;
while(表达式 2)
{
语句;
表达式 3;
}
显然对比后我们发现用 for循环结构简单、方便,且不易遗漏改变循环控制变量值的语句。
注意:
1,for循环结构可以灵活使用,其“表达式 1”、“表达式 2”、“表达式 3”都是选择项,即可以省略,但
“;”不能省略。若省略了“表达式 1”即表示不对循环控制变量赋初值;若省略了“表达式 2”即表示不判断循环条件,循环无终止地进行下去,也就是认为“表达式 2”的值始终为“真(非 0)”;若省略了“表达式 3”即表示不改变循环控制变量的值。对于这些省略的“表达式”,编程时可以另外编写来保证程序的正确运行,建议在编程时不要过分地利用这一特点,这样会使 for循环结构显得结构不清析,
可读性降低。
2.,表达式 1”可以是设置循环控制变量初值的赋值表达式,也可以是与循环控制变量无关的其它表达式。
例如,for( total=0;count<=10;count++ );
3.,表达式 1”和“表达式 3”可以是一个简单表达式或逗号表达式(即包含一个以上的简单表达式,中间用逗号隔开)。例如,for(i=0,j=0;i<=100;i++,j++);
在逗号表达式内按从左到右的顺序计算,其返回值和类型是最右边表达式的值和类型。例如:
for(m=1;m<=100;m++,m++);相当于
for(m=1;m<=100;m=m+2);
4.建议在 for循环结构中在“表达式 1”和“表达式 3”
部分只放置包含循环控制变量的表达式,对其它变量的操作应放置在循环之前(如果这种操作只执行一次)或循环体中(如果循环都要执行一次这种操作,如递增或递减语句),否则会造成程序难以阅读。
5.5 break语句和 continue语句在循环结构中的运用
5.5.1 break语句
break语句通常用在 switch语句和循环结构中。
在前面的章节我们已经介绍过用 break语句可以使流程跳出 switch结构而执行其结构后面的第一条语句。下面再介绍 break语句在循环结构中的运用。
在 while,do-while,for循环结构中使用 break
语句,其通常与 if语句一起使用,当满足条件时使程序立即退出该循环结构,转而执行该循环结构后面的第一条语句。
【 例 5-3】 编程输出 1到 10之间的数,当数为 6
时停止输出。
【 编程思路 】
分析:该题用循环结构控制输出,用 if语句判断条件,当条件满足时立即用 break语句跳出循环。其流程图如图 5.4。
main()
{
int n;
for(n=1;n<=10;n++)
{
if(n==6)
break;
printf("%4d",n);
}
}
5.5.2 continue语句
continue语句的作用是跳过循环体中剩余的语句而强行执行下一次循环。它只能用在
while,do-while,for循环结构中,常与 if条件语句一起使用以此来加速循环地执行。在
while和 do-while循环结构中执行完 continue
语句就立即判断循环的条件;而在 for循环结构中执行完 continue语句后先执行“表达式 3”,
然后才判断循环的条件。
【 例 5-4】 编程输出 1到 10之间的数,当数为 6
时不输出。
【 编程思路 】
分析:该题与 【 例 5-3】 要注意区别,此时是当数为 6时不输出,其前后的数都输出,用 if
条件语句与 continue语句组合完成。其流程图如图 5.5。
【 源程序 】
main()
{
int n;
for(n=1;n<=10;n++)
{
if(n==6)
continue;
printf("%4d",n);
}
}
注意 break语句和 continue语句的区别:
continue语句只结束本次循环,而不是终止整个循环的执行; break语句则是结束循环,
即不再进行循环条件判断。 break语句和
continue语句不能对由 if语句和 goto语句构成的循环进行控制。
5.6 实例解析
【 例 5-5】 编程输入若干个学生的成绩(用负数结束输入),统计并输出最高分和最低分。
【 编程思路 】
分析:该题对若干个学生的成绩的输入采用循环控制,然后在循环体内用条件判断语句比较成绩的高低即可。
【 源程序 】
main()
{
int grade,max,min;
printf("input the grade:");
scanf("%d",&grade);
max=grade;
min=grade;
while(grade>0)
{
if(grade>max)
max=grade;
if(grade<min)
min=grade;
printf("input the next grade:");
scanf("%d",&grade);
}
printf("max=%d min=%d\n",max,min);
}
【 例 5-6】 计算 1!+ 3!+ 5!+ … + 99! 。
【 编程思路 】
分析:该题实质上是一个累加求和的问题,
而且已知其循环的次数因此可以用 for语句来实现;对于累加应有选择地进行,即只对奇数项求和,可以用 if语句和 continue语句组合来进行选择性地累加。
【 源程序 】
main()
{
int n;
long t=1,sum=0;
for(n=1;n<100;n++)
{
t=t*n;
if(n%2==0)
continue;
sum=sum+t;
}
printf("sum=%ld\n",sum);
}
5.7 本章小结
本章重点介绍了 C语言的三种循环结构,while,do-while、
for循环结构。在处理同一问题时,一般情况下三者可以互相替换。三种循环结构还可以互相嵌套,即构成多层循环。对于 while和 do-while循环结构,循环控制变量初始化的操作应在 while和 do-while语句之前完成,只在 while后面指定循环条件,切记在循环体内要包含使循环趋于结束的语句; for循环结构可以在表达式 1中初始化循环控制变量,表达式 2指定循环条件,表达式 3中包含使循环趋于结束的语句;注意
while和 for循环结构是先判断表达式,后执行循环体,而 do-
while循环结构是先执行循环体,后判断表达式。在实际运用中,应根据具体的情况灵活选用这三种循环结构来解决问题。