While模板代码在我的Github:While源代码
5.2 使用 while
语句实现循环
基本概念
while
语句是 C 语言中实现循环结构的基本方式之一。它允许代码在满足特定条件时重复执行。其基本形式如下:
while (条件表达式)
语句
这里的“语句”可以是一个简单语句或一个复合语句(由花括号 {}
包围的多个语句)。循环的执行次数由“条件表达式”控制,只要条件表达式的结果为真(非0),就执行循环体内的语句。
循环的执行过程
以 while
循环输入和计算50个学生的成绩为例,过程如下:
- 初始化循环控制变量
i
为1。 - 进入
while
循环,条件检查i <= 50
。 - 如果条件为真,执行循环体,输入一个学生的成绩并计算平均分。
- 执行
i++
,i
的值增加1。 - 重复步骤2-4,直到
i
的值变为51,条件为假,退出循环。
代码实例
#include <stdio.h>
int main() {
int i = 1;
float score1, score2, score3, score4, score5, aver;
while (i <= 50) {
scanf("%f,%f,%f,%f,%f", &score1, &score2, &score3, &score4, &score5);
aver = (score1 + score2 + score3 + score4 + score5) / 5;
printf("aver=%7.2f\n", aver);
i++;
}
return 0;
}
示例 5.1: 累加1至100
解题思路
这个问题要求我们计算从1到100的总和。这可以通过一个简单的累加循环实现,每次循环将当前的数加到总和中,然后将计数器加1。
代码实现
#include <stdio.h>
int main() {
int i = 1, sum = 0;
while (i <= 100) {
sum += i; // 累加当前值到sum
i++; // 计数器i增加1
}
printf("sum=%d\n", sum);
return 0;
}
程序分析
- 复合语句的使用: 如果循环体包含多条语句,必须用花括号
{}
包围起来。否则,while
语句只会将其后的第一个语句视为循环体。 - 初始值的重要性: 变量
i
和sum
必须在循环开始前被初始化,否则会导致不可预测的行为。 - 循环结束条件: 在循环体中必须有使循环趋向结束的操作,如
i++
。如果没有这样的操作,将导致无限循环。
通过这样的结构,我们不仅可以高效地处理重复的任务,还能保持代码的整洁和易于维护。
2024/9/1日补充
网课区域:
课后笔记:鹏哥C语言网课3.1 - while
循环及相关语句
实际讲解内容概述
本节课主要讲解了C语言中的while
循环,以及break
和continue
语句在while
循环中的应用。同时,还讲解了如何使用getchar()
来防止缓存区残留的\n
字符影响后续代码的判断,特别是在处理字符串输入时的应用。
例题部分:
我的理解:
这一部分例题讲解主要基于讲义中的两段代码来讲的就是下图所示第一段代码告诉我们该如何使用while循环和getchar来连续输入,以及这样做有时候会遇到的问题。
我的理解:
这一部分鹏哥叫我们如何通过MSDN查询C语言库函数的基本用法,在我看来MSDN其实就是微软自己弄出来的一本类似于函数字典的东西不过是电子版
我的理解:
这里鹏哥教我们如何查找不认识的EOF,通过上图我们就能查到C底层是怎么写的。为我们今后考虑问题提供了一种新的思路。
我的理解:
这里解释了为什么要用int形变量来存储getchar()因为在读文件的时候文件末尾的EOF是被系统宏定义成-1了
我的看法和疑问:
此处鹏哥只负责引入了缓冲区的概念但是没有讲解为什么要多此一举设计这个缓冲区。
我的理解:
这里通过引入缓冲区的概念来告诉我们其实,C语言在设计的时候设计了一个叫缓冲区的东西,C primer Plus里面已经告诉我们为什么引入
我的理解:
上图其实就是鹏哥想教会我们如何使用Git把自己本地的代码上传到远程仓库
重点内容
-
while
循环的基本语法和执行流程:while
循环的语法结构为:while (表达式) { 循环语句; }
- 在
while
循环中,条件表达式每次循环开始时都会被评估。如果条件为真(非零),则执行循环体中的语句;否则,循环结束。
-
getchar()
的作用:getchar()
用于从输入缓冲区读取一个字符。在处理字符串输入时,getchar()
通常被用来清除输入缓冲区中残留的\n
字符,以防止它影响后续的输入或判断逻辑。例如,在输入密码后,getchar()
可以清除回车键留下的\n
,防止其影响确认密码的判断。
-
break
语句的作用:break
语句用于立即终止循环。不管当前循环是否已经完成,当遇到break
时,程序会跳出循环并继续执行循环后的代码。- 例子:当
i
等于5时,break
语句触发,循环提前终止:int i = 1; while (i <= 10) { if (i == 5) break; printf("%d ", i); i = i + 1; }
- 输出结果:
1 2 3 4
。
-
continue
语句的作用:continue
语句用于跳过当前循环中剩余的代码,并立即开始下一次循环的判断过程。- 例子:当
i
等于5时,continue
语句跳过printf
的执行:int i = 1; while (i <= 10) { if (i == 5) continue; printf("%d ", i); i = i + 1; }
- 输出结果:
1 2 3 4 6 7 8 9 10
。
难点与易错点
-
EOF
的使用与理解:EOF
是C语言中用于表示文件结束的标记,通常定义为-1
。在使用getchar()
读取输入时,遇到EOF
意味着输入结束。因为EOF
是-1
,所以在处理字符输入时,返回值应存储在int
类型变量中,以避免数据丢失。- 易错点:初学者常常会将
EOF
的返回值存储在char
类型的变量中,导致无法正确判断文件结束条件。
-
getchar()
清理缓冲区的作用:- 在读取字符串输入(如
scanf
)后,缓冲区可能还会残留一个\n
字符。如果不处理这个字符,可能会影响后续输入或判断逻辑。通过调用getchar()
,可以读取并丢弃这个残留的\n
,确保下一次输入或判断正常进行。 - 易错点:忽略处理缓冲区中的
\n
,导致程序行为异常。
- 在读取字符串输入(如
-
while
循环与continue
的结合:- 在使用
continue
时,容易忽略循环变量的更新,导致死循环或意外的行为。尤其是在循环初期阶段,未正确理解continue
的作用,可能会导致程序逻辑错误。 - 易错点:未在
continue
前后正确处理循环变量的更新。
- 在使用
我的感悟:
读者不难发现,网课的内容其实是对书里的很大的补充,如果只看书是不知道有这些技巧的,我也不知道国内的书为什么没有,不过C Primer Plus有所提及,在我新的博客中也把今天缓冲区的文章更新了,想继续深入学习的读者可以进入下一个关卡:8.2 缓冲区以及最近跟新的三篇文章。接下来就是实战环节了。