乐趣区

关于程序员:解密C语言选择结构掌握条件语句与分支逻辑的利器

✨✨ 欢送大家来到贝蒂大讲堂✨✨

🎈🎈养成好习惯,先赞后看哦~🎈🎈

所属专栏:C 语言学习
贝蒂的主页:Betty‘s blog

引言

C 语⾔是结构化的程序设计语⾔,这⾥的构造指的是 程序构造、抉择构造、循环构造。为什么有着三种构造呢,大家其实能够设想一下,生存中的绝大数事件都能够形象着三种构造,而咱们明天要给大家介绍的就是三大构造之一——抉择构造

抉择构造要求程序员指定 一个或多个要评估或测试的条件,以及条件为真时要执行的语句(必须的)和条件为假时要执行的语句(可选的)。它的流程图大抵如下:

1. 逻辑运算符

在解说什么是抉择构造前,咱们要先理解一些 C 语言常见的逻辑运算符。

### 1.1 逻辑取反运算符

逻辑取反运算符的模式特地简略,只须要在须要进行取反操作的变量前+!:

!(变量名)

假如有变量 a,它的取反规定如下:

a !a

1.2 与运算符

在 C 语言中,并不反对数学上的且,而是由一个运算符 && 代替的。比如说数学上的 0 <x<10 写成 C 语言的模式就是 x >0&&x<10。

假如有两个变量 a,b,与运算符的运算规定如下:

a b a&&b

1.3 或运算符

在 C 语言中,或者也有专门的运算符示意——||

假如有两个变量 a,b,或运算符的运算规定如下:

a b a\ \ b

2. if……else 语句

2.1 if 语句

if 语句是最简略抉择构造语法之一,他的语法结构如下:

if (表达式)
语句

表达式成⽴(为真),则语句执⾏,表达式不成⽴(为假),则语句不执⾏。

C 语言特地规定:非零为真,零为假。

例⼦:输⼊⼀个整数,判断是否为奇数,如果是奇数打印是奇数

#include<stdio.h>
int main()
{
    int num = 0;
    scanf("%d", &num);
    if (num % 2 == 1)
        printf("%d 是奇数 \n", num);
    return 0;
}
  • 首先输出一个值(num),而后进入 if 语句判断,如果 num%2 等于 1,条件就为真,就会打印;反之,条件为假,就不会进入打印。
  • 特地留神: C 语言中判断是否相等的运算符是 ==,= 是赋值符号。

2.2 else

咱们持续以下面例子为列,如果⼀个数不是奇数,那就是偶数了 ,如果任意⼀个整数,咱们要分明的判断是奇数还是偶数怎么表
⽰呢?
这⾥就须要 if…else… 语句了,语法模式如下:

if (表达式)
语句 1
else
语句 2

所以下面的例子能够改写成如下代码:

#include<stdio.h>
int main()
{
    int num = 0;
    scanf("%d", &num);
    if (num % 2 == 1)
        printf("%d 是奇数 \n", num);
    else
        printf("%d 是偶数 \n", num);
    return 0;
}
  • 默认在 if 和 else 语句中默认都只管制⼀条语句

2.3 多个 if else 的应用

if else 语句也能够多个同时应用,形成多个分支,模式如下:

if(判断条件 1){
语句块 1
} else if(判断条件 2){
语句块 2
}else if(判断条件 3){
语句块 3
}else if(判断条件 m){
语句块 m
}else{
语句块 n
}

意思是,从上到下 顺次检测判断条件,当某个判断条件成立时,则执行其对应的语句块,而后跳到整个 if else 语句之外继续执行其余代码。如果所有判断条件都不成立,则执行语句块 n,而后继续执行后续代码。

也就是说,一旦遇到可能成立的判断条件,则不再执行其余的语句块,所以最终只能有一个语句块被执行。

咱们以上面这段代码举个例子:

#include<stdio.h>

int main()
{
    int age = 0;
    scanf("%d", &age);
    if (age > 0 && age < 18) {printf("少年 \n");
    }
    else if (age >= 18 && age < 30) {printf("青年 \n");
    }
    else if (age >= 30 && age < 45) {printf("壮年 \n");
    }
    else if (age >= 45 && age < 55) {printf("中年 \n");
    }
    else if (age >= 55 && age < 75) {printf("老年 \n");
    }
    else {printf("老寿星 \n");
    }
    return 0;
}

假如咱们输出的是 40,输入:

2.4 if else 的嵌套

if else 也能 嵌套应用,也就是说 if 执行的语句中也能够蕴含 if else 语句。咱们用判断三角形来具体阐明这个问题:

#include <stdio.h>
int main()
{
    int a, b, c;
    while(scanf("%d%d%d", &a, &b, &c)==3)
    {if (a + b > c && a + c > b && b + c > a) {if (a == b && b == c) {printf("是一个等边三角形");
            }
            else if (a == b || a == c || b == c) {printf("是一个等腰三角形");
            }
            else if (a * a + b * b == c * c || a * a + c * c == b * b || b * b + c * c == a * a) {printf("是一个直角三角形");
            }
            else {printf("是一个一般三角形");
            }
        }
        else {printf("由 %d,%d,%d 三边组成的不是三角形", a, b, c);
        }
    }
    return 0;
}

2.5 悬空的 else

在书写 if….else 语句时最好每一条语句前面都 加上大括号

至于为什么,咱们能够以上面这段代码举例

#include<stdio.h>
int main()
{
    int a = 0;
    int b = 2;
    if (a == 1)
        if (b == 2)
            printf("hehe\n");
    else
        printf("haha\n");


    return 0;
}// 输入什么???

输入后果:

为什么会什么后果都没有输入呢?

