备战蓝桥杯----C/C++组 (一)所需C++基础知识(上)

备战蓝桥杯----C/C++组 (一)所需C++基础知识(上)
wengqidaifeng

个人主页:

wengqidaifeng

✨永远在路上,永远向前走

个人专栏:

数据结构
C语言
嵌入式小白启动!
重要OJ算法题详解

文章目录


前言

第十七届蓝桥杯软件赛C/C++组将于2026年4月11日举行,目前仅剩不到一个半月的时间来进行备战。那么我们需要准备些什么呢?跟着作者一起来进行探讨吧!
我们首先应该具备的知识是C/C++的基础语法知识。


一. 分析大纲,了解所需

我们可以在蓝桥杯官网中找到 **“第十七届蓝桥杯大赛软件赛(编程类)竞赛大纲”**这份文档。

1. 大纲显示内容

在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


组别划分、知识点结构、难度体系三个方面展开。


2、组别划分与难度关系

组别适用对象知识点范围说明难度系数范围
大学C组高职高专或基础较弱学生基础语法、常用算法入门1–5
大学B组普通本科生在C组基础上扩展中级算法与数据结构4–7
大学A组重点高校/研究生涵盖C、B组内容,并增加高难度专题7–10
研究生组研究生与A组共享高级内容,题型更具挑战性7–10
说明:A组和研究生组的知识点基本相同,A组更强调综合应用,研究生组可能更注重理论深度和复杂度。

3、知识点结构分析(按组别)

3.1 大学C组:基础入门阶段

重点掌握:

  • 枚举、排序(冒泡、选择、插入)
  • 搜索(BFS/DFS)
  • 贪心、模拟、二分
  • DP(一维简单问题)
  • 高精度、栈/队列/链表
  • 基础数学

学习建议:

  • 以刷题为导向,熟练掌握基本语法和简单算法。
  • 推荐练习平台:洛谷、AcWing 基础题库。

3.2 大学B组:中级提高阶段

新增内容:

  • 排序进阶(归并、快速、桶、堆、基数)
  • 搜索优化(剪枝、双向BFS、记忆化、迭代加深)
  • DP进阶(背包、树形、状压、数位、优化)
  • 字符串(哈希、KMP)
  • 图论基础(欧拉回路、最小生成树、最短路、拓扑、二分图、连通性、LCA)
  • 数学进阶(排列组合、容斥、逆元、矩阵、高斯消元)
  • 数据结构(ST表、堆、树状数组、线段树、Trie、并查集、平衡树)
  • 计算几何基础

学习建议:

  • 理解算法原理,注重模板的掌握与变形。
  • 推荐练习平台:Codeforces、AtCoder、蓝桥杯真题。

3.3 大学A组 / 研究生组:高级挑战阶段

新增内容:

  • 字符串高级(AC自动机、后缀数组/自动机、回文自动机)
  • 图论高级(网络流、一般图匹配)
  • 数学高级(生成函数、莫比乌斯反演、FFT)
  • 数据结构高级(树链剖分、动态开点线段树、平衡树、可持久化、树套树、动态树)

学习建议:

  • 需要有扎实的数学基础和算法推导能力。
  • 多阅读论文、算法竞赛进阶指南。
  • 推荐练习平台:LOJ、UOJ、POJ、ICPC/CCPC真题。

4.难度系数说明

  • 系数1–3:基础题,主要考察语法和简单逻辑。
  • 系数4–6:中等题,需要掌握常见算法模板。
  • 系数7–8:难题,考察算法变形与组合应用。
  • 系数9–10:极难题,通常涉及复杂数据结构或数学建模。
各组别难度向上兼容,A组题可能包含B组和C组的基础内容。

二. C++基础语法(上):从零开始的编程基石

适合参加蓝桥杯等算法竞赛的C++入门学习者,掌握这些语法知识是后续算法学习的必备基础

1.前言

