【NOI】C++程序结构入门之分支结构一


前言

在编程的世界里,程序的执行并非总是沿着单一的直线路径向前推进。有时候,我们需要根据特定条件来改变程序的行为,使之能够灵活应对各种情况。这就引出了程序设计中的一个重要概念——分支结构。分支结构赋予程序“思考”的能力,使其能够依据特定条件做出判断,进而执行相应的代码块。这一章,我们将深入探讨C++中的分支结构,这是理解更复杂算法和实现逻辑判断的基础,对于参加全国青少年信息学奥林匹克竞赛(NOI)的入门级选手来说尤为重要。

学习路线:C++从入门到NOI学习路线

学习大纲:C++全国青少年信息学奥林匹克竞赛(NOI)入门级-大纲


一、分支结构是什么?

1.概念

什么是分支结构呢?

分支结构就像我们做决定一样,如果满足某个条件,就执行一个操作;

请添加图片描述

如果不满足,就执行另一个操作。

请添加图片描述

想象一下,当你们早上起床后,如果看到窗外正在下雨,你们会做什么呢?

是会选择带上雨伞再去上学,
在这里插入图片描述

还是选择淋雨呢?

在这里插入图片描述

这就是一个简单的分支决策:根据‘是否下雨’这个条件,选择不同的行动(带伞或不带伞)。

在C++中,分支结构是一种程序设计方法,它允许程序根据特定条件的判断结果来选择执行不同的代码路径。

在这里插入图片描述
没有听懂?没关系。

在这里插入图片描述

分支结构就像一个聪明的交通警察,他站在路口指挥交通。

当看到红灯亮起时,他会告诉汽车停下来等待;而当绿灯亮起时,他又会让汽车安全通过。

警察叔叔根据不同的信号(条件),做出了不同的指令(执行不同的行动)。在编程里,分支结构就像这位交通警察,根据程序接收到的信息(条件),决定下一步应该做什么。

这意味着程序的执行流程不是简单的线性顺序(从上向下,依次执行),而是可以在某个决策点“分支”出去,走向多个可能的之一

二、bool类型

1.概念

我们刚才了解了分支结构,它能帮程序做出不同选择

现在,我们要认识一种特殊的‘语言’,它让程序知道什么时候该选择什么,这种语言叫‘bool’类型。

在这里插入图片描述

你们看过开关吧?开关有两种状态:打开和关闭。

在这里插入图片描述

当我们把开关往上拨,电灯就亮了,这时我们可以说开关处于‘开’的状态,就像编程里的True;

请添加图片描述

当我们把开关往下拨,电灯熄灭,这时开关处于‘关’的状态,就像编程里的False。

请添加图片描述

所以,bool类型就像是一个小小的开关,告诉我们某个事情是‘发生’了(True)还是‘没发生’(False)。

C++中的布尔型它只有两个取值:“真”(True)或“假”(False)。就像生活中遇到的“对错”、“有无”、“开闭”等二选一的情况。

在C++中,true被定义为1,false被定义为0。可以使用bool类型的变量来存储和操作布尔值。

以下是一个简单的例子:

#include <iostream>
using namespace std;

int main() {
    bool isTrue = true;
    bool isFalse = false;
    cout << "isTrue = " << isTrue << endl; // 输出:isTrue = 1
    cout << "isFalse = " << isFalse << endl; // 输出:isFalse = 0
    return 0;
}

三、 单分支结构

C++的单分支结构是if语句,它的语法格式如下:

if (condition) {
    // 如果条件为真,执行这里的代码
}

其中,condition是一个表达式,如果它的值为真(非零),则执行花括号中的代码块。因此如果condition的值为假(0),则跳过整个if语句,继续执行后面的代码。

在这里插入图片描述

下面是一个简单的例子,演示了如何使用if语句判断一个数是否为正数:

#include <iostream>
using namespace std;

int main() {
    int num;
    cout << "请输入一个整数:";
    cin >> num;
    if (num > 0) {
        cout << num << "是正数" << endl;
    }
    return 0;
}

在上面的例子中,如果用户输入的数大于0,则输出该数是正数。如果用户输入的数小于等于0,则if语句不执行,直接跳过。

四、双分支结构

C++中的双分支结构是if-else语句,它的语法如下:

if (condition) {
    // 如果条件成立执行的代码块
} else {
    // 如果条件不成立执行的代码块
}

其中,condition是需要判断的条件,如果条件成立则执行if后面的代码块,否则执行else后面的代码块。

