首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >C++条件判断与循环(一)(算法竞赛)

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

作者头像
散峰而望
发布2025-12-23 12:56:55
发布2025-12-23 12:56:55
2000
举报

前言

条件判断与循环结构作为程序的智慧枢纽与不息脉搏,它们赋予机器程序的审时度势的思考能力,铸就逻辑严密的运行轨道,让精准导航与高效运转成为现实。因此只有掌握了条件判断与循环结构才能真正的敲开编程世界的大门,才能真正的向算法踏出历史性的一步。

1. if - else 语句

1.1 if 语句

if 语句的语法形式如下:

代码语言:javascript
复制
if(表达式)
   语句;

表达式成立(为真),则语句执行,表达式不成立(为假),则语句不执行 0为假,非0表示真,也就是表达式的结果如果是 0,则语句不执行,表达式的结果如果是不是 0,则语句执行。

题目:输入一个正整数 n,判断 n 是否为奇数

代码语言:javascript
复制
#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… 语句语法:

代码语言:javascript
复制
if(表达式)
   语句1;
else
   语句2;

将上面的题目改一下,如果不是奇数,那么便是偶数。代码如下:

代码语言:javascript
复制
#include <iostream>
using namespace std;

int main()
{
	int n = 0;
	cin >> n;
	if(n % 2 == 1)
		cout << n << "是奇数" << endl;
	else
		cout << n << "是偶数" << endl;
	return 0;
	
}

练习::输入一个数表示年龄,年龄 >= 18 岁就输出:成年,否则就输出:未成年

代码语言:javascript
复制
#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 时,还需要提示 “不能早恋”,代码该怎么写?

如果还按照像上面那样写

代码语言:javascript
复制
#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 只能控制一条语句**,当要控制超过一条语句的时候,就需要带上 {}

代码如下:

代码语言:javascript
复制
#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语句连用,构成多重判断。

形如:

代码语言:javascript
复制
//形式1 
if()
    语句1;
else 
{
    if()
        语句2;
    else
        语句3;
}
代码语言:javascript
复制
//形式2 
if()
    语句1;
else if()
    语句2;
else
    语句3;

上面的两个代码是相同的逻辑

if…else 语句是在if或者else中选择执行其中一句代码,其实 if…else 是一条语句,那么形式 1 中第一个 else {}代码外边的 {} 就可以省略掉,就和形式 2 一样了。

练习判断数正负

非常简单的一道题,可以自己试试。不过注意一下输入范围,并没有超过 int 取值范围,所以可以直接用 int 。代码如下:

代码语言:javascript
复制
#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

先来一段代码来看看:

代码语言:javascript
复制
#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;
}

程序运行的结果是啥?

很多初学者,上来以判断 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 就没机会执行了,最终啥都不打印。

如果代码改成下面这样就更加容易理解了:

代码语言:javascript
复制
#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;
}

演示结果:

在这里插入图片描述
在这里插入图片描述

如果我们希望 else 确实和第一个if匹配,可以这样修改代码:

代码语言:javascript
复制
#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. 整除判断

题目比较简单,注意一下题目要求的就行,两个整数(范围1 ~2^31-1),刚好可以使用 int 类型,之后就是取模为 0 判断。代码如下:

代码语言:javascript
复制
#include<iostream>
using namespace std;

int main()
{
	int m = 0;
	int n = 0;
	cin >> m >> n;
	if(m % n == 0)
	   cout << "YES\n" << endl;
	else
	   cout << "NO\n" << endl;
	   return 0;   
}

提示: 判断相等是==,不能写成=。 注意输出信息的格式(大小写)。

  1. 整数大小比较

发现题目中的 x 的取值范围超过 int 类型,综合考虑一下干脆直接用 long long 类型,之后就是比较大小的条件判断。

在这里插入图片描述
在这里插入图片描述

代码如下:

代码语言:javascript
复制
#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 类型。

  1. 输出绝对值

题目要求要保留两位小数,则要在 %f 前面写 .2 ,即 .2%f

代码如下:

代码语言:javascript
复制
#include<iostream>
using namespace std;

int main()
{
	float n = 0;
	scanf("%f", &n);
	if(n >= 0)
	  printf("%.2f\n", n);
	else
	  printf("%.2f\n", -n);
	return 0;    
 } 

演示结果:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

因为用 cincout 输入输出比较麻烦,所以用 scanfprintf函数比较好,如果对 cincout 感兴趣,可以来这里看看C/C++输入输出初级(二) (算法竞赛)

当然这个题目还有其他解法:

代码语言:javascript
复制
#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 >。

函数原型如下:

代码语言:javascript
复制
double fabs (double x);
float fabs (float x);
long double fabs (long double x);

相关的函数还有abs,是求整数的绝对值的,需要的头文件是< cstdlib >。

函数原型如下:

代码语言:javascript
复制
int abs (int n);
long int abs (long int n);

练习奇偶数判断

比较简单直接上代码:

代码语言:javascript
复制
#include<iostream> 
using namespace std;