在开始算法竞赛的征程前,我们首先要打好C++语法基础。无论是枚举、贪心还是动态规划,都需要扎实的语法功底作为支撑。本篇博客将带大家掌握C++最核心的基础语法知识,包括开发环境搭建、第一个程序、数据类型、输入输出、条件判断与循环等基础内容。

2.开发环境搭建 - DevC++的安装与使用

2.1 为什么选择DevC++?

DevC++是一款免费、轻量级的C/C++集成开发环境(IDE),特别适合初学者和竞赛选手。它使用GCC作为编译器,安装简单,操作便捷,很多学校的机房和竞赛场合都使用它。

2.2 安装步骤

  1. 下载安装包:可以从SourceForge下载Orwell Dev-C++ 5.11版本
  2. 以管理员权限运行:右键点击安装包,选择"以管理员身份运行"
  3. 选择语言:建议选择"简体中文"
  4. 同意协议:点击"I Agree"
  5. 选择组件:默认选项即可,直接点击Next
  6. 选择安装路径:可以自定义安装位置,建议不要包含中文路径
  7. 完成安装:勾选"运行Dev-C++ 5.11",点击Finish

2.3 首次启动配置

第一次打开DevC++时,会提示选择语言,选择"简体中文/Chinese"即可。

2.4 编写第一个程序

方式一:新建源代码

  • 点击"文件"→"新建"→"源代码"
  • 编写代码后按Ctrl+S保存,文件名以.cpp结尾
  • 按F11编译运行

方式二:新建项目

  • 适合多文件组织
  • 点击"文件"→"新建"→"项目"
  • 选择"Console Application",C++项目
  • 保存项目后,可以在项目中添加多个源文件

2.5 常用快捷键

功能快捷键
编译F9
运行F10
编译+运行F11
调试F5
下一步调试F7
单步进入函数F8

2.6 调试功能

调试是排查程序错误的重要手段:

  1. 在行号处点击设置断点
  2. 点击调试按钮或按F5开始调试
  3. 添加变量查看,监控变量变化
  4. 使用F7单步执行,F8进入函数内部

3、第一个C++程序

3.1 基础程序框架

#include<iostream>// 头文件usingnamespace std;// 使用std命名空间intmain()// 主函数,程序入口{ cout <<"Hello World!"<< endl;// 输出语句return0;// 程序正常结束}

3.2 main函数详解

  • main函数是程序的入口,程序从main函数开始执行
  • int main()表示main函数执行结束后返回一个整型值
  • return 0;表示程序正常结束,与前面的int呼应
  • 一个项目中只能有一个main函数

3.3 输入输出流 - cin和cout

#include<iostream>usingnamespace std;intmain(){int num; cin >> num;// 输入一个整数 cout << num << endl;// 输出这个整数,endl表示换行return0;}

特点:

  • cin和cout能自动识别变量类型,不需要像scanf/printf那样手动控制格式
  • <<是流插入运算符,与cout配合使用
  • >>是流提取运算符,与cin配合使用
  • endl的作用是换行并刷新缓冲区

3.4 命名空间

命名空间用于避免命名冲突。std是C++标准库的命名空间:

// 方式一:使用using namespace std;#include<iostream>usingnamespace std;// 方式二:使用std::前缀#include<iostream>intmain(){ std::cout <<"Hello"<< std::endl;return0;}

竞赛中常用方式一,写起来更快捷。

3.5 注释

// 这是单行注释/* 这是多行注释 可以写多行内容 */

快捷键:

  • DevC++中:Ctrl + / 注释/取消注释
  • VS中:Ctrl+K+C注释,Ctrl+K+U取消注释

4、数据类型

4.1 基本数据类型

类型关键字说明
字符型char存储单个字符
短整型short较短的整数
整型int常用整数类型
长整型long较长的整数
长长整型long long更长的整数
单精度浮点型float小数(精度较低)
双精度浮点型double小数(精度较高)
布尔型booltrue或false

