一.基本概念
循环:
条件满足时,重复多次做同一件事。
构成有效循环的两个条件:
-
循环体:需要重复执行的操作。
-
循环控制条件:循环在什么情况下停止进行。
循环控制条件:
是一个最终能得到值为0(假)或非0(真)的表达式,包含在表达式中的变量称为循环控制变量。
二.while语句
一般形式:
while(表达式)
语句
执行流程:
注意事项:
- while后面的括号()不能省。
- while后面的表达式是循环的控制条件,可以是任意类型的条件表达式,但一般是关系表达式或逻辑表达式。
- 语句部分称为循环体,当需要执行多条语句时,应使用复合语句。
特点:
先判断, 后执行,循环体语句有可能一次也不执行。
应用样例:
例1:计算并输出1~10的平方。
代码如下:
#include<stdio.h>
#include<math.h>
void main()
{
int i=1;
while(i<=10)
{
printf("%d*%d=%d\n",i,i,i*i);
i++;
}
}
例2:编程计算1+2+3+...+100。
流程图:
用i来控制循环次数,用sum来记录数字和。
代码如下:
#include<stdio.h>
#include<math.h>
void main()
{
int i=1,sum=0;
while(1<=i&&i<=100)
{
sum=sum+i;
i++;
}
printf("%d",sum);
}
例3:若一张纸厚0.1mm,将这张纸不断对折,问多少次后其厚度超过珠穆朗玛峰的高度(8848m)。
思路:迭代法
迭代法:是一种不断用变量的旧值递推新值的过程。
分析:这是一个典型的由迭代法求解的问题,从变量的初值开始,不断用变量的原值递推出新值的过程,关键是求取迭代公式。本例中纸张的厚度paper从0.1mm开始,不断对折,用paper*2取代paper取值,迭代公式为paper=paper*2。对折的操作具有重复性,适合用循环结构求解,对折的次数未知,根据其结束条件,采用while语句。
流程图:
具体实现步骤:
- 定义两个变量papert和n,分别记录纸的厚度与对折的次数,并把papert变量的初始值记为0.1mm,n的开始值记为零。
- 如果papert<8848000mm,重复做以下工作:
- 裁纸对折起来,即papert*2;
- 次数加1,即n+1。
- 如果papert>=8848000mm,完成以下工作:
- 输出纸的厚度,即打印papert;
- 输出最后记录的次数,即打印n。
注意单位换算,可以如流程图中,全部转化为㎜,也可以如代码中转化为米。如果以米做单位,自然会出现小数,所以定义变量需要用实型。
代码如下:
#include<stdio.h>
#include<math.h>
void main()
{
double i=0,paper=0.0001;
while(paper<=8848)
{
paper=paper*2;
i++;
}
printf("次数为:%f\n",i);
printf("此时高度为:%f",paper);
}
例4:输入两个正整数m和n,求其最大公约数和最小公倍数。
思路:辗转相除法
欧辗转相除法欧又称几里得算法,是指用于计算两个非负整数a,b的最大公约数。
分析:用辗转相除法求最大公约数。m对n求余数为r,若r≠0,则将除数的值赋给下一次被除数即m=n,将余数的值赋给下一次的除数即n=r(相当于在下图中,将除数n移动到被除数m处,余数r移动到除数n处),继续求余;否则n为最大公约数。
以m=12,n=21为例:
最小公倍数公式:
所以我们可以设置一个变量a来存放m和n的积。
代码如下:
#include<stdio.h>
void main()
{
int m,n,r,a;
printf("请输入m,n的值:");
scanf("%d %d",&m,&n);
a=m*n;
r=m%n;
while(r!=0)
{
m=n;
n=r;
r=m%n;
}
printf("最大公约数是:%d\n",n);
printf("最小公倍数是:%d",a/n);
}
三.for语句
一般形式:
for (表达式1;表达式2;表达式3)
循环体语句;
其中:
表达式1:一般为赋值表达式,给控制变量赋初值。
表达式2:关系表达式或逻辑表达式,循环控制条件。
表达式3:一般为赋值表达式,给控制变量增量或减量。
- 表达式之间用分号分隔。
- 循环体若包含多条语句时,应使用复合语句。
for语句很好地体现了正确表达循环结构应注意的三个问题:
- 控制变量的初始化
- 循环的控制条件
- 循环控制变量的更新
注意事项:
(1)表达式1、表达式2、和表达式3可以是任何类型的表达式。比方说,这三个表达式都可以是逗号表达式。
(2)表达式1、表达式2、和表达式3都是任选项,可以省掉其中的一个、两个或全部,但其用于间隔的分号是一个也不能省。
(3)表达式2如果为空则相当于表达式2的值是真。
(4)循环体可以是空语句。
例:编程实现:输出所有的“水仙花数”。(水仙花数是指一个 3 位数,它的每个位上的数字的 3次幂之和等于它本身)
代码如下:
#include<stdio.h>
void main()
{
int n,gw,sw,bw;
printf("水仙花数:");
for(n=100;n<1000;n++)
{
gw=n%10;
sw=n/10%10;
bw=n/100;
if(n==gw*gw*gw+sw*sw*sw+bw*bw*bw)
printf("%d ",n);
}
}
四.do...while语句
一般形式:
do
语句
while(表达式);
执行流程:
注意事项:
- while后面的括号( )不能省。
- while最后面的分号;不能省。
- while后面表达式可以是任意类型表达式,但一般是关系表达式或逻辑表达式。
- 循环体语句如果包含多条时,应使用复合语句。
特点:
先执行,后判断,循环体语句至少要执行一次。
例:从键盘输入各学生成绩,并对成绩不及格(60分以下)的学生人数进行计数,直到输入的成绩为负为止,最后输出成绩不及格的学生人数。
代码如下:
#include<stdio.h>
void main()
{
int a,n=0;
do
{
scanf("%d",&a);
if(a>0&&a<60)
n++;
}while(a>=0);
printf("不及格的人数是%d",n);
}
五.循环语句的选择
一般情况下三种循环语句可以相互代替。但三种循环语句有如下的各自特点:
- while语句和for语句是先判断,后执行循环体语句;do-while语句是先执行循环体语句再做条件判断。
- while语句和do-while语句的循环变量初值在循环语句执行之前完成,for语句的循环变量初值可出现在表达式1的位置或for语句之前。
- while语句和do-while语句的循环体语句中包含使循环趋于结束的语句,for语句的表达式3中可包含使循环趋于结束的表达式。
选取方法:
- 如果循环次数在执行循环体之前就已确定,一般用for语句;如果循环次数是由循环体的执行情况确定的,一般用while语句或者do-while语句。
- 当循环体至少执行一次时,用do-while语句,反之,如果循环体可能一次也不执行,选用while语句。