在这里插入图片描述

而且程序运行到双分支结构是必须选其一执行,不能两个语句块都跳过或都执行。

下面是一个简单的例子,演示了如何使用if-else语句实现输入两个整数,将这两个数按照从小到大的顺序输出的功能:

#include <iostream>
using namespace std;

int main() {
    int a, b;
    cin >> a >> b;
    if (a > b) {
          cout << b << " " << a << endl;
    }else{
	   	cout << a << " " << b << endl;
	}
    
    return 0;
}

在这个例子中,我们首先使用cin语句输入两个整数a和b,然后使用if-else语句判断a和b的大小关系,如果a大于b,则交换它们的值,最后使用cout语句输出结果。

五、例题讲解

问题:1303. 冷饮的价格(1)

类型:分支


题目描述:

小明去冷饮店买冰激凌,如果买 10 个以上或者 10 个,2 元 / 个, 10 个以下, 2.2 元 / 个。
请从键盘读入小明的购买数量,计算小明应付的价格!

输入:

一个整数,代表小明购买的冰激凌的数量(n≤100) 。

输出:

小明应付的金额,金额保留 1 位小数!

样例:

输入:

20

输出:

40.0

在这里插入图片描述


1.分析问题

  1. 已知:小明购买的冰激凌的数量(n≤100) 。
  2. 未知:小明应付的金额,金额保留 1 位小数。
  3. 关系:如果买 10 个以上或者 10 个,2 元 / 个, 10 个以下, 2.2 元 / 个。

2.定义变量

int n:存储小明购买的冰激凌数量,类型为整数,范围符合题目要求(n≤100)。

double p:存储小明应付的金额,类型为双精度浮点数,以便保留小数点后的精度。

	//二、数据定义 
	int n;
	double p;

3.输入数据

读取用户输入的冰激凌数量,并将其存储在变量 n 中。

	//三、数据输入 
	cin>>n;

4.数据计算

计算应付金额的初值为 2.2 * n,假设所有冰激凌单价为 2.2 元。

接着检查 n 是否大于等于 10,如果是,则根据题目条件,从总金额中减去优惠部分(0.2 * n),即每个冰激凌优惠 0.2 元。

这样,最终得到的 p 即为小明应付的金额。

	//四、数据计算 
	p=2.2*n;
	if(n>=10){
		p-=0.2*n;
	}

5.输出结果

设置输出格式:

  • fixed:使输出的浮点数始终以定点形式显示。
  • setprecision(1):设置输出浮点数的小数点后保留 1 位。

然后输出计算得到的应付金额 p。

	//五、输出结果 
	cout<<fixed<<setprecision(1)<<p;
	return 0;	

完整代码如下:

#include <bits/stdc++.h>
using namespace std;

int main() {
    // 一、数据定义
    // 定义变量 n 用于存储小明购买的冰激凌数量(整数,范围 1 ≤ n ≤ 100)
    int n;
    
    // 定义变量 p 用于存储小明应付的金额(双精度浮点数,保留 1 位小数)
    double p;

    // 二、数据输入
    // 从标准输入读取小明购买的冰激凌数量
    cin >> n;

    // 三、数据计算
    // 初始假设所有冰激凌单价为 2.2 元,计算总金额
    p = 2.2 * n;

    // 若购买数量达到或超过 10 个,则享受优惠
    // 每个冰激凌优惠 0.2 元,从总金额中减去优惠部分
    if (n >= 10) {
        p -= 0.2 * n;
    }

    // 四、输出结果
    // 设置输出浮点数格式:定点显示,保留 1 位小数
    // 输出小明应付的金额
    cout << fixed << setprecision(1) << p;

    return 0;
}

问题:1033. 判断奇偶数

类型:分支


题目描述:

输入一个整数,判断是否为偶数。是输出 y e s ,否则输出n o。

输入:

输入只有一行,包括 1 个整数(该整数在 1∼10000 的范围内)。

输出:

输出只有一行。(注意输出格式,具体请看下方提示)。

样例:

输入:

2

输出:

y e s

在这里插入图片描述


1.分析问题

  1. 已知:一个整数n。
  2. 未知:判断是否为偶数。
  3. 关系:除2余0为偶数。

2.定义变量

定义整数变量 n,用于存储用户输入的整数。

	//二、数据定义 
	int n;

3.输入数据

