目录
循环结构
在C语言程序中,有顺序结构、选择结构、循环结构三种结构。我们用分支语句,包括 if语句、switch语句来实现选择(分支)结构;用循环语句,包括 while循环、for循环和do…while循环来实现循环结构。循环结构简言之就是重复不断的执行相同的操作。或者说 相同的操作放在一个循环语句里重复执行。在这里我们来挖掘这三种循环语句的优缺点和三者之间的共性。
while循环
- 语法形式:
while(表达式)
语句//多条语句时需要使用{}把多语句包括起来
- 执行流程
从上述流程图可知:首先先进行表达式的判断,如果条件为真(成立),执行循环体中的语句,返回条件表达式再判断;如果条件判断为假,直接跳出循环,不执行循环体。当条件判断为假,循环结束。 - 案例
练习1:在屏幕上打印1~10的值
#include<stdio.h>
int main()
{
int i=1;
while(i<=10)
{
printf("%d \n",i);
i++;
}
return 0;
}
运行结果:
练习2:输⼊⼀个正的整数,逆序打印这个整数的每⼀位。
例如:输⼊:1234,输出:4 3 2 1
题目分析:
- 要想得到n的最低位,可以使⽤num%10的运算,得到的余数就是最低位,如:1234%10得到4
- 要想去掉n的最低位,找出倒数第⼆位,则使⽤ num=num/10 操作就可以去掉最低位的,如:num=1234/10得到123,123相较于1234就去掉了最低位,123%10就得到倒数第⼆位3。
- 循环1和2两个步骤,在n变成0之前,就能到所有的位。
#include<stdio.h>
int main()
{
int num;
scanf("%d",&num);
while(num)//当num==0时,判断为假,循环结束。(在C语言中,0表示假,非0表示真)
{
printf("%d",num%10);
num=num/10;
}
return 0;
}
运行结果:
for循环
- 语法形式
for(表达式1;表达式2;表达式3)//表达式后面是分号,不是其他符号
语句//有多条语句时使用{}把所有语句包含起来
//表达式1是循环变量的初始化
//表达式2是循环变量的判断
//表达式3是循环变量的调整
仔细观察while语句和循环语句的细微之处;
- 执行过程
⾸先执⾏ 表达式1 初始化循环变量,接下来就是执⾏ 表达式2 的判断部分, 表达式2 的结果如果==0,则循环结束; 表达式2 的结果如果!=0则执⾏循环语句,循环语句执⾏完后,再去执⾏表达式3 ,调整循环变量,然后再去表达式2 的地⽅执⾏判断,表达式2 的结果是否为0,决定循环是否继续。
整个循环的过程中,表达式1初始化部分只被执⾏1次,剩下的就是表达式2语句、表达式3语句在循环。 - 案例
练习:计算1~100之间3的倍数的数字之和
//解法一
int main()
{
int i = 0;
int sum = 0;
for (i = 3; i <= 100; i += 3)
{
sum += i;
}
printf("sum=%d\n", sum);
return 0;
}
//解法二
int main()
{
int i = 0;
int sum = 0;
for (i = 1; i <= 100; i++)
{
if (i % 3 == 0)
sum += i;
}
printf("sum=%d\n", sum);
return 0;
}
运行如下:
do…while循环
- 语法形式
do
{
语句
}while(表达式);//单句语句可以不用代码块{}
- 执行过程
do…while循环,第一步先执行循环体中的语句,再进行条件判断,不同于其他两个循环。如果条件成立,继续执行循环体中的语句,直至条件判断不成立,跳出循环。由此可知,do …while循环 至少要执行循环体中语句一次,其他两个循环则先判断,条件成立再执行,否则不执行。 每一种循环都有它存在的价值,都有适用于它的场景,使程序更加高效,可读性强。fou循环把循环变量初始化、判断、调整放在一个位置一起书写,使得阅读时方便。 - 案例
练习:输⼊⼀个正整数,计算这个整数是⼏位数?
例如:
输⼊:1234 输出:4
#include<stdio.h>
int main()
{
int num = 0;
scanf("%d", &num);
int count = 0;//用来计数整数的位数。
do
{
count++;
num = num / 10;
} while (num);
printf("count=%d\n", count);
return 0;
}
运行结果;
break和continue
细心的人会发现,上面三个循环的执行流程图中都写着break和continue,那么,break和continue在循环之中起什么作用呢?他们在while循环、for循环、do …while循环里作用是否都一样呢?我们学习知识,更应该注重细节,这样,才能更加夯实我们的基础,为之后的学习打下坚实的基础。
首先,我们先来观察break和continue在while循环中的表现,从表现上推出他的作用。
循环中的break
while循环中break
#include<stdio.h>
int main()
{
int i = 1;
while (i <= 10)
{
if (5 == i)
break;//添加了break
printf("%d ",i);
i++;
}
return 0;
}
在while循环中在代码中加了break语句,不再是在屏幕上打印1-10,只是打印了1-4,好像数字五之后的循环被终止了一样。我们再接着看其他连个循环中的break。
for循环中break
int main()
{
int i = 0;
for (i = 1; i <= 10; i++)
{
if (5 == i)
break;
printf("%d ", i);
}
return 0;
}
运行结果:
打印结果同while一样,数值4之后的循环被中断了。
do…while循环中break
int main()
{
int i = 1;
do
{
printf("%d ", i);
i++;
if (i == 5)
break;
} while (i <= 10);
return 0;
}
运行结果:
打印结果同上面循环一样,数值4之后的循环被中断了,不再打印,仿佛数字4之后的循环提前结束了
break的总结
由上可知,break在三个循环中的作用都是是终止循环,作用完全一样。一旦break语句被执行,跳出循环,循环被永久终止,不再执行。
循环中的continue
while循环中的continue
int main()
{
int i = 0;
while (i <= 10)
{
i++;
if (5 == i)
continue;
printf("%d ",i);
}
return 0;
}
运行结果:
没有打印数值5
for循环中的continue
int main()
{
int i = 0;
for (i = 1; i <= 10; i++)
{
if (5 == i)
continue;
printf("%d ", i);
}
return 0;
}
运行结果:
数字5依然被跳过了
do… while循环中的continue
int main()
{
int i = 0;
do
{
i++;
if (i == 5)
continue;
printf("%d ", i);
} while (i <= 10);
return 0;
}
运行结果:
continue的总结
演示三个循环中continue的表现,可知,执行到continue时, 跳过本次循环体中continue之后的语句,跳到条件表达式进行判断,再执行
continue在while循环和for循环的 不同:
在while中,continue正常跳到条件表达式进行判断,但是在for循环中,continue却是跳到循环变量的调整处。
goto语句
C语⾔提供了⼀种⾮常特别的语法,就是 goto 语句和跳转标号, goto 语句可以实现在同⼀个函数内跳转到设置好的标号处。
示例:
int main()
{
printf("haha\n");
goto error;
printf("hehe\n");
error:
printf("跳过了hehe\n");
return 0;
}
运行结果:
分析;
goto语句有特别的应用场景,当嵌套了几个循环时候,可以利用goto语句跳出所有的循环,而break只能跳出限制它的循环,即一个循环,在这一点上,使用goto语句更高效。