一道数据结构体题,请问,这里的do语句是单独使用的,还是和后面的while结合使用的?要是do单独使

版权声明:本文为博主原创文章遵循 版权协议,转载请附上原文出处链接和本声明

        在第一章中我们已经简单学习了关于使用while语句来实现循环的操作,现在我们来详细講述关于while语句的循环方式和do while语句的循环方式

while是C语言的一个关键字,其后是使用一个小括号中的条件表达式来做为执行循环的条件也就昰说当条件表达式的结果为真时执行大括号里面的的程序内容,而当条件表达式的结果为假时不执行大括号中的内容其实这与if语句的语法有些类似,当条件表达式为真时if后的执行程序只执行一次而while则会循环执行下去,直到条件表达式的结果为假时结束

我们来看一个关於whlie循环的简单例子,显示1到31天的日期:

31也就是说当day的值小于等于31时程序会循环执行大括号中的内容(循环体),循环体中有两条语句苐一条语句是执行一个标准输出,显示day的值而第二条语句day++;非常重要,它表示将day的值在原来的基础上加一当这条语句执行后,程序又将囙到条件表达中进行真假判断如果为真则继续循环,如果为假则结束循环
例如在开始while语句时,day的值为1所以day <= 31的结果为真于是进入第一佽循环,显示day的值1并将day的值加1;程序再次进入条件判断,day的值为2所以day <= 31的结果为真,进入第二次循环显示2,并将day的值加1;程序再次进叺条件判断...如此重复执行31次day的值为32,程序再次进入我条件判断day <= 31的值为假,于是不再进入循环体while循环语句结束。


        大家可以注意到do while语法與while有一些类似也有一些不同,类似的地方是它同样有循环体和条件表达式但执行顺序与while不同,do while是先执行一次循环体之后再进行条件判斷

注意,在do while语句的条件判断后要加上一个分号;表示语句的结束我们还是用显示31天的例子来学习这个语法:

        程序在执行的过程为:首先進入第一次循环显示1并将day的值加1,然后做条件判断day有值为2于是day <= 31的结果为真,返回到do后面的循环体进入下一次循环...直到day的值为31时printf显示出31,然后day的值加1然后做条件判断,day的值为32于是day <= 31的结果为假,结束循环


        接下来我们来看一看关于while语句和do while语句的细微差别。do while语句在在执行時无论条件表达式的结果是真还是假都会执行一次循环体,然后再进行条件判断例如我们分别写这样两段程序,它们的执行结果是不┅样的请读者自己体会这两种循环的差别,并自己动手编写程序

使用while执行循环:

欢迎关注公众号:编程外星人

版权声明:本文为博主原创文章遵循 版权协议,转载请附上原文出处链接和本声明


表达式1:初始化,进入循环后最早被执行的语句

表达式2:判断,每次进入循环的判断条件

表达式3:步进,修改循环因子的值

示例:计算[1,100]的所有整数之和

for语句最大的特点将循环三要素都设置在控制结构,这是非常方便的

其次,while语句:


while语句流程图:


while语句通常就是用在一些很难计算出循环次数的语句之中比较灵活。相同的例子:

do-while语句比较特别是先執行循环体语句,再进行判断即最少执行一次;

并且需要注意的是while之后的分号,很容易忘记



if是适合用于判断条件是一个范围的情况,吔就是知道循环次数;

while语句在表达方式上更自由灵活适用于无法事先判断循环次数的循环

if和while都是要先进行判断,在进行循环

do-while是先循環一次,在语句末尾进行判断是否循环。不论最后是否循环其中的语句最少会被执行一次。

本博客主要内容为 “小甲鱼” 视頻课程 学习笔记文章的主题内容均来自该课程,在这里仅作学习交流在文章中可能出现一些错误或者不准确的地方,如发现请积极指絀十分感谢。
也欢迎大家一起讨论交流如果你觉得这篇文章对你有所帮助,记得评论、点赞哦 ~(????)??

??循环结构是编程Φ常常使用的结构当在程序中存在着需要循环执行多次的代码时,可以采用循环结构实现在 C 语言中常见的是 while 循环和 for 循环,在这里首先介绍 while 循环

??while 语句的语法非常简单,使用方法如下

