二、各知识点详细总结
(一)顺序结构
顺序结构是程序执行的基本结构,代码按照编写的顺序依次执行。这部分主要涉及变量的定义、数据的输入输出以及基本的算术运算。
- 变量定义:明确不同数据类型(如
int
、float
、double
、char
等)的变量定义方式,例如int a = 10;
。 - 数据输入输出:使用
cin
和cout
进行标准输入输出操作,如cin >> a;
和cout << a << endl;
。 - 算术运算:掌握加(
+
)、减(-
)、乘(*
)、除(/
)、取模(%
)等基本运算符的使用。
(二)选择结构
选择结构用于根据条件判断来决定程序的执行路径,主要包括 if - else
语句和 switch - case
语句。
- if - else 语句:根据条件的真假执行不同的代码块,例如:
cpp
if (a > 10) {
cout << "a 大于 10" << endl;
} else {
cout << "a 小于等于 10" << endl;
}
- switch - case 语句:用于多分支选择,根据表达式的值选择相应的
case
分支执行,例如:
cpp
switch (day) {
case 1:
cout << "星期一" << endl;
break;
case 2:
cout << "星期二" << endl;
break;
default:
cout << "其他" << endl;
}
(三)循环结构
循环结构用于重复执行一段代码,常见的有 for
循环、while
循环和 do - while
循环。
- for 循环:适用于已知循环次数的情况,例如:
cpp
for (int i = 0; i < 10; i++) {
cout << i << endl;
}
- while 循环:在条件为真时持续循环,例如:
cpp
int i = 0;
while (i < 10) {
cout << i << endl;
i++;
}
- do - while 循环:至少执行一次循环体,然后再判断条件,例如:
cpp
int i = 0;
do {
cout << i << endl;
i++;
} while (i < 10);
(四)数组
数组是一组相同数据类型元素的集合,可用于存储多个数据。
- 一维数组:定义和使用一维数组,如
int arr[10];
,并能对数组元素进行访问和操作。 - 二维数组:理解二维数组的概念和使用,如
int arr[3][4];
,可用于处理矩阵等数据。
三、常见函数总结
(一)输入输出相关函数
cin
:用于从标准输入读取数据,如cin >> num;
。cout
:用于向标准输出打印数据,如cout << "Hello, World!" << endl;
。endl
:用于换行并刷新输出缓冲区。
(二)数学相关函数
abs()
:求 整数 的绝对值,需要包含<cstdlib>
头文件,如int abs_num = abs(-10);
。f
abs()
:计算 浮点数 的绝对值,函数原型为double fabs(double x);
。sqrt()
:求平方根,需要包含<cmath>
头文件,如double sqrt_num = sqrt(16);
。pow(x,y)
:计算 (x的y次方) ,函数原型为double pow(double x, double y);
。例如计算 (2^3) :ceil()
:向上取整,返回不小于x
的最小整数。函数原型为double ceil(double x);
。例如ceil(3.2)
返回 4.0。floor()
:向下取整,返回不大于x
的最大整数。函数原型为double floor(double x);
。例如floor(3.8)
返回 3.0。max(a, b)
返回a
和b
中的最大值min(a, b)
返回a
和b
中的最小值。
(三)数组相关函数
sort()
:对数组元素进行排序,需要包含<algorithm>
头文件,如sort(arr, arr + n);
(n
为数组元素个数)。
字符数组:
strlen(s)
:计算字符串的长度(不包含'\0'
)。strcpy(s1,s2)
:将一个字符串复制到另一个字符数组中。strcmp(s1,s2)
:比较两个字符串的大小,若相等返回 0;若第一个字符串小于第二个字符串,返回负数;若第一个字符串大于第二个字符串,返回正数。strcat(s1,s2)
:将一个字符串追加到另一个字符数组的末尾。
<string>
头文件中的函数(用于 std::string
)
length()
或size()
:返回字符串的长度。append()
:将一个字符串追加到另一个字符串的末尾。substr()
:返回字符串的子串。find()
:查找子串在字符串中第一次出现的位置,若未找到返回std::string::npos
。
- 字符处理函数:
isdigit()
:判断一个字符是否为数字,需要包含<cctype>
头文件,如char ch = '5'; if (isdigit(ch)) { cout << "是数字" << endl; }
。isalpha()
:判断一个字符是否为字母,需要包含<cctype>
头文件。-
isupper():判断一个字符是否为大写字母。
islower():判断一个字符是否为小写字母。
isspace():判断一个字符是否为空白字符(如空格、制表符等)。 toupper()
:将小写字母转换为大写字母。tolower()
:将大写字母转换为小写字母。
例子:
#include <iostream>
#include <cstring>
#include <string>
int main() {
// 使用 <cstring> 头文件中的函数(C 风格字符串)
// strlen() 示例
const char cstr[] = "Hello";
size_t len = strlen(cstr);
std::cout << "C 风格字符串 \"Hello\" 的长度是: " << len << std::endl;
// strcpy() 示例
char dest[10];
strcpy(dest, cstr);
std::cout << "复制后的 C 风格字符串: " << dest << std::endl;
// strcmp() 示例
const char cstr1[] = "Apple";
const char cstr2[] = "Banana";
int cmpResult = strcmp(cstr1, cstr2);
if (cmpResult == 0) {
std::cout << "C 风格字符串 \"" << cstr1 << "\" 和 \"" << cstr2 << "\" 相等。" << std::endl;
} else if (cmpResult < 0) {
std::cout << "C 风格字符串 \"" << cstr1 << "\" 小于 \"" << cstr2 << "\"。" << std::endl;
} else {
std::cout << "C 风格字符串 \"" << cstr1 << "\" 大于 \"" << cstr2 << "\"。" << std::endl;
}
// strcat() 示例
char str3[20] = "Hello";
const char str4[] = " World";
strcat(str3, str4);
std::cout << "追加后的 C 风格字符串: " << str3 << std::endl;
// 使用 <string> 头文件中的函数(std::string)
std::string s1 = "Hello";
std::string s2 = " World";
// length() 或 size() 示例
std::cout << "std::string 类型字符串 \"Hello\" 的长度是: " << s1.length() << std::endl;
std::cout << "std::string 类型字符串 \"Hello\" 的长度(使用 size())是: " << s1.size() << std::endl;
// append() 示例
std::string s3 = s1;
s3.append(s2);
std::cout << "追加后的 std::string 类型字符串: " << s3 << std::endl;
// substr() 示例
std::string sub = s3.substr(6, 5);
std::cout << "从位置 6 开始长度为 5 的子串是: " << sub << std::endl;
// find() 示例
size_t pos = s3.find("World");
if (pos != std::string::npos) {
std::cout << "子串 \"World\" 在字符串中第一次出现的位置是: " << pos << std::endl;
} else {
std::cout << "未找到子串 \"World\"。" << std::endl;
}
return 0;
}
-
四、高频易错点与注意事项
-
1. 单位与精度
-
时间转换:秒→时:分:秒需用
/
和%
。 -
浮点运算:避免直接比较浮点数,改用误差范围(如
abs(a - b) < 1e-6
)。 -
2. 边界条件
-
循环边界:如
n=0
时的天数处理。 -
数组索引:从0还是1开始。
五、重点考察内容
- 逻辑思维能力:能够运用选择结构和循环结构解决实际问题,如判断闰年、计算阶乘等。
- 数组的应用:掌握一维数组和二维数组的定义、初始化、访问和操作,如数组元素的查找、排序等。
- 代码的规范性和可读性:注意变量命名规范、代码注释和缩进,使代码易于理解和维护。
需要C++信奥赛学习资料和视频评论区沟通,会及时回复!
往年真题总结:
2024年莆田市第四期第一轮线上遴选题型总结
1. 光阴似箭(时间计算)
-
类型:模拟、数学计算
-
知识点:时间循环处理、取模运算
-
关键点:
-
将总分钟数
b + s
转换为小时和分钟,注意取模运算处理循环(24小时制
)。 -
大数处理:当
s
达到1e9
时,需避免逐次累加,应直接计算总分钟数后取模。
-
-
解法:
total = (a * 60 + b + s) % (24 * 60) hours = total / 60 minutes = total % 60
2. 日月如梭(班长选举)
-
类型:数学、逻辑判断
-
知识点:极值问题、条件推导
-
关键点:
-
每位候选人需满足:新票数 > 其他两位的当前票数。
-
公式推导:假设候选人当前票数为
x
,其他两人票数为y
和z
,则需x + delta > max(y, z)
。
-
-
解法:
对每个候选人计算max(0, max(其他两人票数) - 当前票数 + 1)
。
3. 倒水(模拟操作)
-
类型:模拟、状态转移
-
知识点:条件判断、循环优化
-
关键点:
-
按规则模拟每次操作,注意大次数
k
的优化(循环周期检测)。 -
可能进入循环状态,需找到规律避免逐次计算。
-
-
解法:
直接模拟每次操作,但需记录状态(当前水量)以检测循环,减少计算次数。
4. 硬币(组合计数)
-
类型:双指针、排序、二分查找
-
知识点:组合数学、前缀和
-
关键点:
-
对两堆硬币分别排序,固定一堆元素,在另一堆中找满足条件的最大值。
-
使用二分或双指针优化时间复杂度至
O(n log n + m log m)
。
-
-
解法:
排序后,对第一堆的每个元素b_i
,在第二堆中找到最大的c_j
使得b_i + c_j <= k
,累加合法数量。
2023年莆田市第三期第一轮线上遴选真题题型总结
1. 面积(数学计算)
-
类型:数学、几何
-
知识点:长方形周长与面积公式
-
关键点:
-
周长
c = 2*(a + b)
,另一边为c/2 - a
,面积a * (c/2 - a)
。
-
-
解法:直接代入公式计算。
2. 数位积(循环计算)
-
类型:模拟、数位分解
-
知识点:循环分解数位、连乘
-
关键点:
-
每次将数位相乘,直到结果为个位数。注意处理中间结果含
0
的情况(直接终止)。
-
-
解法:循环分解数位并计算乘积,记录次数。
3. 排队(数据结构)
-
类型:队列、链表
-
知识点:动态调整队列、高效删除与插入
-
关键点:
-
使用双向链表或哈希表记录元素位置,避免每次遍历队列。
-
时间复杂度需优化至
O(m + n)
。
-
-
解法:用双向链表维护队列,哈希表记录节点指针,直接移动节点到末尾。
4. 快递费(模拟、条件计算)
-
类型:模拟、条件判断
-
知识点:体积重量计算、分段计费
-
关键点:
-
根据包装箱尺寸计算体积重量,与实际重量比较取最大值。
-
首重10元,续重每0.5kg加2元(向上取整)。
-
-
解法:
-
选择能容纳快递的最小包装箱型号。
-
计算计费重量
CW = max(AW + 箱重, VW + 箱重)
。 -
按计费规则分段计算费用。
-