《明解C语言入门篇》读书笔记三

目录

第三章:分支循环结构

第一节:if语句

if语句 · 其一:

奇数的判定:

if语句 · 其二:

奇数 · 偶数的判断:

非0的判断:

if语句结构图:

相等运算符:

余数的判断:

关系运算符:

嵌套if语句:

判断:

计算较大值:

计算三个数的最大值:

条件运算符:

差值计算:

复合语句(程序块):

逻辑运算符:

短路求值:

练习3-1:

练习3-2:

练习3-3:

练习3-4:

练习3-5:

练习3-6:

练习3-7:

练习3-8:

练习3-9:

练习3-10:

练习3-11:

第二节:switch语句

switch语句和break语句:

复杂的switch语句:

switch语句和if语句:

选择语句:

练习3-12:

练习3-13

第三章:分支循环结构

第一节:if语句

📖读书笔记

  • if语句 · 其一:

if语句是逻辑判断语句其中的一种,它的执行条件是控制表达式为真就执行这一条件下的语句,既然这样,就一定会有控制表达式为假的情况,所以if语句就称为逻辑判断语句,判断的结果有真和假两种情况,比如判断一个数是否被5整除的具体代码如下:

//判断一个数是否被5整除
#include<stdio.h>
int main()
{
    int no = 0;
    printf("请输入一个整数:");
    scanf("%d", &no);

    if (no % 5)
        puts("输入的整数不能被5整除。");
    return 0;
}

上述代码中的no%5就是if语句的控制表达式,如果no能整除5,那么这个表达式的结果应该是0,0就是假,就不执行里面的puts语句;反之,表达式的结果非零,就为真,就执行puts语句。

C语言中,0表示假,一切的非零表示真。

  • 奇数的判定:

想要判断一个数是否是奇数,通常的方法是判断这个数是否能整除2,如果不能,就说明这个数字是奇数,具体代码如下:

//判断一个整除是否是奇数
#include<stdio.h>
int main()
{
    int no = 0;
    printf("请输入一个整数:");
    scanf("%d", &no);//键盘输入36

    if (no % 2)
        puts("输入的整数是奇数。");//打印结果为:输入的整数是奇数。
    return 0;
}

if语句的控制表达式no%2的含义是如果这个数能整除2,就说明这个数是偶数,反之是奇数。

  • if语句 · 其二:

在上面的判断一个整除能否被5整除的程序中,如果能被5整除,可是却不显示任何信息,这显然是不合适的,所以if语句通畅还要和else语句搭配使用,else语句表示了if语句中的一个分支。

//判断一个数是否被5整除
#include<stdio.h>
int main()
{
    int no = 0;
    printf("请输入一个整数:");
    scanf("%d", &no);

    if (no % 5)
        puts("输入的整数不能被5整除。");
    else
        puts("输入的整除能被5整除。");
    return 0;
}

如果if语句中的控制表法式为真,就执行if语句中的内容,否则执行else语句中的内容,这就是if...else语句。

  • 奇数 · 偶数的判断:

那么有了else语句的加入,判断奇偶数的程序就可以更加完善了,代码如下:

//判断一个整除是否是奇数
#include<stdio.h>
int main()
{
    int no = 0;
    printf("请输入一个整数:");
    scanf("%d", &no);

    if (no % 2)
        puts("输入的整数是奇数。");
    else
        puts("输入的整数是偶数。");
    return 0;
}
  • 非0的判断:

C语言中,0就代表假,一切非0表示真,利用这个特点,可以判断一个数是否为0,也就是直接把这个变量当成if语句的控制表达式即可,代码如下:

//判断输入的数字是否为0
#include<stdio.h>
int main()
{
    int num = 0;
    printf("请输入一个整数:");
    scanf("%d", &num);

    if (num)
        puts("该整数不是0。");
    else
        puts("该整数是0。");
    return 0;
}
  • if语句结构图:

下图是if语句的语法结构图,这也是最基本、最常见的一种,首先判断if语句中的控制表达式的真假,如果为真,就执行if语句中的内容,否则执行else语句中的内容,所以如果没有意外的话,if语句和else语句中的内容只能也必须执行一个。

  • 相等运算符:

C语言中支持判断两个数或表达式的值是否相等,如果想判断相等就使用“==”运算符,判断不相等就使用“!=”运算符,下面代码是判断两个整数是否相等。

