误人子弟的保姆级C语言教程(贰)

前言

上一篇讲了变量,输入输出等基本的内容。
不知道聪明的同学是否认真完成作业了~


38.jpg

下面公布作业的答案~

  1. 设计一个程序,让用户依次输入两个数,输出这两个数的加减乘除四则运算的结果。


    image.png
  2. 设计一个程序,让用户依次输入两个数,将两个变量互换以后输出。


    image.png

如果之前没有写出来,这里看完思路之后记得自己去重新写一遍~

今天我们将会讲一些新的概念。

分支

我们的宾馆建好了,里面也有了各种房型以及形形色色的顾客,警示标语也贴的到处都是,但是这个宾馆还是评级不高,为啥啊?
你说为啥?你见过给你一块地让你建宾馆,结果你建了一座笔直笔直的建筑?这不浪费吗?有的顾客想找房间还得走出好远~

所以这里引入一个新的概念,分支

众所周知,如果没有特殊情况,程序是按顺序从上至下一条一条执行的。
而如果我们想改变一些程序的执行顺序,必然要有一些分支。
比如我们把昨天的作业题改一下。

  • 设计一个程序,让用户依次输入两个数,然后再让用户输入1、2、3、4四个数的其中一个,当用户输入这四个数中任意一个的时候,依次显示a+b,a-b,a*b,a/b的值。当用户输入其他数字的时候,输出输入错误。

卧槽这是什么,怎么忽然变得这么难了?大佬放我走吧我不学了!


9.jpg

别急,我先随便写一下代码,你再来感受一下这个是不是传说中那么难。

    int a,b,operation;
    printf("请输入数字a:");
    scanf("%d",&a);
    printf("请输入数字b:");
    scanf("%d",&b);
    printf("请选择你要执行的运算,1-加法,2-减法,3-乘法,4-除法:");
    scanf("%d",&operation);
    if (operation == 1){
        int d = a+b;
        printf("a+b=%d",d);
    }else if (operation == 2){
        int d = a-b;
        printf("a-b=%d",d);
    }else if (operation == 3){
        int d = a*b;
        printf("a*b=%d",d);
    }else if (operation == 4){
        int d = a/b;
        printf("a/b=%d",d);
    }else{
        printf("输入有误");
    }
image.png

怎么样,根据你所学的知识理解一下,是不是也不难,只不过里面加了if else之类的语句。

if 和 else

在上面的程序中,我们也认识了一个新朋友,if和else。
把这俩哥们好好组合起来,就可以成为最简单的分支结构。

    if (条件){
        执行的语句;
    }else{
        否则执行的语句;
    }
image.png

当然,有一些条件比较复杂,我们可以用else if来做衔接

    if (条件1){
        执行的语句;
    }else if(条件2){
        不满足条件1且满足条件2执行的语句;
    }else{
        否则执行的语句;
    }
image.png

一些需要注意的

  • else和if是逻辑对立的,是互相排斥的。就像上面的图,if和else刚好把红色的圆给平分,且互相没有交集。
  • else和if之间可以夹杂无限个else if 但是每个条件不能有交集
    比如
    if (猫){
        
    }else if(小白猫){
        
    }else{

    }

就是错误的逻辑,因为小白猫属于猫的一种,所以不可以用else if。条件2里面的else已经把条件1的猫给排除了。

  • 可以只有if没有else。
    if (猫) {
        
    }
  • 多个if和else可以嵌套,else将会和距离他最近的if配对
    if (猫){
        if (小白猫){

        }else{
            //这个else和上面的if (小白猫)配对
        }
    }else if(狗){
        
    }else{
        //这个else和上面的 if (猫)以及else if(狗)配对
    }
  • 如果if里面只有一行语句,if后面的大括号{}可以省略(但是我不建议这样做,因为会乱套)
if (猫) printf("喵");

所以if后面的条件咋写啊?

写了这么多伪代码,只是希望聪明的同学能明白if的结构。
那么现在我们来具体说一下if后面括号里的条件该怎么写。

比较运算符

我们用这些运算符来比较变量的大小,从而作为条件

  • 大于号> ,小于号<
    if (a > 0) {
        //如果a大于0则执行
    }
  • 大于等于>=,小于等于<=
    if (a >= 0) {
        //如果a大于等于0则执行
    }
  • 相等 ==
    if (a == 0) {
        //如果a等于0则执行
    }

这里相等是比较特殊的。据我所知,大部分编程语言都是用连等号来表示相等。用以和赋值区分。
比如上面的a==0是a等于0的意思,而a=0是把0赋值给a的意思。

  • 不等于 !=
    if (a != 0) {
        //如果a不等于0则执行
    }