从标准输入读取用户输入的整数,存入变量 n。

	//三、数据输入 
	cin>>n;

4.数据计算

根据 n 是否为偶数,输出相应的结果。

//四、数据计算 
	if(n%2==0){
		//五、输出结果 
		cout<<"y e s";
	}else{
		//五、输出结果 
		cout<<"n o";
	}
	

完整代码如下:

#include <iostream>
using namespace std;

int main() {
    // 一、分析问题
    // 已知:用户输入一个整数 n。
    // 未知:判断 n 是否为偶数,并输出对应结果。
    // 关系:若 n 除以 2 的余数为 0,则 n 为偶数。

    // 二、数据定义
    int n; // 定义整数变量 n,用于存储用户输入的整数

    // 三、数据输入
    cin >> n; // 从标准输入读取用户输入的整数,存入变量 n

    // 四、数据计算
    // 五、输出结果
    // 根据 n 是否为偶数,输出相应的结果
    if (n % 2 == 0) {
        cout << "y e s"; // 输出 "y e s"
    } else {
        cout << "n o"; // 输出 "n o"
    }

    return 0;
}

问题:1302. 是否适合晨练?

类型:分支


题目描述:

夏天到了,气温太高,小明的爷爷每天有晨练的习惯,但有时候温度不适合晨练;小明想编写一个程序,帮助爷爷判断温度是否适合晨练。
输入温度 t 的值,判断其是否适合晨练,适合晨练输出 OK ,不适合输出 NO 。( 20≤t≤30 ,则适合晨练 OK ,否则不适合 NO )。

输入:

一个整数代表当天的温度。

输出:

OK 或者 NO 。

样例:

输入:

22

输出:

OK

在这里插入图片描述


1.分析问题

  1. 已知:温度 t 的值。
  2. 未知:帮助爷爷判断温度是否适合晨练。
  3. 关系:20≤t≤30 ,则适合晨练 OK ,否则不适合 NO 。

2.定义变量

定义整数变量 t,用于存储用户输入的温度值。

	//二、数据定义 
	int t;

3.输入数据

从标准输入读取用户输入的温度值,存入变量 t。

	//三、数据输入 
	cin>>t;

4.数据计算

判断温度 t 是否在适合晨练的范围内(20 ≤ t ≤ 30)。

//四、数据计算
	if(t>=20&&t<=30){
		//五、输出结果 
		cout<<"OK";
	}else{
		//五、输出结果 
		cout<<"NO";
	}

完整代码如下:

#include <iostream>
using namespace std;

int main() {
    // 一、分析问题
    // 已知:用户输入一个表示温度的整数 t。
    // 未知:根据温度 t 判断是否适合爷爷晨练,并输出对应结果。
    // 关系:若温度满足 20 ≤ t ≤ 30,则适合晨练(输出 "OK"),否则不适合(输出 "NO")。

    // 二、数据定义
    int t; // 定义整数变量 t,用于存储用户输入的温度值

    // 三、数据输入
    cin >> t; // 从标准输入读取用户输入的温度值,存入变量 t

    // 四、数据计算
    // 五、输出结果
    // 根据温度 t 是否适合晨练,输出相应的结果
    if (t >= 20 && t <= 30) {
        cout << "OK"; // 输出 "OK"
    } else {
        cout << "NO"; // 输出 "NO"
    }

    return 0;
}

问题:1632. 需要几辆车

类型:分支


题目描述:

学校有 n 位同学要外出旅游,一辆大巴车可以坐 30 人,请问需要几辆大巴车?

输入:

一个整数 n,代表同学的总人数。

输出:

一个整数,代表需要大巴车的数量。

样例:

输入:

18

输出:

1

在这里插入图片描述


1.分析问题

  1. 已知:n 位同学要外出旅游,一辆大巴车可以坐 30 人。
  2. 未知:请问需要几辆大巴车?
  3. 关系:同学数/车位=车数,不能整除时额外添加1辆车。

2.定义变量

定义整数变量 n 存储学生总数,x 存储所需大巴车数量。

	//二、数据定义 
	int n,x; 

3.输入数据

从标准输入读取学生总数 n。

	//三、数据输入 
	cin>>n;

4.数据计算

若学生总数不能被大巴车座位数整除(有余数),需额外增加 1 辆大巴车。

	//四、数据计算 
	x=n/30;
	if(n%30!=0){
		++x;
	}

5.输出结果

输出所需大巴车数量。

	//五、输出结果 
	cout<<x;

