前面贝蒂带大家了解了选择结构,今天就来为大家介绍循环结构,也就是我们熟悉的while,do while,还有for的用法~
while循环的一般形式为:
while(表达式)
{
语句块;
}
代码会先判断表达式的内容,如果为真(非0),则执行语句块的内容,然后再次判断表达式的内容......一直到表达式的内容为假(0),跳出循环,执行其他语句。
一般条件下,表达式执行次数比循环体内部语句块执行次数多1,因为最后一次判断表达式内容为0,跳出循环。
举个简单的例子:
//计算1~100的和
#include
int main()
{
int i = 1;
int sum = 0;
while (i <= 100)//判断条件,当i大于100跳出循环
{
sum = sum + i;
i++;
}
printf("%d\n", sum);
return 0;
}
sum=5050
陷入死循环:
#include
int main()
{
while (1)
{
printf("陷入死循环啦\n");
}
return 0;
}
贝蒂说:“如果表达式的内容一直为真,就会陷入无限循环,所以大家在写表达式条件时候一定要注意哦~”
除了while,C语言还有一种相似的do while的语法的结构,让我们来学习学习吧~
do-while循环的一般形式为:
do{
语句块;
}while(表达式);
do-while循环与while循环的不同在于:它会先执行“语句块”,然后再判断表达式是否为真,如果为真则继续循环;如果为假,则终止循环。因此,do-while 循环至少要执行一次“语句块”。
输⼊⼀个正的整数,逆序打印这个整数的每⼀位
例如:
输⼊:1234,输出:4321
输⼊:521,输出:125分析:
1.我们要想逆序打印一个正整数,首先我们要先得到每一位的数字。
2.要得到每一位数字,我们可以先定义一个整数n,输出n%10,然后将n/10。
3.重复步骤2,直到n=0,也就是达到我们的循环条件。
代码如下 :
#include
int main()
{
int n = 0;
scanf("%d", &n);
while (n)//当n为0时候跳出循环
{
printf("%d ", n % 10);//输出最低位的值
n /= 10;
}
return 0;
}
贝蒂说:“while循环和do-while各有特点,大家可以适当选择,但在实际编程中使用while循环较多,毕竟while用法相对来说比较简单啦~”
for 循环的一般形式为:
for(表达式1; 表达式2; 表达式3)
{
语句块;
}
它的运行过程为:
1.先执行“表达式1”。
2. 再执行“表达式2”,如果它的值为真(非0),则执行循环体,否则结束循环。
3. 执行完循环体后再执行“表达式3”。
4).重复执行步骤 2 和 3,直到“表达式2”的值为假,就结束循环。
上面的步骤中,表达式1只执行一次,步骤2与步骤3会重复执行,for 语句的主要作用就是不断执行步骤 2和 3。
贝蒂说:“表达式1”仅在第一次循环时执行,以后都不会再执行,可以认为这是一个初始化语句。“表达式2”一般是一个关系表达式,决定了是否还要继续下次循环,称为“循环条件”。“表达式3”很多情况下是一个带有自增或自减操作的表达式,以使循环条件逐渐变得“不成立”。”
我们还是用计算1~100的和来举例子吧~
#include
int main(){
int i, sum=0;
for(i=1; i<=100; i++)
{
sum+=i;
}
printf("%d\n",sum);
return 0;
}
其实在for 循环中的“表达式1(初始化条件)”、“表达式2(循环条件)”和“表达式3(自增或自减)”都是可选项,都可以省略(但分号;
必须保留)。
我们还是用计算1~100的题目来举例。
如果省略表达式1,也就是初始化内容,编译器会默认上面的初始化内容为表达式1。也就相当于把初始化内容提出来了,对结果并不会产生影响~
int i = 1, sum = 0;
for( ; i<=100; i++)//默认i开始为1
{
sum+=i;
}
如果省略表达式2,相当于循环没有判断结束的标志,就会死循环。
for(i=1; ; i++)
{
sum=sum+i;
}//没有判断条件,死循环
如果省略表达式3,我们可以在循环内容中添加,这种循环方式类似while循环,但是如果不添加的话就会死循环哦~
for(i=1; i<=100; )
{
sum=sum+i;
i++;//如果没有这个条件,就会死循环
}
贝蒂说:“虽然for循环可以省略其中表达式内容,但是贝蒂还是不推荐省略,这样可以避免很多不必要的错误~”
continue 语句的作用是跳过循环体中剩余的语句而强制进入下一次循环。continue语句只用在 while、for 循环中,常与 if 条件语句一起使用,判断条件是否成立。
让我们看看下面这个例子:
#include
int main()
{
int i = 1;
while (i <= 10)
{
if (i == 5)
{
continue;
}//当i等于5后,就执⾏continue,循环直接进行下次循环
//不执行continue后面的内容
printf("%d ", i);
i = i + 1;
}
return 0;
}
输出结果为:1,2,3,4 ......死循环
因为i不执行i+1,所以i一直都是5,陷入死循环
我们还是上面的例子,看看是否也会陷入死循环
#include
int main()
{
int i = 1;
for (i = 1; i <= 10; i++)
{
if (i == 5)
{
continue;
} //这⾥continue跳过了后边的打印,来到了i++的部分
printf("%d ", i);
}
return 0;
}
输出结果:1,2,3,4,6,7,8,9,10,没有5
贝蒂说:“从这里我们就可以看出while,for中的continue的区别啦~,for中的i+1不受continue的影响,这或许也是我们大家常用for的原因之一吧~”
当 break 关键字用于 while、for 循环时,会终止循环,不会执行整个循环语句后面的代码。break 关键字通常和 if 语句一起使用,即满足条件时便跳出循环。
让我们继续借用上面的那个例子,如果continue换成break会怎么样呢~
#include
int main()
{
int i = 1;
while (i <= 10)
{
if (i == 5)
{
break;
} //当i等于5后,就执⾏break,循环就终⽌了
printf("%d ", i);
i++;
}
return 0;
}
输出结果:1,2,3,4
我们继续看看for里面的break,和while有什么不同呢
#include
int main()
{
int i = 1;
for (i = 1; i <= 10; i++)
{
if (i == 5)
break;
printf("%d ", i);
}
return 0;
}
输出结果:1,2,3,4
贝蒂说:“通过观察我们知道,不管是在while,还是for循环中,break的作用几乎是相同的”
#include
int main()
{
int i = 1;
do
{
if (i == 5)
continue;
printf("%d ", i);
i = i + 1;
} while (i <= 10);
return 0;
}
#include
int main()
{
int i = 1;
do
{
if (i == 5)
break;
printf("%d ", i);
i = i + 1;
} while (i <= 10);
return 0;
}
贝蒂说:“do.while 语句中的 break 和 continue 的作⽤和 while 循环中⼏乎⼀模⼀样,大家感兴趣的话,可以自行运行一下,贝蒂在这里就不在赘述啦~”
我们知道在选择语句中有嵌套,那么循环里面是否有嵌套呢,答案自然是有的~
题目:
找出100~200之间的素数,并打印在屏幕上。
注:素数⼜称质数,只能被1和本⾝整除的数字。解析:
1. 要从100~200之间找出素数,⾸先得有100~200之间的数,这⾥可以使⽤循环解决。
2. 假设要判断i是否为素数,需要拿2~i-1之间的数字去试除i,需要产⽣2~i-1之间的数字,也可以使⽤循环解决。
3. 如果2~i-1之间有数字能整除i,则i不是素数,如果都不能整除,则i是素数。
代码如下:
#include
输出结果 101 103 107 109 113 127 131 137 139 149 151 157 163 167 173 179 181 191 193 197 199
#include
int main()
{
int i = 1;
for (i = 1; i < 10; i++)
{
int j = 0;
for (j = 1; j <= i; j++)
{
printf("%d*%d=%2d ", i, j, i * j);
}
printf("\n");
}
return 0;
}
输出结果
1*1= 1
2*1= 2 2*2= 4
3*1= 3 3*2= 6 3*3= 9
4*1= 4 4*2= 8 4*3=12 4*4=16
5*1= 5 5*2=10 5*3=15 5*4=20 5*5=25
6*1= 6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36
7*1= 7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49
8*1= 8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64
9*1= 9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81
贝蒂说:“break是跳出最近的一次循环哦 ,大家千万不要搞错啦~”
C 语言中的 goto 语句允许把控制无条件转移到同一函数内的被标记的语句。
goto label; .. . label: statement;
#include
int main()
{
printf("1\n");
goto next;//直接跳过下一步,执行next后的语句
printf("2\n");
next:
printf("3\n");
return 0;
}
输出:1 3
贝蒂说:“在任何编程语言中,都不建议使用 goto 语句。因为它使得程序难以受我们的掌控,使程序难以理解和难以修改,且任何使用 goto 语句的程序可以改写成不需要使用 goto 语句的写法,所以大家在写程序时候尽量避免写goto哦~”
通过这些,贝蒂相信你已经对循环有了一定的理解,有能力成功把贝蒂从无限循环中拯救出来哦~