《专题: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;

}
原文地址:https://www.cnblogs.com/yczha/p/13160293.html