1、for 循环
表达式:
for (表达式1; 表达式2; 表达式3)
{
语句块1;
}
表达式1:初始化,最早被执行,有且执行一次; 表达式2:判断条件,为真循环继续,为假循环结束,每次进入循环都需要判断,每次都执行 表达式3:步进,修改循环因子值,执行完语句块1之后执行,每次都执行
分析如下代码:
例1:
int main()
{
int i;
for (i = 0, printf("#1, %d\n", i);
printf("#2, %d\n", i), i < 3;
i++, printf("#3, %d\n", i))
{
printf("****1, %d\n", i);
}
return 0;
}
例2:输出 3 个数字
int main()
{
int i;
for (i = 0; i < 3; i++)
{
printf("%d\n", i);
}
return 0;
}
for 循环中的三个表达式都可以省略(两个分号不能省略),例如上面的程序可以(但是不建议)改成如下代码
int main()
{
int i = 0;
for (; ; )
{
if (i >= 3) {
break;
}
printf("%d\n", i);
i++;
}
return 0;
}
总结:for 循环是使用最多的循环语句,其最大的特点就是三个表达式放在一起,不容易漏写,大家且用且珍惜(●’?’●)
2、while 循环
表达式:
while (表达式1)
{
语句块1
}
表达式1为真循环继续,为假循环结束
例子:将上面的例子改为 while 循环
int main()
{
int i = 0;
while (i < 3) {
printf("%d\n", i);
i++;
}
return 0;
}
3、do while 循环
表达式:
do
{
语句块1
} while(表达式1);
表达式1为真循环继续,为假循环结束
例子:将上面的例子改成 do while 循环
int main()
{
int i = 0;
do {
printf("%d\n", i);
i++;
} while (i < 3);
return 0;
}
注意:
- while 保证语句块至少执行 0 次及以上
- do while 保证语句块至少执行 1 次及以上
- 当表达式的第一次的值为 “真” 时,两种循环完全相同
4、break 的使用
break 用于跳出 switch 或者跳出一层循环
例如:求满足如下条件的 x 的值
1 + 2 + 3 + … + x < 1000 且 1 + 2 + 3 + … + x + (x+1) > 1000
输出 x 和求和的值
void SumTo1000()
{
int sum = 0;
int i;
for (i = 1; ; i++) {
sum += i;
if (sum > 1000) {
break;
}
}
printf("x = %d, 和 = %d\n", i - 1, sum);
}
输出结果:
5、continue 的使用
continue:提前结束本次(趟)循环,直接进入下一次(趟)循环
例子:输出 100~200 之间的不能被 3 整除的数
法一:
for (n = 100; n < 200; n++) {
if (n % 3 != 0) {
printf("%d ", n);
}
}
法二:利用 continue 关键字实现
for (n = 100; n < 200; n++) {
if (n % 3 == 0) {
continue;
}
printf("%d ", n);
}
6、综合练习
例1:用
π
/
4
=
1
?
(
1
/
3
+
1
/
5
?
1
/
7
+
.
.
.
)
\pi/4 = 1-(1/3 + 1/5 - 1/7 + ...)
π/4=1?(1/3+1/5?1/7+...) 公式求
π
\pi
π 的近似值,直到发现某一项的绝对值小于10-6 为止
分析:
- 该公式用于求
π
/
4
\pi/4
π/4,只需要将最后的结果乘以 4 即为
π
\pi
π 的值;
- 公式中的每一项均由符号、分子和分母组成,那么在程序中只需要将这三部分处理好
代码如下:
double GetPi()
{
int flg = 1;
double m = 1;
double n = 1;
double tmp = 0;
while (n / m > 1e-6) {
tmp += flg * n / m;
flg *= -1;
m += 2;
}
return tmp * 4;
}
int main()
{
double ret = GetPi();
printf("%lf\n", ret);
return 0;
}
例2:求斐波那契(Fibonacci)数列的第 n 个数。这个数列有如下特点:第1、第2两个数为 1、1。从第 3 个数开始,该数是前面两个数之和。即:
{
F
1
=
1
(
n
=
1
)
F
2
=
2
(
n
=
2
)
F
n
=
F
n
?
1
+
F
n
?
2
(
n
≥
3
)
\begin{cases} F_1 = 1 & (n=1)\\ F_2 = 2 &(n=2)\\ F_n = F_{n-1} + F_{n-2} & (n\geq3) \end{cases}
?
?
??F1?=1F2?=2Fn?=Fn?1?+Fn?2??(n=1)(n=2)(n≥3)?
int Fibon(int n)
{
int f1 = 1;
int f2 = 1;
int f3 = 1;
for (int i = 3; i <= n; ++i) {
f3 = f1 + f2;
f1 = f2;
f2 = f3;
}
return f3;
}
int main()
{
int n = 3;
printf("%d\n", Fibon(n));
return 0;
}
|