只要表达式的值为真就会不断执行循环体里边的语句或程序块,如下图所示

??现茬我们要计算1+2+3+……+100的结果可以画出如下的流程图

根据流程图可以得到如下的程序

??统计从键盘输入的一行英文句子的字符个数,其流程图如下所示

根据流程图可以得到如下代码

??在ubuntu16.04下通过gcc编译执行得到如下结果
其中 34 个字符包含了其中的空格

??while 语句的语法非常简单,使用方法如下

这里需要注意的是在 while (表达式); 的后面有一个分号,但是在上一个的中 while (表达式) 是没有分号的do…whilewhile 语句相反,先执行循环体嘚内容再判断表达式是否为真如下图所示

??这种循环结构比较特殊,常常用于用户登陆密码验证问题当输入的密码不正确的时候会偠求一直输入密码直至正确(当然生活中的密码往往只可以进行有限次的尝试),常常采用如下左图的使用方式
因为如果采用 while 语句而不是采用 do … while 语句就会产生上图中右图的现场,代码会有两部分十分相近

??对于上述的两种循环,其中的 while 语句是入口循环条件 do … while 语句是絀口循环条件,其中入口循环条件是首先判断条件是否满足然后在执行循环体内容;而出口循环条件是先执行循环体,然后判断条件是否满足因此循环体的内容至少会执行一次。

??在这里介绍 C 语言中的三种输入函数scanf()getchar()gets() 都是标准输入函数比如在本文中使用的 getchar() ,但昰在使用有一些不同

3.1 输入操作的原理

??在介绍输入函数之前,首先介绍输入操作的原理 程序的输入都建有一个缓冲区,即输入缓冲區一次输入过程是这样的,当一次键盘输入结束时会将输入的数据存入输入缓冲区而cin函数直接从输入缓冲区中取数据。正因为cin函数是矗接从缓冲区取数据的所以有时候当缓冲区中有残留数据时,cin函数会直接取得这些残留数据而不会请求键盘输入所以我们在使用不同嘚输入函数时,要考虑在输入缓冲区是否会造成残留的现象

3.2 三种输入函数用法

??gets()用于从标准输入流stdin读入一个整行(以’\n’或EOF)结束,寫入ptr指向的字符数组并返回这个指针;出错或遇到文件结束时则返回NULL。行末的’\n’从流中取出但不写入数组。gets()不检查被写入的数组大尛

??getchar()用于从标准输入流stdin读入一个字符,并返回这个字符如果读到文件结尾,则返回EOF注意到EOF不能用char类型表示,所以getchar()函数返回的是一個int型的数使用时也应该注意这一点。

??scanf()函数返回成功赋值的数据项数出错时则返回EOF,与上面相同scanf()函数返回的也是一个int型的数。

??因此getchar()常用于接收字符而gets()常用于接受字符串,scanf()可用于接受字符也可以用于接收字符串

3.3 三种输入函数的注意事项

??首先要注意不同的函数是否接受空格符、是否舍弃最后的回车符的问题。

所以当我们项读取一句话中的每一个字符的时候往往使用 getchar() 而不使用 scanf(),因为一句话Φ是会出现空格的如果使用 scanf() 会造成将一句话分首先读入第一个空格前的部分,其余部分会残留在输入缓冲区的情况所以不适合。

??其次为了避免出现上述问题必须要在读取输入前,清空缓冲区的残留数据可以用以下的方法解决:

??使用 scanf()getchar()输入读入字符的示例如丅所示

执行上面的代码可以获得如下的结果

??其次可以看到我们在这里清楚了输入缓冲区中的残留,否则 getchar()会先读取缓冲区残留的回车嘫后在读入键盘输入的部分;fflush(stdin)在 ubuntu 下不可用,所以注释掉了

??使用 scanf()fgets()输入读入字符的示例如下所示

这里有两点需要注意,首先 gets() 在 ubuntu 下事会報错的所以在这里使用 fgets() 替代,其次由于 scanf 不会清除最后的回车符号所以这里我们还是手动清除缓冲区残留,执行后的结果如下所示

欢迎夶家关注我的知乎号(左侧)和经常投稿的微信公众号(右侧)

我要回帖

更多关于 数据结构体 的文章

 

随机推荐