4.2 ASCII码表要点

  • 大写字母AZ:6590
  • 小写字母az:97122
  • 数字字符09:4857
  • 大小写字母ASCII码差值:32
  • 换行符\n:10

4.3 signed与unsigned

  • signed:有符号,可表示正负数(int默认就是signed)
  • unsigned:无符号,只能表示0和正整数
unsignedint a;// 无符号整型signedint b;// 有符号整型,等价于int b;

4.4 数据类型长度 - sizeof

cout <<sizeof(int)<< endl;// 4字节 cout <<sizeof(longlong)<< endl;// 8字节 cout <<sizeof(double)<< endl;// 8字节

4.5 数据范围

类型范围数量级
int-21亿~21亿10^9
unsigned int0~42亿4×10^9
long long-9.2×1018~9.2×101810^18

重要提示:做题时一定要注意数据范围,选择合适的数据类型。经典名言:“十年OI一场空,不开long long见祖宗”

4.6 typedef - 类型重命名

typedeflonglong ll;// 将long long重命名为lltypedefunsignedint uint;// 将unsigned int重命名为uint ll a =10000000000;// 等价于 long long a = 10000000000;

5.变量和常量

5.1 变量创建

int age;// 创建变量int score =100;// 创建并初始化

5.2 变量命名规则

  • 只能由字母、数字、下划线组成
  • 必须以字母或下划线开头
  • 不能使用关键字(如int、if等)
  • 区分大小写

5.3 全局变量与局部变量

int global =100;// 全局变量,在大括号外定义intmain(){int local =10;// 局部变量,在大括号内定义 cout << local << endl; cout << global << endl;return0;}

重要区别

  • 全局变量默认初始化为0
  • 局部变量不初始化则值是随机的(必须初始化后再使用)

竞赛技巧:竞赛中常用全局变量,因为自动初始化为0,且随处可用,避免传参麻烦。

5.4 常量

字面常量

100// 整型常量'a'// 字符常量3.14// 浮点型常量

#define定义常量

#definePI3.14159#defineMAX100

const定义常量(推荐):

constdouble PI =3.14159;constint MAX_N =1000;

const定义的常量有具体类型,更严谨。

6. 操作符

6.1 算术操作符

操作符功能示例
+加法a + b
-减法a - b
*乘法a * b
/除法(整数除法取整)a / b
%取模(取余数)a % b

注意事项:

  • 除数不能为0
  • %操作符只能用于整型
  • 负数取模结果的正负号由第一个操作数决定

6.2 浮点数除法

float x =6/4;// 结果为1.0(整数除法)float y =6.0/4;// 结果为1.5(浮点数除法)

6.3 赋值操作符

int a =10;// 初始化 a =20;// 赋值// 复合赋值符 a +=5;// 等价于 a = a + 5 a -=3;// 等价于 a = a - 3 a *=2;// 等价于 a = a * 2 a /=4;// 等价于 a = a / 4 a %=3;// 等价于 a = a % 3

6.4 类型转换

隐式类型转换

int a =3.14;// a = 3(double转int,截断小数)double b =10;// b = 10.0(int转double)

强制类型转换

double d =3.14;int a =(int)d;// a = 3char c ='A'; cout <<(int)c;// 输出65(字符的ASCII码)

6.5 单目操作符 - ++和–

int a =10;int b =++a;// 前置++:先自增,后使用(a=11, b=11)int c = a--;// 后置--:先使用,后自减(c=11, a=10)

7.输入输出进阶

7.1 getchar和putchar

#include<cstdio>intmain(){int ch =getchar();// 读取一个字符putchar(ch);// 输出这个字符return0;}

特点:

  • getchar不会忽略空白字符
  • 读取失败返回EOF(-1)
  • 在输入前按Ctrl+Z可模拟读取失败

7.2 printf格式化输出

基本用法

printf("Hello World\n");printf("There are %d apples\n",3);

常用占位符

占位符含义
%d十进制整数
%lldlong long整数
%f浮点数
%c字符
%s字符串
%x十六进制整数

