C语言分支语句和循环语句笔记详解

分支语句和循环语句

什么是语句?

C语言中由一个分号;隔开的就是一条语句。比如:

int main()
{
    int a=10;
    10;
    ;//空语句
    return 0;
}

C语言是结构化的程序设计语言

1.顺序结构

2.选择结构

3.循环结构

分支语句(选择结构)

if语句

如果你好好学习,校招时拿号offer,不好好学习,回家种苹果

这就是选择。

那if语句的语法结构是怎么样的呢?

不得不提到一个问题,C语言是如何表示真假?

0表示假,非0表示真

如果表达式的结果为真,则语句执行。

//语法结构:
if(表达式)
  语句;
if(表达式)
  语句1;
else
  语句2;
//多分支  
if(表达式1)
  语句1;
else if(表达式2)
  语句2;
else
  语句3;
int main()
{
    int age=10;
    if(age>=18)
    {
        printf("成年\n");//如果想打印多条语句,带大括号,若不带,只能控制一条语句
    }
    else
    {
        printf("未成年\n");
    }    
    return 0;
}
int main()
{
    int age=20;
    if(age<18)
    {
        printf("少年\n");
    }
    //else if(18<=age<26)//这样写是错误的
    //{
    //    printf("青年\n");
    //}
    else if(age>=18&&age<26)
        printf("青年\n");
    else if(age>=26&&age<40)
        printf("中年\n");
    else if(age>=40&&age<60)
        printf("壮年\n");
    else if(age>=60&&age<100)
        printf("老年\n");
    else
        printf("长生不老\n");
    return 0;
}

悬空else

int main()
{
    int a=0;
    int b=2;
    if(a==1)
        if(b==2)
            printf("hehe\n");
    else
        printf("haha\n");
    return 0;
}

打印结果无,因为if(a==1)压根就没有进去,else与最近的if匹配,所以大家应该有良好的写代码风格,下面的代码是不是更容易读懂呢?显然我们很容易能看懂。

int main()
{
    int a=0;
    int b=2;
    if(a==1)
    {
        if(b==2)
        printf("hehe\n");
    	else
        printf("haha\n");
    }
    return 0;
}

image-20210409201840174

if书写形式对比

//代码1
int main()
{
	if (condition) {
 	 return x;
	}
	return y;
}
//代码2
int main()
{
	if(condition)
	{
  		return x;
	}
	else
	{
  		return y;
	}
}
//代码3
int main()
{
	int num = 1;
	if(num == 5)
	{
 		printf("hehe\n");
	}
}
//代码4
int main()
{
	int num = 1;
	if(5 == num)
	{
  	printf("hehe\n");
	}
}

代码2和代码4更好,逻辑更加清晰,不容易出错。

代码3当我们有时候疏忽将num==5写成num=5时,编译器是不会报错的,但是影响了我们的结果。代码4当我们将5==num写成5=num时,编译器会报错,左值不能是常量。所以良好的代码风格很重要。

判断一个数是不是奇数

int main()
{
    int num=15;
    if(num%2==1)
    {
        printf("是奇数")}
    return 0;
}

输出1-100之间的奇数

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

switch语句

switch语句也是一种分支语句。常常用于多分支的情况。

switch(整形表达式)
{
        语句项;
}

那么语句项是什么

case 整形常量表达式:
	语句;
        //是若干个这样的case语句
int main()
{
    int day = 0;
    scanf("%d", &day);
    switch (day)//switch后的表达式结果必须是整数、字符、枚举量值
    {
    case 1:
        printf("星期1\n");
    case 2:
        printf("星期2\n");
    case 3:
        printf("星期3\n");
    case 4:
        printf("星期4\n");
    case 5:
        printf("星期5\n");
    case 6:
        printf("星期6\n");
    case 7:
        printf("星期7\n");
    }
    return 0;
}

switch后的表达式结果必须是整数、字符、枚举量值,case后面的常量标号,其类型应与表达式的数据类型相同。

当我输入1时,它把case 1、2、…7都输出了,当我们没有写break时,程序就会一直往下走,

所以需要加break,break是跳出分支,搭配break使用才能实现真正的分支,**break是根据需求加的。**这个我们下面讲解。

image-20210409210500025

int main()
{
    int day = 0;
    scanf("%d", &day);
    switch (day)
    {
    case 1:
        printf("星期1\n");
        break;
    case 2:
        printf("星期2\n");
        break;
    case 3:
        printf("星期3\n");
        break;
    case 4:
        printf("星期4\n");
        break;
    case 5:
        printf("星期5\n");
        break;
    case 6:
        printf("星期6\n");
        break;
    case 7:
        printf("星期7\n");
        break;
    }
    return 0;
}

加入break后:

image-20210409210917302

break是根据需求加的

比如1-5输出工作日,6-7输出休息日,则代码如下:

int main()
{
    int day = 0;
    scanf("%d", &day);
    switch (day)
    {
    case 1:
    case 2:
    case 3:
    case 4:
    case 5:
        printf("工作日\n");
        break;
    case 6:
    case 7:
        printf("休息日\n");
        break;
    }
    return 0;
}

default用法:

如果表达的值与所有case后面的值都不匹配,程序不会终止,不会报错,但是,当你不想忽略不匹配所以标签的表达式的值怎么办呢?可以在语句列表中加一条default子句,当输入不匹配时,进入default,如下代码:

int main()
{
    int day = 0;
    scanf("%d", &day);
    switch (day)
    {
    case 1:
    case 2:
    case 3:
    case 4:
    case 5:
        printf("工作日\n");
        break;
    case 6:
    case 7:
        printf("休息日\n");
        break;
    default:
        printf("输入错误\n");//当输入不匹配时,进入default
    }
    return 0;
}

如图:

image-20210409211941373

这里建议大家写switch语句时,都放一条default子句

循环语句

while循环

do while循环(下一笔记会讲解)

for循环(下一笔记讲解)

//while(语句)
{
    //循环体
}
//当语句为真,则进入循环
//while循环打印1-10
int main()
{
    int i = 1;
    while(i <= 10)
    {
        printf("%d",i);
        i++;
    }
    return 0;
}

在whlie循环中,break用于永久的终止循环

int main()
{
    int i=1;
    
    while(i<=10)
    {
        if(i==5)
            break;
        printf("%d",i);//1 2 3 4 
        i++;
    }
}

image-20210409221311796

在whlie循环中,continue的作用是跳过本次循环continue后边的代码,直接去判断部分,看是否进入下一次循环

int main()
{
    int i=1;
    
    while(i<=10)
    {
        if(i==5)
            continue;
        printf("%d",i);//1 2 3 4 ,然后进入死循环
        i++
    }
}

continue会跳过之后的语句,i一直等于5,进入死循环

getchar读取字符

int main()
{
 	int ch =getchar();
    printf("%d\n",ch);
    putchar(ch);//输出一个字符
    return 0;
}

printf %d输出的是获取字符所对应的ascii码值

image-20210409220731895

int main()
{
    int ch=0;
    //按ctal+z--getchar就读取结束
    while((ch = getchar())!EOF)//EOF :end of file,文件末尾
    {
        putchar(ch);
    }
    return 0;
}

大家可以看如下图的解释:

在这里插入图片描述

int main()
{
    char password[20]={0};
    printf("请输入密码:");
    scanf("%s",password);
    printf("请确认密码(Y/N):");
    int ch=getchar();
    if(ch=='Y')
    {
        printf("确认成功\n");
    }
    else
    {
        printf("确认失败\n");
    }
    return 0;
}

image-20210411090755239

getchar、scanf输入函数不是在键盘拿到东西,而是从缓冲区中拿到

其实在输入12345678\n时,而scanf只在缓冲区中拿走12345678,而缓冲区中还有\n

getchar发现缓冲区有东西,直接就将\n拿走,ch不等于\0,走了else,所以直接出现确认失败。

那么怎么解决呢?我们只要把\n拿走,看如下代码

int main()
{
    char password[20]={0};
    printf("请输入密码:");
    scanf("%s",password);
    printf("请确认密码(Y/N):");
    getchar();//清理缓冲区,处理'\n'

    int ch=getchar();
    if(ch=='Y')
    {
        printf("确认成功\n");
    }
    else
    {
        printf("确认失败\n");
    }
    return 0;
}

getchar();是将\n读取进去,但是我们不用他,就相当于清理掉缓冲区
image-20210411143856309
但是这样并不可取,当我们输入以下时,又直接出现确定失败了,为什么呢?

image-20210411144736501

看下图中的解释:

image-20210411164620916

所以当我们后面出现一串字符时,一个getchar是解决不了问题的,这时我们可以写出另外一个代码处理这个问题

int main()
{
    char password[20]={0};
    printf("请输入密码:");
    scanf("%s",password);
    printf("请确认密码(Y/N):");
    //getchar();//清理缓冲区,处理'\n'
    //清理缓冲区中的多个字符
	int temp=0;
    while((temp=getchar())!='\n')
    {
        ;
    }
    
    int ch=getchar();
    if(ch=='Y')
    {
        printf("确认成功\n");
    }
    else
    {
        printf("确认失败\n");
    }
    return 0;
}

image-20210411170342487

当getchar不等于\n时,进行循环,清理缓冲区得多个字符。

下面这个代码什么意思呢?

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

它是putchar数字字符的意思,如下图,A就不会读取。

image-20210411171048432

欢迎大家与我进行学习上的交流!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小赵小赵福星高照~

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

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

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

打赏作者

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

抵扣说明:

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

余额充值