//判断两个整数是否相等
#include<stdio.h>
int main()
{
    int n1 = 0, n2 = 0;
    puts("请输入两个整数。");
    printf("整数n1:");
    scanf("%d", &n1);
    printf("整数n2:");
    scanf("%d", &n2);

    if (n1 == n2)//如果相等,表达式为真,执行if语句,否则执行else语句
        printf("它们相等。");
    else
        printf("它们不相等。");
    return 0;
}

当然上述代码中if语句的条件也可以写成n1 != n2,这样的话,if语句和else语句中的printf语句就需要调换位置了。

  • 余数的判断:

判断所输入的整数的个位数是否为5的代码如下:

//判断所输入的整数的个位数是否为5
#include<stdio.h>
int main()
{
    int num = 0;
    printf("请输入一个整数:");
    scanf("%d", &num);

    if ((num % 10) == 5)
        puts("该整数的个位数是5。");
    else
        puts("该整数的个位数不是5。");
    return 0;
}

if语句中的控制表达式(num % 10) == 5的含义是num除10取余数,如果余数是5,表达式为真,否则为假,其中将num % 10用小括号括起来的目的是先执行这个部分,然后将这个部分的值与5进行比较看是否相等。

  • 关系运算符:

C语言中不仅可以判断两个数大小是否相等,还可以判断两个数之间的大小关系,于是就有4个关系运算符。

运算符

示例

含义

<

a < b

判断a是否小于b。如果a小于b,结果非0,否则结果为0,结果类型都为int

>

a > b

判断a是否大于b。如果a大于b,结果非0,否则结果为0,结果类型都为int

<=

a <= b

判断a是否小于等于b。如果a小于等于b,结果非0,否则结果为0,结果类型都为int

>=

a >= b

判断a是否大于等于b。如果a大于等于b,结果非0,否则结果为0,结果类型都为int

利用关系运算符就可以判断所有整数的大小关系,下面判断一个整数是正数、负数还是0。

//判断一个整数是否为正数
#include<stdio.h>
int main()
{
    int no = 0;
    printf("请输入一个整数:");
    scanf("%d", &no);

    if (no == 0)
        puts("该整数为0。");
    else if (no > 0)
        puts("该整数为正数。");
    else
        puts("该整数为负数。");
    return 0;
}

上述代码中,出现了第三个分支else if语句,这个语句的功能是用来补充if语句的。它和if语句一样,后面括号中都要写控制表达式,并且表达式为真就执行该语句中的内容,否则执行else中的内容,且该语句必须写在if语句和else语句之间,带有else if语句的语法结构图如下:

在一个if条件语句中,else if语句可以有0条至多条,每条语句都对应着一个条件,而if语句和else语句只能是1条,不管是if语句、else语句还是else if语句,它们中的内容可有可无(没有内容用;表示空语句代替),但是if语句和else if语句的判断条件必须存在,语法结构如下:

if(判断条件1)
    执行代码1
else if(判断条件2)
    执行代码2
else if(判断条件3)
    ;                //这个else if语句没有执行代码,用;表示一条空语句
else if(判断条件4)
    执行代码3
...                  //这里简单代表有n条else if语句
else if(判断条件n)
    执行代码n-1
else
    执行代码n
  • 嵌套if语句:

在if语句中再写if语句就是嵌套if语句,可以写一个或多个,但是也不要太多,避免逻辑过于复杂,最多嵌套五六层就够了,如何判断一个正数的奇偶呢,具体代码如下:

//判断一个正数的奇偶
#include<stdio.h>
int main()
{
    int no = 0;
    printf("请输入一个整数:");
    scanf("%d", &no);

    //判断正负
    if (no > 0)
        //判断奇偶
        if (no % 2 == 0)
            puts("该整数为偶数");
        else
            puts("该整数为奇数");
    else
        puts("您输入的不是正数。\a\n");
    return 0;
}

当一个程序中,嵌套了多个if...else语句时,if语句和else语句的匹配规则是:else语句与它最近的没有被匹配的if语句相匹配。

  • 判断:

控制表达式的结果都会有一个值(极少部分除外),程序对这个值的真假进行检测,就称为判断。

  • 计算较大值:

如何使用if语句计算两个整数的较大值呢?首先可以先定义两个变量用来表示两个整数,再将这两个变量的值进行大小比较,进而得出较大值,具体代码如下:

//计算两个整数的较大值
#include<stdio.h>
int main()
{
    int n1 = 0, n2 = 0;
    puts("请输入两个整数。");
    printf("整数n1:");
    scanf("%d", &n1);//键盘输入83
    printf("整数n2:");
    scanf("%d", &n2);//键盘输入45

    //比较
    if (n1 > n2)
        printf("较大的数是%d。\n", n1);//打印结果为:较大的数是83。
    else
        printf("较大的数是%d。\n", n2);
    return 0;
}

还可以把较大的数放在第三个变量max中,然后输出max即可,代码如下:

//计算两个整数的较大值
#include<stdio.h>
int main()
{
    int n1 = 0, n2 = 0, max = 0;
    puts("请输入两个整数。");
    printf("整数n1:");
    scanf("%d", &n1);//键盘输入83
    printf("整数n2:");
    scanf("%d", &n2);//键盘输入45

    //比较
    if (n1 > n2)
        max = n1;
    else
        max = n2;

    printf("较大的数是%d。\n", max);//打印结果为:较大的数是83。
    return 0;
}
  • 计算三个数的最大值:

这个程序比计算两个数的较大值复杂一些,需要定义四个变量,前三个代表三个整数,最后一个代表最大值,在if判断语句中也有多种写法,代码如下:

//计算三个整数的最大值
#include<stdio.h>
int main()
{
    int n1 = 0, n2 = 0, n3 = 0, max = 0;
    puts("请输入三个整数。");
    printf("整数n1:");
    scanf("%d", &n1);//键盘输入45
    printf("整数n2:");
    scanf("%d", &n2);//键盘输入83
    printf("整数n3:");
    scanf("%d", &n3);//键盘输入62

    //比较
    max = n1;//先假设n1是最大值
    if (n2 > max)
        max = n2;
    if(n3 > max)
        max = n3;

    printf("最大值是%d。\n", max);//打印结果为:最大值是83。
    return 0;
}

上述代码的比较逻辑是先假设n1是最大值,把n1给max,然后用另外两个数分别与这个数进行比较。如果n2比n1大,就把n2给max,之后n2与n3进行比较;如果n2比n1小,此时还不能说明n1最大,还要将n1与n3进行比较。

if语句还有其他几种写法,比如:

//计算三个整数的最大值
#include<stdio.h>
int main()
{
    int n1 = 0, n2 = 0, n3 = 0, max = 0;
    puts("请输入三个整数。");
    printf("整数n1:");
    scanf("%d", &n1);//键盘输入45
    printf("整数n2:");
    scanf("%d", &n2);//键盘输入83
    printf("整数n3:");
    scanf("%d", &n3);//键盘输入62

    //比较
    if (n1 > n2)
        if (n1 > n3)
            max = n1;
        else
            if (n2 > n3)
                max = n2;
            else
                max = n3;
    else
        if (n1 > n3)
            max = n2;
        else
            if (n2 > n3)
                max = n2;
            else
                max = n3;

    printf("最大值是%d。\n", max);//打印结果为:最大值是83。
    return 0;
}

这种写法使用了嵌套if,比上面使用两个if语句的逻辑明显复杂许多,想要更简单的表达,直接使用一个条件运算符即可。

  • 条件运算符:

使用条件运算符? :可以大大简化代码量,提高程序的可读性。

//使用条件运算符求两个整数的较大值
#include<stdio.h>
int main()
{
    int n1 = 0, n2 = 0, max = 0;
    puts("请输入两个整数。");
    printf("整数n1:");
    scanf("%d", &n1);//键盘输入83
    printf("整数n2:");
    scanf("%d", &n2);//键盘输入45    

    printf("较大的数是%d。\n", ((n1 > n2) ? (max = n1) : (max = n2)));//打印结果为:较大的数是83。
    return 0;
}

条件运算符的执行逻辑是先判断?前面的表达式,如果成立,则执行?后面的表达式,否则执行:后面的表达式。

条件运算符不仅可以求两个数的较大值,还可以求三个数的最大值,代码如下:

//使用条件运算符求三个数的最大值
#include<stdio.h>
int main()
{
    int n1 = 0, n2 = 0, n3 = 0, max = 0;
    puts("请输入三个整数。");
    printf("整数n1:");
    scanf("%d", &n1);//键盘输入45
    printf("整数n2:");
    scanf("%d", &n2);//键盘输入83
    printf("整数n3:");
    scanf("%d", &n3);//键盘输入62

    //判断
    max = n1;
    (n2 > max) ? (max = n2) : (max);//如果n2大于最大值,则最大值是n2,否则最大值不变
    (n3 > max) ? (max = n3) : (max);//如果n3大于最大值,则最大值是n3,否则最大值不变

    printf("最大值是%d。\n", max);//打印结果为:最大值是83。
    return 0;
}
  • 差值计算:

运用条件运算符还可以计算两个整数的差值,代码如下:

//运用条件运算符计算两个整数的差值
#include<stdio.h>
int main()
{
    int n1 = 0, n2 = 0;
    puts("请输入两个整数。");
    printf("整数n1:");
    scanf("%d", &n1);//键盘输入15
    printf("整数n2:");
    scanf("%d", &n2);//键盘输入32    

    printf("它们的差是%d。\n", ((n1 > n2) ? (n1 - n2) : (n2 - n1)));//打印结果为:它们的差是17。
    return 0;
}
  • 复合语句(程序块):

复合语句就是使用{}包裹起来的语句,也被称为程序块。如果if语句没有被{}包裹,则只能写一条语句,被{}包裹后可以写多条语句,比如:

if(判断条件)
    语句1;
语句2;        //语句1是if语句中的内容,语句2不是

if(判断条件)
{
    语句3;
    语句4;
    语句5;
 }
语句6;        //语句3、4、5是if语句中的内容,语句6不是

同样,else if语句和else语句都可以被{}包裹起来形成程序块而写多条语句,否则只能写一条语句。下面通过求两个整数的较大值和较小值来感受程序块:

//求两个整数的较大值和较小值
#include<stdio.h>
int main()
{
    int n1 = 0, n2 = 0, max = 0, min = 0;
    puts("请输入两个整数。");
    printf("整数n1:");
    scanf("%d", &n1);//键盘输入83
    printf("整数n2:");
    scanf("%d", &n2);//键盘输入45    

    //比较
    if (n1 > n2)
    {
        max = n1;
        min = n2;
    }
    else
    {
        max = n2;
        min = n1;
    }
    printf("较大的数是%d。\n", max);//打印结果为:较大的数是83。
    printf("较小的数是%d。\n", min);//打印结果为:较小的数是45。
    return 0;
}

如果if判断结构中,写一条语句就可以了,但还是尽量写{},这是标准的结构,提高了代码的可读性。

  • 逻辑运算符:

如果控制表达式不只是一个表达式,而是由多个表达式的结果组成的条件呢?比如要求表达式的结果既要大于5,又要小于10,这就需要使用逻辑运算符,逻辑运算符有两个,一个是&&(逻辑与运算),另一个是||(逻辑或运算)。

逻辑与是左右两个操作数都为真,结果才为真,有一个为假,结果就是假。逻辑或是左右两个操作数都为假,结果才为假,有一个为真,结果就是真。下面是使用逻辑运算符判断月份所处的季节,代码如下:

//判断月份所处的季节
#include<stdio.h>
int main()
{
    int month = 0;
    printf("请输入月份:");
    scanf("%d", &month);//键盘输入8

    if (month >= 3 && month <= 5)
        printf("%d月是春季。\n", month);
    else if (month >= 6 && month <= 8)
        printf("%d月是夏季。\n", month);//打印结果为:8月是夏季。
    else if (month >= 9 && month <= 11)
        printf("%d月是秋季。\n", month);
    else if (month >= 12 && month <= 2)
        printf("%d月是冬季。\n", month);
    else
        printf("%d月不存在。\n", month);
    return 0;
}

探究为什么不直接写3 <= month <= 5,而是使用逻辑运算符:

表达式3 <= month <= 5的执行顺序是从左向右执行,也就是先判断month是否大于等于3,如果成立,则表达式变成1 <= 5,不成立就变成0 <= 5,所以说不管month是否大于3,结果都为真,这显然是错误的。

上述代码还有其他写法,比如使用||运算符,具体如下:

//判断月份所处的季节
#include<stdio.h>
int main()
{
    int month = 0;
    printf("请输入月份:");
    scanf("%d", &month);//键盘输入8

    if (month <= 0 || month >= 13)
        printf("%d月不存在。\n", month);
    else if (month <= 2 || month >= 12)
        printf("%d月是冬季。\n", month);//打印结果为:8月是夏季。
    else if (month >= 9)
        printf("%d月是秋季。\n", month);
    else if (month >= 6)
        printf("%d月是夏季。\n", month);
    else
        printf("%d月是春季。\n", month);
    return 0;
}

我们看到上面代码中,else if语句的判断条件似乎不完整,比如如果是month >= 9就都列为秋季,写似乎有些不合适,如果month是12、13或14呢?但这却是正确的写法,之所以这样写是因为if条件结构是从上到下依次执行的,所以如果month不在区间[1, 12]中,就会输出该月份不存在,之后如果是小于等于2,大于等于12,就直接输出改月份是冬季,所以执行到这里,month只能是区间[3, 11]之间的数了,如果大于等于9就是秋季。继续向下执行,month是区间[3, 8]之间的数,大于等于6就是夏季,之后month是区间[3, 5]之间的数,就只能是春季了。

  • 短路求值:

在进行短路求值时,要先弄清一件事就是短路指的是什么。短路是使用逻辑运算符时发生的一种现象:当&&左操作数为假时,程序不再向下进行(因为结果一定为假);当||左操作数为真时,程序不再向下进行(因为结果一定为真),这就是短路现象。

//短路求值
#include<stdio.h>
int main()
{
    int a = 3, b = 5, c = 10, d = 0;
    a = (a - 3) || ((c - 2) && d);
    b = (c + d) && (b - a) || (c * 2);
    c = (a - 1) || d && (c - a / 2);
    d = (b - 1) && ((c * d) || (a + 1));
    printf("a = %d, b = %d, c = %d, d = %d\n", a, b, c, d);//打印结果为:a = 0, b = 1, c = 1, d = 0
    //第一个表达式:
    //a - 3为假,c - 2为真,d为假,所以表达式(c - 2) && d为假,所以整体为假,结果a = 0
    //第二个表达式:
    //c + d为真,b - a为真,所以表达式(c + d) && (b - a)结果为真,整体为真,b = 1
    //第三个表达式:
    //a - 1为真,d为假,所以表达式(a - 1) || d为真,c - a / 2为真,所以整体为真,c = 1
    //第四个表达式:
    //b - 1为假,c * d为假,a + 1为真,所以表达式(c * d) || (a + 1)为真,整体为假,d = 0

    a = a && (b - 1) && (d + 1);
    b = (a + 1) || (c - 1) || d;
    c = ((a + b) && (d) && (b - 1)) && a;
    d = (c + 1) || (b - 1) || (c + d);
    printf("a = %d, b = %d, c = %d, d = %d\n", a, b, c, d);//打印结果为:a = 0, b = 1, c = 0, d = 1
    //计算结果之前,a = 0, b = 1, c = 1, d = 0
    //第一个表达式:
    //a为假,所以整体为假,a = 0
    //第二个表达式:
    //a + 1为真,所以整体为真,b = 1
    //第三个表达式:
    //a + b为真,d为假,所以表达式(a + b) && (d)的结果为假,整体为假,c = 0
    //第四个表达式:
    //c + 1为真,所以整体为真,d = 1
    return 0;
}

所以我们可以得出结论,如果一个逻辑表达式中全都是||或&&运算符时,才可以利用短路现象求值,两种运算符都存在时不可以利用。

📝课后习题

  • 练习3-1:

编写一段程序,像下边这样输入两个整数值,如果后者是前者的约数,则显示“B是A的约数”。如果不是,则显示“B不是A的约数”。

请输入两个整数。

整数A:17

整数B:5

B不是A的约数。

✏️解答:

//练习3-1
#include<stdio.h>
int main()
{
    int a = 0, b = 0;
    printf("请输入两个整数。\n");
    printf("整数A:");
    scanf("%d", &a);//键盘输入17
    printf("整数B:");
    scanf("%d", &b);//键盘输入5

    if (a % b == 0)
        printf("B是A的约数。\n");
    else
        printf("B不是A的约数。\n");//打印结果为:B不是A的约数
    return 0;
}

