C语言第五课:循环语句

目录

前言:

循环语句总览:       

getchar与putchar函数:

1.getchar函数:

1.while循环语句:

        1.while循环语句语法结构:

        2.while语句中的break与continue:

2.for循环语句:

        1.for循环语句语法结构:

        2.for语句中的break与continue:

        3.for语句的循环控制变量:

                1.不可以在for循环体内修改循环变量,以防止for循环失去控制;

                2.建议for循环语句的循环控制变量的取值采用“前闭后开区间”写法:

3.do...while循环语句:

        1.do...while循环语句语法结构:

        2.语句特点:

        2.do...while语句中的break与continue:

相关练习:

        1.计算n的阶乘;

        2.计算1!+2!+3!+...+10!;

        3.在一个有序数组内查找具体的某个数字n(二分查找);

        4.演示多个字符从两端移动,向中间汇聚。


前言:

        上一课我们学习了C语言控制语句中的分支语句部分,在本文中,我将和小伙伴们一同学习循环语句的相关知识。

循环语句总览:       

        有的时候,我们可能需要多次执行同一块代码。一般情况下,语句是按顺序执行的:函数中的第一个语句先执行,接着是第二个语句,依此类推。而编程语言提供了更为复杂执行路径的多种控制结构。循环语句允许我们多次执行一个语句或语句组。

        循环语句主要分为三种循环结构:

        ·while循环语句

        ·for循环语句

        ·do...while循环语句

        在下文中我们将对其逐一进行研究。

getchar与putchar函数:

        在本文及后续的学习中,我们将会用到两个新的函数:getchar函数与putchar函数。

1.getchar函数:

        getchar函数是简单的一次读一个字符的函数,每次调用时从文本流中读入下一个字符,并将其作为结果值返回。值得注意的是,返回值是int类型即它返回的是字符的ASCII码。当程序调用getchar()时,程序就等着用户按键。用户输入的字符被存放在键盘缓冲区中,直到用户按回车为止。

        通俗来说,getchar函数的作用是从键盘(缓冲区)读取用户的输入,返回读取到的字符的ASCII码值。

        但是我们来看下面这段代码:

#include<stdio.h>

int main()
{
    char password[]= {0};
    printf("请输入您的密码:");
    scanf("%s", password);
    printf("确认码(Y/N):");
    char ch = getchar();
    if(ch == 'Y')
    {
        printf("密码已确认!\n");
    }
    else
    {
        printf("未确认密码!\n");
    }
    return 0;
}

        我们可以看出来,这段代码中的getchar函数的目的是想要从键盘中读取我们输入的Y或N,若输入Y则判断为真,即确认输入的密码,否则提示我们未确认。但这段代码运行起来我们发现出现了以下情况:

        程序甚至没有给我确认的机会便直接告知我们“未确认密码!”,这是怎么一回事呢?

        这就牵扯到了getchar函数的读取原理了: 上面我们说过,getchar函数是从键盘缓冲区中读取字符,所以我们来看这里:

scanf("%s", password);

        在这一行我们在使用scanf语句时,我输入的是123456,可是键盘缓存区中只有这六个字符吗?事实上不是的,当我们在这里输入123456这一串字符后,小伙伴们是否敲击了一次回车键来进行确认呢?其实在这个时候,在我们回车确认以后,键盘缓冲区中的实际内容为:

键盘缓冲区
1 2 3 4 5 6 \n

        其中的\n便是我们用于确认时敲击的回车键,它同样作为一个字符存入了键盘缓冲区中,当代码继续向下运行时,scanf函数将我们输入的123456存入了数组password中,此时键盘缓冲区中还剩下一个孤零零的回车键\n

键盘缓冲区
\n

        程序继续向后顺序运行:

char ch = getchar();

        此时,一次读取一个字符的getchar函数将键盘缓冲区中的\n作为一个字符读取出来,并赋给了字符ch,这就导致了程序没有给我们输入的机会,便直接将已经执行过gertchar赋值的ch与字符Y进行了比较,而后直接提示我们“密码未确认”。

        那么我们该怎么处理呢?逻辑很简单——既然缓冲区内还有残留,那我就在识别前提前把缓冲区内的\n读取走,再进行我们的操作就可以了,实现在代码上是:

#include<stdio.h>

int main()
{
    char password[]= {0};
    printf("请输入您的密码:");
    scanf("%s", password);
    printf("确认码(Y/N):");
    getchar();
    char ch = getchar();
    if(ch == 'Y')
    {
        printf("密码已确认!\n");
    }
    else
    {
        printf("未确认密码!\n");
    }
    return 0;
}

         只需要再我们的ch定义前加上一个getchar函数将缓存区中的\n读走,因为我们的程序不考虑\n的使用,所以只需要将其读取走就可以了,而不用去例会它的后续处理。然后继续我们的确认判断就可以了。再运行一下我们发现,程序已经可以完成我们的需求了:

2.putchar函数:

        语法结构为 int putchar(int char),其功能是把参数 char 指定的字符(一个无符号字符)写入到标准输出stdout中,为C库函数,包含在C标准库<stdio.h>中。其输出可以是一个字符,可以是介于0~127之间的一个十进制整型数(包含0和127),也可以是用char定义好的一个字符型变量

        示例(只打印数字字符,跳过其他字符): 

#define _CRT_SECURE_NO_WARNINGS 1

#include<stdio.h>

int main()
{
	char ch = '\0';
	while ((ch = getchar()) != EOF)
	{
		if (ch < '0' || ch>'9')
		{
			continue;
		}
		putchar(ch);
	}

	return 0;
}

         当我们输入hellow123后的运行结果是:

        我们可以看到我们的代码成功的筛选出了数字字符而屏蔽掉了其他的字符,实现方式是通过限定ASCII码值(后续会给各位小伙伴们进行介绍)来实现的。判断条件中的判断标志并不是输入字符EOF,而是一个终止符号,可以通过ctrl+c来破坏判断条件,从而终止循环。

        上面的代码中就运用到了控制语句中循环结构中的while循环语句,下面我们就正式开始学习循环语句的相关知识吧!

1.while循环语句:

        在之前的学习中,小伙伴们已经掌握了if语句的使用,它的运行规则是:当条件满足的情况下,if语句后的语句将被执行,否则不执行。

        但是我们发现,这样的语句只会被判断并执行至多一次,但在我们的日常生活中,我们遇到的实际例子往往是:同一件事请需要我们多次进行执行处理。如果遇到这样的事例我们该如何处理呢?C语言中为我们引入了while循环结构以处理相关需求。

        1.while循环语句语法结构:

while(表达式)
{
    循环语句;
    ...
}

        比如我们想要在屏幕上打印1~10的数字,我们可以这样实现:

#include<stdio.h>

int main()
{
    int i = 1;
    while(i <= 10)
    {
        printf("%d ", i);
        i = i + 1;
    }
    return 0;
}

        while循环结构的执行逻辑很简单:首先定义变量i并初始化为1(从1开始),然后进行判断,如果i小于或等于10(到10为止),便不断循环输出i并在每次输出后将i加一,进入下一次循环判断,直至循环条件不满足,即i大于10后,停止循环,继续顺序运行后面的代码至程序结束。

        2.while语句中的break与continue:

        各位小伙伴们一起来看看下面这段代码,想想它的运行结果是什么:

#include<stdio.h>

int main()
{
    int i = 1;
    while(i <= 10)
    {
        if(i == 5)
        {
            printf("End.\n");
            break;
        }
        printf("%d ", i);
        i = i + 1;
    }
    return 0;
}

        想必大家的心里已经有答案了吧,我们将它运行起来看一看:

         程序运行起来我们可以看到,在程序运行到"i = 5"时,if语句判断为真,将会执行break语句,而此处while循环中的break语句,实现了达成条件跳出循环的功能。即在循环语句中只要遇到break语句,就停止while语句后的全部循环和break语句后的全部语句,直接终止并跳出循环

        break语句通常用在循环语句开关语句中。当break用于开关语句switch中时,可使程序跳出switch而执行switch以后的语句;如果没有break语句, 则将成为一个死循环而无法退出。当break语句用于do-while、for、while循环语句中时, 可使程序终止循环,而执行循环之后的语句。通常break语句总是与if语句一起使用——即满足条件时,便跳出循环。

        知晓了break语句的用法,我们再来看另一段代码:

#include<stdio.h>

int main()
{
    int i = 0;
    while(i <= 9)
    {
        i = i + 1;
        if(i == 5)
        {
            printf("End.");
            continue;
        }
        printf("%d ", i);
    }
    return 0;
}

        小伙伴们认为上面这段代码的运行结果又是什么呢?我们再把它运行起来看看:

        我们看到,continue语句同样可以跳过循环,但与break不同的是,continue语句只用于终止并跳出本次循环,也就是本次循环中continue语句后的代码不再执行,而是直接跳转到while语句的判断部分,进入下一次循环的入口判断。 

2.for循环语句:

        现在我们已经熟悉了while循环语句,那我们为什么还需要for循环语句呢?这是因为,while循环中虽然存在着循环的三个必要条件(初始化、判断和调整),但由于语句风格的问题是的三个部分很可能偏离较远,对于我们开发人员来说,查找和修改就不够方便,至此for循环的必要性就体现出来了。

        1.for循环语句语法结构:

for(表达式1;表达式2;表达式3)
{
    循环语句;
    ...
}

        其中的表达式1为初始化部分表达式2为循环判断条件表达式3为循环执行后调整部分,三个部分一目了然,有利于我们进行查找和修改。

        特别注意:for循环中的初始化、循环判断和调整三部分,都是可以省略的。既可以省略某一项,也可以省略多项,甚至全部省略。但作为初学者,十分不建议省略,因为省略相关内容很容易导致问题。

        同样我们来尝试使用for循环语句来打印1~10的数字:

#include<stdio.h>

int main()
{
    int i = 1;
    for(i = 1; i <= 10; i++)
    {
        printf("%d ", i);
    }
    return 0;
}

        我们可以看到,很轻松就可以实现我们的目的了,并且十分简洁明了。 

        2.for语句中的break与continue:

        在for循环中也可以使用break和continue语句,且它们的意义和用法与在while循环语句中完全相同,在此便不再作过多赘述。

        3.for语句的循环控制变量:

        对于for循环语句中的变量控制,有以下建议:

                1.不可以在for循环体内修改循环变量,以防止for循环失去控制;

                2.建议for循环语句的循环控制变量的取值采用“前闭后开区间”写法:

        以上两条建议,都是良好的代码风格,可以避免很多意料之外的错误产生,大大减少我们后期维护的工作量。

3.do...while循环语句:

        1.do...while循环语句语法结构:

do
{
    循环语句;
    ...
}while(表达式);
//注意最后有一个分号不可以漏掉

        2.语句特点:

        与while循环十分类似。不过不同的是do...while语句是先执行后判断,因此该循环结构的循环语句内容至少会执行一次,但也因此导致其使用场景有限,所以不是很经常使用。

        2.do...while语句中的break与continue:

        在do...while循环中也可以使用break和continue语句,且它们的意义和用法与在while循环语句中完全相同,在此亦便不作赘述。

相关练习:

        1.计算n的阶乘;

        2.计算1!+2!+3!+...+10!;

        3.在一个有序数组内查找具体的某个数字n(二分查找);

        4.演示多个字符从两端移动,向中间汇聚。

        以上就是需要小伙伴们掌握的循环语句的全部内容啦!坚持下去,明天的大道一片光明!文末的例题也希望小伙伴们多动脑筋,独立思考尝试解决,如果有疑问欢迎随时私聊!

        新人初来乍到,辛苦各位小伙伴们动动小手,三连走一走 ~ ~ ~  最后,本文仍有许多不足之处,欢迎各位看官老爷随时私信批评指正!

  • 25
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

銮崽的干货分享基地

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值