完整代码如下:

#include <bits/stdc++.h>
using namespace std;

int main() {
    // 一、分析问题
    // 已知:有 n 位同学要外出旅游,一辆大巴车可以坐 30 人。
    // 未知:计算需要租用多少辆大巴车才能满足所有同学的出行需求。
    // 关系:总学生数 n 除以每辆大巴车座位数(30 人),商为整数部分车数,余数不为 0 时需额外增加 1 辆车。

    // 二、数据定义
    int n, x; // 定义整数变量 n 存储学生总数,x 存储所需大巴车数量

    // 三、数据输入
    cin >> n; // 从标准输入读取学生总数 n

    // 四、数据计算
    // 计算所需大巴车的整数部分数量
    x = n / 30;

    // 若学生总数不能被大巴车座位数整除(有余数),需额外增加 1 辆大巴车
    if (n % 30 != 0) {
        ++x;
    }

    // 五、输出结果
    // 输出所需大巴车数量
    cout << x;

    return 0;
}

问题:1043. 行李托运价格

类型:分支


题目描述:

某车站行李托运收费标准是: 10 公斤或 10 公斤以下,收费 2.5 元,超过 10 公斤的行李,按每超过 1 公斤增加 1.5 元进行收费。
试编一程序,输入行李的重量,算出托运费。

输入:

输入只有一行,包括 1 个整数。

输出:

输出只有一行,包括 1 个数。 (保留两位小数)。

样例:

输入:

10

输出:

2.50

在这里插入图片描述


1.分析问题

  1. 已知:用户输入行李的重量(公斤)。
  2. 未知:据行李重量计算所需的托运费用,并输出结果。
  3. 关系:行李重量在 10 公斤或 10 公斤以下,收费 2.5 元;超过 10 公斤的部分,每超 1 公斤加收 1.5 元。

2.定义变量

定义整数变量 n 存储行李重量(公斤)。
定义双精度浮点数变量 p 存储计算出的托运费用。

	//二、数据定义
	int n;
	double p; 

3.输入数据

标准输入读取行李重量 n(公斤)。

	//三、数据输入 
	cin>>n;

4.数据计算

初始化基础费用为 2.5 元。
若行李重量超过 10 公斤,则计算超出部分的额外费用。

//四、数据计算 
	p=2.5;
	if(n>10){
		n-=10;
		p+=1.5*n;
	}

5.输出结果

设置输出浮点数格式:定点显示,保留 2 位小数。
输出计算出的托运费用。

	//五、输出结果 
	cout<<fixed<<setprecision(2)<<p;
	return 0;	

完整代码如下:

#include <bits/stdc++.h>
using namespace std;

int main() {
    // 一、分析问题
    // 已知:用户输入行李的重量(公斤)。
    // 未知:根据行李重量计算所需的托运费用,并输出结果。
    // 关系:行李重量在 10 公斤或 10 公斤以下,收费 2.5 元;超过 10 公斤的部分,每超 1 公斤加收 1.5 元。

    // 二、数据定义
    int n; // 定义整数变量 n 存储行李重量(公斤)
    double p; // 定义双精度浮点数变量 p 存储计算出的托运费用

    // 三、数据输入
    cin >> n; // 从标准输入读取行李重量 n(公斤)

    // 四、数据计算
    // 初始化基础费用为 2.5 元
    p = 2.5;

    // 若行李重量超过 10 公斤,则计算超出部分的额外费用
    if (n > 10) {
        n -= 10; // 计算超出 10 公斤的部分重量
        p += 1.5 * n; // 根据超出部分重量计算额外费用,并累加到基础费用上
    }

    // 五、输出结果
    // 设置输出浮点数格式:定点显示,保留 2 位小数
    // 输出计算出的托运费用
    cout << fixed << setprecision(2) << p;

    return 0;
}

问题:1037. 恐龙园买门票

类型:分支


题目描述:

恐龙园买门票,身高低于 1.3 米购儿童票( 60元 ),否则成人票 120 元。
试编写一个程序,输入身高,输出相应的门票价格。

输入:

一行,一个人的身高。

输出:

一行,一个整数。

样例:

输入:

1.1

输出:

60

在这里插入图片描述


1.分析问题

  1. 已知:用户输入一个人的身高(米)。
  2. 未知:根据身高计算对应的门票价格(儿童票或成人票),并输出结果。
  3. 关系:身高低于或等于 1.3 米,购买儿童票(价格 60 元);身高高于 1.3 米,购买成人票(价格 120 元)。