是不是约数只要看A能否整除B即可。

  • 练习3-2:

请考虑一下,如果把代码清单3-9最后的else变为else if(no < 0),结果会怎样呢?

//代码清单3-9
//判断输入的整数的符号
#include<stdio.h>
int main()
{
    int no = 0;
    printf("请输入一个整数:");
    scanf("%d", &no);

    if (no == 0)
        puts("该整数为0。");
    else if (no > 0)
        puts("该整数为正数。");
    else
        puts("该整数为负数。");
    return 0;
}

✏️解答:

如果将else变成else if(no < 0)的话,运行结果依然正确。

if条件判断中,if语句必须存在,但是else if语句和else语句可有可无,即使有else if语句,else语句也可以没有。

  • 练习3-3:

编写一段程序,像下边那样输入一个整数值,显示出它的绝对值。

请输入一个整数:-8

绝对值是8。

✏️解答:

//练习3-3
#include<stdio.h>
int main()
{
    int num = 0;
    printf("请输入一个整数:");
    scanf("%d", &num);//键盘输入-8

    //方法一:使用-运算符对结果取反
    printf("绝对值是%d。\n", -num);//打印结果为:绝对值是8。

    //方法二:使用if判断
    if (num >= 0)
        printf("绝对值是%d。\n", num);
    else
        //直接打印一个负号
        printf("绝对值是%d。\n", -num);//打印结果为:绝对值是8。

    //方法三:使用条件运算符
    printf("绝对值是%d。\n", (num >= 0) ? num : -num);//打印结果为:绝对值是8。
    return 0;
}
  • 练习3-4:

编写一段程序,像下边这样输入两个整数,如果两数值相等,则显示“A和B相等。”。如果A大于B,则显示“A大于B。”。如果A小于B,则显示“A小于B。”。

请输入两个整数。

整数A:54

整数B:12

A大于B。

✏️解答:

//练习3-4
#include<stdio.h>
int main()
{
    int a = 0, b = 0;
    printf("请输入两个整数。\n");
    printf("整数A:");
    scanf("%d", &a);//键盘输入54
    printf("整数B:");
    scanf("%d", &b);//键盘输入12

    //判断
    if (a > b)
    {
        printf("A大于B。\n");//打印结果为:A大于B。
    }
    else if(a < b)
    {
        printf("A小于B。\n");
    }
    else
    {
        printf("A和B相等。\n");
    }
    return 0;
}
  • 练习3-5:

编写一段程序,确认相等运算符和关系运算符的运算结果是1和0。

✏️解答:

//练习3-5
#include<stdio.h>
int main()
{
    int a = 1, b = 2;
    printf("a == b:%d\n", a == b);//打印结果为:a == b:0
    printf("a != b:%d\n", a != b);//打印结果为:a != b:1
    printf("a < b:%d\n", a < b);//打印结果为:a < b:1
    printf("a > b:%d\n", a > b);//打印结果为:a > b:0
    printf("a <= b:%d\n", a <= b);//打印结果为:a <= b:1
    printf("a >= b:%d\n", a >= b);//打印结果为:a >= b:0
    return 0;
}
  • 练习3-6:

编写一段程序,计算出输入的三个整数中的最小值并显示,注意使用if语句。

✏️解答:

//练习3-6
#include<stdio.h>
int main()
{
    int a = 0, b = 0, c = 0, min = 0;
    printf("请输入三个整数:");
    scanf("%d %d %d", &a, &b, &c);//键盘输入1 2 3

    //判断
    min = a;
    if (b < min)
    {
        min = b;
    }
    if (c < min)
    {
        min = c;
    }
    printf("三个数中的最小值是%d\n", min);//打印结果为:三个数中的最小值是1
    return 0;
}
  • 练习3-7:

编写一段程序,计算出输入的四个整数中的最大值并显示,注意使用if语句。

✏️解答:

//练习3-7
#include<stdio.h>
int main()
{
    int a = 0, b = 0, c = 0, d = 0, max = 0;
    printf("请输入四个整数:");
    scanf("%d %d %d %d", &a, &b, &c, &d);//键盘输入3 1 4 2

    //判断
    max = a;
    if (b > max)
        max = b;
    if (c > max)
        max = c;
    if (d > max)
        max = d;
    printf("四个数中的最大值是%d\n", max);//打印结果为:四个数中的最大值是4
    return 0;
}
  • 练习3-8:

