选择结构程序设计

选择结构程序设计

if 语句的一般形式

if 语句包含3种形式:

  1. if(表达式)  语句
    
    • 表达式:可以是关系表达式、逻辑表达式,甚至是数值表达式
    • 关系表达式:两个数值进行比较的式子

    示例:

    #include "stdio.h"
    void main()
    {
        int num_age;
        scanf("%d", num_age);
        if (num_age < 12)
            printf("是儿童\n");
        printf("判断结束");
    }
    

    结果:

    10
    是儿童
    判断结束
    
    Press any key to continue
    
    15
    判断结束
    
    Press any key to continue
    
  2. if(表达式)  语句1
    else   语句2
    

    复合语句:

    if(表达式)
    {
        语句1
        语句2
         ...
    }
    else   语句n
    

    示例:

    #include "stdio.h"
    void main()
    {
        int num_age;
        scanf("%d", num_age);
        if (num_age < 12)
            printf("是儿童\n");
        else
            printf("不是儿童\n");
        printf("判断结束");
    }
    

    结果:

    10
    是儿童
    判断结束
    
    Press any key to continue
    
    15
    不是儿童
    判断结束
    
    Press any key to continue
    
  3. else-if多分支语句:

    if(表达式1)  语句1
    
       else if(表达式2)  语句2
    
       else if(表达式3)  语句3
    
       else if(表达式4)  语句4
    
       ...
    
       else if(表达式n)  语句n
    
    else           语句n+1
    
    • 从前往后计算各个表达式的值,如果某个表达式的值为真,则执行对应的语句,并终止整个多分支结构的执行。如果上述所有表达式均不成立,即均为逻辑假时,则执行对应的 else 部分。else 部分可以省略,但一般情况下不省略

    示例:

    #include "stdio.h"
    void main()
    {
        int num_age;
        scnaf("%d", &num_age);
        if (num_age <= 12)
            printf("是儿童\n");
        else if (12 < num_age && num_age <= 18)
            printf("是青少年\n");
        else if (18 < num_age && num_age <= 30)
            printf("是青年\n");
        else if (30 < num_age && num_age <= 60)
            printf("是中年\n");
        else
            printf("是老年人\n");
    }
    

    结果:

    20
    是青年
    
    Press any key to continue
    

...

任务:

1、有两个变量(a和b)通过scanf获取数据

2、通过比较,将最大的数存储到a变量中,将小的数存储到b变量中

3、并打印输出其内容

示例:

#include "stdio.h"
void main()
{
    int a, b, t;
    scanf("%d,%d", &a, &b);
    if (a < b)
    {
        t = a;
        a = b;
        b = t;
    }
    printf("最大的是:%d,最小的是:%d\n", a, b);
}

结果:

4,5
最大的是:5,最小的是:4

Press any key to continue

关系运算符和关系表达式

关系运算符及优先级

用来对两个数值进行比较,即比较符,也称为关系运算符

在c语言中,满足条件时则结果称为“真”,不满足条件时则称为“假”

C语言6中关系运算符:

  • 优先级相同(高)

    < 小于

    <= 小于等于

    > 大于

    >= 大于等于

  • 优先级相同(低)

    == 等于

    != 不等于

由高到低排列:算术运算符、关系运算符、赋值运算符

例如:

c>a+b,等效于c>(a+b),关系运算符的优先级低于算术运算符

a>b == c,等效于(a>b) == c,大于运算符>的优先级高于相等运算符 ==

a == b<c,等效于a==(b<c),小于运算符<的优先级高于相等运算符 ==

a=b>c,等效于a=(b>c),关系运算符的优先级高于赋值运算符

关系表达式

关系表达式:用关系运算符将两个数值或数值表达式连接起来的式子

例如:a>b、a+b>b+c、(a=3)>(b=5)、‘a’<‘b’、(a>b)>(b>c)

关系表达式的值是一个逻辑值,即“真”或“假”

例如:5==3(假);5>=0(真)

在c的逻辑运算中,1代表真,0代表假

示例:

#include "stdio.h"
void main()
{
    int a = 4, b = 5, c = 1, d, f;
    printf("%d\n", 3 > 2);
    printf("%d\n", a > b == c);
    d = a > b;
    f = a<b> c;
    printf("%d,%d\n", d, f);
}

结果:

[Running] cd "d:\vscode(C语言)\" && gcc 选择结构程序设计.c -o 选择结构程序设计 && "d:\vscode(C语言)\"选择结构程序设计
1
0
0,0