逻辑运算符

我们用这些运算符来进行一些逻辑运算,从而把比较运算符关联起来。

  • 逻辑且 &&
    if (a > 0 && b>0) {
        //如果a>0且b>0则执行,必须要a>0和b>0两个条件都满足,才可以
    }
  • 逻辑或 ||
    if (a > 0 || b>0) {
        //如果a>0或b>0则执行,满足a>0或b>0任意一个条件即可
    }
  • 逻辑非 !
    if (!a > 0) {
        //如果不满足a>0则执行,说白了就是a不大于0,也就是a<=0
    }
注意事项
  • 逻辑与逻辑之间是可以嵌套的,也有一定的运行优先级,不过我建议直接无视优先级,把单一的逻辑用括号括起来。
    比如
    if (a > 0 || (b == 0 && c > 0)) {
        //如果 a大于0 或 b等于0且c大于0 则执行
    }

事实上 a > 0 || b == 0 && c > 0 不加括号和上面的结果是一样的。&&的优先级比||要高,不过我依然建议加括号,方便自己看得更明白。

一些好玩的东西

//这两个是等价的,是省略写法
    if (a) {

    }
    if (a!=0) {

    }
//这两个也是等价的,是省略写法
    if (!a) {

    }
    if (a==0) {

    }

大括号与变量的作用域

我们再来回看一下本篇开篇用于演示的代码

    if (operation == 1){
        int d = a+b;
        printf("a+b=%d",d);
    }else if (operation == 2){
        int d = a-b;
        printf("a-b=%d",d);
    }else if (operation == 3){
        int d = a*b;
        printf("a*b=%d",d);
    }else if (operation == 4){
        int d = a/b;
        printf("a/b=%d",d);
    }else{
        printf("输入有误");
    }

可以看到,每个大括号里都有一个整形变量d。
由此可见,在大括号里定义的变量,最大范围只能在本括号里使用。
所以定义变量的时候需要格外注意,在最合适的地方定义,才是正确的选择。

    int a;
    if (a){
        //这里可以调用a
        a = 0;
        int b;
    }
    //这里不能调用b
    b = 0;//这句会报错
72.jpg

三段式(我也不知道这玩意叫啥)

有一些简单的分支关系,用if来写太麻烦了。
比如

    int a = 0
    if (a == 0){
        a = 1
    }else {
        a = 2
    }
    printf("%d",a);

有没有简单一点的写法呢?
事实上,我们可以这样写。

    int a = 0;
    a == 0 ? a = 1: a = 2;
    printf("%d",a);

这个就是三段式,可以写一些很简单的分支结构。
格式就是

条件?满足条件执行:不满足条件执行;

三段式可以简化代码,但是会降低代码的可读性。所以建议分清使用场合。

switch 和 case

switch和case是另一种分支写法。
一般用于变量的固定数值写分支。

    switch (变量){
        case 数值1:{
              //变量为数值1则执行
        }break;
        case 数值2:{
              //变量为数值2则执行
        }break;
        default:{
              //变量的值上面没包含,则执行
        }break;
    }

比如还是开篇的那个问题,1-加法,2-减法,3-乘法,4-除法,更适合使用switch case来写。

    int a,b,operation;
    printf("请输入数字a:");
    scanf("%d",&a);
    printf("请输入数字b:");
    scanf("%d",&b);
    printf("请选择你要执行的运算,1-加法,2-减法,3-乘法,4-除法:");
    scanf("%d",&operation);
    switch (operation) {
        case 1:{
            int d = a+b;
            printf("a+b=%d",d);
        }break;
        case 2:{
            int d = a-b;
            printf("a-b=%d",d);
        }break;
        case 3:{
            int d = a*b;
            printf("a*b=%d",d);
        }break;
        case 4:{
            int d = a/b;
            printf("a/b=%d",d);
        }break;
        default:{
            printf("输入有误");
        }break;
    }
image.png
注意事项
  • 注意每条后面都要接一个break,如果不加break会有神奇的事情发生~
  • switch和if有各自的使用场景,在很多时候是也是可以通用的。
  • 结尾的default可以不写。就像if没有写else一样。



以上便是分支的全部内容。

这节课内容虽然没有上一节多,但是需要更多的练习才能做好。
这边留几个思考题~

  • 写一个程序,判断用户输入的年份是否是闰年,并输出结果。
  • 写一个程序,让用户给定月份,输出该月有多少天。
    • 进阶:写一个程序,让用户输入年月日,输出该天是当年的第几天。
  • 写一个程序,判断用户输入的数字是否是7的倍数或者含有7的数。
26.jpg
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容