这就是悬空 else 的问题,如果有多个 if 和 else,能够记住这样⼀条规定,else 总是跟最靠近的 if 匹配。最上面的 else 其实是与 if(b==2)这条语句配对的,而不是与 if(a\==1)配对,当 a 等于 0,天然不会进入任何语句。

3. switch 语句

在咱们学习多个 lf else 语句时候就会会发现,如果条件多的话,整个抉择构造就会变得很繁杂,所以 C 语言为了解决这个问题引入了 switch,switch 是另外一种抉择构造的语句,用来代替简略的、领有多个分支的 if else 语句。

比如说上面这段代码就会显得非常冗余

int main()
{
    int day = 0;
    scanf("%d", day);
    if(day == 1)
        printf("星期一 \n");
    else if(day == 2)
        printf("星期二 \n");
    else if (day == 3)
        printf("星期三 \n");
    else if (day == 4)
        printf("星期四 \n");
    else if (day == 5)
        printf("星期五 \n");
    else if (day == 6)
        printf("星期六 \n");
    else
        printf("星期天 \n");
    return 0;
}

3.1 switch 的根本规定

switch 的语法如下:

switch (expression) {
case value1: statement
case value2: statement
default: statement
}

switch语句必须遵循上面的规定:

  1. switch 语句中的括号是一个常量表达式,必须是一个整型或枚举类型。
  2. 在一个 switch 中能够有任意数量的 case 语句。每个 case 后跟一个要比拟的值和一个冒号。

3.2 break 的重要性

学习完 switch 的语法之后,而后咱们能够将最开始的例子革新

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

然而当咱们一运行代码就会发现问题:

为什么输出 1 反而后续的后果都输入了呢?

起因是 switch 语句也是分⽀成果的,只有在 switch 语句中使⽤ break 能力在跳出 switch 语句,如果某⼀个 case 语句的后边没有 break 语句,代码会持续玩下执⾏,有可能执⾏其余 case 语句中的代码,直到遇到 break 语句或者 switch 语句完结。

所以在 switch 语句中 break 语句是⾮常重要的,能实现真正的分⽀成果。

当然,break 也不是每个 case 语句都得有,这就得依据理论状况来看了。

革新代码后;

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

3.3 default 的应用

在使⽤ switch 语句的时候,咱们常常可能遇到⼀种状况,⽐如 switch 后的表达式中的值⽆法匹配代码中的 case 语句 的时候,这时候要不就不做解决,要不就得在 switch 语句中加⼊default ⼦句。

其语法如下:

switch (expression) {
case value1: statement
case value2: statement
default: statement
}

  • switch 后边的 expression 的后果不是 value1,也不是 value2 的时候,就会执⾏ default ⼦句。

就⽐如前⾯做的打印星期的练习,如果 day 的输⼊不是 1~7 的值,如果咱们要提⽰:输⼊谬误,则能够这样实现代码:

#include<stdio.h>
int main()
{
    int day = 0;
    scanf("%d", &day);
    switch (day)
    {
    case 1:
        printf("星期一 \n");
        break;
    case 2:
        printf("星期二 \n");
        break;
    case 3:
        printf("星期三 \n");
        break;
    case 4:
        printf("星期四 \n");
        break;
    case 5:
        printf("星期五 \n");
        break;
    case 6:
        printf("星期六 \n");
        break;
    case 7:
        printf("星期天 \n");
        break;
    default :
        printf("输出谬误 \n");
        break;
    }
    return 0;
}
  • 在 switch 语句中 case 语句和 default 语句是没有程序要求的,只有你的程序是满⾜理论需要的就能够。不过咱们通常是把 default ⼦句放在最初解决的。

4. 综合练习

4.1 题目一

输出三个整数 x,y,z,请把这三个数由小到大输入。

#include <stdio.h>
int main()
{
    int x, y, z, t;
    printf("请输出三个数字:\n");
    scanf("%d%d%d", &x, &y, &z);
    if (x > y) 
    { /* 替换 x,y 的值 */
        t = x; x = y; y = t;
    }
    if (x > z) 
    { /* 替换 x,z 的值 */
        t = z; z = x; x = t;
    }
    if (y > z) 
    { /* 替换 z,y 的值 */
        t = y; y = z; z = t;
    }
    printf("从小到大排序: %d %d %d\n", x, y, z);
    return 0;
}

4.2 题目二

输出某年某月某日,判断这一天是这一年的第几天?

#include <stdio.h>
int main()
{
    int day, month, year, sum, leap;
    printf("请输出年、月、日,格局为:年, 月, 日(2015,12,10)\n");
    scanf("%d,%d,%d", &year, &month, &day);  // 格局为:2015,12,10
    switch (month) // 先计算某月以前月份的总天数
    {
    case 1:
        sum = 0; 
        break;
    case 2:
        sum = 31; 
        break;
    case 3:
        sum = 59; 
        break;
    case 4:
        sum = 90;
        break;
    case 5:
        sum = 120;
        break;
    case 6:
        sum = 151;
        break;
    case 7:
        sum = 181; 
        break;
    case 8:
        sum = 212; 
        break;
    case 9:
        sum = 243;
        break;
    case 10:
        sum = 273; 
        break;
    case 11:
        sum = 304; 
        break;
    case 12:
        sum = 334; 
        break;
    default:
        printf("输出谬误 \n"); 
        break;
    }
    sum = sum + day; // 再加上某天的天数
    if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)) {// 判断是不是平年
        leap = 1;
    }
    else {leap = 0;}
    if (leap == 1 && month > 2) 
    { // * 如果是平年且月份大于 2, 总天数应该加一天
        sum++;
    }
    printf("这是这一年的第 %d 天。", sum);
    printf("\n");
    return 0;
}
退出移动版