2.定义变量

定义双精度浮点数变量 h 存储输入的身高(米)。

    // 二、数据定义
    double h; 

3.输入数据

从标准输入读取身高 h(米)。

 	// 三、数据输入
    cin >> h; 

4.数据计算

根据身高计算出的门票类型,输出对应的票价。

    if (h >= 1.3) {
        cout << "120"; // 输出成人票价格(120 元)
    } else {
        cout << "60"; // 输出儿童票价格(60 元)
    }

完整代码如下:

#include <iostream>

using namespace std;
int main() {
    // 一、分析问题
    // 已知:用户输入一个人的身高(米)。
    // 未知:根据身高计算对应的门票价格(儿童票或成人票),并输出结果。
    // 关系:身高低于或等于 1.3 米,购买儿童票(价格 60 元);身高高于 1.3 米,购买成人票(价格 120 元)。

    // 二、数据定义
    double h; // 定义双精度浮点数变量 h 存储输入的身高(米)

    // 三、数据输入
    cin >> h; // 从标准输入读取身高 h(米)

    // 四、数据计算
    
    // 五、输出结果
    // 根据身高计算出的门票类型,输出对应的票价
    if (h >= 1.3) {
        cout << "120"; // 输出成人票价格(120 元)
    } else {
        cout << "60"; // 输出儿童票价格(60 元)
    }

    return 0;
}

六、总结

分支结构是程序设计中不可或缺的一部分,它使程序具备了根据特定条件作出不同响应的能力。在本章的学习中,我们详细探讨了C++中的分支结构,具体涵盖以下几个核心要点:

  1. 分支结构的概念:如同生活中根据天气状况选择是否携带雨伞,分支结构允许程序在遇到不同条件时选择执行不同的代码路径。C++中的if语句和if-else语句就是实现这种逻辑判断的关键工具。

  2. 布尔类型:布尔类型(bool)是用于表示逻辑值(真/假、是/否、开/关)的特殊数据类型,其值只能为true(真)或false(假)。通过对布尔变量的赋值和逻辑运算符的应用,程序能够准确地评估条件并据此进行决策。

  3. 单分支结构(if语句):单分支结构由关键字if引导,后面跟一个条件表达式和待执行的代码块。当条件为真时,执行该代码块;反之,程序跳过该代码块继续执行后续代码。例如,通过if语句判断用户输入的整数是否为正数,如果是,则输出提示信息。

  4. 双分支结构(if-else语句):双分支结构在if语句的基础上增加了else子句,形成if-else结构。当if后的条件为真时执行第一个代码块,否则执行else后的代码块。例如,根据输入的两个整数大小关系,使用if-else语句实现数值的交换并按升序输出。

最后通过若干实践题目,如行李托运费用计算、恐龙园门票购买及冷饮价格计算等,展示了如何运用分支结构解决实际问题。这些示例不仅帮助巩固理论知识,还锻炼了读者运用分支结构编写实用程序的能力。

七、感谢

如若本文对您的学习或工作有所启发和帮助,恳请您给予宝贵的支持——轻轻一点,为文章点赞;若觉得内容值得分享给更多朋友,欢迎转发扩散;若认为此篇内容具有长期参考价值,敬请收藏以便随时查阅。

每一次您的点赞、分享与收藏,都是对我持续创作和分享的热情鼓励,也是推动我不断提供更多高质量内容的动力源泉。期待我们在下一篇文章中再次相遇,共同攀登知识的高峰!

在这里插入图片描述

相关推荐

  1. python学习-分支结构-入门训练

    2024-04-30 13:50:01       12 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-30 13:50:01       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-30 13:50:01       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-30 13:50:01       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-30 13:50:01       18 阅读

热门阅读

  1. 力扣279完全平方数

    2024-04-30 13:50:01       11 阅读
  2. Python内置函数isinstance()详解

    2024-04-30 13:50:01       9 阅读
  3. WAF(Web Application Firewal)

    2024-04-30 13:50:01       10 阅读
  4. Docker in Docker(DinD)原理与实践

    2024-04-30 13:50:01       9 阅读
  5. 【Qt之·路径获取】

    2024-04-30 13:50:01       7 阅读
  6. 动态规划专训5——子序列系列

    2024-04-30 13:50:01       10 阅读
  7. React面试题(一)

    2024-04-30 13:50:01       10 阅读