六、判断(一)

1、关系运算符

1)每一个关系运算符得出的结果都是一个布尔类型值(true、flase或真、假或1、0)

关系运算符 说明 关系运算符 说明
> 大于 >= 大于等于
< 小于 <= 小于等于
== 等于 != 不等于
#include <iostream>

int main()
{
    int a{ 500 };
    int b{ 1000 };
    bool c = a == b;  //false
    std::cout << c <<std::endl;

    c = (a <= b);  //true
    std::cout << c << std::endl;

}

2)关系运算符注意事项

①A=B是将B的值赋予给 A(把B内存中的内容,放入A的内存中);A==B是将A和B进行比较

不为0即为true

②注意bool和int之间的转化,所有不为0的bool值一律为true,包括负数

#include <iostream>

int main()
{

    bool bA{ bool(100) };   //非0即为1
    int nA{ bA };

    std::cout << nA << std::endl;  //1
}

3)将输出转化为bool类型(true或flase)

​ std::boolalpah设置以后,所有的bool类型均显示位false和true,而不是显示为数字,浮点数也可以做比较

#include <iostream>

int main()
{
    bool A{ bool(100) };
    bool B{ 0 };

    std::cout << std::boolalpha;  //输出在转化为bool类型
    std::cout << A << std::endl;
    std::cout << B << std:: endl;
    std::cout << (A == B) << std::endl;
}

2、if语句

1)if语法

//语法1
if(bool表达式)语句;

//语法2
if(bool表达式)     //条件满足后,括号内的语句都执行;条件不满足直接跳出语句或语句块
{
    语句;
    语句;
}

//常见错误语句
if(bool表达式);语句;    //if语句第一个分号结束后,剩下语句全部执行

注:if只对紧跟着的语句负责

2)if语句拓展

​ if(a=b){} 取决于b的值,若b为0,则不执行,若b为非0,则执行。即if(a=b)相当于if(b)

//因失误,将a==b写做了a=b,就相当于if(b),根据b的值进行判断,b为0则为假
if(a=b)
{
    语句;
}
3、if...else...语句

1)if...else...语法

//语法一
if(bool 表达式) 语句1;        //条件为真,执行语句1;条件为假,执行语句2
else 语句2;

//语法二
if(bool 表达式)
{
    语句;
    语句;
}
eles
{
	语句;
	语句;
}

2)if语句嵌套使用

//嵌套语法一
if(bool A)
    if(bool B)
        if(bool C)
            语句;
//嵌套语法二
if(a)
    if(b)
        语句
    else
    	语句
else
	if(c)
        语句

3)案例

​ 设计一个程序,要求用户输入一个字符,判断这个字符是数字还是字母,如果是字母,那么是大写字母还是小写字母;如果是小写字母,那么把这个字母变成大写字母,反之变为小写字母,同时要把这个判断结果显示出来(参考ASCII表)

#include <iostream>

int main() 
{
	char userIn;
	std::cout << "请输入一个字符:";
	std::cin >> userIn;

	if (userIn > 47) 
	{
		if (userIn < 58) std::cout << "\n你输入的是一个数字";
		if (userIn > 64) 
		{
			if (userIn < 91)
			{
				std::cout << "你输入的是大写字母" << userIn << "我们给他转化成了小写" << char(userIn + 32);
			}
			if (userIn > 96) 
			{
				if (userIn < 123) 
				{
					std::cout << "你输入的是小写字符" << userIn << "我们给他转化成了大写" << char(userIn - 32);
				}
			}

		}
	
	}

}

4、逻辑运算符

1)逻辑运算符

运算符 名称 注意区分 说明
&& 逻辑与 位运算的与(&) a&&b,a和b都为true为true,缺一不可
|| 逻辑或 位运算的或(|) a||b,a和b其中一个为true,则为true
逻辑非 位运算的取反(~) !a 若a为false是,!a为true

注意事项:

①一元运算符的优先级大于二元运算符

②位运算优先级大于逻辑运算符

③逻辑非>逻辑与>逻辑或

#include <iostream>

int main()
{
	char userIn;
	std::cout << "请输入一个字符:";
	std::cin >> userIn;
	if ((userIn >= 48) && (userIn < 58)) std::cout << "你输入的是一个数字!";
	if ((userIn >= 65) && (userIn <= 90) || (userIn > 96) && (userIn < 123))
		std::cout << "你输入的是一个字母!" << std::endl;
}

2)数值在逻辑运算中的运用