格式化控制

printf("%5d\n",123);// 宽度为5,右对齐:" 123"printf("%-5d\n",123);// 左对齐:"123 "printf("%6.2f\n",3.14);// 总宽度6,小数点后2位:" 3.14"

7.3 scanf格式化输入

基本用法

int a;scanf("%d",&a);// 注意&符号,取地址int x, y;scanf("%d%d",&x,&y);// 连续输入

重要特点

  • scanf处理数值占位符时会自动过滤空白字符(空格、制表符、换行符)
  • %c不会忽略空白字符,需要用" %c"的形式跳过空白

scanf返回值

  • 返回成功读取的变量个数
  • 读取失败返回0
  • 遇到文件结尾返回EOF(-1)
int r =scanf("%d%d",&a,&b);if(r ==2){// 成功读取两个数}

7.4 带空格的字符串输入

方法1:fgets

char str[100];fgets(str,sizeof(str),stdin);

方法2:scanf特殊格式

char str[100];scanf("%[^\n]s", str);// 读取直到遇到换行符

方法3:getline(string类型)

string s;getline(cin, s);// 读取一行,包含空格

8. 条件判断

8.1 if语句

if(条件){// 条件为真时执行}

8.2 if-else语句

if(条件){// 条件为真时执行}else{// 条件为假时执行}

8.3 else if

if(条件1){// 条件1为真}elseif(条件2){// 条件2为真}else{// 都不满足}

8.4 嵌套if

if(条件1){if(条件2){// 条件1和条件2都为真}}

8.5 悬空else问题

if(a ==1)if(b ==2) cout <<"hehe";else cout <<"haha";// 这个else与第二个if匹配,而不是第一个

解决方法:使用大括号明确逻辑

9. 关系操作符

操作符含义
>大于
<小于
>=大于等于
<=小于等于
==等于
!=不等于

注意事项:

  • 不要将==写成=(赋值)
  • 不要连续使用,如a < b < c,应写成a < b && b < c
  • 浮点数比较要用误差范围:fabs(a - b) < 1e-9

总结

上篇小结

至此,我们已经掌握了C++的基础语法:开发环境、数据类型、变量常量、操作符、输入输出、条件判断和循环结构。这些是编写任何程序的基础,也是后续学习数组、字符串、函数和算法的前提。

下篇中,我们将继续学习:

  • 数组(一维数组、二维数组、字符数组)
  • string字符串类型
  • 函数与递归
  • 位运算
  • 结构体与类

请确保熟练掌握本篇内容后再进入下篇的学习。加油!感谢各位大佬的观看!


【练习题推荐】

  • 洛谷:P1001 A+B Problem
  • 洛谷:P5710 【深基3.例2】数的性质
  • 洛谷:P5715 【深基3.例8】三位数排序
  • 洛谷:P5720 【深基4.例4】一尺之棰
  • 洛谷:P5721 【深基4.例6】数字直角三角形

Read more

Flutter for OpenHarmony:Flutter 三方库 money2 — 坚不可摧的鸿蒙金融核心组件

Flutter for OpenHarmony:Flutter 三方库 money2 — 坚不可摧的鸿蒙金融核心组件

欢迎加入开源鸿蒙跨平台社区:开源鸿蒙跨平台开发者社区 前言 如果您正在开发的 Flutter for OpenHarmony 应用涉及金融核算、商城交易或任何带有财务账单的业务,那么对金额的精确处理将极其关键。 在传统开发中,如果直接使用系统基础的 Double 类型进行财务计算(例如 0.1 + 0.2 会变成 0.30000000000000004),极易导致对账失败,严重时甚至会引发系统性的财务灾难。 money2 这个开源组件正是为了防止这种浮点运算精度丢失而生。它在底层基于大整数操作结合位移来处理金额金额,从而绝对保证在进行复杂的金融计算时,不会丢失哪怕一丝一毫的精度。 一、原理解析 / 概念介绍 1.1 基础概念 money2 绝不仅仅是一堆简单的加减工具函数。其核心思想是使用大整数来表示货币的最小面值单位。例如 1.25 美元,它在底层对象中实际被安全地存储为代表分的大整数 125 和指数 -2。这里面完全规避了极其危险的浮点操作。 系统原始 1.2

By Ne0inhk
Flutter 三方库 metadata_fetch_plus 的鸿蒙化适配指南 - 实现极速的网页元数据提取与 Open Graph 协议解析、支持端侧富文本链接预览渲染实战

Flutter 三方库 metadata_fetch_plus 的鸿蒙化适配指南 - 实现极速的网页元数据提取与 Open Graph 协议解析、支持端侧富文本链接预览渲染实战

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 metadata_fetch_plus 的鸿蒙化适配指南 - 实现极速的网页元数据提取与 Open Graph 协议解析、支持端侧富文本链接预览渲染实战 前言 在进行 Flutter for OpenHarmony 的社交媒体、新闻资讯或即时通讯类应用开发时,如何根据用户分享的一个单薄的 URL,自动生动地展示出其对应的网页标题、封面图及描述信息?metadata_fetch_plus 是专为网页语义数据抓取设计的利器。它深度支持 Open Graph, Twitter Cards, Scheme.org 等主流元数据协议。本文将探讨如何在鸿蒙端构建极致的链接预览体验。 一、原直观解析 / 概念介绍 1.1 基础原理 该库建立在高效的 HTML 语义解析逻辑之上。

By Ne0inhk
Flutter 三方库 nordigen_integration 的鸿蒙化适配指南 - 安全接入全球金融数据、处理 OAuth2 开放银行协议及账户集成实战

Flutter 三方库 nordigen_integration 的鸿蒙化适配指南 - 安全接入全球金融数据、处理 OAuth2 开放银行协议及账户集成实战

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 nordigen_integration 的鸿蒙化适配指南 - 安全接入全球金融数据、处理 OAuth2 开放银行协议及账户集成实战 前言 随着全球金融数字化的浪潮,个人财务管理(PFM)和开放银行(Open Banking)应用正以前所未有的速度渗透进我们的生活。在欧洲,PSD2 协议的强制推行使得开发者可以通过标准化的 API 安全地访问成千上万家银行的账户数据。 nordigen_integration 正是这一领域的佼佼者,它极简地封装了 GoCardless(原 Nordigen)的复杂 API,让开发者只需几行代码即可完成银行授权和交易拉取。 当我们将这类高安全、高合规性的应用适配到 OpenHarmony 平台时,隐私数据的隔离保护、OAuth2 的安全重定向以及跨国界的数据一致性成为了新的挑战。本文将为你详解如何在鸿蒙生态中构建一条通往全球银行系统的“数字专线”。 一、原理解析 / 概念介绍

By Ne0inhk
[linux仓库]多线程数据竞争?一文搞定互斥锁与原子操作[线程·伍]

[linux仓库]多线程数据竞争?一文搞定互斥锁与原子操作[线程·伍]

🌟 各位看官好,我是egoist2023! 🌍 Linux == Linux is not Unix ! 🚀 今天来学习Linux的线程互斥、原子性的深入理解及锁操作的底层理解。 👍 如果觉得这篇文章有帮助,欢迎您一键三连,分享更多人哦! 目录 线程互斥 进程线程间的互斥相关背景 算逻运算 互斥锁 锁操作 原子性 原生C++11 mutex抢票Demo 互斥量的封装 线程互斥 * 大部分情况,线程使⽤的数据都是局部变量,变量的地址空间在线程栈空间内,这种情况,变量归属单个线程,其他线程⽆法获得这种变量。 * 但有时候,很多变量都需要在线程间共享,这样的变量称为共享变量,可以通过数据的共享,完成线程之间的交互。 * 多个线程并发的操作共享变量,会带来⼀些问题。 int tickets = 1000; void *routel(void* args) { std::string name

By Ne0inhk