循环结构
循环结构是指在程序中需要反复执行某个功能而设置的一种程序结构。它由循环体中的条件,判断继续执行某个功能还是退出循环。
根据判断条件,循环结构又可细分为以下两种形式:先判断后执行的循环结构和先执行后判断的循环结构。
循环结构里面主要讲一下这几个板块:
循环控制语句
循环控制语句改变你代码的执行顺序。通过它你可以实现代码的跳转,C语言主要有两种循环控制语句,分别为break和continue。
在正式讨论循环类型前,先大致介绍一下循环控制语句:
break:
当 break 语句出现在一个循环内时,循环会立即终止,且程序流将继续执行紧接着循环的下一条语句。
contine:
告诉一个循环体立刻停止本次循环迭代,重新开始下次循环迭代。
循环类型
在使用代码解决一些问题时,会出现一些重复度很高的操作,需要多次执行同一块代码。在这种情况时,使用C语言提供的循环类型可以很好的解决这些问题。
C语言提供了三种循环类型 “while, for, do while”
1、while循环
语法:
while(表达式)
{
循环语句;
}
表达式
循环语句
-
可以是一个单独的语句,也可以是几个语句组成的代码块。
代码实现:
#include <stdio.h>
int main() {
// 定义一个整数数组 arr,包含 5 个元素
int arr[] = {1, 2, 3, 4, 5};
// 计算数组 arr 的长度
int len = sizeof(arr) / sizeof(arr[0]);
// 初始化循环变量 i 为 0
int i = 0;
// 当 i 小于数组长度时,执行循环体
while (i < len) {
// 打印数组中第 i 个元素的值
printf("%d ", arr[i]);
// i 自增 1
i++;
}
// 循环结束后,打印一个换行符
printf("\n");
return 0;
}
break在while循环中的作用
循环中遇到break,就停止后期的所有的循环,直接终止循环。
while中的break是用于永久终止循环的
例子:
#include <stdio.h>
int main() {
int i = 0;
while (i < 10) {
if (i == 5) {
break; // 当i等于5时,跳出循环
}
printf("%d ", i);
i++;
}
printf("\n");
return 0;
}
continue在while循环中的作用
continue是用于终止本次循环的
本次循环中continue后边的代码不会再执行, 而是直接跳转到while语句的判断部分。进行下一次循环的入口判断。
#include <stdio.h>
int main() {
int i = 0;
// 开始一个while循环,只要i小于10就会一直循环
while (i < 10) {
// 如果i等于5
if (i == 5) {
// 增加i的值,即跳过本次循环
i++;
// 继续下一次循环
continue;
}
// 打印i的值
printf("%d ", i);
// 增加i的值
i++;
}
// 循环结束后,打印一个换行符
printf("\n");
return 0;
}
注意:在while()循环中使用continue时,可能会跳过循环中的调整部分,导致死循环
#include <stdio.h>
int main() {
int i = 1;
while (i <= 10){
if (i == 5)
continue;
printf("%d ", i);
i = i + 1;
}
return 0;
}
例子:
输入程序后函数却已知没有输出结果,说明程序陷入了死循环。
多组输入
多组输入的实现也常常通过while循环来达成。再写一些题目时,会发现很多题目都有多组输入的要求,这时候使用while循环便能很好的解决问题
以判断两数大小为例
未要求多组输入代码如下:
#include<stdio.h>
int main() {
int a = 0;
int b = 0;
scanf("%d %d", &a, &b);
if (a > b)
printf("%d>%d\n", a, b);
else if (a < b)
printf("%d<%d\n", a, b);
else printf("%d=%d\n", a, b);
return 0;
}
当要求多组输入时:
#include<stdio.h>
int main() {
int a =0;
int b =0;
while(scanf("%d %d",&a,&b) != EOF) {
if(a > b)
printf("%d>%d\n",a,b);
else if(a < b)
printf("%d<%d\n",a,b);
else printf("%d=%d\n",a,b);
}
return 0;
}
可以发现在代码中多了这样一个部分
while (scanf("%d", &n) != EOF)
{
代码块
}
想要理解这个代码,就需要先了解一下scanf()函数的返回值。
scanf()的返回值:
返回值类型 int
该函数返回成功匹配和赋值的个数。如果到达文件末尾或发生读错误,则返回 EOF。
EOF就让人有些摸不到头脑,转到定义便可以发现,EOF其实是一个标识符常量,值为 -1。
那么表达式 while (scanf("%d", &n) != EOF) 的意思为,当scanf()的返回值不为-1时,表达式为真,进入循环。这时候便出现了一个问题,scanf()返回值为返回成功匹配和赋值的个数,个数最小也不为 -1 ,何时会停止输入呢?当在键盘上按下 ctrl + z 时,scanf()将会返会 EOF(-1),此时循环便会结束。
清空输入缓存区
while循环也可以用来清空输入缓存区
代码实现:
#include <stdio.h>
int main() {
int c;
printf("请输入一些字符:");
// 读取字符直到遇到换行符
while ((c = getchar())!= '\n' && c!= EOF) {
// 这里可以添加对读取字符的处理代码,例如打印或存储
}
// 清空缓冲区后的操作
printf("缓冲区已清空,现在可以进行其他操作了。\n");
return 0;
}
这里使用了 while ((c = getchar()) != EOF && c != '\n');便可以很好的解决问题。
while ((c = getchar()) != EOF && c != '\n') 不断地使用getchar()获取输入缓存区的内容,直到获取到'\n'为止。
2.for循环
语法及代码实现:
语法:
for(表达式1; 表达式2; 表达式3)
{
循环语句;
}
表达式1 表达式1为初始化部分,用于初始化循环变量的。
首先被执行,且只会执行一次。这一步允许声明并初始化任何循环控制变量。也可以不在这里写任何语句,只要有一个分号出现即可。
表达式2 表达式2为条件判断部分,用于判断循环时候终止。
表达式2将进行判断,如果为真,则执行循环主体。如果为假,则不执行循环主体,且控制流会跳转到紧接着 for 循环的下一条语句。
表达式3 表达式3为调整部分,用于循环条件的调整。
该语句允许更新循环控制变量。该语句可以留空,只要在条件后有一个分号出现即可。
代码实现;
#include <stdio.h>
int main() {
int start, end;
printf("请输入范围的起始值:");
scanf("%d", &start);
printf("请输入范围的结束值:");
scanf("%d", &end);
printf("在 %d 到 %d 范围内能被 2 整除的数有:", start, end);
for (int i = start; i <= end; i++) {
if (i % 2 == 0) {
printf("%d ", i);
}
}
printf("\n");
return 0;
}
3.do while循环
语法:
do
{
循环语句;
}
while(表达式);
代码实现:
#include <stdio.h>
int main() { int start, end;
printf("请输入范围的起始值:");
scanf("%d", &start);
printf("请输入范围的结束值:");
scanf("%d", &end);
printf("在 %d 到 %d 范围内能被 2 整除的数有:", start, end);
int i = start;
do {
// 如果 i 能被 2 整除
if (i % 2 == 0) {
// 打印 i
printf("%d ", i);
}
// i 自增 1
i++;
} while (i <= end);
printf("\n");
return 0;
}
相对while循环的优缺点:
do while 循环的优点:
-
至少执行一次循环体:do while 循环会先执行一次循环体,然后再检查条件。这意味着无论条件是否满足,循环体都会执行一次。
-
代码结构清晰:do while 循环的结构使得代码的逻辑更加清晰,尤其是在需要确保循环体至少执行一次的情况下。
do while 循环的缺点:
-
可能导致不必要的执行:如果条件在第一次循环后就不满足,do while 循环仍然会执行一次循环体,这可能导致不必要的执行。
-