int main()
{
	int n = 0;
	cin >> n;
	if(n % 2)
	  cout << "odd" << endl;
	else
	  cout << "even" << endl;
	return 0;   
}

注意这种写法可能是存在问题的,因为题目中n的取值范围是:−100 ≤ n ≤ 100,所以 n % 2 可能是 -1 的。

代码语言:javascript
复制
#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(假)

下面是一些例子:

代码语言:javascript
复制
a > b;
a < b;
a >= b
a <= b;
a == b;
a != b;

注意:一个常量和一个变量比较相等的时候,建议将常量放在 == 的左边,具体可以看基本魔法语言分支和循环 (一) (C语言)中的关系操作符。

关系表达式通常返回01,表示真假( 0 表示假,所有非零值表示真)。比如,20 > 12 返回 1,12 > 20 返回 0。

关系表达式常用于 if 或 while 结构。

代码语言:javascript
复制
if (x == 3) 
{
    cout << "x is 3" << endl;
}

注意:相等运算符 == 与赋值运算符 = 是两个不一样的运算符,不要混淆。有时候,可能会不小心写出下面的代码,它可以运行,但很容易出现意料之外的结果。

代码语言:javascript
复制
if (x = 3) ...

这里是赋值语句,不是比较,始终会走到if条件里。

2.1.1 关系操作符连用

必须避免的错误:多个关系运算符不宜连用

代码语言:javascript
复制
i < j < k

上面示例中,连续使用两个小于运算符。这是合法表达式,不会报错,但是通常达不到想要的结果,即不是保证变量j的值在i和k之间。因为关系运算符是从左到右计算,所以实际执行的是下面的表达式。

代码语言:javascript
复制
(i < j) < k

上面式子中,i < j 返回 0 或 1 ,所以最终是 0 或 1 与变量 k 进行比较。如果想要判断变量 j 的值是否在i和k之间,应该使用下面的写法。

代码语言:javascript
复制
i < j && j < k
2.1.2 浮点型比较相等

在比较浮点数时,由于浮点数在计算机中是以有限精度表示的,也就是说有些浮点数在内存中其实无法精确保存,这可能导致浮点数比较中的一些精度误差问题。

如果直接使用 == 来比较两个浮点数,很可能会由于这些微小的误差导致不准确的结果。

举例:

代码语言:javascript
复制
#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;
    else
        cout << "a + b != c" << endl;
        return 0;
}

演示结果:

在这里插入图片描述
在这里插入图片描述

是不是很奇怪?

那浮点数怎么比较呢?这时候就要允许有误差存在,常见的写法如下:

代码语言:javascript
复制
#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 练习

  1. 有一门课不及格的学生

该题比较简单,有多种写法要么直接判断分数是否大于 60 ,然后判断打印是 1 还是 0。要么先计数再判断。不过要注意该学生恰好有一门成绩不及格输出 1,否则输出 0,只要有一门就为 1。代码如下:

代码语言:javascript
复制
#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;
    else
        cout << 0 << endl;
    return 0;
}
代码语言:javascript
复制
#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;
    else
        cout << 0 << endl;
    return 0;
}

因为一个关系操作符计算的结果如果是真就是1,如果是假就是0,所以这里我们把三门成绩判断的结果相加,如果等于1,就说明只有一门成绩不及格,也能达到题目的要求,一定程度上简化了代码。

  1. 等差数列末项计算

这道题可以先自己试一下,后期会讲。

3. 条件操作符

3.1 条件操作符介绍

条件操作符也叫三目操作符,需要接受三个操作数,形式如下:

代码语言:javascript
复制
exp1 ? exp2 : exp3

条件操作符的计算逻辑是:如果 exp1 为真,exp2 计算,exp2 计算的结果是整个表达式的结果;如果 exp1 为假,exp3 计算,exp3 计算的结果是整个表达式的结果。 这种三目操作符和if语句的逻辑非常相似,就是根据 exp1 的结果来选择执行 exp2 ,或者 exp3 。一般使用在简单的逻辑判断中。

**练习:**使用条件操作符表示下面代码的逻辑

代码语言:javascript
复制
#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;
}

更改后:

代码语言:javascript
复制
//改造后:使用了条件操作符 
#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 练习

  1. 最大数输出

我们先判断 a 和 b 的大小,再将两个值最大的那个赋给一个变量,再和 c 比较。代码如下:

代码语言:javascript
复制
#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;
}
  1. 特殊计算

题目要求输入的部分超过了 int 的取值范围,所以要用 long long 类型(只要大于 int 类型就行,long long 只是更方便些),剩下的按照题目要求即可。代码如下:

代码语言:javascript
复制
#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 类型作为元素类型,可能会发生空间不满足的情况。

  1. Apples Prologue / 苹果和虫子

这道题可以先自己试一下,后期会讲。

结语

希望这篇内容能帮助各位快速上手C++的部分条件判断内容,下一篇我们将会对逻辑操作符switch语句、以及循环进行讲解。期待各位大佬前来围观指导。

同时愿诸君能一起共渡重重浪,终见缛彩遥分地,繁光远缀天

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-11-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 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 练习
  • 结语
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档