循环语句
使用循环之前我们要注意循环中的三个要素,即循环变量的初始化、判断循环结束的条件、循环变量的调整。
1、while循环
1.1.while的使用
当不知道循环次数的时候可以使用while循环
(1).语法结构:
while(表达式)
{
语句;
}
(2).执行流程:
当代码执行到while语句首先会判断表达式是否为真,如果为真(即!=0),则会执行循环体中的内容,然后再次判断表达式,直到判断出表达式的值为0时,跳出循环。
这里需要注意的是: 条件表达式的执行次数总是比循环体的执行次数多一次
(3).例子:
//计算数字1~100之和
#include<stdio.h>
int main()
{
int i = 1;
int sum = 0;
while (i <= 100)//判断条件,大于100跳出循环
{
sum += i;//与sum = sum + i同义
i++;//调整循环变量
}
printf("%d", sum);
return 0;
}
输出:
sum = 5050
1.2.死循环
当我们需要对一段代码实现无限循环可以用while(1)
#include<stdio.h>
int main()
{
while(1)
{
printf("咦?真由氏的怀表停了\n");//表达式恒为真,死循环打印输出内容
}
return 0;
}
输出:
注:如果下列代码中没有(n++),也会导致死循环。
#include<stdio.h> int main() { int n = 1; while(n<=10) { printf("咦?真由氏的怀表停了\n"); n++;//注意对循环变量的调整 } return 0; }
while循环的的结构不像for循环那样紧凑,所以使用while时要注意对循环变量的调整,不然就会造成死循环。
1.3.练习
给定两个数,求这两个数的最大公约数
例:输入:20 40
输出:20
#include<stdio.h>
int main()//辗转相除法
{
int a = 0;
int b = 0;
int c = 0;
scanf("%d%d", &a, &b);
while (c = a % b)//c为a对b求余
{
a = b;
b = c;
}
printf("最大公约数为:%d\n", b);
return 0;
}
题解:本题主要用辗转相除法解释。
1.a对b求的余数为c
2.如果c==0,说明b是最大公约数。
3.若c!=0,则把b的值赋给a,c的值赋给b,然后再重复1过程。
下面演示计算过程:
例如:输入 24 18
24 % 18 余6
18 % 6 余0
即6是最大公约数
2.do while循环
2.1.do while的使用
(1).语法结构:
do
{
语句;
}while(表达式);//不要忘记加英分号;
(2). 执行流程:
do while循环与while循环的不同的是,它会先执行循环体,然后再判断表达式内容是否为真,如果为真,则继续循环。如果为假,则终止循环。所以循环体的内容至少执行一次。
(3).练习:
输⼊⼀个正整数,计算这个整数是几位数
例如: 输⼊:1234 输出:4
#include<stdio.h>
int main()
{
int a = 0;
int count = 0;
scanf("%d", &a);
do
{
count++;
a = a / 10;
} while (a);
printf("输入值是%d位数", count);
return 0;
}
输出:
本题不是一定要使用do while语句,相比之下比while要简洁一些。本题比较契合do while,因为当输入0时,也需要统计1位数。
3.for循环
3.1.for循环的使用
(1).语法结构:
for(表达式1;表达式2;表达式3)
{
语句;
}
(2).执行流程:
代码执行到for循环时 ,首先执行表达式1对循环变量初始化,接下来执行表达式2,如果表达式值为假,则结束循环;如果表达式值为真(!=0),则会执行循环体的内容,然后再来执行表达式3,对循环变量做出调整,之后就是重复执行表达式2、3的过程了,直到判断表达式2为假,才会结束循环。
根据上述我们不难看出在整个循环中表达式1只会被执行一次,之后就是重复执行表达式2->循环体->表达式3的过程。
注 :对于表达式1来说,作用就是对循环变量的初始化,初始化操作不仅可以放到for循环语句的()中,还可以在循环之前和循环体中
(3).例子:
//计算1~100之和
#include<stdio.h>
int main()
{
int i = 0;
int sum = 0;
for (i = 1; i <= 100; i++)
{
sum += i;
}
printf("%d", sum);
return 0;
}
对比这三种循环语句,for、while比较常见,但do while也不是一无是处,每种循环语句都有其自己的特点,我们在使用时要充分考虑这些循环语句和问题的契合度,再利用其特点到达我们想要实现的效果。
4.循环中的break
4.1.break的使用
我们在之前的学习中了解过break在switch语句中的作用是跳出语句。break在循环中的作用也是差不多的。break用于终止循环,一旦被执行就会跳出循环,不会执行break后面的内容,然后向下继续执行。不仅如此在循环中break与if基本上是形影不离的,用于满足条件跳出循环。
4.2.while和for循环中的break
(1). while & break
#include<stdio.h>
int main()
{
int i = 1;
while (i <= 10)
{
if (i == 5)//当i等于5时,终止循环
break;
printf("%d ", i);
i += 1;
}
return 0;
}
输出:
(2).for & break
#include<stdio.h>
int main()
{
int i = 1;
for (i = 1; i <= 10; i++)
{
if (i == 5)
break;
printf("%d ", i);
}
return 0;
}
输出:
对比之下for和while中的break作用是一样的,都用来终止循环
4.3.continue的使用
continue也很容易理解,在循环中执行continue后会跳过它后面的代码,直接跳到循环的判断部分,然后进行下一次循环。不过在for和while中continue的作用有所差异。
(1).while & continue
我们将上述代码换成continue观察变化
#include <stdio.h>
int main()
{
int i = 1;
while (i <= 10)
{
if (i == 5)
{
continue;
}
printf("%d ", i);
i += 1;
}
return 0;
}
输出:
打印1,2,3,4后,i的值到达了5,i等于5就执行continue,跳过后面的代码。然后死循环进行判断、跳过的操作。
(2).for & continue
我们把上面while换成for
#include<stdio.h>
int main()
{
int i = 1;
for (i = 1; i <= 10; i++)
{
if (i == 5)
continue;//这里会直接跳到调整i的部分
printf("%d ", i);
}
return 0;
}
输出:1,2,3,4,6,7,8,9,10
可见在for循环中continue不会影响循环变量的调整
综合来看for循环形式上优于while,这也造就了for是三种循环中使用最多的语句
5.循环的嵌套
了解循环之后我们发现有些问题不是一层循环就能解决掉的,所以就有了循环的嵌套。
5.1.练习:
(1).求数字100~200之间的素数
#include<stdio.h>
int main()
{
int i = 0;
for (i = 100; i <= 200; i++)//循环产生数字100~200
{
int j = 0;
for (j = 2; j < i; j++)
{
if (i % j == 0)//如果整除了说明不是素数
{
break;
}
}
if (i == j)
{
printf("%d ", i);
}
}
return 0;
}
输出:
当代码运行到 if (i == j)判断条件之前时,说明 j 等于i-1,由于满足j<i所以还会自增1,这时就不满足条件j<i,故跳出for循环,这时我们可以认为当i==j时这个数就是素数。
(2).打印9*9乘法表
#include<stdio.h>
int main()
{
int i = 0;
for (i = 1; i <= 9; i++)//控制行
{
int j = 0;
for (j = 1; j <= i; j++)//控制列
{
printf("%d*%d=%d\t", j, i, i * j);//使用%-2d也可对齐
}
printf("\n");
}
return 0;
}
输出:
6.goto语句
goto语句是一种转向语句,可在同一个函数内实现跳转。但是一般不推荐使用goto,它有致命的缺点,当使用不当时,在程序内乱跳会打乱代码的执行逻辑,最终导致程序崩溃。
6.1.goto语句的使用
当我们想结束多层嵌套循环时,显然使用break有些麻烦了,这时候goto就派上用场了
for(...)
for(...)
{
for(...)
{
if(disaster)
goto error;
}
}
…
error:
结语:以上就是本文的眼全部内容,通过本文相必大家对循环有了初步的认识。本文若有不当之处,欢迎指出错误。