For, While, Do While, Break, Continue语句
什么是循环语句?
循环会多次执行语句序列,直到声明的条件变为假。 循环由两部分组成,循环主体和控制语句。 控制语句是一些条件的组合,这些条件指示循环的主体执行直到指定条件变为假。 循环的目的是重复相同的代码多次。该节讲以下内容:
- 循环类型
- While循环
- Do循环
- for 循环
- Break声明
- continue声明
- goto 语句
- 选择哪个循环?
循环类型
根据控制语句在程序中的位置,循环分为两种类型:
1.入口控制循环
2.退出控制循环
入口控制循环在执行循环主体之前检查条件,也称为预检查循环。
退出控制的循环在执行循环主体之后检查条件,它也称为后检查循环。
必须很好地定义和指定控制条件,否则循环将执行无数次。
不断的执行执行语句的循环称为无限循环,无限循环也称为“无结束循环”。
以下是无限循环的一些特征:
- 没有结束条件
- 结束条件永远不满足
C 语言提供了以下几种循环类型。
循环类型 | 描述 |
---|---|
while 循环 | 当给定条件为真时,重复语句或语句组。它会在执行循环主体之前测试条件。 |
for 循环 | 多次执行一个语句序列,简化管理循环变量的代码。 |
do…while 循环 | 除了它是在循环主体结尾测试条件外,其他与 while 语句类似。 |
While 循环
while循环是最直接的循环结构。 while循环的基本格式如下:
while (condition) { statements; }
main() { int i=1,sum=0; while(i<=100) { sum=sum+i; i++; } printf("%d\n",sum); }
While 循环是入口控制的循环。 在while循环中,在处理循环主体之前先评估条件。 如果条件为真,则执行循环主体。 在执行了循环的主体之后,控制又从头开始再次返回,并且检查条件是否为真,执行相同的过程,直到条件变为假。 一旦条件变为假,则控件退出循环。
退出循环后,控制转到循环之后的语句。 循环的主体可以包含多个语句。 如果仅包含一条语句,则大括号不是必需的。 但是,我们要形成一个习惯,即使循环主体只有一个语句,也要使用花括号,这样设计出来的程序很容易看懂。
在while循环中,如果条件不成立,则不会执行循环主体,甚至不会执行一次。 我们将很快看到,它在do while循环中是不同的。
以下程序说明了while循环:
例一:
#include<stdio.h> #include<conio.h> int main() { int num=1; //initializing the variable while(num<=10) //while loop with condition { printf("%d\n",num); num++; //incrementing operation } return 0; }
执行结果:
上面的程序说明了while循环的用法。 在上面的程序中,我们使用while循环打印了一系列从1到10的数字。
- 初始化一个名为num的值为1的变量。我们将从1到10进行打印,因此该变量将以值1进行初始化。
- 在while循环中,提供了一个条件(num <= 10),这意味着循环将执行主体直到num的值变为10。此后,循环将终止,并且控制将落在循环之外。
- 在循环的执行语句中,一个打印函数来打印数字,以及一个递增操作,每次执行循环时递增该值。 num的初始值为1,执行后将变为2,在下次执行期间将变为3。此过程将继续进行,直到该值变为10,然后将其打印在控制台上并终止循环 。
\ n用于格式化目的,令其一行。如果改为 \t
输出结果如下:
Do-While循环
do-while循环与while循环类似,除了条件始终在循环主体之后执行。 也称为出口控制循环。
如果利用do-while语句计算一到一百的和,算法为:
while循环的基本格式如下:
do { statements } while (expression);
正如我们在while循环中看到的那样,当且仅当条件为true时,才执行主体。 在某些情况下,即使条件为假,我们也必须至少执行一次循环主体。 这种类型的操作可以通过使用do-while循环来实现。
在do-while循环中,循环主体始终至少执行一次。 执行主体后,将检查条件。 如果条件为真,则它将再次执行循环的主体,否则控制权将移出循环。
与while循环类似,一旦控件退出循环,将立即执行循环之后的语句。
while和do-while循环之间的关键区别在于,在while循环中,while是在开始时写入的。 在do-while循环中,while条件写在最后,并以分号(;)终止
下面的程序说明了do-while循环的工作方式:
我们将使用do while循环打印偶数数字。
例二:
#include<stdio.h> #include<conio.h> int main() { int num=1; //initializing the variable do //do-while loop { printf("%d\n",2*num); num++; //incrementing operation }while(num<=10); return 0; }
在上面的示例中,我们使用do-while循环语句打印出了偶数表。 让我们看看该程序是如何运行的。
- 首先,初始化变量’num’为一。然后,我们编写了一个do-while循环
- 在每一个循环中,我们有一个打印功能,打印出num的值乘以2。
- 每次增加后,num的值将增加1,并将该数乘于二打印在屏幕上。
- 当num的值变为10以后,该循环将终止,并在循环之后立即执行一条语句。 在这种情况下,返回0。
For 循环语句
for循环是“ C”编程中更有效的循环结构。 for循环的一般结构如下:
for (initial value; condition; incrementation or decrementation ) { statements; }
- for循环的初始值仅执行一次
- 条件是一个布尔表达式,每一次执行前和一个固定值进行比较,如果出现false,停止for循环。
- 初始值递增或递减。
for语句每个部分用英文分号“;”区别开。
以下程序说明了简单的for循环的用法:
例四
#include<stdio.h> int main() { int number; for(number=1;number<=10;number++) //for loop to print 1-10 numbers { printf("%d\n",number); //to print the number } return 0; }
执行结果
上面C语言程序for循环语句分行打印出 数字 1 – 10 。
- 声明一个int数据类型的变量
- 在for循环中,在初始化部分,变量初始值设为1;在条件部分,我们指定条件:该变量小于等于10;最后控制没到一次,变量加一
- 在循环的主体中,每一个新行打印一个数字。 我们将值1赋予整数变量,在第一次循环执行后,该变量值将递增,并变为2。现在,变量具有数值2。将重新检查条件,并且由于条件为true,因此将执行循环, 它将在屏幕上打印2。 该循环将继续执行,直到变量的值变为10。此后,循环将终止,并在屏幕上打印一系列的1-10。
for循环在每个部分中可以有多个用逗号分隔的表达式
例如:
for (x = 0, y = num; x < y; i++, y--) { statements; }
另外,我们可以把初始表达式放在forloop之外,通过添加分号来跳过初始值表达式。
例五
int i=0; int max = 10; for (; i < max; i++) { printf("%d\n", i); }
循环也可以嵌套在有外循环和内循环的地方。 对于外循环的每次迭代,内循环都会重复其整个循环。
下面示例使用嵌套的for循环语句输出一个乘法表:
例六
#include <stdio.h> int main() { int i, j; int table = 2; int max = 5; for (i = 1; i <= table; i++) { // outer loop for (j = 0; j <= max; j++) { // inner loop printf("%d x %d = %d\n", i, j, i*j); } printf("\n"); /* blank line between tables */ }}
嵌套循环可以出现无限多次。编程时记着每个循环前面对齐,这样可以很容易阅读和理解。为自己,也为别人。有时自己编的程序自己过一段时间再看,就不是很明白。
嵌套循环大部分应用于数组和矩阵运算。
goto语句
goto 语句是一种无条件转移语句, 与 BASIC 中的 goto 语句相似。goto 语句的使用格式为:
goto 语句标号;
其中标号是一个有效的标识符, 这个标识符加上一个“:”一起出现在函数内某处, 执行goto 语句后,程序将跳转到该标号处并执行其后的语句。另外标号必须与 goto 语句同处于一个函数中,但可以不在一个循环层中。通常 goto 语句与 if 条件语句连用, 当满足某一条件时, 程序跳到标号处运行。
goto 语句通常不用,主要因为它将使程序层次不清,且不易读,但在多层嵌套退出时, 用 goto 语句则比较合理。
用goto语句和if语句构成循环, 算出一到一百数的总和:
例九
main() { int i,sum=0; i=1; loop: if(i<=100) { sum=sum+i; i++; goto loop; } printf("%d\n",sum); }
如果用For 循环语句,很快就解决了这个问题。
例十
main() { int i, sum=0; for (i = 1; i <=100; i++ ) { sum=sum+i; } printf("%d\n", sum); }
不建议大家使用GOTO语句,介绍goto语句的目的,是让大家能够看懂别人写的程序。
Break 语句
break语句主要在switch语句中使用。 对于立即停止循环也很有用。下列程序引入了一个中断以退出while循环:
例七
#include <stdio.h> int main() { int num = 5; while (num > 0) { if (num == 3) break; printf("%d\n", num); num--; }}
Continue 语句
当您想跳出该循环,进入下一个循环中时,应使用continue语句。该语句忽略了本循环后面的所有语句,进入了下一个循环。
例如:
例八
#include <stdio.h> int main() { int nb = 7; while (nb > 0) { nb--; if (nb == 5) continue; printf("%d\n", nb); }}
数字“5”忽略了。
main() { char c; while(c!=13) { c=getch(); if(c==0X1B) continue; printf("%c\n", c); } }
ASCII码。 13是回车键,0X1B是ESC (escape),换码(溢出)键。
Break 和 Continue 语句的流程图
使用无穷级数来计算 Pi值
使用格雷戈里 – 莱布尼茨无穷级数。数学家们发现了若干个数学级数,如果实施无穷多次运算,就能精确计算出 Pi 小数点后面的多位数字。其中部分无穷级数非常复杂,需要超级计算机才能运算处理。但是有一个最简单的无穷级数,即格雷戈里-莱布尼茨级数。尽管计算较费时间,但每一次迭代的结果都会更接近 Pi 的精确值,迭代 500,000 次后可准确计算出 Pi 的 10 位小数。公式如下:
- π = (4/1) – (4/3) + (4/5) – (4/7) + (4/9) – (4/11) + (4/13) – (4/15) …
也可以用以下算式求出PI的值
PI/4 = 1-1/3+1/5-1/7+1/9-1/11…
#include<math.h> main() { int s; float n,t,pi; t=1,pi=0;n=1.0;s=1; while(fabs(t)>1e-5) { pi=pi+t; n=n+2; s=-s; t=s/n; } pi=pi*4; printf("pi=%10.5f\n",pi); }
选择什么样的循环语句 ?
对于程序员来说,选择什么样的循环语句始终是一项艰巨的任务。
要选择一个什么样的循环语句,可以通过下列步骤选择:
- 分析问题并考虑(problem solving) 它是否需要预测试循环或后测试循环。
- 如果需要预测试,请使用while 或者 for 循环。
- 如果需要后测试,请使用do-while循环。
摘要
- 循环是任何编程语言上的关键概念之一;
- 它多次执行一个语句块,直到条件变为假
- 循环有两种类型:入口控制和出口控制。
- C语言为我们提供了1)while 2)do-while 和 3)for循环。
- For和while循环是入口控制的循环。
- Do-while是退出控制的循环。