使用if语句替换代码清单3-15程序中的条件运算符,实现同样的功能。

//代码清单3-15
//计算输入的两个整数的差并显示(条件运算符)
#include<stdio.h>
int main()
{
    int n1 = 0, n2 = 0;
    puts("请输入两个整数。");
    printf("整数n1:");
    scanf("%d", &n1);//键盘输入15
    printf("整数n2:");
    scanf("%d", &n2);//键盘输入32    

    printf("它们的差是%d。\n", ((n1 > n2) ? (n1 - n2) : (n2 - n1)));//打印结果为:它们的差是17。
    return 0;
}

✏️解答:

//练习3-8
#include<stdio.h>
int main()
{
    int n1 = 0, n2 = 0;
    puts("请输入两个整数。");
    printf("整数n1:");
    scanf("%d", &n1);//键盘输入15
    printf("整数n2:");
    scanf("%d", &n2);//键盘输入32    

    if (n1 > n2)
        printf("它们的差是%d。\n", n1 - n2);
    else if(n1 < n2)
        printf("它们的差是%d。\n", n2 - n1);//打印结果为:它们的差是17。
    else
        printf("它们的差是0。\n");
    return 0;
}
  • 练习3-9:

使用条件运算符替换练习3-6的程序中的if语句,实现同样的功能。

✏️解答:

//练习3-9
#include<stdio.h>
int main()
{
    int a = 0, b = 0, c = 0, min = 0;
    printf("请输入三个整数:");
    scanf("%d %d %d", &a, &b, &c);//键盘输入1 2 3

    min = a;
    (b < min) ? (min = b) : min;
    (c < min) ? (min = c) : min;
    printf("三个数中的最小值是%d\n", min);//打印结果为:三个数中的最小值是1
    return 0;
}
  • 练习3-10:

编写一段程序,像下边这样输入三个整数,如果三个数都相等,则显示“三个数都相等。”。如果其中任意两个值相等,则显示“有两个值相等。”。如果上述两种情况都不满足,则显示“三个值各不相同。”。

请输入三个整数。

整数A:12

整数B:35

整数C:12

有两个值相等。

✏️解答:

//练习3-10
#include<stdio.h>
int main()
{
    int a = 0, b = 0, c = 0, n1 = 0, n2 = 0;
    printf("请输入三个整数。\n");
    printf("整数A:");
    scanf("%d", &a);//键盘输入12
    printf("整数B:");
    scanf("%d", &b);//键盘输入35
    printf("整数C:");
    scanf("%d", &c);//键盘输入12

    //判断
    n1 = (a == b) && (a == c) && (b == c);//n1为真,三个整数都相等
    if (n1 == 1)
    {
        printf("三个值都相等。\n");
        return 0;
    }

    n2 = (a == b) || (a == c) || (b == c);//n2为真,有两个整数相等
    if (n2 == 1)
    {
        printf("有两个值相等。\n");//打印结果为:有两个值相等。
        return 0;
    }

    //如果n1和n2都为假,三个整数都不相同
    printf("三个值各不相同。\n");
    return 0;
}
  • 练习3-11:

编写一段程序,像下边这样输入两个整数,如果它们的差值小于等于10,则显示“它们的差小于等于10。”。否则,显示“它们的差大于等于11。”,请使用逻辑或运算符。

请输入两个整数。

整数A:12

整数B:7

它们的差小于等于10。

✏️解答:

//练习3-11
#include<stdio.h>
int main()
{
    int a = 0, b = 0, n1 = 0, n2 = 0;
    printf("请输入两个整数。\n");
    printf("整数A:");
    scanf("%d", &a);//键盘输入12
    printf("整数B:");
    scanf("%d", &b);//键盘输入7

    //判断
    
    n1 = n1 || (a - b <= 10);//如果n1为真,说明a - b <= 10成立
    if (n1 == 1)
    {
        printf("它们的差值小于等于10。\n");//打印结果为:它们的差值小于等于10。
        return 0;
    }

    n2 = n2 || (a - b >= 11);//如果n2为真,说明a - b >= 11成立
    if (n2 == 1)
    {
        printf("它们的差值大于等于11。\n");
        return 0;
    }
}