[Done] exited with code=4 in 0.191 seconds

逻辑运算符和逻辑表达式

逻辑运算符

例如:如果a小于100,并且b也要小于100时,输出信息;包含两个条件如何处理?

示例:

#include "stdio.h"
void main()
{
    int a, b;
    scanf("%d,%d",&a,&b);
    if (a < 100 && b < 100)
        printf("a和b的值都小于100\n");
    if (a < 100 || b < 100)
        printf("a和b的值有一个小于100\n");
    if (!(a > 100))
        printf("a的值小于100");
}

结果:

110,50
a和b的值有一个小于100

Press any key to continue
...

C逻辑运算符及其含义

运算符 含义 举例 说明
&& 逻辑与 a&&b 如果a和b都是真,则结果为真,否则为假
|| 逻辑或 a||b 如果a和b有一个以上为真,则结果为真,二者都为假时,结果为假
逻辑非 !a 如果a为假,则!a为真,如果a为真,则!a为假

逻辑运算的真值表

a b !a !b a&&b a||b

例如:!a&&b||x>y&&c(先运算!a、再运算x>y、其次进行逻辑与运算、最后进行逻辑或运算)

由高到低排列:!(非)、算术运算符、关系运算符、&&和||、赋值运算符

逻辑表达式

什么是逻辑表达式?

用逻辑运算符将关系表达式或其他逻辑量连接起来的式子

逻辑表达式的值是一个逻辑量“真”或“假”

C语言编译系统在表示逻辑运算结果时,用数值1代表“真”,用0代表“假”,但在判断一个量是否为“真”时,以0代表“假”,以非0代表“真”

示例:

#include "stdio.h"
void main()
{
    int a = 4, b = 5;	//'a' 0 !a a&&b a||b !a||b 4&&0||2 b>3&&8<a-!0
    if (a)
        printf("if语句块被执行了\n");
}

结果:

[Running] cd "d:\vscode(C语言)\" && gcc 选择结构程序设计.c -o 选择结构程序设计 && "d:\vscode(C语言)\"选择结构程序设计
if语句块被执行了

[Done] exited with code=0 in 0.227 seconds

逻辑运算的真值表详细版

a b !a !b a&&b a||b
非0 非0 0 0 1 1
非0 0 0 1 0 1
0 非0 1 0 0 1
0 0 1 1 0 0

注:在逻辑表达式的求解中,不是所有的逻辑运算符都会被执行,只有在必须执行下一个逻辑运算符才能求出表达式的解时,才执行该运算符

例如:

  1. a && b && c 如果a为假,就不会判别b和c,因为只有a为真(非0)时,才需要判别b的值。只有当a和b都为真的情况下才需要判别c的值。如果a为真,b为假,不判别c
  2. a || b || c 只要a为真(非0),就不会判别b和c。只有a为假,才判别b。a和b都为假才判别c

关系表达式和逻辑表达式的值是0和1,而且在判断一个量是否为真时,以0代表假,以非0代表真,那么就可以理解为什么在if语句中表达式可以是任何数值表达式

判断是否为闰年

注:能被4整除,但不能被100整除,如2008;或者能被400整除的都是闰年,如2000

示例:

#include "stdio.h"
void main()
{
    int year;
    scanf("%d", year);
    if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0))
        printf("%d是闰年\n", year);
    else
        printf("%d不是闰年\n", year);
}

结果:

2008
2008是闰年

Press any key to continue

条件运算符和条件表达式

条件表达式的一般形式:表达式1?表达式2 : 表达式3

表达式的的结果是否为真?如果为真,则执行表达式2,否则执行表达式3

例如:

if (a>b)
    printf(“a”);
else
    printf(“b”);

转化后:

(a>b)? printf(“a”): printf(“b”)

示例:

#include "stdio.h"
void main()
{
    int a;
    scanf("%d", &a);
    if (a < 10)
        printf("a的值小于10\n");
    else
        printf("a的值大于10\n");
}

转化后:

#include "stdio.h"
void main()
{
    int a;
    scanf("%d", &a);
    (a < 10) ? printf("a的值小于10\n") : printf("a的值大于10\n");
}     

结果:

5
a的值小于10

Press any key to continue

条件运算符:由两个符号( ? 和 : )组成,必须一起使用,要求有3个操作对象,称为三目运算符,它是C语言中唯一的三目运算符

例如:

c = (a>b)?a:b

根据表达式1的结果,将表达式2或3的结果赋值给变量c

示例:

/*使用条件表达式实现以下要求
输入一个字符,判断它是否为大写字母,如果是,将它转换为小写字母,否则不转换,最后输出得到的字符*/
#include "stdio.h"
void main()
{
    char a;
    scanf("%c", &a);
    a = (a >= 'A' && a <= 'Z') ? a + 32 : a;
    printf("%c\n", a);
}

结果:

H
h

Press any key to continue

选择结构的嵌套

在if语句中又包含一个或多个if语句称为if语句的嵌套

多分支结构就属于if语句的嵌套

if语句的嵌套一般形式如下:

if(表达式1)

	if(表达式2) 语句1

	else  语句2	//第二行与第三行为内嵌if

else

	if(表达式3) 语句3

	else 语句4	//第五行与第六行为内嵌if

示例:

#include "stdio.h"
void main()
{
    int x;
    scanf("%d", &x);
    if (x < 0)
        printf("请输入大于0的数\n");
    if (x < 18)
    {
        if (x < 12)
            printf("是儿童\n");
        else
            printf("是青少年\n");
    }
    else
    {
        if (x < 30)
            printf("是青年\n");
        else if (x < 50)
            printf("是中年\n");
        else
            printf("是老年\n");
    }
}

结果:

40
是老年

Press any key to continue

如何分辨if else的配对?

else总是与它上面最近的未配对的 if 配对

用switch语句实现多分支选择结构

if语句只有两个分支可以选择,如果要实现多个分支,使用起来比较复杂,嵌套的层数比较多,大大降低了代码的可读性。C语言提供了switch语句直接处理多分支选择

switch语句的一般形式:

switch(表达式)
{
	case 常量1:语句1
	case 常量2:语句2
	...
	case 常量n:语句n
	default:	   语句n+1
}

实例:学生成绩分类(85分以上为A等、70-84分为B等、60-69分为C等、60分以下为D等)

转化前示例:

#include "stdio.h"
void main()
{
    char a;
    scanf("%c", &a);
    if (a < 'A' || a > 'D')
        printf("输入错误\n");
    else
    {
        if (a == 'A')
            printf("100~85\n");
        if (a == 'B')
            printf("84~70\n");
        if (a == 'C')
            printf("69~60\n");
        if (a == 'D')
            printf("<60\n");
    }
}

结果:

C
69~60

Press any key to continue

转化后示例:

#include "stdio.h"
void main()
{
    char a;
    scanf("%c", &a);
    switch (a)
    {
    case 'A':
        printf("100~85\n");
        break;
    case 'B':
        printf("84~70\n");
        break;
    case 'C':
        printf("69~60\n");
        break;
    case 'D':
        printf("<60\n");
        break;
    default:
        printf("输入错误\n");
    }
}

结果:

B
84~70

Press any key to continue

switch 详解:

  • switch括号中的表达式,值类型应为整数类型(包括字符型)
  • switch下面的花括号是一个复合语句,都属于switch语句的语句体
  • case和default是标号,用来标志一个位置
  • 执行switch语句时,先计算表达式的值,然后将值与case后面的常量按顺序进行对比,如果相同则从该执行该语句。如果没有相同的常量,则执行default标号后面的语句
  • 可以没有default标号,如果没有与switch表达式相匹配的case常量,则不执行任何语句,继续执行switch语句块后面的代码
  • 各个case标号出现次序不影响执行结果
  • 每个常量值不能重复,否则出现冲突
  • 在case子句中虽然包含了一个以上执行语句,但可以不必用{ }括起来,会自动顺序执行case标号后面的所有语句。加上{}也可以
  • 多个case标号可以公用一组执行语句
  • break语句打断,防止执行完对应语句继续向下执行

实例:应用自动结账(买鞋,1-2双不打折、3-4双打9折、5-6双打8折、7-8双打7.5折、9双以上打7折)

示例:

#include "stdio.h"
void main()
{
    int num, price;
    printf("请输入购买的数量和单价:");
    scanf("%d,%d", &num, &price);
    switch ((int)(num + 1) / 2)
    {
    case 1:
        printf("总价为:%d\n", num * price);
        break;
    case 2:
        printf("总价为:%f\n", num * price * 0.9);
        break;
    case 3:
        printf("总价为:%f\n", num * price * 0.8);
        break;
    case 4:
        printf("总价为:%f\n", num * price * 0.75);
        break;
    default:
        printf("总价为:%f\n", num * price * 0.7);
    }
}

结果:

请输入购买的数量和单价:7,40
总价为:210.000000

Press any key to continue
posted @   Begonia-Sleepless  阅读(56)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示