int a{},b{};
if(a&&b)  //a和b都不等于0,才成立。,只要有一个为0,则执行。即if((a!=0)&&(b!=0))
if(a||b)  //a和b至少有一个不等于0
if(!a) //要想执行,则a等于0

注:数值在逻辑运算中的应用本质是先把数值转化成bool值,再进行逻辑运算。

3)将执行成本低的语句放到前面,执行成本高的语句放到后面

bool a{};
int c{500};
//如下两种条件判断第二种更好
if(c*500+200+c+c++)&&a)  //先算c*500+200+c+c++,后判断a的值。如果a为0,则为false,if语句不执行
{
    
}

if(a&&(c*500+200+c+c++))  //加快了代码的运算速度,如果a为0,则后面的c*500+200+c+c++则不用执行
{
    
}

5、条件运算符(三元运算符)

1)条件运算符语法

x=bool?y:z  //等同于如下if表达式
<==>
if(bool)x=y;
else x=z;

c=a>b?a:b   //如果a>b条件成立,则c=a,条件不满足c=b

注:条件运算符的运算优先级最低

2)案例:用户输入两个数,输出最大的那个数

//用户输入两个数,输出最大的那个数
#include <iostream>
int main()
{
	int a, b, c;
	std::cout << "请输入第一个数:";
	std::cin >> a;
	std::cout << "请输入第二个数:";
	std::cin >> b;
	c = a > b ? a : b;
	std::cout << "较大的数为:" << c << std::endl;
}

3)案例:输入一个数,计算10000除以这个数以后的结果。

//输入一个数,计算10000除以这个数以后的结果。
#include <iostream>
int main()
{
	int cs;
	std::cout << "请输入一个数,我们将为你计算10000除以这个数以后的结果:";
	std::cin >> cs;
	int end;
	end = cs ? (10000 / cs) : 0;   //直接排除了除数为0的情况
	std::cout << end;
}

6、异或运算技巧
if(a^b)         //异或运算效率比下方的if语句效率高的多
    
<==>

if((a==true)&&(b==flase)) || (a==false)&&(b==true))         //即a和b不同同时为真或同时为假
if((a==true)||b==true)&&!(a==true)&&(b==true))
7、字符处理

字符处理函数头文件:cctype头文件

函数 说明
int isupper(char) 判断字符是否为大写字母
int islower(char) 判断字符是否为小写字母
int isalpha(char) 判断字符是否为字母
int isdigit(char) 判断字符是否是数字
int isalnum(char) 判断字符是否是字母或者数字
int isspace(char) 判断字符是否为空白
int isblank(char) 判断字符是不是空格
int ispunct(char) 判断字符是不是标点符号
int isprint(char) 判断字符能不能打印
int iscntrl(char) 判断字符是不是控制字符
int isgraph(char) 判断字符是不是图形字符
int tolower(char) 将字符转化为大写
int toupper(char) 将字符转化为小写
#include <iostream>
#include <cctype>

int main()
{
	char char_A{ 'a'};
	std::cout << "字符是否为大写:"<<isupper(char_A) << std::endl; //1为真,0为假

	char A,B;
	std::cout << "请输入一个字符:";
	std::cin >> A;
	B = tolower(A);         //转化为小写
	std::cout << "转化后的字符为:" << B << std::endl;
}

8、案例:游戏登录

​ 设计要求:设计游戏麟江湖的登录模块

1)模拟注册:要求用户输入一个8位以为的十六进制数作为账号,然后再输入一个8位以内的十六进制数作为密码

2)模拟登录:要求用户分别输入账号和密码进行登录,然后根据用户的输入做出判断

3)用户的账户和密码不可以小于5位

#include <iostream>

int main()
{
	std::cout << "============麟江湖用户注册===================" << std::endl;

	unsigned long long uId, uPass;
	std::cout << "请输入你的账号(16位十六进制):";
	std::cin >> std::hex >> uId;
	std::cout << "请输入你的密码:";
	std::cin >> uPass;

	//注册部分
	if ((uId > 0xFFFFF) && (uPass > 0xFFFFF))
	{
		unsigned long long uInId, uInpass;
		system("cls");
		std::cin >> std::hex;
		std::cout << "请输入你的账号(16位十六进制):";
		std::cin >> uInId;
		std::cout << "请输入你的密码:";
		std::cin >> uInpass;
		//用户登录部分
		if (uId == uInId)
		{
			if (uPass == uInpass)
			{
				std::cout << "登录游戏!";
			}

		}
		else
		{
			std::cout << "你的密码输出有误";
		}

	}
	else
	{
		std::cout << "注册失败,账号或者密码不足5位!!!";
	}

}