循环结构是结构化程序设计的基本结构之一,C语言提供了三种循环结构语句:while语句,do-while语句和for语句。for语句在C语言系列(二):用C语言编写程序已经讲解,这里不再赘述。
while语句
while语句在C语言中用的比较多,它是通过判断循环控制条件是否成立来决定是否继续循环,又称”当型”循环,一般形式:
while(表达式)
循环体语句
其中表达式是任意合法的表达式,通常是关系表达式和逻辑表达式,表示循环条件。循环体可以是一条简单语句,也可以是一对{}括起来的复杂语句。表示要重复执行的语句。
执行流程:首先计算表达式的值,如果表达式的值为非0(真),就执行循环体语句,直到表达式的值为0(假),才结束循环并继续执行while语句的下一条语句。
注意:
- 循环体若是包含一个以上的语句,应使用{}括起来,否则while的重复执行只会执行循环体的第一条语句。
- 在循环体中应该有使循环趋于结束的语句,否则会出现”死循环”。
- while循环是先判断循环条件再决定是否执行循环体,若一开始循环条件就是”假”,则循环体一次都不执行。
用while语句编程
利用格里高利公式求圆周率的近似值,要求精确到最后一项的绝对值小于0.0001。
计算公式:
代码如下:
#include <stdio.h> //编译预处理命令
#include <math.h>//需要调用绝对值函数fabs()
int main() //主函数
{
int fm, flag;//fm:项分母flag:项正负号
double item, pi;//item:项 pi累加和
flag = 1; fm = 1; item = 1.0;//变量初始化
pi = 0;//累加和pi的值为0
while (fabs(item) >= 0.0001)
{
item = flag * 1.0 / fm;
pi = pi + item;
flag = -flag;//改变符号
fm = fm + 2;//分母自加2
}
pi = pi * 4;//计算pi
printf(“pi=%f\n”,pi);//输出
return 0;
}
输出结果:
do-while语句
do-while语句在C语言中应用较多,它是通过先执行一次循环体再判断循环控制条件是否来决定是否继续循环,又称”直到型”循环,一般形式是:
do {
循环体语句
} while (表达式);
执行流程:首先执行do和while之间的循环体一次,然后再判别while后括号内的表达式,若表达式值为真,则继续执行循环体语句,直至表达式值为假,才结束循环并继续执行do-while的下一条语句。
注意:
- do-while循环是先执行循环体再判断循环条件来决定是否循环,循环条件的判定是在循环结构的尾部进行,因此至少执行一次循环体。
- 在循环体中应该有使循环趋于结束的语句,否则会出现”死循环”。
用do-while语句编程
输入一个整数,求该数的位数。例如输入12345,输出5;输入95,输出2等。
#include <stdio.h> //编译预处理命令
int main() //主函数
{
int count, num;
scanf("%d",&num);
do {
num = num / 10;
count++;
} while (num!=0);
printf(“It contain %d digits.\n”,count);
return 0;
}
输入输出结果:
进一步讨论for语句
for语句中的3个表达式都是可以省略的:
- 如果省略表达式1(初值表达式),则应在for语句之前给循环变量赋初值,但其后的分号不能省略。
- 如果省略表达式2(循环条件表达式),则表示for语句是无终止条件的循环,但其后的分号不能省略。这样,可能导致无限循环,因此,应在for语句的循环体内设置强制跳出循环体的break语句。
- 如果省略表达式3(步长表达式),则可能导致无限循环,因此,应在for语句的循环体内修改循环变量的值。
- 如果省略表达式1和表达式3,则应在for语句之前给循环变量赋初值,应在for语句的循环体内修改循环变量的值。
- 如果三个表达式都省略,但分号不能省。则应在for语句之前给循环变量赋初值,应在for语句的循环体内修改循环变量的值,设置强制跳出循环体的break语句。
for语句中的逗号表达式
逗号表达式主要应用在for语句中,for语句中的表达式1和表达式3都可以是逗号表达式。在有多个循环变量参与控制的情况下,使用这种方法使程序显得更加清晰。
循环体为空语句
C语言的句法允许一个语句为空,这意味着循环语句的循环体也可以为空语句。利用这种方式,编程者可以获得一个空循环。
break语句、continue语句和goto语句
这一类语句的功能是改变程序的执行流程,使程序从某处转向另一处去执行。这些语句在循环结构的程序设计中很有用。
在循环结构中break语句强制跳出所在的循环结构,使流程转向执行该循环结构的下一条语句。continue语句被称为继续语句,功能是使本次循环提前结束,即跳过循环体中continue语句后面尚未执行的循环体语句,继续下一次新的循环。
goto语句被称为无条件转移语句,它的一般形式是
goto 标号;
执行goto语句,使流程转移到标号所在的语句,并从该语句继续执行。语句标号用标识符表示。语句标号一般放在语句前面,并用:分隔,其一般形式:
标号:
语句
注意:
- goto语句一般需要与if语句配合使用,当满足条件时才跳转到语句标号标记的语句执行。
- goto语句只允许在同一函数内部转移,不得转移到其他函数。
- 只允许goto语句从循环内部跳转到外部,不允许从外部跳转到循环内部。
- 多重循环结构,只允许goto语句从内循环跳转到外循环,不允许从外循环跳转到内循环。
goto语句破坏了结构化程序设计的3种基本结构,使程序的结构性和可读性都变差,应尽量避免使用goto语句。