3.2 逻辑表达式和条件表达式

【例3.8】 班级评选先进个人,其中一个条件是语文成绩不低于75分且数学成绩不低于85分,输入语文和数学成绩,输入该生是否有资格参选先进个人。
  • 分析: 解决该问题的关键是如何表示语文成绩不低于75分且数学成绩不低于85分这样的条件,我们可以使用之前学习的if的嵌套来实现,也可以使用逻辑表达式来实现, 用逻辑表达式实现比较直观。
  • 设cmark存放读入的语文成绩,mmark存放读入的数学成绩,C++中用&&来连接两个需要同时满足的条件。
用“&&”连接两个同时需要满足的条件程序如下:
                    #include<iostream>
                    #include<cmath>
                    using namespace std;
                    int main() {
                        int cmark, mmark;
                        cin >> cmark >> mmark; //读入语文成绩和数学成绩
                        if (cmark >= 75 && mmark >= 85) {
                          cout << "有资格" << endl; //依据语文和数学成绩是否同时满足条件输出有无参选资格
                        } else {
                          cout << "无资格" << endl;
                        }
                        return 0;
                    }
                
用if嵌套的程序如下:
                    #include<iostream>
                    #include<cmath>
                    using namespace std;
                    int main() {
                        int cmark, mmark;
                        cin >> cmark >> mmark; //读入语文成绩和数学成绩
                        if (cmark >= 75) {        //先判断语文成绩是否达到条件
                          if (mmark >= 85) {       //在语文成绩满足条件的前提下再去判断数学成绩是否满足条件
                            cout << "有资格" << endl;//语文和数学成绩都满足条件,输出“有资格”
                          }
                        }
                        else {
                          cout << "无资格" << endl;//判断语文成绩不满足条件之后可直接输出“无资格”,不需要再判断数学成绩是否满足条件
                        }
                        return 0;
                  }
                
说明: 在该问题中用“&&”连接两个同时需要满足的条件,“&&”是一个运算符,那么,“逻辑与”运算符的运算规则是什么,逻辑运算符有哪些?如何应用逻辑运算符?为了解决这些疑问 ,我们将学习c++中的逻辑表达式,if的嵌套又是如何表示条件同时满足的,我们将学习C++中的if嵌套。

3.2.1 逻辑表达式和逻辑运算符

逻辑运算符:

  • 逻辑与逻辑或逻辑非
    &&||!
  • 优先级别:
  • “&&”、“||”、“!”都是逻辑运算符,“!"的优先级高于”&&“的优先级,”&&“的优先级高于”||“的优先级,同时,逻辑运算符中的“&&”和“||”优先级低于关系运算符,”!“高于算术运算符的优先级。
  • 将两个关系表达式用逻辑运算符连接起来的表达式叫逻辑表达式,逻辑表达式的一般形式为:
  • 表达式    逻辑运算符    表达式
  • 逻辑表达式的值是一个逻辑值。在C++中,整形数据可以出现在逻辑表达式中,在进行逻辑运算时,证据整型数据的值是0或非0,把它作为逻辑“假”或“真”,然后参加逻辑运算。
  • 下面给出逻辑运算的真值表,我们约定A、B是两个条件,值为0表示条件为假(条件不成立),值为1表示条件为假(条件不成立)。
  • 1、逻辑非

    真值表如下,经过“逻辑非”运算,其结果刚好与原来相反。

    A!A
    01
    10
  • 2、逻辑与

    真值表如下,若参加运算的某个条件不成立,其结果为不成立,只有参见运算的两个条件都成立,其结果才成立。

    ABA&&B
    000
    010
    100
    111
  • 3、逻辑或

    真值表如下,若参加运算的某个条件成立,其结果就成立,只有参加运算的条件都不成立,其结果才不成立。

    ABA||B
    000
    011
    101
    111
【例3.9】根据问题写出对应的条件表达式。
问题条件表达式
判断一个数n是否同时能被2和3整除if(n%2==0&&n%3==0)或者if(n%6==0)
判断一个数x是否在区间[1,5]之间if(x>=1&&x<=5)或者if(!(x<1||x>5))
判断一个数x是否等于0if(x==0)或者if(!x)或者if(x!=0)
【例3.10】随机输入一个年份year,判定并输出该年是否为闰年。
  • 分析:设变量year存放读入的年份。闰年的条件是:年份能被4整除但不能被100整除,或者能被400整除。
  • 表示“年份能被4整除但不能被400整除”的逻辑表达式为
  • year%4==0&&year%100!=0
  • 表示“年份能被4被400整除”的逻辑表达式为
  • year%400==0
  • 两个条件构成“或”的关系,逻辑表达式表示如下:
  • (year%4==0&&year%100!=0)||(year%400==0)
  • 当表达式(year%4==0&&year%100!=0)||(year%400==0)的值为真时,则表示year就是闰年,否则为不是闰年