第二节:switch语句

📖读书笔记

  • switch语句和break语句:

switch语句是另一种条件判断结构,在switch语句中,包含了case语句、break语句和default语句。case语句类似于if语句中的每一个分支,如果switch语句括号中的表达式结果等于cast语句中常量表达式的结果,就执行case语句中的内容。

注意cast语句后只能写常量表达式。

如果判断一个数除以3是能整除还是有余数,使用if语句和switch语句都可以判断,下面是使用switch语句的代码:

//判断一个数除以3的余数
#include<stdio.h>
int main()
{
    int no = 0;
    printf("请输入一个整数:");
    scanf("%d", &no);//键盘输入37

    switch (no % 3)
    {
    case 0:
        puts("该整数能被3整除。");
        break;
    case 1:
        puts("该整数除以3的余数是1。");//打印结果为:该整数除以3的余数是1。
        break;
    case 2:
        puts("该整数除以3的余数是2。");
        break;
    }
    return 0;
}

执行switch语句时,先执行表达式no % 3,如果结果为0,则执行case 0中的代码,之后break语句直接跳出switch。如果没有break语句,则程序会找到对应的case语句后继续向下执行,直到遇到break语句或者程序结束才会停止执行switch语句。

  • 复杂的switch语句:

switch语句中还可以存在default语句,该语句的作用相当于if语句中的else,当所有case语句都不满足条件时,才会执行default语句。

  • switch语句和if语句:

switch语句和if语句都是条件判断结构,二者并没有优劣之分,只是在不同的场景使用不同的语句而已,二者所编写的代码也可以相互转换,也就是使用if语句编写的结构,使用switch语句也同样可以编写,但通常还是if语句使用的更多一些,在通过单一表达式来控制程序流程分支时,switch语句更好一些。

  • 选择语句:

switch语句和if语句都被称为选择语句。

📝课后习题

  • 练习3-12:

对代码清单3-4中的程序进行修改,不使用if语句,而改用switch语句来实现。

//代码清单3-4
//输入的整数值是奇数还是偶数
#include<stdio.h>
int main()
{
    int no = 0;
    printf("请输入一个整数:");
    scanf("%d", &no);

    if (no % 2)
        puts("输入的整数是奇数。");
    else
        puts("输入的整数是偶数。");
    return 0;
}

✏️解答:

//练习3-12
#include<stdio.h>
int main()
{
    int no = 0;
    printf("请输入一个整数:");
    scanf("%d", &no);//键盘输入17

    switch (no % 2)
    {
    case 1:
        puts("输入的整数是奇数。");//打印结果为:输入的整数是奇数。
        break;
    case 0:
        puts("输入的整数是偶数。");
        break;
    }
    return 0;
}
  • 练习3-13:

对代码清单3-17中的程序程序进行修改,不使用if语句,而是改用switch语句来实现。

//代码清单3-17
//显示所输入的月份所处的季节
#include<stdio.h>
int main()
{
    int month = 0;
    printf("请输入月份:");
    scanf("%d", &month);

    if (month >= 3 && month <= 5)
        printf("%d月是春季。\n", month);
    else if (month >= 6 && month <= 8)
        printf("%d月是夏季。\n", month);
    else if (month >= 9 && month <= 11)
        printf("%d月是秋季。\n", month);
    else if (month >= 12 && month <= 2)
        printf("%d月是冬季。\n", month);
    else
        printf("%d月不存在。\n", month);
    return 0;
}

✏️解答:

//练习3-13
#include<stdio.h>
int main()
{
    int month = 0;
    printf("请输入月份:");
    scanf("%d", &month);//键盘输入8

    switch (month)
    {
    case 3:
    case 4:
    case 5:
        printf("%d月是春季。\n", month);
        break;
    case 6:
    case 7:
    case 8:
        printf("%d月是夏季。\n", month);//打印结果为:8月是夏季。
        break;
    case 9:
    case 10:
    case 11:
        printf("%d月是秋季。\n", month);
        break;
    case 12:
    case 1:
    case 2:
        printf("%d月是冬季。\n", month);
        break;
    default:
        printf("%d月不存在。\n", month);
        break;
    }
    return 0;
}

以上就是我这次分享的内容啦!写的不好,请多担待!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值