摘要:
计算机不仅需要进行算术运算,还需要具有逻辑功能,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循环遍历所有情况
//需要保证湖的大小没有重复,且取值仅能为1,2,3,4;
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;
}