误人子弟的保姆级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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,723评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,485评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,998评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,323评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,355评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,079评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,389评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,019评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,519评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,971评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,100评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,738评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,293评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,289评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,517评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,547评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,834评论 2 345

推荐阅读更多精彩内容