一、程序中需要用循环结构
循环结构就是用来处理需要重复处理的问题的,所以又称为重复结构
有两种循环:
- 无休止的循环
- 有终止的循环
计算机只处理有条件的循环,算法的特征是有效性、确定性、有穷性
构成一个有效的循环应指定两个部分
- 需要重复执行的操作,循环体
- 循环结束的条件
循环结构是结构化程序设计的基本结构之一,它和顺序结构、选择结构共同作为各种复杂程序的基本构成单元
二、用 while 语句和 do……while 语句实现循环
1、用 while 语句实现循环
求 1+ 2 + 3 + 4 + …… + 100
#include <stdio.h>
int main(){
int i = 1.sum = 0;
while(i < 100){
sum = sum + i;
i++;
}
printf("%d\n",sum);
return 0;
}
运行结果:
5050
while 语句特点: 先判断,后执行
循环体如果包含一个以上的语句,应该用大括号括起来,以复合语句形式出现。如果不加大括号,则 while 语句的范围只到 while 后面第一个分号处
在循环体中应有是循环趋向于结束的语句
2、用 do……while 语句实现循环
do……while 语句特点: 先执行,后判断
求 1+ 2 + 3 + 4 + …… + 100
#include <stdio.h>
int main(){
int i = 1.sum = 0;
do{
sum = sum + i;
i++;
}while(i <= 100)
printf("%d\n",sum);
return 0;
}
运行结果:
5050
三、用 for 语句实现循环
1、for 语句的一般形式和执行过程
for(表达式1;表达式2;表达式3) 语句
2、for 循环程序举例
据2012年末统计,我国人口约为13.54亿,如果人口的年增长率为1%,计算到哪年中国总人口超过 15 亿
假设原来人口 ,一年后的人口为 p
其中 r 是年增长率
#include <stdio.h>
int main(){
double p = 1.354e9,r = 0.01;
int year;
for(year = 2012;p < 1.5e9; year++){
p = p * (1 + r);
}
printf("year = %d,p = %e \n",year - 1,p);
return 0;
}
运行结果:
year = 2023,p = 1.510615e+009
四、循环的嵌套
一个循环体内有包含另一个完整的循环结构,称为循环的嵌套
内嵌的循环中还可以嵌套循环,这就是多层循环
三种循环可以互相嵌套
五、提前结束循环
1、用 break 语句提前退出循环
break 语句可以使流程跳出 switch 结构,继续执行 switch 语句下面的一个语句
break 语句还可以用来从循环体内跳出循环体,提前结束循环
break 语句不能用于循环语句和 switch 语句之外的任何其他语句中
2、用 continue 语句提前结束本次循环
作用:结束本此循环,即跳过循环体中下面尚未执行的语句,接着进行下一次是否执行循环的判断
continue 与 break 的区别:
- continue 语句只结束本次循环,而不是终止整个循环的执行
- break 语句则是结束整个循环过程,不在判断执行循环的条件是否成立
六、几种循环的比较
- 三种循环都可以用来处理同一问题,一般情况下它们可以互相代替
- 在 while 循环和 do……while 循环中,只在 while 后面的括号内指定循环条件,因此为了使循环能正常结束,应在循环体中包含使循环趋于结束的语句。for 循环可以在 ”表达式3“ 中包含使循环趋于结束的操作,甚至可以将循环体中的操作全放到表达式 3 中(因为 for 语句的功能更强,凡是 while 循环能完成的,用 for 循环都能实现)
- 用 while 和 do……while 循环时,循环变量初始化的操作应在 whlie 和 do……while 语句之前完成
- while 循环、do……while 循环和 for 循环,都可以用 break 语句跳出循环,用 continue 语句结束本此循环
七、循环程序综合举例
给一个整数,判断它是否素数
#include <stdio.h>
#include <math.h>
int main(){
int m,i,k;
printf("Please enter a integer number:");
scanf("%d",&m);
k = (int)sqrt(m);
for(i = 2;i <= k; i++){
if(m % i == 0){
break;
}
}
if(i > k){
printf("%d is a prime number.\n",m);
}else {
printf("%d is not a prime number.\n",m);
}
return 0;
}
运行结果:
Please enter a integer number:17
17 is a prime number.
八、提高部分
1、while 和 do……while 循环的比较
while 循环循环体最少执行 0 次
do……while 循环循环体最少执行 1 次
2、for语句的各种形式
一般形式: for(表达式1;表达式2;表达式3) 语句;
- 表达式1省略(分号不省略)
- 此时应在 for 语句之前给循环变量赋初值
- 表达式2省略,死循环
- 表达式3省略
- 此时应另外保证循环正常运行(如在循环体中编写使循环趋于结束的语句)
- 省略表达式1和表达式3(完全等同于 while 语句)
- 3个表达式都省略,死循环
- 表达式1可以是设置循环变量初值的赋值表达式,也可以是与循环变量无关的其他表达式
- 表达式3也可以是与循环控制无关的任意表达式
- 表达式1 和表达式3可以是一个简单的表达式,也可以是逗号表达式,即包含一个以上的简单表达式,中间用逗号间隔
- 表达式一般是关系表达式或逻辑表达式,但也可以是数值表达式或字符表达式,只要其值为非 0 ,就执行循环体
- 循环体为空语句时,把原来循环体中处理的内容放在表达式3中也可以一样的
九、习题
1、输出所有”水仙花数“,所谓”水仙花数“是指一个 3 位数,其各位数字立方和等与该数本身
#include <stdio.h>
#include <math.h>
int main(){
int i,j,k,n;
printf("parcissus numbers are:\n");
for(n = 100;n < 1000; n++){
i = n / 100;
j = n / 10 - i * 10;
k = n % 10;
if(n == pow(i,3) + pow(j,3) + pow(k,3)){
printf("%d\t",n);
}
}
printf("\n");
return 0;
}
运行结果:
parcissus numbers are:
153 370 371 407
一 叶 知 秋,奥 妙 玄 心