当前位置:网站首页>【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语句的基本使用就是这些,大家要多多实践练习,多多巩固。好了这一期就结束了,希望你有收获。
边栏推荐
- To eliminate air bubbles to save the mushroom h5 small game source code
- The uniapp/applet onload method executes the interpretation every time the page is opened
- In-depth analysis and use of Ribbon load balancing
- scrapy框架初识1
- 机器人碰撞检测方法形式化
- js semi-circle loading progress animation js special effects
- 【C语言】手把手带你写游戏 —— 猜数字
- FreeRTOS--优先级实验
- js true 3d histogram plugin
- js数组递归使用
猜你喜欢
国产 GPU 创业潮 喧嚣下的资本游戏
暑假集训-week2图论
最小割和对偶图(未完成)
Js scratchable latex style draw plug-in
In-depth analysis and use of Ribbon load balancing
To eliminate air bubbles to save the mushroom h5 small game source code
基于 WeihanLi.Npoi 实现excel导入时纯汉字的日期转换
SQL Server 2014 installation tutorial (nanny-level graphic tutorial)
自动生成代码器推荐-code-gen
Custom mvc framework review
随机推荐
定了!2022世界VR产业大会将继续在南昌召开
FreeRTOS creation tasks - dynamic creation, static creation
Taurus.MVC V3.0.3 microservice open source framework released: Make the evolution of .NET architecture easier in large concurrency.
短视频美食自媒体怎么做?5步教你快速上手
MFC入门教程(深入浅出MFC)
【C语言】细品分支结构——if-else语句
Name conventions in FreeRTOS
永远退出机器学习界!
最小割和对偶图(未完成)
scrapy框架初识1
使用Amazon SageMaker 构建基于自然语言处理的文本摘要应用
麻烦问一下,对mysql 场景注入故障,是不是不是对mysql server 端注入故障,只是对ja
Basic operations of openGauss database (super detailed)
Oracle数据库的闪回技术
Redis全部
第48篇-timestamp2参数分析【2022-08-01】
this的绑定指向详细解答
路由-Tab切换页面
【C语言】虐打循环结构练习题
暑假集训-week2图论