C++条件判断与循环(一)(算法竞赛)

🌊用有趣的言语来阐述苦涩难懂的代码世界,让每一个技术都充满风趣!
🔭个人主页:散峰而望
🚀学习方向: C/C++等方向
📌专栏系列:
- 📖《C语言:从基础到进阶》
- 📚《编程工具的下载和使用》
- 🚀《C语言刷题》
- ⚖️《算法竞赛从入门到获奖》
💬人生格言:冀以尘雾之微,补益山海,荧烛末光,增辉岁月。
🎬博主简介



文章目录
- 前言
- 1. if - else 语句
- 1.1 if 语句
- 1.2 else 语句
- 1.3 嵌套 if
- 1.4 悬空 else
- 1.5 练习
- 2. 关系运算符
- 2.1.1 关系操作符连用
- 2.1.2 浮点型比较相等
- 2.2 练习
- 3. 条件操作符
- 3.1 条件操作符介绍
- 3.2 练习
- 结语
前言
条件判断与循环结构作为程序的智慧枢纽与不息脉搏,它们赋予机器程序的审时度势的思考能力,铸就逻辑严密的运行轨道,让精准导航与高效运转成为现实。因此只有掌握了条件判断与循环结构才能真正的敲开编程世界的大门,才能真正的向算法踏出历史性的一步。
1. if - else 语句
1.1 if 语句
if 语句的语法形式如下:
if(表达式)语句;
表达式成立(为真),则语句执行,表达式不成立(为假),则语句不执行
0为假,非0表示真,也就是表达式的结果如果是 0,则语句不执行,表达式的结果如果是不是 0,则语句执行。
题目:输入一个正整数 n,判断 n 是否为奇数
#include <iostream>
using namespace std;int main()
{int n = 0;cin >> n;if(n % 2 == 1){cout << n << "是奇数" << endl;}return 0;}

1.2 else 语句
else 的表达内容则是与 if 的表达的内容相反,因此两者常常连用。
if…else… 语句语法:
if(表达式)语句1;
else语句2;
将上面的题目改一下,如果不是奇数,那么便是偶数。代码如下:
#include <iostream>
using namespace std;int main()
{int n = 0;cin >> n;if(n % 2 == 1)cout << n << "是奇数" << endl;elsecout << n << "是偶数" << endl;return 0;}
练习::输入一个数表示年龄,年龄 >= 18 岁就输出:成年,否则就输出:未成年
#include <iostream>
using namespace std;
int main()
{int age = 0;cin >> age;if (age >= 18)cout << "成年" << endl;else cout << "未成年" << endl;return 0;
}
如果 age>=18 的时候,还需要打印:可以谈恋爱了,age < 18 时,还需要提示 “不能早恋”,代码该怎么写?
如果还按照像上面那样写
#include <iostream>
using namespace std;
int main()
{int age = 0;cin >> age;if (age >= 18)cout << "成年" << endl;cout << "可以谈恋爱了" << endl;else cout << "未成年" << endl;cout << "不能早恋" << endl;return 0;
}
会发现编译器会报错,else 没有找到配对的 if 语句,这是为什么呢?

原来** if 和 else 只能控制一条语句**,当要控制超过一条语句的时候,就需要带上 {}
代码如下:
#include <iostream>
using namespace std;
int main()
{int age = 0;cin >> age;if (age >= 18){cout << "成年" << endl;cout << "可以谈恋爱了" << endl;}else {cout << "未成年" << endl;cout << "不能早恋" << endl;}return 0;
}
演示结果:

1.3 嵌套 if
在 if else 语句中,else 可以与另一个if语句连用,构成多重判断。
形如:
//形式1
if()语句1;
else
{if()语句2;else语句3;
}
//形式2
if()语句1;
else if()语句2;
else语句3;
上面的两个代码是相同的逻辑。
if…else 语句是在if或者else中选择执行其中一句代码,其实 if…else 是一条语句,那么形式 1 中第一个 else {}代码外边的 {} 就可以省略掉,就和形式 2 一样了。
练习:判断数正负
非常简单的一道题,可以自己试试。不过注意一下输入范围,并没有超过 int 取值范围,所以可以直接用 int 。代码如下:
#include<iostream>
using namespace std;int main()
{int n = 0;cin >> n;if(n > 0)cout << "positive" << endl;else if(n < 0)cout << "negative" << endl;else cout << "zero" << endl;return 0;
}
当然还有其他形式写代码,可以自行探索。
1.4 悬空 else
先来一段代码来看看:
#include <iostream>
using namespace std;
int main()
{int a = 0;int b = 2;if(a == 1)if(b == 2)cout << "hehe" << endl;elsecout << "haha" << endl;return 0;
}
程序运行的结果是啥?
很多初学者,上来以判断 a 是 0,不等于1,那就执行 else 子句,打印 haha 。
但是当你去运行代码,输出的结果是:啥都不输出

为什么呢?
这就是悬空 else 的问题,如果有多个 if 和 else ,可以记住这样一条规则,else 总是跟最接近的 if 匹配。
上面的代码排版,让 else 和第一个if语句对齐,让我们以为 else 是和第一个if匹配的,当 if 语句不成立的时候,自然想到的就是执行 else 子句,打印 haha,但实际上else 是和第二个 if 进行匹配的,这样后边的 if…else 语句是嵌套在第一个 if 语句中的,如果第一个 if 语句就不成立,嵌套 if 和 else 就没机会执行了,最终啥都不打印。
如果代码改成下面这样就更加容易理解了:
#include <iostream>
using namespace std;
int main()
{int a = 0;int b = 2;if(a == 1){if(b == 2)cout << "hehe" << endl;elsecout << "haha" << endl;}return 0;
}
演示结果:

如果我们希望 else 确实和第一个if匹配,可以这样修改代码:
#include <iostream>
using namespace std;
int main()
{int a = 0;int b = 2;if(a == 1){if(b == 2)cout << "hehe" << endl;}else{cout << "haha" << endl;}return 0;
}
演练结果:

只要带上适当的大括号,代码的逻辑就会更加的清晰,所以大家以后在写代码的时候要注意括号的使用,让代码的可读性更高。
1.5 练习
- 整除判断
题目比较简单,注意一下题目要求的就行,两个整数(范围1 ~2^31-1),刚好可以使用 int 类型,之后就是取模为 0 判断。代码如下:
#include<iostream>
using namespace std;int main()
{int m = 0;int n = 0;cin >> m >> n;if(m % n == 0)cout << "YES\n" << endl;elsecout << "NO\n" << endl;return 0;
}
提示:
判断相等是==,不能写成=。
注意输出信息的格式(大小写)。
- 整数大小比较
发现题目中的 x 的取值范围超过 int 类型,综合考虑一下干脆直接用 long long 类型,之后就是比较大小的条件判断。

代码如下:
#include<iostream>
using namespace std;int main()
{long long x = 0;long long y = 0;cin >> x >> y;if(x > y)cout << ">" << endl;else if(x == y)cout << "=" << endl;else cout << "<" << endl;return 0; }
提示:
int类型的取值范围是:-2 ^ 31-- 2 ^ 31-1,即使是unsigned int的取值范围也就是: 0~2^32-1,那么题目中的x, y使用int类型就不合适了,应该使用long long
类型。
- 输出绝对值
题目要求要保留两位小数,则要在 %f 前面写 .2 ,即 .2%f
代码如下:
#include<iostream>
using namespace std;int main()
{float n = 0;scanf("%f", &n);if(n >= 0)printf("%.2f\n", n);elseprintf("%.2f\n", -n);return 0; }
演示结果:


因为用 cin 和 cout 输入输出比较麻烦,所以用 scanf 和 printf函数比较好,如果对 cin 和 cout 感兴趣,可以来这里看看C/C++输入输出初级(二) (算法竞赛)
当然这个题目还有其他解法:
#include <iostream>
#include <cmath>
using namespace std;
int main()
{float n = 0;scanf("%f", &n);n = fabs(n);printf("%.2f\n", n);return 0;
}
这里使用了一个库函数fabs是用来求一个浮点数的绝对值的,需要的头文件是< cmath >。
函数原型如下:
double fabs (double x);
float fabs (float x);
long double fabs (long double x);
相关的函数还有abs,是求整数的绝对值的,需要的头文件是< cstdlib >。
函数原型如下:
int abs (int n);
long int abs (long int n);
练习:奇偶数判断
比较简单直接上代码:
#include<iostream>
using namespace std;int main()
{int n = 0;cin >> n;if(n % 2)cout << "odd" << endl;elsecout << "even" << endl;return 0;
}
注意这种写法可能是存在问题的,因为题目中n的取值范围是:−100 ≤ n ≤ 100,所以 n % 2 可能是 -1 的。
#include <iostream>
using namespace std;int main()
{int n = 0;cin >> n;if (n % 2 == 1)cout << "odd" << endl;else if(n % 2 == -1)cout << "odd" << endl;else cout << "even" << endl;return 0;
}
2. 关系运算符
| 运算符 | 描述 |
|---|---|
| > | 大于运算符,用于比较两个数值,如果左侧数值大于右侧数值,则返回1(真),否则返回0(假) |
| < | 小于运算符,用于比较两个数值,如果左侧数值小于右侧数值,则返回1(真),否则返回0(假) |
| >= | 大于等于运算符,用于比较两个数值,如果左侧数值大于或等于右侧数值,则返回1(真),否则返回 0(假) |
| <= | 小于等于运算符,用于比较两个数值,如果左侧数值小于或等于右侧数值,则返回1(真),否则返回 0(假) |
| == | 相等运算符,用于比较两个值是否相等,如果相等,则返回1(真),否则返回0(假) |
| != | 不等于运算符,用于比较两个值是否不相等,如果不相等,则返回1(真),否则返回0(假) |
下面是一些例子:
a > b;
a < b;
a >= b
a <= b;
a == b;
a != b;
注意:一个常量和一个变量比较相等的时候,建议将常量放在 == 的左边,具体可以看基本魔法语言分支和循环 (一) (C语言)中的关系操作符。
关系表达式通常返回0或1,表示真假( 0 表示假,所有非零值表示真)。比如,20 > 12 返回 1,12 > 20 返回 0。
关系表达式常用于 if 或 while 结构。
if (x == 3)
{cout << "x is 3" << endl;
}
注意:相等运算符 == 与赋值运算符 = 是两个不一样的运算符,不要混淆。有时候,可能会不小心写出下面的代码,它可以运行,但很容易出现意料之外的结果。
if (x = 3) ...
这里是赋值语句,不是比较,始终会走到if条件里。
2.1.1 关系操作符连用
必须避免的错误:多个关系运算符不宜连用。
i < j < k
上面示例中,连续使用两个小于运算符。这是合法表达式,不会报错,但是通常达不到想要的结果,即不是保证变量j的值在i和k之间。因为关系运算符是从左到右计算,所以实际执行的是下面的表达式。
(i < j) < k
上面式子中,i < j 返回 0 或 1 ,所以最终是 0 或 1 与变量 k 进行比较。如果想要判断变量 j 的值是否在i和k之间,应该使用下面的写法。
i < j && j < k
2.1.2 浮点型比较相等
在比较浮点数时,由于浮点数在计算机中是以有限精度表示的,也就是说有些浮点数在内存中其实无法精确保存,这可能导致浮点数比较中的一些精度误差问题。
如果直接使用 == 来比较两个浮点数,很可能会由于这些微小的误差导致不准确的结果。
举例:
#include <iostream>
using namespace std;
int main()
{double a = 0.1;double b = 0.2;double c = 0.3;if (a + b == c) cout << "a + b == c" << endl;elsecout << "a + b != c" << endl;return 0;
}
演示结果:

是不是很奇怪?
那浮点数怎么比较呢?这时候就要允许有误差存在,常见的写法如下:
#include <iostream>
#include <cmath>
using namespace std;
int main()
{double a = 0.1;double b = 0.2;double c = 0.3;if (fabs((a + b) - c) < 1e-9) // 1e-9 表示允许的误差范围 cout << "a + b 约等于 c" << endl;else cout << "a + b 不等于 c" << endl;return 0;
}
演示结果:

2.2 练习
- 有一门课不及格的学生
该题比较简单,有多种写法要么直接判断分数是否大于 60 ,然后判断打印是 1 还是 0。要么先计数再判断。不过要注意该学生恰好有一门成绩不及格输出 1,否则输出 0,只要有一门就为 1。代码如下:
#include <iostream>
using namespace std;int main()
{int s1, s2, s3;int c = 0;cin >> s1 >> s2 >> s3;if ((s1 < 60) + (s2 < 60) + (s2 < 60) == 1)cout << 1 << endl;elsecout << 0 << endl;return 0;
}
#include <iostream>
using namespace std;
int main()
{int s1, s2, s3;int c = 0;cin >> s1 >> s2 >> s3;if (s1 < 60)c++;if (s2 < 60)c++;if (s3 < 60)c++;if (c == 1)cout << 1 << endl;elsecout << 0 << endl;return 0;
}
因为一个关系操作符计算的结果如果是真就是1,如果是假就是0,所以这里我们把三门成绩判断的结果相加,如果等于1,就说明只有一门成绩不及格,也能达到题目的要求,一定程度上简化了代码。
- 等差数列末项计算
这道题可以先自己试一下,后期会讲。
3. 条件操作符
3.1 条件操作符介绍
条件操作符也叫三目操作符,需要接受三个操作数,形式如下:
exp1 ? exp2 : exp3
条件操作符的计算逻辑是:如果 exp1 为真,exp2 计算,exp2 计算的结果是整个表达式的结果;如果 exp1 为假,exp3 计算,exp3 计算的结果是整个表达式的结果。
这种三目操作符和if语句的逻辑非常相似,就是根据 exp1 的结果来选择执行 exp2 ,或者 exp3 。一般使用在简单的逻辑判断中。
**练习:**使用条件操作符表示下面代码的逻辑
#include <iostream>
using namespace std;
//改造前:未使用条件操作符
int main()
{int a = 0;int b = 0;cin >> a;if (a > 5)b = 3;else b = -3;cout << b << endl;return 0;
}
更改后:
//改造后:使用了条件操作符
#include <iostream>
using namespace std;
int main()
{int a = 0;int b = 0;cin >> a >> b;b = (a > 5 ? 3 : -3);cout << b << endl;return 0;
}
3.2 练习
- 最大数输出
我们先判断 a 和 b 的大小,再将两个值最大的那个赋给一个变量,再和 c 比较。代码如下:
#include <iostream>
using namespace std;
int main()
{int a, b, c;int m = 0;cin >> a >> b >> c;m = (a > b ? a : b);if (m < c)m = c;cout << m << endl;return 0;
}
- 特殊计算
题目要求输入的部分超过了 int 的取值范围,所以要用 long long 类型(只要大于 int 类型就行,long long 只是更方便些),剩下的按照题目要求即可。代码如下:
#include <iostream>
using namespace std;int main()
{long long x = 0;long long y = 0;long long z = 0;cin >> x >> y;z = (y % x == 0 ? x + y : y - x);cout << z << endl;return 0;
}
提示:
在审题的时候,也是要注意数据范围的问题,选择适当的数据类型:
这样的数据范围,其实int类型是无法满足的,只能使用 long long 类型。
那有人就说,以后只要是整型数据,我直接把类型写成long long是不是更好呢?其实大部分情况下是没问题,但是如果是开辟数组,数组比较大的情况下,如果类型选择long long 类型作为元素类型,可能会发生空间不满足的情况。
- Apples Prologue / 苹果和虫子
这道题可以先自己试一下,后期会讲。
结语
希望这篇内容能帮助各位快速上手C++的部分条件判断内容,下一篇我们将会对逻辑操作符、switch语句、以及循环进行讲解。期待各位大佬前来围观指导。
同时愿诸君能一起共渡重重浪,终见缛彩遥分地,繁光远缀天。


