zoukankan      html  css  js  c++  java
  • 《专题:C++语法基础》篇四:C++分支程序设计

    摘要:

    计算机不仅需要进行算术运算,还需要具有逻辑功能,C++中程序的逻辑功能通过分支程序设计来实现。

    本文主要解决以下几个问题:

    1、C++中的关系运算
    2、C++中的逻辑运算
    3、if语句
    4、switch语句


    一、关系运算

    所谓关系运算,也即是比较运算。
    1、C++中的关系运算符(6个):<、<=、>、>=、==、!=,其中前四个运算优先级相同,后两个运算优先级相同,且前四个大于后两个。
    2、关系表达式:一般的,关系表达式具有形如 a>b这样的形式,其结果为true或者false。值得注意的是算术运算符的优先级大于关系运算符,关系运算符的优先级大于赋值运算符。

    二、逻辑运算

    1、C++中的逻辑运算符包括:!(逻辑非)、&&(逻辑与)、||(逻辑或)。其中优先级:!>&&>||。
    注意:C++求解逻辑运算采用的准则是:短路求解,即当表达式从左至右进行计算时只要能打出表达式的值,C++便会终止该表达式的计算,比如:
    int a=0,b=1;(b>3)&&(a=2);这个程序在执行到b>3时结果为false,此时程序便会为表达式返回值false,而不会再去计算后面的子表达式,所以程序的执行结果是a=0,b=1,表达式返回值false。
    例子:验证C++程序逻辑表达式的短路短路原则

    /**********
    *验证C++中逻辑表达式的短路求解原则
    *@author|yongchun_zha
    @mail|1729465178@qq.com
    *@version|20161227
    *
    */
    
    #include<iostream>
    
    int main(){
        int b = 2,a=0;
        bool c = (b > 3) && (a = 2);
        std::cout << "int b = 2,a=0;bool c = (b > 3) && (a = 2)
     b=" << b << "   a=" << a << "   c=" << c << std::endl;
        system("pause");
        return 0;
    
    }

    三、if语句

    当程序中表示按照不同情况进行处理的时候,最简单的方法便是使用if语句。
    1、if语句语法规则
    if(条件) 语句
    if(条件)语句1 else 语句2

    形式一表示当括号中的条件满足,则执行后面的语句,否则,什么都不做。
    形式二表示当括号中的条件满足,则执行后面的语句,否则执行else中的语句。

    下面通过一个例子认识使用if语句。
    例子:判断某同学成绩是否及格

    /**************INFO***********
    *@author|yongchun_zha
    *@mail|1729465178@qq.com
    *@version|20161228
    *
    *******************************/
    
    /*
    *if语句的使用认知
    */
    
    #include<iostream>
    using namespace std;
    int main(){
        int gradeA = 80,gradeB=50;
        //形式一
        if (gradeA > 60)cout << "A passed!
    ";
        //形式二
        if (gradeB > 60)cout << "B passed!";
        else cout << "B didn't pass!
    ";
        system("pause");
        return 0;
    
    }

    值得注意的是,当if语句后面的内容多于一条语句时,应使用大括号,即if(条件){语句块}。此外,if语句可嵌套使用。
    下面通过一个例子来熟悉if语句的使用
    例子:求解二元一次方程

    /**************INFO***********
    *@author|yongchun_zha
    *@mail|1729465178@qq.com
    *@version|20161228
    *
    *******************************/
    
    /*
    *if语句应用:求解二元一次方程
    */
    
    #include<iostream>
    #include<cmath>
    
    using namespace std;
    
    int main(){
        float a,b,c;
        cout << "enter a=";
        cin >> a ;
        cout << "enter b=";
        cin >> b;
        cout << "enter c=";
        cin >> c;
    
        if (a == 0)cout << "x=" <<-c/b ;//when a==0
        else{//a!=0
            if (b*b - 4 * a*c < 0)cout << "无解
    ";
            else if (b*b - 4 * a*c == 0)cout << "x="<<-b/2/a;
            else cout << "x1=" << (-b + sqrt(b*b - 4 * a*c)) / (2 * a) << "  x2=" << (-b - sqrt(b*b - 4 * a*c)) / (2 * a)<<endl;
        }
        system("pause");
        return 0;
    
    }

    2、条件表达式
    对于一些简单的分支表达式,C++提供了更为简便的处理方式,即条件表达式,一般的,条件表达式的形式为:
    (条件)?表达式1:表达式2;他表示当括号中的条件满足时,则返回表达式1的值,否则返回表达式2的值。比如,要求a,b两个数中的较大者,你可以这样写(a>b)?a:b;这个表达式的运算结果就是返回a、b中的较大值。

    四、switch语句
    当程序在执行时存在复杂的判断逻辑时,switch语句是优选方案。一般的,switch语句的语法规则如下:
    switch(控制表达式){
    case 常量表达式一:语句;
    case 常量表达式二:语句;
    case 常量表达式三:语句;
    case 常量表达式四:语句;

    default:语句;
    }
    Switch 语句的执行逻辑是程序首先计算控制表达式的值,然后根据这个结果与常量表达式进行匹配,然后从开始匹配的那一个case子句开始一直执行到程序结束。如果没有匹配项,则执行default子句,当然,default子句可以省略。也就是说当常量表达式的值与常量表达式2的值一致时,那么程序会从cass子句开始执行,依次执行2,3,4….直到程序结束。其他情况也类似。
    例子:输入一个星期的数字,输出中文。

    /**************INFO***********
    *@author|yongchun_zha
    *@mail|1729465178@qq.com
    *@version|20161230
    *
    *******************************/
    
    /*
    *switch应用:输入一个星期中的数字,输出中文
    */
    
    #include<iostream>
    using namespace std;
    
    int main(){
        int day;
        cout << "输入数字星期:";
        cin >> day;
        switch (day){
        case 1:cout << "周一" << endl; break;
        case 2:cout << "周二" << endl; break;
        case 3:cout << "周三" << endl; break;
        case 4:cout << "周四" << endl; break;
        case 5:cout << "周五" << endl; break;
        case 6:cout << "周六" << endl; break;
        case 7:cout << "周日" << endl; break;
        default:
            cout << "输入错误!";
    
        }
        system("pause");
        return 0;
    
    }

    综合应用
    注:本例中使用到了for循环结构,将在下一讲中介绍。
    例子:关系运算与逻辑运算的应用

    /******************************
    *逻辑运算的应用
    *@author|yongchun_zha
    @mail|1729465178@qq.com
    *@version|20161227
    *
    *******************************/
    
    
    /*问题描述*/
    /*
    由甲乙丙丁四位同学的描述求出湖的大小顺序
    已知下面的描述中,每人仅答对一个
    甲:洞庭湖最大,洪泽湖最小,鄱阳湖第三
    乙:洪泽湖最大,洞庭湖最小,鄱阳湖第二,太湖第三
    丙:洪泽湖最小,洞庭湖第三
    丁:鄱阳湖最大,太湖最小,洪泽湖第二,洞庭湖第三
    */
    
    /*求解思路*/
    /*
    首先我们约定
    A、B、C、D分别表示甲、乙、丙、丁
    DongTing-->洞庭湖、HongZe-->涵泽湖、PoYang-->鄱阳湖、TaiHu-->太湖
    1、2、3、4表示湖的大小
    则甲的表述等价于:DongTing==4 && HongZe==1 && PoYang==3
    乙的表述等价于:HongZe==4 && DongTing==1 && PoYang==2 && TaiHu==3
    丙的表述等价于:HongZe==1 && DongTing==3
    丁的描述等价于:PoYang==4 && TaiHu==1 && HongZe==2 && DongTing==3
    
    而需要满足的条件是:
    甲只有一个说对:(DongTing==4 )+ (HongZe==1) + (PoYang==3)==1
    乙只有一个说对:(HongZe==4) + (DongTing==1) + (PoYang==2) + (TaiHu==3)==1
    丙只有一个说对:(HongZe==1) + (DongTing==3)==1
    丁只有一个说对:(PoYang==4) + (TaiHu==1) + (HongZe==2) + (DongTing==3)==1
    */
    #include<iostream>
    
    //结构体存储四个湖的大小
    struct Lake{
        int DongTing = 0;
        int HongZe = 0;
        int PoYang = 0;
        int TaiHu = 0;
    };
    
    int main(){
        ////初始化
        Lake A, B, C, D;//甲乙丙丁四个同学
        A.DongTing = 4; A.HongZe = 1; A.PoYang = 3;//甲同学的描述
        B.HongZe = 4; B.DongTing = 1; B.PoYang = 2; B.TaiHu;//乙同学的描述
        C.HongZe = 1; C.DongTing = 3;//丙同学的描述
        D.PoYang = 4; D.TaiHu = 1; D.HongZe = 2; D.DongTing = 3;//丁同学的描述
    
        /////////求解
        Lake tem, final;//临时对象用于存储结果
        int temcounter = 0, counter = 0;//计数
        //四个for循环遍历所有情况
        //需要保证湖的大小没有重复,且取值仅能为1234;
        for (int a = 1; a < 5; a++){
            tem.DongTing = a;
            for (int b = 1; b < 5; b++){
                tem.HongZe = b;
                if (tem.HongZe == tem.DongTing)tem.HongZe++;
                if (tem.HongZe>4)tem.HongZe = 1;
                for (int c = 1; c < 5; c++){
                    tem.PoYang = c;
                    if (tem.PoYang == tem.DongTing)tem.PoYang++;
                    if (tem.PoYang == tem.HongZe)tem.PoYang++;
                    if (tem.PoYang>4)tem.PoYang = 1;
                    for (int d = 1; d < 5; d++){
                        tem.TaiHu = d;
                        if (tem.TaiHu == tem.DongTing)tem.TaiHu++;
                        if (tem.TaiHu == tem.HongZe)tem.TaiHu++;
                        if (tem.TaiHu == tem.PoYang)tem.TaiHu++;
                        if (tem.TaiHu>4)tem.TaiHu++;
                        temcounter++;
                        //判断条件
                        if (((tem.HongZe == A.DongTing) + (tem.HongZe == A.HongZe) + (tem.PoYang == A.PoYang) == 1)//甲同学的描述只有一个正确
                            && ((tem.DongTing == B.DongTing) + (tem.HongZe == B.HongZe) + (tem.PoYang == B.PoYang) + (tem.TaiHu == B.TaiHu) == 1)//乙同学的描述只有一个正确
                            && ((tem.DongTing == C.DongTing) + (tem.HongZe == C.HongZe) == 1)//丙同学的描述只有一个正确
                            && ((tem.DongTing == D.DongTing) + (tem.HongZe == D.HongZe) + (tem.PoYang == D.PoYang) + (tem.TaiHu == D.TaiHu) == 1))//丁同学的描述只有一个正确
                        {
                            final = tem;//找到目标后赋值给final。
                            counter = temcounter;
                            break;
                        }
                    }
                }
            }
        }
    
        ////输出结果
        std::cout << "the size of four lakes:"
            << "
    *****************************"
            << "
    DongTing=	" << final.DongTing
            << "
    *****************************"
            << "
    HongZe=		" << final.HongZe
            << "
    *****************************"
            << "
    PoYang=		" << final.PoYang
            << "
    *****************************"
            << "
    TaiHu=		" << final.TaiHu
            << "
    *****************************
    "
            << "counter=" << counter << std::endl;
    
        system("pause");
        return 0;
    
    }
  • 相关阅读:
    Android编译系统环境过程初始化分析【转】
    Android内核开发:理解和掌握repo工具【转】
    QQ空间如何设置被删除的好友不能访问空间
    用简单的C语言实现多任务轮流切换(模拟操作系统线程机制)【转】
    可重入函数与不可重入函数【转】
    关于链表中头指针和头结点的理解【转】
    C语言中static的使用方法【转】
    指针与地址的区别【转】
    柔性数组【转】
    void及void指针介绍【转】
  • 原文地址:https://www.cnblogs.com/yczha/p/13160293.html
Copyright © 2011-2022 走看看