C语言基础(四)
系列合集 初窥C语言
五、循环控制
5.1 概述
循环控制特点:在给定条件(循环条件)成立时,反复执行某程序段(循环体),直到条件不成立为止。
分类:
1)用goto语句和if语句构成循环;(不常用)
2)用while语句
3)用do-while语句
4)用for语句
5.2 循环控制语句
(1)goto语句(了解即可)
一般形式:goto 语句标号;由字母,数字和下划线组成,不能使用整数。
(2)while语句
一般形式:
while(条件表达式){
循环体;
}
(3)do-while语句
一般形式:
do{
循环体;
}while(条件表达式);
注意这里while()结束有“;”
(4)for语句
一般形式:
for(表达式1 ; 表达式2 ;表达式3)语句
具体内容为:
for(循环变量赋初值 ; 循环条件 ;循环变量递增/递减(改变))语句
改写为while循环形式为:
表达式1;
while(表达式2){
语句;
表达式3;
}
for语句的执行过程:
1)先求解表达式1
2)求解表达式2,若其值为真(非0),则执行for语句中指定的内嵌语句,然后执行下面3)步,若其值为假,则结束循环,转到5)步
3)求解表达式3
4)转回上面第2)步继续执行
5)循环结束,执行for语句下面的程序
for语句说明
1)for循环中的“表达式1(循环变量赋初值)”,“表达式2(循环条件)”和“表达式3(循环变量增量)”都是选择项,都可以缺省,但“:”不能缺省。
2)省略了“表达式1(循环变量赋初值)”,表示不对循环控制变量赋初值(可能在循环外定义时已经赋值)。
3)省略了“表达式2(循环条件)”,若不做其它处理时便成为死循环。
4)省略了“表达式3(循环变量增量)”,则不对循环控制变量进行操作,这时可在语句体中加入修改循环控制变量的语句。
5)表示式1和表达式3 可以是一个简单表达式也可以是逗号表达式
6)表达式 2一般是关系表达式或逻辑表达式,也可以是数值表达式或字符表达式,只要其值非0,就执行循环体。
几种循环比较
1)四种循环都可以用来处理同一个问题,一般可以互相代替。但一般不用goto型循环
2)while和do-while循环,循环体中应包含使循环趋于结束的语句。for语句功能最强
3)用while和do-while循环时,循环变量初始化操作应在while和do-while语句之前完成,而for语句一般在表达式1中实现循环变量的初始化。
5.3 循环嵌套
循环嵌套:一个循环体内又包含另一个完整的循环结构,称为循环的嵌套。
几种形式:
(1)
while(){
...;
while(){
...;
}
}
(2)
while(){
...;
do{
...;
}while();
...;
}
(3)
for(;;){
for(;;){
...;
}
}
5.4 break语句和continue语句
5.4.1 break
break语句:不能用于循环语句和switch语句之外的任何其它语句,跳出一个循环体或者完全结束一个循环。
while(表达式1){
...;
if(表达式2) break;
...;
}
5.4.2 continue
continue语句:只能在循环语句中使用,跳过循环体中剩余的语句而强行执行下一次循环,可以理解为只是中止(跳过)本次循环,接着开始下一次循环。
while(表达式1){
...;
if(表达式2)continue;
...;
}
5.5 程序举例
1.用switch语句1~100求和
#include <stdio.h>
int main()
{
int i, sum = 0;
i = 1;
while(i <= 100){
sum = sum + i;
i++;
}
printf("%d\n", sum);
}
2.用do-while语句1~100求和
#include <stdio.h>
int main()
{
int i, sum = 0;
i = 1;
do {
sum = sum + i;
i++;
} while(i <= 100);
printf("%d\n", sum);
}
3.用公式π/4 = 1-1/3+1/5-1/7+…求π
#include <stdio.h>
#include <math.h>
int main()
{
int s;
float n, t, pi;
t = 1, pi = 0, n = 1.0, s = 1;
while(fabs(t) > 1e-6){
// 当某一项绝对值小于等于10的-6次方时停止
pi = pi + t; //累加项数
n = n + 2; //分母+2
s = -s; //分子取反
t = s/n; //求出下一项
}
pi = pi * 4; //循环得到的是π/4
printf("pi=%10.6f\n", pi);
}
4.求Fibonacci(斐波那契)数列40个数
数列特点:第一,二个数为1,1。从第三个数开始,该数是前面两个数之和。
#include <stdio.h>
int main()
{
long f1, f2;
int i;
f1 = 1, f2 = 1;
for(i = 1; i < 20; i++){
printf("%10d%10d", f1, f2);
f1 = f1 + f2;
f2 = f2 + f1;
}
}
5.判断m是否为素数
质数又称素数。一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做质数;否则称为合数。
0和1既不是质数也不是合数,最小的质数是2
#include <stdio.h>
#include <math.h>
int main()
{
int m, i, k;
scanf("%d", &m);
k = sqrt(m); //对m开根号
for(i = 2; i <= k; i++){
if(m % i == 0) break;
}
if(i >= k+1) printf("%d is a prime number\n", m);
else printf("%d is not a prime number\n", m);
//m 只需被 2 ~ k+1之间的每一个整数去除就可以
//如果 m 不能被 2 ~k+1 间任一整数整除,m 必定是素数
// 原因:如果 m 能被 2 ~ m-1 之间任一整数整除,其二个因子必定有一个小于或等于√m,
//另一个大于或等于√m
}