当前位置:网站首页>【C语言】手撕循环结构 —— while语句
【C语言】手撕循环结构 —— while语句
2022-08-02 13:04:00 【凡人编程传】
作者:凡人编程传
系列:C语言初阶(适合小白入门)
说明:以凡人之笔墨,书写未来之大梦
无论是生活还是程序不是所有的事情都是分支结构能解决的,继系列进入全新一个章节——循环结构,在这一文章中主要介绍循环结构的while语句,希望你能有收获。
while语句的基本结构
while(表达式)
语句;
while语句的简单使用
- 输出1-10
#include<stdio.h>
int main()
{
int i = 1;
while (i <= 10)
{
printf("%d ", i);
i++;
}
return 0;
}
运行结果:
首先表达式内为i<=10,意思是当i这个变量的值小于等于10的时候执行花括号内的语句.
那么现在不妨把里面的i++这条语句会怎么样呢?
#include<stdio.h>
int main()
{
int i = 1;
while (i <= 10)
{
printf("%d ", i);
}
return 0;
}
运行结果:
没有了i++这条语句那么每个周期执行的语句就只有输出i,而i的值却没被改变(恒为1),从而导致i<=10这个条件恒成立,也就形成了死循环。
- 请输出1-100的奇数
这个程序可有两种写法,第一种是直接用while来写。第二种是while套一个if语句.
我们知道奇数除2是要余1的,且数学上还有个公式是2k+1,所以如下:
- 法一:
#include<stdio.h>
int main()
{
int i = 1;
while (i <= 100)
{
printf("%d ", i);
i += 2;
}
return 0;
}
运行结果:
- 法二:
#include<stdio.h>
int main()
{
int i = 1;
while (i <= 100)
{
if (i % 2 == 1)
{
printf("%d ", i);
}
i++;
}
return 0;
}
运行结果:
比起法二,大家是不是更喜欢法一的直接了当呢,反正我喜欢…
while语句的扩展使用
这点会涉及到后面数组的内容,我尽量说简单一些,若有刚刚入门的小白可以私信问我或评论区提问。
请看如下代码:
#include<stdio.h>
int main()
{
char password[20] = {
0 };
int ch;
printf("请输入密码:>");
scanf("%s", password);
printf("请确定密码(Y/N):<");
if ((ch = getchar()) == 'Y')
{
printf("确定成功\n");
}
else
{
printf("确定失败\n");
}
return 0;
}
运行结果:
这里是县创建了一个能存放二十个字符的字符数组,scanf那里password之所以不加&(取地址)符号是因为数组名本来就是一个地址。此外,getchar()这个函数是用来读取一个字符存放到变量ch中的。那么为什么我们还没来得及输入,分支结构就已经判断不是Y走else提示确定失败了呢?
因为我们的两个函数scanf和getchar()不是直接接受键盘段读入,而是去字符缓冲区去拿输入的数据的,我们开始输入了123456加一个回车(\n),scanf这个函数吧123456这个数据拿走了剩下一个\n,后面getchar()发现字符缓冲区里面还有一个\n就直接拿走而没有等我们再次输入数据,所以ch存放了一个\n故而\n=='Y’为假不执行if控制的语句,走else。
那么怎么解决这个问题呢?其实很简单,好比接水,你想要一个特定的杯子接最下面的水,你就另外拿杯子把上面的水接完,之后剩下的你就能接到了。
如下:
#include<stdio.h>
int main()
{
char password[20] = {
0 };
int ch;
printf("请输入密码:>");
scanf("%s", password);
getchar();
printf("请确定密码(Y/N):<");
if ((ch = getchar()) == 'Y')
{
printf("确定成功\n");
}
else
{
printf("确定失败\n");
}
return 0;
}
运行结果:
在输入Y之前加一个getchar()把那个剩下的\n读取走,那么第二个getchar()发现字符缓冲区里面没有东西就只有等我们输入。
别高兴的太早,要是我这么输入你看还行吗?
这么输入这个方法又不能解决这个问题了,是因为scanf()这个函数遇见空格他就不读取了,所以字符缓冲区里面还剩下 abc\n这5个字符,而添加的一个getchar()只能读取走一个字符,所以后面的getchar()就读取到a这个字符。那有人肯定说,那还不简单,再加5个getchar()不就行了?可以是可以,那要是后面还剩下100个字符()你是不是要添加100个getchar()?未免太笨拙了点。这时候可以利用到我们刚学到while循环来解决.反正最后一个字符是\n我们不妨循环读取到\n
如下:
#include<stdio.h>
int main()
{
char password[20] = {
0 };
int ch;
printf("请输入密码:>");
scanf("%s", password);
while ((ch = getchar()) != '\n')
{
;
}
printf("请确定密码(Y/N):<");
if ((ch = getchar()) == 'Y')
{
printf("确定成功\n");
}
else
{
printf("确定失败\n");
}
return 0;
}
循环里面的;代表空语句也就是啥都没干。这样就很好读取完了字符缓冲区的字符。
运行结果:
总结
while语句的基本使用就是这些,大家要多多实践练习,多多巩固。好了这一期就结束了,希望你有收获。
边栏推荐
- 分享一个Chrome控制台数据获取的例子
- Redis全部
- Article 48 - Analysis of timestamp2 parameters【2022-08-01】
- Seata分布式事务
- A powerful js pop-up alert plugin
- 【C语言】剖析函数递归(2)
- 节省50%成本!京东云重磅发布新一代混合CDN产品
- Wireless vibrating wire acquisition instrument remote modification method
- [b01lers2020]Welcome to Earth-1
- pytorch model to tensorflow model
猜你喜欢
随机推荐
Seata分布式事务
第48篇-timestamp2参数分析【2022-08-01】
微信小程序getPhoneNumber接口code=40013
To eliminate air bubbles to save the mushroom h5 small game source code
0801~面试题梳理
图神经网络(GNN)的简介「建议收藏」
WeChat applet getPhoneNumber interface code=40013
86.(cesium之家)cesium叠加面接收阴影效果(gltf模型)
方正璞华“劳动人事法律自助咨询服务平台”在武汉武昌区投入使用!
FreeRTOS中名称规范
C语言结构体(入门)
高效代码静态测试工具Klocwork 2022.2——Portal全新升级、支持RLM
什么是 commonjs2
photo-sphere-viewer Chinese documentation
图文短视频自媒体怎么创作?如何让点击量达到10W?
【C语言】剖析函数递归(2)
你知道图论的Dijkstra吗?
sql concat() function
路由-Tab切换页面
FreeRTOS experiment--one function creates multiple tasks