程序如下:
                    #include<iostream>
                    using namespace std;
                    int main() {
                        int year;
                        cin>>year;
                        if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))
                          cout<<year<<"是闰年"<<endl;
                        else
                          cout<<year<<"不是闰年"<<endl;
                        return 0;
                    }
                
思考: 对于程序中第6行的的逻辑表达式是否有其他的表示方式?
【例3.11】 输入三角形的三条边a,b,c的值,判断能否构成三角形,如果能,请求出三角形的面积?
  • 分析:根据数学定理,构成三角形的三条边满足任意两边之和大于第三边的条件,逻辑表达式如下:
  • a+b>c&&b+c>a&&a+c>b
  • 当表达式a+b>c&&b+c>a&&a+c>b的值为真时,a,b,c能够构成三角形,否则不构成三角形,也可以说成只要有某两边之和小于等于第三边时a,b,c就不能构成三角形,其逻辑表达式如下:
  • a+b<=c||b+c<=a||a+c<=b
两边之和大于第三边的程序如下:
                    #include<iostream>
                    #include<cmath>
                    using namespace std;
                    int main(){
                        float a,b,c;
                        float p;
                        float s;
                        cin>>a>>b>>c;
                        if(a+b>c&&a+c>b&&b+c>a){
                            p=(a+b+c)/2;
                            s=sqrt(p*(p-a)*(p-b)*(p-c));
                            cout<<"三角形的面积为:"<<s<<endl;
                        }else{
                            cout<<"不能构成三角形"<<endl;
                        }
                        return 0;
                    }
                
任意两边之和小于等于第三边不构成三角形,否则构成三角形的程序如下:
                    #include<iostream>
                    #include<cmath>
                    using namespace std;
                    int main(){
                        float a,b,c;
                        float p;
                        float s;
                        cin>>a>>b>>c;
                        if(a+b<=c||a+c<=b||b+c<=a){
                            cout<<"不能构成三角形"<<endl;
                        }else{
                            p=(a+b+c)/2;
                            s=sqrt(p*(p-a)*(p-b)*(p-c));
                            cout<<"三角形的面积为:"<<s<<endl;
                        }
                        return 0;
                    }
                
思考: 两个程序分别使用逻辑与和逻辑或来解决问题的,那么,逻辑与和逻辑或能不能相互转化呢

3.2.2 布尔变量

  • 布尔变量用类型标识符bool来定义,它的值只有true(真)或false(假)两种。
  • 由于逻辑变量是用关键字bool来定义的,因此也叫布尔变量。
  • c++编译器在处理布尔型数据时,将false处理为0,将true处理为1,因此在c++中布尔型数据可以和数值型数据进行算术运算。
  • 如果将一个非0的数值赋值给布尔变量,则按“真”(true)处理,否则按“假”(false)处理。
【例3.12】阅读下面的程序和运行结果,说一说布尔变量的特点。
程序如下:
                    #include<iostream>
                    using namespace std;
                    int main(){
                        bool found,flag=false;
                        found=true;
                        cout<<flag<<"	"<<found<<endl;
                        flag=5;
                        found=0;
                        cout<<flag<<"	"<<endl;
                        return 0;
                    }
                
说明: 程序第6行和第7行表示0代表false,1代表true。程序的第9行表示非0的逻辑变量值为1.

3.2.3 条件表达式

  • 格式:

  • 表达式1?表达式2:表达式3
  • 条件表达式中有3个操作对象,"?"和":"一起出现在条件表达式中,称为三元运算符(也叫三目运算符)。
  • 条件表达式的运算规则:
  • (1)先计算表达式1的值。
  • (2)若表达式1的值为真(或非0),则只计算表达式2并将表达式2的结果作为整个条件表达式的值。
  • (3)反之,若表达式1的值为假(或为0),则只计算表达式3并将表达式3的结果作为整个条件表达式的值。
【例3.13】解释下列条件表达式的作用。
条件表达式作用
int maxn=(a>b)?a:b;将a,b两个变量的较大值赋予整型变量maxn
cout<<((num%2=0)?"even":"odd")<<endl;num是偶数时输出even,是奇数时输出odd
思考: 对于表格中的第二条条件表达式,如果将外层括号去掉写成cout<<(num%2=0)?"even":"odd"<<endl;,是否可行,为什么?
【例3.14】输入一个字符,判断它是否是大写字母,如果是则将其转化为小写字母,如果不是则不用转化,最后将得到的字符打印输出。
  • 分析:设ch存放输入的字符,当满足条件ch>'A'&&ch<='Z'时为大写字母,将它转化为小写字母,大写字母的ASCII码加上32就是其对应的小写字母。
程序如下:
                    #include<iostream>
                    using namespace std;
                    int main() {
                        char ch;
                        cin >> ch;
                        ch = (ch >= 'A' && ch <= 'Z') ? (ch + 32) : ch;
                        cout << ch << endl;
                        return 0;
                    }
                
思考: 程序的第6行语句中对于是否是大写字母的条件还可以怎么表示?
练习题